Skip to content

Commit 51808aa

Browse files
committed
Merge branch 'presets-popover-menu' into collect_popover_menu
2 parents 28600db + 2526a41 commit 51808aa

12 files changed

Lines changed: 349 additions & 161 deletions

File tree

src/common/presets.c

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
#include "develop/imageop.h"
2626
#include "libs/lib.h"
2727

28+
#include <glib-2.0/gio/gmenu.h>
29+
#include <glib-2.0/gio/gmenumodel.h>
2830
#include <libxml/encoding.h>
2931
#include <libxml/xmlwriter.h>
3032
#include <libxml/parser.h>
@@ -548,6 +550,84 @@ GtkWidget *dt_insert_preset_in_menu_hierarchy(const char *name,
548550
return mi;
549551
}
550552

553+
static void _menu_shell_insert_sorted2(GMenu *menu,
554+
GMenuItem *item,
555+
const gchar *name)
556+
{
557+
GMenuModel *model = G_MENU_MODEL(menu);
558+
559+
int num = g_menu_model_get_n_items(model);
560+
gboolean found = FALSE;
561+
int i;
562+
for(i = 0; i < num; i++)
563+
{
564+
gchar *item_label = NULL;
565+
GVariant *attr = g_menu_model_get_item_attribute_value(model, i, "label", G_VARIANT_TYPE_STRING);
566+
if(attr)
567+
{
568+
item_label = g_variant_dup_string(attr, NULL);
569+
g_variant_unref(attr);
570+
if(g_utf8_collate(item_label, name) > 0) found = TRUE;
571+
g_free(item_label);
572+
if(found) break;
573+
}
574+
}
575+
576+
g_menu_insert_item(menu, i, item);
577+
}
578+
579+
void dt_insert_preset_in_menu_hierarchy2(const char *name,
580+
const char *action,
581+
GSList **menu_path,
582+
GMenu *mainmenu,
583+
GMenu **submenu,
584+
gchar ***prev_split,
585+
gboolean isdefault)
586+
{
587+
gchar *local_name = dt_util_localize_segmented_name(name, FALSE);
588+
gchar **split = g_strsplit(local_name, "|", -1);
589+
gchar **s = split;
590+
gchar **p = *prev_split;
591+
GSList *mpath = *menu_path;
592+
GMenuItem *mi;
593+
g_free(local_name);
594+
595+
for(; p && *(p+1) && *(s+1) && !g_strcmp0(*s, *p); p++, s++)
596+
;
597+
598+
for(; p && *(p+1); p++)
599+
{
600+
mpath = g_slist_delete_link(mpath, mpath); // pop
601+
*submenu = mpath ? mpath->data : mainmenu;
602+
}
603+
604+
for(; *(s+1); s++)
605+
{
606+
GMenu *sm = g_menu_new();
607+
GMenuItem *smi = g_menu_item_new_submenu(*s, G_MENU_MODEL(sm));
608+
_menu_shell_insert_sorted2(*submenu, smi, *s);
609+
*submenu = sm;
610+
mpath = g_slist_prepend(mpath, sm); // push
611+
}
612+
613+
*menu_path = mpath;
614+
g_strfreev(*prev_split);
615+
*prev_split = split;
616+
617+
if(isdefault)
618+
{
619+
gchar *label = g_strdup_printf("%s %s", *s, _("(default)"));
620+
mi = g_menu_item_new(label, action);
621+
_menu_shell_insert_sorted2(*submenu, mi, label);
622+
g_free(label);
623+
}
624+
else
625+
{
626+
mi = g_menu_item_new(*s, action);
627+
_menu_shell_insert_sorted2(*submenu, mi, *s);
628+
}
629+
}
630+
551631
// clang-format off
552632
// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
553633
// vim: shiftwidth=2 expandtab tabstop=2 cindent

src/common/presets.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ GtkWidget *dt_insert_preset_in_menu_hierarchy(const char *name,
6565
gboolean isdefault,
6666
gboolean writeprotect);
6767

68+
void dt_insert_preset_in_menu_hierarchy2(const char *name,
69+
const char *action,
70+
GSList **menu_path2,
71+
GMenu *mainmenu2,
72+
GMenu **submenu2,
73+
gchar ***prev_split,
74+
gboolean isdefault);
75+
6876
// clang-format off
6977
// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
7078
// vim: shiftwidth=2 expandtab tabstop=2 cindent

