~ubuntu-branches/ubuntu/saucy/darktable/saucy

« back to all changes in this revision

Viewing changes to src/gui/presets.c

  • Committer: Bazaar Package Importer
  • Author(s): David Bremner
  • Date: 2011-07-12 09:36:46 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20110712093646-yp9dbxan44dmw15h
Tags: 0.9-1
* New upstream release.
* Remove all patches now upstream; only patch for
  -Wno-error=unused-but-set-variable remains.
* Bump Standards-Version to 3.9.2 (no changes)

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
#endif
22
22
#include "common/darktable.h"
23
23
#include "common/debug.h"
 
24
#include "develop/blend.h"
24
25
#include "gui/gtk.h"
25
26
#include <stdlib.h>
26
27
 
60
61
 
61
62
void dt_gui_presets_init()
62
63
{
 
64
  // this is also called for non-gui applications linking to libdarktable!
 
65
  // so beware, don't use any darktable.gui stuff here .. (or change this behaviour it in darktable.c)
63
66
  // create table or fail if it is already there.
64
67
  sqlite3_exec(darktable.db, "create table presets "
65
68
               "(name varchar, description varchar, operation varchar, op_params blob, enabled integer, "
 
69
               "blendop_params blob, "
66
70
               "model varchar, maker varchar, lens varchar, "
67
71
               "iso_min real, iso_max real, exposure_min real, exposure_max real, aperture_min real, aperture_max real, "
68
72
               "focal_length_min real, focal_length_max real, "
74
78
void dt_gui_presets_add_generic(const char *name, dt_dev_operation_t op, const void *params, const int32_t params_size, const int32_t enabled)
75
79
{
76
80
  sqlite3_stmt *stmt;
 
81
  dt_develop_blend_params_t default_blendop_params = {DEVELOP_BLEND_DISABLED,100.0,0};
77
82
  DT_DEBUG_SQLITE3_PREPARE_V2(darktable.db, "delete from presets where name=?1 and operation=?2", -1, &stmt, NULL);
78
83
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, name, strlen(name), SQLITE_TRANSIENT);
79
84
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, op, strlen(op), SQLITE_TRANSIENT);
80
85
  sqlite3_step(stmt);
81
86
  sqlite3_finalize(stmt);
82
 
  DT_DEBUG_SQLITE3_PREPARE_V2(darktable.db, "insert into presets values (?1, '', ?2, ?3, ?4, '%', '%', '%', 0, 51200, 0, 10000000, 0, 100000000, 0, 1000, 1, 0, 0, 0, 0)", -1, &stmt, NULL);
 
87
  DT_DEBUG_SQLITE3_PREPARE_V2(darktable.db, "insert into presets (name, description ,operation, op_params, enabled, blendop_params, model, maker, lens, "
 
88
             "iso_min, iso_max, exposure_min, exposure_max, aperture_min, aperture_max, focal_length_min, focal_length_max, "
 
89
             "writeprotect, autoapply, filter, def, isldr) "
 
90
             "values (?1, '', ?2, ?3, ?4, ?5, '%', '%', '%', 0, 51200, 0, 10000000, 0, 100000000, 0, 1000, 1, 0, 0, 0, 0)", -1, &stmt, NULL);
83
91
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, name, strlen(name), SQLITE_TRANSIENT);
84
92
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, op, strlen(op), SQLITE_TRANSIENT);
85
93
  DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 3, params, params_size, SQLITE_TRANSIENT);
86
94
  DT_DEBUG_SQLITE3_BIND_INT(stmt, 4, enabled);
 
95
  DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 5, &default_blendop_params, sizeof(dt_develop_blend_params_t), SQLITE_TRANSIENT);
87
96
  sqlite3_step(stmt);
88
97
  sqlite3_finalize(stmt);
89
98
}
113
122
get_active_preset_name(dt_iop_module_t *module)
114
123
{
115
124
  sqlite3_stmt *stmt;
116
 
  DT_DEBUG_SQLITE3_PREPARE_V2(darktable.db, "select name, op_params, writeprotect from presets where operation=?1", -1, &stmt, NULL);
 
125
  DT_DEBUG_SQLITE3_PREPARE_V2(darktable.db, "select name, op_params, blendop_params, writeprotect from presets where operation=?1", -1, &stmt, NULL);
117
126
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, module->op, strlen(module->op), SQLITE_TRANSIENT);
118
127
  gchar *name = NULL;
