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");
}