Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
thumbtable.h
Go to the documentation of this file.
1/*
2 This file is part of darktable,
3 Copyright (C) 2009-2011 johannes hanika.
4 Copyright (C) 2012 Christian Tellefsen.
5 Copyright (C) 2012 Richard Wonka.
6 Copyright (C) 2013-2014, 2016 Tobias Ellinghaus.
7 Copyright (C) 2016 Roman Lebedev.
8 Copyright (C) 2020-2021 Aldric Renaudin.
9 Copyright (C) 2020 Bill Ferguson.
10 Copyright (C) 2020, 2022 Philippe Weyland.
11 Copyright (C) 2021-2022 Diederik Ter Rahe.
12 Copyright (C) 2021 domosbg.
13 Copyright (C) 2021 Erkan Ozgur Yilmaz.
14 Copyright (C) 2021 luzpaz.
15 Copyright (C) 2021 Pascal Obry.
16 Copyright (C) 2022-2023, 2025-2026 Aurélien PIERRE.
17 Copyright (C) 2022 Martin Bařinka.
18
19 darktable is free software: you can redistribute it and/or modify
20 it under the terms of the GNU General Public License as published by
21 the Free Software Foundation, either version 3 of the License, or
22 (at your option) any later version.
23
24 darktable is distributed in the hope that it will be useful,
25 but WITHOUT ANY WARRANTY; without even the implied warranty of
26 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 GNU General Public License for more details.
28
29 You should have received a copy of the GNU General Public License
30 along with darktable. If not, see <http://www.gnu.org/licenses/>.
31*/
46#include "dtgtk/thumbnail.h"
47#include "common/dtpthread.h"
48#include "common/darktable.h"
49#include "common/debug.h"
50
51#include <gtk/gtk.h>
52#include <gdk/gdk.h>
53
54#pragma once
55
56
67
68
69
81
82
93
94
95typedef struct dt_thumbtable_t
96{
99
100 GtkWidget *grid; // GtkGrid
101
102 // Store the current number of columns in grid
104
105 // Hash table of thumbnails loaded inside main widget (dt_thumbnail_t), keyed by imgid
106 // for filmstrip and filemanager, this is all the images drawn at screen (even partially)
107 // for zoommable, this is all the images in the row drawn at screen. We don't load laterals images on fly.
108 GHashTable *list;
109
110 int thumbs_per_row; // number of image in a row (1 for filmstrip ; MAX_ZOOM for zoomable)
111 int thumb_width; // demanded thumb size (real size can differ of 1 due to rounding)
113 int view_width, view_height; // last main widget size
114
115 gboolean dragging;
116 int last_x, last_y; // last position of cursor during move
117 int drag_dx, drag_dy; // distance of move of the current dragging session
118 dt_thumbnail_t *drag_thumb; // thumb currently dragged (under the mouse)
119
120 // when performing a drag, we store the list of items to drag here
121 // as this can change during the drag and drop (esp. because of the image_over_id)
122 GList *drag_list;
123
124 // nb of thumbnails loaded
125 uint32_t thumb_nb;
126
127 // Set to TRUE once the current collection has been loaded into thumbnails,
128 // reset to FALSE on collection changed events.
129 // When TRUE, we bypass (re)-init of the thumbnails.
132 gboolean configured;
133
134 // Checksum of the collection query for caching
137
140
141 // Our LUT of collection, mapping rowid (index) to imgid (content)
143
145
146 // References to the scrollbar adjustments belonging to the parent widget
147 GtkAdjustment *v_scrollbar;
148 GtkAdjustment *h_scrollbar;
151
152 // Overlay in which we insert the grid, in central view and filmstrip
154
155 // Since GUI and background signals can init/delete/populate/iterate over the same stuff,
156 // ensure iterations don't happen on stuff being deleted at the same time.
157 // Protect only the loops of dynamic size
158 dt_pthread_mutex_t lock;
159
160 // signal that the current collection needs to be entirely flushed unconditionnaly
162
163 // show extended overlays while holding alt key
165
166 // The rowid (aka index in thumbnail sequence) of the last active thumbnail
167 // used as a fallback for missing imgid to sync scrolling when an image is evicted
168 // from current collection
169 int rowid;
170
171 // Set to TRUE to only display the group leader image
173
174 // Thumbnails inner zoom level
176
177 // Show focus regions on thumbnails
180
182
183 // Coalesce layout/scroll updates outside of draw handlers.
185
186 // Last parent overlay allocation (used to ignore no-op size-allocate signals).
189
190 // Last known scrollbar allocation (used to ignore no-op size-allocate signals).
193
195
196
213
228void dt_thumbtable_event_dnd_received(GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint target_type, guint time, gpointer user_data);
229
239
240// set zoom level
243
244// offset all the zoomed thumbnails by the same amount
245void dt_thumbtable_offset_zoom(dt_thumbtable_t *table, const double delta_x, const double delta_y);
246
249
252
255
256// signal that the current collection needs to be flushed entirely before being reloaded
258
259gboolean dt_thumbtable_key_released_grid(GtkWidget *self, GdkEventKey *event, gpointer user_data);
260gboolean dt_thumbtable_key_pressed_grid(GtkWidget *self, GdkEventKey *event, gpointer user_data);
261
262// call this when the history of an image is changed and mipmap cache needs updating.
263// reinit = TRUE will force-flush the existing thumbnail. imgid = -1 applies on all thumbnails in thumbtable.
264void dt_thumbtable_refresh_thumbnail_real(dt_thumbtable_t *table, int32_t imgid, gboolean reinit);
265#define dt_thumbtable_refresh_thumbnail(table, imgid, reinit) DT_DEBUG_TRACE_WRAPPER(DT_DEBUG_LIGHTTABLE, dt_thumbtable_refresh_thumbnail_real, (table), (imgid), (reinit))
266
267// Copy cached thumbnail metadata by image id. Returns TRUE on success.
268gboolean dt_thumbtable_get_thumbnail_info(dt_thumbtable_t *table, int32_t imgid, dt_image_t *out);
269
277
286void dt_thumbtable_select_range(dt_thumbtable_t *table, const int rowid);
287
295
305void dt_thumbtable_dispatch_over(dt_thumbtable_t *table, GdkEventType type, int32_t imgid);
306
313int dt_thumbtable_scroll_to_imgid(dt_thumbtable_t *table, int32_t imgid);
314
321
331
339
340// Scroll to the first-selected image, or default to keyboard "over" then mouse "over", then last active image,
341// in this order.
343
349{
351 gtk_widget_queue_draw(table->grid);
352}
353
354#define dt_thumbtable_redraw(table) DT_DEBUG_TRACE_WRAPPER(DT_DEBUG_LIGHTTABLE, dt_thumbtable_redraw_real, (table))
355
362static inline void dt_thumbtable_show(dt_thumbtable_t *table)
363{
364 gtk_widget_show(table->parent_overlay);
365 gtk_widget_show(table->scroll_window);
366 gtk_widget_show(table->grid);
367
368 // Thumbtable is prevented to configure and update, for
369 // as long as it's hidden. We need to force the update now.
371}
372
377static inline void dt_thumbtable_hide(dt_thumbtable_t *table)
378{
379 gtk_widget_hide(table->parent_overlay);
380 gtk_widget_hide(table->scroll_window);
381 gtk_widget_hide(table->grid);
382}
383
384// clang-format off
385// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
386// vim: shiftwidth=2 expandtab tabstop=2 cindent
387// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
388// clang-format on
static const dt_colormatrix_t dt_aligned_pixel_t out
Definition colorspaces_inline_conversions.h:184
int type
Definition common/metadata.c:62
static gboolean enable(dt_image_t *image)
Definition highlights.c:2785
static const float x
Definition iop_profile.h:239
struct _GtkWidget GtkWidget
Definition splash.h:29
unsigned __int64 uint64_t
Definition strptime.c:74
Definition common/image.h:247
Definition thumbnail.h:67
Cache entry for a single thumbnail.
Definition thumbtable.h:88
int32_t imgid
Definition thumbtable.h:90
int32_t groupid
Definition thumbtable.h:91
dt_thumbnail_t * thumb
Definition thumbtable.h:89
Definition thumbtable.h:96
GHashTable * list
Definition thumbtable.h:108
int last_x
Definition thumbtable.h:116
gboolean focus_peaking
Definition thumbtable.h:179
gboolean collapse_groups
Definition thumbtable.h:172
GtkWidget * grid
Definition thumbtable.h:100
gboolean alternate_mode
Definition thumbtable.h:164
int drag_dy
Definition thumbtable.h:117
int drag_dx
Definition thumbtable.h:117
int min_row_id
Definition thumbtable.h:138
int rowid
Definition thumbtable.h:169
int last_y
Definition thumbtable.h:116
gboolean collection_inited
Definition thumbtable.h:130
int view_height
Definition thumbtable.h:113
dt_thumbtable_mode_t mode
Definition thumbtable.h:97
dt_pthread_mutex_t lock
Definition thumbtable.h:158
gboolean dragging
Definition thumbtable.h:115
int last_h_scrollbar_height
Definition thumbtable.h:191
GtkAdjustment * v_scrollbar
Definition thumbtable.h:147
dt_thumbtable_zoom_t zoom
Definition thumbtable.h:175
int last_parent_width
Definition thumbtable.h:187
int last_v_scrollbar_width
Definition thumbtable.h:192
gboolean focus_regions
Definition thumbtable.h:178
GList * drag_list
Definition thumbtable.h:122
int collection_count
Definition thumbtable.h:136
guint idle_update_id
Definition thumbtable.h:184
int thumb_width
Definition thumbtable.h:111
double y_position
Definition thumbtable.h:150
gboolean configured
Definition thumbtable.h:132
GtkWidget * scroll_window
Definition thumbtable.h:144
int view_width
Definition thumbtable.h:113
dt_thumbtable_cache_t * lut
Definition thumbtable.h:142
dt_thumbnail_t * drag_thumb
Definition thumbtable.h:118
int max_row_id
Definition thumbtable.h:139
gboolean thumbs_inited
Definition thumbtable.h:131
int last_parent_height
Definition thumbtable.h:188
GtkAdjustment * h_scrollbar
Definition thumbtable.h:148
uint32_t thumb_nb
Definition thumbtable.h:125
double x_position
Definition thumbtable.h:149
int thumbs_per_row
Definition thumbtable.h:110
int grid_cols
Definition thumbtable.h:103
int thumb_height
Definition thumbtable.h:112
dt_thumbnail_overlay_t overlays
Definition thumbtable.h:98
gboolean reset_collection
Definition thumbtable.h:161
GtkWidget * parent_overlay
Definition thumbtable.h:153
uint64_t collection_hash
Definition thumbtable.h:135
gboolean draw_group_borders
Definition thumbtable.h:181
dt_thumbnail_overlay_t
Definition thumbnail.h:58
void dt_thumbtable_set_zoom(dt_thumbtable_t *table, dt_thumbtable_zoom_t level)
Definition thumbtable.c:1036
int dt_thumbtable_scroll_to_selection(dt_thumbtable_t *table)
Scroll to show selected content.
Definition thumbtable.c:478
int dt_thumbtable_scroll_to_imgid(dt_thumbtable_t *table, int32_t imgid)
Scroll the view to show a specific image.
Definition thumbtable.c:447
gboolean dt_thumbtable_get_focus_peaking(dt_thumbtable_t *table)
Definition thumbtable.c:1083
void dt_thumbtable_update(dt_thumbtable_t *table)
Definition thumbtable.c:957
void dt_thumbtable_offset_zoom(dt_thumbtable_t *table, const double delta_x, const double delta_y)
Definition thumbtable.c:1049
void dt_thumbtable_set_active_rowid(dt_thumbtable_t *table)
Update internal active row tracking.
Definition thumbtable.c:406
dt_thumbtable_mode_t
Display modes for the thumbnail table.
Definition thumbtable.h:62
@ DT_THUMBTABLE_MODE_NONE
Definition thumbtable.h:63
@ DT_THUMBTABLE_MODE_FILMSTRIP
Definition thumbtable.h:65
@ DT_THUMBTABLE_MODE_FILEMANAGER
Definition thumbtable.h:64
void dt_thumbtable_configure(dt_thumbtable_t *table)
Definition thumbtable.c:644
void dt_thumbtable_cleanup(dt_thumbtable_t *table)
Definition thumbtable.c:2079
static void dt_thumbtable_redraw_real(dt_thumbtable_t *table)
Definition thumbtable.h:348
gboolean dt_thumbtable_get_focus_regions(dt_thumbtable_t *table)
Definition thumbtable.c:1072
void dt_thumbtable_set_focus_peaking(dt_thumbtable_t *table, gboolean enable)
Definition thumbtable.c:1077
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.
Definition thumbtable.c:1548
void dt_thumbtable_invert_selection(dt_thumbtable_t *table)
Invert the current selection.
Definition thumbtable.c:2227
dt_thumbtable_zoom_t
Zoom levels for thumbnail display.
Definition thumbtable.h:75
@ DT_THUMBTABLE_ZOOM_TWICE
Definition thumbtable.h:79
@ DT_THUMBTABLE_ZOOM_FULL
Definition thumbtable.h:78
@ DT_THUMBTABLE_ZOOM_HALF
Definition thumbtable.h:77
@ DT_THUMBTABLE_ZOOM_FIT
Definition thumbtable.h:76
gboolean dt_thumbtable_get_thumbnail_info(dt_thumbtable_t *table, int32_t imgid, dt_image_t *out)
Definition thumbtable.c:741
static void dt_thumbtable_show(dt_thumbtable_t *table)
Show the thumbnail table widget.
Definition thumbtable.h:362
void dt_thumbtable_set_focus_regions(dt_thumbtable_t *table, gboolean enable)
Definition thumbtable.c:1066
int dt_thumbtable_scroll_to_active_rowid(dt_thumbtable_t *table)
Scroll to show the active row.
Definition thumbtable.c:468
gboolean dt_thumbtable_get_draw_group_borders(dt_thumbtable_t *table)
Definition thumbtable.c:1096
void dt_thumbtable_dispatch_over(dt_thumbtable_t *table, GdkEventType type, int32_t imgid)
Update the mouse-over image ID with conflict resolution.
Definition thumbtable.c:2244
gboolean dt_thumbtable_key_pressed_grid(GtkWidget *self, GdkEventKey *event, gpointer user_data)
Definition thumbtable.c:1683
void dt_thumbtable_set_overlays_mode(dt_thumbtable_t *table, dt_thumbnail_overlay_t over)
Set the overlay display mode for thumbnails.
Definition thumbtable.c:1363
void dt_thumbtable_refresh_thumbnail_real(dt_thumbtable_t *table, int32_t imgid, gboolean reinit)
Definition thumbtable.c:1104
void dt_thumbtable_select_all(dt_thumbtable_t *table)
Select all images in the current grid.
Definition thumbtable.c:2133
void dt_thumbtable_reset_collection(dt_thumbtable_t *table)
Definition thumbtable.c:1859
gboolean dt_thumbtable_key_released_grid(GtkWidget *self, GdkEventKey *event, gpointer user_data)
Definition thumbtable.c:1832
dt_thumbtable_zoom_t dt_thumbtable_get_zoom(dt_thumbtable_t *table)
Definition thumbtable.c:1044
void dt_thumbtable_set_parent(dt_thumbtable_t *table, dt_thumbtable_mode_t mode)
Definition thumbtable.c:2112
void dt_thumbtable_queue_update(dt_thumbtable_t *table)
Definition thumbtable.c:219
dt_thumbtable_t * dt_thumbtable_new(dt_thumbtable_mode_t mode)
Create a new thumbnail table widget.
Definition thumbtable.c:1872
void dt_thumbtable_set_draw_group_borders(dt_thumbtable_t *table, gboolean enable)
Definition thumbtable.c:1088
void dt_thumbtable_select_range(dt_thumbtable_t *table, const int rowid)
Select a range of images in the collection.
Definition thumbtable.c:2157
static void dt_thumbtable_hide(dt_thumbtable_t *table)
Hide the thumbnail table widget.
Definition thumbtable.h:377
void dt_thumbtable_update_parent(dt_thumbtable_t *table)
Definition thumbtable.c:2107