119
128
  // collect all presets for op from db
121
130
  {
122
131
    void *op_params = (void *)sqlite3_column_blob(stmt, 1);
123
132
    int32_t op_params_size = sqlite3_column_bytes(stmt, 1);
124
 
    if(!memcmp(module->params, op_params, MIN(op_params_size, module->params_size)))
 
133
    void *blendop_params = (void *)sqlite3_column_blob(stmt, 2);
 
134
    int32_t bl_params_size = sqlite3_column_bytes(stmt, 2);
 
135
    if(!memcmp(module->params, op_params, MIN(op_params_size, module->params_size)) && 
 
136
       !memcmp(module->blend_params, blendop_params, MIN(bl_params_size, sizeof(dt_develop_blend_params_t))))
125
137
    {
126
138
      name = g_strdup((char *)sqlite3_column_text(stmt, 0));
127
139
      break;
150
162
{
151
163
  // commit all the user input fields
152
164
  sqlite3_stmt *stmt;
153
 
  DT_DEBUG_SQLITE3_PREPARE_V2(darktable.db, "insert into presets values (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, 0, ?17, ?18, 0, 0)", -1, &stmt, NULL);
 
165
  DT_DEBUG_SQLITE3_PREPARE_V2(darktable.db, "insert into presets (name, description, operation, op_params, enabled, blendop_params, "
 
166
          "model, maker, lens, iso_min, iso_max, exposure_min, exposure_max, aperture_min, aperture_max, "
 
167
          "focal_length_min, focal_length_max, writeprotect, autoapply, filter, def, isldr) "
 
168
          "values (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14, ?15, ?16, ?17, 0, ?18, ?19, 0, 0)", -1, &stmt, NULL);
154
169
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, gtk_entry_get_text(g->name), strlen(gtk_entry_get_text(g->name)), SQLITE_TRANSIENT);
155
170
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, gtk_entry_get_text(g->description), strlen(gtk_entry_get_text(g->description)), SQLITE_TRANSIENT);
156
171
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 3, g->module->op, strlen(g->module->op), SQLITE_TRANSIENT);
157
172
  DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 4, g->module->params, g->module->params_size, SQLITE_TRANSIENT);
158
173
  DT_DEBUG_SQLITE3_BIND_INT(stmt, 5, g->module->enabled);
159
 
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 6, gtk_entry_get_text(g->model), strlen(gtk_entry_get_text(g->model)), SQLITE_TRANSIENT);
160
 
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 7, gtk_entry_get_text(g->maker), strlen(gtk_entry_get_text(g->maker)), SQLITE_TRANSIENT);
161
 
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 8, gtk_entry_get_text(g->lens), strlen(gtk_entry_get_text(g->lens)), SQLITE_TRANSIENT);
162
 
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt,  9, gtk_spin_button_get_value(g->iso_min));
163
 
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 10, gtk_spin_button_get_value(g->iso_max));
164
 
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 11, dt_gui_presets_exposure_value[gtk_combo_box_get_active(g->exposure_min)]);
165
 
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 12, dt_gui_presets_exposure_value[gtk_combo_box_get_active(g->exposure_max)]);
166
 
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 13, dt_gui_presets_aperture_value[gtk_combo_box_get_active(g->aperture_min)]);
167
 
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 14, dt_gui_presets_aperture_value[gtk_combo_box_get_active(g->aperture_max)]);
168
 
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 15, gtk_spin_button_get_value(g->focal_length_min));
169
 
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 16, gtk_spin_button_get_value(g->focal_length_max));
170
 
  DT_DEBUG_SQLITE3_BIND_INT(stmt, 17, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g->autoapply)));
171
 
  DT_DEBUG_SQLITE3_BIND_INT(stmt, 18, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g->filter)));
 
174
  DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 6, g->module->blend_params, sizeof(dt_develop_blend_params_t), SQLITE_TRANSIENT);
 
