322 if(response_id == GTK_RESPONSE_OK)
328 const gchar *
name = gtk_entry_get_text(
g->name);
329 if(((
g->old_id >= 0) && (strcmp(
g->original_name,
name) != 0)) || (
g->old_id < 0))
335 = gtk_message_dialog_new(GTK_WINDOW(dialog), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
336 GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, _(
"please give preset a name"));
337#ifdef GDK_WINDOWING_QUARTZ
341 gtk_window_set_title(GTK_WINDOW(dlg_changename), _(
"unnamed preset"));
343 gtk_dialog_run(GTK_DIALOG(dlg_changename));
344 gtk_widget_destroy(dlg_changename);
355 " WHERE name = ?1 AND operation=?2 AND op_version=?3"
363 if(sqlite3_step(stmt) == SQLITE_ROW)
365 sqlite3_finalize(stmt);
368 GtkWidget *dlg_overwrite = gtk_message_dialog_new(
369 GTK_WINDOW(dialog), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING,
370 GTK_BUTTONS_YES_NO, _(
"preset `%s' already exists.\ndo you want to overwrite?"),
name);
371#ifdef GDK_WINDOWING_QUARTZ
375 gtk_window_set_title(GTK_WINDOW(dlg_overwrite), _(
"overwrite preset?"));
377 const gint dlg_ret = gtk_dialog_run(GTK_DIALOG(dlg_overwrite));
378 gtk_widget_destroy(dlg_overwrite);
381 if(dlg_ret == GTK_RESPONSE_YES)
391 sqlite3_finalize(stmt);
400 query = g_strdup_printf(
"UPDATE data.presets "
402 " name=?1, description=?2,"
403 " model=?3, maker=?4, lens=?5, iso_min=?6, iso_max=?7, exposure_min=?8,"
404 " exposure_max=?9, aperture_min=?10,"
405 " aperture_max=?11, focal_length_min=?12, focal_length_max=?13, autoapply=?14,"
406 " filter=?15, format=?16 "
415 query = g_strdup_printf(
"INSERT INTO data.presets"
416 " (name, description, "
417 " model, maker, lens, iso_min, iso_max, exposure_min, exposure_max, aperture_min,"
418 " aperture_max, focal_length_min, focal_length_max, autoapply,"
419 " filter, format, def, writeprotect, operation, op_version, op_params, enabled,"
420 " blendop_params, blendop_version, multi_priority, multi_name) "
422 " (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, 0, 0, ?17,"
423 " ?18, ?19, ?20, ?21, ?22, 0, '')");
449 for(
int k = 0;
k < 5;
k++)
481 sqlite3_finalize(stmt);
485 else if(response_id == GTK_RESPONSE_YES &&
g->old_id)
487 const gchar *
name = gtk_entry_get_text(
g->name);
490 GtkFileChooserNative *filechooser = gtk_file_chooser_native_new(
491 _(
"select directory"), GTK_WINDOW(dialog), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
492 _(
"_select as output destination"), _(
"_cancel"));
496 if(gtk_native_dialog_run(GTK_NATIVE_DIALOG(filechooser)) == GTK_RESPONSE_ACCEPT)
498 char *filedir = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filechooser));
505 g_object_unref(GTK_WIDGET(filechooser));
508 else if(response_id == GTK_RESPONSE_REJECT &&
g->old_id)
515 GtkWindow *dialog_parent = gtk_window_get_transient_for(GTK_WINDOW(dialog));
516 gtk_widget_destroy(GTK_WIDGET(dialog));
565 gboolean allow_desc_change, gboolean allow_remove)
569 snprintf(title,
sizeof(title), _(
"edit `%s' for module `%s'"),
g->original_name,
g->module_name);
570 GtkWidget *dialog = gtk_dialog_new_with_buttons
571 (title,
g->parent, GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
572 _(
"_cancel"), GTK_RESPONSE_CANCEL, _(
"_export..."), GTK_RESPONSE_YES,
573 _(
"delete"), GTK_RESPONSE_REJECT, _(
"_ok"), GTK_RESPONSE_OK, NULL);
574 gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
576#ifdef GDK_WINDOWING_QUARTZ
579 GtkContainer *content_area = GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog)));
581 gtk_container_add(content_area, GTK_WIDGET(box));
583 g->name = GTK_ENTRY(gtk_entry_new());
585 gtk_entry_set_text(
g->name,
g->original_name);
586 if(allow_name_change)
587 gtk_entry_set_activates_default(
g->name,
TRUE);
589 gtk_widget_set_sensitive(GTK_WIDGET(
g->name),
FALSE);
590 gtk_box_pack_start(box, GTK_WIDGET(
g->name),
FALSE,
FALSE, 0);
591 gtk_widget_set_tooltip_text(GTK_WIDGET(
g->name), _(
"name of the preset"));
593 g->description = GTK_ENTRY(gtk_entry_new());
595 if(allow_desc_change)
596 gtk_entry_set_activates_default(
g->description,
TRUE);
598 gtk_widget_set_sensitive(GTK_WIDGET(
g->description),
FALSE);
599 gtk_box_pack_start(box, GTK_WIDGET(
g->description),
FALSE,
FALSE, 0);
600 gtk_widget_set_tooltip_text(GTK_WIDGET(
g->description), _(
"description or further information"));
603 = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(_(
"auto apply this preset to matching images")));
604 gtk_box_pack_start(box, GTK_WIDGET(
g->autoapply),
FALSE,
FALSE, 0);
606 = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(_(
"only show this preset for matching images")));
607 gtk_widget_set_tooltip_text(GTK_WIDGET(
g->filter), _(
"be very careful with this option. "
608 "this might be the last time you see your preset."));
609 gtk_box_pack_start(box, GTK_WIDGET(
g->filter),
FALSE,
FALSE, 0);
615 gtk_widget_set_no_show_all(GTK_WIDGET(
g->filter),
TRUE);
621 g->details = gtk_grid_new();
624 gtk_box_pack_start(box, GTK_WIDGET(
g->details),
TRUE,
TRUE, 0);
629 g->model = gtk_entry_new();
631 gtk_widget_set_hexpand(GTK_WIDGET(
g->model),
TRUE);
633 gtk_widget_set_tooltip_text(
g->model, _(
"string to match model (use % as wildcard)"));
634 label = gtk_label_new(_(
"model"));
635 gtk_widget_set_halign(label, GTK_ALIGN_START);
636 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
637 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->model, label, GTK_POS_RIGHT, 2, 1);
639 g->maker = gtk_entry_new();
642 gtk_widget_set_tooltip_text(
g->maker, _(
"string to match maker (use % as wildcard)"));
643 label = gtk_label_new(_(
"maker"));
644 gtk_widget_set_halign(label, GTK_ALIGN_START);
645 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
646 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->maker, label, GTK_POS_RIGHT, 2, 1);
648 g->lens = gtk_entry_new();
651 gtk_widget_set_tooltip_text(
g->lens, _(
"string to match lens (use % as wildcard)"));
652 label = gtk_label_new(_(
"lens"));
653 gtk_widget_set_halign(label, GTK_ALIGN_START);
654 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
655 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->lens, label, GTK_POS_RIGHT, 2, 1);
658 label = gtk_label_new(_(
"ISO"));
659 gtk_widget_set_halign(label, GTK_ALIGN_START);
660 g->iso_min = gtk_spin_button_new_with_range(0, FLT_MAX, 100);
661 gtk_widget_set_tooltip_text(
g->iso_min, _(
"minimum ISO value"));
662 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(
g->iso_min), 0);
663 g->iso_max = gtk_spin_button_new_with_range(0, FLT_MAX, 100);
664 gtk_widget_set_tooltip_text(
g->iso_max, _(
"maximum ISO value"));
665 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(
g->iso_max), 0);
666 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
667 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->iso_min, label, GTK_POS_RIGHT, 1, 1);
668 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->iso_max,
g->iso_min, GTK_POS_RIGHT, 1, 1);
671 label = gtk_label_new(_(
"exposure"));
672 gtk_widget_set_halign(label, GTK_ALIGN_START);
675 gtk_widget_set_tooltip_text(
g->exposure_min, _(
"minimum exposure time"));
676 gtk_widget_set_tooltip_text(
g->exposure_max, _(
"maximum exposure time"));
681 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
682 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->exposure_min, label, GTK_POS_RIGHT, 1, 1);
683 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->exposure_max,
g->exposure_min, GTK_POS_RIGHT, 1, 1);
686 label = gtk_label_new(_(
"aperture"));
687 gtk_widget_set_halign(label, GTK_ALIGN_START);
690 gtk_widget_set_tooltip_text(
g->aperture_min, _(
"minimum aperture value"));
691 gtk_widget_set_tooltip_text(
g->aperture_max, _(
"maximum aperture value"));
696 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
697 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->aperture_min, label, GTK_POS_RIGHT, 1, 1);
698 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->aperture_max,
g->aperture_min, GTK_POS_RIGHT, 1, 1);
701 label = gtk_label_new(_(
"focal length"));
702 gtk_widget_set_halign(label, GTK_ALIGN_START);
703 g->focal_length_min = gtk_spin_button_new_with_range(0, 1000, 10);
704 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(
g->focal_length_min), 0);
705 g->focal_length_max = gtk_spin_button_new_with_range(0, 1000, 10);
706 gtk_spin_button_set_digits(GTK_SPIN_BUTTON(
g->focal_length_max), 0);
707 gtk_widget_set_tooltip_text(
g->focal_length_min, _(
"minimum focal length"));
708 gtk_widget_set_tooltip_text(
g->focal_length_max, _(
"maximum focal length"));
709 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line++, 1, 1);
710 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->focal_length_min, label, GTK_POS_RIGHT, 1, 1);
711 gtk_grid_attach_next_to(GTK_GRID(
g->details),
g->focal_length_max,
g->focal_length_min, GTK_POS_RIGHT, 1, 1);
714 label = gtk_label_new(_(
"format"));
715 gtk_widget_set_halign(label, GTK_ALIGN_START);
716 gtk_grid_attach(GTK_GRID(
g->details), label, 0, line, 1, 1);
717 gtk_widget_set_tooltip_text(label, _(
"select image types you want this preset to be available for"));
719 for(
int i = 0;
i < 5;
i++)
722 gtk_grid_attach(GTK_GRID(
g->details),
g->format_btn[
i], 1, line +
i, 2, 1);
725 gtk_widget_set_no_show_all(GTK_WIDGET(
g->details),
TRUE);
731 "SELECT rowid, description, model, maker, lens, iso_min, iso_max, "
732 " exposure_min, exposure_max, aperture_min, aperture_max, focal_length_min, "
733 " focal_length_max, autoapply, filter, format"
735 " WHERE name = ?1 AND operation = ?2 AND op_version = ?3",
741 if(sqlite3_step(stmt) == SQLITE_ROW)
743 g->old_id = sqlite3_column_int(stmt, 0);
744 gtk_entry_set_text(GTK_ENTRY(
g->description), (
const char *)sqlite3_column_text(stmt, 1));
745 gtk_entry_set_text(GTK_ENTRY(
g->model), (
const char *)sqlite3_column_text(stmt, 2));
746 gtk_entry_set_text(GTK_ENTRY(
g->maker), (
const char *)sqlite3_column_text(stmt, 3));
747 gtk_entry_set_text(GTK_ENTRY(
g->lens), (
const char *)sqlite3_column_text(stmt, 4));
748 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->iso_min), sqlite3_column_double(stmt, 5));
749 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->iso_max), sqlite3_column_double(stmt, 6));
751 float val = sqlite3_column_double(stmt, 7);
756 val = sqlite3_column_double(stmt, 8);
760 val = sqlite3_column_double(stmt, 9);
764 val = sqlite3_column_double(stmt, 10);
768 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->focal_length_min), sqlite3_column_double(stmt, 11));
769 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->focal_length_max), sqlite3_column_double(stmt, 12));
770 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->autoapply), sqlite3_column_int(stmt, 13));
771 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->filter), sqlite3_column_int(stmt, 14));
773 for(
k = 0;
k < 5;
k++)
778 gtk_entry_set_text(GTK_ENTRY(
g->description),
"");
779 gtk_entry_set_text(GTK_ENTRY(
g->model),
"%");
780 gtk_entry_set_text(GTK_ENTRY(
g->maker),
"%");
781 gtk_entry_set_text(GTK_ENTRY(
g->lens),
"%");
782 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->iso_min), 0);
783 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->iso_max), FLT_MAX);
802 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->focal_length_min), 0);
803 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
g->focal_length_max), 1000);
804 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->autoapply), 0);
805 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->filter), 0);
806 for(
k = 0;
k < 5;
k++) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->format_btn[
k]),
TRUE);
808 sqlite3_finalize(stmt);
811 if(!allow_remove ||
g->old_id < 0)
813 GtkWidget *w = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_REJECT);
814 if(w) gtk_widget_set_sensitive(w,
FALSE);
819 GtkWidget *w = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_YES);
820 if(w) gtk_widget_set_sensitive(w,
FALSE);
824 if(!allow_desc_change && !allow_name_change)
826 GtkWidget *w = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_CANCEL);
827 if(w) gtk_widget_grab_focus(w);
831 gtk_widget_show_all(dialog);
1148 void *callback_data)
1151 if(menu) gtk_widget_destroy(GTK_WIDGET(menu));
1154 const gboolean hide_default =
dt_conf_get_bool(
"plugins/darkroom/hide_default_presets");
1155 const gboolean default_first =
dt_conf_get_bool(
"modules/default_presets_first");
1157 gchar *query = NULL;
1160 int active_preset = -1, cnt = 0, writeprotect = 0;
1182 query = g_strdup_printf
1183 (
"SELECT name, op_params, writeprotect, description, blendop_params, "
1184 " op_version, enabled"
1185 " FROM data.presets"
1186 " WHERE operation=?1"
1189 " (((?2 LIKE model AND ?3 LIKE maker) OR (?4 LIKE model AND ?5 LIKE maker))"
1191 " AND ?7 BETWEEN iso_min AND iso_max"
1192 " AND ?8 BETWEEN exposure_min AND exposure_max"
1193 " AND ?9 BETWEEN aperture_min AND aperture_max"
1194 " AND ?10 BETWEEN focal_length_min AND focal_length_max"
1195 " AND (format = 0 OR (format&?11 != 0 AND ~format&?12 != 0))))"
1196 " ORDER BY writeprotect %s, LOWER(name), rowid",
1197 default_first ?
"DESC":
"ASC");
1218 query = g_strdup_printf(
"SELECT name, op_params, writeprotect, "
1219 " description, blendop_params, op_version, enabled"
1220 " FROM data.presets"
1221 " WHERE operation=?1"
1222 " ORDER BY writeprotect %s, LOWER(name), rowid",
1223 default_first ?
"DESC":
"ASC"
1233 GHashTable *submenus = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
1234 while(sqlite3_step(stmt) == SQLITE_ROW)
1236 const int chk_writeprotect = sqlite3_column_int(stmt, 2);
1237 if(hide_default && chk_writeprotect)
1244 last_wp = chk_writeprotect;
1246 else if(last_wp != chk_writeprotect)
1248 last_wp = chk_writeprotect;
1249 gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
1251 const void *op_params = (
void *)sqlite3_column_blob(stmt, 1);
1252 const int32_t op_params_size = sqlite3_column_bytes(stmt, 1);
1253 const void *blendop_params = (
void *)sqlite3_column_blob(stmt, 4);
1254 const int32_t bl_params_size = sqlite3_column_bytes(stmt, 4);
1255 const int32_t preset_version = sqlite3_column_int(stmt, 5);
1256 const int32_t enabled = sqlite3_column_int(stmt, 6);
1257 const int32_t isdisabled = (preset_version == version ? 0 : 1);
1258 const char *
name = (
char *)sqlite3_column_text(stmt, 0);
1259 gboolean isdefault =
FALSE;
1271 gchar **split = g_strsplit(
name,
"|", -1);
1273 for(
int i = 0; split[
i];
i++)
1274 if(split[
i][0] !=
'\0') leaf =
i;
1276 GtkWidget *parent_menu = GTK_WIDGET(menu);
1279 GString *path = g_string_new(NULL);
1280 for(
int i = 0;
i < leaf;
i++)
1282 if(split[
i][0] ==
'\0')
continue;
1283 if(path->len > 0) g_string_append_c(path,
'|');
1284 g_string_append(path, split[
i]);
1287 g_string_free(path,
TRUE);
1289 const gchar *leaf_name = leaf >= 0 ? split[leaf] :
name;
1293 label = g_strdup_printf(
"%s %s", leaf_name, _(
"(default)"));
1295 label = g_strdup(leaf_name);
1296 mi = gtk_menu_item_new_with_label(label);
1304 && module->
enabled == enabled)
1306 active_preset = cnt;
1307 writeprotect = sqlite3_column_int(stmt, 2);
1313 gtk_widget_set_sensitive(mi, 0);
1314 gtk_widget_set_tooltip_text(mi, _(
"disabled: wrong module version"));
1318 g_object_set_data_full(G_OBJECT(mi),
"dt-preset-name", g_strdup(
name), g_free);
1325 g_signal_connect(G_OBJECT(mi),
"activate", G_CALLBACK(
pick_callback), callback_data);
1326 gtk_widget_set_tooltip_text(mi, (
const char *)sqlite3_column_text(stmt, 3));
1328 gtk_menu_shell_append(GTK_MENU_SHELL(parent_menu), mi);
1331 sqlite3_finalize(stmt);
1332 g_hash_table_destroy(submenus);
1334 if(cnt > 0) gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
1338 if(active_preset >= 0 && !writeprotect)
1340 mi = gtk_menu_item_new_with_label(_(
"edit this preset.."));
1342 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1344 mi = gtk_menu_item_new_with_label(_(
"delete this preset"));
1346 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1350 mi = gtk_menu_item_new_with_label(_(
"store new preset.."));
1352 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1356 char *markup = g_markup_printf_escaped(
"%s <span weight='bold'>%s</span>", _(
"update preset"),
1358 mi = gtk_menu_item_new_with_label(
"");
1359 gtk_label_set_markup(GTK_LABEL(gtk_bin_get_child(GTK_BIN(mi))), markup);
1362 gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
1369 if(module && (module->set_preferences))
1371 gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
1372 if(module->set_preferences)
module->set_preferences(GTK_MENU_SHELL(menu), module);
1377 if(module && module->process_cl)
1379 gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
1381 GtkWidget *item = gtk_check_menu_item_new_with_label(_(
"Use OpenCL (GPU computing)"));
1382 gtk_widget_set_tooltip_text(item, _(
"Run this module on GPU if possible.\n"
1383 "Disable if you face recurring issues on GPU with this module.\n"
1384 "Does not require a restart."));
1385 gchar *
string = g_strdup_printf(
"/plugins/%s/opencl", module->
op);
1387 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),
dt_conf_get_bool(
string));
1391 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1393 item = gtk_check_menu_item_new_with_label(_(
"Cache the GPU output"));
1394 gtk_widget_set_tooltip_text(item, _(
"Store the output of this module in cache when running on GPU.\n"
1395 "This may prevent some recomputations, at the cost of more memory I/O.\n"
1396 "The trade-off is worth it only for slow modules."));
1397 string = g_strdup_printf(
"/plugins/%s/cache", module->
op);
1399 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),
dt_conf_get_bool(
string));
1403 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);