Skip to content
Open
Show file tree
Hide file tree
Changes from 3 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
2 changes: 1 addition & 1 deletion data/themes/darktable-elegant-highcontrast.css
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,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; }
2 changes: 1 addition & 1 deletion data/themes/darktable-icons-highcontrast.css
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,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; }
3 changes: 2 additions & 1 deletion data/themes/darktable.css
Original file line number Diff line number Diff line change
Expand Up @@ -600,7 +600,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";
Expand Down
8 changes: 6 additions & 2 deletions src/libs/filtering.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -2252,6 +2250,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)
{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Either make gui_update a DEFAULT member function in lib_api (and provide a default_ implementation) or test if module->gui_update exists before calling it. No need for empty dummy implementations everywhere.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great, thanks!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That was just after a quick look at the code. I can't test or fully analyze at the moment, but beware, the reason for gui_update for libs is different from gui_update for iops. The former is meant to avoid (possibly) costly updates of the content of a module if it is collapsed or otherwise not visible. For these changes, presumably you need to update the header even if the module is collapsed. If that means you are now always calling gui_update for each signal received, that may cause a more sluggish experience.

Again, I haven't analyzed your code.

// 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;
Expand Down
11 changes: 7 additions & 4 deletions src/libs/import.c
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -16,11 +16,9 @@
along with darktable. If not, see <http://www.gnu.org/licenses/>.
*/

#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"
Expand All @@ -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"
Expand Down Expand Up @@ -2505,6 +2502,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;
Expand Down
130 changes: 87 additions & 43 deletions src/libs/lib.c
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*
This file is part of darktable,
Copyright (C) 2009-2024 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
Expand All @@ -23,14 +23,10 @@
#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"
#ifdef GDK_WINDOWING_QUARTZ
#include "osx/osx.h"
#endif
#include <stdbool.h>
#include <stdlib.h>

Expand Down Expand Up @@ -103,8 +99,36 @@ gchar *dt_lib_get_active_preset_name(dt_lib_module_info_t *minfo)
return name;
}

static void edit_preset(const char *name_in,
dt_lib_module_info_t *minfo)
// 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: &params=%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)
{
// get the original name of the preset
gchar *name = NULL;
Expand Down Expand Up @@ -144,8 +168,8 @@ static void edit_preset(const char *name_in,
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");

Expand Down Expand Up @@ -177,8 +201,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);

Expand Down Expand Up @@ -208,23 +232,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;
Expand All @@ -237,6 +261,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));
Expand Down Expand Up @@ -356,6 +381,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;
}
}
Expand Down Expand Up @@ -418,24 +445,24 @@ 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);
free(minfo->params);
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;
Expand Down Expand Up @@ -529,7 +556,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++;
}
Expand All @@ -538,11 +565,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++;
}
Expand All @@ -556,7 +583,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)
Expand All @@ -570,7 +597,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);
}
Expand Down Expand Up @@ -857,6 +884,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)
Expand Down Expand Up @@ -892,27 +925,16 @@ 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;
}

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: &params=%p, size=%i\n",
// mi->params, mi->params_size);
mi->params_size = 0;
}
dt_lib_presets_popup_menu_show(mi, GTK_WIDGET(button));
dt_lib_module_info_t *mi = _get_module_info_for_module(module);
_dt_lib_presets_popup_menu_show(mi, GTK_WIDGET(button));

if(button)
dtgtk_button_set_active(DTGTK_BUTTON(button), FALSE);
Expand Down Expand Up @@ -1275,6 +1297,14 @@ 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);
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"));
Expand Down Expand Up @@ -1316,6 +1346,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;
}
Expand Down Expand Up @@ -1538,6 +1577,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,
Expand Down
Loading
Loading