175
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 7, gtk_entry_get_text(g->model), strlen(gtk_entry_get_text(g->model)), SQLITE_TRANSIENT);
 
176
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 8, gtk_entry_get_text(g->maker), strlen(gtk_entry_get_text(g->maker)), SQLITE_TRANSIENT);
 
177
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 9, gtk_entry_get_text(g->lens), strlen(gtk_entry_get_text(g->lens)), SQLITE_TRANSIENT);
 
178
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt,  10, gtk_spin_button_get_value(g->iso_min));
 
179
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 11, gtk_spin_button_get_value(g->iso_max));
 
180
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 12, dt_gui_presets_exposure_value[gtk_combo_box_get_active(g->exposure_min)]);
 
181
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 13, dt_gui_presets_exposure_value[gtk_combo_box_get_active(g->exposure_max)]);
 
182
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 14, dt_gui_presets_aperture_value[gtk_combo_box_get_active(g->aperture_min)]);
 
183
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 15, dt_gui_presets_aperture_value[gtk_combo_box_get_active(g->aperture_max)]);
 
184
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 16, gtk_spin_button_get_value(g->focal_length_min));
 
185
  DT_DEBUG_SQLITE3_BIND_DOUBLE(stmt, 17, gtk_spin_button_get_value(g->focal_length_max));
 
186
  DT_DEBUG_SQLITE3_BIND_INT(stmt, 18, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g->autoapply)));
 
187
  DT_DEBUG_SQLITE3_BIND_INT(stmt, 19, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g->filter)));
172
188
  sqlite3_step(stmt);
173
189
  sqlite3_finalize(stmt);
174
190
 
204
220
  GtkWidget *dialog;
205
221
  /* Create the widgets */
206
222
  char title[1024];
207
 
  GtkWidget *window = glade_xml_get_widget (darktable.gui->main_window, "main_window");
 
223
  GtkWidget *window = darktable.gui->widgets.main_window;
208
224
  snprintf(title, 1024, _("edit `%s' for module `%s'"), name, module->name());
209
225
  dialog = gtk_dialog_new_with_buttons (title,
210
226
                                        GTK_WINDOW(window),
230
246
  g->name = GTK_ENTRY(gtk_entry_new());
231
247
  gtk_entry_set_text(g->name, name);
232
248
  gtk_box_pack_start(box, GTK_WIDGET(g->name), FALSE, FALSE, 0);
233
 
  gtk_object_set(GTK_OBJECT(g->name), "tooltip-text", _("name of the preset"), (char *)NULL);
 
249
  g_object_set(G_OBJECT(g->name), "tooltip-text", _("name of the preset"), (char *)NULL);
234
250
 
235
251
  g->description = GTK_ENTRY(gtk_entry_new());
236
252
  gtk_box_pack_start(box, GTK_WIDGET(g->description), FALSE, FALSE, 0);
237
 
  gtk_object_set(GTK_OBJECT(g->description), "tooltip-text", _("description or further information"), (char *)NULL);
 
253
  g_object_set(G_OBJECT(g->description), "tooltip-text", _("description or further information"), (char *)NULL);
238
254
 
239
255
  g->autoapply = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(_("auto apply this preset to matching images")));
240
256
  gtk_box_pack_start(box, GTK_WIDGET(g->autoapply), FALSE, FALSE, 0);
241
257
  g->filter = GTK_CHECK_BUTTON(gtk_check_button_new_with_label(_("only show this preset for matching images")));
242
 
  gtk_object_set(GTK_OBJECT(g->filter), "tooltip-text", _("be very careful with this option. this might be the last time you see your preset."), (char *)NULL);
 
258
  g_object_set(G_OBJECT(g->filter), "tooltip-text", _("be very careful with this option. this might be the last time you see your preset."), (char *)NULL);
243
259
  gtk_box_pack_start(box, GTK_WIDGET(g->filter), FALSE, FALSE, 0);
244
260
  g_signal_connect(G_OBJECT(g->autoapply), "toggled", G_CALLBACK(check_buttons_activated), g);
