![]() |
Ansel 0.0
A darktable fork - bloat + design vision
|
#include "dtgtk/thumbtable.h"
#include "dtgtk/thumbnail.h"
#include "common/collection.h"
#include "common/colorlabels.h"
#include "common/history.h"
#include "common/image_cache.h"
#include "common/grouping.h"
#include "common/ratings.h"
#include "common/selection.h"
#include "common/undo.h"
#include "control/control.h"
#include "control/jobs/import_jobs.h"
#include "gui/drag_and_drop.h"
#include "views/view.h"
#include "bauhaus/bauhaus.h"
#include <glib-object.h>
Macros | |
#define | MAX_THUMBNAILS 420 |
#define | CLAMP_ROW(rowid) CLAMP(rowid, 0, table->collection_count - 1) |
#define | IS_COLLECTION_EDGE(rowid) (rowid < 0 || rowid >= table->collection_count) |
Typedefs | |
typedef enum dt_thumbtable_direction_t | dt_thumbtable_direction_t |
Enumerations | |
enum | dt_thumbtable_direction_t { DT_TT_MOVE_UP , DT_TT_MOVE_DOWN , DT_TT_MOVE_LEFT , DT_TT_MOVE_RIGHT , DT_TT_MOVE_PREVIOUS_PAGE , DT_TT_MOVE_NEXT_PAGE , DT_TT_MOVE_START , DT_TT_MOVE_END } |
Functions | |
void | _dt_thumbtable_empty_list (dt_thumbtable_t *table) |
static int | _grab_focus (dt_thumbtable_t *table) |
void | _mouse_over_image_callback (gpointer instance, gpointer user_data) |
static void | _rowid_to_position (dt_thumbtable_t *table, int rowid, int *x, int *y) |
static int | _position_to_rowid (dt_thumbtable_t *table, const double x, const double y) |
static gboolean | _set_thumb_position (dt_thumbtable_t *table, dt_thumbnail_t *thumb) |
void | dt_thumbtable_get_scroll_position (dt_thumbtable_t *table, double *x, double *y) |
void | dt_thumbtable_set_active_rowid (dt_thumbtable_t *table) |
Update internal active row tracking. | |
static int | dt_thumbtable_scroll_to_position (dt_thumbtable_t *table, const double x, const double y) |
static void | dt_thumbtable_scroll_to_rowid (dt_thumbtable_t *table, int rowid) |
static int | _find_rowid_from_imgid (dt_thumbtable_t *table, const int32_t imgid) |
int | dt_thumbtable_scroll_to_imgid (dt_thumbtable_t *table, int32_t imgid) |
Scroll the view to show a specific image. | |
int | dt_thumbtable_scroll_to_active_rowid (dt_thumbtable_t *table) |
Scroll to show the active row. | |
int | dt_thumbtable_scroll_to_selection (dt_thumbtable_t *table) |
Scroll to show selected content. | |
static gboolean | _get_row_ids (dt_thumbtable_t *table, int *rowid_min, int *rowid_max) |
gboolean | _is_rowid_visible (dt_thumbtable_t *table, int rowid) |
gboolean | _update_row_ids (dt_thumbtable_t *table) |
void | _update_grid_area (dt_thumbtable_t *table) |
void | _grid_configure (dt_thumbtable_t *table, int width, int height, int cols) |
void | dt_thumbtable_configure (dt_thumbtable_t *table) |
int | _garbage_collection (dt_thumbtable_t *table) |
dt_thumbnail_t * | _find_thumb_by_imgid (dt_thumbtable_t *table, const int32_t imgid) |
void | _add_thumbnail_group_borders (dt_thumbtable_t *table, dt_thumbnail_t *thumb) |
void | _add_thumbnail_at_rowid (dt_thumbtable_t *table, const size_t rowid, const int32_t mouse_over) |
void | _populate_thumbnails (dt_thumbtable_t *table) |
void | _resize_thumbnails (dt_thumbtable_t *table) |
void | dt_thumbtable_update (dt_thumbtable_t *table) |
static void | _dt_profile_change_callback (gpointer instance, int type, gpointer user_data) |
static void | _dt_selection_changed_callback (gpointer instance, gpointer user_data) |
void | dt_thumbtable_set_zoom (dt_thumbtable_t *table, dt_thumbtable_zoom_t level) |
dt_thumbtable_zoom_t | dt_thumbtable_get_zoom (dt_thumbtable_t *table) |
void | dt_thumbtable_offset_zoom (dt_thumbtable_t *table, const double delta_x, const double delta_y) |
void | dt_thumbtable_set_focus_regions (dt_thumbtable_t *table, gboolean enable) |
gboolean | dt_thumbtable_get_focus_regions (dt_thumbtable_t *table) |
void | dt_thumbtable_set_focus_peaking (dt_thumbtable_t *table, gboolean enable) |
gboolean | dt_thumbtable_get_focus_peaking (dt_thumbtable_t *table) |
void | dt_thumbtable_set_draw_group_borders (dt_thumbtable_t *table, gboolean enable) |
gboolean | dt_thumbtable_get_draw_group_borders (dt_thumbtable_t *table) |
void | dt_thumbtable_refresh_thumbnail_real (dt_thumbtable_t *table, int32_t imgid, gboolean reinit) |
static void | _dt_image_info_changed_callback (gpointer instance, gpointer imgs, gpointer user_data) |
static void | _dt_collection_lut (dt_thumbtable_t *table) |
static gboolean | _dt_collection_get_hash (dt_thumbtable_t *table) |
static void | _dt_collection_changed_callback (gpointer instance, dt_collection_change_t query_change, dt_collection_properties_t changed_property, gpointer imgs, const int next, gpointer user_data) |
static gchar * | _thumbs_get_overlays_class (dt_thumbnail_overlay_t over) |
static void | _thumbs_update_overlays_mode (dt_thumbtable_t *table) |
void | dt_thumbtable_set_overlays_mode (dt_thumbtable_t *table, dt_thumbnail_overlay_t over) |
Set the overlay display mode for thumbnails. | |
static void | _event_dnd_get (GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, const guint target_type, const guint time, gpointer user_data) |
static void | _event_dnd_begin (GtkWidget *widget, GdkDragContext *context, gpointer user_data) |
GList * | _thumbtable_dnd_import_check (GList *files, const char *pathname, int *elements) |
static gboolean | _thumbtable_dnd_import (GtkSelectionData *selection_data) |
void | dt_thumbtable_event_dnd_received (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint target_type, guint time, gpointer user_data) |
Handle drag-and-drop data received. | |
static void | _event_dnd_end (GtkWidget *widget, GdkDragContext *context, gpointer user_data) |
int | _imgid_to_rowid (dt_thumbtable_t *table, int32_t imgid) |
void | _move_in_grid (dt_thumbtable_t *table, GdkEventKey *event, dt_thumbtable_direction_t direction, int origin_imgid) |
void | _alternative_mode (dt_thumbtable_t *table, gboolean enable) |
gboolean | dt_thumbtable_key_pressed_grid (GtkWidget *self, GdkEventKey *event, gpointer user_data) |
gboolean | dt_thumbtable_key_released_grid (GtkWidget *self, GdkEventKey *event, gpointer user_data) |
static gboolean | _draw_callback (GtkWidget *widget, cairo_t *cr, gpointer user_data) |
void | dt_thumbtable_reset_collection (dt_thumbtable_t *table) |
gboolean | _event_main_leave (GtkWidget *widget, GdkEventCrossing *event, gpointer user_data) |
dt_thumbtable_t * | dt_thumbtable_new (dt_thumbtable_mode_t mode) |
Create a new thumbnail table widget. | |
void | dt_thumbtable_cleanup (dt_thumbtable_t *table) |
void | dt_thumbtable_update_parent (dt_thumbtable_t *table) |
void | dt_thumbtable_set_parent (dt_thumbtable_t *table, dt_thumbtable_mode_t mode) |
void | dt_thumbtable_select_all (dt_thumbtable_t *table) |
Select all images in the current grid. | |
void | dt_thumbtable_select_range (dt_thumbtable_t *table, const int rowid) |
Select a range of images in the collection. | |
void | dt_thumbtable_invert_selection (dt_thumbtable_t *table) |
Invert the current selection. | |
void | dt_thumbtable_dispatch_over (dt_thumbtable_t *table, GdkEventType type, int32_t imgid) |
Update the mouse-over image ID with conflict resolution. | |
Variables | |
static gint64 | next_over_time = 0 |
We keep a double reference of thumbnail objects for the current collection:
The linked list is used to keep track of allocated objects to update, redraw and free. Its length is limited to 840 elements or whatever is visible inside viewport at current scroll level. It's garbage-collected.
The LUT is used to speed up lookups for thumbnails at known, bounded positions in sequential order (position in collection = (rowid - 1) in SQLite result = order in GUI = index in the LUT). This LUT prevents us from re-querying the collection in SQLite all the time using: "SELECT rowid, imgid FROM main.collected_images WHERE rowid > min_row AND rowid <= max_row ORDER BY rowid ASC". Note though that SQLite starts indexing at 1, so there is an unit offset. It also keeps a reference to the thumbnail objects, but objets should never be freed from there. Given that collections set on root folders contain all the images from their children, the number of elements in a LUT can be anything from 1 to several 100k images.
It is expected that thumbnails alloc/free always happen using table->list, and that table->lut only updates its references accordingly, because table->list will typically lead to fewer loop incrementations.
Keep that in mind if/when extending features.
For image collections having up to 1000 items, we could just statically reset/init the list of thumbnails once when the collection changes, then only resize thumbnails at runtime. But for collections of thousands of images, while adding child widgets is fairly fast, considering, detaching those widgets from the parent takes ages (several orders of magnitude more than attaching). So we have no choice here but to attach and detach dynamically, as to keep the number of children reasonable. "Reasonable" is we populate the current viewport page (at current scrolling position), the previous and the next ones, as to ensure smooth scrolling.
The dimensions of the full collection grid are only ever virtual, but we need to make them real for the scrollbars to behave properly through dynamic loading and unloading of thumbnails. So we set the grid area to what it would be if we loaded all thumbnails.
#define CLAMP_ROW | ( | rowid | ) | CLAMP(rowid, 0, table->collection_count - 1) |
#define IS_COLLECTION_EDGE | ( | rowid | ) | (rowid < 0 || rowid >= table->collection_count) |
#define MAX_THUMBNAILS 420 |
a class to manage a table of thumbnail for lighttable and filmstrip.
typedef enum dt_thumbtable_direction_t dt_thumbtable_direction_t |
void _add_thumbnail_at_rowid | ( | dt_thumbtable_t * | table, |
const size_t | rowid, | ||
const int32_t | mouse_over | ||
) |
References _add_thumbnail_group_borders(), _find_thumb_by_imgid(), _set_thumb_position(), dt_thumbtable_t::alternate_mode, darktable, dt_thumbnail_t::disable_actions, dt_selection_is_id_selected(), dt_thumbnail_alternative_mode(), dt_thumbnail_new(), dt_thumbnail_resize(), dt_thumbnail_set_mouseover(), dt_thumbnail_set_overlay(), dt_thumbnail_update_selection(), DT_THUMBTABLE_MODE_FILEMANAGER, DT_THUMBTABLE_MODE_FILMSTRIP, dt_view_active_images_has_imgid(), FALSE, dt_thumbtable_t::grid, dt_thumbnail_t::groupid, dt_thumbtable_cache_t::groupid, dt_thumbnail_t::height, dt_thumbnail_t::imgid, dt_thumbtable_cache_t::imgid, dt_thumbtable_t::list, dt_thumbtable_t::lut, dt_thumbtable_t::mode, dt_thumbnail_t::over, dt_thumbtable_t::overlays, dt_thumbnail_t::rowid, darktable_t::selection, dt_thumbtable_cache_t::thumb, dt_thumbtable_t::thumb_height, dt_thumbtable_t::thumb_nb, dt_thumbtable_t::thumb_width, TRUE, dt_thumbnail_t::widget, dt_thumbnail_t::width, dt_thumbnail_t::x, and dt_thumbnail_t::y.
Referenced by _populate_thumbnails().
void _add_thumbnail_group_borders | ( | dt_thumbtable_t * | table, |
dt_thumbnail_t * | thumb | ||
) |
References CLAMP_ROW, dt_thumbtable_t::draw_group_borders, DT_THUMBNAIL_BORDER_BOTTOM, DT_THUMBNAIL_BORDER_LEFT, DT_THUMBNAIL_BORDER_RIGHT, DT_THUMBNAIL_BORDER_TOP, dt_thumbnail_set_group_border(), DT_THUMBTABLE_MODE_FILEMANAGER, DT_THUMBTABLE_MODE_FILMSTRIP, dt_thumbtable_cache_t::group_members, dt_thumbnail_t::groupid, dt_thumbtable_cache_t::groupid, IS_COLLECTION_EDGE, dt_thumbtable_t::lut, dt_thumbtable_t::mode, dt_thumbnail_t::rowid, and dt_thumbtable_t::thumbs_per_row.
Referenced by _add_thumbnail_at_rowid(), _dt_image_info_changed_callback(), and _resize_thumbnails().
void _alternative_mode | ( | dt_thumbtable_t * | table, |
gboolean | enable | ||
) |
|
static |
References DT_DEBUG_LIGHTTABLE, dt_print(), dt_thumbtable_configure(), dt_thumbtable_update(), FALSE, and TRUE.
Referenced by dt_thumbtable_new().
|
static |
References _dt_collection_get_hash(), _dt_collection_lut(), _dt_thumbtable_empty_list(), _grab_focus(), _update_grid_area(), dt_thumbtable_t::collapse_groups, dt_thumbtable_t::collection_count, DT_COLLECTION_PROP_GROUPING, dt_conf_get_bool(), dt_control_log(), dt_thumbtable_configure(), dt_thumbtable_set_active_rowid(), dt_thumbtable_update(), FALSE, and dt_thumbtable_t::thumbs_inited.
Referenced by dt_thumbtable_cleanup(), and dt_thumbtable_new().
|
static |
References darktable_t::collection, dt_thumbtable_t::collection_count, dt_thumbtable_t::collection_hash, dt_thumbtable_t::collection_inited, darktable, dt_collection_get_count(), dt_collection_get_query(), dt_hash(), FALSE, dt_thumbtable_t::reset_collection, and TRUE.
Referenced by _dt_collection_changed_callback().
|
static |
References dt_thumbtable_t::collapse_groups, dt_thumbtable_t::collection_count, dt_thumbtable_t::collection_inited, darktable, darktable_t::db, dt_database_get(), DT_DEBUG_SQLITE3_PREPARE_V2, dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_selection_deselect(), dt_thumbtable_cache_t::group_members, dt_thumbtable_cache_t::groupid, dt_thumbtable_cache_t::history_items, dt_thumbtable_cache_t::imgid, dt_thumbtable_t::lock, dt_thumbtable_t::lut, darktable_t::selection, dt_thumbtable_cache_t::thumb, and TRUE.
Referenced by _dt_collection_changed_callback().
|
static |
References _add_thumbnail_group_borders(), dt_thumbtable_t::collection_count, darktable, dt_grouping_get_image_group(), dt_image_altered(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_thumbnail_update_infos(), dt_view_image_info_update(), dt_thumbtable_cache_t::groupid, dt_thumbtable_cache_t::history_items, dt_view_manager_t::image_info_id, dt_thumbnail_t::imgid, dt_thumbtable_cache_t::imgid, dt_thumbtable_t::list, dt_thumbtable_t::lock, dt_thumbtable_t::lut, darktable_t::view_manager, and dt_thumbnail_t::widget.
Referenced by dt_thumbtable_cleanup(), and dt_thumbtable_new().
|
static |
References dt_thumbtable_refresh_thumbnail, TRUE, and UNKNOWN_IMAGE.
Referenced by dt_thumbtable_cleanup(), and dt_thumbtable_new().
|
static |
References darktable, dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_selection_is_id_selected(), dt_thumbnail_update_selection(), dt_view_image_info_update(), FALSE, dt_thumbnail_t::imgid, dt_thumbtable_t::list, dt_thumbtable_t::lock, dt_thumbnail_t::rowid, dt_thumbtable_t::rowid, dt_thumbnail_t::selected, darktable_t::selection, TRUE, and dt_thumbnail_t::widget.
Referenced by dt_thumbtable_cleanup(), and dt_thumbtable_new().
void _dt_thumbtable_empty_list | ( | dt_thumbtable_t * | table | ) |
References DT_DEBUG_LIGHTTABLE, dt_get_wtime(), dt_print(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_thumbnail_destroy(), FALSE, dt_thumbtable_t::list, dt_thumbtable_t::lock, dt_thumbtable_t::thumb_nb, and dt_thumbtable_t::thumbs_inited.
Referenced by _dt_collection_changed_callback(), dt_thumbtable_cleanup(), and dt_thumbtable_update().
|
static |
References dt_view_manager_t::current_view, darktable, dt_thumbtable_t::drag_list, dt_act_on_get_images(), view(), and darktable_t::view_manager.
Referenced by dt_thumbtable_new().
|
static |
References dt_thumbtable_t::drag_list, dt_gui_remove_class(), and dt_thumbtable_t::grid.
Referenced by dt_thumbtable_new().
|
static |
References _BYTE, _DWORD, DND_TARGET_IMGID, DND_TARGET_URI, dt_thumbtable_t::drag_list, dt_image_full_path(), dt_util_glist_to_str(), g_list_is_singleton, PATH_MAX, and TRUE.
Referenced by dt_thumbtable_new().
gboolean _event_main_leave | ( | GtkWidget * | widget, |
GdkEventCrossing * | event, | ||
gpointer | user_data | ||
) |
References dt_control_set_mouse_over_id(), TRUE, and UNKNOWN_IMAGE.
Referenced by dt_thumbtable_new().
|
static |
dt_thumbnail_t * _find_thumb_by_imgid | ( | dt_thumbtable_t * | table, |
const int32_t | imgid | ||
) |
References dt_thumbnail_t::imgid, and dt_thumbtable_t::list.
Referenced by _add_thumbnail_at_rowid().
int _garbage_collection | ( | dt_thumbtable_t * | table | ) |
References _find_rowid_from_imgid(), DT_DEBUG_LIGHTTABLE, dt_print(), dt_thumbnail_destroy(), dt_thumbnail_get_background_jobs(), dt_thumbnail_t::imgid, dt_thumbtable_cache_t::imgid, dt_thumbtable_t::list, dt_thumbtable_t::lut, dt_thumbtable_t::max_row_id, MAX_THUMBNAILS, dt_thumbtable_t::min_row_id, dt_thumbnail_t::rowid, dt_thumbtable_cache_t::thumb, dt_thumbtable_t::thumb_nb, UNKNOWN_IMAGE, and dt_thumbnail_t::widget.
Referenced by dt_thumbtable_update().
|
static |
References dt_thumbtable_t::configured, DT_THUMBTABLE_MODE_FILEMANAGER, DT_THUMBTABLE_MODE_FILMSTRIP, FALSE, dt_thumbtable_t::h_scrollbar, dt_thumbtable_t::mode, position(), dt_thumbtable_t::thumb_height, dt_thumbtable_t::thumb_width, dt_thumbtable_t::thumbs_per_row, TRUE, and dt_thumbtable_t::v_scrollbar.
Referenced by _update_row_ids().
|
static |
void _grid_configure | ( | dt_thumbtable_t * | table, |
int | width, | ||
int | height, | ||
int | cols | ||
) |
References dt_thumbtable_t::configured, DT_DEBUG_LIGHTTABLE, dt_print(), DT_THUMBTABLE_MODE_FILEMANAGER, DT_THUMBTABLE_MODE_FILMSTRIP, height, dt_thumbtable_t::mode, dt_thumbtable_t::thumb_height, dt_thumbtable_t::thumb_width, dt_thumbtable_t::thumbs_per_row, TRUE, dt_thumbtable_t::view_height, dt_thumbtable_t::view_width, and width.
Referenced by dt_thumbtable_configure().
int _imgid_to_rowid | ( | dt_thumbtable_t * | table, |
int32_t | imgid | ||
) |
gboolean _is_rowid_visible | ( | dt_thumbtable_t * | table, |
int | rowid | ||
) |
References dt_thumbtable_t::configured, DT_THUMBTABLE_MODE_FILEMANAGER, DT_THUMBTABLE_MODE_FILMSTRIP, FALSE, dt_thumbtable_t::h_scrollbar, dt_thumbtable_t::mode, position(), dt_thumbtable_t::thumb_height, dt_thumbtable_t::thumb_width, dt_thumbtable_t::thumbs_per_row, and dt_thumbtable_t::v_scrollbar.
Referenced by _move_in_grid().
void _mouse_over_image_callback | ( | gpointer | instance, |
gpointer | user_data | ||
) |
References dt_thumbtable_t::collection_count, dt_thumbtable_t::draw_group_borders, dt_control_get_mouse_over_id(), dt_gui_add_class(), dt_gui_remove_class(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_thumbnail_set_mouseover(), dt_thumbtable_cache_t::group_members, dt_thumbnail_t::groupid, dt_thumbnail_t::imgid, dt_thumbtable_t::lock, dt_thumbtable_t::lut, dt_thumbtable_t::max_row_id, dt_thumbtable_t::min_row_id, dt_thumbnail_t::mouse_over, dt_thumbtable_cache_t::thumb, dt_thumbtable_t::thumbs_per_row, UNKNOWN_IMAGE, and dt_thumbnail_t::widget.
Referenced by dt_thumbtable_new().
void _move_in_grid | ( | dt_thumbtable_t * | table, |
GdkEventKey * | event, | ||
dt_thumbtable_direction_t | direction, | ||
int | origin_imgid | ||
) |
References _imgid_to_rowid(), _is_rowid_visible(), dt_thumbtable_t::collection_count, dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_thumbtable_dispatch_over(), dt_thumbtable_scroll_to_imgid(), dt_thumbtable_update(), DT_TT_MOVE_DOWN, DT_TT_MOVE_END, DT_TT_MOVE_LEFT, DT_TT_MOVE_NEXT_PAGE, DT_TT_MOVE_PREVIOUS_PAGE, DT_TT_MOVE_RIGHT, DT_TT_MOVE_START, DT_TT_MOVE_UP, FALSE, dt_thumbtable_cache_t::imgid, dt_thumbtable_t::lock, dt_thumbtable_t::lut, dt_thumbtable_t::scroll_window, dt_thumbtable_t::thumb_height, dt_thumbtable_t::thumbs_inited, dt_thumbtable_t::thumbs_per_row, and dt_thumbtable_t::view_height.
Referenced by dt_thumbtable_key_pressed_grid().
void _populate_thumbnails | ( | dt_thumbtable_t * | table | ) |
References _add_thumbnail_at_rowid(), dt_thumbtable_t::collection_count, dt_control_get_mouse_over_id(), MAX, dt_thumbtable_t::max_row_id, MIN, and dt_thumbtable_t::min_row_id.
Referenced by dt_thumbtable_update().
|
static |
References DT_THUMBTABLE_MODE_FILEMANAGER, DT_THUMBTABLE_MODE_FILMSTRIP, dt_thumbtable_t::mode, dt_thumbtable_t::thumb_height, dt_thumbtable_t::thumb_width, dt_thumbtable_t::thumbs_per_row, UNKNOWN_IMAGE, dt_thumbtable_t::view_height, and dt_thumbtable_t::view_width.
Referenced by dt_thumbtable_set_active_rowid().
void _resize_thumbnails | ( | dt_thumbtable_t * | table | ) |
References _add_thumbnail_group_borders(), _set_thumb_position(), dt_thumbtable_t::alternate_mode, dt_thumbtable_t::configured, dt_thumbnail_alternative_mode(), dt_thumbnail_resize(), dt_thumbnail_set_overlay(), dt_thumbnail_update_partial_infos(), dt_thumbtable_t::grid, dt_thumbnail_t::height, dt_thumbtable_t::list, dt_thumbnail_t::over, dt_thumbtable_t::overlays, dt_thumbtable_t::thumb_height, dt_thumbtable_t::thumb_width, dt_thumbnail_t::widget, dt_thumbnail_t::width, dt_thumbnail_t::x, and dt_thumbnail_t::y.
Referenced by dt_thumbtable_set_draw_group_borders(), dt_thumbtable_set_overlays_mode(), and dt_thumbtable_update().
|
static |
|
static |
References _rowid_to_position(), FALSE, dt_thumbnail_t::rowid, dt_thumbtable_t::thumbs_per_row, TRUE, dt_thumbnail_t::x, and dt_thumbnail_t::y.
Referenced by _add_thumbnail_at_rowid(), and _resize_thumbnails().
|
static |
References DT_THUMBNAIL_OVERLAYS_ALWAYS_NORMAL, DT_THUMBNAIL_OVERLAYS_HOVER_NORMAL, and DT_THUMBNAIL_OVERLAYS_NONE.
Referenced by dt_thumbtable_set_overlays_mode().
|
static |
References dt_conf_get_int(), dt_thumbtable_set_overlays_mode(), and sanitize_overlays().
Referenced by dt_thumbtable_new().
|
static |
References _thumbtable_dnd_import_check(), dt_conf_get_string(), dt_control_import(), FALSE, dt_control_import_t::imgs, and TRUE.
Referenced by dt_thumbtable_event_dnd_received().
GList * _thumbtable_dnd_import_check | ( | GList * | files, |
const char * | pathname, | ||
int * | elements | ||
) |
References dt_control_log(), and dt_supported_image().
Referenced by _thumbtable_dnd_import().
void _update_grid_area | ( | dt_thumbtable_t * | table | ) |
References dt_thumbtable_t::collection_count, dt_thumbtable_t::collection_inited, dt_thumbtable_t::configured, DT_DEBUG_LIGHTTABLE, dt_print(), DT_THUMBTABLE_MODE_FILEMANAGER, DT_THUMBTABLE_MODE_FILMSTRIP, dt_thumbtable_t::grid, height, dt_thumbtable_t::mode, dt_thumbtable_t::thumb_height, dt_thumbtable_t::thumbs_per_row, and width.
Referenced by _dt_collection_changed_callback(), and dt_thumbtable_configure().
gboolean _update_row_ids | ( | dt_thumbtable_t * | table | ) |
References _get_row_ids(), FALSE, dt_thumbtable_t::max_row_id, MAX_THUMBNAILS, dt_thumbtable_t::min_row_id, dt_thumbtable_t::thumbs_inited, and TRUE.
Referenced by dt_thumbtable_update().
void dt_thumbtable_cleanup | ( | dt_thumbtable_t * | table | ) |
References _dt_collection_changed_callback(), _dt_image_info_changed_callback(), _dt_profile_change_callback(), _dt_selection_changed_callback(), _dt_thumbtable_empty_list(), darktable, DT_DEBUG_CONTROL_SIGNAL_DISCONNECT, dt_pthread_mutex_destroy(), dt_thumbtable_t::lock, dt_thumbtable_t::lut, and darktable_t::signals.
Referenced by dt_ui_cleanup_main_table().
void dt_thumbtable_configure | ( | dt_thumbtable_t * | table | ) |
References _grid_configure(), _update_grid_area(), dt_thumbtable_t::configured, dt_conf_get_int(), DT_THUMBTABLE_MODE_FILEMANAGER, DT_THUMBTABLE_MODE_FILMSTRIP, FALSE, dt_thumbtable_t::mode, dt_thumbtable_t::parent_overlay, dt_thumbtable_t::scroll_window, dt_thumbtable_t::thumb_height, dt_thumbtable_t::thumb_width, dt_thumbtable_t::thumbs_inited, dt_thumbtable_t::thumbs_per_row, dt_thumbtable_t::view_height, and dt_thumbtable_t::view_width.
Referenced by _draw_callback(), and _dt_collection_changed_callback().
void dt_thumbtable_dispatch_over | ( | dt_thumbtable_t * | table, |
GdkEventType | type, | ||
int32_t | imgid | ||
) |
Update the mouse-over image ID with conflict resolution.
table | The thumbnail table |
type | The event type triggering the update |
imgid | Image ID the mouse is over |
Updates which image is considered "under the mouse", resolving conflicts between mouse and keyboard events.
References _find_rowid_from_imgid(), dt_control_set_keyboard_over_id(), dt_control_set_mouse_over_id(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_thumbtable_get_scroll_position(), dt_thumbtable_scroll_to_position(), dt_thumbtable_t::grid, dt_thumbtable_t::lock, next_over_time, dt_thumbtable_t::rowid, dt_thumbtable_t::scroll_window, and type.
Referenced by _event_main_enter(), _event_main_leave(), _event_main_motion(), _event_main_press(), and _move_in_grid().
void dt_thumbtable_event_dnd_received | ( | GtkWidget * | widget, |
GdkDragContext * | context, | ||
gint | x, | ||
gint | y, | ||
GtkSelectionData * | selection_data, | ||
guint | target_type, | ||
guint | time, | ||
gpointer | user_data | ||
) |
Handle drag-and-drop data received.
widget | The widget receiving the drop |
context | The drag context |
x | Drop x coordinate |
y | Drop y coordinate |
selection_data | The dropped data |
target_type | Target type ID |
time | Timestamp |
user_data | User data (thumbtable instance) |
Handles drops of files/URIs onto the thumbtable. Files are imported into the current film roll.
References _thumbtable_dnd_import(), DND_TARGET_URI, and FALSE.
Referenced by dt_thumbtable_new().
gboolean dt_thumbtable_get_draw_group_borders | ( | dt_thumbtable_t * | table | ) |
References dt_thumbtable_t::draw_group_borders.
gboolean dt_thumbtable_get_focus_peaking | ( | dt_thumbtable_t * | table | ) |
References dt_thumbtable_t::focus_peaking.
Referenced by focus_peaking_callback(), and focus_peaking_checked_callback().
gboolean dt_thumbtable_get_focus_regions | ( | dt_thumbtable_t * | table | ) |
References dt_thumbtable_t::focus_regions.
Referenced by _focus_checked(), and _focus_toggle_callback().
void dt_thumbtable_get_scroll_position | ( | dt_thumbtable_t * | table, |
double * | x, | ||
double * | y | ||
) |
References dt_thumbtable_t::h_scrollbar, and dt_thumbtable_t::v_scrollbar.
Referenced by dt_thumbtable_dispatch_over(), and dt_thumbtable_set_active_rowid().
dt_thumbtable_zoom_t dt_thumbtable_get_zoom | ( | dt_thumbtable_t * | table | ) |
References dt_thumbtable_t::zoom.
Referenced by _zoom_checked().
void dt_thumbtable_invert_selection | ( | dt_thumbtable_t * | table | ) |
Invert the current selection.
table | The thumbnail table |
Inverts the selection state of all images in the current collection.
References dt_thumbtable_t::collection_count, dt_thumbtable_t::collection_inited, darktable, dt_selection_deselect_list(), dt_selection_get_list(), dt_thumbtable_select_all(), and darktable_t::selection.
Referenced by invert_selection_callback().
gboolean dt_thumbtable_key_pressed_grid | ( | GtkWidget * | self, |
GdkEventKey * | event, | ||
gpointer | user_data | ||
) |
References _alternative_mode(), _find_rowid_from_imgid(), _move_in_grid(), darktable, dt_control_get_keyboard_over_id(), dt_control_get_mouse_over_id(), DT_DEBUG_CONTROL_SIGNAL_RAISE, dt_modifier_is(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_selection_get_first_id(), dt_selection_select_single(), dt_selection_toggle(), DT_SIGNAL_VIEWMANAGER_THUMBTABLE_ACTIVATE, DT_THUMBTABLE_MODE_FILEMANAGER, dt_thumbtable_select_range(), DT_TT_MOVE_DOWN, DT_TT_MOVE_END, DT_TT_MOVE_LEFT, DT_TT_MOVE_NEXT_PAGE, DT_TT_MOVE_PREVIOUS_PAGE, DT_TT_MOVE_RIGHT, DT_TT_MOVE_START, DT_TT_MOVE_UP, FALSE, darktable_t::gui, dt_thumbtable_cache_t::imgid, dt_thumbtable_t::lock, dt_thumbtable_t::lut, dt_ui_t::main_window, dt_thumbtable_t::mode, darktable_t::selection, darktable_t::signals, TRUE, and dt_gui_gtk_t::ui.
Referenced by dt_thumbtable_new().
gboolean dt_thumbtable_key_released_grid | ( | GtkWidget * | self, |
GdkEventKey * | event, | ||
gpointer | user_data | ||
) |
References _alternative_mode(), darktable, FALSE, darktable_t::gui, dt_ui_t::main_window, and dt_gui_gtk_t::ui.
Referenced by dt_thumbtable_new().
dt_thumbtable_t * dt_thumbtable_new | ( | dt_thumbtable_mode_t | mode | ) |
Create a new thumbnail table widget.
mode | The display mode (filemanager or filmstrip) |
Creates and initializes a new thumbnail table widget with drag-and-drop support, keyboard navigation, and configurable overlays. The widget automatically handles thumbnail loading/unloading as the view scrolls.
References _draw_callback(), _dt_collection_changed_callback(), _dt_image_info_changed_callback(), _dt_profile_change_callback(), _dt_selection_changed_callback(), _event_dnd_begin(), _event_dnd_end(), _event_dnd_get(), _event_main_leave(), _mouse_over_image_callback(), _thumbs_update_overlays_mode(), dt_gui_gtk_t::accels, dt_thumbtable_t::alternate_mode, dt_thumbtable_t::collapse_groups, dt_thumbtable_t::collection_count, dt_thumbtable_t::collection_hash, dt_thumbtable_t::collection_inited, dt_thumbtable_t::configured, darktable, dt_thumbtable_t::draw_group_borders, dt_accels_build_path(), dt_accels_new_virtual_shortcut(), dt_conf_get_bool(), DT_DEBUG_CONTROL_SIGNAL_CONNECT, dt_get_help_url(), dt_gui_add_class(), dt_gui_add_help_link(), dt_pthread_mutex_init(), DT_SIGNAL_COLLECTION_CHANGED, DT_SIGNAL_CONTROL_PROFILE_USER_CHANGED, DT_SIGNAL_IMAGE_INFO_CHANGED, DT_SIGNAL_MOUSE_OVER_IMAGE_CHANGE, DT_SIGNAL_SELECTION_CHANGED, dt_thumbtable_event_dnd_received(), dt_thumbtable_key_pressed_grid(), dt_thumbtable_key_released_grid(), dt_thumbtable_set_parent(), dummy, FALSE, dt_thumbtable_t::grid, dt_thumbtable_t::grid_cols, darktable_t::gui, dt_thumbtable_t::h_scrollbar, dt_accels_t::lighttable_accels, dt_thumbtable_t::list, dt_thumbtable_t::lock, dt_thumbtable_t::lut, dt_thumbtable_t::max_row_id, dt_thumbtable_t::min_row_id, n_targets_all, dt_thumbtable_t::reset_collection, dt_thumbtable_t::rowid, dt_thumbtable_t::scroll_window, darktable_t::signals, target_list_all, dt_thumbtable_t::thumb_nb, dt_thumbtable_t::thumbs_inited, TRUE, dt_thumbtable_t::v_scrollbar, dt_thumbtable_t::x_position, and dt_thumbtable_t::y_position.
Referenced by _ui_init_panel_bottom(), and dt_ui_init_main_table().
void dt_thumbtable_offset_zoom | ( | dt_thumbtable_t * | table, |
const double | delta_x, | ||
const double | delta_y | ||
) |
References dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_thumbtable_t::list, dt_thumbtable_t::lock, dt_thumbnail_t::w_image, dt_thumbnail_t::zoomx, and dt_thumbnail_t::zoomy.
Referenced by _event_image_motion().
void dt_thumbtable_refresh_thumbnail_real | ( | dt_thumbtable_t * | table, |
int32_t | imgid, | ||
gboolean | reinit | ||
) |
void dt_thumbtable_reset_collection | ( | dt_thumbtable_t * | table | ) |
References dt_thumbtable_t::reset_collection, and TRUE.
Referenced by _culling_mode().
int dt_thumbtable_scroll_to_active_rowid | ( | dt_thumbtable_t * | table | ) |
Scroll to show the active row.
table | The thumbnail table |
References dt_thumbtable_scroll_to_rowid(), dt_thumbtable_scroll_to_selection(), dt_thumbtable_t::rowid, and UNKNOWN_IMAGE.
Referenced by _set_columns(), and configure().
int dt_thumbtable_scroll_to_imgid | ( | dt_thumbtable_t * | table, |
int32_t | imgid | ||
) |
Scroll the view to show a specific image.
table | The thumbnail table |
imgid | The image ID to scroll to |
References _find_rowid_from_imgid(), dt_thumbtable_t::collection_inited, dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_thumbtable_scroll_to_rowid(), dt_thumbtable_t::lock, dt_thumbtable_t::rowid, and UNKNOWN_IMAGE.
Referenced by _move_in_grid(), and dt_thumbtable_scroll_to_selection().
|
static |
References dt_thumbtable_t::h_scrollbar, and dt_thumbtable_t::v_scrollbar.
Referenced by dt_thumbtable_dispatch_over(), and dt_thumbtable_scroll_to_rowid().
|
static |
int dt_thumbtable_scroll_to_selection | ( | dt_thumbtable_t * | table | ) |
Scroll to show selected content.
table | The thumbnail table |
Scrolls to the first-selected image. If none selected, tries keyboard "over", then mouse "over", then last active image, in this order.
References darktable, dt_control_get_keyboard_over_id(), dt_control_get_mouse_over_id(), dt_selection_get_first_id(), dt_thumbtable_scroll_to_imgid(), and darktable_t::selection.
Referenced by _grab_focus(), dt_thumbtable_scroll_to_active_rowid(), and scroll_to_selection_callback().
void dt_thumbtable_select_all | ( | dt_thumbtable_t * | table | ) |
Select all images in the current grid.
table | The thumbnail table |
Selects all images currently displayed in the thumbnail table through the GUI.
References dt_thumbtable_t::collapse_groups, dt_thumbtable_t::collection_count, dt_thumbtable_t::collection_inited, darktable, dt_control_log(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_selection_select_list(), dt_thumbtable_cache_t::imgid, dt_thumbtable_t::lock, dt_thumbtable_t::lut, and darktable_t::selection.
Referenced by dt_thumbtable_invert_selection(), and select_all_callback().
void dt_thumbtable_select_range | ( | dt_thumbtable_t * | table, |
const int | rowid | ||
) |
Select a range of images in the collection.
table | The thumbnail table |
rowid | Target row index to extend selection to |
Selects all images between the closest current selection bound and the specified rowid. Used for shift-click selection behavior.
References _find_rowid_from_imgid(), dt_thumbtable_t::collapse_groups, dt_thumbtable_t::collection_count, dt_thumbtable_t::collection_inited, darktable, dt_control_log(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), dt_selection_get_list(), dt_selection_select_list(), dt_thumbtable_cache_t::imgid, dt_thumbtable_t::lock, dt_thumbtable_t::lut, and darktable_t::selection.
Referenced by _event_main_release(), and dt_thumbtable_key_pressed_grid().
void dt_thumbtable_set_active_rowid | ( | dt_thumbtable_t * | table | ) |
Update internal active row tracking.
table | The thumbnail table |
Updates the internal first visible thumbnail index based on current scroll position.
References _position_to_rowid(), dt_thumbtable_get_scroll_position(), and dt_thumbtable_t::rowid.
Referenced by _dt_collection_changed_callback(), _set_columns(), configure(), and dt_thumbtable_set_zoom().
void dt_thumbtable_set_draw_group_borders | ( | dt_thumbtable_t * | table, |
gboolean | enable | ||
) |
References _resize_thumbnails(), dt_thumbtable_t::draw_group_borders, dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), and dt_thumbtable_t::lock.
Referenced by group_borders_callback().
void dt_thumbtable_set_focus_peaking | ( | dt_thumbtable_t * | table, |
gboolean | enable | ||
) |
References dt_thumbtable_refresh_thumbnail, dt_thumbtable_t::focus_peaking, TRUE, and UNKNOWN_IMAGE.
Referenced by focus_peaking_callback().
void dt_thumbtable_set_focus_regions | ( | dt_thumbtable_t * | table, |
gboolean | enable | ||
) |
References dt_thumbtable_refresh_thumbnail, dt_thumbtable_t::focus_regions, TRUE, and UNKNOWN_IMAGE.
Referenced by _focus_toggle_callback().
void dt_thumbtable_set_overlays_mode | ( | dt_thumbtable_t * | table, |
dt_thumbnail_overlay_t | over | ||
) |
Set the overlay display mode for thumbnails.
table | The thumbnail table |
over | New overlay mode to use |
Changes how overlays (text, icons etc) are displayed on thumbnails. Updates all visible thumbnails immediately.
References _resize_thumbnails(), _thumbs_get_overlays_class(), dt_conf_set_int(), dt_gui_add_class(), dt_gui_remove_class(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), FALSE, dt_thumbtable_t::grid, dt_thumbtable_t::lock, dt_thumbtable_t::overlays, sanitize_overlays(), and dt_thumbtable_t::thumbs_inited.
Referenced by _thumbs_update_overlays_mode(), always_hide_overlays_callback(), always_show_overlays_callback(), and hover_overlays_callback().
void dt_thumbtable_set_parent | ( | dt_thumbtable_t * | table, |
dt_thumbtable_mode_t | mode | ||
) |
void dt_thumbtable_set_zoom | ( | dt_thumbtable_t * | table, |
dt_thumbtable_zoom_t | level | ||
) |
References _grab_focus(), dt_thumbtable_refresh_thumbnail, dt_thumbtable_set_active_rowid(), TRUE, UNKNOWN_IMAGE, and dt_thumbtable_t::zoom.
Referenced by _dt_collection_changed_callback(), and _zoom_combobox_changed().
void dt_thumbtable_update | ( | dt_thumbtable_t * | table | ) |
References _dt_thumbtable_empty_list(), _garbage_collection(), _populate_thumbnails(), _resize_thumbnails(), _update_row_ids(), dt_thumbtable_t::collection_count, dt_thumbtable_t::collection_inited, dt_thumbtable_t::configured, DT_DEBUG_LIGHTTABLE, dt_get_wtime(), dt_print(), dt_pthread_mutex_lock(), dt_pthread_mutex_unlock(), FALSE, dt_thumbtable_t::list, dt_thumbtable_t::lock, dt_thumbtable_t::lut, dt_thumbtable_t::max_row_id, dt_thumbtable_t::min_row_id, dt_thumbtable_t::reset_collection, dt_thumbtable_t::scroll_window, dt_thumbtable_t::thumb_nb, dt_thumbtable_t::thumbs_inited, and TRUE.
Referenced by _draw_callback(), _dt_collection_changed_callback(), and _move_in_grid().
void dt_thumbtable_update_parent | ( | dt_thumbtable_t * | table | ) |
References _grab_focus().
Referenced by enter().
|
static |
Referenced by dt_thumbtable_dispatch_over().