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