annotate foosdk/sdk/foobar2000/helpers/dropdown_helper.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 "StdAfx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "dropdown_helper.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 void _cfg_dropdown_history_base::build_list(pfc::ptr_list_t<char> & out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 pfc::string8 temp; get_state(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 const char * src = temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 while(*src)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 int ptr = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 while(src[ptr] && src[ptr]!=separator) ptr++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 if (ptr>0)
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 out.add_item(pfc::strdup_n(src,ptr));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 src += ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 while(*src==separator) src++;
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 }
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 void _cfg_dropdown_history_base::parse_list(const pfc::ptr_list_t<char> & src)
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 t_size n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 pfc::string8_fastalloc temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 for(n=0;n<src.get_count();n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 temp.add_string(src[n]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 temp.add_char(separator);
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 set_state(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 }
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 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 static void g_setup_dropdown_fromlist(HWND wnd,const pfc::ptr_list_t<char> & list)
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 t_size n, m = list.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 uSendMessage(wnd,CB_RESETCONTENT,0,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 for(n=0;n<m;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 uSendMessageText(wnd,CB_ADDSTRING,0,list[n]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 void _cfg_dropdown_history_base::setup_dropdown_set_value(HWND wnd) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 pfc::ptr_list_t<char> list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 build_list(list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 g_setup_dropdown_fromlist(wnd, list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 if ( list.get_size() > 0 ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 uSetWindowText(wnd, list[0] );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 list.free_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 void _cfg_dropdown_history_base::setup_dropdown(HWND wnd)
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 pfc::ptr_list_t<char> list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 build_list(list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 g_setup_dropdown_fromlist(wnd,list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 list.free_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 #endif // _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 bool _cfg_dropdown_history_base::add_item(const char * item)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 if (!item || !*item) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 pfc::string8 meh;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 if (strchr(item,separator))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 uReplaceChar(meh,item,-1,separator,'|',false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 item = meh;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 pfc::ptr_list_t<char> list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 build_list(list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 unsigned n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 bool found = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 for(n=0;n<list.get_count();n++)
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 (!strcmp(list[n],item))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 char* temp = list.remove_by_idx(n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 list.insert_item(temp,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 found = true;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 if (!found)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 while(list.get_count() > m_max) list.delete_by_idx(list.get_count()-1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 list.insert_item(strdup(item),0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 parse_list(list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 list.free_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 return found;
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 bool _cfg_dropdown_history_base::is_empty()
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 pfc::string8 temp; get_state(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 const char * src = temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 while(*src)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 if (*src!=separator) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 src++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 bool _cfg_dropdown_history_base::add_item(const char *item, HWND combobox) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 const bool state = add_item(item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 if (state) uSendMessageText(combobox, CB_ADDSTRING, 0, item);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 return state;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 bool _cfg_dropdown_history_base::on_context(HWND wnd,LPARAM coords) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 try {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 int coords_x = (short)LOWORD(coords), coords_y = (short)HIWORD(coords);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 if (coords_x == -1 && coords_y == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 RECT asdf;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 GetWindowRect(wnd,&asdf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 coords_x = (asdf.left + asdf.right) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 coords_y = (asdf.top + asdf.bottom) / 2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 enum {ID_ERASE_ALL = 1, ID_ERASE_ONE };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 HMENU menu = CreatePopupMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 uAppendMenu(menu,MF_STRING,ID_ERASE_ALL,"Wipe history");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 pfc::string8 tempvalue;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 uGetWindowText(wnd,tempvalue);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 if (!tempvalue.is_empty())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 uAppendMenu(menu,MF_STRING,ID_ERASE_ONE,"Remove this history item");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 int cmd = TrackPopupMenu(menu,TPM_RIGHTBUTTON|TPM_NONOTIFY|TPM_RETURNCMD,coords_x,coords_y,0,wnd,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 DestroyMenu(menu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 switch(cmd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 case ID_ERASE_ALL:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 set_state("");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 pfc::string8 value;//preserve old value while wiping dropdown list
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 uGetWindowText(wnd,value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 uSendMessage(wnd,CB_RESETCONTENT,0,0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 uSetWindowText(wnd,value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 case ID_ERASE_ONE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 pfc::string8 value;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 uGetWindowText(wnd,value);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 pfc::ptr_list_t<char> list;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 build_list(list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 bool found = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 for(t_size n=0;n<list.get_size();n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 if (!strcmp(value,list[n]))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 free(list[n]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 list.remove_by_idx(n);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 found = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 if (found) parse_list(list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 g_setup_dropdown_fromlist(wnd,list);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 list.free_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 return found;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 } catch(...) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 #endif