Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions data/themes/darktable.css
Original file line number Diff line number Diff line change
Expand Up @@ -911,6 +911,22 @@ menuitem label,
margin: 0;
}

/*------------------------------------------------
- Popup menu -
----------------------------------------------*/
popover.menu {
padding: 0;
}

popover.menu modelbutton {
padding: 0.1em 0.5em;
}

popover.menu modelbutton:hover {
background-color: @selected_bg_color;
}


tooltip,
#range-current
{
Expand Down Expand Up @@ -949,6 +965,23 @@ combobox separator
min-height: 0.07em;
}

/*------------------------------------------------
- Popup menu -
----------------------------------------------*/
popover.menu {
padding: 0;
}

popover.menu modelbutton {
padding: 0.1em 0.5em;
}

popover.menu modelbutton:hover,
popover.menu modelbutton:hover * {
background-color: @selected_bg_color;
}


/*----------------------
- GTK Notebooks tabs -
----------------------*/
Expand Down
80 changes: 80 additions & 0 deletions src/common/presets.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
#include "develop/imageop.h"
#include "libs/lib.h"

#include <glib-2.0/gio/gmenu.h>
#include <glib-2.0/gio/gmenumodel.h>
#include <libxml/encoding.h>
#include <libxml/xmlwriter.h>
#include <libxml/parser.h>
Expand Down Expand Up @@ -548,6 +550,84 @@ GtkWidget *dt_insert_preset_in_menu_hierarchy(const char *name,
return mi;
}

static void _menu_shell_insert_sorted2(GMenu *menu,
GMenuItem *item,
const gchar *name)
{
GMenuModel *model = G_MENU_MODEL(menu);

int num = g_menu_model_get_n_items(model);
gboolean found = FALSE;
int i;
for(i = 0; i < num; i++)
{
gchar *item_label = NULL;
GVariant *attr = g_menu_model_get_item_attribute_value(model, i, "label", G_VARIANT_TYPE_STRING);
if(attr)
{
item_label = g_variant_dup_string(attr, NULL);
g_variant_unref(attr);
if(g_utf8_collate(item_label, name) > 0) found = TRUE;
g_free(item_label);
if(found) break;
}
}

g_menu_insert_item(menu, i, item);
}

void dt_insert_preset_in_menu_hierarchy2(const char *name,
const char *action,
GSList **menu_path,
GMenu *mainmenu,
GMenu **submenu,
gchar ***prev_split,
gboolean isdefault)
{
gchar *local_name = dt_util_localize_segmented_name(name, FALSE);
gchar **split = g_strsplit(local_name, "|", -1);
gchar **s = split;
gchar **p = *prev_split;
GSList *mpath = *menu_path;
GMenuItem *mi;
g_free(local_name);

for(; p && *(p+1) && *(s+1) && !g_strcmp0(*s, *p); p++, s++)
;

for(; p && *(p+1); p++)
{
mpath = g_slist_delete_link(mpath, mpath); // pop
*submenu = mpath ? mpath->data : mainmenu;
}

for(; *(s+1); s++)
{
GMenu *sm = g_menu_new();
GMenuItem *smi = g_menu_item_new_submenu(*s, G_MENU_MODEL(sm));
_menu_shell_insert_sorted2(*submenu, smi, *s);
*submenu = sm;
mpath = g_slist_prepend(mpath, sm); // push
}

*menu_path = mpath;
g_strfreev(*prev_split);
*prev_split = split;

if(isdefault)
{
gchar *label = g_strdup_printf("%s %s", *s, _("(default)"));
mi = g_menu_item_new(label, action);
_menu_shell_insert_sorted2(*submenu, mi, label);
g_free(label);
}
else
{
mi = g_menu_item_new(*s, action);
_menu_shell_insert_sorted2(*submenu, mi, *s);
}
}

// clang-format off
// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
// vim: shiftwidth=2 expandtab tabstop=2 cindent
Expand Down
8 changes: 8 additions & 0 deletions src/common/presets.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,14 @@ GtkWidget *dt_insert_preset_in_menu_hierarchy(const char *name,
gboolean isdefault,
gboolean writeprotect);

void dt_insert_preset_in_menu_hierarchy2(const char *name,
const char *action,
GSList **menu_path2,
GMenu *mainmenu2,
GMenu **submenu2,
gchar ***prev_split,
gboolean isdefault);

// clang-format off
// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
// vim: shiftwidth=2 expandtab tabstop=2 cindent
Expand Down
16 changes: 16 additions & 0 deletions src/gui/gtk.c
Original file line number Diff line number Diff line change
Expand Up @@ -5072,6 +5072,22 @@ void dt_gui_dialog_restore_size(GtkDialog *dialog, const char *conf)
g_signal_connect(dialog, "configure-event", G_CALLBACK(_resize_dialog), (gpointer)conf);
}

GtkWidget *dt_gui_popover_menu_from_model(GtkWidget *parent, GMenu *menu)
{
GtkWidget *popover_menu;

#if GTK_CHECK_VERSION(4, 0, 0)
popover_menu = gtk_popover_menu_new_from_model_full(G_MENU_MODEL(menu),
GTK_POPOVER_MENU_NESTED);
gtk_widget_set_parent(popover_menu, parent);
#else
popover_menu = gtk_popover_new_from_model(parent, G_MENU_MODEL(menu));
#endif

return popover_menu;
}


// clang-format off
// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
// vim: shiftwidth=2 expandtab tabstop=2 cindent
Expand Down
3 changes: 3 additions & 0 deletions src/gui/gtk.h
Original file line number Diff line number Diff line change
Expand Up @@ -659,6 +659,9 @@ void dt_gui_dialog_restore_size(GtkDialog *dialog,

// returns the session type at runtime
dt_gui_session_type_t dt_gui_get_session_type(void);
// Popover menu
GtkWidget *dt_gui_popover_menu_from_model(GtkWidget *parent, GMenu *menu);


#if !defined(__cplusplus)
#undef G_CALLBACK
Expand Down
Loading