@@ -1266,6 +1266,8 @@ static gboolean _menuitem_motion_preset(GtkMenuItem *menuitem,
1266
1266
return FALSE;
1267
1267
}
1268
1268
1269
+ gpointer _active_menu_item = NULL ;
1270
+
1269
1271
static gboolean _menuitem_button_preset (GtkMenuItem * menuitem ,
1270
1272
GdkEventButton * event ,
1271
1273
dt_iop_module_t * module )
@@ -1278,10 +1280,10 @@ static gboolean _menuitem_button_preset(GtkMenuItem *menuitem,
1278
1280
{
1279
1281
if (_click_time > event -> time )
1280
1282
{
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 );
1285
1287
1286
1288
dt_gui_presets_apply_preset (name , module );
1287
1289
}
@@ -1702,6 +1704,9 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
1702
1704
// collect all presets for op from db
1703
1705
gboolean found = FALSE;
1704
1706
int last_wp = -1 ;
1707
+ gchar * * prev_split = NULL ;
1708
+ GtkWidget * submenu = GTK_WIDGET (menu );
1709
+ GSList * menu_stack = NULL ; // stack of submenus
1705
1710
while (sqlite3_step (stmt ) == SQLITE_ROW )
1706
1711
{
1707
1712
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)
1718
1723
{
1719
1724
last_wp = chk_writeprotect ;
1720
1725
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
1721
1727
}
1722
1728
const void * op_params = (void * )sqlite3_column_blob (stmt , 1 );
1723
1729
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)
1732
1738
if (darktable .gui -> last_preset && strcmp (darktable .gui -> last_preset , name ) == 0 )
1733
1739
found = TRUE;
1734
1740
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
+
1735
1761
if (module
1736
1762
&& (op_params_size == 0
1737
1763
|| !memcmp (module -> default_params , op_params ,
@@ -1742,9 +1768,9 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
1742
1768
1743
1769
gchar * label ;
1744
1770
if (isdefault )
1745
- label = g_strdup_printf ("%s %s" , name , _ ("(default)" ));
1771
+ label = g_strdup_printf ("%s %s" , * s , _ ("(default)" ));
1746
1772
else
1747
- label = g_strdup (name );
1773
+ label = g_strdup (* s );
1748
1774
mi = gtk_check_menu_item_new_with_label (label );
1749
1775
dt_gui_add_class (mi , "dt_transparent_background" );
1750
1776
g_free (label );
@@ -1764,6 +1790,7 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
1764
1790
writeprotect = sqlite3_column_int (stmt , 2 );
1765
1791
dt_gui_add_class (mi , "active_menu_item" );
1766
1792
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi ), TRUE);
1793
+ g_set_weak_pointer (& _active_menu_item , mi );
1767
1794
}
1768
1795
1769
1796
if (isdisabled )
@@ -1776,10 +1803,12 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
1776
1803
gtk_widget_set_tooltip_text (mi , (const char * )sqlite3_column_text (stmt , 3 ));
1777
1804
_menuitem_connect_preset (mi , name , module );
1778
1805
}
1779
- gtk_menu_shell_append (GTK_MENU_SHELL (menu ), mi );
1806
+ gtk_menu_shell_append (GTK_MENU_SHELL (submenu ), mi );
1780
1807
cnt ++ ;
1781
1808
}
1782
1809
sqlite3_finalize (stmt );
1810
+ g_slist_free (menu_stack );
1811
+ g_strfreev (prev_split );
1783
1812
1784
1813
if (cnt > 0 ) gtk_menu_shell_append (GTK_MENU_SHELL (menu ), gtk_separator_menu_item_new ());
1785
1814
0 commit comments