245
261
  g_signal_connect(G_OBJECT(g->filter),    "toggled", G_CALLBACK(check_buttons_activated), g);
254
270
 
255
271
  // model, maker, lens
256
272
  g->model = GTK_ENTRY(gtk_entry_new());
257
 
  gtk_object_set(GTK_OBJECT(g->model), "tooltip-text", _("string to match model (use % as wildcard)"), (char *)NULL);
 
273
  g_object_set(G_OBJECT(g->model), "tooltip-text", _("string to match model (use % as wildcard)"), (char *)NULL);
258
274
  label = gtk_label_new(_("model"));
259
275
  gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
260
276
  gtk_box_pack_start(vbox2, label, FALSE, FALSE, 0);
261
277
  gtk_box_pack_start(vbox3, GTK_WIDGET(g->model), FALSE, FALSE, 0);
262
278
  gtk_box_pack_start(vbox4, gtk_label_new(""), FALSE, FALSE, 0);
263
279
  g->maker = GTK_ENTRY(gtk_entry_new());
264
 
  gtk_object_set(GTK_OBJECT(g->maker), "tooltip-text", _("string to match maker (use % as wildcard)"), (char *)NULL);
 
280
  g_object_set(G_OBJECT(g->maker), "tooltip-text", _("string to match maker (use % as wildcard)"), (char *)NULL);
265
281
  label = gtk_label_new(_("maker"));
266
282
  gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
267
283
  gtk_box_pack_start(vbox2, label, FALSE, FALSE, 0);
268
284
  gtk_box_pack_start(vbox3, GTK_WIDGET(g->maker), FALSE, FALSE, 0);
269
285
  gtk_box_pack_start(vbox4, gtk_label_new(""), FALSE, FALSE, 0);
270
286
  g->lens  = GTK_ENTRY(gtk_entry_new());
271
 
  gtk_object_set(GTK_OBJECT(g->lens), "tooltip-text", _("string to match lens (use % as wildcard)"), (char *)NULL);
 
287
  g_object_set(G_OBJECT(g->lens), "tooltip-text", _("string to match lens (use % as wildcard)"), (char *)NULL);
272
288
  label = gtk_label_new(_("lens"));
273
289
  gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
274
290
  gtk_box_pack_start(vbox2, label, FALSE, FALSE, 0);
280
296
  gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
281
297
  gtk_box_pack_start(vbox2, label, FALSE, FALSE, 0);
282
298
  g->iso_min = GTK_SPIN_BUTTON(gtk_spin_button_new_with_range(0, 51200, 100));
283
 
  gtk_object_set(GTK_OBJECT(g->iso_min), "tooltip-text", _("minimum iso value"), (char *)NULL);
 
299
  g_object_set(G_OBJECT(g->iso_min), "tooltip-text", _("minimum iso value"), (char *)NULL);
284
300
  gtk_spin_button_set_digits(g->iso_min, 0);
285
301
  gtk_box_pack_start(vbox3, GTK_WIDGET(g->iso_min), FALSE, FALSE, 0);
286
302
  g->iso_max = GTK_SPIN_BUTTON(gtk_spin_button_new_with_range(0, 51200, 100));
287
 
  gtk_object_set(GTK_OBJECT(g->iso_max), "tooltip-text", _("maximum iso value"), (char *)NULL);
 
303
  g_object_set(G_OBJECT(g->iso_max), "tooltip-text", _("maximum iso value"), (char *)NULL);
288
304
  gtk_spin_button_set_digits(g->iso_max, 0);
289
305
  gtk_box_pack_start(vbox4, GTK_WIDGET(g->iso_max), FALSE, FALSE, 0);
290
306
 
294
310
  gtk_box_pack_start(vbox2, label, FALSE, FALSE, 0);
295
311
  g->exposure_min = GTK_COMBO_BOX(gtk_combo_box_new_text());
296
312
  g->exposure_max = GTK_COMBO_BOX(gtk_combo_box_new_text());
297
 
  gtk_object_set(GTK_OBJECT(g->exposure_min), "tooltip-text", _("minimum exposure time"), (char *)NULL);
298
 
  gtk_object_set(GTK_OBJECT(g->exposure_max), "tooltip-text", _("maximum exposure time"), (char *)NULL);
 
