From 95265ecef8b3cd27f9ffc2a1c0aa4fba226a0694 Mon Sep 17 00:00:00 2001 From: deekayhd <53017684+deekayhd@users.noreply.github.com> Date: Sun, 18 Jan 2026 15:19:58 +0100 Subject: [PATCH 01/15] add param to tooltip creation and checkbox --- src/common/styles.c | 4 ++-- src/dtgtk/stylemenu.c | 2 +- src/gui/styles.h | 2 +- src/gui/styles_dialog.c | 21 ++++++++++++--------- src/libs/styles.c | 15 +++++++++++++-- 5 files changed, 29 insertions(+), 15 deletions(-) diff --git a/src/common/styles.c b/src/common/styles.c index 24ef13bf1020..12c1e7eab2c0 100644 --- a/src/common/styles.c +++ b/src/common/styles.c @@ -277,7 +277,7 @@ static gboolean dt_styles_create_style_header(const char *name, dt_action_t *stl = dt_action_section(&darktable.control->actions_global, N_("styles")); dt_action_register(stl, name, _apply_style_shortcut_callback, 0, 0); - dt_gui_style_content_dialog("", -1); + dt_gui_style_content_dialog("", -1, FALSE); g_free(iop_list_txt); return TRUE; @@ -465,7 +465,7 @@ void dt_styles_update(const char *name, dt_action_rename(old, newname); } - dt_gui_style_content_dialog("", -1); + dt_gui_style_content_dialog("", -1, FALSE); DT_CONTROL_SIGNAL_RAISE(DT_SIGNAL_STYLE_CHANGED); diff --git a/src/dtgtk/stylemenu.c b/src/dtgtk/stylemenu.c index 5844056cc51c..6d460626cbea 100644 --- a/src/dtgtk/stylemenu.c +++ b/src/dtgtk/stylemenu.c @@ -45,7 +45,7 @@ static gboolean _styles_tooltip_callback(GtkWidget* self, if(dev) dt_dev_write_history(dev); - GtkWidget *ht = dt_gui_style_content_dialog(name, imgid); + GtkWidget *ht = dt_gui_style_content_dialog(name, imgid, FALSE); return dt_shortcut_tooltip_callback(self, x, y, keyboard_mode, tooltip, ht); } diff --git a/src/gui/styles.h b/src/gui/styles.h index bf35db8c514a..e90bdb26507a 100644 --- a/src/gui/styles.h +++ b/src/gui/styles.h @@ -37,7 +37,7 @@ void dt_gui_styles_dialog_edit(const char *name, char **new_name); cairo_surface_t *dt_gui_get_style_preview(const dt_imgid_t imgid, const char *name); -GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid); +GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid, const gboolean hide_preview); // clang-format off // modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py diff --git a/src/gui/styles_dialog.c b/src/gui/styles_dialog.c index 6eec005c8c1d..0468c3d4f110 100644 --- a/src/gui/styles_dialog.c +++ b/src/gui/styles_dialog.c @@ -912,7 +912,7 @@ static gboolean _preview_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data return FALSE; } -GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid) +GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid, const gboolean hide_preview) { static _preview_data_t data = { "", -1, FALSE, NULL, NULL, 0}; @@ -1023,14 +1023,17 @@ GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid) gtk_box_pack_start(GTK_BOX(ht), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), TRUE, TRUE, 0); // style preview - const int psize = dt_conf_get_int("ui/style/preview_size"); - GtkWidget *da = gtk_drawing_area_new(); - gtk_widget_set_size_request(da, psize, psize); - gtk_widget_set_halign(da, GTK_ALIGN_CENTER); - gtk_widget_set_app_paintable(da, TRUE); - gtk_box_pack_start(GTK_BOX(ht), da, TRUE, TRUE, 0); - data.first_draw = TRUE; - g_signal_connect(G_OBJECT(da), "draw", G_CALLBACK(_preview_draw), &data); + if (!hide_preview) + { + const int psize = dt_conf_get_int("ui/style/preview_size"); + GtkWidget *da = gtk_drawing_area_new(); + gtk_widget_set_size_request(da, psize, psize); + gtk_widget_set_halign(da, GTK_ALIGN_CENTER); + gtk_widget_set_app_paintable(da, TRUE); + gtk_box_pack_start(GTK_BOX(ht), da, TRUE, TRUE, 0); + data.first_draw = TRUE; + g_signal_connect(G_OBJECT(da), "draw", G_CALLBACK(_preview_draw), &data); + } } return ht; diff --git a/src/libs/styles.c b/src/libs/styles.c index 2dbc8aaf3a85..71bf84aa2dc1 100644 --- a/src/libs/styles.c +++ b/src/libs/styles.c @@ -45,6 +45,7 @@ typedef struct dt_lib_styles_t GtkTreeView *tree; GtkWidget *create_button, *edit_button, *delete_button; GtkWidget *import_button, *export_button, *applymode, *apply_button; + GtkWidget *show_preview; } dt_lib_styles_t; @@ -160,7 +161,7 @@ gboolean _styles_tooltip_callback(GtkWidget* widget, g_list_free(selected_image); } - GtkWidget *ht = dt_gui_style_content_dialog(name, imgid); + GtkWidget *ht = dt_gui_style_content_dialog(name, imgid, FALSE); dt_action_define(&darktable.control->actions_global, "styles", name, widget, NULL); return dt_shortcut_tooltip_callback(widget, x, y, keyboard_mode, tooltip, ht); @@ -872,6 +873,16 @@ void gui_init(dt_lib_module_t *self) gtk_widget_set_tooltip_text(d->duplicate, _("creates a duplicate of the image before applying style")); + d->show_preview = gtk_check_button_new_with_label(_("show preview")); + dt_action_define(DT_ACTION(self), NULL, N_("show preview"), + d->show_preview, &dt_action_def_toggle); + gtk_label_set_ellipsize(GTK_LABEL(gtk_bin_get_child(GTK_BIN(d->show_preview))), PANGO_ELLIPSIZE_START); + g_signal_connect(d->duplicate, "toggled", G_CALLBACK(_duplicate_callback), d); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(d->show_preview), + dt_conf_get_bool("ui_last/styles_show_preview")); + gtk_widget_set_tooltip_text(d->show_preview, + _("show preview of style applied to image")); + DT_BAUHAUS_COMBOBOX_NEW_FULL(d->applymode, self, NULL, N_("mode"), _("how to handle existing history"), dt_conf_get_int("plugins/lighttable/style/applymode"), @@ -925,7 +936,7 @@ void gui_init(dt_lib_module_t *self) self->widget = dt_gui_vbox (d->entry, dt_ui_resize_wrap(GTK_WIDGET(d->tree), 250, "plugins/lighttable/style/windowheight"), - d->duplicate, d->applymode, + d->duplicate, d->show_preview, d->applymode, dt_gui_hbox(d->create_button, d->edit_button, d->delete_button), dt_gui_hbox(d->import_button, d->export_button), d->apply_button); From dbeae6c9fbd3493571b2a7bddaf63335fc16a6f1 Mon Sep 17 00:00:00 2001 From: deekayhd <53017684+deekayhd@users.noreply.github.com> Date: Sun, 18 Jan 2026 15:53:41 +0100 Subject: [PATCH 02/15] put checkboxes in a row --- src/libs/styles.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/libs/styles.c b/src/libs/styles.c index 71bf84aa2dc1..ff831e12d0bb 100644 --- a/src/libs/styles.c +++ b/src/libs/styles.c @@ -878,11 +878,15 @@ void gui_init(dt_lib_module_t *self) d->show_preview, &dt_action_def_toggle); gtk_label_set_ellipsize(GTK_LABEL(gtk_bin_get_child(GTK_BIN(d->show_preview))), PANGO_ELLIPSIZE_START); g_signal_connect(d->duplicate, "toggled", G_CALLBACK(_duplicate_callback), d); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(d->show_preview), - dt_conf_get_bool("ui_last/styles_show_preview")); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(d->show_preview), TRUE); gtk_widget_set_tooltip_text(d->show_preview, _("show preview of style applied to image")); + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); + gtk_box_pack_start(GTK_BOX(box), d->duplicate, FALSE, FALSE, 0); + gtk_box_pack_end(GTK_BOX(box), d->show_preview, FALSE, FALSE, 0); + gtk_widget_set_hexpand(box, TRUE); + DT_BAUHAUS_COMBOBOX_NEW_FULL(d->applymode, self, NULL, N_("mode"), _("how to handle existing history"), dt_conf_get_int("plugins/lighttable/style/applymode"), @@ -936,7 +940,7 @@ void gui_init(dt_lib_module_t *self) self->widget = dt_gui_vbox (d->entry, dt_ui_resize_wrap(GTK_WIDGET(d->tree), 250, "plugins/lighttable/style/windowheight"), - d->duplicate, d->show_preview, d->applymode, + box, d->applymode, dt_gui_hbox(d->create_button, d->edit_button, d->delete_button), dt_gui_hbox(d->import_button, d->export_button), d->apply_button); From cc2b58bdfd9d4b24cacb6bb47582a23fb27ea72d Mon Sep 17 00:00:00 2001 From: deekayhd <53017684+deekayhd@users.noreply.github.com> Date: Sun, 18 Jan 2026 16:02:16 +0100 Subject: [PATCH 03/15] evaluate checkbox --- src/libs/styles.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libs/styles.c b/src/libs/styles.c index ff831e12d0bb..458bf716e37c 100644 --- a/src/libs/styles.c +++ b/src/libs/styles.c @@ -160,8 +160,8 @@ gboolean _styles_tooltip_callback(GtkWidget* widget, imgid = GPOINTER_TO_INT(selected_image->data); g_list_free(selected_image); } - - GtkWidget *ht = dt_gui_style_content_dialog(name, imgid, FALSE); + + GtkWidget *ht = dt_gui_style_content_dialog(name, imgid, !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->show_preview))); dt_action_define(&darktable.control->actions_global, "styles", name, widget, NULL); return dt_shortcut_tooltip_callback(widget, x, y, keyboard_mode, tooltip, ht); From 3a97b87395a962fb789631b482968c6d1100b953 Mon Sep 17 00:00:00 2001 From: deekayhd <53017684+deekayhd@users.noreply.github.com> Date: Sun, 1 Feb 2026 12:39:10 +0100 Subject: [PATCH 04/15] store last toggle state --- src/libs/styles.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/libs/styles.c b/src/libs/styles.c index 458bf716e37c..6100d595a6c5 100644 --- a/src/libs/styles.c +++ b/src/libs/styles.c @@ -771,6 +771,13 @@ static void _applymode_combobox_changed(GtkWidget *widget, gpointer user_data) dt_conf_set_int("plugins/lighttable/style/applymode", mode); } +static gboolean _show_preview_callback(GtkEntry *entry, dt_lib_styles_t *d) +{ + dt_conf_set_bool("ui_last/styles_hide_preview", + !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->show_preview))); + return FALSE; +} + void gui_update(dt_lib_module_t *self) { dt_lib_styles_t *d = self->data; @@ -862,7 +869,6 @@ void gui_init(dt_lib_module_t *self) g_signal_connect(d->entry, "changed", G_CALLBACK(_entry_callback), d); g_signal_connect(d->entry, "activate", G_CALLBACK(_entry_activated), d); - d->duplicate = gtk_check_button_new_with_label(_("create duplicate")); dt_action_define(DT_ACTION(self), NULL, N_("create duplicate"), d->duplicate, &dt_action_def_toggle); @@ -877,11 +883,11 @@ void gui_init(dt_lib_module_t *self) dt_action_define(DT_ACTION(self), NULL, N_("show preview"), d->show_preview, &dt_action_def_toggle); gtk_label_set_ellipsize(GTK_LABEL(gtk_bin_get_child(GTK_BIN(d->show_preview))), PANGO_ELLIPSIZE_START); - g_signal_connect(d->duplicate, "toggled", G_CALLBACK(_duplicate_callback), d); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(d->show_preview), TRUE); + g_signal_connect(d->show_preview, "toggled", G_CALLBACK(_show_preview_callback), d); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(d->show_preview), !dt_conf_get_bool("ui_last/styles_hide_preview")); gtk_widget_set_tooltip_text(d->show_preview, _("show preview of style applied to image")); - + GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(box), d->duplicate, FALSE, FALSE, 0); gtk_box_pack_end(GTK_BOX(box), d->show_preview, FALSE, FALSE, 0); From 33573a1d90ae715f710d40f229432888161f4308 Mon Sep 17 00:00:00 2001 From: deekayhd <53017684+deekayhd@users.noreply.github.com> Date: Sat, 7 Feb 2026 11:53:11 +0100 Subject: [PATCH 05/15] change checkbox to combobox --- src/libs/styles.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/libs/styles.c b/src/libs/styles.c index 6100d595a6c5..e09f9eca041f 100644 --- a/src/libs/styles.c +++ b/src/libs/styles.c @@ -771,12 +771,18 @@ static void _applymode_combobox_changed(GtkWidget *widget, gpointer user_data) dt_conf_set_int("plugins/lighttable/style/applymode", mode); } -static gboolean _show_preview_callback(GtkEntry *entry, dt_lib_styles_t *d) +static void _previewmode_combobox_changed(GtkWidget *widget, gpointer user_data) +{ + const int mode = dt_bauhaus_combobox_get(widget); + dt_conf_set_int("plugins/lighttable/style/previewmode", mode); +} + +/* static gboolean _show_preview_callback(GtkEntry *entry, dt_lib_styles_t *d) { dt_conf_set_bool("ui_last/styles_hide_preview", !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->show_preview))); return FALSE; -} +} */ void gui_update(dt_lib_module_t *self) { @@ -879,14 +885,19 @@ void gui_init(dt_lib_module_t *self) gtk_widget_set_tooltip_text(d->duplicate, _("creates a duplicate of the image before applying style")); - d->show_preview = gtk_check_button_new_with_label(_("show preview")); + DT_BAUHAUS_COMBOBOX_NEW_FULL(d->show_preview, self, NULL, N_("preview"), + _("show/hide preview"), + dt_conf_get_int("plugins/lighttable/style/previewmode"), + _previewmode_combobox_changed, self, + N_("no"), N_("small"), N_("large")); +/* d->show_preview = gtk_check_button_new_with_label(_("show preview")); dt_action_define(DT_ACTION(self), NULL, N_("show preview"), d->show_preview, &dt_action_def_toggle); gtk_label_set_ellipsize(GTK_LABEL(gtk_bin_get_child(GTK_BIN(d->show_preview))), PANGO_ELLIPSIZE_START); g_signal_connect(d->show_preview, "toggled", G_CALLBACK(_show_preview_callback), d); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(d->show_preview), !dt_conf_get_bool("ui_last/styles_hide_preview")); gtk_widget_set_tooltip_text(d->show_preview, - _("show preview of style applied to image")); + _("show preview of style applied to image")); */ GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(box), d->duplicate, FALSE, FALSE, 0); From 1befe23da2d7df2865d0909c2ef49d2652e06657 Mon Sep 17 00:00:00 2001 From: deekayhd <53017684+deekayhd@users.noreply.github.com> Date: Sat, 7 Feb 2026 12:39:58 +0100 Subject: [PATCH 06/15] set preview_size from combobox value --- src/gui/styles_dialog.c | 2 +- src/libs/styles.c | 32 +++++++++++++------------------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/gui/styles_dialog.c b/src/gui/styles_dialog.c index 0468c3d4f110..b2199b7ecc0f 100644 --- a/src/gui/styles_dialog.c +++ b/src/gui/styles_dialog.c @@ -1023,7 +1023,7 @@ GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid, const gtk_box_pack_start(GTK_BOX(ht), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), TRUE, TRUE, 0); // style preview - if (!hide_preview) + if (!hide_preview) { const int psize = dt_conf_get_int("ui/style/preview_size"); GtkWidget *da = gtk_drawing_area_new(); diff --git a/src/libs/styles.c b/src/libs/styles.c index e09f9eca041f..947892ca6558 100644 --- a/src/libs/styles.c +++ b/src/libs/styles.c @@ -161,7 +161,8 @@ gboolean _styles_tooltip_callback(GtkWidget* widget, g_list_free(selected_image); } - GtkWidget *ht = dt_gui_style_content_dialog(name, imgid, !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->show_preview))); + const gboolean hide_preview = (dt_conf_get_int("ui_last/styles_preview_mode") == 0); + GtkWidget *ht = dt_gui_style_content_dialog(name, imgid, hide_preview); dt_action_define(&darktable.control->actions_global, "styles", name, widget, NULL); return dt_shortcut_tooltip_callback(widget, x, y, keyboard_mode, tooltip, ht); @@ -774,16 +775,16 @@ static void _applymode_combobox_changed(GtkWidget *widget, gpointer user_data) static void _previewmode_combobox_changed(GtkWidget *widget, gpointer user_data) { const int mode = dt_bauhaus_combobox_get(widget); - dt_conf_set_int("plugins/lighttable/style/previewmode", mode); + dt_conf_set_int("ui_last/styles_preview_mode", mode); + // set the actual preview size here. + // for "no preview" we do not set to 0, because there is a minimum value of 100 + // defined in darktableconfig.xml.in, so we have to switch off separately, anyway. + // Note: This also affects the size of the preview in the darkroom view. + int preview_size = dt_confgen_get_int("ui/style/preview_size", DT_DEFAULT);; + if(mode == 2) preview_size = dt_confgen_get_int("ui/style/preview_size", DT_MAX); + dt_conf_set_int("ui/style/preview_size", preview_size); } -/* static gboolean _show_preview_callback(GtkEntry *entry, dt_lib_styles_t *d) -{ - dt_conf_set_bool("ui_last/styles_hide_preview", - !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(d->show_preview))); - return FALSE; -} */ - void gui_update(dt_lib_module_t *self) { dt_lib_styles_t *d = self->data; @@ -885,19 +886,12 @@ void gui_init(dt_lib_module_t *self) gtk_widget_set_tooltip_text(d->duplicate, _("creates a duplicate of the image before applying style")); + DT_BAUHAUS_COMBOBOX_NEW_FULL(d->show_preview, self, NULL, N_("preview"), _("show/hide preview"), - dt_conf_get_int("plugins/lighttable/style/previewmode"), + dt_conf_get_int("ui_last/styles_preview_mode"), _previewmode_combobox_changed, self, - N_("no"), N_("small"), N_("large")); -/* d->show_preview = gtk_check_button_new_with_label(_("show preview")); - dt_action_define(DT_ACTION(self), NULL, N_("show preview"), - d->show_preview, &dt_action_def_toggle); - gtk_label_set_ellipsize(GTK_LABEL(gtk_bin_get_child(GTK_BIN(d->show_preview))), PANGO_ELLIPSIZE_START); - g_signal_connect(d->show_preview, "toggled", G_CALLBACK(_show_preview_callback), d); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(d->show_preview), !dt_conf_get_bool("ui_last/styles_hide_preview")); - gtk_widget_set_tooltip_text(d->show_preview, - _("show preview of style applied to image")); */ + N_("no"), N_("default"), N_("large")); GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_box_pack_start(GTK_BOX(box), d->duplicate, FALSE, FALSE, 0); From f0c0a64c1878f63db7fa841d651090e1f66f9dbd Mon Sep 17 00:00:00 2001 From: deekayhd <53017684+deekayhd@users.noreply.github.com> Date: Sat, 7 Feb 2026 17:18:44 +0100 Subject: [PATCH 07/15] define constants for preview mode --- src/libs/styles.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/libs/styles.c b/src/libs/styles.c index 947892ca6558..f53e8ce20d29 100644 --- a/src/libs/styles.c +++ b/src/libs/styles.c @@ -48,6 +48,11 @@ typedef struct dt_lib_styles_t GtkWidget *show_preview; } dt_lib_styles_t; +enum PREVIEW_MODE { + PREVIEW_NO, + PREVIEW_DEFAULT, + PREVIEW_LARGE +}; const char *name(dt_lib_module_t *self) { @@ -161,7 +166,7 @@ gboolean _styles_tooltip_callback(GtkWidget* widget, g_list_free(selected_image); } - const gboolean hide_preview = (dt_conf_get_int("ui_last/styles_preview_mode") == 0); + const gboolean hide_preview = (dt_conf_get_int("ui_last/styles_preview_mode") == PREVIEW_NO); GtkWidget *ht = dt_gui_style_content_dialog(name, imgid, hide_preview); dt_action_define(&darktable.control->actions_global, "styles", name, widget, NULL); @@ -780,8 +785,8 @@ static void _previewmode_combobox_changed(GtkWidget *widget, gpointer user_data) // for "no preview" we do not set to 0, because there is a minimum value of 100 // defined in darktableconfig.xml.in, so we have to switch off separately, anyway. // Note: This also affects the size of the preview in the darkroom view. - int preview_size = dt_confgen_get_int("ui/style/preview_size", DT_DEFAULT);; - if(mode == 2) preview_size = dt_confgen_get_int("ui/style/preview_size", DT_MAX); + int preview_size = dt_confgen_get_int("ui/style/preview_size", DT_DEFAULT); + if(mode == PREVIEW_LARGE) preview_size = dt_confgen_get_int("ui/style/preview_size", DT_MAX); dt_conf_set_int("ui/style/preview_size", preview_size); } From 3eb45b04febc3aedc0bfde75367b3a16f4934f12 Mon Sep 17 00:00:00 2001 From: deekayhd <53017684+deekayhd@users.noreply.github.com> Date: Sun, 8 Feb 2026 12:08:03 +0100 Subject: [PATCH 08/15] fix change requests from review --- data/darktableconfig.xml.in | 6 ++++++ src/common/styles.c | 4 ++-- src/common/styles.h | 6 ++++++ src/dtgtk/stylemenu.c | 2 +- src/gui/styles.h | 4 ++-- src/gui/styles_dialog.c | 27 +++++++++++++++++---------- src/libs/styles.c | 37 ++++++++++++------------------------- 7 files changed, 46 insertions(+), 40 deletions(-) diff --git a/data/darktableconfig.xml.in b/data/darktableconfig.xml.in index 8e106a6e1557..e2383e20e4cf 100644 --- a/data/darktableconfig.xml.in +++ b/data/darktableconfig.xml.in @@ -2377,6 +2377,12 @@ 250 max style preview size + + ui/style/large_preview_size + int + 500 + + ui_last/expander_metadata int diff --git a/src/common/styles.c b/src/common/styles.c index 12c1e7eab2c0..24ef13bf1020 100644 --- a/src/common/styles.c +++ b/src/common/styles.c @@ -277,7 +277,7 @@ static gboolean dt_styles_create_style_header(const char *name, dt_action_t *stl = dt_action_section(&darktable.control->actions_global, N_("styles")); dt_action_register(stl, name, _apply_style_shortcut_callback, 0, 0); - dt_gui_style_content_dialog("", -1, FALSE); + dt_gui_style_content_dialog("", -1); g_free(iop_list_txt); return TRUE; @@ -465,7 +465,7 @@ void dt_styles_update(const char *name, dt_action_rename(old, newname); } - dt_gui_style_content_dialog("", -1, FALSE); + dt_gui_style_content_dialog("", -1); DT_CONTROL_SIGNAL_RAISE(DT_SIGNAL_STYLE_CHANGED); diff --git a/src/common/styles.h b/src/common/styles.h index 237abc79697b..06187711c47c 100644 --- a/src/common/styles.h +++ b/src/common/styles.h @@ -43,6 +43,12 @@ typedef enum dt_style_applymode_t DT_STYLE_HISTORY_OVERWRITE = 1 } dt_style_applymode_t; +enum PREVIEW_MODE { + PREVIEW_NO, + PREVIEW_DEFAULT, + PREVIEW_LARGE +}; + typedef struct dt_style_item_t { int num, selimg_num, enabled, multi_priority; diff --git a/src/dtgtk/stylemenu.c b/src/dtgtk/stylemenu.c index 6d460626cbea..5844056cc51c 100644 --- a/src/dtgtk/stylemenu.c +++ b/src/dtgtk/stylemenu.c @@ -45,7 +45,7 @@ static gboolean _styles_tooltip_callback(GtkWidget* self, if(dev) dt_dev_write_history(dev); - GtkWidget *ht = dt_gui_style_content_dialog(name, imgid, FALSE); + GtkWidget *ht = dt_gui_style_content_dialog(name, imgid); return dt_shortcut_tooltip_callback(self, x, y, keyboard_mode, tooltip, ht); } diff --git a/src/gui/styles.h b/src/gui/styles.h index e90bdb26507a..cd8b6b38476c 100644 --- a/src/gui/styles.h +++ b/src/gui/styles.h @@ -35,9 +35,9 @@ gboolean dt_gui_styles_dialog_new(const dt_imgid_t imgid); /** shows a dialog for editing existing style */ void dt_gui_styles_dialog_edit(const char *name, char **new_name); -cairo_surface_t *dt_gui_get_style_preview(const dt_imgid_t imgid, const char *name); +cairo_surface_t *dt_gui_get_style_preview(const dt_imgid_t imgid, const char *name, const int psize); -GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid, const gboolean hide_preview); +GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid); // clang-format off // modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py diff --git a/src/gui/styles_dialog.c b/src/gui/styles_dialog.c index b2199b7ecc0f..4ba2b19649a5 100644 --- a/src/gui/styles_dialog.c +++ b/src/gui/styles_dialog.c @@ -886,6 +886,7 @@ typedef struct _preview_data_t cairo_surface_t *surface; guint8 *hash; int hash_len; + int psize; } _preview_data_t; static gboolean _preview_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data) @@ -893,11 +894,11 @@ static gboolean _preview_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data _preview_data_t *data = (_preview_data_t *)user_data; if(dt_is_valid_imgid(data->imgid) && !data->first_draw && !data->surface) - data->surface = dt_gui_get_style_preview(data->imgid, data->style_name); + data->surface = dt_gui_get_style_preview(data->imgid, data->style_name, data->psize); if(data->surface) { - const int psize = dt_conf_get_int("ui/style/preview_size"); + const int psize = data->psize; const int swidth = cairo_image_surface_get_width(data->surface); const int sheight = cairo_image_surface_get_height(data->surface); cairo_set_source_surface(cr, data->surface, .5f * (psize - swidth), .5f * (psize - sheight)); @@ -912,9 +913,9 @@ static gboolean _preview_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data return FALSE; } -GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid, const gboolean hide_preview) +GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid) { - static _preview_data_t data = { "", -1, FALSE, NULL, NULL, 0}; + static _preview_data_t data = { "", -1, FALSE, NULL, NULL, 0, 0}; dt_history_hash_values_t hash = { NULL, 0, NULL, 0, NULL, 0 }; dt_history_hash_read(imgid, &hash); @@ -1021,13 +1022,20 @@ GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid, const if(dt_is_valid_imgid(imgid)) { gtk_box_pack_start(GTK_BOX(ht), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), TRUE, TRUE, 0); - + const int preview_mode = dt_conf_get_int("ui_last/styles_preview_mode"); // style preview - if (!hide_preview) + if(!preview_mode==PREVIEW_NO) { - const int psize = dt_conf_get_int("ui/style/preview_size"); + if(preview_mode==PREVIEW_LARGE) + { + data.psize = dt_conf_get_int("ui/style/large_preview_size"); + } + else + { + data.psize = dt_conf_get_int("ui/style/preview_size"); + } GtkWidget *da = gtk_drawing_area_new(); - gtk_widget_set_size_request(da, psize, psize); + gtk_widget_set_size_request(da, data.psize, data.psize); gtk_widget_set_halign(da, GTK_ALIGN_CENTER); gtk_widget_set_app_paintable(da, TRUE); gtk_box_pack_start(GTK_BOX(ht), da, TRUE, TRUE, 0); @@ -1039,9 +1047,8 @@ GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid, const return ht; } -cairo_surface_t *dt_gui_get_style_preview(const dt_imgid_t imgid, const char *name) +cairo_surface_t *dt_gui_get_style_preview(const dt_imgid_t imgid, const char *name, const int psize) { - const int psize = dt_conf_get_int("ui/style/preview_size"); cairo_surface_t *surface = dt_imageio_preview(imgid, psize, psize, -1, name); return surface; } diff --git a/src/libs/styles.c b/src/libs/styles.c index f53e8ce20d29..af7594da7dec 100644 --- a/src/libs/styles.c +++ b/src/libs/styles.c @@ -48,12 +48,6 @@ typedef struct dt_lib_styles_t GtkWidget *show_preview; } dt_lib_styles_t; -enum PREVIEW_MODE { - PREVIEW_NO, - PREVIEW_DEFAULT, - PREVIEW_LARGE -}; - const char *name(dt_lib_module_t *self) { return _("styles"); @@ -166,8 +160,7 @@ gboolean _styles_tooltip_callback(GtkWidget* widget, g_list_free(selected_image); } - const gboolean hide_preview = (dt_conf_get_int("ui_last/styles_preview_mode") == PREVIEW_NO); - GtkWidget *ht = dt_gui_style_content_dialog(name, imgid, hide_preview); + GtkWidget *ht = dt_gui_style_content_dialog(name, imgid); dt_action_define(&darktable.control->actions_global, "styles", name, widget, NULL); return dt_shortcut_tooltip_callback(widget, x, y, keyboard_mode, tooltip, ht); @@ -781,13 +774,6 @@ static void _previewmode_combobox_changed(GtkWidget *widget, gpointer user_data) { const int mode = dt_bauhaus_combobox_get(widget); dt_conf_set_int("ui_last/styles_preview_mode", mode); - // set the actual preview size here. - // for "no preview" we do not set to 0, because there is a minimum value of 100 - // defined in darktableconfig.xml.in, so we have to switch off separately, anyway. - // Note: This also affects the size of the preview in the darkroom view. - int preview_size = dt_confgen_get_int("ui/style/preview_size", DT_DEFAULT); - if(mode == PREVIEW_LARGE) preview_size = dt_confgen_get_int("ui/style/preview_size", DT_MAX); - dt_conf_set_int("ui/style/preview_size", preview_size); } void gui_update(dt_lib_module_t *self) @@ -891,17 +877,18 @@ void gui_init(dt_lib_module_t *self) gtk_widget_set_tooltip_text(d->duplicate, _("creates a duplicate of the image before applying style")); - DT_BAUHAUS_COMBOBOX_NEW_FULL(d->show_preview, self, NULL, N_("preview"), - _("show/hide preview"), - dt_conf_get_int("ui_last/styles_preview_mode"), - _previewmode_combobox_changed, self, - N_("no"), N_("default"), N_("large")); - - GtkWidget *box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); - gtk_box_pack_start(GTK_BOX(box), d->duplicate, FALSE, FALSE, 0); - gtk_box_pack_end(GTK_BOX(box), d->show_preview, FALSE, FALSE, 0); - gtk_widget_set_hexpand(box, TRUE); + _("change size or hide preview on tooltip of style"), + dt_conf_get_int("ui_last/styles_preview_mode"), + _previewmode_combobox_changed, self, + N_("no"), N_("default"), N_("large")); + + GtkWidget *box = dt_gui_hbox(); + dt_gui_box_add(box, d->duplicate); + gtk_widget_set_halign(d->duplicate, GTK_ALIGN_START); + gtk_widget_set_hexpand(d->duplicate, TRUE); + dt_gui_box_add(box, d->show_preview); + gtk_widget_set_halign(d->show_preview, GTK_ALIGN_END); DT_BAUHAUS_COMBOBOX_NEW_FULL(d->applymode, self, NULL, N_("mode"), _("how to handle existing history"), From 3517f60caddf8a0a2ad55290e14d33bb82eff5a9 Mon Sep 17 00:00:00 2001 From: deekayhd <53017684+deekayhd@users.noreply.github.com> Date: Sun, 8 Feb 2026 12:08:03 +0100 Subject: [PATCH 09/15] fix change requests from review --- src/libs/styles.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libs/styles.c b/src/libs/styles.c index af7594da7dec..835738be3674 100644 --- a/src/libs/styles.c +++ b/src/libs/styles.c @@ -45,7 +45,7 @@ typedef struct dt_lib_styles_t GtkTreeView *tree; GtkWidget *create_button, *edit_button, *delete_button; GtkWidget *import_button, *export_button, *applymode, *apply_button; - GtkWidget *show_preview; + GtkWidget *preview_mode; } dt_lib_styles_t; const char *name(dt_lib_module_t *self) @@ -877,7 +877,7 @@ void gui_init(dt_lib_module_t *self) gtk_widget_set_tooltip_text(d->duplicate, _("creates a duplicate of the image before applying style")); - DT_BAUHAUS_COMBOBOX_NEW_FULL(d->show_preview, self, NULL, N_("preview"), + DT_BAUHAUS_COMBOBOX_NEW_FULL(d->preview_mode, self, NULL, N_("preview"), _("change size or hide preview on tooltip of style"), dt_conf_get_int("ui_last/styles_preview_mode"), _previewmode_combobox_changed, self, @@ -887,8 +887,8 @@ void gui_init(dt_lib_module_t *self) dt_gui_box_add(box, d->duplicate); gtk_widget_set_halign(d->duplicate, GTK_ALIGN_START); gtk_widget_set_hexpand(d->duplicate, TRUE); - dt_gui_box_add(box, d->show_preview); - gtk_widget_set_halign(d->show_preview, GTK_ALIGN_END); + dt_gui_box_add(box, d->preview_mode); + gtk_widget_set_halign(d->preview_mode, GTK_ALIGN_END); DT_BAUHAUS_COMBOBOX_NEW_FULL(d->applymode, self, NULL, N_("mode"), _("how to handle existing history"), From 9d5ee42a574aa2c22adb14783961d55934c31d40 Mon Sep 17 00:00:00 2001 From: deekayhd <53017684+deekayhd@users.noreply.github.com> Date: Sun, 8 Feb 2026 14:27:36 +0100 Subject: [PATCH 10/15] add preview mode enum --- data/darktableconfig.xml.in | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/data/darktableconfig.xml.in b/data/darktableconfig.xml.in index e2383e20e4cf..553d19229bbf 100644 --- a/data/darktableconfig.xml.in +++ b/data/darktableconfig.xml.in @@ -1022,6 +1022,19 @@ + + ui_last/styles_preview_mode + + + + + + + + default + + + ui_last/metadata_dialog_width int From a811ace1712e0c8cdc6b1621d9eaf35bd9774261 Mon Sep 17 00:00:00 2001 From: deekayhd <53017684+deekayhd@users.noreply.github.com> Date: Sun, 8 Feb 2026 16:12:15 +0100 Subject: [PATCH 11/15] rename enum constants --- src/common/styles.h | 10 +++++----- src/gui/styles_dialog.c | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/common/styles.h b/src/common/styles.h index 06187711c47c..e930299c755f 100644 --- a/src/common/styles.h +++ b/src/common/styles.h @@ -43,11 +43,11 @@ typedef enum dt_style_applymode_t DT_STYLE_HISTORY_OVERWRITE = 1 } dt_style_applymode_t; -enum PREVIEW_MODE { - PREVIEW_NO, - PREVIEW_DEFAULT, - PREVIEW_LARGE -}; +typedef enum dt_style_previewmode_t { + DT_STYLE_PREVIEW_NO, + DT_STYLE_PREVIEW_DEFAULT, + DT_STYLE_PREVIEW_LARGE +} dt_style_previewmode; typedef struct dt_style_item_t { diff --git a/src/gui/styles_dialog.c b/src/gui/styles_dialog.c index 4ba2b19649a5..814040582fc4 100644 --- a/src/gui/styles_dialog.c +++ b/src/gui/styles_dialog.c @@ -1024,9 +1024,9 @@ GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid) gtk_box_pack_start(GTK_BOX(ht), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), TRUE, TRUE, 0); const int preview_mode = dt_conf_get_int("ui_last/styles_preview_mode"); // style preview - if(!preview_mode==PREVIEW_NO) + if(!preview_mode==DT_STYLE_PREVIEW_NO) { - if(preview_mode==PREVIEW_LARGE) + if(preview_mode==DT_STYLE_PREVIEW_LARGE) { data.psize = dt_conf_get_int("ui/style/large_preview_size"); } From 33413b8a55a544a4491910882b1aef30bf69e3b1 Mon Sep 17 00:00:00 2001 From: deekayhd <53017684+deekayhd@users.noreply.github.com> Date: Sun, 8 Feb 2026 16:22:25 +0100 Subject: [PATCH 12/15] change definition of last preview mode in config xml --- data/darktableconfig.xml.in | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/data/darktableconfig.xml.in b/data/darktableconfig.xml.in index 553d19229bbf..30927eae635e 100644 --- a/data/darktableconfig.xml.in +++ b/data/darktableconfig.xml.in @@ -1024,14 +1024,8 @@ ui_last/styles_preview_mode - - - - - - - - default + int + 1 From d937ae49e4d76b7023ee5699738251a6ff4261fb Mon Sep 17 00:00:00 2001 From: deekayhd <53017684+deekayhd@users.noreply.github.com> Date: Mon, 9 Feb 2026 22:23:30 +0100 Subject: [PATCH 13/15] adjust max for large_preview_size --- data/darktableconfig.xml.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/darktableconfig.xml.in b/data/darktableconfig.xml.in index 30927eae635e..218dd6048641 100644 --- a/data/darktableconfig.xml.in +++ b/data/darktableconfig.xml.in @@ -2386,7 +2386,7 @@ ui/style/large_preview_size - int + int 500 From c18b8aadeca1eb6a3b1fe0bf2a8339225c1d3dd4 Mon Sep 17 00:00:00 2001 From: deekayhd <53017684+deekayhd@users.noreply.github.com> Date: Mon, 9 Feb 2026 22:30:38 +0100 Subject: [PATCH 14/15] fix ci error --- src/gui/styles_dialog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/styles_dialog.c b/src/gui/styles_dialog.c index 814040582fc4..a0d2453c9f10 100644 --- a/src/gui/styles_dialog.c +++ b/src/gui/styles_dialog.c @@ -1024,7 +1024,7 @@ GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid) gtk_box_pack_start(GTK_BOX(ht), gtk_separator_new(GTK_ORIENTATION_HORIZONTAL), TRUE, TRUE, 0); const int preview_mode = dt_conf_get_int("ui_last/styles_preview_mode"); // style preview - if(!preview_mode==DT_STYLE_PREVIEW_NO) + if(preview_mode != DT_STYLE_PREVIEW_NO) { if(preview_mode==DT_STYLE_PREVIEW_LARGE) { From 4079ce8e98d2b933f67f722205462cff2c6c3ca3 Mon Sep 17 00:00:00 2001 From: deekayhd <53017684+deekayhd@users.noreply.github.com> Date: Mon, 9 Feb 2026 22:46:43 +0100 Subject: [PATCH 15/15] fix max value of large_preview_size --- data/darktableconfig.xml.in | 2 +- src/gui/styles_dialog.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/darktableconfig.xml.in b/data/darktableconfig.xml.in index 218dd6048641..dd4fce9e30df 100644 --- a/data/darktableconfig.xml.in +++ b/data/darktableconfig.xml.in @@ -2386,7 +2386,7 @@ ui/style/large_preview_size - int + int 500 diff --git a/src/gui/styles_dialog.c b/src/gui/styles_dialog.c index a0d2453c9f10..253ff4cea9e6 100644 --- a/src/gui/styles_dialog.c +++ b/src/gui/styles_dialog.c @@ -1026,7 +1026,7 @@ GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid) // style preview if(preview_mode != DT_STYLE_PREVIEW_NO) { - if(preview_mode==DT_STYLE_PREVIEW_LARGE) + if(preview_mode == DT_STYLE_PREVIEW_LARGE) { data.psize = dt_conf_get_int("ui/style/large_preview_size"); }