void dt_selection_select_range(dt_selection_t *selection, uint32_t imgid) { gchar *fullq = NULL; if(!selection->collection || selection->last_single_id == -1) return; /* get start and end rows for range selection */ sqlite3_stmt *stmt; int rc = 0; uint32_t sr = -1, er = -1; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), dt_collection_get_query_no_group(selection->collection), -1, &stmt, NULL); while(sqlite3_step(stmt) == SQLITE_ROW) { const int id = sqlite3_column_int(stmt, 0); if(id == selection->last_single_id) sr = rc; if(id == imgid) er = rc; if(sr != -1 && er != -1) break; rc++; } sqlite3_finalize(stmt); /* select the images in range from start to end */ const uint32_t old_flags = dt_collection_get_query_flags(selection->collection); /* use the limit to select range of images */ dt_collection_set_query_flags(selection->collection, (old_flags | COLLECTION_QUERY_USE_LIMIT)); dt_collection_update(selection->collection); fullq = dt_util_dstrcat(fullq, "%s", "INSERT OR IGNORE INTO main.selected_images "); fullq = dt_util_dstrcat(fullq, "%s", dt_collection_get_query_no_group(selection->collection)); DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), fullq, -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, MIN(sr, er)); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, (MAX(sr, er) - MIN(sr, er)) + 1); sqlite3_step(stmt); sqlite3_finalize(stmt); /* reset filter */ dt_collection_set_query_flags(selection->collection, old_flags); dt_collection_update(selection->collection); // The logic above doesn't handle groups, so explicitly select the beginning and end to make sure those are selected properly dt_selection_select(selection, selection->last_single_id); dt_selection_select(selection, imgid); g_free(fullq); }
void dt_selection_toggle(dt_selection_t *selection, uint32_t imgid) { sqlite3_stmt *stmt; gboolean exists = FALSE; if(imgid == -1) return; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT imgid FROM main.selected_images WHERE imgid=?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); if(sqlite3_step(stmt) == SQLITE_ROW) exists = TRUE; sqlite3_finalize(stmt); if(exists) { dt_selection_deselect(selection, imgid); } else { dt_selection_select(selection, imgid); } /* update hint message */ dt_collection_hint_message(darktable.collection); }
void dt_selection_select_single(dt_selection_t *selection, uint32_t imgid) { selection->last_single_id = imgid; DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "DELETE FROM main.selected_images", NULL, NULL, NULL); dt_selection_select(selection, imgid); }