70#ifdef GDK_WINDOWING_QUARTZ
79 = { 0., 1. / 8000, 1. / 4000, 1. / 2000, 1. / 1000, 1. / 1000, 1. / 500, 1. / 250,
80 1. / 125, 1. / 60, 1. / 30, 1. / 15, 1. / 15, 1. / 8, 1. / 4, 1. / 2,
81 1, 2, 4, 8, 15, 30, 60, FLT_MAX };
83 = {
"0",
"1/8000",
"1/4000",
"1/2000",
"1/1000",
"1/1000",
"1/500",
"1/250",
84 "1/125",
"1/60",
"1/30",
"1/15",
"1/15",
"1/8",
"1/4",
"1/2",
85 "1\"",
"2\"",
"4\"",
"8\"",
"15\"",
"30\"",
"60\"",
"+" };
88 = { 0, 0.5, 0.7, 1.0, 1.4, 2.0, 2.8, 4.0, 5.6, 8.0, 11.0, 16.0, 22.0, 32.0, 45.0, 64.0, 90.0, 128.0, FLT_MAX };
90 = {
"f/0",
"f/0.5",
"f/0.7",
"f/1.0",
"f/1.4",
"f/2",
"f/2.8",
"f/4",
"f/5.6",
"f/8",
91 "f/11",
"f/16",
"f/22",
"f/32",
"f/45",
"f/64",
"f/90",
"f/128",
"f/+" };
97 = { N_(
"non-raw"), N_(
"raw"), N_(
"HDR"), N_(
"monochrome"), N_(
"color") };
144 &default_blendop_params,
enabled);
150 const void *blend_params,
const int32_t
enabled)
165 for(GList *l = presets; l; l = g_list_next(l))
174 name = g_strdup(
p->name);
175 *writeprotect =
p->writeprotect;
185 int writeprotect = -1;
196 gint
res = GTK_RESPONSE_YES;
202 = gtk_message_dialog_new(GTK_WINDOW(
window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION,
203 GTK_BUTTONS_YES_NO, _(
"do you really want to delete the preset `%s'?"),
name);
204#ifdef GDK_WINDOWING_QUARTZ
207 gtk_window_set_title(GTK_WINDOW(dialog), _(
"delete preset?"));
208 res = gtk_dialog_run(GTK_DIALOG(dialog));
209 GtkWindow *dialog_parent = gtk_window_get_transient_for(GTK_WINDOW(dialog));
210 gtk_widget_destroy(dialog);
214 if(
res == GTK_RESPONSE_YES)
226 if(response_id == GTK_RESPONSE_OK)
231 const gchar *
name = gtk_entry_get_text(
g->name);
232 if(((
g->old_id >= 0) && (strcmp(
g->original_name,
name) != 0)) || (
g->old_id < 0))
238 = gtk_message_dialog_new(GTK_WINDOW(dialog), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
239 GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, _(
"please give preset a name"));
240#ifdef GDK_WINDOWING_QUARTZ
244 gtk_window_set_title(GTK_WINDOW(dlg_changename), _(
"unnamed preset"));
246 gtk_dialog_run(GTK_DIALOG(dlg_changename));
247 gtk_widget_destroy(dlg_changename);
256 GtkWidget *dlg_overwrite = gtk_message_dialog_new(
257 GTK_WINDOW(dialog), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING,
258 GTK_BUTTONS_YES_NO, _(
"preset `%s' already exists.\ndo you want to overwrite?"),
name);
259#ifdef GDK_WINDOWING_QUARTZ
263 gtk_window_set_title(GTK_WINDOW(dlg_overwrite), _(
"overwrite preset?"));
265 const gint dlg_ret = gtk_dialog_run(GTK_DIALOG(dlg_overwrite));
266 gtk_widget_destroy(dlg_overwrite);
269 if(dlg_ret == GTK_RESPONSE_YES)
280 for(
int k = 0;
k < 5;
k++)
287 .
description = (gchar *)gtk_entry_get_text(
g->description),
288 .model = (gchar *)gtk_entry_get_text(GTK_ENTRY(
g->model)),
289 .
maker = (gchar *)gtk_entry_get_text(GTK_ENTRY(
g->maker)),
290 .lens = (gchar *)gtk_entry_get_text(GTK_ENTRY(
g->lens)),
291 .
iso_min = gtk_spin_button_get_value(GTK_SPIN_BUTTON(
g->iso_min)),
292 .
iso_max = gtk_spin_button_get_value(GTK_SPIN_BUTTON(
g->iso_max)),
297 .focal_length_min = gtk_spin_button_get_value(GTK_SPIN_BUTTON(
g->focal_length_min)),
298 .focal_length_max = gtk_spin_button_get_value(GTK_SPIN_BUTTON(
g->focal_length_max)),
299 .autoapply = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
g->autoapply)),
300 .filter = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
g->filter)),
312 g->iop->params,
g->iop->params_size,
g->iop->enabled,
320 NULL, 0, 0, NULL, 0, 0);
325 else if(response_id == GTK_RESPONSE_YES &&
g->old_id)
327 const gchar *
name = gtk_entry_get_text(
g->name);
330 GtkFileChooserNative *filechooser = gtk_file_chooser_native_new(
331 _(
"select directory"), GTK_WINDOW(dialog), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
332 _(
"_select as output destination"), _(
"_cancel"));
336 if(gtk_native_dialog_run(GTK_NATIVE_DIALOG(filechooser)) == GTK_RESPONSE_ACCEPT)
338 char *filedir = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser));
345 g_object_unref(GTK_WIDGET(filechooser));
348 else if(response_id == GTK_RESPONSE_REJECT &&
g->old_id)
355 GtkWindow *dialog_parent = gtk_window_get_transient_for(GTK_WINDOW(dialog));
356 gtk_widget_destroy(GTK_WIDGET(dialog));
369 GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(parent_dialog), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
370 GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
371 _(
"do you really want to delete the preset `%s'?"),
name);
372#ifdef GDK_WINDOWING_QUARTZ
376 gtk_window_set_title(GTK_WINDOW(dialog), _(
"delete preset?"));
377 if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES)
382 gtk_widget_destroy(dialog);
387 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
g->autoapply))
388 || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(
g->filter)))
390 gtk_widget_set_visible(GTK_WIDGET(
g->details),
TRUE);
391 gtk_widget_set_no_show_all(GTK_WIDGET(
g->details),
FALSE);
392 gtk_widget_show_all(GTK_WIDGET(
g->details));
393 gtk_widget_set_no_show_all(GTK_WIDGET(
g->details),
TRUE);
396 gtk_widget_set_visible(GTK_WIDGET(
g->details),
FALSE);
400 gboolean allow_desc_change, gboolean allow_remove)
404 snprintf(title,
sizeof(title), _(
"edit `%s' for module `%s'"),
g->original_name,
g->module_name);
405 GtkWidget *dialog = gtk_dialog_new_with_buttons
406 (title,
g->parent, GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
407 _(
"_cancel"), GTK_RESPONSE_CANCEL, _(
"_export..."), GTK_RESPONSE_YES,
408 _(
"delete"), GTK_RESPONSE_REJECT, _(
"_ok"), GTK_RESPONSE_OK, NULL);
409 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
411#ifdef GDK_WINDOWING_QUARTZ
414 GtkContainer *content_area = GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog)));
416 gtk_container_add(content_area, GTK_WIDGET(box));
418 g->name = GTK_ENTRY(gtk_entry_new());
420 gtk_entry_set_text(
g->name,
g->original_name);
421 if(allow_name_change)
422 gtk_entry_set_activates_default(
g->name,
TRUE);
424 gtk_widget_set_sensitive(GTK_WIDGET(
g->name),
FALSE);
425 gtk_box_pack_start(box, GTK_WIDGET(
g->name),
FALSE,
FALSE, 0);
426 gtk_widget_set_tooltip_text(GTK_WIDGET(
g->name), _(
"name of the preset"));
428 g->description = GTK_ENTRY(gtk_entry_new());
430 if(allow_desc_change)
431 gtk_entry_set_activates_default(
g->description,
TRUE);
433 gtk_widget_set_sensitive(GTK_WIDGET(
g->description),
FALSE);
434 gtk_box_pack_start(box, GTK_WIDGET(
g->description),
FALSE,
FALSE, 0);
435 gtk_widget_set_tooltip_text(GTK_WIDGET(
g->description), _(
"description or further information"));
438 = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(_(
"auto apply this preset to matching images")));
439 gtk_box_pack_start(box, GTK_WIDGET(
g->autoapply),
FALSE,
FALSE, 0);
441 = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(_(
"only show this preset for matching images")));
442 gtk_widget_set_tooltip_text(GTK_WIDGET(
g->filter), _(
"be very careful with this option. "
443 "this might be the last time you see your preset."));
444 gtk_box_pack_start(box, GTK_WIDGET(
g->filter),
FALSE,
FALSE, 0);
450 gtk_widget_set_no_show_all(GTK_WIDGET(
g->filter),
TRUE);
456 g->details = gtk_grid_new();
459 gtk_box_pack_start(box, GTK_WIDGET(
g->details),
TRUE,
TRUE, 0);
464 g->model = gtk_entry_new();
466 gtk_widget_set_hexpand(GTK_WIDGET(
g->model),
TRUE);
468 gtk_widget_set_tooltip_text(
g->model, _(
"string to match model (use % as wildcard)"));
469 label = gtk_label_new(_(
"model"));
470 gtk_widget_set_halign(label, GTK_ALIGN_START);
471 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
472 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->model, label, GTK_POS_RIGHT, 2, 1);
474 g->maker = gtk_entry_new();
477 gtk_widget_set_tooltip_text(
g->maker, _(
"string to match maker (use % as wildcard)"));
478 label = gtk_label_new(_(
"maker"));
479 gtk_widget_set_halign(label, GTK_ALIGN_START);
480 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
481 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->maker, label, GTK_POS_RIGHT, 2, 1);
483 g->lens = gtk_entry_new();
486 gtk_widget_set_tooltip_text(
g->lens, _(
"string to match lens (use % as wildcard)"));
487 label = gtk_label_new(_(
"lens"));
488 gtk_widget_set_halign(label, GTK_ALIGN_START);
489 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
490 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->lens, label, GTK_POS_RIGHT, 2, 1);
493 label = gtk_label_new(_(
"ISO"));
494 gtk_widget_set_halign(label, GTK_ALIGN_START);
495 g->iso_min = gtk_spin_button_new_with_range(0, FLT_MAX, 100);
496 gtk_widget_set_tooltip_text(
g->iso_min, _(
"minimum ISO value"));
497 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(
g->iso_min), 0);
498 g->iso_max = gtk_spin_button_new_with_range(0, FLT_MAX, 100);
499 gtk_widget_set_tooltip_text(
g->iso_max, _(
"maximum ISO value"));
500 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(
g->iso_max), 0);
501 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
502 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->iso_min, label, GTK_POS_RIGHT, 1, 1);
503 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->iso_max,
g->iso_min, GTK_POS_RIGHT, 1, 1);
506 label = gtk_label_new(_(
"exposure"));
507 gtk_widget_set_halign(label, GTK_ALIGN_START);
510 gtk_widget_set_tooltip_text(
g->exposure_min, _(
"minimum exposure time"));
511 gtk_widget_set_tooltip_text(
g->exposure_max, _(
"maximum exposure time"));
516 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
517 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->exposure_min, label, GTK_POS_RIGHT, 1, 1);
518 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->exposure_max,
g->exposure_min, GTK_POS_RIGHT, 1, 1);
521 label = gtk_label_new(_(
"aperture"));
522 gtk_widget_set_halign(label, GTK_ALIGN_START);
525 gtk_widget_set_tooltip_text(
g->aperture_min, _(
"minimum aperture value"));
526 gtk_widget_set_tooltip_text(
g->aperture_max, _(
"maximum aperture value"));
531 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
532 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->aperture_min, label, GTK_POS_RIGHT, 1, 1);
533 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->aperture_max,
g->aperture_min, GTK_POS_RIGHT, 1, 1);
536 label = gtk_label_new(_(
"focal length"));
537 gtk_widget_set_halign(label, GTK_ALIGN_START);
538 g->focal_length_min = gtk_spin_button_new_with_range(0, 1000, 10);
539 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(
g->focal_length_min), 0);
540 g->focal_length_max = gtk_spin_button_new_with_range(0, 1000, 10);
541 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(
g->focal_length_max), 0);
542 gtk_widget_set_tooltip_text(
g->focal_length_min, _(
"minimum focal length"));
543 gtk_widget_set_tooltip_text(
g->focal_length_max, _(
"maximum focal length"));
544 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
545 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->focal_length_min, label, GTK_POS_RIGHT, 1, 1);
546 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->focal_length_max,
g->focal_length_min, GTK_POS_RIGHT, 1, 1);
549 label = gtk_label_new(_(
"format"));
550 gtk_widget_set_halign(label, GTK_ALIGN_START);
551 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line, 1, 1);
552 gtk_widget_set_tooltip_text(label, _(
"select image types you want this preset to be available for"));
554 for(
int i = 0;
i < 5;
i++)
557 gtk_grid_attach(GTK_GRID(
g->details),
g->format_btn[
i], 1, line +
i, 2, 1);
560 gtk_widget_set_no_show_all(GTK_WIDGET(
g->details),
TRUE);
567 gtk_entry_set_text(GTK_ENTRY(
g->description), c.description);
568 gtk_entry_set_text(GTK_ENTRY(
g->model), c.model);
569 gtk_entry_set_text(GTK_ENTRY(
g->maker), c.maker);
570 gtk_entry_set_text(GTK_ENTRY(
g->lens), c.lens);
571 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->iso_min), c.iso_min);
572 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->iso_max), c.iso_max);
574 float val = c.exposure_min;
579 val = c.exposure_max;
583 val = c.aperture_min;
587 val = c.aperture_max;
591 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->focal_length_min), c.focal_length_min);
592 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->focal_length_max), c.focal_length_max);
593 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->autoapply), c.autoapply);
594 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->filter), c.filter);
596 for(
k = 0;
k < 5;
k++)
602 gtk_entry_set_text(GTK_ENTRY(
g->description),
"");
603 gtk_entry_set_text(GTK_ENTRY(
g->model),
"%");
604 gtk_entry_set_text(GTK_ENTRY(
g->maker),
"%");
605 gtk_entry_set_text(GTK_ENTRY(
g->lens),
"%");
606 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->iso_min), 0);
607 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->iso_max), FLT_MAX);
626 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->focal_length_min), 0);
627 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->focal_length_max), 1000);
628 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->autoapply), 0);
629 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->filter), 0);
630 for(
k = 0;
k < 5;
k++) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->format_btn[
k]),
TRUE);
634 if(!allow_remove ||
g->old_id < 0)
636 GtkWidget *w = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_REJECT);
637 if(w) gtk_widget_set_sensitive(w,
FALSE);
642 GtkWidget *w = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_YES);
643 if(w) gtk_widget_set_sensitive(w,
FALSE);
647 if(!allow_desc_change && !allow_name_change)
649 GtkWidget *w = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
650 if(w) gtk_widget_grab_focus(w);
654 gtk_widget_show_all(dialog);
658 gpointer data, gboolean allow_name_change, gboolean allow_desc_change,
659 gboolean allow_remove, GtkWindow *parent)
664 g->original_name = g_strdup(name_in);
666 g->operation = g_strdup(module->
op);
667 g->op_version =
module->version();
668 g->module_name = g_strdup(module->name());
669 g->callback = final_callback;
677 GCallback final_callback, gpointer data, gboolean allow_name_change,
678 gboolean allow_desc_change, gboolean allow_remove, GtkWindow *parent)
680 gchar *operation = NULL;
687 g->original_name = g_strdup(name_in);
688 g->operation = operation;
689 g->op_version = op_version;
690 g->module_name = g_strdup(module_name);
691 g->callback = final_callback;
704 int writeprotect = -1;
715 name = g_strdup(name_in);
729 gchar *
name = g_object_get_data(G_OBJECT(menuitem),
"dt-preset-name");
731 gint
res = GTK_RESPONSE_YES;
737 = gtk_message_dialog_new(GTK_WINDOW(
window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION,
738 GTK_BUTTONS_YES_NO, _(
"do you really want to update the preset `%s'?"),
name);
739#ifdef GDK_WINDOWING_QUARTZ
742 gtk_window_set_title(GTK_WINDOW(dialog), _(
"update preset?"));
743 res = gtk_dialog_run(GTK_DIALOG(dialog));
744 GtkWindow *dialog_parent = gtk_window_get_transient_for(GTK_WINDOW(dialog));
745 gtk_widget_destroy(dialog);
749 if(
res == GTK_RESPONSE_YES)
774 if(
p->op_params && (
p->op_params_size == module->
params_size))
776 memcpy(module->
params,
p->op_params,
p->op_params_size);
777 module->enabled = p->enabled;
784 else if(
p->blendop_params
787 p->blendop_params_size) == 0)
807 gchar *
name = g_object_get_data(G_OBJECT(menuitem),
"dt-preset-name");
813 dt_image_t *image = &
module->dev->image_storage;
815 const char *workflow_preset = (has_matrix) ? _(
"scene-referred default") :
"\t\n";
837 .excluded = excluded };
840 &match, workflow_preset);
842 gboolean applied =
FALSE;
843 for(GList *l =
names; l; l = g_list_next(l))
848 g_list_free_full(
names, g_free);
860 else if (event->button == 3)
876 gboolean active = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(button));
877 gchar *
string = g_strdup_printf(
"/plugins/%s/opencl", module->
op);
884 gboolean active = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(button));
885 gchar *
string = g_strdup_printf(
"/plugins/%s/cache", module->
op);
900 GtkWidget *submenu = g_hash_table_lookup(submenus, path);
901 if(submenu)
return submenu;
903 GtkWidget *item = gtk_menu_item_new_with_label(label);
904 submenu = gtk_menu_new();
905 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
906 gtk_menu_shell_append(GTK_MENU_SHELL(parent), item);
908 g_hash_table_insert(submenus, g_strdup(path), submenu);
920 if(menu) gtk_widget_destroy(GTK_WIDGET(menu));
923 const gboolean hide_default =
dt_conf_get_bool(
"plugins/darkroom/hide_default_presets");
924 const gboolean default_first =
dt_conf_get_bool(
"modules/default_presets_first");
927 int active_preset = -1, cnt = 0, writeprotect = 0;
931 gboolean have_match =
FALSE;
968 GHashTable *submenus = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
969 for(GList *l = presets; l; l = g_list_next(l))
972 const int chk_writeprotect =
p->writeprotect;
973 if(hide_default && chk_writeprotect)
980 last_wp = chk_writeprotect;
982 else if(last_wp != chk_writeprotect)
984 last_wp = chk_writeprotect;
985 gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
987 const void *op_params =
p->op_params;
988 const int32_t op_params_size =
p->op_params_size;
989 const void *blendop_params =
p->blendop_params;
990 const int32_t bl_params_size =
p->blendop_params_size;
991 const int32_t preset_version =
p->op_version;
993 const int32_t isdisabled = (preset_version == version ? 0 : 1);
994 const char *
name =
p->name;
995 gboolean isdefault =
FALSE;
1007 gchar **split = g_strsplit(
name,
"|", -1);
1009 for(
int i = 0; split[
i];
i++)
1010 if(split[
i][0] !=
'\0') leaf =
i;
1012 GtkWidget *parent_menu = GTK_WIDGET(menu);
1015 GString *path = g_string_new(NULL);
1016 for(
int i = 0;
i < leaf;
i++)
1018 if(split[
i][0] ==
'\0')
continue;
1019 if(path->len > 0) g_string_append_c(path,
'|');
1020 g_string_append(path, split[
i]);
1023 g_string_free(path,
TRUE);
1025 const gchar *leaf_name = leaf >= 0 ? split[leaf] :
name;
1029 label = g_strdup_printf(
"%s %s", leaf_name, _(
"(default)"));
1031 label = g_strdup(leaf_name);
1032 mi = gtk_menu_item_new_with_label(label);
1042 active_preset = cnt;
1043 writeprotect =
p->writeprotect;
1049 gtk_widget_set_sensitive(mi, 0);
1050 gtk_widget_set_tooltip_text(mi, _(
"disabled: wrong module version"));
1054 g_object_set_data_full(G_OBJECT(mi),
"dt-preset-name", g_strdup(
name), g_free);
1061 g_signal_connect(G_OBJECT(mi),
"activate", G_CALLBACK(
pick_callback), callback_data);
1062 gtk_widget_set_tooltip_text(mi,
p->description);
1064 gtk_menu_shell_append(GTK_MENU_SHELL(parent_menu), mi);
1068 g_hash_table_destroy(submenus);
1070 if(cnt > 0) gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
1074 if(active_preset >= 0 && !writeprotect)
1076 mi = gtk_menu_item_new_with_label(_(
"edit this preset.."));
1078 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1080 mi = gtk_menu_item_new_with_label(_(
"delete this preset"));
1082 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1086 mi = gtk_menu_item_new_with_label(_(
"store new preset.."));
1088 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1092 char *markup = g_markup_printf_escaped(
"%s <span weight='bold'>%s</span>", _(
"update preset"),
1094 mi = gtk_menu_item_new_with_label(
"");
1095 gtk_label_set_markup(GTK_LABEL(gtk_bin_get_child(GTK_BIN(mi))), markup);
1096 g_object_set_data_full(G_OBJECT(mi),
"dt-preset-name", g_strdup(
dt_gui_get_global()->last_preset), g_free);
1098 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1105 if(module && (module->set_preferences))
1107 gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
1108 if(module->set_preferences)
module->set_preferences(GTK_MENU_SHELL(menu), module);
1113 if(module && module->process_cl)
1115 gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
1117 GtkWidget *item = gtk_check_menu_item_new_with_label(_(
"Use OpenCL (GPU computing)"));
1118 gtk_widget_set_tooltip_text(item, _(
"Run this module on GPU if possible.\n"
1119 "Disable if you face recurring issues on GPU with this module.\n"
1120 "Does not require a restart."));
1121 gchar *
string = g_strdup_printf(
"/plugins/%s/opencl", module->
op);
1123 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),
dt_conf_get_bool(
string));
1127 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1129 item = gtk_check_menu_item_new_with_label(_(
"Cache the GPU output"));
1130 gtk_widget_set_tooltip_text(item, _(
"Store the output of this module in cache when running on GPU.\n"
1131 "This may prevent some recomputations, at the cost of more memory I/O.\n"
1132 "The trade-off is worth it only for slow modules."));
1133 string = g_strdup_printf(
"/plugins/%s/cache", module->
op);
1135 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),
dt_conf_get_bool(
string));
1139 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1148 void *callback_data)
1161 const char *
maker,
const char *
model,
const char *lens)
1167 const float min,
const float max)
1197 const int autoapply)
void dt_accels_disconnect_on_text_input(GtkWidget *widget)
Disconnect accels while a text or search entry has the focus, and reconnect them when it loses it....
GtkWidget * dt_gui_main_window(void)
void dt_gui_store_last_preset(const char *name)
const char ** description(struct dt_iop_module_t *self)
size_t params_size(dt_imageio_module_format_t *self)
int dt_bauhaus_combobox_get(GtkWidget *widget)
void dt_bauhaus_combobox_set(GtkWidget *widget, const int pos)
GtkWidget * dt_bauhaus_combobox_new(dt_bauhaus_t *bh, dt_gui_module_t *self)
void dt_bauhaus_combobox_add(GtkWidget *widget, const char *text)
void dt_develop_blend_init_blend_parameters(dt_develop_blend_params_t *blend_params, dt_develop_blend_colorspace_t cst)
int dt_develop_blend_version(void)
int dt_develop_blend_legacy_params(dt_iop_module_t *module, const void *const old_params, const int old_version, void *new_params, const int new_version, const int length)
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
static const float const float const float min
void dt_conf_set_bool(const char *name, int val)
int dt_conf_get_bool(const char *name)
gchar * dt_conf_get_string(const char *name)
Read the stored string for name as a private copy.
void dt_conf_set_string(const char *name, const char *val)
void dt_conf_set_folder_from_file_chooser(const char *name, GtkFileChooser *chooser)
gboolean dt_conf_get_folder_to_file_chooser(const char *name, GtkFileChooser *chooser)
gboolean dt_image_is_matrix_correction_supported(const dt_image_t *img)
int dt_image_monochrome_flags(const dt_image_t *img)
gboolean dt_image_is_hdr(const dt_image_t *img)
gboolean dt_image_needs_rawprepare(const dt_image_t *img)
const char darktable_package_version[]
void dt_control_log(const char *msg,...)
struct dt_develop_t * dt_dev_get_global(void)
struct dt_gui_gtk_t * dt_gui_get_global(void)
struct dt_bauhaus_t * dt_bauhaus_get_global(void)
#define dt_dev_add_history_item(dev, module, enable, redraw)
void dt_gui_refocus_parent(GtkWindow *parent)
GHashTable * names
GtkWidget* -> the name the application knows it by.
gboolean enabled
–doc was passed on the command line
gboolean dt_gui_presets_autoapply_for_module(dt_iop_module_t *module)
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)
static void _opencl_disable_callback(GtkButton *button, dt_iop_module_t *module)
static void _edit_preset_final_callback(dt_gui_presets_edit_dialog_t *g)
void dt_gui_presets_show_iop_edit_dialog(const char *name_in, dt_iop_module_t *module, GCallback final_callback, gpointer data, gboolean allow_name_change, gboolean allow_desc_change, gboolean allow_remove, GtkWindow *parent)
void dt_gui_presets_popup_menu_show_for_params(dt_dev_operation_t op, int32_t version, void *params, int32_t params_size, void *blendop_params, const dt_image_t *image, void(*pick_callback)(GtkMenuItem *, void *), void *callback_data)
const int dt_gui_presets_exposure_value_cnt
static void _menuitem_update_preset(GtkMenuItem *menuitem, dt_iop_module_t *module)
void dt_gui_presets_update_filter(const char *name, dt_dev_operation_t op, const int32_t version, const int filter)
void dt_gui_presets_confirm_and_delete(GtkWidget *parent_dialog, const char *name, const char *module_name, int rowid)
static void _presets_show_edit_dialog(dt_gui_presets_edit_dialog_t *g, gboolean allow_name_change, gboolean allow_desc_change, gboolean allow_remove)
void dt_gui_presets_update_ldr(const char *name, dt_dev_operation_t op, const int32_t version, const int ldrflag)
const float dt_gui_presets_aperture_value[]
const int dt_gui_presets_aperture_value_cnt
void dt_gui_presets_update_av(const char *name, dt_dev_operation_t op, const int32_t version, const float min, const float max)
static void _menuitem_new_preset(GtkMenuItem *menuitem, dt_iop_module_t *module)
void dt_gui_presets_update_fl(const char *name, dt_dev_operation_t op, const int32_t version, const float min, const float max)
static void _cache_disable_callback(GtkButton *button, dt_iop_module_t *module)
static void _menuitem_edit_preset(GtkMenuItem *menuitem, dt_iop_module_t *module)
void dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
void dt_gui_presets_update_iso(const char *name, dt_dev_operation_t op, const int32_t version, const float min, const float max)
void dt_gui_presets_init()
void dt_gui_presets_update_mml(const char *name, dt_dev_operation_t op, const int32_t version, const char *maker, const char *model, const char *lens)
static void _edit_preset_response(GtkDialog *dialog, gint response_id, dt_gui_presets_edit_dialog_t *g)
const char * dt_gui_presets_exposure_value_str[]
static GtkWidget * _presets_get_submenu(GtkWidget *parent, GHashTable *submenus, const gchar *path, const gchar *label)
void dt_gui_presets_add_with_blendop(const char *name, dt_dev_operation_t op, const int32_t version, const void *params, const int32_t params_size, const void *blend_params, const int32_t enabled)
static void _check_buttons_activated(GtkCheckButton *button, dt_gui_presets_edit_dialog_t *g)
void dt_gui_presets_cleanup()
static void _menuitem_pick_preset(GtkMenuItem *menuitem, dt_iop_module_t *module)
static void _gui_presets_popup_menu_show_internal(dt_dev_operation_t op, int32_t version, dt_iop_params_t *params, int32_t params_size, dt_develop_blend_params_t *bl_params, dt_iop_module_t *module, const dt_image_t *image, void(*pick_callback)(GtkMenuItem *, void *), void *callback_data)
static gchar * _get_active_preset_name(dt_iop_module_t *module, int *writeprotect)
static void _menuitem_delete_preset(GtkMenuItem *menuitem, dt_iop_module_t *module)
static gboolean _menuitem_button_released_preset(GtkMenuItem *menuitem, GdkEventButton *event, dt_iop_module_t *module)
void dt_gui_presets_add_generic(const char *name, dt_dev_operation_t op, const int32_t version, const void *params, const int32_t params_size, const int32_t enabled)
static void _edit_preset(const char *name_in, dt_iop_module_t *module)
const char * dt_gui_presets_aperture_value_str[]
static gboolean _gui_presets_autogen_enabled
const float dt_gui_presets_exposure_value[]
void dt_gui_presets_apply_preset(const gchar *name, dt_iop_module_t *module)
static const int _gui_presets_format_flag[5]
gboolean dt_gui_presets_autogen_enabled()
void dt_gui_presets_update_tv(const char *name, dt_dev_operation_t op, const int32_t version, const float min, const float max)
void dt_gui_presets_update_autoapply(const char *name, dt_dev_operation_t op, const int32_t version, const int autoapply)
static const char * _gui_presets_format_value_str[5]
#define DT_PRESETS_FOR_NOT
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)
char dt_dev_operation_t[20]
The string identifying an operation in the history stack ("exposure", "colorbalancergb",...
void dt_iop_commit_blend_params(dt_iop_module_t *module, const dt_develop_blend_params_t *blendop_params)
void dt_iop_gui_update(dt_iop_module_t *module)
GtkWidget * dt_iop_gui_get_widget(dt_iop_module_t *module)
void dt_iop_gui_rename_module(dt_iop_module_t *module)
dt_iop_module_t * dt_iop_gui_duplicate(dt_iop_module_t *base, gboolean copy_params)
Create another instance of base, insert it into dev->iop and give it a GUI.
void dt_lib_presets_remove(const gchar *preset, const gchar *module_name, int module_version)
static void pick_callback(GtkMenuItem *menuitem, dt_lib_module_info_t *minfo)
float *const restrict const size_t k
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
void dt_osx_disallow_fullscreen(GtkWidget *widget)
void dt_preset_repository_add_iop_preset(const char *name, const char *operation, const int op_version, const void *params, const int params_size, const void *blend_params, const int blend_params_size, const int blendop_version, const int enabled)
Store an IOP preset, blend parameters included, replacing any of the same name.
void dt_module_preset_free(gpointer data)
Release one dt_module_preset_t. Suits g_list_free_full().
void dt_preset_repository_update_range(const char *operation, const int op_version, const char *name, const dt_preset_range_t range, const double min, const double max)
Set the <range>_min / <range>_max pair of (operation, op_version, name).
void dt_preset_repository_delete_shipped(void)
Delete every write-protected preset – the auto-generated ones, dropped at startup so module code can ...
void dt_preset_repository_cleanup(void)
Finalise the cached statements. See dt_colorlabel_repository_cleanup().
void dt_preset_repository_update_iop_params(const char *operation, const char *name, const int op_version, const void *params, const int params_size, const int enabled, const void *blend_params, const int blend_params_size, const int blendop_version)
Replace the module payload of (operation, name), at any version.
dt_module_preset_t * dt_preset_repository_get_iop_preset(const char *operation, const int op_version, const char *name)
One IOP preset by name, blend parameters included, or NULL.
void dt_preset_repository_update_conditions(const int rowid, const dt_preset_conditions_t *c)
Overwrite the conditions of the row at rowid.
GList * dt_preset_repository_list_for_menu(const char *operation, const dt_preset_match_t *match, const gboolean shipped_first)
Presets of operation to offer in a menu, in display order.
void dt_preset_repository_update_camera(const char *operation, const int op_version, const char *name, const char *maker, const char *model, const char *lens)
Set the camera match of (operation, op_version, name).
gboolean dt_preset_repository_get_conditions(const char *operation, const int op_version, const char *name, dt_preset_conditions_t *c, int *rowid)
Read the conditions of (operation, op_version, name).
gboolean dt_preset_repository_module_preset_exists(const char *operation, const int op_version, const char *name)
TRUE when (operation, op_version, name) exists.
GList * dt_preset_repository_list_for_iop(const char *operation, const int op_version)
Every preset of (operation, op_version), with blend parameters.
void dt_preset_repository_delete_by_rowid_unprotected(const int rowid)
Delete the row at rowid unless it is write-protected.
void dt_preset_conditions_free(dt_preset_conditions_t *c)
Release the strings owned by c (not c itself).
gboolean dt_preset_repository_get_identity(const int rowid, gchar **operation, int *op_version)
The (operation, op_version) a rowid belongs to. Returns FALSE if there is none; *operation is newly a...
void dt_preset_repository_update_flag(const char *operation, const int op_version, const char *name, const dt_preset_flag_t flag, const int value)
Set one integer condition of (operation, op_version, name).
void dt_preset_repository_insert_with_conditions(const dt_preset_conditions_t *c, const char *operation, const int op_version, const void *params, const int params_size, const int enabled, const void *blend_params, const int blend_params_size, const int blendop_version)
Create a preset from a full condition set plus its module payload.
GList * dt_preset_repository_find_autoapply(const char *operation, const int op_version, const dt_preset_match_t *match, const char *always_name)
Names of the presets that should be applied to this image automatically.
data.presets: a module's saved parameters, with the conditions under which it auto-applies.
@ DT_PRESET_FLAG_AUTOAPPLY
@ DT_PRESET_RANGE_FOCAL_LENGTH
@ DT_PRESET_RANGE_APERTURE
@ DT_PRESET_RANGE_EXPOSURE
GtkMenu * presets_popup_menu
dt_iop_params_t * default_params
struct dt_develop_blend_params_t * blend_params
struct dt_develop_t * dev
struct dt_develop_blend_params_t * default_blendop_params
The facts about one image that decide whether a preset matches it.
const char * camera_maker
const char * camera_alias