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