Files
foobar2000-sdk/foobar2000/helpers/dropdown_helper.cpp
2021-12-14 00:28:25 -07:00

175 lines
3.8 KiB
C++

#include "stdafx.h"
#ifdef FOOBAR2000_DESKTOP_WINDOWS
#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);
}
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();
}
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::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::is_empty()
{
pfc::string8 temp; get_state(temp);
const char * src = temp;
while(*src)
{
if (*src!=separator) return false;
src++;
}
return true;
}
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 // FOOBAR2000_DESKTOP_WINDOWS