annotate foosdk/sdk/foobar2000/SDK/ui.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "foobar2000-sdk-pch.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "ui_edit_context.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "ui.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "genrand.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 bool ui_drop_item_callback::g_on_drop(interface IDataObject * pDataObject)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 for (auto ptr : enumerate()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 if (ptr->on_drop(pDataObject)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 bool ui_drop_item_callback::g_is_accepted_type(interface IDataObject * pDataObject, DWORD * p_effect)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 for (auto ptr : enumerate()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 if (ptr->is_accepted_type(pDataObject, p_effect)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 #endif // _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 bool user_interface::g_find(service_ptr_t<user_interface> & p_out,const GUID & p_guid)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 for (auto ptr : enumerate()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 if (ptr->get_guid() == p_guid) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 p_out = ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 // ui_edit_context.h code
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 void ui_edit_context::select_all() { update_selection(pfc::bit_array_true(), pfc::bit_array_true()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 void ui_edit_context::select_none() { update_selection(pfc::bit_array_true(), pfc::bit_array_false()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 void ui_edit_context::get_selected_items(metadb_handle_list_ref out) { pfc::bit_array_bittable mask(get_item_count()); get_selection_mask(mask); get_items(out, mask); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 void ui_edit_context::remove_selection() { pfc::bit_array_bittable mask(get_item_count()); get_selection_mask(mask); remove_items(mask); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 void ui_edit_context::crop_selection() { pfc::bit_array_bittable mask(get_item_count()); get_selection_mask(mask); remove_items(pfc::bit_array_not(mask)); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 void ui_edit_context::clear() { remove_items(pfc::bit_array_true()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 void ui_edit_context::get_all_items(metadb_handle_list_ref out) { get_items(out, pfc::bit_array_true()); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 void ui_edit_context::get_selection_mask(pfc::bit_array_var & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 const t_size count = get_item_count(); for (t_size walk = 0; walk < count; ++walk) out.set(walk, is_item_selected(walk));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 t_size ui_edit_context::get_selection_count(t_size max) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 t_size count = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 const t_size total = get_item_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 for (t_size walk = 0; walk < total && count < max; ++walk) if (is_item_selected(walk)) ++count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 return count;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 void ui_edit_context::sort_by_format(const char * spec, bool onlySelection) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 const t_size count = get_item_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 pfc::array_t<t_size> order; order.set_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 pfc::array_t<t_size> sel_map;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 if (onlySelection) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 sel_map.set_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 t_size sel_count = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 for (t_size n = 0; n<count; n++) if (is_item_selected(n)) sel_map[sel_count++] = n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 sel_map.set_size(sel_count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 metadb_handle_list temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 pfc::array_t<t_size> order_temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 if (onlySelection) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 get_selected_items(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 order_temp.set_size(count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 get_all_items(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 if (spec != NULL) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 temp.sort_by_format_get_order(onlySelection ? order_temp.get_ptr() : order.get_ptr(), spec, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 auto api = genrand_service::get(); api->seed();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 api->generate_random_order(onlySelection ? order_temp.get_ptr() : order.get_ptr(), temp.get_count());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 if (onlySelection) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 t_size n, ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 for (n = 0, ptr = 0; n<count; n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 if (!is_item_selected(n)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 order[n] = n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 t_size v = order_temp[ptr++];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 order[n] = sel_map[v];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 reorder_items(order.get_ptr(), count);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 }