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(dt_selection_t *selection, uint32_t imgid) { gchar *query = NULL; if(imgid != -1) { const dt_image_t *image = dt_image_cache_get(darktable.image_cache, imgid, 'r'); if(image) { int img_group_id = image->group_id; dt_image_cache_read_release(darktable.image_cache, image); if(!darktable.gui || !darktable.gui->grouping || darktable.gui->expanded_group_id == img_group_id || !selection->collection) { query = dt_util_dstrcat(query, "INSERT OR IGNORE INTO main.selected_images VALUES (%d)", imgid); } else { query = dt_util_dstrcat(query, "INSERT OR IGNORE INTO main.selected_images SELECT id FROM main.images " "WHERE group_id = %d AND id IN (%s)", img_group_id, dt_collection_get_query_no_group(selection->collection)); } DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), query, NULL, NULL, NULL); g_free(query); } } /* update hint message */ dt_collection_hint_message(darktable.collection); }
void dt_selection_toggle(dt_selection_t *selection, uint32_t imgid) { gchar *query = NULL; sqlite3_stmt *stmt; gboolean exists = FALSE; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select imgid from 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) { selection->last_single_id = -1; query = dt_util_dstrcat(query,"delete from selected_images where imgid = %d", imgid); } else { selection->last_single_id = imgid; query = dt_util_dstrcat(query,"insert or ignore into selected_images values(%d)", imgid); } sqlite3_exec(dt_database_get(darktable.db), query, NULL, NULL, NULL); g_free(query); /* update hint message */ dt_collection_hint_message(darktable.collection); }
void dt_selection_invert(dt_selection_t *selection) { gchar *fullq = NULL; if (!selection->collection) return; fullq = dt_util_dstrcat(fullq, "%s", "insert or ignore into selected_images "); fullq = dt_util_dstrcat(fullq, "%s", dt_collection_get_query(selection->collection)); DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "insert into memory.tmp_selection select imgid from selected_images", NULL, NULL, NULL); DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "delete from selected_images", NULL, NULL, NULL); DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), fullq, NULL, NULL, NULL); DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "delete from selected_images where imgid in (select imgid from memory.tmp_selection)", NULL, NULL, NULL); DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "delete from memory.tmp_selection", NULL, NULL, NULL); g_free(fullq); /* update hint message */ dt_collection_hint_message(darktable.collection); }
void dt_selection_invert(dt_selection_t *selection) { gchar *fullq = NULL; if(!selection->collection) return; fullq = dt_util_dstrcat(fullq, "%s", "INSERT OR IGNORE INTO main.selected_images "); fullq = dt_util_dstrcat(fullq, "%s", dt_collection_get_query(selection->collection)); DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "INSERT INTO memory.tmp_selection SELECT imgid FROM main.selected_images", NULL, NULL, NULL); DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "DELETE FROM main.selected_images", NULL, NULL, NULL); DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), fullq, NULL, NULL, NULL); DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "DELETE FROM main.selected_images WHERE imgid IN (SELECT imgid FROM memory.tmp_selection)", NULL, NULL, NULL); DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "DELETE FROM memory.tmp_selection", NULL, NULL, NULL); g_free(fullq); dt_control_signal_raise(darktable.signals, DT_SIGNAL_SELECTION_CHANGED); /* update hint message */ dt_collection_hint_message(darktable.collection); }
void dt_selection_select_list(struct dt_selection_t *selection, GList *list) { if(!list) return; while(list) { int count = 1; gchar *query = NULL; int imgid = GPOINTER_TO_INT(list->data); selection->last_single_id = imgid; query = dt_util_dstrcat(query, "INSERT OR IGNORE INTO main.selected_images VALUES (%d)", imgid); list = g_list_next(list); while(list && count < 400) { imgid = GPOINTER_TO_INT(list->data); count++; selection->last_single_id = imgid; query = dt_util_dstrcat(query, ",(%d)", imgid); list = g_list_next(list); } char *result = NULL; sqlite3_exec(dt_database_get(darktable.db), query, NULL, NULL, &result); g_free(query); } /* update hint message */ dt_collection_hint_message(darktable.collection); }
void dt_colorlabels_toggle_label(const int imgid, const int color) { if(imgid <= 0) return; sqlite3_stmt *stmt, *stmt2; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT * FROM main.color_labels WHERE imgid=?1 AND color=?2 LIMIT 1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, color); if(sqlite3_step(stmt) == SQLITE_ROW) { DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "DELETE FROM main.color_labels WHERE imgid=?1 AND color=?2", -1, &stmt2, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 1, imgid); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 2, color); sqlite3_step(stmt2); sqlite3_finalize(stmt2); } else { DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "INSERT INTO main.color_labels (imgid, color) VALUES (?1, ?2)", -1, &stmt2, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 1, imgid); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 2, color); sqlite3_step(stmt2); sqlite3_finalize(stmt2); } sqlite3_finalize(stmt); dt_collection_hint_message(darktable.collection); }
void dt_colorlabels_toggle_label(const int imgid, const int color) { if(imgid <= 0) return; sqlite3_stmt *stmt, *stmt2; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select * from color_labels where imgid=?1 and color=?2", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, imgid); DT_DEBUG_SQLITE3_BIND_INT(stmt, 2, color); if(sqlite3_step(stmt) == SQLITE_ROW) { DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "delete from color_labels where imgid=?1 and color=?2", -1, &stmt2, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 1, imgid); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 2, color); sqlite3_step(stmt2); sqlite3_finalize(stmt2); } else { DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "insert into color_labels (imgid, color) values (?1, ?2)", -1, &stmt2, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 1, imgid); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 2, color); sqlite3_step(stmt2); sqlite3_finalize(stmt2); } sqlite3_finalize(stmt); dt_collection_hint_message(darktable.collection); }
void dt_selection_deselect(dt_selection_t *selection, uint32_t imgid) { gchar *query = NULL; selection->last_single_id = -1; if(imgid != -1) { const dt_image_t *image = dt_image_cache_get(darktable.image_cache, imgid, 'r'); if(image) { int img_group_id = image->group_id; dt_image_cache_read_release(darktable.image_cache, image); if(!darktable.gui || !darktable.gui->grouping || darktable.gui->expanded_group_id == img_group_id) { query = dt_util_dstrcat(query, "DELETE FROM main.selected_images WHERE imgid = %d", imgid); } else { query = dt_util_dstrcat(query, "DELETE FROM main.selected_images WHERE imgid IN " "(SELECT id FROM main.images WHERE group_id = %d)", img_group_id); } DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), query, NULL, NULL, NULL); g_free(query); } } /* update hint message */ dt_collection_hint_message(darktable.collection); }
void dt_selection_clear(const dt_selection_t *selection) { DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "delete from selected_images", NULL, NULL, NULL); /* update hint message */ dt_collection_hint_message(darktable.collection); }
static gboolean _lib_filmstrip_ratings_key_accel_callback(GtkAccelGroup *accel_group, GObject *aceeleratable, guint keyval, GdkModifierType modifier, gpointer data) { int num = GPOINTER_TO_INT(data); switch (num) { case DT_VIEW_DESERT: case DT_VIEW_REJECT: case DT_VIEW_STAR_1: case DT_VIEW_STAR_2: case DT_VIEW_STAR_3: case DT_VIEW_STAR_4: case DT_VIEW_STAR_5: case 666: { int32_t mouse_over_id; DT_CTL_GET_GLOBAL(mouse_over_id, lib_image_mouse_over_id); if (mouse_over_id <= 0) return FALSE; /* get image from cache */ int32_t activated_image = -1; activated_image = darktable.view_manager->proxy.filmstrip.activated_image(darktable.view_manager->proxy.filmstrip.module); int offset = 0; if(mouse_over_id == activated_image) offset = dt_collection_image_offset(mouse_over_id); const dt_image_t *cimg = dt_image_cache_read_get(darktable.image_cache, mouse_over_id); dt_image_t *image = dt_image_cache_write_get(darktable.image_cache, cimg); if (num == 666) image->flags &= ~0xf; else if (num == DT_VIEW_STAR_1 && ((image->flags & 0x7) == 1)) image->flags &= ~0x7; else if(num == DT_VIEW_REJECT && ((image->flags & 0x7) == 6)) image->flags &= ~0x7; else { image->flags &= ~0x7; image->flags |= num; } dt_image_cache_write_release(darktable.image_cache, image, DT_IMAGE_CACHE_SAFE); dt_image_cache_read_release(darktable.image_cache, image); dt_collection_hint_message(darktable.collection); // More than this, we need to redraw all if(mouse_over_id == activated_image) if(_lib_filmstrip_imgid_in_collection(darktable.collection, mouse_over_id) == 0) dt_view_filmstrip_scroll_relative(0, offset); /* redraw all */ dt_control_queue_redraw(); break; } default: break; } return TRUE; }
void dt_selection_clear(const dt_selection_t *selection) { DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "DELETE FROM main.selected_images", NULL, NULL, NULL); dt_control_signal_raise(darktable.signals, DT_SIGNAL_SELECTION_CHANGED); /* update hint message */ dt_collection_hint_message(darktable.collection); }
static void _dt_collection_recount_callback_2(gpointer instance, uint8_t id, gpointer user_data) { dt_collection_t *collection = (dt_collection_t *)user_data; int old_count = collection->count; collection->count = _dt_collection_compute_count(collection); if(!collection->clone) { if(old_count != collection->count) dt_collection_hint_message(collection); dt_control_signal_raise(darktable.signals, DT_SIGNAL_COLLECTION_CHANGED); } }
void dt_ratings_apply_to_image(int imgid, int rating) { dt_image_t *image = dt_image_cache_get(darktable.image_cache, imgid, 'w'); // one star is a toggle, so you can easily reject images by removing the last star: if(((image->flags & 0x7) == 1) && (rating == 1)) rating = 0; image->flags = (image->flags & ~0x7) | (0x7 & rating); // synch through: dt_image_cache_write_release(darktable.image_cache, image, DT_IMAGE_CACHE_SAFE); dt_collection_hint_message(darktable.collection); }
void dt_selection_select_single(dt_selection_t *selection, uint32_t imgid) { gchar *query = NULL; selection->last_single_id = imgid; DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "delete from selected_images", NULL, NULL, NULL); query = dt_util_dstrcat(query,"insert or ignore into selected_images values(%d)", imgid); DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), query, NULL, NULL, NULL); g_free(query); /* update hint message */ dt_collection_hint_message(darktable.collection); }
static gboolean _lib_filmstrip_ratings_key_accel_callback(GtkAccelGroup *accel_group, GObject *aceeleratable, guint keyval, GdkModifierType modifier, gpointer data) { int num = GPOINTER_TO_INT(data); switch(num) { case DT_VIEW_DESERT: case DT_VIEW_REJECT: case DT_VIEW_STAR_1: case DT_VIEW_STAR_2: case DT_VIEW_STAR_3: case DT_VIEW_STAR_4: case DT_VIEW_STAR_5: case 666: { int32_t mouse_over_id = dt_control_get_mouse_over_id(); if(mouse_over_id <= 0) return FALSE; /* get image from cache */ int32_t activated_image = -1; activated_image = darktable.view_manager->proxy.filmstrip.activated_image( darktable.view_manager->proxy.filmstrip.module); int offset = 0; if(mouse_over_id == activated_image) offset = dt_collection_image_offset(mouse_over_id); dt_ratings_apply_to_image(mouse_over_id, num); dt_collection_hint_message(darktable.collection); // More than this, we need to redraw all if(mouse_over_id == activated_image) if(_lib_filmstrip_imgid_in_collection(darktable.collection, mouse_over_id) == 0) dt_view_filmstrip_scroll_relative(0, offset); /* redraw all */ dt_control_queue_redraw(); break; } default: break; } return TRUE; }
static void entry_activated (GtkButton *button, gpointer user_data) { dt_lib_module_t *self = (dt_lib_module_t *)user_data; dt_lib_tagging_t *d = (dt_lib_tagging_t *)self->data; const gchar *tag = gtk_entry_get_text(d->entry); if(!tag || tag[0] == '\0') return; /** attach tag to selected images */ dt_tag_attach_string_list(tag, -1); dt_image_synch_xmp(-1); update(self, 1); update(self, 0); gtk_entry_set_text(d->entry, ""); dt_collection_hint_message(darktable.collection); }
static void new_button_clicked (GtkButton *button, gpointer user_data) { dt_lib_module_t *self = (dt_lib_module_t *)user_data; dt_lib_tagging_t *d = (dt_lib_tagging_t *)self->data; const gchar *tag = gtk_entry_get_text(d->entry); /** attach tag to selected images */ dt_tag_attach_string_list(tag, -1); dt_image_synch_xmp(-1); update(self, 1); update(self, 0); /** clear input box */ gtk_entry_set_text(d->entry, ""); dt_collection_hint_message(darktable.collection); }
void dt_selection_select_all(dt_selection_t *selection) { gchar *fullq = NULL; if(!selection->collection) return; 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_EXEC(dt_database_get(darktable.db), "DELETE FROM main.selected_images", NULL, NULL, NULL); DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), fullq, NULL, NULL, NULL); selection->last_single_id = -1; g_free(fullq); /* update hint message */ dt_collection_hint_message(darktable.collection); }
void dt_selection_select_all(dt_selection_t *selection) { gchar *fullq = NULL; if (!selection->collection) return; fullq = dt_util_dstrcat(fullq, "%s", "insert or ignore into selected_images "); fullq = dt_util_dstrcat(fullq, "%s", dt_collection_get_query(selection->collection)); DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), "delete from selected_images", NULL, NULL, NULL); DT_DEBUG_SQLITE3_EXEC(dt_database_get(darktable.db), fullq, NULL, NULL, NULL); selection->last_single_id = -1; g_free(fullq); /* update hint message */ dt_collection_hint_message(darktable.collection); }
static void detach_selected_tag(dt_lib_module_t *self, dt_lib_tagging_t *d) { GtkTreeIter iter; GtkTreeModel *model = NULL; GtkTreeView *view = d->current; GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); if(!gtk_tree_selection_get_selected(selection, &model, &iter)) return; guint tagid; gtk_tree_model_get (model, &iter, DT_LIB_TAGGING_COL_ID, &tagid, -1); int imgsel = -1; if(tagid <= 0) return; imgsel = dt_view_get_image_to_act_on(); dt_tag_detach(tagid,imgsel); dt_image_synch_xmp(imgsel); dt_collection_hint_message(darktable.collection); }
void dt_colorlabels_toggle_label_selection(const int color) { sqlite3_stmt *stmt, *stmt2; // check if all images in selection have that color label, i.e. try to get those which do not have the label DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "SELECT imgid FROM main.selected_images WHERE imgid " "NOT IN (SELECT a.imgid FROM main.selected_images AS " "a JOIN main.color_labels AS b ON a.imgid = b.imgid " "WHERE b.color = ?1)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, color); if(sqlite3_step(stmt) == SQLITE_ROW) { // none or only part of images have that color label, so label them all DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "INSERT OR IGNORE INTO main.color_labels (imgid, color) SELECT imgid, ?1 FROM main.selected_images", -1, &stmt2, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 1, color); sqlite3_step(stmt2); sqlite3_finalize(stmt2); } else { // none of the selected images without that color label, so delete them all DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "DELETE FROM main.color_labels WHERE imgid IN (SELECT imgid FROM main.selected_images) AND color=?1", -1, &stmt2, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 1, color); sqlite3_step(stmt2); sqlite3_finalize(stmt2); } sqlite3_finalize(stmt); dt_collection_hint_message(darktable.collection); }
void dt_colorlabels_toggle_label_selection(const int color) { sqlite3_stmt *stmt, *stmt2; // check if all images in selection have that color label, i.e. try to get those which do not have the label DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select * from selected_images where imgid not " "in (select a.imgid from selected_images as a " "join color_labels as b on a.imgid = b.imgid " "where b.color = ?1)", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, color); if(sqlite3_step(stmt) == SQLITE_ROW) { // none or only part of images have that color label, so label them all DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "insert or ignore into color_labels (imgid, color) select imgid, ?1 from selected_images", -1, &stmt2, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 1, color); sqlite3_step(stmt2); sqlite3_finalize(stmt2); } else { // none of the selected images without that color label, so delete them all DT_DEBUG_SQLITE3_PREPARE_V2( dt_database_get(darktable.db), "delete from color_labels where imgid in (select imgid from selected_images) and color=?1", -1, &stmt2, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt2, 1, color); sqlite3_step(stmt2); sqlite3_finalize(stmt2); } sqlite3_finalize(stmt); dt_collection_hint_message(darktable.collection); }
static void delete_button_clicked (GtkButton *button, gpointer user_data) { dt_lib_module_t *self = (dt_lib_module_t *)user_data; dt_lib_tagging_t *d = (dt_lib_tagging_t *)self->data; int res = GTK_RESPONSE_YES; guint tagid; GtkTreeIter iter; GtkTreeModel *model = NULL; GtkTreeView *view = d->related; GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); if(!gtk_tree_selection_get_selected(selection, &model, &iter)) return; gtk_tree_model_get (model, &iter, DT_LIB_TAGGING_COL_ID, &tagid, -1); // First check how many images are affected by the remove int count = dt_tag_remove(tagid,FALSE); if( count > 0 && dt_conf_get_bool("plugins/lighttable/tagging/ask_before_delete_tag") ) { GtkWidget *dialog; GtkWidget *win = dt_ui_main_window(darktable.gui->ui); gchar *tagname=dt_tag_get_name(tagid); dialog = gtk_message_dialog_new(GTK_WINDOW(win), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, ngettext("do you really want to delete the tag `%s'?\n%d image is assigned this tag!", "do you really want to delete the tag `%s'?\n%d images are assigned this tag!", count), tagname,count); gtk_window_set_title(GTK_WINDOW(dialog), _("delete tag?")); res = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); free(tagname); } if(res != GTK_RESPONSE_YES) return; GList *tagged_images = NULL; sqlite3_stmt *stmt; DT_DEBUG_SQLITE3_PREPARE_V2(dt_database_get(darktable.db), "select imgid from tagged_images where tagid=?1", -1, &stmt, NULL); DT_DEBUG_SQLITE3_BIND_INT(stmt, 1, tagid); while(sqlite3_step(stmt) == SQLITE_ROW) { tagged_images = g_list_append(tagged_images, GINT_TO_POINTER(sqlite3_column_int(stmt, 0))); } sqlite3_finalize(stmt); dt_tag_remove(tagid,TRUE); GList *list_iter; if((list_iter = g_list_first(tagged_images)) != NULL) { do { dt_image_synch_xmp(GPOINTER_TO_INT(list_iter->data)); } while((list_iter=g_list_next(list_iter)) != NULL); } g_list_free(g_list_first(tagged_images)); update(self, 0); update(self, 1); dt_collection_hint_message(darktable.collection); }
int dt_collection_update (const dt_collection_t *collection) { uint32_t result; gchar *wq, *sq, *selq, *query; wq = sq = selq = query = NULL; /* build where part */ if (!(collection->params.query_flags&COLLECTION_QUERY_USE_ONLY_WHERE_EXT)) { int need_operator = 0; dt_collection_filter_t rating = collection->params.rating; if(rating == DT_COLLECTION_FILTER_NOT_REJECT) rating = DT_COLLECTION_FILTER_STAR_NO; /* add default filters */ if (collection->params.filter_flags & COLLECTION_FILTER_FILM_ID) { wq = dt_util_dstrcat(wq, "(film_id = %d)", collection->params.film_id); need_operator = 1; } // DON'T SELECT IMAGES MARKED TO BE DELETED. wq = dt_util_dstrcat(wq, " %s (flags & %d) != %d", (need_operator)?"and":((need_operator=1)?"":""), DT_IMAGE_REMOVE, DT_IMAGE_REMOVE); if (collection->params.filter_flags & COLLECTION_FILTER_CUSTOM_COMPARE) wq = dt_util_dstrcat(wq, " %s (flags & 7) %s %d and (flags & 7) != 6", (need_operator)?"and":((need_operator=1)?"":""), comparators[collection->params.comparator], rating - 1); else if (collection->params.filter_flags & COLLECTION_FILTER_ATLEAST_RATING) wq = dt_util_dstrcat(wq, " %s (flags & 7) >= %d and (flags & 7) != 6", (need_operator)?"and":((need_operator=1)?"":""), rating - 1); else if (collection->params.filter_flags & COLLECTION_FILTER_EQUAL_RATING) wq = dt_util_dstrcat(wq, " %s (flags & 7) == %d", (need_operator)?"and":((need_operator=1)?"":""), rating - 1); if (collection->params.filter_flags & COLLECTION_FILTER_ALTERED) wq = dt_util_dstrcat(wq, " %s id in (select imgid from history where imgid=id)", (need_operator)?"and":((need_operator=1)?"":"") ); else if (collection->params.filter_flags & COLLECTION_FILTER_UNALTERED) wq = dt_util_dstrcat(wq, " %s id not in (select imgid from history where imgid=id)", (need_operator)?"and":((need_operator=1)?"":"") ); /* add where ext if wanted */ if ((collection->params.query_flags&COLLECTION_QUERY_USE_WHERE_EXT)) wq = dt_util_dstrcat(wq, " %s %s", (need_operator)?"and":"", collection->where_ext); } else wq = dt_util_dstrcat(wq, "%s", collection->where_ext); /* grouping */ if(darktable.gui && darktable.gui->grouping) { wq = dt_util_dstrcat(wq, " and (group_id = id or group_id = %d)", darktable.gui->expanded_group_id); } /* build select part includes where */ if (collection->params.sort == DT_COLLECTION_SORT_COLOR && (collection->params.query_flags & COLLECTION_QUERY_USE_SORT)) selq = dt_util_dstrcat(selq, "select distinct id from (select * from images where %s) as a left outer join color_labels as b on a.id = b.imgid", wq); else if(collection->params.query_flags&COLLECTION_QUERY_USE_ONLY_WHERE_EXT) selq = dt_util_dstrcat(selq, "select distinct images.id from images %s",wq); else selq = dt_util_dstrcat(selq, "select distinct id from images where %s",wq); /* build sort order part */ if (!(collection->params.query_flags&COLLECTION_QUERY_USE_ONLY_WHERE_EXT) && (collection->params.query_flags&COLLECTION_QUERY_USE_SORT)) { sq = dt_collection_get_sort_query(collection); } /* store the new query */ query = dt_util_dstrcat(query, "%s %s%s", selq, sq?sq:"", (collection->params.query_flags&COLLECTION_QUERY_USE_LIMIT)?" "LIMIT_QUERY:""); result = _dt_collection_store(collection, query); /* free memory used */ g_free(sq); g_free(wq); g_free(selq); g_free (query); /* update the cached count. collection isn't a real const anyway, we are writing to it in _dt_collection_store, too. */ ((dt_collection_t*)collection)->count = _dt_collection_compute_count(collection); dt_collection_hint_message(collection); return result; }
static gboolean _lib_filmstrip_button_press_callback(GtkWidget *w, GdkEventButton *e, gpointer user_data) { dt_lib_module_t *self = (dt_lib_module_t *)user_data; dt_lib_filmstrip_t *strip = (dt_lib_filmstrip_t *)self->data; int32_t mouse_over_id = strip->mouse_over_id; strip->select = DT_LIB_FILMSTRIP_SELECT_NONE; if (e->button == 1) { if(e->type == GDK_BUTTON_PRESS) { /* let check if any thumb controls was clicked */ switch(strip->image_over) { case DT_VIEW_DESERT: /* is this an activation of image */ if ((e->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK)) == 0) strip->select = DT_LIB_FILMSTRIP_SELECT_SINGLE; else if ((e->state & (GDK_CONTROL_MASK)) == GDK_CONTROL_MASK) strip->select = DT_LIB_FILMSTRIP_SELECT_TOGGLE; else if ((e->state & (GDK_SHIFT_MASK)) == GDK_SHIFT_MASK) strip->select = DT_LIB_FILMSTRIP_SELECT_RANGE; if(strip->select != DT_LIB_FILMSTRIP_SELECT_NONE) { strip->select_id = mouse_over_id; return TRUE; } break; case DT_VIEW_REJECT: case DT_VIEW_STAR_1: case DT_VIEW_STAR_2: case DT_VIEW_STAR_3: case DT_VIEW_STAR_4: case DT_VIEW_STAR_5: { int offset = 0; if(mouse_over_id == strip->activated_image) offset = dt_collection_image_offset(mouse_over_id); const dt_image_t *cimg = dt_image_cache_read_get(darktable.image_cache, mouse_over_id); dt_image_t *image = dt_image_cache_write_get(darktable.image_cache, cimg); if(strip->image_over == DT_VIEW_STAR_1 && ((image->flags & 0x7) == 1)) image->flags &= ~0x7; else if(strip->image_over == DT_VIEW_REJECT && ((image->flags & 0x7) == 6)) image->flags &= ~0x7; else { image->flags &= ~0x7; image->flags |= strip->image_over; } dt_image_cache_write_release(darktable.image_cache, image, DT_IMAGE_CACHE_SAFE); dt_image_cache_read_release(darktable.image_cache, image); dt_collection_hint_message(darktable.collection); // More than this, we need to redraw all if(mouse_over_id == strip->activated_image) if(_lib_filmstrip_imgid_in_collection(darktable.collection, mouse_over_id) == 0) dt_view_filmstrip_scroll_relative(0, offset); gtk_widget_queue_draw(darktable.view_manager->proxy.filmstrip.module->widget); return TRUE; } default: return FALSE; } } else if(e->type == GDK_2BUTTON_PRESS) { if (mouse_over_id > 0) { strip->activated_image = mouse_over_id; dt_control_signal_raise(darktable.signals, DT_SIGNAL_VIEWMANAGER_FILMSTRIP_ACTIVATE); return TRUE; } } } return FALSE; }