src/gui/gtk.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4832,7 +4832,8 @@ GtkWidget *dt_gui_popover_menu_from_model(GtkWidget *parent, GMenu *menu)
48324832
GtkWidget *popover_menu;
48334833

48344834
#if GTK_CHECK_VERSION(4, 0, 0)
4835-
popover_menu = gtk_popover_menu_new_from_model(G_MENU_MODEL(menu));
4835+
popover_menu = gtk_popover_menu_new_from_model_full(G_MENU_MODEL(menu),
4836+
GTK_POPOVER_MENU_NESTED);
48364837
gtk_widget_set_parent(popover_menu, parent);
48374838
#else
48384839
popover_menu = gtk_popover_new_from_model(parent, G_MENU_MODEL(menu));

src/libs/collect.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3383,8 +3383,9 @@ static void _populate_collect_combo(GtkWidget *w)
33833383
#undef ADD_COLLECT_ENTRY
33843384
}
33853385

3386-
void _menuitem_preferences(GtkMenuItem *menuitem,
3387-
dt_lib_module_t *self)
3386+
static void _menuitem_preferences(GSimpleAction *action,
3387+
GVariant *parameter,
3388+
gpointer user_data)
33883389
{
33893390
GtkWidget *win = dt_ui_main_window(darktable.gui->ui);
33903391
GtkWidget *dialog = gtk_dialog_new_with_buttons
@@ -3407,12 +3408,12 @@ void _menuitem_preferences(GtkMenuItem *menuitem,
34073408
DT_COLLECTION_PROP_UNDEF, NULL);
34083409
}
34093410

3410-
void set_preferences(void *menu,
3411-
dt_lib_module_t *self)
3411+
void set_preferences(GMenu *menu, GActionGroup *action_group, dt_lib_module_t *self)
34123412
{
3413-
GtkWidget *mi = gtk_menu_item_new_with_label(_("preferences..."));
3414-
g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(_menuitem_preferences), self);
3415-
gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
3413+
GSimpleAction *action = g_simple_action_new("preferences", NULL);
3414+
g_signal_connect(action, "activate", G_CALLBACK(_menuitem_preferences), self);
3415+
g_action_map_add_action(G_ACTION_MAP(action_group), G_ACTION(action));
3416+
g_menu_append(menu, _("preferences..."), "presets.preferences");
34163417
}
34173418

34183419
static gint _sort_model_func(GtkTreeModel *model,

src/libs/export.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1274,8 +1274,11 @@ static void _on_storage_list_changed(gpointer instance,
12741274
dt_bauhaus_combobox_set(d->storage, dt_imageio_get_index_of_storage(storage));
12751275
}
12761276

1277-
static void _menuitem_preferences(GtkMenuItem *menuitem, dt_lib_module_t *self)
1277+
static void _menuitem_preferences(GSimpleAction *action,
1278+
GVariant *parameter,
1279+
gpointer user_data)
12781280
{
1281+
dt_lib_module_t *self = (dt_lib_module_t *)user_data;
12791282
dt_lib_export_t *d = self->data;
12801283
const gchar *name = dt_bauhaus_combobox_get_text(d->storage);
12811284
const gboolean ondisk = name
@@ -1422,12 +1425,12 @@ static void _export_presets_changed_callback(gpointer instance, gpointer module,
14221425
_fill_batch_export_list(self);
14231426
}
14241427

1425-
void set_preferences(void *menu, dt_lib_module_t *self)
1428+
void set_preferences(GMenu *menu, GActionGroup *action_group, dt_lib_module_t *self)
14261429
{
1427-
GtkWidget *mi = gtk_menu_item_new_with_label(_("preferences..."));
1428-
g_signal_connect(G_OBJECT(mi), "activate",
1429-
G_CALLBACK(_menuitem_preferences), self);
1430-
gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1430+
GSimpleAction *action = g_simple_action_new("preferences", NULL);
1431+
g_signal_connect(action, "activate", G_CALLBACK(_menuitem_preferences), self);
1432+
g_action_map_add_action(G_ACTION_MAP(action_group), G_ACTION(action));
1433+
g_menu_append(menu, _("preferences..."), "presets.preferences");
14311434
}
14321435

14331436
void gui_init(dt_lib_module_t *self)

0 commit comments

Comments
 (0)