view 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 source

#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