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