320 if(response_id == GTK_RESPONSE_OK)
326 const gchar *
name = gtk_entry_get_text(
g->name);
327 if(((
g->old_id >= 0) && (strcmp(
g->original_name,
name) != 0)) || (
g->old_id < 0))
333 = gtk_message_dialog_new(GTK_WINDOW(dialog), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
334 GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, _(
"please give preset a name"));
335#ifdef GDK_WINDOWING_QUARTZ
339 gtk_window_set_title(GTK_WINDOW(dlg_changename), _(
"unnamed preset"));
341 gtk_dialog_run(GTK_DIALOG(dlg_changename));
342 gtk_widget_destroy(dlg_changename);
353 " WHERE name = ?1 AND operation=?2 AND op_version=?3"
361 if(sqlite3_step(stmt) == SQLITE_ROW)
363 sqlite3_finalize(stmt);
366 GtkWidget *dlg_overwrite = gtk_message_dialog_new(
367 GTK_WINDOW(dialog), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING,
368 GTK_BUTTONS_YES_NO, _(
"preset `%s' already exists.\ndo you want to overwrite?"),
name);
369#ifdef GDK_WINDOWING_QUARTZ
373 gtk_window_set_title(GTK_WINDOW(dlg_overwrite), _(
"overwrite preset?"));
375 const gint dlg_ret = gtk_dialog_run(GTK_DIALOG(dlg_overwrite));
376 gtk_widget_destroy(dlg_overwrite);
379 if(dlg_ret == GTK_RESPONSE_YES)
389 sqlite3_finalize(stmt);
398 query = g_strdup_printf(
"UPDATE data.presets "
400 " name=?1, description=?2,"
401 " model=?3, maker=?4, lens=?5, iso_min=?6, iso_max=?7, exposure_min=?8,"
402 " exposure_max=?9, aperture_min=?10,"
403 " aperture_max=?11, focal_length_min=?12, focal_length_max=?13, autoapply=?14,"
404 " filter=?15, format=?16 "
413 query = g_strdup_printf(
"INSERT INTO data.presets"
414 " (name, description, "
415 " model, maker, lens, iso_min, iso_max, exposure_min, exposure_max, aperture_min,"
416 " aperture_max, focal_length_min, focal_length_max, autoapply,"
417 " filter, format, def, writeprotect, operation, op_version, op_params, enabled,"
418 " blendop_params, blendop_version, multi_priority, multi_name) "
420 " (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, 0, 0, ?17,"
421 " ?18, ?19, ?20, ?21, ?22, 0, '')");
447 for(
int k = 0;
k < 5;
k++)
479 sqlite3_finalize(stmt);
483 else if(response_id == GTK_RESPONSE_YES &&
g->old_id)
485 const gchar *
name = gtk_entry_get_text(
g->name);
488 GtkFileChooserNative *filechooser = gtk_file_chooser_native_new(
489 _(
"select directory"), GTK_WINDOW(dialog), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
490 _(
"_select as output destination"), _(
"_cancel"));
494 if(gtk_native_dialog_run(GTK_NATIVE_DIALOG(filechooser)) == GTK_RESPONSE_ACCEPT)
496 char *filedir = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser));
503 g_object_unref(GTK_WIDGET(filechooser));
506 else if(response_id == GTK_RESPONSE_REJECT &&
g->old_id)
513 gtk_widget_destroy(GTK_WIDGET(dialog));
561 gboolean allow_desc_change, gboolean allow_remove)
565 snprintf(title,
sizeof(title), _(
"edit `%s' for module `%s'"),
g->original_name,
g->module_name);
566 GtkWidget *dialog = gtk_dialog_new_with_buttons
567 (title,
g->parent, GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
568 _(
"_cancel"), GTK_RESPONSE_CANCEL, _(
"_export..."), GTK_RESPONSE_YES,
569 _(
"delete"), GTK_RESPONSE_REJECT, _(
"_ok"), GTK_RESPONSE_OK, NULL);
570 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
572#ifdef GDK_WINDOWING_QUARTZ
575 GtkContainer *content_area = GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog)));
577 gtk_container_add(content_area, GTK_WIDGET(box));
579 g->name = GTK_ENTRY(gtk_entry_new());
581 gtk_entry_set_text(
g->name,
g->original_name);
582 if(allow_name_change)
583 gtk_entry_set_activates_default(
g->name,
TRUE);
585 gtk_widget_set_sensitive(GTK_WIDGET(
g->name),
FALSE);
586 gtk_box_pack_start(box, GTK_WIDGET(
g->name),
FALSE,
FALSE, 0);
587 gtk_widget_set_tooltip_text(GTK_WIDGET(
g->name), _(
"name of the preset"));
589 g->description = GTK_ENTRY(gtk_entry_new());
591 if(allow_desc_change)
592 gtk_entry_set_activates_default(
g->description,
TRUE);
594 gtk_widget_set_sensitive(GTK_WIDGET(
g->description),
FALSE);
595 gtk_box_pack_start(box, GTK_WIDGET(
g->description),
FALSE,
FALSE, 0);
596 gtk_widget_set_tooltip_text(GTK_WIDGET(
g->description), _(
"description or further information"));
599 = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(_(
"auto apply this preset to matching images")));
600 gtk_box_pack_start(box, GTK_WIDGET(
g->autoapply),
FALSE,
FALSE, 0);
602 = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(_(
"only show this preset for matching images")));
603 gtk_widget_set_tooltip_text(GTK_WIDGET(
g->filter), _(
"be very careful with this option. "
604 "this might be the last time you see your preset."));
605 gtk_box_pack_start(box, GTK_WIDGET(
g->filter),
FALSE,
FALSE, 0);
611 gtk_widget_set_no_show_all(GTK_WIDGET(
g->filter),
TRUE);
617 g->details = gtk_grid_new();
620 gtk_box_pack_start(box, GTK_WIDGET(
g->details),
TRUE,
TRUE, 0);
625 g->model = gtk_entry_new();
627 gtk_widget_set_hexpand(GTK_WIDGET(
g->model),
TRUE);
629 gtk_widget_set_tooltip_text(
g->model, _(
"string to match model (use % as wildcard)"));
630 label = gtk_label_new(_(
"model"));
631 gtk_widget_set_halign(label, GTK_ALIGN_START);
632 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
633 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->model, label, GTK_POS_RIGHT, 2, 1);
635 g->maker = gtk_entry_new();
638 gtk_widget_set_tooltip_text(
g->maker, _(
"string to match maker (use % as wildcard)"));
639 label = gtk_label_new(_(
"maker"));
640 gtk_widget_set_halign(label, GTK_ALIGN_START);
641 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
642 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->maker, label, GTK_POS_RIGHT, 2, 1);
644 g->lens = gtk_entry_new();
647 gtk_widget_set_tooltip_text(
g->lens, _(
"string to match lens (use % as wildcard)"));
648 label = gtk_label_new(_(
"lens"));
649 gtk_widget_set_halign(label, GTK_ALIGN_START);
650 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
651 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->lens, label, GTK_POS_RIGHT, 2, 1);
654 label = gtk_label_new(_(
"ISO"));
655 gtk_widget_set_halign(label, GTK_ALIGN_START);
656 g->iso_min = gtk_spin_button_new_with_range(0, FLT_MAX, 100);
657 gtk_widget_set_tooltip_text(
g->iso_min, _(
"minimum ISO value"));
658 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(
g->iso_min), 0);
659 g->iso_max = gtk_spin_button_new_with_range(0, FLT_MAX, 100);
660 gtk_widget_set_tooltip_text(
g->iso_max, _(
"maximum ISO value"));
661 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(
g->iso_max), 0);
662 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
663 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->iso_min, label, GTK_POS_RIGHT, 1, 1);
664 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->iso_max,
g->iso_min, GTK_POS_RIGHT, 1, 1);
667 label = gtk_label_new(_(
"exposure"));
668 gtk_widget_set_halign(label, GTK_ALIGN_START);
671 gtk_widget_set_tooltip_text(
g->exposure_min, _(
"minimum exposure time"));
672 gtk_widget_set_tooltip_text(
g->exposure_max, _(
"maximum exposure time"));
677 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
678 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->exposure_min, label, GTK_POS_RIGHT, 1, 1);
679 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->exposure_max,
g->exposure_min, GTK_POS_RIGHT, 1, 1);
682 label = gtk_label_new(_(
"aperture"));
683 gtk_widget_set_halign(label, GTK_ALIGN_START);
686 gtk_widget_set_tooltip_text(
g->aperture_min, _(
"minimum aperture value"));
687 gtk_widget_set_tooltip_text(
g->aperture_max, _(
"maximum aperture value"));
692 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
693 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->aperture_min, label, GTK_POS_RIGHT, 1, 1);
694 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->aperture_max,
g->aperture_min, GTK_POS_RIGHT, 1, 1);
697 label = gtk_label_new(_(
"focal length"));
698 gtk_widget_set_halign(label, GTK_ALIGN_START);
699 g->focal_length_min = gtk_spin_button_new_with_range(0, 1000, 10);
700 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(
g->focal_length_min), 0);
701 g->focal_length_max = gtk_spin_button_new_with_range(0, 1000, 10);
702 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(
g->focal_length_max), 0);
703 gtk_widget_set_tooltip_text(
g->focal_length_min, _(
"minimum focal length"));
704 gtk_widget_set_tooltip_text(
g->focal_length_max, _(
"maximum focal length"));
705 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
706 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->focal_length_min, label, GTK_POS_RIGHT, 1, 1);
707 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->focal_length_max,
g->focal_length_min, GTK_POS_RIGHT, 1, 1);
710 label = gtk_label_new(_(
"format"));
711 gtk_widget_set_halign(label, GTK_ALIGN_START);
712 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line, 1, 1);
713 gtk_widget_set_tooltip_text(label, _(
"select image types you want this preset to be available for"));
715 for(
int i = 0;
i < 5;
i++)
718 gtk_grid_attach(GTK_GRID(
g->details),
g->format_btn[
i], 1, line +
i, 2, 1);
721 gtk_widget_set_no_show_all(GTK_WIDGET(
g->details),
TRUE);
727 "SELECT rowid, description, model, maker, lens, iso_min, iso_max, "
728 " exposure_min, exposure_max, aperture_min, aperture_max, focal_length_min, "
729 " focal_length_max, autoapply, filter, format"
731 " WHERE name = ?1 AND operation = ?2 AND op_version = ?3",
737 if(sqlite3_step(stmt) == SQLITE_ROW)
739 g->old_id = sqlite3_column_int(stmt, 0);
740 gtk_entry_set_text(GTK_ENTRY(
g->description), (
const char *)sqlite3_column_text(stmt, 1));
741 gtk_entry_set_text(GTK_ENTRY(
g->model), (
const char *)sqlite3_column_text(stmt, 2));
742 gtk_entry_set_text(GTK_ENTRY(
g->maker), (
const char *)sqlite3_column_text(stmt, 3));
743 gtk_entry_set_text(GTK_ENTRY(
g->lens), (
const char *)sqlite3_column_text(stmt, 4));
744 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->iso_min), sqlite3_column_double(stmt, 5));
745 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->iso_max), sqlite3_column_double(stmt, 6));
747 float val = sqlite3_column_double(stmt, 7);
752 val = sqlite3_column_double(stmt, 8);
756 val = sqlite3_column_double(stmt, 9);
760 val = sqlite3_column_double(stmt, 10);
764 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->focal_length_min), sqlite3_column_double(stmt, 11));
765 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->focal_length_max), sqlite3_column_double(stmt, 12));
766 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->autoapply), sqlite3_column_int(stmt, 13));
767 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->filter), sqlite3_column_int(stmt, 14));
769 for(
k = 0;
k < 5;
k++)
774 gtk_entry_set_text(GTK_ENTRY(
g->description),
"");
775 gtk_entry_set_text(GTK_ENTRY(
g->model),
"%");
776 gtk_entry_set_text(GTK_ENTRY(
g->maker),
"%");
777 gtk_entry_set_text(GTK_ENTRY(
g->lens),
"%");
778 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->iso_min), 0);
779 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->iso_max), FLT_MAX);
798 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->focal_length_min), 0);
799 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->focal_length_max), 1000);
800 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->autoapply), 0);
801 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->filter), 0);
802 for(
k = 0;
k < 5;
k++) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->format_btn[
k]),
TRUE);
804 sqlite3_finalize(stmt);
807 if(!allow_remove ||
g->old_id < 0)
809 GtkWidget *w = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_REJECT);
810 if(w) gtk_widget_set_sensitive(w,
FALSE);
815 GtkWidget *w = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_YES);
816 if(w) gtk_widget_set_sensitive(w,
FALSE);
820 if(!allow_desc_change && !allow_name_change)
822 GtkWidget *w = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
823 if(w) gtk_widget_grab_focus(w);
827 gtk_widget_show_all(dialog);
1121 void *callback_data)
1124 if(menu) gtk_widget_destroy(GTK_WIDGET(menu));
1127 const gboolean hide_default =
dt_conf_get_bool(
"plugins/darkroom/hide_default_presets");
1128 const gboolean default_first =
dt_conf_get_bool(
"modules/default_presets_first");
1130 gchar *query = NULL;
1133 int active_preset = -1, cnt = 0, writeprotect = 0;
1155 query = g_strdup_printf
1156 (
"SELECT name, op_params, writeprotect, description, blendop_params, "
1157 " op_version, enabled"
1158 " FROM data.presets"
1159 " WHERE operation=?1"
1162 " (((?2 LIKE model AND ?3 LIKE maker) OR (?4 LIKE model AND ?5 LIKE maker))"
1164 " AND ?7 BETWEEN iso_min AND iso_max"
1165 " AND ?8 BETWEEN exposure_min AND exposure_max"
1166 " AND ?9 BETWEEN aperture_min AND aperture_max"
1167 " AND ?10 BETWEEN focal_length_min AND focal_length_max"
1168 " AND (format = 0 OR (format&?11 != 0 AND ~format&?12 != 0))))"
1169 " ORDER BY writeprotect %s, LOWER(name), rowid",
1170 default_first ?
"DESC":
"ASC");
1191 query = g_strdup_printf(
"SELECT name, op_params, writeprotect, "
1192 " description, blendop_params, op_version, enabled"
1193 " FROM data.presets"
1194 " WHERE operation=?1"
1195 " ORDER BY writeprotect %s, LOWER(name), rowid",
1196 default_first ?
"DESC":
"ASC"
1206 while(sqlite3_step(stmt) == SQLITE_ROW)
1208 const int chk_writeprotect = sqlite3_column_int(stmt, 2);
1209 if(hide_default && chk_writeprotect)
1216 last_wp = chk_writeprotect;
1218 else if(last_wp != chk_writeprotect)
1220 last_wp = chk_writeprotect;
1221 gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
1223 const void *op_params = (
void *)sqlite3_column_blob(stmt, 1);
1224 const int32_t op_params_size = sqlite3_column_bytes(stmt, 1);
1225 const void *blendop_params = (
void *)sqlite3_column_blob(stmt, 4);
1226 const int32_t bl_params_size = sqlite3_column_bytes(stmt, 4);
1227 const int32_t preset_version = sqlite3_column_int(stmt, 5);
1228 const int32_t enabled = sqlite3_column_int(stmt, 6);
1229 const int32_t isdisabled = (preset_version == version ? 0 : 1);
1230 const char *
name = (
char *)sqlite3_column_text(stmt, 0);
1231 gboolean isdefault =
FALSE;
1245 label = g_strdup_printf(
"%s %s",
name, _(
"(default)"));
1247 label = g_strdup(
name);
1248 mi = gtk_menu_item_new_with_label(label);
1255 && module->
enabled == enabled)
1257 active_preset = cnt;
1258 writeprotect = sqlite3_column_int(stmt, 2);
1264 gtk_widget_set_sensitive(mi, 0);
1265 gtk_widget_set_tooltip_text(mi, _(
"disabled: wrong module version"));
1269 g_object_set_data_full(G_OBJECT(mi),
"dt-preset-name", g_strdup(
name), g_free);
1276 g_signal_connect(G_OBJECT(mi),
"activate", G_CALLBACK(
pick_callback), callback_data);
1277 gtk_widget_set_tooltip_text(mi, (
const char *)sqlite3_column_text(stmt, 3));
1279 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1282 sqlite3_finalize(stmt);
1284 if(cnt > 0) gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
1288 if(active_preset >= 0 && !writeprotect)
1290 mi = gtk_menu_item_new_with_label(_(
"edit this preset.."));
1292 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1294 mi = gtk_menu_item_new_with_label(_(
"delete this preset"));
1296 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1300 mi = gtk_menu_item_new_with_label(_(
"store new preset.."));
1302 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1306 char *markup = g_markup_printf_escaped(
"%s <span weight='bold'>%s</span>", _(
"update preset"),
1308 mi = gtk_menu_item_new_with_label(
"");
1309 gtk_label_set_markup(GTK_LABEL(gtk_bin_get_child(GTK_BIN(mi))), markup);
1312 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1319 if(module && (module->set_preferences))
1321 gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
1322 if(module->set_preferences)
module->set_preferences(GTK_MENU_SHELL(menu), module);
1327 if(module && module->process_cl)
1329 gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
1331 GtkWidget *item = gtk_check_menu_item_new_with_label(_(
"Use OpenCL (GPU computing)"));
1332 gtk_widget_set_tooltip_text(item, _(
"Run this module on GPU if possible.\n"
1333 "Disable if you face recurring issues on GPU with this module.\n"
1334 "Does not require a restart."));
1335 gchar *
string = g_strdup_printf(
"/plugins/%s/opencl", module->
op);
1337 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),
dt_conf_get_bool(
string));
1341 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1343 item = gtk_check_menu_item_new_with_label(_(
"Cache the GPU output"));
1344 gtk_widget_set_tooltip_text(item, _(
"Store the output of this module in cache when running on GPU.\n"
1345 "This may prevent some recomputations, at the cost of more memory I/O.\n"
1346 "The trade-off is worth it only for slow modules."));
1347 string = g_strdup_printf(
"/plugins/%s/cache", module->
op);
1349 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),
dt_conf_get_bool(
string));
1353 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);