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; }
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 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; }