Skip to content

Commit 23a3fc2

Browse files
committed
presets menu hierarchies
1 parent e8c5d44 commit 23a3fc2

File tree

1 file changed

+36
-7
lines changed

1 file changed

+36
-7
lines changed

src/gui/presets.c

+36-7
Original file line numberDiff line numberDiff line change
@@ -1266,6 +1266,8 @@ static gboolean _menuitem_motion_preset(GtkMenuItem *menuitem,
12661266
return FALSE;
12671267
}
12681268

1269+
gpointer _active_menu_item = NULL;
1270+
12691271
static gboolean _menuitem_button_preset(GtkMenuItem *menuitem,
12701272
GdkEventButton *event,
12711273
dt_iop_module_t *module)
@@ -1278,10 +1280,10 @@ static gboolean _menuitem_button_preset(GtkMenuItem *menuitem,
12781280
{
12791281
if(_click_time > event->time)
12801282
{
1281-
GtkContainer *menu = GTK_CONTAINER(gtk_widget_get_parent(GTK_WIDGET(menuitem)));
1282-
for(GList *c = gtk_container_get_children(menu); c; c = g_list_delete_link(c, c))
1283-
if(GTK_IS_CHECK_MENU_ITEM(c->data))
1284-
gtk_check_menu_item_set_active(c->data, c->data == menuitem);
1283+
if(_active_menu_item)
1284+
gtk_check_menu_item_set_active(_active_menu_item, FALSE);
1285+
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
1286+
g_set_weak_pointer(&_active_menu_item, menuitem);
12851287

12861288
dt_gui_presets_apply_preset(name, module);
12871289
}
@@ -1702,6 +1704,9 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
17021704
// collect all presets for op from db
17031705
gboolean found = FALSE;
17041706
int last_wp = -1;
1707+
gchar **prev_split = NULL;
1708+
GtkWidget *submenu = GTK_WIDGET(menu);
1709+
GSList *menu_stack = NULL; // stack of submenus
17051710
while(sqlite3_step(stmt) == SQLITE_ROW)
17061711
{
17071712
const int chk_writeprotect = sqlite3_column_int(stmt, 2);
@@ -1718,6 +1723,7 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
17181723
{
17191724
last_wp = chk_writeprotect;
17201725
gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
1726+
*prev_split[0] = '\0'; // make first level mismatch so we start over
17211727
}
17221728
const void *op_params = (void *)sqlite3_column_blob(stmt, 1);
17231729
const int32_t op_params_size = sqlite3_column_bytes(stmt, 1);
@@ -1732,6 +1738,26 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
17321738
if(darktable.gui->last_preset && strcmp(darktable.gui->last_preset, name) == 0)
17331739
found = TRUE;
17341740

1741+
gchar **split = g_strsplit(name, "|", -1), **s = split, **p = prev_split;
1742+
for(; p && *(p+1) && *(s+1) && !g_strcmp0(*s, *p); p++, s++)
1743+
;
1744+
for(; p && *(p+1); p++)
1745+
{
1746+
submenu = menu_stack->data;
1747+
menu_stack = g_slist_delete_link(menu_stack, menu_stack); // pop
1748+
}
1749+
for(; *(s+1); s++)
1750+
{
1751+
menu_stack = g_slist_prepend(menu_stack, submenu); // push
1752+
1753+
GtkWidget *sm = gtk_menu_item_new_with_label(*s);
1754+
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), sm);
1755+
submenu = gtk_menu_new();
1756+
gtk_menu_item_set_submenu(GTK_MENU_ITEM(sm), submenu);
1757+
}
1758+
g_strfreev(prev_split);
1759+
prev_split = split;
1760+
17351761
if(module
17361762
&& (op_params_size == 0
17371763
|| !memcmp(module->default_params, op_params,
@@ -1742,9 +1768,9 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
17421768

17431769
gchar *label;
17441770
if(isdefault)
1745-
label = g_strdup_printf("%s %s", name, _("(default)"));
1771+
label = g_strdup_printf("%s %s", *s, _("(default)"));
17461772
else
1747-
label = g_strdup(name);
1773+
label = g_strdup(*s);
17481774
mi = gtk_check_menu_item_new_with_label(label);
17491775
dt_gui_add_class(mi, "dt_transparent_background");
17501776
g_free(label);
@@ -1764,6 +1790,7 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
17641790
writeprotect = sqlite3_column_int(stmt, 2);
17651791
dt_gui_add_class(mi, "active_menu_item");
17661792
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mi), TRUE);
1793+
g_set_weak_pointer(&_active_menu_item, mi);
17671794
}
17681795

17691796
if(isdisabled)
@@ -1776,10 +1803,12 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
17761803
gtk_widget_set_tooltip_text(mi, (const char *)sqlite3_column_text(stmt, 3));
17771804
_menuitem_connect_preset(mi, name, module);
17781805
}
1779-
gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1806+
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), mi);
17801807
cnt++;
17811808
}
17821809
sqlite3_finalize(stmt);
1810+
g_slist_free(menu_stack);
1811+
g_strfreev(prev_split);
17831812

17841813
if(cnt > 0) gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
17851814

0 commit comments

Comments
 (0)