313
  g_object_set(G_OBJECT(g->exposure_min), "tooltip-text", _("minimum exposure time"), (char *)NULL);
 
314
  g_object_set(G_OBJECT(g->exposure_max), "tooltip-text", _("maximum exposure time"), (char *)NULL);
299
315
  for(int k=0; k<dt_gui_presets_exposure_value_cnt; k++)
300
316
    gtk_combo_box_append_text(g->exposure_min, dt_gui_presets_exposure_value_str[k]);
301
317
  for(int k=0; k<dt_gui_presets_exposure_value_cnt; k++)
309
325
  gtk_box_pack_start(vbox2, label, FALSE, FALSE, 0);
310
326
  g->aperture_min = GTK_COMBO_BOX(gtk_combo_box_new_text());
311
327
  g->aperture_max = GTK_COMBO_BOX(gtk_combo_box_new_text());
312
 
  gtk_object_set(GTK_OBJECT(g->aperture_min), "tooltip-text", _("minimum aperture value"), (char *)NULL);
313
 
  gtk_object_set(GTK_OBJECT(g->aperture_max), "tooltip-text", _("maximum aperture value"), (char *)NULL);
 
328
  g_object_set(G_OBJECT(g->aperture_min), "tooltip-text", _("minimum aperture value"), (char *)NULL);
 
329
  g_object_set(G_OBJECT(g->aperture_max), "tooltip-text", _("maximum aperture value"), (char *)NULL);
314
330
  for(int k=0; k<dt_gui_presets_aperture_value_cnt; k++)
315
331
    gtk_combo_box_append_text(g->aperture_min, dt_gui_presets_aperture_value_str[k]);
316
332
  for(int k=0; k<dt_gui_presets_aperture_value_cnt; k++)
326
342
  gtk_spin_button_set_digits(g->focal_length_min, 0);
327
343
  gtk_box_pack_start(vbox3, GTK_WIDGET(g->focal_length_min), FALSE, FALSE, 0);
328
344
  g->focal_length_max = GTK_SPIN_BUTTON(gtk_spin_button_new_with_range(0, 1000, 10));
329
 
  gtk_object_set(GTK_OBJECT(g->focal_length_min), "tooltip-text", _("minimum focal length"), (char *)NULL);
330
 
  gtk_object_set(GTK_OBJECT(g->focal_length_max), "tooltip-text", _("maximum focal length"), (char *)NULL);
 
345
  g_object_set(G_OBJECT(g->focal_length_min), "tooltip-text", _("minimum focal length"), (char *)NULL);
 
346
  g_object_set(G_OBJECT(g->focal_length_max), "tooltip-text", _("maximum focal length"), (char *)NULL);
331
347
  gtk_spin_button_set_digits(g->focal_length_max, 0);
332
348
  gtk_box_pack_start(vbox4, GTK_WIDGET(g->focal_length_max), FALSE, FALSE, 0);
333
349
 
394
410
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, module->op, strlen(module->op), SQLITE_TRANSIENT);
395
411
  sqlite3_step(stmt);
396
412
  sqlite3_finalize(stmt);
397
 
  DT_DEBUG_SQLITE3_PREPARE_V2(darktable.db, "insert into presets values (?1, '', ?2, ?3, ?4, '%', '%', '%', 0, 51200, 0, 100000000, 0, 100000000, 0, 1000, 0, 0, 0, 0, 0)", -1, &stmt, NULL);
 
413
  DT_DEBUG_SQLITE3_PREPARE_V2(darktable.db, "insert into presets (name, description, operation, op_params, enabled, "
 
414
         "blendop_params, model, maker, lens, iso_min, iso_max, exposure_min, exposure_max, aperture_min, aperture_max, "
 
415
         "focal_length_min, focal_length_max, writeprotect, autoapply, filter, def, isldr) "
 
416
         "values (?1, '', ?2, ?3, ?4, ?5, '%', '%', '%', 0, 51200, 0, 100000000, 0, 100000000, 0, 1000, 0, 0, 0, 0, 0)", -1, &stmt, NULL);
