static void pick_callback(GtkMenuItem *menuitem, dt_lib_module_info_t *minfo) { // apply preset via set_params gchar *pn = get_preset_name(menuitem); sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "SELECT op_params, writeprotect FROM data.presets WHERE operation = ?1 AND op_version = ?2 AND name = ?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, minfo->plugin_name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, minfo->version); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 3, pn, -1, SQLITE_TRANSIENT); int res = 0; if(sqlite3_step(stmt) == SQLITE_ROW) { const void *blob = sqlite3_column_blob(stmt, 0); int length = sqlite3_column_bytes(stmt, 0); int writeprotect = sqlite3_column_int(stmt, 1); if(blob) { GList *it = darktable.lib->plugins; while(it) { dt_lib_module_t *module = (dt_lib_module_t *)it->data; if(!strncmp(module->plugin_name, minfo->plugin_name, 128)) { res = module->set_params(module, blob, length); break; } it = g_list_next(it); } } if(!writeprotect) dt_gui_store_last_preset(pn); } sqlite3_finalize(stmt); if(res) { dt_control_log(_("deleting preset for obsolete module")); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "DELETE FROM data.presets WHERE operation = ?1 AND op_version = ?2 AND name = ?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, minfo->plugin_name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, minfo->version); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 3, pn, -1, SQLITE_TRANSIENT); sqlite3_step(stmt); sqlite3_finalize(stmt); } g_free(pn); }
static void menuitem_pick_preset(GtkMenuItem *menuitem, dt_iop_module_t *module) { gchar *name = get_preset_name(menuitem); sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select op_params, enabled, blendop_params, blendop_version, writeprotect from " "presets where operation = ?1 and op_version = ?2 and name = ?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, module->op, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, module->version()); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 3, name, -1, SQLITE_TRANSIENT); if(sqlite3_step(stmt) == SQLITE_ROW) { const void *op_params = sqlite3_column_blob(stmt, 0); int op_length = sqlite3_column_bytes(stmt, 0); int enabled = sqlite3_column_int(stmt, 1); const void *blendop_params = sqlite3_column_blob(stmt, 2); int bl_length = sqlite3_column_bytes(stmt, 2); int blendop_version = sqlite3_column_int(stmt, 3); int writeprotect = sqlite3_column_int(stmt, 4); if(op_params && (op_length == module->params_size)) { memcpy(module->params, op_params, op_length); module->enabled = enabled; } if(blendop_params && (blendop_version == dt_develop_blend_version()) && (bl_length == sizeof(dt_develop_blend_params_t))) { memcpy(module->blend_params, blendop_params, sizeof(dt_develop_blend_params_t)); } else if(blendop_params && dt_develop_blend_legacy_params(module, blendop_params, blendop_version, module->blend_params, dt_develop_blend_version(), bl_length) == 0) { // do nothing } else { memcpy(module->blend_params, module->default_blendop_params, sizeof(dt_develop_blend_params_t)); } if(!writeprotect) dt_gui_store_last_preset(name); } sqlite3_finalize(stmt); g_free(name); dt_iop_gui_update(module); dt_dev_add_history_item(darktable.develop, module, FALSE); gtk_widget_queue_draw(module->widget); }
static void edit_preset_response(GtkDialog *dialog, gint response_id, dt_lib_presets_edit_dialog_t *g) { gint dlg_ret; gint is_new = 0; if(response_id == GTK_RESPONSE_ACCEPT) { sqlite3_stmt *stmt; // now delete preset, so we can re-insert the new values: DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from presets where name=?1 and operation=?2 and op_version=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, g->original_name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, g->plugin_name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, g->version); sqlite3_step(stmt); sqlite3_finalize(stmt); if ( ((g->old_id >= 0) && (strcmp(g->original_name, gtk_entry_get_text(g->name)) != 0)) || (g->old_id < 0) ) { // editing existing preset with different name or store new preset -> check for a preset with the same name: DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select name from presets where name = ?1 and operation=?2 and op_version=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, gtk_entry_get_text(g->name), strlen(gtk_entry_get_text(g->name)), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, g->plugin_name, strlen(g->plugin_name), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, g->version); if(sqlite3_step(stmt) == SQLITE_ROW) { sqlite3_finalize(stmt); GtkWidget *window = dt_ui_main_window(darktable.gui->ui); GtkWidget *dlg_overwrite = gtk_message_dialog_new (GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO, _("preset `%s' already exists.\ndo you want to overwrite?"), gtk_entry_get_text(g->name) ); gtk_window_set_title(GTK_WINDOW (dlg_overwrite), _("overwrite preset?")); dlg_ret = gtk_dialog_run (GTK_DIALOG (dlg_overwrite)); gtk_widget_destroy (dlg_overwrite); // if result is BUTTON_NO exit without destroy dialog, to permit other name if (dlg_ret == GTK_RESPONSE_NO) return; } else { is_new = 1; sqlite3_finalize(stmt); } } if (is_new == 0) { // delete preset, so we can re-insert the new values: DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from presets where name=?1 and operation=?2 and op_version=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, gtk_entry_get_text(g->name), strlen(gtk_entry_get_text(g->name)), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, g->plugin_name, strlen(g->plugin_name), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, g->version); sqlite3_step(stmt); sqlite3_finalize(stmt); } // commit all the user input fields char path[1024]; snprintf(path,1024,"preset/%s",g->original_name); dt_accel_rename_preset_lib(g->module,path,gtk_entry_get_text(g->name)); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "insert into presets (name, description, operation, op_version, op_params, blendop_params, blendop_version, enabled, model, maker, lens, " "iso_min, iso_max, exposure_min, exposure_max, aperture_min, aperture_max, focal_length_min, focal_length_max, writeprotect, " "autoapply, filter, def, isldr) values (?1, ?2, ?3, ?4, ?5, null, 0, 1, '%', '%', '%', 0, 51200, 0, 100000000, 0, 100000000, 0, 1000, 0, 0, 0, 0, 0)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, gtk_entry_get_text(g->name), strlen(gtk_entry_get_text(g->name)), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, gtk_entry_get_text(g->description), strlen(gtk_entry_get_text(g->description)), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 3, g->plugin_name, strlen(g->plugin_name), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 4, g->version); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 5, g->params, g->params_size, SQLITE_TRANSIENT); sqlite3_step(stmt); sqlite3_finalize(stmt); dt_gui_store_last_preset (gtk_entry_get_text(g->name)); } gtk_widget_destroy(GTK_WIDGET(dialog)); g_free(g->original_name); free(g); }
static void edit_preset_response(GtkDialog *dialog, gint response_id, dt_gui_presets_edit_dialog_t *g) { gint is_new = 0; if(response_id == GTK_RESPONSE_ACCEPT) { sqlite3_stmt *stmt; const gchar *name = gtk_entry_get_text(g->name); if(((g->old_id >= 0) && (strcmp(g->original_name, name) != 0)) || (g->old_id < 0)) { if(strcmp(_("new preset"), name) == 0 || !(name && *name)) { // show error dialog GtkWidget *window = dt_ui_main_window(darktable.gui->ui); GtkWidget *dlg_changename = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, _("please give preset a name")); gtk_window_set_title(GTK_WINDOW(dlg_changename), _("unnamed preset")); gtk_dialog_run(GTK_DIALOG(dlg_changename)); gtk_widget_destroy(dlg_changename); return; } // editing existing preset with different name or store new preset -> check for a preset with the same // name: DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "select name from presets where name = ?1 and operation=?2 and op_version=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, g->module->op, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, g->module->version()); if(sqlite3_step(stmt) == SQLITE_ROW) { sqlite3_finalize(stmt); // show overwrite question dialog GtkWidget *window = dt_ui_main_window(darktable.gui->ui); GtkWidget *dlg_overwrite = gtk_message_dialog_new( GTK_WINDOW(window), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_YES_NO, _("preset `%s' already exists.\ndo you want to overwrite?"), name); gtk_window_set_title(GTK_WINDOW(dlg_overwrite), _("overwrite preset?")); gint dlg_ret = gtk_dialog_run(GTK_DIALOG(dlg_overwrite)); gtk_widget_destroy(dlg_overwrite); // if result is BUTTON_NO exit without destroy dialog, to permit other name if(dlg_ret == GTK_RESPONSE_NO) return; } else { is_new = 1; sqlite3_finalize(stmt); } } if(g->old_id >= 0) { // now delete old preset: DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from presets where name=?1 and operation=?2 and op_version=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, g->original_name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, g->module->op, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, g->module->version()); sqlite3_step(stmt); sqlite3_finalize(stmt); } if(is_new == 0) { // delete preset, so we can re-insert the new values: DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from presets where name=?1 and operation=?2 and op_version=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, g->module->op, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, g->module->version()); sqlite3_step(stmt); sqlite3_finalize(stmt); } // rename accelerators char path[1024]; snprintf(path, sizeof(path), "%s/%s", _("preset"), g->original_name); dt_accel_rename_preset_iop(g->module, path, name); // commit all the user input fields DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "INSERT INTO presets (name, description, operation, op_version, op_params, enabled, " "blendop_params, blendop_version, multi_priority, multi_name, " "model, maker, lens, iso_min, iso_max, exposure_min, exposure_max, aperture_min, aperture_max, " "focal_length_min, focal_length_max, writeprotect, autoapply, filter, def, format) " "VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, 0, '', ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17, ?18, " "?19, 0, ?20, ?21, 0, ?22)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, name, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, gtk_entry_get_text(g->description), -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 3, g->module->op, -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 4, g->module->version()); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 5, g->module->params, g->module->params_size, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 6, g->module->enabled); DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 7, g->module->blend_params, sizeof(dt_develop_blend_params_t), SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_INT(stmt, 8, dt_develop_blend_version()); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 9, gtk_entry_get_text(GTK_ENTRY(g->model)), -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 10, gtk_entry_get_text(GTK_ENTRY(g->maker)), -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 11, gtk_entry_get_text(GTK_ENTRY(g->lens)), -1, SQLITE_TRANSIENT); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 12, gtk_spin_button_get_value(GTK_SPIN_BUTTON(g->iso_min))); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 13, gtk_spin_button_get_value(GTK_SPIN_BUTTON(g->iso_max))); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 14, dt_gui_presets_exposure_value[dt_bauhaus_combobox_get(g->exposure_min)]); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 15, dt_gui_presets_exposure_value[dt_bauhaus_combobox_get(g->exposure_max)]); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 16, dt_gui_presets_aperture_value[dt_bauhaus_combobox_get(g->aperture_min)]); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 17, dt_gui_presets_aperture_value[dt_bauhaus_combobox_get(g->aperture_max)]); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 18, gtk_spin_button_get_value(GTK_SPIN_BUTTON(g->focal_length_min))); DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 19, gtk_spin_button_get_value(GTK_SPIN_BUTTON(g->focal_length_max))); DT_DEBUG_SQLITE3_BIND_INT(stmt, 20, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g->autoapply))); DT_DEBUG_SQLITE3_BIND_INT(stmt, 21, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g->filter))); int format = 0; for(int k = 0; k < 3; k++) format += gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g->format_btn[k])) * dt_gui_presets_format_flag[k]; DT_DEBUG_SQLITE3_BIND_INT(stmt, 22, format); sqlite3_step(stmt); sqlite3_finalize(stmt); dt_gui_store_last_preset(name); } gtk_widget_destroy(GTK_WIDGET(dialog)); g_free(g->original_name); free(g); }