@@ -91,18 +91,25 @@ void dt_gui_presets_init()
91
91
NULL , NULL );
92
92
}
93
93
94
- void dt_gui_presets_add_generic (const char * name ,
94
+ char * _last_name = NULL ; // for use by dt_gui_presets_update_
95
+
96
+ void (dt_gui_presets_add_generic )(const char * name ,
95
97
const dt_dev_operation_t op ,
96
98
const int32_t version ,
97
99
const void * params ,
98
100
const int32_t params_size ,
99
101
const int32_t enabled ,
100
102
const dt_develop_blend_colorspace_t blend_cst )
101
103
{
104
+ g_free (_last_name );
105
+ _last_name = g_strdup_printf ("_l10n_%s" , name );
106
+ char * pos = strpbrk (_last_name , "|" );
107
+ if (pos ) * pos = '^' ;
108
+
102
109
dt_develop_blend_params_t default_blendop_params ;
103
110
dt_develop_blend_init_blend_parameters (& default_blendop_params , blend_cst );
104
111
dt_gui_presets_add_with_blendop (
105
- name , op , version , params , params_size ,
112
+ _last_name , op , version , params , params_size ,
106
113
& default_blendop_params , enabled );
107
114
}
108
115
@@ -1266,6 +1273,8 @@ static gboolean _menuitem_motion_preset(GtkMenuItem *menuitem,
1266
1273
return FALSE;
1267
1274
}
1268
1275
1276
+ gpointer _active_menu_item = NULL ;
1277
+
1269
1278
static gboolean _menuitem_button_preset (GtkMenuItem * menuitem ,
1270
1279
GdkEventButton * event ,
1271
1280
dt_iop_module_t * module )
@@ -1278,10 +1287,10 @@ static gboolean _menuitem_button_preset(GtkMenuItem *menuitem,
1278
1287
{
1279
1288
if (_click_time > event -> time )
1280
1289
{
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 );
1290
+ if ( _active_menu_item )
1291
+ gtk_check_menu_item_set_active ( _active_menu_item , FALSE);
1292
+ gtk_check_menu_item_set_active ( GTK_CHECK_MENU_ITEM ( menuitem ), TRUE);
1293
+ g_set_weak_pointer ( & _active_menu_item , menuitem );
1285
1294
1286
1295
dt_gui_presets_apply_preset (name , module );
1287
1296
}
@@ -1585,11 +1594,14 @@ void dt_gui_favorite_presets_menu_show(GtkWidget *w)
1585
1594
gchar * txt = g_strdup_printf ("ꬹ%s|%sꬹ" , iop -> so -> op , name );
1586
1595
if (config && strstr (config , txt ))
1587
1596
{
1588
- GtkWidget * mi = gtk_menu_item_new_with_label (name );
1597
+ gchar * local_name = dt_util_localize_segmented_name (name );
1598
+
1599
+ GtkWidget * mi = gtk_menu_item_new_with_label (local_name );
1589
1600
gchar * tt = g_markup_printf_escaped ("<b>%s %s</b> %s" ,
1590
- iop -> name (), iop -> multi_name , name );
1601
+ iop -> name (), iop -> multi_name , local_name );
1591
1602
gtk_label_set_markup (GTK_LABEL (gtk_bin_get_child (GTK_BIN (mi ))), tt );
1592
1603
g_free (tt );
1604
+ g_free (local_name );
1593
1605
_menuitem_connect_preset (mi , name , iop );
1594
1606
gtk_menu_shell_append (GTK_MENU_SHELL (menu ), GTK_WIDGET (mi ));
1595
1607
}
@@ -1702,6 +1714,9 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
1702
1714
// collect all presets for op from db
1703
1715
gboolean found = FALSE;
1704
1716
int last_wp = -1 ;
1717
+ gchar * * prev_split = NULL ;
1718
+ GtkWidget * submenu = GTK_WIDGET (menu );
1719
+ GSList * menu_stack = NULL ; // stack of submenus
1705
1720
while (sqlite3_step (stmt ) == SQLITE_ROW )
1706
1721
{
1707
1722
const int chk_writeprotect = sqlite3_column_int (stmt , 2 );
@@ -1718,6 +1733,7 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
1718
1733
{
1719
1734
last_wp = chk_writeprotect ;
1720
1735
gtk_menu_shell_append (GTK_MENU_SHELL (menu ), gtk_separator_menu_item_new ());
1736
+ * prev_split [0 ] = '\0' ; // make first level mismatch so we start over
1721
1737
}
1722
1738
const void * op_params = (void * )sqlite3_column_blob (stmt , 1 );
1723
1739
const int32_t op_params_size = sqlite3_column_bytes (stmt , 1 );
@@ -1732,6 +1748,26 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
1732
1748
if (darktable .gui -> last_preset && strcmp (darktable .gui -> last_preset , name ) == 0 )
1733
1749
found = TRUE;
1734
1750
1751
+ gchar * * split = g_strsplit (name , "|" , -1 ), * * s = split , * * p = prev_split ;
1752
+ for (; p && * (p + 1 ) && * (s + 1 ) && !g_strcmp0 (* s , * p ); p ++ , s ++ )
1753
+ ;
1754
+ for (; p && * (p + 1 ); p ++ )
1755
+ {
1756
+ submenu = menu_stack -> data ;
1757
+ menu_stack = g_slist_delete_link (menu_stack , menu_stack ); // pop
1758
+ }
1759
+ for (; * (s + 1 ); s ++ )
1760
+ {
1761
+ menu_stack = g_slist_prepend (menu_stack , submenu ); // push
1762
+
1763
+ GtkWidget * sm = gtk_menu_item_new_with_label (dt_util_localize_string (* s ));
1764
+ gtk_menu_shell_append (GTK_MENU_SHELL (submenu ), sm );
1765
+ submenu = gtk_menu_new ();
1766
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (sm ), submenu );
1767
+ }
1768
+ g_strfreev (prev_split );
1769
+ prev_split = split ;
1770
+
1735
1771
if (module
1736
1772
&& (op_params_size == 0
1737
1773
|| !memcmp (module -> default_params , op_params ,
@@ -1742,9 +1778,9 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
1742
1778
1743
1779
gchar * label ;
1744
1780
if (isdefault )
1745
- label = g_strdup_printf ("%s %s" , name , _ ("(default)" ));
1781
+ label = g_strdup_printf ("%s %s" , dt_util_localize_string ( * s ) , _ ("(default)" ));
1746
1782
else
1747
- label = g_strdup (name );
1783
+ label = g_strdup (dt_util_localize_string ( * s ) );
1748
1784
mi = gtk_check_menu_item_new_with_label (label );
1749
1785
dt_gui_add_class (mi , "dt_transparent_background" );
1750
1786
g_free (label );
@@ -1764,6 +1800,7 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
1764
1800
writeprotect = sqlite3_column_int (stmt , 2 );
1765
1801
dt_gui_add_class (mi , "active_menu_item" );
1766
1802
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mi ), TRUE);
1803
+ g_set_weak_pointer (& _active_menu_item , mi );
1767
1804
}
1768
1805
1769
1806
if (isdisabled )
@@ -1776,10 +1813,12 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
1776
1813
gtk_widget_set_tooltip_text (mi , (const char * )sqlite3_column_text (stmt , 3 ));
1777
1814
_menuitem_connect_preset (mi , name , module );
1778
1815
}
1779
- gtk_menu_shell_append (GTK_MENU_SHELL (menu ), mi );
1816
+ gtk_menu_shell_append (GTK_MENU_SHELL (submenu ), mi );
1780
1817
cnt ++ ;
1781
1818
}
1782
1819
sqlite3_finalize (stmt );
1820
+ g_slist_free (menu_stack );
1821
+ g_strfreev (prev_split );
1783
1822
1784
1823
if (cnt > 0 ) gtk_menu_shell_append (GTK_MENU_SHELL (menu ), gtk_separator_menu_item_new ());
1785
1824
@@ -1874,7 +1913,7 @@ void dt_gui_presets_update_mml(const char *name,
1874
1913
}
1875
1914
DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 4 , op , -1 , SQLITE_TRANSIENT );
1876
1915
DT_DEBUG_SQLITE3_BIND_INT (stmt , 5 , version );
1877
- DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 6 , name , -1 , SQLITE_TRANSIENT );
1916
+ DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 6 , name ?: _last_name , -1 , SQLITE_TRANSIENT );
1878
1917
sqlite3_step (stmt );
1879
1918
sqlite3_finalize (stmt );
1880
1919
}
@@ -1898,7 +1937,7 @@ void dt_gui_presets_update_iso(const char *name,
1898
1937
DT_DEBUG_SQLITE3_BIND_DOUBLE (stmt , 2 , max );
1899
1938
DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 3 , op , -1 , SQLITE_TRANSIENT );
1900
1939
DT_DEBUG_SQLITE3_BIND_INT (stmt , 4 , version );
1901
- DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 5 , name , -1 , SQLITE_TRANSIENT );
1940
+ DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 5 , name ?: _last_name , -1 , SQLITE_TRANSIENT );
1902
1941
sqlite3_step (stmt );
1903
1942
sqlite3_finalize (stmt );
1904
1943
}
@@ -1922,7 +1961,7 @@ void dt_gui_presets_update_av(const char *name,
1922
1961
DT_DEBUG_SQLITE3_BIND_DOUBLE (stmt , 2 , max );
1923
1962
DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 3 , op , -1 , SQLITE_TRANSIENT );
1924
1963
DT_DEBUG_SQLITE3_BIND_INT (stmt , 4 , version );
1925
- DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 5 , name , -1 , SQLITE_TRANSIENT );
1964
+ DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 5 , name ?: _last_name , -1 , SQLITE_TRANSIENT );
1926
1965
sqlite3_step (stmt );
1927
1966
sqlite3_finalize (stmt );
1928
1967
}
@@ -1944,7 +1983,7 @@ void dt_gui_presets_update_tv(const char *name,
1944
1983
DT_DEBUG_SQLITE3_BIND_DOUBLE (stmt , 2 , max );
1945
1984
DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 3 , op , -1 , SQLITE_TRANSIENT );
1946
1985
DT_DEBUG_SQLITE3_BIND_INT (stmt , 4 , version );
1947
- DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 5 , name , -1 , SQLITE_TRANSIENT );
1986
+ DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 5 , name ?: _last_name , -1 , SQLITE_TRANSIENT );
1948
1987
sqlite3_step (stmt );
1949
1988
sqlite3_finalize (stmt );
1950
1989
}
@@ -1967,7 +2006,7 @@ void dt_gui_presets_update_fl(const char *name,
1967
2006
DT_DEBUG_SQLITE3_BIND_DOUBLE (stmt , 2 , max );
1968
2007
DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 3 , op , -1 , SQLITE_TRANSIENT );
1969
2008
DT_DEBUG_SQLITE3_BIND_INT (stmt , 4 , version );
1970
- DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 5 , name , -1 , SQLITE_TRANSIENT );
2009
+ DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 5 , name ?: _last_name , -1 , SQLITE_TRANSIENT );
1971
2010
sqlite3_step (stmt );
1972
2011
sqlite3_finalize (stmt );
1973
2012
}
@@ -1988,7 +2027,7 @@ void dt_gui_presets_update_format(const char *name,
1988
2027
DT_DEBUG_SQLITE3_BIND_INT (stmt , 1 , flag );
1989
2028
DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 2 , op , -1 , SQLITE_TRANSIENT );
1990
2029
DT_DEBUG_SQLITE3_BIND_INT (stmt , 3 , version );
1991
- DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 4 , name , -1 , SQLITE_TRANSIENT );
2030
+ DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 4 , name ?: _last_name , -1 , SQLITE_TRANSIENT );
1992
2031
sqlite3_step (stmt );
1993
2032
sqlite3_finalize (stmt );
1994
2033
}
@@ -2009,7 +2048,7 @@ void dt_gui_presets_update_autoapply(const char *name,
2009
2048
DT_DEBUG_SQLITE3_BIND_INT (stmt , 1 , autoapply );
2010
2049
DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 2 , op , -1 , SQLITE_TRANSIENT );
2011
2050
DT_DEBUG_SQLITE3_BIND_INT (stmt , 3 , version );
2012
- DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 4 , name , -1 , SQLITE_TRANSIENT );
2051
+ DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 4 , name ?: _last_name , -1 , SQLITE_TRANSIENT );
2013
2052
sqlite3_step (stmt );
2014
2053
sqlite3_finalize (stmt );
2015
2054
}
@@ -2030,7 +2069,7 @@ void dt_gui_presets_update_filter(const char *name,
2030
2069
DT_DEBUG_SQLITE3_BIND_INT (stmt , 1 , filter );
2031
2070
DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 2 , op , -1 , SQLITE_TRANSIENT );
2032
2071
DT_DEBUG_SQLITE3_BIND_INT (stmt , 3 , version );
2033
- DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 4 , name , -1 , SQLITE_TRANSIENT );
2072
+ DT_DEBUG_SQLITE3_BIND_TEXT (stmt , 4 , name ?: _last_name , -1 , SQLITE_TRANSIENT );
2034
2073
sqlite3_step (stmt );
2035
2074
sqlite3_finalize (stmt );
2036
2075
}
0 commit comments