398
417
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, _("new preset"), strlen(_("new preset")), SQLITE_STATIC);
399
418
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, module->op, strlen(module->op), SQLITE_TRANSIENT);
400
419
  DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 3, module->params, module->params_size, SQLITE_TRANSIENT);
401
420
  DT_DEBUG_SQLITE3_BIND_INT(stmt, 4, module->enabled);
 
421
  DT_DEBUG_SQLITE3_BIND_BLOB(stmt, 5, module->blend_params, sizeof(dt_develop_blend_params_t), SQLITE_TRANSIENT);
402
422
  sqlite3_step(stmt);
403
423
  sqlite3_finalize(stmt);
404
424
  // then show edit dialog
410
430
{
411
431
  gchar *name = get_preset_name(menuitem);
412
432
  sqlite3_stmt *stmt;
413
 
  DT_DEBUG_SQLITE3_PREPARE_V2(darktable.db, "select op_params, enabled from presets where operation = ?1 and name = ?2", -1, &stmt, NULL);
 
433
  DT_DEBUG_SQLITE3_PREPARE_V2(darktable.db, "select op_params, enabled, blendop_params from presets where operation = ?1 and name = ?2", -1, &stmt, NULL);
414
434
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, module->op, strlen(module->op), SQLITE_TRANSIENT);
415
435
  DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 2, name, strlen(name), SQLITE_TRANSIENT);
416
436
 
417
437
  if(sqlite3_step(stmt) == SQLITE_ROW)
418
438
  {
419
 
    const void *blob = sqlite3_column_blob(stmt, 0);
420
 
    int length  = sqlite3_column_bytes(stmt, 0);
 
439
    const void *op_params = sqlite3_column_blob(stmt, 0);
 
440
    int op_length  = sqlite3_column_bytes(stmt, 0);
421
441
    int enabled = sqlite3_column_int(stmt, 1);
422
 
    if(blob && (length == module->params_size))
 
442
    const void *blendop_params = sqlite3_column_blob(stmt, 2);
 
443
    int bl_length = sqlite3_column_bytes(stmt, 2);
 
444
    if(op_params && (op_length == module->params_size))
423
445
    {
424
 
      memcpy(module->params, blob, length);
 
446
      memcpy(module->params, op_params, op_length);
425
447
      module->enabled = enabled;
426
448
    }
 
449
    if (blendop_params && (bl_length == sizeof(dt_develop_blend_params_t)))
 
450
    {
 
451
      memcpy(module->blend_params, blendop_params, sizeof(dt_develop_blend_params_t));
 
452
    }
 
453
    else
 
454
    {
 
455
      memcpy(module->blend_params, module->default_blendop_params, sizeof(dt_develop_blend_params_t));
 
456
    }
427
457
  }
428
458
  sqlite3_finalize(stmt);
429
459
  g_free(name);
463
493
 
464
494
 
465
495
static void
466
 
dt_gui_presets_popup_menu_show_internal(dt_dev_operation_t op, dt_iop_params_t *params, int32_t params_size, dt_iop_module_t *module, dt_image_t *image, void (*pick_callback)(GtkMenuItem*,void*), void *callback_data)
 
