diff --git a/data/darktableconfig.xml.in b/data/darktableconfig.xml.in
index 8e106a6e1557..dd4fce9e30df 100644
--- a/data/darktableconfig.xml.in
+++ b/data/darktableconfig.xml.in
@@ -1022,6 +1022,13 @@
+
+ ui_last/styles_preview_mode
+ int
+ 1
+
+
+
ui_last/metadata_dialog_width
int
@@ -2377,6 +2384,12 @@
250
max style preview size
+
+ ui/style/large_preview_size
+ int
+ 500
+
+
ui_last/expander_metadata
int
diff --git a/src/common/styles.h b/src/common/styles.h
index 237abc79697b..e930299c755f 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;
+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
{
int num, selimg_num, enabled, multi_priority;
diff --git a/src/gui/styles.h b/src/gui/styles.h
index bf35db8c514a..cd8b6b38476c 100644
--- a/src/gui/styles.h
+++ b/src/gui/styles.h
@@ -35,7 +35,7 @@ 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);
diff --git a/src/gui/styles_dialog.c b/src/gui/styles_dialog.c
index 6eec005c8c1d..253ff4cea9e6 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));
@@ -914,7 +915,7 @@ static gboolean _preview_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data
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,24 +1022,33 @@ GtkWidget *dt_gui_style_content_dialog(char *name, const dt_imgid_t imgid)
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
- 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(preview_mode != DT_STYLE_PREVIEW_NO)
+ {
+ if(preview_mode == DT_STYLE_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, 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);
+ data.first_draw = TRUE;
+ g_signal_connect(G_OBJECT(da), "draw", G_CALLBACK(_preview_draw), &data);
+ }
}
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 2dbc8aaf3a85..835738be3674 100644
--- a/src/libs/styles.c
+++ b/src/libs/styles.c
@@ -45,9 +45,9 @@ typedef struct dt_lib_styles_t
GtkTreeView *tree;
GtkWidget *create_button, *edit_button, *delete_button;
GtkWidget *import_button, *export_button, *applymode, *apply_button;
+ GtkWidget *preview_mode;
} dt_lib_styles_t;
-
const char *name(dt_lib_module_t *self)
{
return _("styles");
@@ -159,7 +159,7 @@ 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);
dt_action_define(&darktable.control->actions_global, "styles", name, widget, NULL);
@@ -770,6 +770,12 @@ static void _applymode_combobox_changed(GtkWidget *widget, gpointer user_data)
dt_conf_set_int("plugins/lighttable/style/applymode", mode);
}
+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);
+}
+
void gui_update(dt_lib_module_t *self)
{
dt_lib_styles_t *d = self->data;
@@ -861,7 +867,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);
@@ -872,6 +877,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"));
+ 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,
+ 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->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"),
dt_conf_get_int("plugins/lighttable/style/applymode"),
@@ -925,7 +943,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,
+ 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);