Skip to content

Commit 0b01d9d

Browse files
committed
hierarchical presets menu and some translation support
1 parent e8c5d44 commit 0b01d9d

14 files changed

+119
-102
lines changed

src/common/utility.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,11 @@ const char *dt_util_localize_string(const char *s)
6363
static const int prefix_len = sizeof(prefix)-1;
6464

6565
if(s && strncmp(s, prefix, prefix_len) == 0)
66-
return _(s+prefix_len);
66+
{
67+
char *pos = strpbrk(s, "^");
68+
if(pos) *pos = '|';
69+
return Q_(s+prefix_len);
70+
}
6771
else
6872
return s;
6973
}

src/gui/preferences.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -777,12 +777,14 @@ static void _update_preset_line(GtkTreeStore *tree_store,
777777
focal_length = g_strdup_printf("%d – %d", focal_length_min, focal_length_max);
778778
}
779779

780+
gchar *local_name = dt_util_localize_segmented_name(name);
781+
780782
gtk_tree_store_set(GTK_TREE_STORE(tree_store), iter,
781783
P_ROWID_COLUMN, rowid,
782784
P_OPERATION_COLUMN, operation,
783785
P_MODULE_COLUMN, "",
784786
P_EDITABLE_COLUMN, writeprotect ? lock_pixbuf : NULL,
785-
P_NAME_COLUMN, name,
787+
P_NAME_COLUMN, local_name,
786788
P_MODEL_COLUMN, smodel,
787789
P_MAKER_COLUMN, smaker,
788790
P_LENS_COLUMN, slens,
@@ -793,6 +795,7 @@ static void _update_preset_line(GtkTreeStore *tree_store,
793795
P_AUTOAPPLY_COLUMN, autoapply ? check_pixbuf : NULL,
794796
-1);
795797

798+
g_free(local_name);
796799
g_free(focal_length);
797800
g_free(aperture);
798801
g_free(exposure);

src/gui/presets.c

+58-19
Original file line numberDiff line numberDiff line change
@@ -91,18 +91,25 @@ void dt_gui_presets_init()
9191
NULL, NULL);
9292
}
9393

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,
9597
const dt_dev_operation_t op,
9698
const int32_t version,
9799
const void *params,
98100
const int32_t params_size,
99101
const int32_t enabled,
100102
const dt_develop_blend_colorspace_t blend_cst)
101103
{
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+
102109
dt_develop_blend_params_t default_blendop_params;
103110
dt_develop_blend_init_blend_parameters(&default_blendop_params, blend_cst);
104111
dt_gui_presets_add_with_blendop(
105-
name, op, version, params, params_size,
112+
_last_name, op, version, params, params_size,
106113
&default_blendop_params, enabled);
107114
}
108115

@@ -1266,6 +1273,8 @@ static gboolean _menuitem_motion_preset(GtkMenuItem *menuitem,
12661273
return FALSE;
12671274
}
12681275

1276+
gpointer _active_menu_item = NULL;
1277+
12691278
static gboolean _menuitem_button_preset(GtkMenuItem *menuitem,
12701279
GdkEventButton *event,
12711280
dt_iop_module_t *module)
@@ -1278,10 +1287,10 @@ static gboolean _menuitem_button_preset(GtkMenuItem *menuitem,
12781287
{
12791288
if(_click_time > event->time)
12801289
{
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);
12851294

12861295
dt_gui_presets_apply_preset(name, module);
12871296
}
@@ -1585,11 +1594,14 @@ void dt_gui_favorite_presets_menu_show(GtkWidget *w)
15851594
gchar *txt = g_strdup_printf("ꬹ%s|%sꬹ", iop->so->op, name);
15861595
if(config && strstr(config, txt))
15871596
{
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);
15891600
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);
15911602
gtk_label_set_markup(GTK_LABEL(gtk_bin_get_child(GTK_BIN(mi))), tt);
15921603
g_free(tt);
1604+
g_free(local_name);
15931605
_menuitem_connect_preset(mi, name, iop);
15941606
gtk_menu_shell_append(GTK_MENU_SHELL(menu), GTK_WIDGET(mi));
15951607
}
@@ -1702,6 +1714,9 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
17021714
// collect all presets for op from db
17031715
gboolean found = FALSE;
17041716
int last_wp = -1;
1717+
gchar **prev_split = NULL;
1718+
GtkWidget *submenu = GTK_WIDGET(menu);
1719+
GSList *menu_stack = NULL; // stack of submenus
17051720
while(sqlite3_step(stmt) == SQLITE_ROW)
17061721
{
17071722
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)
17181733
{
17191734
last_wp = chk_writeprotect;
17201735
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
17211737
}
17221738
const void *op_params = (void *)sqlite3_column_blob(stmt, 1);
17231739
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)
17321748
if(darktable.gui->last_preset && strcmp(darktable.gui->last_preset, name) == 0)
17331749
found = TRUE;
17341750

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+
17351771
if(module
17361772
&& (op_params_size == 0
17371773
|| !memcmp(module->default_params, op_params,
@@ -1742,9 +1778,9 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
17421778

17431779
gchar *label;
17441780
if(isdefault)
1745-
label = g_strdup_printf("%s %s", name, _("(default)"));
1781+
label = g_strdup_printf("%s %s", dt_util_localize_string(*s), _("(default)"));
17461782
else
1747-
label = g_strdup(name);
1783+
label = g_strdup(dt_util_localize_string(*s));
17481784
mi = gtk_check_menu_item_new_with_label(label);
17491785
dt_gui_add_class(mi, "dt_transparent_background");
17501786
g_free(label);
@@ -1764,6 +1800,7 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
17641800
writeprotect = sqlite3_column_int(stmt, 2);
17651801
dt_gui_add_class(mi, "active_menu_item");
17661802
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(mi), TRUE);
1803+
g_set_weak_pointer(&_active_menu_item, mi);
17671804
}
17681805

17691806
if(isdisabled)
@@ -1776,10 +1813,12 @@ GtkMenu *dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
17761813
gtk_widget_set_tooltip_text(mi, (const char *)sqlite3_column_text(stmt, 3));
17771814
_menuitem_connect_preset(mi, name, module);
17781815
}
1779-
gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1816+
gtk_menu_shell_append(GTK_MENU_SHELL(submenu), mi);
17801817
cnt++;
17811818
}
17821819
sqlite3_finalize(stmt);
1820+
g_slist_free(menu_stack);
1821+
g_strfreev(prev_split);
17831822

