From 37a0de03a12c4b327b7015ab80eeba79941dfc80 Mon Sep 17 00:00:00 2001 From: Mario Zimmermann Date: Fri, 21 Feb 2025 13:53:09 +0100 Subject: [PATCH 1/6] add module preset label to module header --- .../themes/darktable-elegant-highcontrast.css | 2 +- data/themes/darktable-icons-highcontrast.css | 2 +- data/themes/darktable.css | 3 ++- src/libs/lib.c | 19 +++++++++++++++++-- src/libs/lib.h | 1 + 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/data/themes/darktable-elegant-highcontrast.css b/data/themes/darktable-elegant-highcontrast.css index 5443ce2824e2..602b60a62a6f 100644 --- a/data/themes/darktable-elegant-highcontrast.css +++ b/data/themes/darktable-elegant-highcontrast.css @@ -56,5 +56,5 @@ @define-color graph_fg_active @grey_100; @define-color graph_grid @grey_00; -#iop-panel-label, #lib-panel-label, #iop-module-name { color: @fg_color; } +#iop-panel-label, #lib-panel-label, #iop-module-name, #lib-module-name { color: @fg_color; } #module-header .toggle:checked { color: @fg_color; } diff --git a/data/themes/darktable-icons-highcontrast.css b/data/themes/darktable-icons-highcontrast.css index 5443ce2824e2..602b60a62a6f 100644 --- a/data/themes/darktable-icons-highcontrast.css +++ b/data/themes/darktable-icons-highcontrast.css @@ -56,5 +56,5 @@ @define-color graph_fg_active @grey_100; @define-color graph_grid @grey_00; -#iop-panel-label, #lib-panel-label, #iop-module-name { color: @fg_color; } +#iop-panel-label, #lib-panel-label, #iop-module-name, #lib-module-name { color: @fg_color; } #module-header .toggle:checked { color: @fg_color; } diff --git a/data/themes/darktable.css b/data/themes/darktable.css index f1ab12955fe6..1f8f30b9f047 100644 --- a/data/themes/darktable.css +++ b/data/themes/darktable.css @@ -633,7 +633,8 @@ dialog .sidebar row:selected:hover label, } #snapshot-button entry, -#iop-module-name +#iop-module-name, +#lib-module-name { font-weight: lighter; font-family: sans-serif, "Arial Unicode MS"; diff --git a/src/libs/lib.c b/src/libs/lib.c index ab755edd73ed..92af25cdbdb0 100644 --- a/src/libs/lib.c +++ b/src/libs/lib.c @@ -407,8 +407,15 @@ void dt_lib_presets_update(const gchar *preset, static void _menuitem_activate_preset(GtkMenuItem *menuitem, dt_lib_module_info_t *minfo) { - dt_lib_presets_apply(g_object_get_data(G_OBJECT(menuitem), "dt-preset-name"), - minfo->plugin_name, minfo->version); + gchar *preset_name = g_object_get_data(G_OBJECT(menuitem), "dt-preset-name"); + gboolean res = dt_lib_presets_apply(preset_name, + minfo->plugin_name, minfo->version); + + if(res){ + gchar *preset_label_text = g_strdup_printf("• %s", preset_name); + gtk_label_set_text(GTK_LABEL(minfo->module->preset_label), preset_label_text); + g_free(preset_label_text); + } } static gboolean _menuitem_button_preset(GtkMenuItem *menuitem, @@ -912,6 +919,7 @@ static gboolean _lib_gui_reset_callback(GtkButton *button, { dt_lib_module_t *module = (dt_lib_module_t *)user_data; module->gui_reset(module); + gtk_label_set_text(GTK_LABEL(module->preset_label), ""); return TRUE; } @@ -1295,6 +1303,13 @@ GtkWidget *dt_lib_gui_get_expander(dt_lib_module_t *module) dt_action_define(&module->actions, NULL, NULL, label_evb, NULL); gtk_box_pack_start(GTK_BOX(header), label_evb, FALSE, FALSE, 0); + module->preset_label = gtk_label_new(NULL); + gtk_widget_set_name(module->preset_label, "lib-module-name"); + gtk_label_set_ellipsize(GTK_LABEL(module->preset_label), PANGO_ELLIPSIZE_MIDDLE); + gtk_widget_set_valign(module->preset_label, GTK_ALIGN_BASELINE); + g_object_set(G_OBJECT(module->preset_label), "xalign", 0.0, (gchar *)0); + gtk_box_pack_start(GTK_BOX(header), module->preset_label, FALSE, FALSE, 0); + /* add preset button if module has implementation */ module->presets_button = dtgtk_button_new(dtgtk_cairo_paint_presets, 0, NULL); gtk_widget_set_tooltip_text(module->presets_button, _("presets and preferences")); diff --git a/src/libs/lib.h b/src/libs/lib.h index 55367eddafb5..6e125268b71d 100644 --- a/src/libs/lib.h +++ b/src/libs/lib.h @@ -125,6 +125,7 @@ typedef struct dt_lib_module_t gboolean gui_uptodate; GtkWidget *arrow; + GtkWidget *preset_label; GtkWidget *reset_button; GtkWidget *presets_button; From a0fd606cce616881ad0b74ec6158623ac8672bec Mon Sep 17 00:00:00 2001 From: Mario Zimmermann Date: Sat, 22 Feb 2025 20:08:45 +0100 Subject: [PATCH 2/6] update preset_label on param change --- src/libs/filtering.c | 8 +++-- src/libs/import.c | 11 +++--- src/libs/lib.c | 80 +++++++++++++++++++++++++++++++------------- 3 files changed, 69 insertions(+), 30 deletions(-) diff --git a/src/libs/filtering.c b/src/libs/filtering.c index 1f04b5813574..91ba15aea916 100644 --- a/src/libs/filtering.c +++ b/src/libs/filtering.c @@ -19,10 +19,8 @@ #include "bauhaus/bauhaus.h" #include "common/collection.h" #include "common/darktable.h" -#include "common/metadata.h" #include "control/conf.h" #include "control/control.h" -#include "control/jobs.h" #include "dtgtk/button.h" #include "dtgtk/range.h" #include "gui/accelerators.h" @@ -2257,6 +2255,12 @@ void gui_init(dt_lib_module_t *self) DT_CONTROL_SIGNAL_HANDLE(DT_SIGNAL_IMAGES_ORDER_CHANGE, _dt_images_order_change); } +void gui_update(dt_lib_module_t *self) +{ + // Don't remove the empty function to not break the gui_update chain. + // It is needed to update the preset_label in the module header when params change. +} + void gui_cleanup(dt_lib_module_t *self) { dt_lib_filtering_t *d = self->data; diff --git a/src/libs/import.c b/src/libs/import.c index d882ff222ebb..93895a810f70 100644 --- a/src/libs/import.c +++ b/src/libs/import.c @@ -1,6 +1,6 @@ /* This file is part of darktable, - Copyright (C) 2011-2024 darktable developers. + Copyright (C) 2011-2025 darktable developers. darktable is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -16,11 +16,9 @@ along with darktable. If not, see . */ -#include "bauhaus/bauhaus.h" #include "common/collection.h" #include "common/darktable.h" #include "common/file_location.h" -#include "common/debug.h" #include "common/exif.h" #include "common/metadata.h" #include "common/datetime.h" @@ -29,7 +27,6 @@ #ifdef HAVE_GPHOTO2 #include "control/jobs/camera_jobs.h" #endif -#include "dtgtk/expander.h" #include "dtgtk/button.h" #include "gui/accelerators.h" #include "gui/gtk.h" @@ -2441,6 +2438,12 @@ void gui_init(dt_lib_module_t *self) dt_gui_update_collapsible_section(&d->cs); } +void gui_update(dt_lib_module_t *self) +{ + // Don't remove the empty function to not break the gui_update chain. + // It is needed to update the preset_label in the module header when params change. +} + void gui_cleanup(dt_lib_module_t *self) { dt_lib_import_t *d = self->data; diff --git a/src/libs/lib.c b/src/libs/lib.c index 92af25cdbdb0..59cd7ed4f408 100644 --- a/src/libs/lib.c +++ b/src/libs/lib.c @@ -25,14 +25,14 @@ #include "control/control.h" #include "dtgtk/button.h" #include "dtgtk/expander.h" -#include "dtgtk/icon.h" #include "gui/accelerators.h" #include "gui/drag_and_drop.h" #include "gui/gtk.h" #include "gui/presets.h" #include "gui/splash.h" +#include +#include #ifdef GDK_WINDOWING_QUARTZ -#include "osx/osx.h" #endif #include #include @@ -108,6 +108,33 @@ gchar *dt_lib_get_active_preset_name(dt_lib_module_info_t *minfo) return name; } +// get dt_lib_module_info_t for a module. Must be freed by free_module_info() +static dt_lib_module_info_t *_get_module_info_for_module(dt_lib_module_t *module) +{ + dt_lib_module_info_t *mi = calloc(1, sizeof(dt_lib_module_info_t)); + + mi->plugin_name = g_strdup(module->plugin_name); + mi->version = module->version(); + mi->module = module; + mi->params = module->get_params ? module->get_params(module, &mi->params_size) : NULL; + if(!mi->params) + { + // this is a valid case, for example in location.c when nothing got selected + // fprintf(stderr, "something went wrong: ¶ms=%p, size=%i\n", + // mi->params, mi->params_size); + mi->params_size = 0; + } + return mi; +} + +static void _set_module_preset_label(dt_lib_module_t *module, const gchar *preset_name) +{ + gchar *preset_label_text = (*preset_name == '\0')? g_strdup("") + : g_strdup_printf("• %s", preset_name); + gtk_label_set_text(GTK_LABEL(module->preset_label), preset_label_text); + g_free(preset_label_text); +} + static void edit_preset(const char *name_in, dt_lib_module_info_t *minfo) { @@ -241,6 +268,7 @@ static void menuitem_delete_preset(GtkMenuItem *menuitem, dt_action_rename_preset(&minfo->module->actions, name, NULL); dt_lib_presets_remove(name, minfo->plugin_name, minfo->version); + _set_module_preset_label(minfo->module, ""); DT_CONTROL_SIGNAL_RAISE(DT_SIGNAL_PRESETS_CHANGED, g_strdup(minfo->plugin_name)); @@ -360,6 +388,8 @@ gboolean dt_lib_presets_apply(const gchar *preset, dt_conf_set_string(tx, preset); g_free(tx); res = module->set_params(module, blob, length); + if(!res) + _set_module_preset_label(module, preset); break; } } @@ -407,15 +437,8 @@ void dt_lib_presets_update(const gchar *preset, static void _menuitem_activate_preset(GtkMenuItem *menuitem, dt_lib_module_info_t *minfo) { - gchar *preset_name = g_object_get_data(G_OBJECT(menuitem), "dt-preset-name"); - gboolean res = dt_lib_presets_apply(preset_name, - minfo->plugin_name, minfo->version); - - if(res){ - gchar *preset_label_text = g_strdup_printf("• %s", preset_name); - gtk_label_set_text(GTK_LABEL(minfo->module->preset_label), preset_label_text); - g_free(preset_label_text); - } + dt_lib_presets_apply(g_object_get_data(G_OBJECT(menuitem), "dt-preset-name"), + minfo->plugin_name, minfo->version); } static gboolean _menuitem_button_preset(GtkMenuItem *menuitem, @@ -876,6 +899,12 @@ void dt_lib_gui_update(dt_lib_module_t *module) module->gui_update(module); module->gui_uptodate = TRUE; } + + dt_lib_module_info_t *mi = _get_module_info_for_module(module); + gchar *active_preset_name = dt_lib_get_active_preset_name(mi); + free_module_info(NULL, mi); + _set_module_preset_label(module, active_preset_name? active_preset_name : ""); + g_free(active_preset_name); } static void dt_lib_init_module(void *m) @@ -927,19 +956,7 @@ static gboolean _presets_popup_callback(GtkButton *button, GdkEventButton *e, dt_lib_module_t *module) { - dt_lib_module_info_t *mi = calloc(1, sizeof(dt_lib_module_info_t)); - - mi->plugin_name = g_strdup(module->plugin_name); - mi->version = module->version(); - mi->module = module; - mi->params = module->get_params ? module->get_params(module, &mi->params_size) : NULL; - if(!mi->params) - { - // this is a valid case, for example in location.c when nothing got selected - // fprintf(stderr, "something went wrong: ¶ms=%p, size=%i\n", - // mi->params, mi->params_size); - mi->params_size = 0; - } + dt_lib_module_info_t *mi = _get_module_info_for_module(module); dt_lib_presets_popup_menu_show(mi, GTK_WIDGET(button)); if(button) @@ -1303,6 +1320,7 @@ GtkWidget *dt_lib_gui_get_expander(dt_lib_module_t *module) dt_action_define(&module->actions, NULL, NULL, label_evb, NULL); gtk_box_pack_start(GTK_BOX(header), label_evb, FALSE, FALSE, 0); + /* add preset label */ module->preset_label = gtk_label_new(NULL); gtk_widget_set_name(module->preset_label, "lib-module-name"); gtk_label_set_ellipsize(GTK_LABEL(module->preset_label), PANGO_ELLIPSIZE_MIDDLE); @@ -1351,6 +1369,15 @@ GtkWidget *dt_lib_gui_get_expander(dt_lib_module_t *module) dt_gui_add_class(pluginui_frame, "dt_plugin_ui"); module->expander = expander; + // get active preset and set preset_label + dt_lib_module_info_t *mi = _get_module_info_for_module(module); + gchar *preset_name = dt_lib_get_active_preset_name(mi); + if(preset_name) + { + _set_module_preset_label(mi->module, preset_name); + g_free(preset_name); + } + free_module_info(NULL, mi); return module->expander; } @@ -1629,6 +1656,11 @@ gboolean dt_lib_presets_can_autoapply(dt_lib_module_t *mod) return mod->preset_autoapply(mod); } +void dt_lib_reset_preset_label(dt_lib_module_t *mod) +{ + gtk_label_set_text(GTK_LABEL(mod->preset_label), ""); +} + static float _action_process(gpointer target, const dt_action_element_t element, const dt_action_effect_t effect, From bedefeb819d8b1090f38bb3f2e13572af63b58ed Mon Sep 17 00:00:00 2001 From: Mario Zimmermann Date: Sun, 23 Feb 2025 18:31:58 +0100 Subject: [PATCH 3/6] rename static functions with leading '_' --- src/libs/lib.c | 59 +++++++++++++++++++++++++------------------------- src/libs/lib.h | 6 +---- 2 files changed, 31 insertions(+), 34 deletions(-) diff --git a/src/libs/lib.c b/src/libs/lib.c index 59cd7ed4f408..4e7f29016c75 100644 --- a/src/libs/lib.c +++ b/src/libs/lib.c @@ -108,7 +108,7 @@ gchar *dt_lib_get_active_preset_name(dt_lib_module_info_t *minfo) return name; } -// get dt_lib_module_info_t for a module. Must be freed by free_module_info() +// get dt_lib_module_info_t for a module. Must be freed by _free_module_info() static dt_lib_module_info_t *_get_module_info_for_module(dt_lib_module_t *module) { dt_lib_module_info_t *mi = calloc(1, sizeof(dt_lib_module_info_t)); @@ -127,7 +127,8 @@ static dt_lib_module_info_t *_get_module_info_for_module(dt_lib_module_t *module return mi; } -static void _set_module_preset_label(dt_lib_module_t *module, const gchar *preset_name) +static void _set_module_preset_label(dt_lib_module_t *module, + const gchar *preset_name) { gchar *preset_label_text = (*preset_name == '\0')? g_strdup("") : g_strdup_printf("• %s", preset_name); @@ -135,8 +136,8 @@ static void _set_module_preset_label(dt_lib_module_t *module, const gchar *prese g_free(preset_label_text); } -static void edit_preset(const char *name_in, - dt_lib_module_info_t *minfo) +static void _edit_preset(const char *name_in, + dt_lib_module_info_t *minfo) { // get the original name of the preset gchar *name = NULL; @@ -175,8 +176,8 @@ static void edit_preset(const char *name_in, (name, rowid, NULL, NULL, TRUE, TRUE, FALSE, GTK_WINDOW(window)); } -static void menuitem_update_preset(GtkMenuItem *menuitem, - dt_lib_module_info_t *minfo) +static void _menuitem_update_preset(GtkMenuItem *menuitem, + dt_lib_module_info_t *minfo) { char *name = g_object_get_data(G_OBJECT(menuitem), "dt-preset-name"); @@ -208,8 +209,8 @@ static void menuitem_update_preset(GtkMenuItem *menuitem, } } -static void menuitem_new_preset(GtkMenuItem *menuitem, - dt_lib_module_info_t *minfo) +static void _menuitem_new_preset(GtkMenuItem *menuitem, + dt_lib_module_info_t *minfo) { dt_lib_presets_remove(_("new preset"), minfo->plugin_name, minfo->version); @@ -239,23 +240,23 @@ static void menuitem_new_preset(GtkMenuItem *menuitem, dt_action_define_preset(&minfo->module->actions, _("new preset")); // then show edit dialog - edit_preset(_("new preset"), minfo); + _edit_preset(_("new preset"), minfo); } -static void menuitem_edit_preset(GtkMenuItem *menuitem, - dt_lib_module_info_t *minfo) +static void _menuitem_edit_preset(GtkMenuItem *menuitem, + dt_lib_module_info_t *minfo) { - edit_preset(NULL, minfo); + _edit_preset(NULL, minfo); } -static void menuitem_manage_presets(GtkMenuItem *menuitem, - dt_lib_module_info_t *minfo) +static void _menuitem_manage_presets(GtkMenuItem *menuitem, + dt_lib_module_info_t *minfo) { if(minfo->module->manage_presets) minfo->module->manage_presets(minfo->module); } -static void menuitem_delete_preset(GtkMenuItem *menuitem, - dt_lib_module_info_t *minfo) +static void _menuitem_delete_preset(GtkMenuItem *menuitem, + dt_lib_module_info_t *minfo) { gchar *name = dt_lib_get_active_preset_name(minfo); if(name == NULL) return; @@ -452,8 +453,8 @@ static gboolean _menuitem_button_preset(GtkMenuItem *menuitem, return TRUE; } -static void free_module_info(GtkWidget *widget, - gpointer user_data) +static void _free_module_info(GtkWidget *widget, + gpointer user_data) { dt_lib_module_info_t *minfo = (dt_lib_module_info_t *)user_data; g_free(minfo->plugin_name); @@ -461,15 +462,15 @@ static void free_module_info(GtkWidget *widget, free(minfo); } -static void dt_lib_presets_popup_menu_show(dt_lib_module_info_t *minfo, - GtkWidget *w) +static void _dt_lib_presets_popup_menu_show(dt_lib_module_info_t *minfo, + GtkWidget *w) { GtkMenu *menu = GTK_MENU(gtk_menu_new()); const gboolean hide_default = dt_conf_get_bool("plugins/lighttable/hide_default_presets"); const gboolean default_first = dt_conf_get_bool("modules/default_presets_first"); - g_signal_connect(G_OBJECT(menu), "destroy", G_CALLBACK(free_module_info), minfo); + g_signal_connect(G_OBJECT(menu), "destroy", G_CALLBACK(_free_module_info), minfo); GtkWidget *mi; int active_preset = -1, cnt = 0; @@ -569,7 +570,7 @@ static void dt_lib_presets_popup_menu_show(dt_lib_module_info_t *minfo, if(minfo->module->manage_presets) { mi = gtk_menu_item_new_with_label(_("manage presets...")); - g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(menuitem_manage_presets), minfo); + g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(_menuitem_manage_presets), minfo); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); cnt++; } @@ -578,11 +579,11 @@ static void dt_lib_presets_popup_menu_show(dt_lib_module_info_t *minfo, if(!selected_writeprotect) { mi = gtk_menu_item_new_with_label(_("edit this preset..")); - g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(menuitem_edit_preset), minfo); + g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(_menuitem_edit_preset), minfo); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); mi = gtk_menu_item_new_with_label(_("delete this preset")); - g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(menuitem_delete_preset), minfo); + g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(_menuitem_delete_preset), minfo); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); cnt++; } @@ -596,7 +597,7 @@ static void dt_lib_presets_popup_menu_show(dt_lib_module_info_t *minfo, gtk_widget_set_tooltip_text(mi, _("nothing to save")); } else - g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(menuitem_new_preset), minfo); + g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(_menuitem_new_preset), minfo); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); if(darktable.gui->last_preset && found) @@ -612,7 +613,7 @@ static void dt_lib_presets_popup_menu_show(dt_lib_module_info_t *minfo, g_object_set_data_full(G_OBJECT(mi), "dt-preset-name", g_strdup(darktable.gui->last_preset), g_free); g_signal_connect(G_OBJECT(mi), "activate", - G_CALLBACK(menuitem_update_preset), minfo); + G_CALLBACK(_menuitem_update_preset), minfo); gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi); g_free(markup); } @@ -902,7 +903,7 @@ void dt_lib_gui_update(dt_lib_module_t *module) dt_lib_module_info_t *mi = _get_module_info_for_module(module); gchar *active_preset_name = dt_lib_get_active_preset_name(mi); - free_module_info(NULL, mi); + _free_module_info(NULL, mi); _set_module_preset_label(module, active_preset_name? active_preset_name : ""); g_free(active_preset_name); } @@ -957,7 +958,7 @@ static gboolean _presets_popup_callback(GtkButton *button, dt_lib_module_t *module) { dt_lib_module_info_t *mi = _get_module_info_for_module(module); - dt_lib_presets_popup_menu_show(mi, GTK_WIDGET(button)); + _dt_lib_presets_popup_menu_show(mi, GTK_WIDGET(button)); if(button) dtgtk_button_set_active(DTGTK_BUTTON(button), FALSE); @@ -1377,7 +1378,7 @@ GtkWidget *dt_lib_gui_get_expander(dt_lib_module_t *module) _set_module_preset_label(mi->module, preset_name); g_free(preset_name); } - free_module_info(NULL, mi); + _free_module_info(NULL, mi); return module->expander; } diff --git a/src/libs/lib.h b/src/libs/lib.h index 6e125268b71d..e7f6e6c9d750 100644 --- a/src/libs/lib.h +++ b/src/libs/lib.h @@ -1,6 +1,6 @@ /* This file is part of darktable, - Copyright (C) 2009-2023 darktable developers. + Copyright (C) 2009-2025 darktable developers. darktable is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,11 +28,7 @@ #include "gui/presets.h" #ifdef USE_LUA -#include "lua/call.h" -#include "lua/events.h" #include "lua/lib.h" -#include "lua/modules.h" -#include "lua/types.h" #endif struct dt_lib_module_t; From de0e56e1cc06ffd819469d995c2c034277529936 Mon Sep 17 00:00:00 2001 From: Mario Zimmermann Date: Sun, 23 Feb 2025 19:34:13 +0100 Subject: [PATCH 4/6] make gui_update a default function --- src/libs/filtering.c | 6 ------ src/libs/import.c | 6 ------ src/libs/lib.c | 12 ++++++++---- src/libs/lib_api.h | 2 +- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/libs/filtering.c b/src/libs/filtering.c index 91ba15aea916..c011f03a48b5 100644 --- a/src/libs/filtering.c +++ b/src/libs/filtering.c @@ -2255,12 +2255,6 @@ void gui_init(dt_lib_module_t *self) DT_CONTROL_SIGNAL_HANDLE(DT_SIGNAL_IMAGES_ORDER_CHANGE, _dt_images_order_change); } -void gui_update(dt_lib_module_t *self) -{ - // Don't remove the empty function to not break the gui_update chain. - // It is needed to update the preset_label in the module header when params change. -} - void gui_cleanup(dt_lib_module_t *self) { dt_lib_filtering_t *d = self->data; diff --git a/src/libs/import.c b/src/libs/import.c index 93895a810f70..f2eb656b25b3 100644 --- a/src/libs/import.c +++ b/src/libs/import.c @@ -2438,12 +2438,6 @@ void gui_init(dt_lib_module_t *self) dt_gui_update_collapsible_section(&d->cs); } -void gui_update(dt_lib_module_t *self) -{ - // Don't remove the empty function to not break the gui_update chain. - // It is needed to update the preset_label in the module header when params change. -} - void gui_cleanup(dt_lib_module_t *self) { dt_lib_import_t *d = self->data; diff --git a/src/libs/lib.c b/src/libs/lib.c index 4e7f29016c75..5279e16fc6f9 100644 --- a/src/libs/lib.c +++ b/src/libs/lib.c @@ -677,6 +677,11 @@ static gboolean default_preset_autoapply(dt_lib_module_t *self) return FALSE; } +/* default gui_update implementation */ +static void default_gui_update(dt_lib_module_t *self) +{ +} + static int dt_lib_load_module(void *m, const char *libname, const char *module_name) @@ -895,7 +900,7 @@ void dt_lib_gui_queue_update(dt_lib_module_t *module) void dt_lib_gui_update(dt_lib_module_t *module) { - if(module && module->gui_update && !module->gui_uptodate) + if(module && !module->gui_uptodate) { module->gui_update(module); module->gui_uptodate = TRUE; @@ -930,9 +935,8 @@ static void dt_lib_init_module(void *m) if(module->widget) { g_object_ref_sink(module->widget); - if(module->gui_update) - g_signal_connect(G_OBJECT(module->widget), "draw", - G_CALLBACK(_lib_draw_callback), module); + g_signal_connect(G_OBJECT(module->widget), "draw", + G_CALLBACK(_lib_draw_callback), module); } } } diff --git a/src/libs/lib_api.h b/src/libs/lib_api.h index d2116a3d4504..b7e2c0338d23 100644 --- a/src/libs/lib_api.h +++ b/src/libs/lib_api.h @@ -64,7 +64,7 @@ OPTIONAL(void, gui_reset, struct dt_lib_module_t *self); /** update libs gui when visible triggered by dt_lib_gui_queue_update. don't use for widgets accessible via actions when hidden. */ -OPTIONAL(void, gui_update, struct dt_lib_module_t *self); +DEFAULT(void, gui_update, struct dt_lib_module_t *self); OPTIONAL(GtkWidget *, gui_tool_box, struct dt_lib_module_t *self); From fce7358a3f2f2cf97e7ab0b04432e16b06fa4227 Mon Sep 17 00:00:00 2001 From: Mario Zimmermann Date: Mon, 24 Feb 2025 09:38:27 +0100 Subject: [PATCH 5/6] fix gtk critical errors --- src/libs/lib.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/libs/lib.c b/src/libs/lib.c index 5279e16fc6f9..0d09c57bbe48 100644 --- a/src/libs/lib.c +++ b/src/libs/lib.c @@ -130,6 +130,8 @@ static dt_lib_module_info_t *_get_module_info_for_module(dt_lib_module_t *module static void _set_module_preset_label(dt_lib_module_t *module, const gchar *preset_name) { + if(!module->expander) return; + gchar *preset_label_text = (*preset_name == '\0')? g_strdup("") : g_strdup_printf("• %s", preset_name); gtk_label_set_text(GTK_LABEL(module->preset_label), preset_label_text); @@ -714,6 +716,7 @@ static int dt_lib_load_module(void *m, module->widget = NULL; module->expander = NULL; module->arrow = NULL; + module->preset_label = NULL; module->reset_button = NULL; module->presets_button = NULL; @@ -906,11 +909,14 @@ void dt_lib_gui_update(dt_lib_module_t *module) module->gui_uptodate = TRUE; } - dt_lib_module_info_t *mi = _get_module_info_for_module(module); - gchar *active_preset_name = dt_lib_get_active_preset_name(mi); - _free_module_info(NULL, mi); - _set_module_preset_label(module, active_preset_name? active_preset_name : ""); - g_free(active_preset_name); + if(module->preset_label) + { + dt_lib_module_info_t *mi = _get_module_info_for_module(module); + gchar *active_preset_name = dt_lib_get_active_preset_name(mi); + _free_module_info(NULL, mi); + _set_module_preset_label(module, active_preset_name? active_preset_name : ""); + g_free(active_preset_name); + } } static void dt_lib_init_module(void *m) From 79fee8747b6dd9dc8c0eefc197eb8c695547abc7 Mon Sep 17 00:00:00 2001 From: Mario Zimmermann Date: Tue, 17 Feb 2026 20:24:55 +0100 Subject: [PATCH 6/6] make module preset label opional --- src/libs/export.c | 7 ++++++- src/libs/filtering.c | 2 ++ src/libs/import.c | 6 +++++- src/libs/lib.c | 10 ++++++++-- src/libs/lib.h | 2 +- src/libs/lib_api.h | 5 ++++- 6 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/libs/export.c b/src/libs/export.c index 65a8330a9aae..4071a1de951b 100644 --- a/src/libs/export.c +++ b/src/libs/export.c @@ -1,6 +1,6 @@ /* This file is part of darktable, - Copyright (C) 2009-2025 darktable developers. + Copyright (C) 2009-2026 darktable developers. darktable is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -175,6 +175,11 @@ const char *name(dt_lib_module_t *self) return _("export"); } +gboolean has_preset_label(dt_lib_module_t *self) +{ + return TRUE; +} + const char *description(dt_lib_module_t *self) { return _("create new files for the\n" diff --git a/src/libs/filtering.c b/src/libs/filtering.c index c011f03a48b5..1f04b5813574 100644 --- a/src/libs/filtering.c +++ b/src/libs/filtering.c @@ -19,8 +19,10 @@ #include "bauhaus/bauhaus.h" #include "common/collection.h" #include "common/darktable.h" +#include "common/metadata.h" #include "control/conf.h" #include "control/control.h" +#include "control/jobs.h" #include "dtgtk/button.h" #include "dtgtk/range.h" #include "gui/accelerators.h" diff --git a/src/libs/import.c b/src/libs/import.c index f2eb656b25b3..e90c4b8bed93 100644 --- a/src/libs/import.c +++ b/src/libs/import.c @@ -1,6 +1,6 @@ /* This file is part of darktable, - Copyright (C) 2011-2025 darktable developers. + Copyright (C) 2011-2026 darktable developers. darktable is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -183,6 +183,10 @@ const char *name(dt_lib_module_t *self) return _("import"); } +gboolean has_preset_label(dt_lib_module_t *self) +{ + return TRUE; +} dt_view_type_flags_t views(dt_lib_module_t *self) { diff --git a/src/libs/lib.c b/src/libs/lib.c index 0d09c57bbe48..53e392e75224 100644 --- a/src/libs/lib.c +++ b/src/libs/lib.c @@ -1,6 +1,6 @@ /* This file is part of darktable, - Copyright (C) 2009-2025 darktable developers. + Copyright (C) 2009-2026 darktable developers. darktable is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -130,7 +130,7 @@ static dt_lib_module_info_t *_get_module_info_for_module(dt_lib_module_t *module static void _set_module_preset_label(dt_lib_module_t *module, const gchar *preset_name) { - if(!module->expander) return; + if(!module->expander || !module->has_preset_label(module)) return; gchar *preset_label_text = (*preset_name == '\0')? g_strdup("") : g_strdup_printf("• %s", preset_name); @@ -667,6 +667,12 @@ uint32_t dt_lib_get_container(dt_lib_module_t *module) return container; } +/* default has_preset_label implementation */ +static gboolean default_has_preset_label(dt_lib_module_t *self) +{ + return FALSE; +} + /* default expandable implementation */ static gboolean default_expandable(dt_lib_module_t *self) { diff --git a/src/libs/lib.h b/src/libs/lib.h index e7f6e6c9d750..dc166564838a 100644 --- a/src/libs/lib.h +++ b/src/libs/lib.h @@ -1,6 +1,6 @@ /* This file is part of darktable, - Copyright (C) 2009-2025 darktable developers. + Copyright (C) 2009-2026 darktable developers. darktable is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/src/libs/lib_api.h b/src/libs/lib_api.h index b7e2c0338d23..f35230975188 100644 --- a/src/libs/lib_api.h +++ b/src/libs/lib_api.h @@ -1,6 +1,6 @@ /* This file is part of darktable, - Copyright (C) 2016-2024 darktable developers. + Copyright (C) 2016-2026 darktable developers. darktable is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -41,6 +41,9 @@ struct dt_view_t; /** get name of the module, to be translated. */ REQUIRED(const char *, name, struct dt_lib_module_t *self); +/** does the module support a preset label? */ +DEFAULT(gboolean, has_preset_label, struct dt_lib_module_t *self); + /** get the views which the module should be loaded in. */ REQUIRED(enum dt_view_type_flags_t, views, struct dt_lib_module_t *self); /** get the container which the module should be placed in */