Mercurial > foo_out_sdl
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/helpers/dropdown_helper.cpp Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,174 @@ +#include "StdAfx.h" + +#include "dropdown_helper.h" + +void _cfg_dropdown_history_base::build_list(pfc::ptr_list_t<char> & out) +{ + pfc::string8 temp; get_state(temp); + const char * src = temp; + while(*src) + { + int ptr = 0; + while(src[ptr] && src[ptr]!=separator) ptr++; + if (ptr>0) + { + out.add_item(pfc::strdup_n(src,ptr)); + src += ptr; + } + while(*src==separator) src++; + } +} + +void _cfg_dropdown_history_base::parse_list(const pfc::ptr_list_t<char> & src) +{ + t_size n; + pfc::string8_fastalloc temp; + for(n=0;n<src.get_count();n++) + { + temp.add_string(src[n]); + temp.add_char(separator); + } + set_state(temp); +} + +#ifdef _WIN32 +static void g_setup_dropdown_fromlist(HWND wnd,const pfc::ptr_list_t<char> & list) +{ + t_size n, m = list.get_count(); + uSendMessage(wnd,CB_RESETCONTENT,0,0); + for(n=0;n<m;n++) { + uSendMessageText(wnd,CB_ADDSTRING,0,list[n]); + } +} + +void _cfg_dropdown_history_base::setup_dropdown_set_value(HWND wnd) { + pfc::ptr_list_t<char> list; + build_list(list); + g_setup_dropdown_fromlist(wnd, list); + if ( list.get_size() > 0 ) { + uSetWindowText(wnd, list[0] ); + } + list.free_all(); +} + +void _cfg_dropdown_history_base::setup_dropdown(HWND wnd) +{ + pfc::ptr_list_t<char> list; + build_list(list); + g_setup_dropdown_fromlist(wnd,list); + list.free_all(); +} +#endif // _WIN32 + +bool _cfg_dropdown_history_base::add_item(const char * item) +{ + if (!item || !*item) return false; + pfc::string8 meh; + if (strchr(item,separator)) + { + uReplaceChar(meh,item,-1,separator,'|',false); + item = meh; + } + pfc::ptr_list_t<char> list; + build_list(list); + unsigned n; + bool found = false; + for(n=0;n<list.get_count();n++) + { + if (!strcmp(list[n],item)) + { + char* temp = list.remove_by_idx(n); + list.insert_item(temp,0); + found = true; + } + } + + if (!found) + { + while(list.get_count() > m_max) list.delete_by_idx(list.get_count()-1); + list.insert_item(strdup(item),0); + } + parse_list(list); + list.free_all(); + return found; +} + +bool _cfg_dropdown_history_base::is_empty() +{ + pfc::string8 temp; get_state(temp); + const char * src = temp; + while(*src) + { + if (*src!=separator) return false; + src++; + } + return true; +} + +#ifdef _WIN32 +bool _cfg_dropdown_history_base::add_item(const char *item, HWND combobox) { + const bool state = add_item(item); + if (state) uSendMessageText(combobox, CB_ADDSTRING, 0, item); + return state; +} + +bool _cfg_dropdown_history_base::on_context(HWND wnd,LPARAM coords) { + try { + int coords_x = (short)LOWORD(coords), coords_y = (short)HIWORD(coords); + if (coords_x == -1 && coords_y == -1) + { + RECT asdf; + GetWindowRect(wnd,&asdf); + coords_x = (asdf.left + asdf.right) / 2; + coords_y = (asdf.top + asdf.bottom) / 2; + } + enum {ID_ERASE_ALL = 1, ID_ERASE_ONE }; + HMENU menu = CreatePopupMenu(); + uAppendMenu(menu,MF_STRING,ID_ERASE_ALL,"Wipe history"); + { + pfc::string8 tempvalue; + uGetWindowText(wnd,tempvalue); + if (!tempvalue.is_empty()) + uAppendMenu(menu,MF_STRING,ID_ERASE_ONE,"Remove this history item"); + } + int cmd = TrackPopupMenu(menu,TPM_RIGHTBUTTON|TPM_NONOTIFY|TPM_RETURNCMD,coords_x,coords_y,0,wnd,0); + DestroyMenu(menu); + switch(cmd) + { + case ID_ERASE_ALL: + { + set_state(""); + pfc::string8 value;//preserve old value while wiping dropdown list + uGetWindowText(wnd,value); + uSendMessage(wnd,CB_RESETCONTENT,0,0); + uSetWindowText(wnd,value); + return true; + } + case ID_ERASE_ONE: + { + pfc::string8 value; + uGetWindowText(wnd,value); + + pfc::ptr_list_t<char> list; + build_list(list); + bool found = false; + for(t_size n=0;n<list.get_size();n++) + { + if (!strcmp(value,list[n])) + { + free(list[n]); + list.remove_by_idx(n); + found = true; + break; + } + } + if (found) parse_list(list); + g_setup_dropdown_fromlist(wnd,list); + list.free_all(); + return found; + } + } + } catch(...) {} + return false; +} +#endif
