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;
103 GList *dependents = (GList *)g_object_get_data(G_OBJECT(button),
"dependent-widgets");
104 for(GList *l = dependents; l; l = l->next) gtk_widget_set_sensitive(GTK_WIDGET(l->data), device_enabled);
111 const int detected = GPOINTER_TO_INT(user_data);
112 const gboolean pinned_memory = gtk_toggle_button_get_active(button);
119 const int detected = GPOINTER_TO_INT(user_data);
120 const size_t headroom = gtk_spin_button_get_value_as_int(button);
156static void edit_preset(GtkTreeView *tree,
const gint rowid,
const gchar *
name,
const gchar *module);
164 char *themes_dir = g_build_filename(basedir,
"themes", NULL);
165 GDir *dir = g_dir_open(themes_dir, 0, NULL);
171 while((d_name = g_dir_read_name(dir)))
203 const int selected = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
205 gchar *
i = g_strrstr(theme,
".");
213 dt_conf_set_bool(
"themes/usercss", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
219 dt_conf_set_float(
"font_size", gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)));
225 float dpi = gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget));
226 if(dpi > 0.0) dpi = fmax(64, dpi);
228 restart_required =
TRUE;
235 dt_conf_set_bool(
"use_system_font", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
237 gtk_widget_set_state_flags(GTK_WIDGET(user_data), GTK_STATE_FLAG_INSENSITIVE,
TRUE);
239 gtk_widget_set_state_flags(GTK_WIDGET(user_data), GTK_STATE_FLAG_NORMAL,
TRUE);
249 g_snprintf(usercsspath,
sizeof(usercsspath),
"%s/user.css", configdir);
252 GtkTextIter start, end;
253 gtk_text_buffer_get_start_iter(buffer, &start);
254 gtk_text_buffer_get_end_iter(buffer, &end);
255 gchar *usercsscontent = gtk_text_buffer_get_text(buffer, &start, &end,
FALSE);
258 GError *
error = NULL;
259 if(!g_file_set_contents(usercsspath, usercsscontent, -1, &
error))
261 fprintf(stderr,
"%s: error saving css to %s: %s\n", G_STRFUNC, usercsspath,
error->message);
262 g_clear_error(&
error);
270 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tw->
css_text_view));
274 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tw->
apply_toggle)))
290 GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(tw->
css_text_view));
298 int selected = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
310 restart_required =
TRUE;
315 if(event->type == GDK_2BUTTON_PRESS)
330 gtk_widget_set_valign(grid, GTK_ALIGN_START);
335 gtk_stack_add_titled(GTK_STACK(stack),
container, _(
"general"), _(
"general"));
339 GtkWidget *label = gtk_label_new(_(
"interface language"));
340 gtk_widget_set_halign(label, GTK_ALIGN_START);
341 GtkWidget *labelev = gtk_event_box_new();
342 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
343 gtk_container_add(GTK_CONTAINER(labelev), label);
344 GtkWidget *widget = gtk_combo_box_text_new();
349 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget),
name);
354 gtk_widget_set_tooltip_text(labelev, _(
"double-click to reset to the system language"));
355 gtk_event_box_set_visible_window(GTK_EVENT_BOX(labelev),
FALSE);
356 gtk_widget_set_tooltip_text(widget, _(
"set the language of the user interface. the system default is marked with an * (needs a restart)"));
357 gtk_grid_attach(GTK_GRID(grid), labelev, 0, line++, 1, 1);
358 gtk_grid_attach_next_to(GTK_GRID(grid), widget, labelev, GTK_POS_RIGHT, 1, 1);
359 g_signal_connect(G_OBJECT(labelev),
"button-press-event", G_CALLBACK(
reset_language_widget), (gpointer)widget);
365 label = gtk_label_new(_(
"theme"));
366 gtk_widget_set_halign(label, GTK_ALIGN_START);
367 widget = gtk_combo_box_text_new();
368 labelev = gtk_event_box_new();
369 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
370 gtk_container_add(GTK_CONTAINER(labelev), label);
371 gtk_grid_attach(GTK_GRID(grid), labelev, 0, line++, 1, 1);
372 gtk_grid_attach_next_to(GTK_GRID(grid), widget, labelev, GTK_POS_RIGHT, 1, 1);
380 gchar *
name = g_strdup((gchar*)(iter->data));
382 gchar *
i = g_strrstr(
name,
".");
384 gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget),
name);
385 if(!g_strcmp0(
name, theme_name)) selected =
k;
391 gtk_combo_box_set_active(GTK_COMBO_BOX(widget), selected);
393 g_signal_connect(G_OBJECT(widget),
"changed", G_CALLBACK(
theme_callback), 0);
394 gtk_widget_set_tooltip_text(widget, _(
"set the theme for the user interface"));
397 GtkWidget *usesysfont = gtk_check_button_new();
398 GtkWidget *fontsize = gtk_spin_button_new_with_range(5.0f, 30.0f, 0.2f);
403 gtk_widget_set_state_flags(fontsize, GTK_STATE_FLAG_INSENSITIVE,
TRUE);
405 gtk_widget_set_state_flags(fontsize, GTK_STATE_FLAG_NORMAL,
TRUE);
407 label = gtk_label_new(_(
"use system font size"));
408 gtk_widget_set_halign(label, GTK_ALIGN_START);
409 labelev = gtk_event_box_new();
410 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
411 gtk_container_add(GTK_CONTAINER(labelev), label);
412 gtk_grid_attach(GTK_GRID(grid), labelev,
i,
i?2:line++, 1, 1);
413 gtk_grid_attach_next_to(GTK_GRID(grid), usesysfont, labelev, GTK_POS_RIGHT, 1, 1);
414 gtk_widget_set_tooltip_text(usesysfont, _(
"use system font size"));
415 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(usesysfont),
dt_conf_get_bool(
"use_system_font"));
416 g_signal_connect(G_OBJECT(usesysfont),
"toggled", G_CALLBACK(
use_sys_font_callback), (gpointer)fontsize);
423 label = gtk_label_new(_(
"font size in points"));
424 gtk_widget_set_halign(label, GTK_ALIGN_START);
425 labelev = gtk_event_box_new();
426 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
427 gtk_container_add(GTK_CONTAINER(labelev), label);
428 gtk_grid_attach(GTK_GRID(grid), labelev,
i,
i?0:line++, 1, 1);
429 gtk_grid_attach_next_to(GTK_GRID(grid), fontsize, labelev, GTK_POS_RIGHT, 1, 1);
430 gtk_widget_set_tooltip_text(fontsize, _(
"font size in points"));
431 gtk_spin_button_set_value(GTK_SPIN_BUTTON(fontsize),
dt_conf_get_float(
"font_size"));
434 GtkWidget *screen_dpi_overwrite = gtk_spin_button_new_with_range(-1.0f, 360, 1.f);
435 label = gtk_label_new(_(
"GUI controls and text DPI"));
436 gtk_widget_set_halign(label, GTK_ALIGN_START);
437 labelev = gtk_event_box_new();
438 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
439 gtk_container_add(GTK_CONTAINER(labelev), label);
440 gtk_grid_attach(GTK_GRID(grid), labelev,
i,
i?1:line++, 1, 1);
441 gtk_grid_attach_next_to(GTK_GRID(grid), screen_dpi_overwrite, labelev, GTK_POS_RIGHT, 1, 1);
442 gtk_widget_set_tooltip_text(screen_dpi_overwrite, _(
"adjust the global GUI resolution to rescale controls, buttons, labels, etc.\n"
443 "increase for a magnified GUI, decrease to fit more content in window.\n"
444 "set to -1 to use the system-defined global resolution.\n"
445 "default is 96 DPI on most systems.\n"
446 "(needs a restart)."));
447 gtk_spin_button_set_value(GTK_SPIN_BUTTON(screen_dpi_overwrite),
dt_conf_get_float(
"screen_dpi_overwrite"));
451 label = gtk_label_new(_(
"modify selected theme with CSS tweaks below"));
452 gtk_widget_set_halign(label, GTK_ALIGN_START);
454 labelev = gtk_event_box_new();
455 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
456 gtk_container_add(GTK_CONTAINER(labelev), label);
457 gtk_grid_attach(GTK_GRID(grid), labelev, 0, line++, 1, 1);
458 gtk_grid_attach_next_to(GTK_GRID(grid), tw->
apply_toggle, labelev, GTK_POS_RIGHT, 1, 1);
459 gtk_widget_set_tooltip_text(tw->
apply_toggle, _(
"modify theme with CSS keyed below (saved to user.css)"));
466 gtk_widget_set_name(usercssbox,
"usercss-box");
468 GtkTextBuffer *buffer = gtk_text_buffer_new(NULL);
472 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(tw->
css_text_view), GTK_WRAP_WORD);
477 GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);
478 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
480 gtk_box_pack_start(GTK_BOX(usercssbox), scroll,
TRUE,
TRUE, 0);
482 tw->
save_button = gtk_button_new_with_label(C_(
"usercss",
"save CSS and apply"));
487 gtk_box_pack_start(GTK_BOX(usercssbox), hbox,
FALSE,
FALSE, 0);
488 gtk_widget_set_tooltip_text(tw->
save_button, _(
"click to save and apply the CSS tweaks entered in this editor"));
493 g_snprintf(usercsspath,
sizeof(usercsspath),
"%s/user.css", configdir);
495 if(g_file_test(usercsspath, G_FILE_TEST_EXISTS))
497 gchar *usercsscontent = NULL;
499 if(g_file_get_contents(usercsspath, &usercsscontent, NULL, NULL))
501 gtk_text_buffer_set_text(buffer, usercsscontent, -1);
506 gchar *errtext = g_strconcat(
"/* ", _(
"ERROR Loading user.css"),
" */", NULL);
507 gtk_text_buffer_set_text(buffer, errtext, -1);
515 gchar *deftext = g_strconcat(
"/* ", _(
"Enter CSS theme tweaks here"),
" */\n\n", NULL);
516 gtk_text_buffer_set_text(buffer, deftext, -1);
526gboolean preferences_window_deleted(
GtkWidget *widget, GdkEvent *event, gpointer data)
535 gtk_widget_hide(widget);
542 GtkAllocation allocation;
543 gtk_widget_get_allocation(widget, &allocation);
545 dt_conf_set_int(
"ui_last/preferences_dialog_height", allocation.height);
552 GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
556 g_signal_connect(G_OBJECT(
_preferences_dialog),
"delete-event", G_CALLBACK(preferences_window_deleted), NULL);
563#ifdef GDK_WINDOWING_QUARTZ
571 gtk_widget_set_name(content,
"preferences-content");
572 gtk_container_set_border_width(GTK_CONTAINER(content), 0);
576 gtk_widget_set_name(box,
"preferences-box");
577 gtk_container_set_border_width(GTK_CONTAINER(box), 0);
578 gtk_box_pack_start(GTK_BOX(content), box,
TRUE,
TRUE, 0);
582 GtkWidget *stacksidebar = gtk_stack_sidebar_new();
583 gtk_stack_sidebar_set_stack(GTK_STACK_SIDEBAR(stacksidebar), GTK_STACK(stack));
584 gtk_box_pack_start(GTK_BOX(box), stacksidebar,
FALSE,
FALSE, 0);
585 gtk_box_pack_start(GTK_BOX(box), stack,
TRUE,
TRUE, 0);
589 restart_required =
FALSE;
600 GtkWidget *scroll = gtk_stack_get_child_by_name(GTK_STACK(stack), _(
"processing"));
601 GtkWidget *viewport = GTK_IS_BIN(scroll) ? gtk_bin_get_child(GTK_BIN(scroll)) : NULL;
602 GtkWidget *grid = GTK_IS_BIN(viewport) ? gtk_bin_get_child(GTK_BIN(viewport)) : NULL;
608 int insert_line = -1;
609 GList *children = gtk_container_get_children(GTK_CONTAINER(grid));
612 for(GList *child = children; child; child = g_list_next(child))
616 gtk_container_child_get(GTK_CONTAINER(grid), GTK_WIDGET(child->data),
"top-attach", &
top,
"height", &
height,
620 if(GTK_IS_CONTAINER(child->data))
624 GList *box_children = gtk_container_get_children(GTK_CONTAINER(child->data));
625 for(GList *box_child = box_children; box_child; box_child = g_list_next(box_child))
627 const char *
name = gtk_widget_get_name(GTK_WIDGET(box_child->data));
634 g_list_free(box_children);
637 g_list_free(children);
641 const int device_rows = detected_devices * 4;
647 children = gtk_container_get_children(GTK_CONTAINER(grid));
650 for(GList *child = children; child; child = g_list_next(child))
653 gtk_container_child_get(GTK_CONTAINER(grid), GTK_WIDGET(child->data),
"top-attach", &
top, NULL);
654 if(
top >= insert_line)
655 gtk_container_child_set(GTK_CONTAINER(grid), GTK_WIDGET(child->data),
"top-attach",
656 top + device_rows, NULL);
658 g_list_free(children);
667 for(
int dev = 0; dev < detected_devices; dev++)
674 gchar *label_text = g_strdup_printf(
"%d: %s", device->
config_id, device_name);
675 GtkWidget *device_title = gtk_label_new(label_text);
677 gtk_box_pack_start(GTK_BOX(title_box), device_title,
FALSE,
FALSE, 0);
683 gtk_widget_set_name(title_box,
"pref_subsection");
684 gtk_grid_attach(GTK_GRID(grid), title_box, 0, line++, 3, 1);
687 GtkWidget *enable_label = gtk_label_new(_(
"Enable"));
688 gtk_widget_set_halign(enable_label, GTK_ALIGN_START);
689 gtk_widget_set_hexpand(enable_label,
TRUE);
691 gtk_grid_attach(GTK_GRID(grid), enable_label, 0, line, 1, 1);
692 GtkWidget *enable_labdef = gtk_label_new(
"");
693 gtk_widget_set_name(enable_labdef,
"preference_non_default");
694 gtk_grid_attach(GTK_GRID(grid), enable_labdef, 1, line, 1, 1);
698 gtk_widget_set_tooltip_text(
enable, _(
"Enable or disable OpenCL processing for this GPU"));
700 GINT_TO_POINTER(dev));
701 gtk_grid_attach(GTK_GRID(grid),
enable, 2, line++, 1, 1);
703 GtkWidget *pinned_memory_label = gtk_label_new(_(
"pinned memory"));
704 gtk_widget_set_halign(pinned_memory_label, GTK_ALIGN_START);
705 gtk_widget_set_hexpand(pinned_memory_label,
TRUE);
707 gtk_grid_attach(GTK_GRID(grid), pinned_memory_label, 0, line, 1, 1);
708 GtkWidget *pinned_memory_labdef = gtk_label_new(
"");
709 gtk_widget_set_name(pinned_memory_labdef,
"preference_non_default");
710 gtk_grid_attach(GTK_GRID(grid), pinned_memory_labdef, 1, line, 1, 1);
712 GtkWidget *pinned_memory = gtk_check_button_new();
713 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pinned_memory),
715 gtk_widget_set_tooltip_text(pinned_memory, _(
"Use pinned host memory for OpenCL transfers on this GPU"));
717 GINT_TO_POINTER(dev));
718 gtk_grid_attach(GTK_GRID(grid), pinned_memory, 2, line++, 1, 1);
724 ? _(
"GPU memory headroom, shared with system RAM (MiB)")
725 : _(
"GPU vRAM headroom (MiB)"));
726 gtk_widget_set_halign(headroom_label, GTK_ALIGN_START);
727 gtk_widget_set_hexpand(headroom_label,
TRUE);
729 gtk_grid_attach(GTK_GRID(grid), headroom_label, 0, line, 1, 1);
730 GtkWidget *headroom_labdef = gtk_label_new(
"");
731 gtk_widget_set_name(headroom_labdef,
"preference_non_default");
732 gtk_grid_attach(GTK_GRID(grid), headroom_labdef, 1, line, 1, 1);
734 GtkWidget *headroom = gtk_spin_button_new_with_range(0, G_MAXINT, 1);
735 gtk_widget_set_hexpand(headroom,
FALSE);
736 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(headroom), 0);
739 ? _(
"This GPU has no dedicated vRAM -- it shares memory with the "
740 "system. Memory reserved here for the OS, desktop and other "
742 : _(
"GPU memory reserved for the system and other applications"));
744 GINT_TO_POINTER(dev));
745 gtk_grid_attach(GTK_GRID(grid), headroom, 2, line++, 1, 1);
751 GList *dependents = NULL;
752 dependents = g_list_append(dependents, pinned_memory_label);
753 dependents = g_list_append(dependents, pinned_memory_labdef);
754 dependents = g_list_append(dependents, pinned_memory);
755 dependents = g_list_append(dependents, headroom_label);
756 dependents = g_list_append(dependents, headroom_labdef);
757 dependents = g_list_append(dependents, headroom);
758 g_object_set_data_full(G_OBJECT(
enable),
"dependent-widgets", dependents, (GDestroyNotify)g_list_free);
760 const gboolean device_enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
enable));
761 for(GList *l = dependents; l; l = l->next) gtk_widget_set_sensitive(GTK_WIDGET(l->data), device_enabled);
780 dt_control_log(_(
"Ansel needs to be restarted for settings to take effect"));
787 cairo_destroy((cairo_t *)data);
792 GtkTreeIter iter, parent;
794 gchar *last_module = NULL;
800 cairo_t *lock_cr = cairo_create(lock_cst);
801 cairo_set_source_rgb(lock_cr, 0.7, 0.7, 0.7);
803 cairo_surface_flush(lock_cst);
804 guchar *data = cairo_image_surface_get_data(lock_cst);
806 GdkPixbuf *lock_pixbuf = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB,
TRUE, 8,
808 cairo_image_surface_get_stride(lock_cst),
814 cairo_t *check_cr = cairo_create(check_cst);
815 cairo_set_source_rgb(check_cr, 0.7, 0.7, 0.7);
817 cairo_surface_flush(check_cst);
818 data = cairo_image_surface_get_data(check_cst);
820 GdkPixbuf *check_pixbuf = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB,
TRUE, 8,
822 cairo_image_surface_get_stride(check_cst),
826 "SELECT rowid, name, operation, autoapply, model, maker, lens, iso_min, "
827 "iso_max, exposure_min, exposure_max, aperture_min, aperture_max, "
828 "focal_length_min, focal_length_max, writeprotect FROM data.presets ORDER BY "
832 while(sqlite3_step(stmt) == SQLITE_ROW)
834 const gint rowid = sqlite3_column_int(stmt, 0);
835 const gchar *
name = (gchar *)sqlite3_column_text(stmt, 1);
836 const gchar *operation = (gchar *)sqlite3_column_text(stmt, 2);
837 const gboolean autoapply = (sqlite3_column_int(stmt, 3) == 0 ?
FALSE :
TRUE);
838 const gchar *
model = (gchar *)sqlite3_column_text(stmt, 4);
839 const gchar *
maker = (gchar *)sqlite3_column_text(stmt, 5);
840 const gchar *lens = (gchar *)sqlite3_column_text(stmt, 6);
841 const float iso_min = sqlite3_column_double(stmt, 7);
842 const float iso_max = sqlite3_column_double(stmt, 8);
843 const float exposure_min = sqlite3_column_double(stmt, 9);
844 const float exposure_max = sqlite3_column_double(stmt, 10);
845 const float aperture_min = sqlite3_column_double(stmt, 11);
846 const float aperture_max = sqlite3_column_double(stmt, 12);
847 const int focal_length_min = sqlite3_column_double(stmt, 13);
848 const int focal_length_max = sqlite3_column_double(stmt, 14);
849 const gboolean writeprotect = (sqlite3_column_int(stmt, 15) == 0 ?
FALSE :
TRUE);
851 gchar *iso = NULL, *exposure = NULL, *aperture = NULL, *focal_length = NULL, *smaker = NULL, *smodel = NULL, *slens = NULL;
854 gchar *
module = g_strdup(dt_iop_get_localized_name(operation));
856 if(
IS_NULL_PTR(module)) module = g_strdup(operation);
861 exposure = g_strdup(
"");
862 aperture = g_strdup(
"");
863 focal_length = g_strdup(
"");
864 smaker = g_strdup(
"");
865 smodel = g_strdup(
"");
866 slens = g_strdup(
"");
870 smaker = g_strdup(
maker);
871 smodel = g_strdup(
model);
872 slens = g_strdup(lens);
877 iso = g_strdup_printf(
"%" G_GSIZE_FORMAT
" - %" G_GSIZE_FORMAT
"", (
size_t)
iso_min, (
size_t)
iso_max);
884 exposure = g_strdup(
"%");
894 aperture = g_strdup(
"%");
899 if(focal_length_min == 0.0 && focal_length_max == 1000.0)
900 focal_length = g_strdup(
"%");
902 focal_length = g_strdup_printf(
"%d - %d", focal_length_min, focal_length_max);
905 if(g_strcmp0(last_module, operation) != 0)
907 gtk_tree_store_insert_with_values(tree_model, &iter, NULL, -1,
913 last_module = g_strdup(operation);
917 gtk_tree_store_insert_with_values(tree_model, &iter, &parent, -1,
923 autoapply ? check_pixbuf : NULL, -1);
935 sqlite3_finalize(stmt);
937 g_object_unref(lock_pixbuf);
938 cairo_surface_destroy(lock_cst);
939 g_object_unref(check_pixbuf);
940 cairo_surface_destroy(check_cst);
943static gboolean
_search_func(GtkTreeModel *
model, gint column,
const gchar *
key, GtkTreeIter *iter, gpointer search_data)
945 gchar *key_case = g_utf8_casefold(
key, -1), *label = NULL;
948 gchar *name_case = g_utf8_casefold(label, -1);
951 gchar *module_case = g_utf8_casefold(label, -1);
954 const gboolean different = !((name_case && strstr(name_case, key_case))
955 || (module_case && strstr(module_case, key_case)));
963 GtkTreePath *path = gtk_tree_model_get_path(
model, iter);
964 gtk_tree_view_expand_to_path(GTK_TREE_VIEW(search_data), path);
965 gtk_tree_path_free(path);
971 if(gtk_tree_model_iter_children(
model, &child, iter))
977 while(gtk_tree_model_iter_next(
model, &child));
986 GtkWidget *scroll = gtk_scrolled_window_new(NULL, NULL);
987 GtkTreeView *tree = GTK_TREE_VIEW(gtk_tree_view_new());
988 GtkTreeStore *
model = gtk_tree_store_new(
989 P_N_COLUMNS, G_TYPE_INT , G_TYPE_STRING , G_TYPE_STRING ,
990 GDK_TYPE_PIXBUF , G_TYPE_STRING , G_TYPE_STRING , G_TYPE_STRING ,
991 G_TYPE_STRING , G_TYPE_STRING , G_TYPE_STRING , G_TYPE_STRING ,
992 G_TYPE_STRING , GDK_TYPE_PIXBUF );
993 GtkCellRenderer *renderer;
994 GtkTreeViewColumn *column;
997 gtk_stack_add_titled(GTK_STACK(stack),
container, _(
"presets"), _(
"presets"));
1002 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(
model),
P_MODULE_COLUMN, GTK_SORT_ASCENDING);
1006 renderer = gtk_cell_renderer_text_new();
1007 column = gtk_tree_view_column_new_with_attributes(_(
"module"), renderer,
"text",
P_MODULE_COLUMN, NULL);
1008 gtk_tree_view_append_column(tree, column);
1010 renderer = gtk_cell_renderer_pixbuf_new();
1011 column = gtk_tree_view_column_new_with_attributes(
"", renderer,
"pixbuf",
P_EDITABLE_COLUMN, NULL);
1012 gtk_tree_view_append_column(tree, column);
1014 renderer = gtk_cell_renderer_text_new();
1015 column = gtk_tree_view_column_new_with_attributes(_(
"name"), renderer,
"text",
P_NAME_COLUMN, NULL);
1016 gtk_tree_view_append_column(tree, column);
1018 renderer = gtk_cell_renderer_text_new();
1019 column = gtk_tree_view_column_new_with_attributes(_(
"model"), renderer,
"text",
P_MODEL_COLUMN, NULL);
1020 gtk_tree_view_append_column(tree, column);
1022 renderer = gtk_cell_renderer_text_new();
1023 column = gtk_tree_view_column_new_with_attributes(_(
"maker"), renderer,
"text",
P_MAKER_COLUMN, NULL);
1024 gtk_tree_view_append_column(tree, column);
1026 renderer = gtk_cell_renderer_text_new();
1027 column = gtk_tree_view_column_new_with_attributes(_(
"lens"), renderer,
"text",
P_LENS_COLUMN, NULL);
1028 gtk_tree_view_append_column(tree, column);
1030 renderer = gtk_cell_renderer_text_new();
1031 column = gtk_tree_view_column_new_with_attributes(_(
"ISO"), renderer,
"text",
P_ISO_COLUMN, NULL);
1032 gtk_tree_view_append_column(tree, column);
1034 renderer = gtk_cell_renderer_text_new();
1035 column = gtk_tree_view_column_new_with_attributes(_(
"exposure"), renderer,
"text",
P_EXPOSURE_COLUMN, NULL);
1036 gtk_tree_view_append_column(tree, column);
1038 renderer = gtk_cell_renderer_text_new();
1039 column = gtk_tree_view_column_new_with_attributes(_(
"aperture"), renderer,
"text",
P_APERTURE_COLUMN, NULL);
1040 gtk_tree_view_append_column(tree, column);
1042 renderer = gtk_cell_renderer_text_new();
1043 column = gtk_tree_view_column_new_with_attributes(_(
"focal length"), renderer,
"text",
1045 gtk_tree_view_append_column(tree, column);
1047 renderer = gtk_cell_renderer_pixbuf_new();
1048 column = gtk_tree_view_column_new_with_attributes(_(
"auto"), renderer,
"pixbuf",
P_AUTOAPPLY_COLUMN, NULL);
1049 gtk_tree_view_append_column(tree, column);
1051 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1056 gtk_widget_set_name(hbox,
"preset_controls");
1058 GtkWidget *search_presets = gtk_search_entry_new();
1061 gtk_box_pack_start(GTK_BOX(hbox), search_presets,
FALSE,
TRUE, 0);
1062 gtk_entry_set_placeholder_text(GTK_ENTRY(search_presets), _(
"search presets list"));
1063 gtk_widget_set_tooltip_text(GTK_WIDGET(search_presets), _(
"incrementally search the list of presets\npress up or down keys to cycle through matches"));
1064 g_signal_connect(G_OBJECT(search_presets),
"activate", G_CALLBACK(
dt_gui_search_stop), tree);
1065 g_signal_connect(G_OBJECT(search_presets),
"stop-search", G_CALLBACK(
dt_gui_search_stop), tree);
1066 g_signal_connect(G_OBJECT(tree),
"key-press-event", G_CALLBACK(
dt_gui_search_start), search_presets);
1067 gtk_tree_view_set_search_entry(tree, GTK_ENTRY(search_presets));
1069 GtkWidget *button = gtk_button_new_with_label(C_(
"preferences",
"import..."));
1070 gtk_box_pack_end(GTK_BOX(hbox), button,
FALSE,
TRUE, 0);
1071 g_signal_connect(G_OBJECT(button),
"clicked", G_CALLBACK(
import_preset), (gpointer)
model);
1073 button = gtk_button_new_with_label(C_(
"preferences",
"export..."));
1074 gtk_box_pack_end(GTK_BOX(hbox), button,
FALSE,
TRUE, 0);
1075 g_signal_connect(G_OBJECT(button),
"clicked", G_CALLBACK(
export_preset), (gpointer)
model);
1088 gtk_tree_view_set_search_equal_func(tree,
_search_func, tree, NULL);
1091 gtk_tree_view_set_model(tree, GTK_TREE_MODEL(
model));
1095 gtk_container_add(GTK_CONTAINER(scroll), GTK_WIDGET(tree));
1096 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
1098 g_object_unref(G_OBJECT(
model));
1109 GtkTreeModel *
model = gtk_tree_view_get_model(tree);
1111 gtk_tree_model_get_iter(
model, &iter, path);
1113 if(gtk_tree_model_iter_has_child(
model, &iter))
1116 if(gtk_tree_view_row_expanded(tree, path))
1117 gtk_tree_view_collapse_row(tree, path);
1119 gtk_tree_view_expand_row(tree, path,
FALSE);
1125 gchar *
name, *operation;
1126 GdkPixbuf *editable;
1132 g_object_unref(editable);
1143 GtkTreeModel *
model = (GtkTreeModel *)data;
1145 GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
1148 if(event->is_modifier)
return FALSE;
1151 if(
key == GDK_KEY_Delete ||
key == GDK_KEY_BackSpace)
1156 if(!gtk_tree_selection_get_selected(selection, &
model, &iter)
1157 || gtk_tree_model_iter_has_child(
model, &iter))
1163 GdkPixbuf *editable;
1169 gchar* operation = NULL;
1172 "SELECT name, operation FROM data.presets WHERE rowid = ?1",
1175 if(sqlite3_step(stmt) == SQLITE_ROW)
1177 operation = g_strdup( (
const char*)sqlite3_column_text(stmt,1));
1179 sqlite3_finalize(stmt);
1183 GtkTreeStore *tree_store = GTK_TREE_STORE(
model);
1184 gtk_tree_store_clear(tree_store);
1193 g_object_unref(editable);
1215 GtkTreeModel *
model = (GtkTreeModel *)data;
1216 GtkWindow *win = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button)));
1219 GtkFileChooserNative *chooser = gtk_file_chooser_native_new(
1220 _(
"select preset(s) to import"), GTK_WINDOW(win), GTK_FILE_CHOOSER_ACTION_OPEN,
1221 _(
"_open"), _(
"_cancel"));
1224 gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(chooser),
TRUE);
1226 GtkFileFilter *filter;
1227 filter = GTK_FILE_FILTER(gtk_file_filter_new());
1228 gtk_file_filter_add_pattern(filter,
"*.dtpreset");
1229 gtk_file_filter_add_pattern(filter,
"*.DTPRESET");
1230 gtk_file_filter_set_name(filter, _(
"Ansel preset files"));
1231 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter);
1233 filter = GTK_FILE_FILTER(gtk_file_filter_new());
1234 gtk_file_filter_add_pattern(filter,
"*");
1235 gtk_file_filter_set_name(filter, _(
"all files"));
1237 gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(chooser), filter);
1239 if(gtk_native_dialog_run(GTK_NATIVE_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT)
1241 GSList *filenames = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(chooser));
1245 GtkTreeStore *tree_store = GTK_TREE_STORE(
model);
1246 gtk_tree_store_clear(tree_store);
1251 g_object_unref(chooser);
1256 GtkWindow *win = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button)));
1258 GtkFileChooserNative *filechooser = gtk_file_chooser_native_new(
1259 _(
"select directory"), GTK_WINDOW(win), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
1260 _(
"_save"), _(
"_cancel"));
1264 if(gtk_native_dialog_run(GTK_NATIVE_DIALOG(filechooser)) == GTK_RESPONSE_ACCEPT)
1266 gchar *filedir = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser));
1273 "SELECT rowid, name, operation FROM data.presets WHERE writeprotect = 0",
1276 while(sqlite3_step(stmt) == SQLITE_ROW)
1278 const gint rowid = sqlite3_column_int(stmt, 0);
1279 const gchar *
name = (gchar *)sqlite3_column_text(stmt, 1);
1280 const gchar *operation = (gchar *)sqlite3_column_text(stmt, 2);
1281 gchar* preset_name = g_strdup_printf(
"%s_%s", operation,
name);
1288 sqlite3_finalize(stmt);
1296 g_object_unref(filechooser);
1307 if(*a_text ==
'\0' && *b_text ==
'\0')
1316 const int res = strcoll(a_text, b_text);
1326 GtkTreeStore *tree_store = GTK_TREE_STORE(gtk_tree_view_get_model((GtkTreeView *)
g->data));
1327 gtk_tree_store_clear(tree_store);
1331static void edit_preset(GtkTreeView *tree,
const gint rowid,
const gchar *
name,
const gchar *module)
1340 dt_conf_set_bool((
char *)data, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
1345 const char *
key = gtk_widget_get_name(widget);
1347 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), def);
1353 if(event->type == GDK_2BUTTON_PRESS)
1363 const char *
key = gtk_widget_get_name(widget);
1365 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), val);
1369 const guint line,
const gboolean
swap)
1373 GtkWidget *labelev = gtk_event_box_new();
1374 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1375 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1378 gtk_grid_attach(GTK_GRID(grid), labelev,
swap ? (col + 1) : col, line, 1, 1);
1379 gtk_grid_attach(GTK_GRID(grid), w,
swap ? col : (col + 1), line, 1, 1);
1388 dt_conf_set_int((
char *)data, gtk_spin_button_get_value(GTK_SPIN_BUTTON(widget)));
1393 const char *
key = gtk_widget_get_name(widget);
1395 gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), def);
1401 if(event->type == GDK_2BUTTON_PRESS)
1411 const char *
key = gtk_widget_get_name(widget);
1413 gtk_spin_button_set_value(GTK_SPIN_BUTTON(widget), val);
1421 GtkWidget *labelev = gtk_event_box_new();
1422 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1423 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1427 gtk_widget_set_hexpand(w,
FALSE);
1428 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(w), 0);
1430 gtk_grid_attach(GTK_GRID(grid), labelev, col, line, 1, 1);
1431 gtk_grid_attach(GTK_GRID(grid), w, col + 1, line, 1, 1);
1441 if(gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter))
1444 gtk_tree_model_get(gtk_combo_box_get_model(GTK_COMBO_BOX(widget)), &iter, 0, &s, -1);
1452 GtkTreeModel *
model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget));
1454 gboolean valid = gtk_tree_model_get_iter_first(
model, &iter);
1456 gboolean found =
FALSE;
1460 gtk_tree_model_get(
model, &iter, 0, &
value, -1);
1461 if(!g_strcmp0(
value, str))
1469 valid = gtk_tree_model_iter_next(
model, &iter);
1472 gtk_combo_box_set_active(GTK_COMBO_BOX(widget),
i);
1477 const char *
key = gtk_widget_get_name(widget);
1485 if(event->type == GDK_2BUTTON_PRESS)
1495 const char *
key = gtk_widget_get_name(widget);
1506 GtkWidget *labelev = gtk_event_box_new();
1507 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1508 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1511 GtkListStore *
store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
1517 for(GList *val = vals; val; val = g_list_next(val))
1519 char *item = (
char *)val->data;
1521 if(item[0] ==
'[') item++;
1522 else if(item[strlen(item) - 1] ==
']') item[strlen(item) - 1] =
'\0';
1523 gtk_list_store_append(
store, &iter);
1524 gtk_list_store_set(
store, &iter, 0, item, 1, g_dpgettext2(NULL,
"preferences", item), -1);
1525 if(pos == -1 && !g_strcmp0(str, item))
1535 GtkWidget *w = gtk_combo_box_new_with_model(GTK_TREE_MODEL(
store));
1536 gtk_widget_set_hexpand(w,
FALSE);
1537 g_object_unref(
store);
1538 GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
1539 gtk_cell_renderer_set_padding(renderer, 0, 0);
1540 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(w), renderer,
TRUE);
1541 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(w), renderer,
"text", 1, NULL);
1542 gtk_combo_box_set_active(GTK_COMBO_BOX(w), pos);
1544 gtk_grid_attach(GTK_GRID(grid), labelev, col, line, 1, 1);
1545 gtk_grid_attach(GTK_GRID(grid), w, col + 1, line, 1, 1);
1554 const char *str = gtk_entry_get_text(GTK_ENTRY(widget));
1560 const char *
key = gtk_widget_get_name(widget);
1562 gtk_entry_set_text(GTK_ENTRY(widget), str);
1568 if(event->type == GDK_2BUTTON_PRESS)
1578 const char *
key = gtk_widget_get_name(widget);
1580 gtk_entry_set_text(GTK_ENTRY(widget), str);
1588 GtkWidget *labelev = gtk_event_box_new();
1589 gtk_widget_add_events(labelev, GDK_BUTTON_PRESS_MASK);
1590 gtk_container_add(GTK_CONTAINER(labelev), w_label);
1595 gtk_entry_set_text(GTK_ENTRY(w), str);
1596 gtk_widget_set_hexpand(w,
TRUE);
1598 gtk_grid_attach(GTK_GRID(grid), labelev, col, line, 1, 1);
1599 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_gui_refocus_parent(GtkWindow *parent)
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
gboolean host_unified_memory
GList * dt_util_str_to_glist(const gchar *separator, const gchar *text)