55#include <gdk/gdkkeysyms.h>
74#include "preferences_gen.h"
75#ifdef GDK_WINDOWING_QUARTZ
96 const int detected = GPOINTER_TO_INT(user_data);
97 const gboolean device_enabled = gtk_toggle_button_get_active(button);
99 restart_required =
TRUE;
104 const int detected = GPOINTER_TO_INT(user_data);
105 const gboolean pinned_memory = gtk_toggle_button_get_active(button);
107 restart_required =
TRUE;
112 const int detected = GPOINTER_TO_INT(user_data);
113 const size_t headroom = gtk_spin_button_get_value_as_int(button);
115 restart_required =
TRUE;
150static void edit_preset(GtkTreeView *tree,
const gint rowid,
const gchar *
name,
const gchar *module);
158 char *themes_dir = g_build_filename(basedir,
"themes", NULL);
159 GDir *dir = g_dir_open(themes_dir, 0, NULL);
165 while((d_name = g_dir_read_name(dir)))
197 const int selected = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
199 gchar *
i = g_strrstr(theme,
".");
207 dt_conf_set_bool(
"themes/usercss", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
213 dt_conf_set_float(
"font_size", gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)));
219 float dpi = gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget));
220 if(dpi > 0.0) dpi = fmax(64, dpi);
222 restart_required =
TRUE;
229 dt_conf_set_bool(
"use_system_font", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
231 gtk_widget_set_state_flags(GTK_WIDGET(user_data), GTK_STATE_FLAG_INSENSITIVE,
TRUE);
233 gtk_widget_set_state_flags(GTK_WIDGET(user_data), GTK_STATE_FLAG_NORMAL,
TRUE);
243 g_snprintf(usercsspath,
sizeof(usercsspath),
"%s/user.css", configdir);
246 GtkTextIter start, end;
247 gtk_text_buffer_get_start_iter(buffer, &start);
248 gtk_text_buffer_get_end_iter(buffer, &end);
249 gchar *usercsscontent = gtk_text_buffer_get_text(buffer, &start, &end,
FALSE);
252 GError *
error = NULL;
253 if(!g_file_set_contents(usercsspath, usercsscontent, -1, &
error))
255 fprintf(stderr,
"%s: error saving css to %s: %s\n", G_STRFUNC, usercsspath,
error->message);
256 g_clear_error(&
error);
264 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tw->
css_text_view));
268 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tw->
apply_toggle)))
284 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tw->
css_text_view));
292 int selected = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
304 restart_required =
TRUE;
309 if(event->type == GDK_2BUTTON_PRESS)
324 gtk_widget_set_valign(grid, GTK_ALIGN_START);
329 gtk_stack_add_titled(GTK_STACK(stack),
container, _(
"general"), _(
"general"));
333 GtkWidget *label = gtk_label_new(_(
"interface language"));
334 gtk_widget_set_halign(label, GTK_ALIGN_START);
335 GtkWidget *labelev = gtk_event_box_new();
336 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
337 gtk_container_add(GTK_CONTAINER(labelev), label);
338 GtkWidget *widget = gtk_combo_box_text_new();
343 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget),
name);
348 gtk_widget_set_tooltip_text(labelev, _(
"double-click to reset to the system language"));
349 gtk_event_box_set_visible_window(GTK_EVENT_BOX(labelev),
FALSE);
350 gtk_widget_set_tooltip_text(widget, _(
"set the language of the user interface. the system default is marked with an * (needs a restart)"));
351 gtk_grid_attach(GTK_GRID(grid), labelev, 0, line++, 1, 1);
352 gtk_grid_attach_next_to(GTK_GRID(grid), widget, labelev, GTK_POS_RIGHT, 1, 1);
353 g_signal_connect(G_OBJECT(labelev),
"button-press-event", G_CALLBACK(
reset_language_widget), (gpointer)widget);
359 label = gtk_label_new(_(
"theme"));
360 gtk_widget_set_halign(label, GTK_ALIGN_START);
361 widget = gtk_combo_box_text_new();
362 labelev = gtk_event_box_new();
363 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
364 gtk_container_add(GTK_CONTAINER(labelev), label);
365 gtk_grid_attach(GTK_GRID(grid), labelev, 0, line++, 1, 1);
366 gtk_grid_attach_next_to(GTK_GRID(grid), widget, labelev, GTK_POS_RIGHT, 1, 1);
374 gchar *
name = g_strdup((gchar*)(iter->data));
376 gchar *
i = g_strrstr(
name,
".");
378 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget),
name);
379 if(!g_strcmp0(
name, theme_name)) selected =
k;
385 gtk_combo_box_set_active(GTK_COMBO_BOX(widget), selected);
387 g_signal_connect(G_OBJECT(widget),
"changed", G_CALLBACK(
theme_callback), 0);
388 gtk_widget_set_tooltip_text(widget, _(
"set the theme for the user interface"));
391 GtkWidget *usesysfont = gtk_check_button_new();
392 GtkWidget *fontsize = gtk_spin_button_new_with_range(5.0f, 30.0f, 0.2f);
397 gtk_widget_set_state_flags(fontsize, GTK_STATE_FLAG_INSENSITIVE,
TRUE);
399 gtk_widget_set_state_flags(fontsize, GTK_STATE_FLAG_NORMAL,
TRUE);
401 label = gtk_label_new(_(
"use system font size"));
402 gtk_widget_set_halign(label, GTK_ALIGN_START);
403 labelev = gtk_event_box_new();
404 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
405 gtk_container_add(GTK_CONTAINER(labelev), label);
406 gtk_grid_attach(GTK_GRID(grid), labelev,
i,
i?2:line++, 1, 1);
407 gtk_grid_attach_next_to(GTK_GRID(grid), usesysfont, labelev, GTK_POS_RIGHT, 1, 1);
408 gtk_widget_set_tooltip_text(usesysfont, _(
"use system font size"));
409 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(usesysfont),
dt_conf_get_bool(
"use_system_font"));
410 g_signal_connect(G_OBJECT(usesysfont),
"toggled", G_CALLBACK(
use_sys_font_callback), (gpointer)fontsize);
417 label = gtk_label_new(_(
"font size in points"));
418 gtk_widget_set_halign(label, GTK_ALIGN_START);
419 labelev = gtk_event_box_new();
420 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
421 gtk_container_add(GTK_CONTAINER(labelev), label);
422 gtk_grid_attach(GTK_GRID(grid), labelev,
i,
i?0:line++, 1, 1);
423 gtk_grid_attach_next_to(GTK_GRID(grid), fontsize, labelev, GTK_POS_RIGHT, 1, 1);
424 gtk_widget_set_tooltip_text(fontsize, _(
"font size in points"));
425 gtk_spin_button_set_value(GTK_SPIN_BUTTON(fontsize),
dt_conf_get_float(
"font_size"));
428 GtkWidget *screen_dpi_overwrite = gtk_spin_button_new_with_range(-1.0f, 360, 1.f);
429 label = gtk_label_new(_(
"GUI controls and text DPI"));
430 gtk_widget_set_halign(label, GTK_ALIGN_START);
431 labelev = gtk_event_box_new();
432 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
433 gtk_container_add(GTK_CONTAINER(labelev), label);
434 gtk_grid_attach(GTK_GRID(grid), labelev,
i,
i?1:line++, 1, 1);
435 gtk_grid_attach_next_to(GTK_GRID(grid), screen_dpi_overwrite, labelev, GTK_POS_RIGHT, 1, 1);
436 gtk_widget_set_tooltip_text(screen_dpi_overwrite, _(
"adjust the global GUI resolution to rescale controls, buttons, labels, etc.\n"
437 "increase for a magnified GUI, decrease to fit more content in window.\n"
438 "set to -1 to use the system-defined global resolution.\n"
439 "default is 96 DPI on most systems.\n"
440 "(needs a restart)."));
441 gtk_spin_button_set_value(GTK_SPIN_BUTTON(screen_dpi_overwrite),
dt_conf_get_float(
"screen_dpi_overwrite"));
445 label = gtk_label_new(_(
"modify selected theme with CSS tweaks below"));
446 gtk_widget_set_halign(label, GTK_ALIGN_START);
448 labelev = gtk_event_box_new();
449 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
450 gtk_container_add(GTK_CONTAINER(labelev), label);
451 gtk_grid_attach(GTK_GRID(grid), labelev, 0, line++, 1, 1);
452 gtk_grid_attach_next_to(GTK_GRID(grid), tw->
apply_toggle, labelev, GTK_POS_RIGHT, 1, 1);
453 gtk_widget_set_tooltip_text(tw->
apply_toggle, _(
"modify theme with CSS keyed below (saved to user.css)"));
460 gtk_widget_set_name(usercssbox,
"usercss-box");
462 GtkTextBuffer *buffer = gtk_text_buffer_new(NULL);
466 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tw->
css_text_view), GTK_WRAP_WORD);
471 GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);
472 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
474 gtk_box_pack_start(GTK_BOX(usercssbox), scroll,
TRUE,
TRUE, 0);
476 tw->
save_button = gtk_button_new_with_label(C_(
"usercss",
"save CSS and apply"));
481 gtk_box_pack_start(GTK_BOX(usercssbox), hbox,
FALSE,
FALSE, 0);
482 gtk_widget_set_tooltip_text(tw->
save_button, _(
"click to save and apply the CSS tweaks entered in this editor"));
487 g_snprintf(usercsspath,
sizeof(usercsspath),
"%s/user.css", configdir);
489 if(g_file_test(usercsspath, G_FILE_TEST_EXISTS))
491 gchar *usercsscontent = NULL;
493 if(g_file_get_contents(usercsspath, &usercsscontent, NULL, NULL))
495 gtk_text_buffer_set_text(buffer, usercsscontent, -1);
500 gchar *errtext = g_strconcat(
"/* ", _(
"ERROR Loading user.css"),
" */", NULL);
501 gtk_text_buffer_set_text(buffer, errtext, -1);
509 gchar *deftext = g_strconcat(
"/* ", _(
"Enter CSS theme tweaks here"),
" */\n\n", NULL);
510 gtk_text_buffer_set_text(buffer, deftext, -1);
520gboolean preferences_window_deleted(
GtkWidget *widget, GdkEvent *event, gpointer data)
529 gtk_widget_hide(widget);
536 GtkAllocation allocation;
537 gtk_widget_get_allocation(widget, &allocation);
539 dt_conf_set_int(
"ui_last/preferences_dialog_height", allocation.height);
546 GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
550 g_signal_connect(G_OBJECT(
_preferences_dialog),
"delete-event", G_CALLBACK(preferences_window_deleted), NULL);
557#ifdef GDK_WINDOWING_QUARTZ
565 gtk_widget_set_name(content,
"preferences-content");
566 gtk_container_set_border_width(GTK_CONTAINER(content), 0);
570 gtk_widget_set_name(box,
"preferences-box");
571 gtk_container_set_border_width(GTK_CONTAINER(box), 0);
572 gtk_box_pack_start(GTK_BOX(content), box,
TRUE,
TRUE, 0);
576 GtkWidget *stacksidebar = gtk_stack_sidebar_new();
577 gtk_stack_sidebar_set_stack(GTK_STACK_SIDEBAR(stacksidebar), GTK_STACK(stack));
578 gtk_box_pack_start(GTK_BOX(box), stacksidebar,
FALSE,
FALSE, 0);
579 gtk_box_pack_start(GTK_BOX(box), stack,
TRUE,
TRUE, 0);
583 restart_required =
FALSE;
594 GtkWidget *scroll = gtk_stack_get_child_by_name(GTK_STACK(stack), _(
"processing"));
595 GtkWidget *viewport = GTK_IS_BIN(scroll) ? gtk_bin_get_child(GTK_BIN(scroll)) : NULL;
596 GtkWidget *grid = GTK_IS_BIN(viewport) ? gtk_bin_get_child(GTK_BIN(viewport)) : NULL;
602 int insert_line = -1;
603 GList *children = gtk_container_get_children(GTK_CONTAINER(grid));
606 for(GList *child = children; child; child = g_list_next(child))
610 gtk_container_child_get(GTK_CONTAINER(grid), GTK_WIDGET(child->data),
"top-attach", &
top,
"height", &
height,
614 if(GTK_IS_CONTAINER(child->data))
618 GList *box_children = gtk_container_get_children(GTK_CONTAINER(child->data));
619 for(GList *box_child = box_children; box_child; box_child = g_list_next(box_child))
621 const char *
name = gtk_widget_get_name(GTK_WIDGET(box_child->data));
628 g_list_free(box_children);
631 g_list_free(children);
637 children = gtk_container_get_children(GTK_CONTAINER(grid));
640 for(GList *child = children; child; child = g_list_next(child))
643 gtk_container_child_get(GTK_CONTAINER(grid), GTK_WIDGET(child->data),
"top-attach", &
top, NULL);
644 if(
top >= insert_line)
645 gtk_container_child_set(GTK_CONTAINER(grid), GTK_WIDGET(child->data),
"top-attach",
648 g_list_free(children);
654 gtk_widget_set_hexpand(devices_box,
TRUE);
655 GtkWidget *devices_grid = gtk_grid_new();
657 gtk_widget_set_hexpand(devices_grid,
TRUE);
658 gtk_box_pack_start(GTK_BOX(devices_box), devices_grid,
FALSE,
FALSE, 0);
662 int devices_line = 0;
663 for(
int dev = 0; dev < detected_devices; dev++)
670 gchar *label_text = g_strdup_printf(
"%d: %s", device->
config_id, device_name);
671 GtkWidget *device_title = gtk_label_new(label_text);
673 gtk_box_pack_start(GTK_BOX(title_box), device_title,
FALSE,
FALSE, 0);
675 gtk_widget_set_name(title_box,
"pref_subsection");
676 gtk_grid_attach(GTK_GRID(devices_grid), title_box, 0, devices_line++, 3, 1);
679 GtkWidget *enable_label = gtk_label_new(_(
"Enable"));
680 gtk_widget_set_halign(enable_label, GTK_ALIGN_START);
681 gtk_widget_set_hexpand(enable_label,
TRUE);
682 gtk_grid_attach(GTK_GRID(devices_grid), enable_label, 0, devices_line, 1, 1);
683 GtkWidget *enable_labdef = gtk_label_new(
"");
684 gtk_widget_set_name(enable_labdef,
"preference_non_default");
685 gtk_grid_attach(GTK_GRID(devices_grid), enable_labdef, 1, devices_line, 1, 1);
689 gtk_widget_set_tooltip_text(
enable, _(
"Enable or disable OpenCL processing for this GPU"));
691 GINT_TO_POINTER(dev));
692 gtk_grid_attach(GTK_GRID(devices_grid),
enable, 2, devices_line++, 1, 1);
694 GtkWidget *pinned_memory_label = gtk_label_new(_(
"pinned memory"));
695 gtk_widget_set_halign(pinned_memory_label, GTK_ALIGN_START);
696 gtk_widget_set_hexpand(pinned_memory_label,
TRUE);
697 gtk_grid_attach(GTK_GRID(devices_grid), pinned_memory_label, 0, devices_line, 1, 1);
698 GtkWidget *pinned_memory_labdef = gtk_label_new(
"");
699 gtk_widget_set_name(pinned_memory_labdef,
"preference_non_default");
700 gtk_grid_attach(GTK_GRID(devices_grid), pinned_memory_labdef, 1, devices_line, 1, 1);
702 GtkWidget *pinned_memory = gtk_check_button_new();
703 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pinned_memory),
705 gtk_widget_set_tooltip_text(pinned_memory, _(
"Use pinned host memory for OpenCL transfers on this GPU"));
707 GINT_TO_POINTER(dev));
708 gtk_grid_attach(GTK_GRID(devices_grid), pinned_memory, 2, devices_line++, 1, 1);
710 GtkWidget *headroom_label = gtk_label_new(_(
"GPU vRAM headroom (MiB)"));
711 gtk_widget_set_halign(headroom_label, GTK_ALIGN_START);
712 gtk_widget_set_hexpand(headroom_label,
TRUE);
713 gtk_grid_attach(GTK_GRID(devices_grid), headroom_label, 0, devices_line, 1, 1);
714 GtkWidget *headroom_labdef = gtk_label_new(
"");
715 gtk_widget_set_name(headroom_labdef,
"preference_non_default");
716 gtk_grid_attach(GTK_GRID(devices_grid), headroom_labdef, 1, devices_line, 1, 1);
718 GtkWidget *headroom = gtk_spin_button_new_with_range(0, G_MAXINT, 1);
719 gtk_widget_set_hexpand(headroom,
FALSE);
720 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(headroom), 0);
722 gtk_widget_set_tooltip_text(headroom, _(
"GPU memory reserved for the system and other applications"));
724 GINT_TO_POINTER(dev));
725 gtk_grid_attach(GTK_GRID(devices_grid), headroom, 2, devices_line++, 1, 1);
728 gtk_grid_attach(GTK_GRID(grid), devices_box, 0, line++, 3, 1);
744 dt_control_log(_(
"Ansel needs to be restarted for settings to take effect"));
751 cairo_destroy((cairo_t *)data);
756 GtkTreeIter iter, parent;
758 gchar *last_module = NULL;
764 cairo_t *lock_cr = cairo_create(lock_cst);
765 cairo_set_source_rgb(lock_cr, 0.7, 0.7, 0.7);
767 cairo_surface_flush(lock_cst);
768 guchar *data = cairo_image_surface_get_data(lock_cst);
770 GdkPixbuf *lock_pixbuf = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB,
TRUE, 8,
772 cairo_image_surface_get_stride(lock_cst),
778 cairo_t *check_cr = cairo_create(check_cst);
779 cairo_set_source_rgb(check_cr, 0.7, 0.7, 0.7);
781 cairo_surface_flush(check_cst);
782 data = cairo_image_surface_get_data(check_cst);
784 GdkPixbuf *check_pixbuf = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB,
TRUE, 8,
786 cairo_image_surface_get_stride(check_cst),
790 "SELECT rowid, name, operation, autoapply, model, maker, lens, iso_min, "
791 "iso_max, exposure_min, exposure_max, aperture_min, aperture_max, "
792 "focal_length_min, focal_length_max, writeprotect FROM data.presets ORDER BY "
796 while(sqlite3_step(stmt) == SQLITE_ROW)
798 const gint rowid = sqlite3_column_int(stmt, 0);
799 const gchar *
name = (gchar *)sqlite3_column_text(stmt, 1);
800 const gchar *operation = (gchar *)sqlite3_column_text(stmt, 2);
801 const gboolean autoapply = (sqlite3_column_int(stmt, 3) == 0 ?
FALSE :
TRUE);
802 const gchar *
model = (gchar *)sqlite3_column_text(stmt, 4);
803 const gchar *
maker = (gchar *)sqlite3_column_text(stmt, 5);
804 const gchar *lens = (gchar *)sqlite3_column_text(stmt, 6);
805 const float iso_min = sqlite3_column_double(stmt, 7);
806 const float iso_max = sqlite3_column_double(stmt, 8);
807 const float exposure_min = sqlite3_column_double(stmt, 9);
808 const float exposure_max = sqlite3_column_double(stmt, 10);
809 const float aperture_min = sqlite3_column_double(stmt, 11);
810 const float aperture_max = sqlite3_column_double(stmt, 12);
811 const int focal_length_min = sqlite3_column_double(stmt, 13);
812 const int focal_length_max = sqlite3_column_double(stmt, 14);
813 const gboolean writeprotect = (sqlite3_column_int(stmt, 15) == 0 ?
FALSE :
TRUE);
815 gchar *iso = NULL, *exposure = NULL, *aperture = NULL, *focal_length = NULL, *smaker = NULL, *smodel = NULL, *slens = NULL;
818 gchar *
module = g_strdup(dt_iop_get_localized_name(operation));
820 if(
IS_NULL_PTR(module)) module = g_strdup(operation);
825 exposure = g_strdup(
"");
826 aperture = g_strdup(
"");
827 focal_length = g_strdup(
"");
828 smaker = g_strdup(
"");
829 smodel = g_strdup(
"");
830 slens = g_strdup(
"");
834 smaker = g_strdup(
maker);
835 smodel = g_strdup(
model);
836 slens = g_strdup(lens);
841 iso = g_strdup_printf(
"%" G_GSIZE_FORMAT
" - %" G_GSIZE_FORMAT
"", (
size_t)
iso_min, (
size_t)
iso_max);
848 exposure = g_strdup(
"%");
858 aperture = g_strdup(
"%");
863 if(focal_length_min == 0.0 && focal_length_max == 1000.0)
864 focal_length = g_strdup(
"%");
866 focal_length = g_strdup_printf(
"%d - %d", focal_length_min, focal_length_max);
869 if(g_strcmp0(last_module, operation) != 0)
871 gtk_tree_store_insert_with_values(tree_model, &iter, NULL, -1,
877 last_module = g_strdup(operation);
881 gtk_tree_store_insert_with_values(tree_model, &iter, &parent, -1,
887 autoapply ? check_pixbuf : NULL, -1);
899 sqlite3_finalize(stmt);
901 g_object_unref(lock_pixbuf);
902 cairo_surface_destroy(lock_cst);
903 g_object_unref(check_pixbuf);
904 cairo_surface_destroy(check_cst);
907static gboolean
_search_func(GtkTreeModel *
model, gint column,
const gchar *
key, GtkTreeIter *iter, gpointer search_data)
909 gchar *key_case = g_utf8_casefold(
key, -1), *label = NULL;
912 gchar *name_case = g_utf8_casefold(label, -1);
915 gchar *module_case = g_utf8_casefold(label, -1);
918 const gboolean different = !((name_case && strstr(name_case, key_case))
919 || (module_case && strstr(module_case, key_case)));
927 GtkTreePath *path = gtk_tree_model_get_path(
model, iter);
928 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(search_data), path);
929 gtk_tree_path_free(path);
935 if(gtk_tree_model_iter_children(
model, &child, iter))
941 while(gtk_tree_model_iter_next(
model, &child));
950 GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);
951 GtkTreeView *tree = GTK_TREE_VIEW(gtk_tree_view_new());
952 GtkTreeStore *
model = gtk_tree_store_new(
953 P_N_COLUMNS, G_TYPE_INT , G_TYPE_STRING , G_TYPE_STRING ,
954 GDK_TYPE_PIXBUF , G_TYPE_STRING , G_TYPE_STRING , G_TYPE_STRING ,
955 G_TYPE_STRING , G_TYPE_STRING , G_TYPE_STRING , G_TYPE_STRING ,
956 G_TYPE_STRING , GDK_TYPE_PIXBUF );
957 GtkCellRenderer *renderer;
958 GtkTreeViewColumn *column;
961 gtk_stack_add_titled(GTK_STACK(stack),
container, _(
"presets"), _(
"presets"));
966 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(
model),
P_MODULE_COLUMN, GTK_SORT_ASCENDING);
970 renderer = gtk_cell_renderer_text_new();
971 column = gtk_tree_view_column_new_with_attributes(_(
"module"), renderer,
"text",
P_MODULE_COLUMN, NULL);
972 gtk_tree_view_append_column(tree, column);
974 renderer = gtk_cell_renderer_pixbuf_new();
975 column = gtk_tree_view_column_new_with_attributes(
"", renderer,
"pixbuf",
P_EDITABLE_COLUMN, NULL);
976 gtk_tree_view_append_column(tree, column);
978 renderer = gtk_cell_renderer_text_new();
979 column = gtk_tree_view_column_new_with_attributes(_(
"name"), renderer,
"text",
P_NAME_COLUMN, NULL);
980 gtk_tree_view_append_column(tree, column);
982 renderer = gtk_cell_renderer_text_new();
983 column = gtk_tree_view_column_new_with_attributes(_(
"model"), renderer,
"text",
P_MODEL_COLUMN, NULL);
984 gtk_tree_view_append_column(tree, column);
986 renderer = gtk_cell_renderer_text_new();
987 column = gtk_tree_view_column_new_with_attributes(_(
"maker"), renderer,
"text",
P_MAKER_COLUMN, NULL);
988 gtk_tree_view_append_column(tree, column);
990 renderer = gtk_cell_renderer_text_new();
991 column = gtk_tree_view_column_new_with_attributes(_(
"lens"), renderer,
"text",
P_LENS_COLUMN, NULL);
992 gtk_tree_view_append_column(tree, column);
994 renderer = gtk_cell_renderer_text_new();
995 column = gtk_tree_view_column_new_with_attributes(_(
"ISO"), renderer,
"text",
P_ISO_COLUMN, NULL);
996 gtk_tree_view_append_column(tree, column);
998 renderer = gtk_cell_renderer_text_new();
999 column = gtk_tree_view_column_new_with_attributes(_(
"exposure"), renderer,
"text",
P_EXPOSURE_COLUMN, NULL);
1000 gtk_tree_view_append_column(tree, column);
1002 renderer = gtk_cell_renderer_text_new();
1003 column = gtk_tree_view_column_new_with_attributes(_(
"aperture"), renderer,
"text",
P_APERTURE_COLUMN, NULL);
1004 gtk_tree_view_append_column(tree, column);
1006 renderer = gtk_cell_renderer_text_new();
1007 column = gtk_tree_view_column_new_with_attributes(_(
"focal length"), renderer,
"text",
1009 gtk_tree_view_append_column(tree, column);
1011 renderer = gtk_cell_renderer_pixbuf_new();
1012 column = gtk_tree_view_column_new_with_attributes(_(
"auto"), renderer,
"pixbuf",
P_AUTOAPPLY_COLUMN, NULL);
1013 gtk_tree_view_append_column(tree, column);
1015 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1020 gtk_widget_set_name(hbox,
"preset_controls");
1022 GtkWidget *search_presets = gtk_search_entry_new();
1025 gtk_box_pack_start(GTK_BOX(hbox), search_presets,
FALSE,
TRUE, 0);
1026 gtk_entry_set_placeholder_text(GTK_ENTRY(search_presets), _(
"search presets list"));
1027 gtk_widget_set_tooltip_text(GTK_WIDGET(search_presets), _(
"incrementally search the list of presets\npress up or down keys to cycle through matches"));
1028 g_signal_connect(G_OBJECT(search_presets),
"activate", G_CALLBACK(
dt_gui_search_stop), tree);
1029 g_signal_connect(G_OBJECT(search_presets),
"stop-search", G_CALLBACK(
dt_gui_search_stop), tree);
1030 g_signal_connect(G_OBJECT(tree),
"key-press-event", G_CALLBACK(
dt_gui_search_start), search_presets);
1031 gtk_tree_view_set_search_entry(tree, GTK_ENTRY(search_presets));
1033 GtkWidget *button = gtk_button_new_with_label(C_(
"preferences",
"import..."));
1034 gtk_box_pack_end(GTK_BOX(hbox), button,
FALSE,
TRUE, 0);
1035 g_signal_connect(G_OBJECT(button),
"clicked", G_CALLBACK(
import_preset), (gpointer)
model);
1037 button = gtk_button_new_with_label(C_(
"preferences",
"export..."));
1038 gtk_box_pack_end(GTK_BOX(hbox), button,
FALSE,
TRUE, 0);
1039 g_signal_connect(G_OBJECT(button),
"clicked", G_CALLBACK(
export_preset), (gpointer)
model);
1052 gtk_tree_view_set_search_equal_func(tree,
_search_func, tree, NULL);
1055 gtk_tree_view_set_model(tree, GTK_TREE_MODEL(
model));
1059 gtk_container_add(GTK_CONTAINER(scroll), GTK_WIDGET(tree));
1060 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1062 g_object_unref(G_OBJECT(
model));
1073 GtkTreeModel *
model = gtk_tree_view_get_model(tree);
1075 gtk_tree_model_get_iter(
model, &iter, path);
1077 if(gtk_tree_model_iter_has_child(
model, &iter))
1080 if(gtk_tree_view_row_expanded(tree, path))
1081 gtk_tree_view_collapse_row(tree, path);
1083 gtk_tree_view_expand_row(tree, path,
FALSE);
1089 gchar *
name, *operation;
1090 GdkPixbuf *editable;
1096 g_object_unref(editable);
1107 GtkTreeModel *
model = (GtkTreeModel *)data;
1109 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
1112 if(event->is_modifier)
return FALSE;
1115 if(
key == GDK_KEY_Delete ||
key == GDK_KEY_BackSpace)
1120 if(!gtk_tree_selection_get_selected(selection, &
model, &iter)
1121 || gtk_tree_model_iter_has_child(
model, &iter))
1127 GdkPixbuf *editable;
1133 gchar* operation = NULL;
1136 "SELECT name, operation FROM data.presets WHERE rowid = ?1",
1139 if(sqlite3_step(stmt) == SQLITE_ROW)
1141 operation = g_strdup( (
const char*)sqlite3_column_text(stmt,1));
1143 sqlite3_finalize(stmt);
1147 GtkTreeStore *tree_store = GTK_TREE_STORE(
model);
1148 gtk_tree_store_clear(tree_store);
1157 g_object_unref(editable);
1179 GtkTreeModel *
model = (GtkTreeModel *)data;
1180 GtkWindow *win = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button)));
1183 GtkFileChooserNative *chooser = gtk_file_chooser_native_new(
1184 _(
"select preset(s) to import"), GTK_WINDOW(win), GTK_FILE_CHOOSER_ACTION_OPEN,
1185 _(
"_open"), _(
"_cancel"));
1188 gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(chooser),
TRUE);
1190 GtkFileFilter *filter;
1191 filter = GTK_FILE_FILTER(gtk_file_filter_new());
1192 gtk_file_filter_add_pattern(filter,
"*.dtpreset");
1193 gtk_file_filter_add_pattern(filter,
"*.DTPRESET");
1194 gtk_file_filter_set_name(filter, _(
"Ansel preset files"));
1195 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter);
1197 filter = GTK_FILE_FILTER(gtk_file_filter_new());
1198 gtk_file_filter_add_pattern(filter,
"*");
1199 gtk_file_filter_set_name(filter, _(
"all files"));
1201 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter);
1203 if(gtk_native_dialog_run(GTK_NATIVE_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT)
1205 GSList *filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(chooser));
1209 GtkTreeStore *tree_store = GTK_TREE_STORE(
model);
1210 gtk_tree_store_clear(tree_store);
1215 g_object_unref(chooser);
1220 GtkWindow *win = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button)));
1222 GtkFileChooserNative *filechooser = gtk_file_chooser_native_new(
1223 _(
"select directory"), GTK_WINDOW(win), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1224 _(
"_save"), _(
"_cancel"));
1228 if(gtk_native_dialog_run(GTK_NATIVE_DIALOG(filechooser)) == GTK_RESPONSE_ACCEPT)
1230 gchar *filedir = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser));
1237 "SELECT rowid, name, operation FROM data.presets WHERE writeprotect = 0",
1240 while(sqlite3_step(stmt) == SQLITE_ROW)
1242 const gint rowid = sqlite3_column_int(stmt, 0);
1243 const gchar *
name = (gchar *)sqlite3_column_text(stmt, 1);
1244 const gchar *operation = (gchar *)sqlite3_column_text(stmt, 2);
1245 gchar* preset_name = g_strdup_printf(
"%s_%s", operation,
name);
1252 sqlite3_finalize(stmt);
1260 g_object_unref(filechooser);
1271 if(*a_text ==
'\0' && *b_text ==
'\0')
1280 const int res = strcoll(a_text, b_text);
1290 GtkTreeStore *tree_store = GTK_TREE_STORE(gtk_tree_view_get_model((GtkTreeView *)
g->data));
1291 gtk_tree_store_clear(tree_store);
1295static void edit_preset(GtkTreeView *tree,
const gint rowid,
const gchar *
name,
const gchar *module)
1304 dt_conf_set_bool((
char *)data, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
1309 const char *
key = gtk_widget_get_name(widget);
1311 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), def);
1317 if(event->type == GDK_2BUTTON_PRESS)
1327 const char *
key = gtk_widget_get_name(widget);
1329 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), val);
1333 const guint line,
const gboolean
swap)
1337 GtkWidget *labelev = gtk_event_box_new();
1338 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1339 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1342 gtk_grid_attach(GTK_GRID(grid), labelev,
swap ? (col + 1) : col, line, 1, 1);
1343 gtk_grid_attach(GTK_GRID(grid), w,
swap ? col : (col + 1), line, 1, 1);
1352 dt_conf_set_int((
char *)data, gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)));
1357 const char *
key = gtk_widget_get_name(widget);
1359 gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), def);
1365 if(event->type == GDK_2BUTTON_PRESS)
1375 const char *
key = gtk_widget_get_name(widget);
1377 gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), val);
1385 GtkWidget *labelev = gtk_event_box_new();
1386 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1387 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1391 gtk_widget_set_hexpand(w,
FALSE);
1392 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(w), 0);
1394 gtk_grid_attach(GTK_GRID(grid), labelev, col, line, 1, 1);
1395 gtk_grid_attach(GTK_GRID(grid), w, col + 1, line, 1, 1);
1405 if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter))
1408 gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(widget)), &iter, 0, &s, -1);
1416 GtkTreeModel *
model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
1418 gboolean valid = gtk_tree_model_get_iter_first(
model, &iter);
1420 gboolean found =
FALSE;
1424 gtk_tree_model_get(
model, &iter, 0, &
value, -1);
1425 if(!g_strcmp0(
value, str))
1433 valid = gtk_tree_model_iter_next(
model, &iter);
1436 gtk_combo_box_set_active(GTK_COMBO_BOX(widget),
i);
1441 const char *
key = gtk_widget_get_name(widget);
1449 if(event->type == GDK_2BUTTON_PRESS)
1459 const char *
key = gtk_widget_get_name(widget);
1470 GtkWidget *labelev = gtk_event_box_new();
1471 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1472 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1475 GtkListStore *
store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
1481 for(GList *val = vals; val; val = g_list_next(val))
1483 char *item = (
char *)val->data;
1485 if(item[0] ==
'[') item++;
1486 else if(item[strlen(item) - 1] ==
']') item[strlen(item) - 1] =
'\0';
1487 gtk_list_store_append(
store, &iter);
1488 gtk_list_store_set(
store, &iter, 0, item, 1, g_dpgettext2(NULL,
"preferences", item), -1);
1489 if(pos == -1 && !g_strcmp0(str, item))
1499 GtkWidget *w = gtk_combo_box_new_with_model(GTK_TREE_MODEL(
store));
1500 gtk_widget_set_hexpand(w,
FALSE);
1501 g_object_unref(
store);
1502 GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
1503 gtk_cell_renderer_set_padding(renderer, 0, 0);
1504 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(w), renderer,
TRUE);
1505 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(w), renderer,
"text", 1, NULL);
1506 gtk_combo_box_set_active(GTK_COMBO_BOX(w), pos);
1508 gtk_grid_attach(GTK_GRID(grid), labelev, col, line, 1, 1);
1509 gtk_grid_attach(GTK_GRID(grid), w, col + 1, line, 1, 1);
1518 const char *str = gtk_entry_get_text(GTK_ENTRY(widget));
1524 const char *
key = gtk_widget_get_name(widget);
1526 gtk_entry_set_text(GTK_ENTRY(widget), str);
1532 if(event->type == GDK_2BUTTON_PRESS)
1542 const char *
key = gtk_widget_get_name(widget);
1544 gtk_entry_set_text(GTK_ENTRY(widget), str);
1552 GtkWidget *labelev = gtk_event_box_new();
1553 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1554 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1559 gtk_entry_set_text(GTK_ENTRY(w), str);
1560 gtk_widget_set_hexpand(w,
TRUE);
1562 gtk_grid_attach(GTK_GRID(grid), labelev, col, line, 1, 1);
1563 gtk_grid_attach(GTK_GRID(grid), w, col, line + 1, 1, 1);
static void error(char *msg)
uint32_t container(dt_lib_module_t *self)
void dt_bauhaus_load_theme(dt_bauhaus_t *bauhaus)
static const float const float const float min
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
int dt_presets_import_from_file(const char *preset_path)
void dt_presets_save_to_file(const int rowid, const char *preset_name, const char *filedir)
gboolean dt_presets_module_can_autoapply(const gchar *operation)
void dt_conf_set_bool(const char *name, int val)
int dt_conf_get_bool(const char *name)
void dt_conf_set_float(const char *name, float val)
float dt_conf_get_float(const char *name)
const char * dt_confgen_get_tooltip(const char *name)
gchar * dt_conf_get_string(const char *name)
void dt_conf_set_int(const char *name, int val)
gboolean dt_confgen_get_bool(const char *name, dt_confgen_value_kind_t kind)
int dt_conf_get_int(const char *name)
int dt_confgen_get_int(const char *name, dt_confgen_value_kind_t kind)
void dt_conf_set_string(const char *name, const char *val)
const char * dt_conf_get_string_const(const char *name)
const char * dt_confgen_get(const char *name, dt_confgen_value_kind_t kind)
void dt_conf_set_folder_from_file_chooser(const char *name, GtkFileChooser *chooser)
const char * dt_confgen_get_label(const char *name)
gboolean dt_conf_get_folder_to_file_chooser(const char *name, GtkFileChooser *chooser)
void dt_control_log(const char *msg,...)
void dt_print(dt_debug_thread_t thread, const char *msg,...)
static void dt_free_gpointer(gpointer ptr)
static const dt_aligned_pixel_simd_t value
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
sqlite3 * dt_database_get(const dt_database_t *db)
#define dt_database_start_transaction(db)
#define dt_database_release_transaction(db)
#define DT_DEBUG_SQLITE3_PREPARE_V2(a, b, c, d, e)
#define DT_DEBUG_SQLITE3_BIND_INT(a, b, c)
int store(dt_imageio_module_storage_t *self, dt_imageio_module_data_t *sdata, const int32_t imgid, dt_imageio_module_format_t *format, dt_imageio_module_data_t *fdata, const int num, const int total, const gboolean high_quality, const gboolean export_masks, dt_colorspaces_color_profile_type_t icc_type, const gchar *icc_filename, dt_iop_color_intent_t icc_intent, dt_export_metadata_t *metadata)
static void dt_draw_cairo_to_gdk_pixbuf(uint8_t *data, unsigned int width, unsigned int height)
void dtgtk_cairo_paint_lock(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_check_mark(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dt_loc_get_datadir(char *datadir, size_t bufsize)
void dt_loc_get_user_config_dir(char *configdir, size_t bufsize)
static guint dt_keys_mainpad_alternatives(const guint key_val)
Remap keypad keys to usual mainpad ones.
void dt_gui_search_stop(GtkSearchEntry *entry, GtkWidget *widget)
void dt_gui_textview_set_padding(GtkTextView *textview)
Apply the standard recessed-input text padding to a GtkTextView.
void dt_gui_load_theme(const char *theme)
void dt_configure_ppd_dpi(dt_gui_gtk_t *gui)
gboolean dt_gui_search_start(GtkWidget *widget, GdkEventKey *event, GtkSearchEntry *entry)
void dt_accels_disconnect_on_text_input(GtkWidget *widget)
Disconnects accels when a text or search entry gets the focus, and reconnects them when it looses it....
void dt_gui_add_class(GtkWidget *widget, const gchar *class_name)
GtkWidget * dt_ui_center(dt_ui_t *ui)
get the center drawable widget
GtkWidget * dt_ui_main_window(dt_ui_t *ui)
get the main window widget
#define DT_GUI_BOX_SPACING
#define DT_PIXEL_APPLY_DPI(value)
static GtkWidget * dt_ui_label_new(const gchar *str)
void dt_gui_presets_show_edit_dialog(const char *name_in, const char *module_name, int rowid, GCallback final_callback, gpointer data, gboolean allow_name_change, gboolean allow_desc_change, gboolean allow_remove, GtkWindow *parent)
void dt_gui_presets_confirm_and_delete(GtkWidget *parent_dialog, const char *name, const char *module_name, int rowid)
static gboolean enable(dt_image_t *image)
const char * dt_l10n_get_name(const dt_l10n_language_t *language)
gchar * dt_lib_get_localized_name(const gchar *plugin_name)
static void swap(float *x, float *y)
float *const restrict const size_t k
int dt_opencl_set_detected_device_enabled(const int detected, const gboolean enabled)
gboolean dt_opencl_detected_device_pinned_memory(const int detected)
int dt_opencl_set_detected_device_headroom(const int detected, const size_t headroom)
int dt_opencl_get_detected_device_count(void)
int dt_opencl_set_detected_device_pinned_memory(const int detected, const gboolean enabled)
const dt_opencl_detected_device_t * dt_opencl_get_detected_device(const int detected)
size_t dt_opencl_detected_device_headroom(const int detected)
gboolean dt_opencl_detected_device_enabled(const int detected)
void dt_osx_disallow_fullscreen(GtkWidget *widget)
static void _resize_dialog(GtkWidget *widget)
static void cairo_destroy_from_pixbuf(guchar *pixels, gpointer data)
static gboolean _gui_preferences_bool_reset(GtkWidget *label, GdkEventButton *event, GtkWidget *widget)
static void tree_selection_changed(GtkTreeSelection *selection, gpointer data)
static void _opencl_device_pinned_memory_callback(GtkToggleButton *button, gpointer user_data)
static void _gui_preferences_bool_callback(GtkWidget *widget, gpointer data)
void dt_gui_preferences_enum_reset(GtkWidget *widget)
void dt_gui_preferences_string_reset(GtkWidget *widget)
static void _gui_preferences_enum_callback(GtkWidget *widget, gpointer data)
const int dt_gui_presets_exposure_value_cnt
void dt_gui_preferences_show()
static gboolean tree_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data)
static void language_callback(GtkWidget *widget, gpointer user_data)
static gboolean tree_key_press_presets(GtkWidget *widget, GdkEventKey *event, gpointer data)
static void use_sys_font_callback(GtkWidget *widget, gpointer user_data)
static void dpi_scaling_changed_callback(GtkWidget *widget, gpointer user_data)
void dt_gui_preferences_string_update(GtkWidget *widget)
static void save_usercss(GtkTextBuffer *buffer)
static void load_themes_dir(const char *basedir)
const float dt_gui_presets_aperture_value[]
static void usercss_dialog_callback(GtkDialog *dialog, gint response_id, gpointer user_data)
const int dt_gui_presets_aperture_value_cnt
static void _opencl_device_enabled_callback(GtkToggleButton *button, gpointer user_data)
static GtkWidget * _preferences_dialog
static void import_preset(GtkButton *button, gpointer data)
static void edit_preset_response(dt_gui_presets_edit_dialog_t *g)
void dt_gui_preferences_int_update(GtkWidget *widget)
static void init_tab_presets(GtkWidget *stack)
static void _gui_preferences_int_callback(GtkWidget *widget, gpointer data)
const char * dt_gui_presets_exposure_value_str[]
static void tree_row_activated_presets(GtkTreeView *tree, GtkTreePath *path, GtkTreeViewColumn *column, gpointer data)
static void export_preset(GtkButton *button, gpointer data)
static void _gui_preferences_string_callback(GtkWidget *widget, gpointer data)
static void reload_ui_last_theme(void)
static gboolean reset_language_widget(GtkWidget *label, GdkEventButton *event, GtkWidget *widget)
static void theme_callback(GtkWidget *widget, gpointer user_data)
static void init_tab_general(GtkWidget *dialog, GtkWidget *stack, dt_gui_themetweak_widgets_t *tw)
static gint compare_rows_presets(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data)
void dt_gui_preferences_bool_reset(GtkWidget *widget)
void dt_gui_preferences_int_reset(GtkWidget *widget)
void _gui_preferences_enum_set(GtkWidget *widget, const char *str)
static void edit_preset(GtkTreeView *tree, const gint rowid, const gchar *name, const gchar *module)
static gboolean _gui_preferences_string_reset(GtkWidget *label, GdkEventButton *event, GtkWidget *widget)
const char * dt_gui_presets_aperture_value_str[]
void dt_gui_preferences_enum_update(GtkWidget *widget)
static void save_usercss_callback(GtkWidget *widget, gpointer user_data)
GtkWidget * dt_gui_preferences_int(GtkGrid *grid, const char *key, const guint col, const guint line)
const float dt_gui_presets_exposure_value[]
static gboolean _gui_preferences_enum_reset(GtkWidget *label, GdkEventButton *event, GtkWidget *widget)
static void font_size_changed_callback(GtkWidget *widget, gpointer user_data)
static void tree_insert_presets(GtkTreeStore *tree_model)
GtkWidget * dt_gui_preferences_string(GtkGrid *grid, const char *key, const guint col, const guint line)
static gboolean _search_func(GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer search_data)
static void load_themes(void)
static void usercss_callback(GtkWidget *widget, gpointer user_data)
GtkWidget * dt_gui_preferences_enum(GtkGrid *grid, const char *key, const guint col, const guint line)
GtkWidget * dt_gui_preferences_bool(GtkGrid *grid, const char *key, const guint col, const guint line, const gboolean swap)
static void _import_preset_from_file(const gchar *filename)
void dt_gui_preferences_bool_update(GtkWidget *widget)
static gboolean _gui_preferences_int_reset(GtkWidget *label, GdkEventButton *event, GtkWidget *widget)
static void _opencl_device_headroom_callback(GtkSpinButton *button, gpointer user_data)
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
@ DT_SIGNAL_PREFERENCES_CHANGE
This signal is raised after preferences have been changed no parameters no return.
struct _GtkWidget GtkWidget
struct dt_gui_gtk_t * gui
const struct dt_database_t * db
struct dt_control_signal_t * signals
struct dt_bauhaus_t * bauhaus
GList * dt_util_str_to_glist(const gchar *separator, const gchar *text)