17841823
if(cnt > 0) gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
17851824

@@ -1874,7 +1913,7 @@ void dt_gui_presets_update_mml(const char *name,
18741913
}
18751914
DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 4, op, -1, SQLITE_TRANSIENT);
18761915
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);
18781917
sqlite3_step(stmt);
18791918
sqlite3_finalize(stmt);
18801919
}
@@ -1898,7 +1937,7 @@ void dt_gui_presets_update_iso(const char *name,
18981937
DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 2, max);
18991938
DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 3, op, -1, SQLITE_TRANSIENT);
19001939
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);
19021941
sqlite3_step(stmt);
19031942
sqlite3_finalize(stmt);
19041943
}
@@ -1922,7 +1961,7 @@ void dt_gui_presets_update_av(const char *name,
19221961
DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 2, max);
19231962
DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 3, op, -1, SQLITE_TRANSIENT);
19241963
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);
19261965
sqlite3_step(stmt);
19271966
sqlite3_finalize(stmt);
19281967
}
@@ -1944,7 +1983,7 @@ void dt_gui_presets_update_tv(const char *name,
19441983
DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 2, max);
19451984
DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 3, op, -1, SQLITE_TRANSIENT);
19461985
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);
19481987
sqlite3_step(stmt);
19491988
sqlite3_finalize(stmt);
19501989
}
@@ -1967,7 +2006,7 @@ void dt_gui_presets_update_fl(const char *name,
19672006
DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 2, max);
19682007
DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 3, op, -1, SQLITE_TRANSIENT);
19692008
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);
19712010
sqlite3_step(stmt);
19722011
sqlite3_finalize(stmt);
19732012
}
@@ -1988,7 +2027,7 @@ void dt_gui_presets_update_format(const char *name,
19882027
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, flag);
19892028
DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, op, -1, SQLITE_TRANSIENT);
19902029
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);
19922031
sqlite3_step(stmt);
19932032
sqlite3_finalize(stmt);
19942033
}
@@ -2009,7 +2048,7 @@ void dt_gui_presets_update_autoapply(const char *name,
20092048
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, autoapply);
20102049
DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, op, -1, SQLITE_TRANSIENT);
20112050
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);
20132052
sqlite3_step(stmt);
20142053
sqlite3_finalize(stmt);
20152054
}
@@ -2030,7 +2069,7 @@ void dt_gui_presets_update_filter(const char *name,
20302069
DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, filter);
20312070
DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, op, -1, SQLITE_TRANSIENT);
20322071
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);
20342073
sqlite3_step(stmt);
20352074
sqlite3_finalize(stmt);
20362075
}

src/gui/presets.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ typedef struct dt_gui_presets_edit_dialog_t
7575
void dt_gui_presets_init();
7676

7777
/** add or replace a generic (i.e. non-exif specific) preset for this operation. */
78-
void dt_gui_presets_add_generic(const char *name,
78+
/** the names _have_ to be marked for translation with _("") otherwise use dt_gui_presets_add_with_blendop */
79+
#define dt_gui_presets_add_generic(name, ...) dt_gui_presets_add_generic(N##name, __VA_ARGS__)
80+
void (dt_gui_presets_add_generic)(const char *name,
7981
const dt_dev_operation_t op,
8082
const int32_t version,
8183
const void *params,

0 commit comments

Comments
 (0)