Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
views.c
Go to the documentation of this file.
1/*
2 This file is part of the Ansel project.
3 Copyright (C) 2023 Alynx Zhou.
4 Copyright (C) 2023, 2025 Aurélien PIERRE.
5 Copyright (C) 2023 Luca Zulberti.
6 Copyright (C) 2026 Guillaume Stutin.
7
8 Ansel is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
12
13 Ansel is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with Ansel. If not, see <http://www.gnu.org/licenses/>.
20*/
21
22#include "control/control.h"
23
24#include "gui/actions/menu.h"
25
26
27gboolean views_active_callback(GtkWidget *menu_item)
28{
29 // The insensitive view is the one whose name matches the menu item label
31 const char *current_label = get_custom_data(menu_item);
32 return !g_strcmp0(current_label, current_view->module_name);
33}
34
36{
37 // The insensitive view is the one whose name matches the menu item label
39 const char *current_label = get_custom_data(menu_item);
40 return g_strcmp0(current_label, current_view->module_name);
41}
42
43#define MACRO_VIEW(view) \
44 static gboolean view_switch_to_##view(GtkAccelGroup *group, GObject *acceleratable, guint keyval, \
45 GdkModifierType mods, GtkWidget *widget) \
46 { \
47 if(views_sensitive_callback(widget)) \
48 dt_ctl_switch_mode_to(#view); \
49 return TRUE; \
50}
51
52MACRO_VIEW(lighttable);
53MACRO_VIEW(darkroom);
55MACRO_VIEW(slideshow);
57MACRO_VIEW(studio_capture);
58
59
60void append_views(GtkWidget **menus, GList **lists, const dt_menus_t index)
61{
62 for(GList *view_iter = dt_view_manager_get_global()->views; view_iter; view_iter = g_list_next(view_iter))
63 {
64 dt_view_t *view = (dt_view_t *)view_iter->data;
65 if(view->flags() & VIEW_FLAGS_HIDDEN) continue;
66
67 void *callback = NULL;
68 if(!g_strcmp0(view->module_name, "lighttable"))
70 else if(!g_strcmp0(view->module_name, "darkroom"))
71 callback = view_switch_to_darkroom;
72 else if(!g_strcmp0(view->module_name, "print"))
73 callback = view_switch_to_print;
74 else if(!g_strcmp0(view->module_name, "slideshow"))
75 callback = view_switch_to_slideshow;
76 else if(!g_strcmp0(view->module_name, "map"))
77 callback = view_switch_to_map;
78 else if(!g_strcmp0(view->module_name, "studio_capture"))
80
81 guint key = 0;
82 if(!g_strcmp0(view->module_name, "lighttable"))
83 key = GDK_KEY_Escape;
84 else if(!g_strcmp0(view->module_name, "darkroom"))
85 key = GDK_KEY_Return;
86 else if(!g_strcmp0(view->module_name, "print"))
87 key = 0;
88 else if(!g_strcmp0(view->module_name, "slideshow"))
89 key = 0;
90 else if(!g_strcmp0(view->module_name, "map"))
91 key = 0;
92 else if(!g_strcmp0(view->module_name, "studio_capture"))
93 key = 0;
94
95 add_no_accel_sub_menu_entry(menus, lists, view->name(view), index, view->module_name, callback,
97
98 // Darkroom is not handled in global menu since it needs to be opened with an image ID,
99 // so we only handle it from filmstrip and lighttable thumbnails.
100 // Map and Print are too niche to bother.
101 }
102}
103
104/* TODO ?
105* The current logic is to execute state callbacks (active, sensisitive, check) on each menu activation,
106* in the menu.h:update_menu_entries() function.
107* This is inexpensive as long as there are not too many items.
108* The other approach is to connect menu.h:update_entry() to signals, e.g.
109
110 DT_DEBUG_CONTROL_SIGNAL_CONNECT(dt_control_signal_get_global(), DT_SIGNAL_VIEWMANAGER_VIEW_CHANGED,
111 G_CALLBACK(update_entry), self);
112 DT_DEBUG_CONTROL_SIGNAL_CONNECT(dt_control_signal_get_global(), DT_SIGNAL_VIEWMANAGER_VIEW_CANNOT_CHANGE,
113 G_CALLBACK(_lib_viewswitcher_view_cannot_change_callback), self);
114
115 DT_DEBUG_CONTROL_SIGNAL_DISCONNECT(dt_control_signal_get_global(), G_CALLBACK(update_entry), self);
116 DT_DEBUG_CONTROL_SIGNAL_DISCONNECT(dt_control_signal_get_global(), G_CALLBACK(_lib_viewswitcher_view_cannot_change_callback), self);
117*
118* So the update happens as soon as the signal is emited, only for the relevant menuitems.
119*
120* To re-evaluate in the future...
121*/
const char ** views(dt_lib_module_t *self)
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
Definition colorspaces.h:98
struct dt_view_manager_t * dt_view_manager_get_global(void)
Definition darktable.c:599
GtkWidget * view
the tree view
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:576
void * get_custom_data(GtkWidget *widget)
Definition menu.c:635
dt_menus_t
Definition menu.h:42
char * key
GModule *void * data
Definition view.h:159
char module_name[64]
Definition view.h:155
const dt_view_t * dt_view_manager_get_current_view(dt_view_manager_t *vm)
Definition view.c:139
@ VIEW_FLAGS_HIDDEN
Definition view.h:89
void append_views(GtkWidget **menus, GList **lists, const dt_menus_t index)
Definition views.c:60
#define MACRO_VIEW(view)
Definition views.c:43
gboolean views_sensitive_callback(GtkWidget *menu_item)
Definition views.c:35
static gboolean view_switch_to_map(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, GtkWidget *widget)
Definition views.c:56
gboolean views_active_callback(GtkWidget *menu_item)
Definition views.c:27
static gboolean view_switch_to_darkroom(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, GtkWidget *widget)
Definition views.c:53
static gboolean view_switch_to_studio_capture(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, GtkWidget *widget)
Definition views.c:57
static gboolean view_switch_to_print(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, GtkWidget *widget)
Definition views.c:54
static gboolean view_switch_to_slideshow(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, GtkWidget *widget)
Definition views.c:55
static gboolean view_switch_to_lighttable(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, GtkWidget *widget)
Definition views.c:52