Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
menu.h
Go to the documentation of this file.
1/*
2 This file is part of the Ansel project.
3 Copyright (C) 2023, 2025 Aurélien PIERRE.
4 Copyright (C) 2023 Luca Zulberti.
5 Copyright (C) 2026 Guillaume Stutin.
6
7 Ansel is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 Ansel is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with Ansel. If not, see <http://www.gnu.org/licenses/>.
19*/
20#include <gtk/gtk.h>
21#include <glib.h>
22
23#ifdef GDK_WINDOWING_QUARTZ
24#include "osx/osx.h"
25#endif
26
27#pragma once
28
35
40
54
62
63
64typedef struct dt_menu_entry_t
65{
66 GtkWidget *widget; // Bounding box for the whole menu item
67 gboolean has_checkbox; // Show or hide the checkbox, aka "is the current action setting a boolean ?"
68 gboolean (*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data); // Callback to run when the menu item is clicked, aka the action
69 gboolean (*sensitive_callback)(GtkWidget *widget); // Callback checking some conditions to decide whether the menu item should be made insensitive in current context
70 gboolean (*checked_callback)(GtkWidget *widget); // Callback checking some conditions to determine if the boolean pref set by the item is currently TRUE or FALSE
71 gboolean (*active_callback)(GtkWidget *widget); // Callback checking some conditions to determine if the menu item is the current view
72 dt_menus_t menu; // Index of first-level menu
74 GtkAccelGroup *accel_group;
76
77
90dt_menu_entry_t *set_menu_entry(GtkWidget **menus, GList **items_list, const gchar *label, dt_menus_t menu_index,
91 GtkMenu *parent, void *data,
92 gboolean (*action_callback)(GtkAccelGroup *group, GObject *acceleratable,
93 guint keyval, GdkModifierType mods, gpointer user_data),
94 gboolean (*checked_callback)(GtkWidget *widget),
95 gboolean (*active_callback)(GtkWidget *widget),
96 gboolean (*sensitive_callback)(GtkWidget *widget), guint key_val,
97 GdkModifierType mods, GtkAccelGroup *accel_group);
98
99void update_entry(dt_menu_entry_t *entry);
100void update_menu_entries(GtkWidget *widget, gpointer user_data);
101
102// Use for first-level entries in any menubar
103void add_generic_top_menu_entry(GtkWidget *menu_bar, GtkWidget **menus, GList **lists, const dt_menus_t index,
104 gchar *label, GtkAccelGroup *accel_group, const char *accel_path_prefix);
105
106
107// Use for first-level entries in the global menubar
108void add_top_menu_entry(GtkWidget *menu_bar, GtkWidget **menus, GList **lists, const dt_menus_t index,
109 gchar *label);
110
111// Special submenus entries that only open a sub-submenu
112void add_generic_top_submenu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index,
113 GtkAccelGroup *accel_group);
114
115// Global menu only
116void add_top_submenu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index);
117void add_generic_top_submenu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index,
118 GtkAccelGroup *accel_group);
119
120void add_generic_sub_menu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index,
121 void *data,
122 gboolean (*action_callback)(GtkAccelGroup *group, GObject *acceleratable,
123 guint keyval, GdkModifierType mods, gpointer user_data),
124 gboolean (*checked_callback)(GtkWidget *widget),
125 gboolean (*active_callback)(GtkWidget *widget),
126 gboolean (*sensitive_callback)(GtkWidget *widget), guint key_val,
127 GdkModifierType mods, GtkAccelGroup *accel_group);
128
129void add_sub_menu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index, void *data,
130 gboolean (*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval,
131 GdkModifierType mods, gpointer user_data),
132 gboolean (*checked_callback)(GtkWidget *widget),
133 gboolean (*active_callback)(GtkWidget *widget),
134 gboolean (*sensitive_callback)(GtkWidget *widget), guint key_val, GdkModifierType mods);
135
136void add_generic_sub_sub_menu_entry(GtkWidget **menus, GtkWidget *parent, GList **lists, const gchar *label,
137 const dt_menus_t index, void *data,
138 gboolean (*action_callback)(GtkAccelGroup *group, GObject *acceleratable,
139 guint keyval, GdkModifierType mods,
140 gpointer user_data),
141 gboolean (*checked_callback)(GtkWidget *widget),
142 gboolean (*active_callback)(GtkWidget *widget),
143 gboolean (*sensitive_callback)(GtkWidget *widget), guint key_val,
144 GdkModifierType mods, GtkAccelGroup *accel_group);
145
146// add a submenu entry without a real accel, for when the key shortcut is handled in key_pressed event.
147void add_no_accel_sub_menu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index,
148 void *data,
149 gboolean (*action_callback)(GtkAccelGroup *group, GObject *acceleratable,
150 guint keyval, GdkModifierType mods, gpointer user_data),
151 gboolean (*checked_callback)(GtkWidget *widget),
152 gboolean (*active_callback)(GtkWidget *widget),
153 gboolean (*sensitive_callback)(GtkWidget *widget), guint key_val,
154 GdkModifierType mods);
155
156void add_sub_sub_menu_entry(GtkWidget **menus, GtkWidget *parent, GList **lists, const gchar *label,
157 const dt_menus_t index, void *data,
158 gboolean (*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval,
159 GdkModifierType mods, gpointer user_data),
160 gboolean (*checked_callback)(GtkWidget *widget),
161 gboolean (*active_callback)(GtkWidget *widget),
162 gboolean (*sensitive_callback)(GtkWidget *widget), guint key_val,
163 GdkModifierType mods);
164
165// We don't go further than 3 levels of menus. This is not a Dassault Systems software.
166
167void add_menu_separator(GtkWidget *menu);
168
170
171void *get_custom_data(GtkWidget *widget);
172
173GtkWidget *get_last_widget(GList **list);
174
175gboolean has_selection();
176gboolean has_active_images();
177gboolean _is_lighttable();
179
180
181void append_display(GtkWidget **menus, GList **lists, const dt_menus_t index);
182void append_edit(GtkWidget **menus, GList **lists, const dt_menus_t index);
183void append_file(GtkWidget **menus, GList **lists, const dt_menus_t index);
184void append_help(GtkWidget **menus, GList **lists, const dt_menus_t index);
185void append_image(GtkWidget **menus, GList **lists, const dt_menus_t index);
186void append_run(GtkWidget **menus, GList **lists, const dt_menus_t index);
187void append_select(GtkWidget **menus, GList **lists, const dt_menus_t index);
188void append_styles(GtkWidget **menus, GList **lists, const dt_menus_t index);
189void append_views(GtkWidget **menus, GList **lists, const dt_menus_t index);
190
191GtkWidget *ctx_gtk_menu_item_new_with_icon(const char *label, GtkWidget *menu,
192 void (*activate_callback)(GtkWidget *widget, gpointer user_data),
193 gpointer user_data, dt_menu_icon_t icon);
194GtkWidget *ctx_gtk_menu_item_new_with_icon_and_shortcut(const char *label, const char *shortcut,
195 GtkWidget *menu,
196 void (*activate_callback)(GtkWidget *widget, gpointer user_data),
197 gpointer user_data, dt_menu_icon_t icon);
199 void (*activate_callback)(GtkWidget *widget, gpointer user_data),
200 gpointer user_data);
201GtkWidget *ctx_gtk_menu_item_new_with_markup_and_shortcut(const char *label, const char *shortcut,
202 GtkWidget *menu,
203 void (*activate_callback)(GtkWidget *widget, gpointer user_data),
204 gpointer user_data);
205GtkWidget *ctx_gtk_menu_item_new_with_markup_and_pixbuf(const char *label, GdkPixbuf *icon,
206 GtkWidget *menu,
207 void (*activate_callback)(GtkWidget *widget, gpointer user_data),
208 gpointer user_data);
210 GtkWidget *menu,
211 void (*activate_callback)(GtkWidget *widget, gpointer user_data),
212 gpointer user_data,
213 const gboolean checked,
214 const gboolean show_checkbox);
215GtkWidget *ctx_gtk_check_menu_item_new_with_markup_and_pixbuf(const char *label, GdkPixbuf *icon,
216 GtkWidget *menu,
217 void (*activate_callback)(GtkWidget *widget, gpointer user_data),
218 gpointer user_data,
219 const gboolean checked,
220 const gboolean show_checkbox);
221
222gboolean dt_menu_is_image_in_dev(GList *imgs);
223struct dt_develop_t;
224void dt_menu_apply_dev_history_update(struct dt_develop_t *dev, const gboolean history_inited);
225
226// Helper to wrap (*void)(void) functions into GtkAccel compatible callbacks
227#define MAKE_ACCEL_WRAPPER(cb) \
228static gboolean \
229cb##__accel (GtkAccelGroup *group, \
230 GObject *acceleratable, \
231 guint keyval, \
232 GdkModifierType mods, \
233 gpointer user_data) \
234{ \
235 cb(); \
236 return TRUE; \
237}
238
239#define GET_ACCEL_WRAPPER(cb) cb##__accel
gboolean has_active_image_in_lighttable()
Definition menu.c:646
GtkWidget * ctx_gtk_menu_item_new_with_icon_and_shortcut(const char *label, const char *shortcut, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, gpointer user_data), gpointer user_data, dt_menu_icon_t icon)
Definition menu.c:124
gboolean has_selection()
Definition menu.c:623
void append_views(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition views.c:63
void dt_menu_apply_dev_history_update(struct dt_develop_t *dev, const gboolean history_inited)
Definition menu.c:659
void append_select(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition select.c:69
void append_display(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition display.c:432
void add_sub_sub_menu_entry(GtkWidget **menus, GtkWidget *parent, GList **lists, const gchar *label, const dt_menus_t index, void *data, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gboolean(*checked_callback)(GtkWidget *widget), gboolean(*active_callback)(GtkWidget *widget), gboolean(*sensitive_callback)(GtkWidget *widget), guint key_val, GdkModifierType mods)
Definition menu.c:577
dt_menu_entry_style_t
Definition menu.h:56
@ DT_MENU_ENTRY_LAST
Definition menu.h:60
@ DT_MENU_ENTRY_CHECKBUTTON
Definition menu.h:58
@ DT_MENU_ENTRY_DEFAULT
Definition menu.h:57
@ DT_MENU_ENTRY_RADIOBUTTON
Definition menu.h:59
dt_menu_icon_t
Definition menu.h:30
@ DT_MENU_ICON_CIRCLE
Definition menu.h:32
@ DT_MENU_ICON_NONE
Definition menu.h:31
@ DT_MENU_ICON_SQUARE
Definition menu.h:33
void add_no_accel_sub_menu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index, void *data, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gboolean(*checked_callback)(GtkWidget *widget), gboolean(*active_callback)(GtkWidget *widget), gboolean(*sensitive_callback)(GtkWidget *widget), guint key_val, GdkModifierType mods)
Definition menu.c:546
void append_help(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition help.c:220
void add_top_menu_entry(GtkWidget *menu_bar, GtkWidget **menus, GList **lists, const dt_menus_t index, gchar *label)
Definition menu.c:479
void append_image(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition gui/actions/image.c:200
gboolean _is_lighttable()
Definition menu.c:634
gboolean dt_menu_is_image_in_dev(GList *imgs)
Definition menu.c:653
GtkWidget * ctx_gtk_menu_item_new_with_markup(const char *label, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, gpointer user_data), gpointer user_data)
Definition menu.c:167
void append_run(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition run.c:124
void add_generic_sub_menu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index, void *data, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gboolean(*checked_callback)(GtkWidget *widget), gboolean(*active_callback)(GtkWidget *widget), gboolean(*sensitive_callback)(GtkWidget *widget), guint key_val, GdkModifierType mods, GtkAccelGroup *accel_group)
Definition menu.c:514
void add_generic_sub_sub_menu_entry(GtkWidget **menus, GtkWidget *parent, GList **lists, const gchar *label, const dt_menus_t index, void *data, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gboolean(*checked_callback)(GtkWidget *widget), gboolean(*active_callback)(GtkWidget *widget), gboolean(*sensitive_callback)(GtkWidget *widget), guint key_val, GdkModifierType mods, GtkAccelGroup *accel_group)
Definition menu.c:559
GtkWidget * ctx_gtk_check_menu_item_new_with_markup_and_pixbuf(const char *label, GdkPixbuf *icon, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, gpointer user_data), gpointer user_data, const gboolean checked, const gboolean show_checkbox)
Definition menu.c:277
GtkWidget * ctx_gtk_check_menu_item_new_with_markup(const char *label, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, gpointer user_data), gpointer user_data, const gboolean checked, const gboolean show_checkbox)
Definition menu.c:238
void append_styles(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition gui/actions/styles.c:264
void update_menu_entries(GtkWidget *widget, gpointer user_data)
Definition menu.c:434
dt_menu_entry_t * set_menu_entry(GtkWidget **menus, GList **items_list, const gchar *label, dt_menus_t menu_index, GtkMenu *parent, void *data, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gboolean(*checked_callback)(GtkWidget *widget), gboolean(*active_callback)(GtkWidget *widget), gboolean(*sensitive_callback)(GtkWidget *widget), guint key_val, GdkModifierType mods, GtkAccelGroup *accel_group)
Definition menu.c:324
void append_edit(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition edit.c:441
GtkWidget * get_last_widget(GList **list)
Definition menu.c:611
void add_sub_menu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index, void *data, gboolean(*action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data), gboolean(*checked_callback)(GtkWidget *widget), gboolean(*active_callback)(GtkWidget *widget), gboolean(*sensitive_callback)(GtkWidget *widget), guint key_val, GdkModifierType mods)
Definition menu.c:535
void add_sub_menu_separator(GtkWidget *parent)
Definition menu.c:598
void * get_custom_data(GtkWidget *widget)
Definition menu.c:605
GtkWidget * ctx_gtk_menu_item_new_with_icon(const char *label, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, gpointer user_data), gpointer user_data, dt_menu_icon_t icon)
Definition menu.c:94
void add_generic_top_menu_entry(GtkWidget *menu_bar, GtkWidget **menus, GList **lists, const dt_menus_t index, gchar *label, GtkAccelGroup *accel_group, const char *accel_path_prefix)
Definition menu.c:453
GtkWidget * ctx_gtk_menu_item_new_with_markup_and_pixbuf(const char *label, GdkPixbuf *icon, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, gpointer user_data), gpointer user_data)
Definition menu.c:212
void add_top_submenu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index)
Definition menu.c:508
void add_menu_separator(GtkWidget *menu)
Definition menu.c:591
void append_file(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition file.c:211
void add_generic_top_submenu_entry(GtkWidget **menus, GList **lists, const gchar *label, const dt_menus_t index, GtkAccelGroup *accel_group)
Definition menu.c:486
dt_menus_t
Definition menu.h:42
@ DT_MENU_IMAGE
Definition menu.h:46
@ DT_MENU_FILE
Definition menu.h:43
@ DT_MENU_STYLES
Definition menu.h:47
@ DT_MENU_EDIT
Definition menu.h:44
@ DT_MENU_DISPLAY
Definition menu.h:49
@ DT_MENU_SELECTION
Definition menu.h:45
@ DT_MENU_LAST
Definition menu.h:52
@ DT_MENU_ATELIERS
Definition menu.h:50
@ DT_MENU_HELP
Definition menu.h:51
@ DT_MENU_RUN
Definition menu.h:48
GtkWidget * ctx_gtk_menu_item_new_with_markup_and_shortcut(const char *label, const char *shortcut, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, gpointer user_data), gpointer user_data)
Definition menu.c:182
void update_entry(dt_menu_entry_t *entry)
Definition menu.c:410
gboolean has_active_images()
Definition menu.c:629
struct _GtkWidget GtkWidget
Definition splash.h:29
Definition develop.h:155
float y
Definition develop.h:181
Definition menu.h:65
GtkAccelGroup * accel_group
Definition menu.h:74
gboolean has_checkbox
Definition menu.h:67
dt_menu_entry_style_t style
Definition menu.h:73
gboolean(* sensitive_callback)(GtkWidget *widget)
Definition menu.h:69
dt_menus_t menu
Definition menu.h:72
gboolean(* checked_callback)(GtkWidget *widget)
Definition menu.h:70
gboolean(* action_callback)(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
Definition menu.h:68
gboolean(* active_callback)(GtkWidget *widget)
Definition menu.h:71
GtkWidget * widget
Definition menu.h:66
Definition menu.h:37
dt_menu_icon_t shape
Definition menu.h:38