496
dt_gui_presets_popup_menu_show_internal(dt_dev_operation_t op, dt_iop_params_t *params, int32_t params_size, dt_develop_blend_params_t *bl_params, dt_iop_module_t *module, dt_image_t *image, void (*pick_callback)(GtkMenuItem*,void*), void *callback_data)
467
497
{
468
498
  GtkMenu *menu = darktable.gui->presets_popup_menu;
469
499
  if(menu)
478
508
  if(image)
479
509
  {
480
510
    // only matching if filter is on:
481
 
    DT_DEBUG_SQLITE3_PREPARE_V2(darktable.db, "select name, op_params, writeprotect, description from presets where operation=?1 and "
 
511
    DT_DEBUG_SQLITE3_PREPARE_V2(darktable.db, "select name, op_params, writeprotect, description, blendop_params from presets where operation=?1 and "
482
512
                                "(filter=0 or ( "
483
513
                                "?2 like model and ?3 like maker and ?4 like lens and "
484
514
                                "?5 between iso_min and iso_max and "
499
529
  else
500
530
  {
501
531
    // don't know for which image. show all we got:
502
 
    DT_DEBUG_SQLITE3_PREPARE_V2(darktable.db, "select name, op_params, writeprotect, description from presets where operation=?1 order by writeprotect desc, rowid", -1, &stmt, NULL);
 
532
    DT_DEBUG_SQLITE3_PREPARE_V2(darktable.db, "select name, op_params, writeprotect, description, blendop_params from presets where operation=?1 order by writeprotect desc, rowid", -1, &stmt, NULL);
503
533
    DT_DEBUG_SQLITE3_BIND_TEXT(stmt, 1, op, strlen(op), SQLITE_TRANSIENT);
504
534
  }
505
535
  // collect all presets for op from db
507
537
  {
508
538
    void *op_params = (void *)sqlite3_column_blob(stmt, 1);
509
539
    int32_t op_params_size = sqlite3_column_bytes(stmt, 1);
 
540
    void *blendop_params = (void *)sqlite3_column_blob(stmt, 4);
 
541
    int32_t bl_params_size = sqlite3_column_bytes(stmt, 4);
510
542
    int32_t isdefault = 0;
511
 
    if(module && !memcmp(module->default_params, op_params, MIN(op_params_size, module->params_size))) isdefault = 1;
512
 
    if(!memcmp(params, op_params, MIN(op_params_size, params_size)))
 
543
    if(module && !memcmp(module->default_params, op_params, MIN(op_params_size, module->params_size)) && 
 
544
                 !memcmp(module->default_blendop_params, blendop_params, MIN(bl_params_size, sizeof(dt_develop_blend_params_t)))) isdefault = 1;
 
545
    if(!memcmp(params, op_params, MIN(op_params_size, params_size)) && 
 
546
       !memcmp(bl_params, blendop_params, MIN(bl_params_size, sizeof(dt_develop_blend_params_t))))
513
547
    {
514
548
      active_preset = cnt;
515
549
      writeprotect = sqlite3_column_int(stmt, 2);
539
573
    }
540
574
    if(module) g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(menuitem_pick_preset), module);
541
575
    else if(pick_callback) g_signal_connect(G_OBJECT(mi), "activate", G_CALLBACK(pick_callback), callback_data);
542
 
    gtk_object_set(GTK_OBJECT(mi), "tooltip-text", sqlite3_column_text(stmt, 3), (char *)NULL);
 
576
    g_object_set(G_OBJECT(mi), "tooltip-text", sqlite3_column_text(stmt, 3), (char *)NULL);
543
577
    gtk_menu_shell_append(GTK_MENU_SHELL(menu), mi);
544
578
    cnt ++;
545
579
  }
589
623
  }
590
624
}
591
625
 
592
 
void dt_gui_presets_popup_menu_show_for_params(dt_dev_operation_t op, void *params, int32_t params_size, dt_image_t *image, void (*pick_callback)(GtkMenuItem*,void*), void *callback_data)
 
626
void dt_gui_presets_popup_menu_show_for_params(dt_dev_operation_t op, void *params, int32_t params_size, void *blendop_params, dt_image_t *image, void (*pick_callback)(GtkMenuItem*,void*), void *callback_data)
593
627
{
594
 
  dt_gui_presets_popup_menu_show_internal(op, params, params_size, NULL, image, pick_callback, callback_data);
 
628
  dt_gui_presets_popup_menu_show_internal(op, params, params_size, blendop_params, NULL, image, pick_callback, callback_data);
595
629
}
596
630
 
597
631
void dt_gui_presets_popup_menu_show_for_module(dt_iop_module_t *module)
598
632
{
599
 
  dt_gui_presets_popup_menu_show_internal(module->op, module->params, module->params_size, module, module->dev->image, NULL, NULL);
 
633
  dt_gui_presets_popup_menu_show_internal(module->op, module->params, module->params_size, module->blend_params, module, module->dev->image, NULL, NULL);
600
634
}
601
635
 
602
636
void dt_gui_presets_update_mml(const char *name, dt_dev_operation_t op, const char *maker, const char *model, const char *lens)