int dt_history_copy_and_paste_on_selection (int32_t imgid, gboolean merge, GList *ops) { if (imgid < 0) return 1; int res=0; sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select * from selected_images where imgid != ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); if (sqlite3_step(stmt) == SQLITE_ROW) { do { /* get imgid of selected image */ int32_t dest_imgid = sqlite3_column_int (stmt, 0); /* paste history stack onto image id */ dt_history_copy_and_paste_on_image(imgid,dest_imgid,merge,ops); } while (sqlite3_step (stmt) == SQLITE_ROW); } else res = 1; sqlite3_finalize(stmt); return res; }
static gboolean _lib_filmstrip_paste_history_parts_key_accel_callback(GtkAccelGroup *accel_group, GObject *aceeleratable, guint keyval, GdkModifierType modifier, gpointer data) { dt_lib_filmstrip_t *strip = (dt_lib_filmstrip_t *)data; int mode = dt_conf_get_int("plugins/lighttable/copy_history/pastemode"); // get mouse over before launching the dialog int32_t mouse_over_id = dt_control_get_mouse_over_id(); int res = dt_gui_hist_dialog_new(&(strip->dg), strip->history_copy_imgid, FALSE); if(res == GTK_RESPONSE_CANCEL) return FALSE; if(dt_history_copy_and_paste_on_selection(strip->history_copy_imgid, (mode == 0) ? TRUE : FALSE, strip->dg.selops) != 0) { if(mouse_over_id <= 0) return FALSE; dt_history_copy_and_paste_on_image(strip->history_copy_imgid, mouse_over_id, (mode == 0) ? TRUE : FALSE, strip->dg.selops); } dt_control_queue_redraw_center(); return TRUE; }
int32_t dt_control_duplicate_images_job_run(dt_job_t *job) { int imgid = -1; int newimgid = -1; dt_control_image_enumerator_t *t1 = (dt_control_image_enumerator_t *)job->param; GList *t = t1->index; int total = g_list_length(t); char message[512]= {0}; double fraction=0; snprintf(message, 512, ngettext ("duplicating %d image", "duplicating %d images", total), total ); const guint *jid = dt_control_backgroundjobs_create(darktable.control, 0, message); while(t) { imgid = GPOINTER_TO_INT(t->data); newimgid = dt_image_duplicate(imgid); if(newimgid != -1) dt_history_copy_and_paste_on_image(imgid, newimgid, FALSE,NULL); t = g_list_delete_link(t, t); fraction=1.0/total; dt_control_backgroundjobs_progress(darktable.control, jid, fraction); } dt_control_backgroundjobs_destroy(darktable.control, jid); dt_control_signal_raise(darktable.signals, DT_SIGNAL_FILMROLLS_CHANGED); dt_control_queue_redraw_center(); return 0; }
void dt_styles_apply_to_image(const char *name,gboolean duplicate, int32_t imgid) { int id=0; sqlite3_stmt *stmt; int32_t newimgid; if ((id=dt_styles_get_id_by_name(name)) != 0) { /* check if we should make a duplicate before applying style */ if (duplicate) { newimgid = dt_image_duplicate (imgid); if(newimgid != -1) dt_history_copy_and_paste_on_image(imgid, newimgid, FALSE, NULL); } else newimgid = imgid; /* merge onto history stack, let's find history offest in destination image */ int32_t offs = 0; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT MAX(num)+1 FROM history WHERE imgid = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, newimgid); if (sqlite3_step (stmt) == SQLITE_ROW) offs = sqlite3_column_int (stmt, 0); sqlite3_finalize (stmt); /* copy history items from styles onto image */ DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "insert into history (imgid,num,module,operation,op_params,enabled,blendop_params,blendop_version,multi_priority,multi_name) select ?1, num+?2,module,operation,op_params,enabled,blendop_params,blendop_version,multi_priority,multi_name from style_items where styleid=?3", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, newimgid); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, offs); DT_DEBUG_SQLITE3_BIND_INT(stmt, 3, id); sqlite3_step (stmt); sqlite3_finalize (stmt); /* add tag */ guint tagid=0; gchar ntag[512]= {0}; g_snprintf(ntag,512,"darktable|style|%s",name); if (dt_tag_new(ntag,&tagid)) dt_tag_attach(tagid,newimgid); /* if current image in develop reload history */ if (dt_dev_is_current_image(darktable.develop, newimgid)) { dt_dev_reload_history_items (darktable.develop); dt_dev_modulegroups_set(darktable.develop, dt_dev_modulegroups_get(darktable.develop)); } /* update xmp file */ dt_image_synch_xmp(newimgid); /* remove old obsolete thumbnails */ dt_mipmap_cache_remove(darktable.mipmap_cache, newimgid); /* redraw center view to update visible mipmaps */ dt_control_queue_redraw_center(); } }
static void _lib_duplicate_duplicate_clicked_callback(GtkWidget *widget, GdkEventButton *event, dt_lib_module_t *self) { dt_lib_duplicate_t *d = (dt_lib_duplicate_t *)self->data; d->select = DT_DUPLICATE_SELECT_NONE; const int imgid = darktable.develop->image_storage.id; const int newid = dt_image_duplicate(imgid); if (newid <= 0) return; dt_history_copy_and_paste_on_image(imgid,newid,FALSE,NULL); // to select the duplicate, we reuse the filmstrip proxy dt_view_filmstrip_scroll_to_image(darktable.view_manager,newid,TRUE); }
static gboolean _lib_filmstrip_duplicate_image_key_accel_callback(GtkAccelGroup *accel_group, GObject *aceeleratable, guint keyval, GdkModifierType modifier, gpointer data) { int32_t mouse_over_id = dt_control_get_mouse_over_id(); if(mouse_over_id <= 0) return FALSE; /* check if images is currently loaded in darkroom */ if(dt_dev_is_current_image(darktable.develop, mouse_over_id)) dt_dev_write_history(darktable.develop); int32_t newimgid = dt_image_duplicate(mouse_over_id); if(newimgid != -1) dt_history_copy_and_paste_on_image(mouse_over_id, newimgid, FALSE, NULL); dt_control_queue_redraw_center(); return TRUE; }
static gboolean _lib_filmstrip_paste_history_key_accel_callback(GtkAccelGroup *accel_group, GObject *aceeleratable, guint keyval, GdkModifierType modifier, gpointer data) { dt_lib_filmstrip_t *strip = (dt_lib_filmstrip_t *)data; if (strip->history_copy_imgid==-1) return FALSE; int32_t mouse_over_id; DT_CTL_GET_GLOBAL(mouse_over_id, lib_image_mouse_over_id); if(mouse_over_id <= 0) return FALSE; int mode = dt_conf_get_int("plugins/lighttable/copy_history/pastemode"); dt_history_copy_and_paste_on_image(strip->history_copy_imgid, mouse_over_id, (mode == 0)?TRUE:FALSE); dt_control_queue_redraw_center(); return TRUE; }
int32_t dt_control_duplicate_images_job_run(dt_job_t *job) { long int imgid = -1; long int newimgid = -1; dt_control_image_enumerator_t *t1 = (dt_control_image_enumerator_t *)job->param; GList *t = t1->index; int total = g_list_length(t); char message[512]= {0}; double fraction=0; snprintf(message, 512, ngettext ("duplicating %d image", "duplicating %d images", total), total ); const guint *jid = dt_control_backgroundjobs_create(darktable.control, 0, message); while(t) { imgid = (long int)t->data; newimgid = dt_image_duplicate(imgid); if(newimgid != -1) dt_history_copy_and_paste_on_image(imgid, newimgid, FALSE); t = g_list_delete_link(t, t); fraction=1.0/total; dt_control_backgroundjobs_progress(darktable.control, jid, fraction); } dt_control_backgroundjobs_destroy(darktable.control, jid); return 0; }
void dt_styles_apply_to_image(const char *name,gboolean duplicate, int32_t imgid) { int id=0; sqlite3_stmt *stmt; int32_t newimgid; if ((id=dt_styles_get_id_by_name(name)) != 0) { /* check if we should make a duplicate before applying style */ if (duplicate) { newimgid = dt_image_duplicate (imgid); if(newimgid != -1) dt_history_copy_and_paste_on_image(imgid, newimgid, FALSE, NULL); } else newimgid = imgid; /* merge onto history stack, let's find history offest in destination image */ int32_t offs = 0; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT MAX(num)+1 FROM history WHERE imgid = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, newimgid); if (sqlite3_step (stmt) == SQLITE_ROW) offs = sqlite3_column_int (stmt, 0); sqlite3_finalize (stmt); /* delete all items from the temp styles_items, this table is used only to get a ROWNUM of the results */ DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "DELETE FROM memory.style_items",NULL,NULL,NULL); /* copy history items from styles onto temp table */ DT_DEBUG_SQLITE3_PREPARE_V2 (dt_database_get(darktable.db), "INSERT INTO MEMORY.style_items SELECT * FROM style_items WHERE styleid=?1 ORDER BY multi_priority DESC;", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, id); sqlite3_step (stmt); sqlite3_finalize (stmt); /* copy the style items into the history */ DT_DEBUG_SQLITE3_PREPARE_V2 (dt_database_get(darktable.db), "INSERT INTO history (imgid,num,module,operation,op_params,enabled,blendop_params,blendop_version,multi_priority,multi_name) SELECT ?1,?2+rowid,module,operation,op_params,enabled,blendop_params,blendop_version,multi_priority,multi_name FROM MEMORY.style_items", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, newimgid); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, offs); sqlite3_step (stmt); sqlite3_finalize (stmt); /* add tag */ guint tagid=0; gchar ntag[512]= {0}; g_snprintf(ntag,512,"darktable|style|%s",name); if (dt_tag_new(ntag,&tagid)) dt_tag_attach(tagid,newimgid); /* if current image in develop reload history */ if (dt_dev_is_current_image(darktable.develop, newimgid)) { dt_dev_reload_history_items (darktable.develop); dt_dev_modulegroups_set(darktable.develop, dt_dev_modulegroups_get(darktable.develop)); } /* update xmp file */ dt_image_synch_xmp(newimgid); /* remove old obsolete thumbnails */ dt_mipmap_cache_remove(darktable.mipmap_cache, newimgid); /* if we have created a duplicate, reset collected images */ if (duplicate) dt_control_signal_raise(darktable.signals, DT_SIGNAL_COLLECTION_CHANGED); /* redraw center view to update visible mipmaps */ dt_control_queue_redraw_center(); } }