/** add an image to a group */ void dt_grouping_add_to_group(int group_id, int image_id) { // remove from old group dt_grouping_remove_from_group(image_id); dt_image_t *img = dt_image_cache_get(darktable.image_cache, image_id, 'w'); img->group_id = group_id; dt_image_cache_write_release(darktable.image_cache, img, DT_IMAGE_CACHE_SAFE); }
void dt_image_remove(const int32_t imgid) { sqlite3_stmt *stmt; const dt_image_t *img = dt_image_cache_read_get(darktable.image_cache, imgid); int old_group_id = img->group_id; dt_image_cache_read_release(darktable.image_cache, img); // make sure we remove from the cache first, or else the cache will look for imgid in sql dt_image_cache_remove(darktable.image_cache, imgid); int new_group_id = dt_grouping_remove_from_group(imgid); if(darktable.gui && darktable.gui->expanded_group_id == old_group_id) darktable.gui->expanded_group_id = new_group_id; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from images where id = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "update tagxtag set count = count - 1 where " "(id2 in (select tagid from tagged_images where imgid = ?1)) or " "(id1 in (select tagid from tagged_images where imgid = ?1))", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from tagged_images where imgid = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from history where imgid = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from color_labels where imgid = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from meta_data where id = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from selected_images where imgid = ?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); sqlite3_step(stmt); sqlite3_finalize(stmt); // also clear all thumbnails in mipmap_cache. dt_mipmap_cache_remove(darktable.mipmap_cache, imgid); }
/** removes the selected images from their current group. */ static void _ungroup_helper_function(void) { sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select distinct imgid from selected_images", -1, &stmt, NULL); while(sqlite3_step(stmt) == SQLITE_ROW) { int id = sqlite3_column_int(stmt, 0); dt_grouping_remove_from_group(id); } sqlite3_finalize(stmt); darktable.gui->expanded_group_id = -1; dt_collection_update_query(darktable.collection); }
int group_with(lua_State *L) { dt_lua_image_t first_image; luaA_to(L,dt_lua_image_t,&first_image,1); if(lua_isnoneornil(L,2)) { dt_grouping_remove_from_group(first_image); return 0; } dt_lua_image_t second_image; luaA_to(L,dt_lua_image_t,&second_image,2); const dt_image_t *cimg = dt_image_cache_read_get(darktable.image_cache, second_image); int group_id = cimg->group_id; dt_image_cache_read_release(darktable.image_cache, cimg); dt_grouping_add_to_group(group_id,first_image); return 0; }