Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
module_toolbox.c
Go to the documentation of this file.
1/*
2 This file is part of darktable,
3 Copyright (C) 2011 Henrik Andersson.
4 Copyright (C) 2012 Richard Wonka.
5 Copyright (C) 2012, 2014, 2016-2017 Tobias Ellinghaus.
6 Copyright (C) 2014-2016 Roman Lebedev.
7 Copyright (C) 2015 Jérémy Rosen.
8 Copyright (C) 2019, 2023, 2025 Aurélien PIERRE.
9 Copyright (C) 2020-2021 Pascal Obry.
10 Copyright (C) 2021 Ralf Brown.
11 Copyright (C) 2022 Martin Bařinka.
12
13 darktable is free software: you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation, either version 3 of the License, or
16 (at your option) any later version.
17
18 darktable is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with darktable. If not, see <http://www.gnu.org/licenses/>.
25*/
26
27#include "common/darktable.h"
28#include "control/signal.h"
29#include "dtgtk/button.h"
30#include "gui/gtk.h"
31#include "libs/lib.h"
32#include "libs/lib_api.h"
33
34DT_MODULE(1)
35
36/* proxy function, to add a widget to toolbox */
38
39
46
52
53const char *name(struct dt_lib_module_t *self)
54{
55 return _("module toolbox");
56}
57
58const char **views(dt_lib_module_t *self)
59{
60 static const char *v[] = {"darkroom", NULL};
61 return v;
62}
63
68
70{
71 return 0;
72}
73
75{
76 return 100;
77}
78
79
81{
82 /* initialize ui widgets */
84 self->data = (void *)d;
85
86 /* the toolbar container: use a flow box so children wrap to new lines when
87 * there are more buttons than fit in one row. */
88 d->container = self->widget = gtk_flow_box_new();
89 /* set a small spacing and a style class so we can target it in CSS */
90 gtk_flow_box_set_column_spacing(GTK_FLOW_BOX(d->container), DT_GUI_BOX_SPACING);
91 gtk_flow_box_set_row_spacing(GTK_FLOW_BOX(d->container), DT_GUI_BOX_SPACING);
92 /* allow children to keep their natural widths (don't force uniform cells) */
93 gtk_flow_box_set_homogeneous(GTK_FLOW_BOX(d->container), FALSE);
94 gtk_flow_box_set_max_children_per_line(GTK_FLOW_BOX(d->container), 20);
95
96 gtk_style_context_add_class(gtk_widget_get_style_context(d->container), "dt-module-toolbox");
97
98 /* setup proxy */
101}
102
104{
105 if(IS_NULL_PTR(self->data)) return;
107 g_list_free_full(d->child_views, dt_free_gpointer);
108 d->child_views = NULL;
109 dt_free(self->data);
110}
111
112void view_enter(struct dt_lib_module_t *self,struct dt_view_t *old_view,struct dt_view_t *new_view)
113{
115 dt_view_type_flags_t nv= new_view->view(new_view);
116 for(const GList *child_elt = d->child_views; child_elt; child_elt = g_list_next(child_elt))
117 {
118 child_data_t* child_data = (child_data_t*)child_elt->data;
119 if(child_data->views & nv)
120 {
121 gtk_widget_show_all(GTK_WIDGET(child_data->child));
122 }
123 else
124 {
125 gtk_widget_hide(GTK_WIDGET(child_data->child));
126 }
127 }
128}
129
131{
133 /* If caller set a priority flag on the widget, insert it first and add a
134 * separator after it. This is used to place the autoset button first. */
135 gpointer prio = g_object_get_data(G_OBJECT(widget), "dt-toolbox-priority");
136 if(prio && GPOINTER_TO_INT(prio) == 1)
137 {
138 /* insert widget at position 0 */
139 /* mark widget for css styling and insert at the first position */
140 gtk_style_context_add_class(gtk_widget_get_style_context(GTK_WIDGET(widget)), "dt-module-toolbox-item");
141 gtk_style_context_add_class(gtk_widget_get_style_context(GTK_WIDGET(widget)), "dt-toolbox-priority");
142 gtk_widget_set_hexpand(GTK_WIDGET(widget), FALSE);
143 gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_CENTER);
144 gtk_flow_box_insert(GTK_FLOW_BOX(d->container), GTK_WIDGET(widget), 0);
145
146 /* register both in child_views so view visibility logic applies */
147 child_data_t *child_data = malloc(sizeof(child_data_t));
148 child_data->child = widget;
149 child_data->views = views;
150 d->child_views = g_list_prepend(d->child_views, child_data);
151
152 gtk_widget_show_all(d->container);
153 return;
154 }
155
156 /* Add widget to flow container so it participates in wrapping. */
157 gtk_style_context_add_class(gtk_widget_get_style_context(GTK_WIDGET(widget)), "dt-module-toolbox-item");
158 gtk_widget_set_hexpand(GTK_WIDGET(widget), FALSE);
159 gtk_widget_set_halign(GTK_WIDGET(widget), GTK_ALIGN_CENTER);
160 gtk_container_add(GTK_CONTAINER(d->container), GTK_WIDGET(widget));
161 gtk_widget_show_all(d->container);
162
163 child_data_t *child_data = malloc(sizeof(child_data_t));
164 child_data->child = widget;
165 child_data->views = views;
166 d->child_views = g_list_prepend(d->child_views, child_data);
167
168}
169// clang-format off
170// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
171// vim: shiftwidth=2 expandtab tabstop=2 cindent
172// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
173// clang-format on
#define FALSE
Definition ashift_lsd.c:158
char * name
darktable_t darktable
Definition darktable.c:181
#define DT_MODULE(MODVER)
Definition darktable.h:140
static void dt_free_gpointer(gpointer ptr)
Definition darktable.h:463
#define dt_free(ptr)
Definition darktable.h:456
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
Definition darktable.h:281
#define DT_GUI_BOX_SPACING
Definition gtk.h:109
const float v
static void _lib_module_toolbox_add(dt_lib_module_t *self, GtkWidget *widget, dt_view_type_flags_t views)
void gui_cleanup(dt_lib_module_t *self)
uint32_t container(dt_lib_module_t *self)
void gui_init(dt_lib_module_t *self)
void view_enter(struct dt_lib_module_t *self, struct dt_view_t *old_view, struct dt_view_t *new_view)
int position()
const char ** views(dt_lib_module_t *self)
int expandable(dt_lib_module_t *self)
struct _GtkWidget GtkWidget
Definition splash.h:29
dt_view_type_flags_t views
GtkWidget * child
struct dt_view_manager_t * view_manager
Definition darktable.h:772
GModule *void * data
Definition lib.h:80
GtkWidget * widget
Definition lib.h:84
struct dt_view_manager_t::@67 proxy
struct dt_view_manager_t::@67::@68 module_toolbox
struct dt_lib_module_t *void(* add)(struct dt_lib_module_t *, GtkWidget *, dt_view_type_flags_t)
Definition view.h:231
dt_view_type_flags_t
Definition view.h:76
@ DT_UI_CONTAINER_PANEL_LEFT_BOTTOM