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
95// Per-mode layout strategy; defined privately in dtgtk/thumbtable_internal.h and set once in
96// dt_thumbtable_new(). Stored here as an opaque pointer so external callers keep an intact struct
97// without seeing the vtable internals.
99
100typedef struct dt_thumbtable_t
101{
103
104 // Layout strategy selected from `mode` at construction (grid vs. filmstrip frontend).
106
108
109 GtkWidget *grid; // GtkGrid
110
111 // Store the current number of columns in grid
113
114 // Hash table of thumbnails loaded inside main widget (dt_thumbnail_t), keyed by imgid
115 // for filmstrip and filemanager, this is all the images drawn at screen (even partially)
116 // for zoommable, this is all the images in the row drawn at screen. We don't load laterals images on fly.
117 GHashTable *list;
118
119 int thumbs_per_row; // number of image in a row (1 for filmstrip ; MAX_ZOOM for zoomable)
120 int thumb_width; // demanded thumb size (real size can differ of 1 due to rounding)
122 int view_width, view_height; // last main widget size
123
124 gboolean dragging;
125 int last_x, last_y; // last position of cursor during move
126 int drag_dx, drag_dy; // distance of move of the current dragging session
127 dt_thumbnail_t *drag_thumb; // thumb currently dragged (under the mouse)
128
129 // when performing a drag, we store the list of items to drag here
130 // as this can change during the drag and drop (esp. because of the image_over_id)
131 GList *drag_list;
132
133 // nb of thumbnails loaded
134 uint32_t thumb_nb;
135
136 // Set to TRUE once the current collection has been loaded into thumbnails,
137 // reset to FALSE on collection changed events.
138 // When TRUE, we bypass (re)-init of the thumbnails.
141 gboolean configured;
142
143 // Checksum of the collection query for caching
146
149
150 // Our LUT of collection, mapping rowid (index) to imgid (content)
152
154
155 // References to the scrollbar adjustments belonging to the parent widget
156 GtkAdjustment *v_scrollbar;
157 GtkAdjustment *h_scrollbar;
160
161 // Overlay in which we insert the grid, in central view and filmstrip
163
164 // Since GUI and background signals can init/delete/populate/iterate over the same stuff,
165 // ensure iterations don't happen on stuff being deleted at the same time.
166 // Protect only the loops of dynamic size
167 dt_pthread_mutex_t lock;
168
169 // signal that the current collection needs to be entirely flushed unconditionnaly
171
172 // show extended overlays while holding alt key
174
175 // The rowid (aka index in thumbnail sequence) of the last active thumbnail
176 // used as a fallback for missing imgid to sync scrolling when an image is evicted
177 // from current collection
178 int rowid;
179
180 // Set to TRUE to only display the group leader image
182
183 // Thumbnails inner zoom level
185
186 // Show focus regions on thumbnails
189
191
192 // Coalesce layout/scroll updates outside of draw handlers.
195
196 // Last parent overlay allocation (used to ignore no-op size-allocate signals).
199
200 // Last known scrollbar allocation (used to ignore no-op size-allocate signals).
203
205
206
224
240
255void dt_thumbtable_event_dnd_received(GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint target_type, guint time, gpointer user_data);
256
266
267// set zoom level
270
271// offset all the zoomed thumbnails by the same amount
272void dt_thumbtable_offset_zoom(dt_thumbtable_t *table, const double delta_x, const double delta_y);
273
276
279
282
283// signal that the current collection needs to be flushed entirely before being reloaded
285
286gboolean dt_thumbtable_key_released_grid(GtkWidget *self, GdkEventKey *event, gpointer user_data);
287gboolean dt_thumbtable_key_pressed_grid(GtkWidget *self, GdkEventKey *event, gpointer user_data);
288
289// call this when the history of an image is changed and mipmap cache needs updating.
290// reinit = TRUE will force-flush the existing thumbnail. imgid = -1 applies on all thumbnails in thumbtable.
291void dt_thumbtable_refresh_thumbnail_real(dt_thumbtable_t *table, int32_t imgid, gboolean reinit);
292#define dt_thumbtable_refresh_thumbnail(table, imgid, reinit) DT_DEBUG_TRACE_WRAPPER(DT_DEBUG_LIGHTTABLE, dt_thumbtable_refresh_thumbnail_real, (table), (imgid), (reinit))
293
294// Copy cached thumbnail metadata by image id. Returns TRUE on success.
295gboolean dt_thumbtable_get_thumbnail_info(dt_thumbtable_t *table, int32_t imgid, dt_image_t *out);
296
304
313void dt_thumbtable_select_range(dt_thumbtable_t *table, const int rowid);
314
322
332void dt_thumbtable_dispatch_over(dt_thumbtable_t *table, GdkEventType type, int32_t imgid);
333
340int dt_thumbtable_scroll_to_imgid(dt_thumbtable_t *table, int32_t imgid);
341
348
358
366
367// Scroll to the first-selected image, or default to keyboard "over" then mouse "over", then last active image,
368// in this order.
370
376{
378 gtk_widget_queue_draw(table->grid);
379}
380
381#define dt_thumbtable_redraw(table) DT_DEBUG_TRACE_WRAPPER(DT_DEBUG_LIGHTTABLE, dt_thumbtable_redraw_real, (table))
382
389static inline void dt_thumbtable_show(dt_thumbtable_t *table)
390{
391 gtk_widget_show(table->parent_overlay);
392 gtk_widget_show(table->scroll_window);
393 gtk_widget_show(table->grid);
394
395 // Thumbtable is prevented to configure and update, for
396 // as long as it's hidden. We need to force the update now.
398}
399
404static inline void dt_thumbtable_hide(dt_thumbtable_t *table)
405{
406 gtk_widget_hide(table->parent_overlay);
407 gtk_widget_hide(table->scroll_window);
408 gtk_widget_hide(table->grid);
409}
410
411// clang-format off
412// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
413// vim: shiftwidth=2 expandtab tabstop=2 cindent
414// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
415// clang-format on
const dt_colormatrix_t dt_aligned_pixel_t out
int type
static gboolean enable(dt_image_t *image)
Definition highlights.c:653
static const float x
struct _GtkWidget GtkWidget
Definition splash.h:29
unsigned __int64 uint64_t
Definition strptime.c:75
Cache entry for a single thumbnail.
Definition thumbtable.h:88
dt_thumbnail_t * thumb
Definition thumbtable.h:89
Per-mode layout strategy. One instance per frontend, shared (const) by all tables of that mode and st...
const dt_thumbtable_layout_ops_t * ops
Definition thumbtable.h:105
GHashTable * list
Definition thumbtable.h:117
gboolean focus_peaking
Definition thumbtable.h:188
gboolean collapse_groups
Definition thumbtable.h:181
GtkWidget * grid
Definition thumbtable.h:109
gboolean alternate_mode
Definition thumbtable.h:173
gboolean collection_inited
Definition thumbtable.h:139
dt_thumbtable_mode_t mode
Definition thumbtable.h:102
dt_pthread_mutex_t lock
Definition thumbtable.h:167
gboolean dragging
Definition thumbtable.h:124
int last_h_scrollbar_height
Definition thumbtable.h:201
GtkAdjustment * v_scrollbar
Definition thumbtable.h:156
dt_thumbtable_zoom_t zoom
Definition thumbtable.h:184
int last_v_scrollbar_width
Definition thumbtable.h:202
gboolean focus_regions
Definition thumbtable.h:187
GList * drag_list
Definition thumbtable.h:131
gboolean configured
Definition thumbtable.h:141
GtkWidget * scroll_window
Definition thumbtable.h:153
dt_thumbtable_cache_t * lut
Definition thumbtable.h:151
dt_thumbnail_t * drag_thumb
Definition thumbtable.h:127
gboolean thumbs_inited
Definition thumbtable.h:140
GtkAdjustment * h_scrollbar
Definition thumbtable.h:157
uint32_t thumb_nb
Definition thumbtable.h:134
dt_thumbnail_overlay_t overlays
Definition thumbtable.h:107
gboolean reset_collection
Definition thumbtable.h:170
GtkWidget * parent_overlay
Definition thumbtable.h:162
uint64_t collection_hash
Definition thumbtable.h:144
gboolean draw_group_borders
Definition thumbtable.h:190
dt_thumbnail_overlay_t
Definition thumbnail.h:58
void dt_thumbtable_set_zoom(dt_thumbtable_t *table, dt_thumbtable_zoom_t level)
int dt_thumbtable_scroll_to_selection(dt_thumbtable_t *table)
Scroll to show selected content.
Definition thumbtable.c:444
int dt_thumbtable_scroll_to_imgid(dt_thumbtable_t *table, int32_t imgid)
Scroll the view to show a specific image.
Definition thumbtable.c:411
gboolean dt_thumbtable_get_focus_peaking(dt_thumbtable_t *table)
Definition thumbtable.c:901
void dt_thumbtable_update(dt_thumbtable_t *table)
Definition thumbtable.c:776
void dt_thumbtable_offset_zoom(dt_thumbtable_t *table, const double delta_x, const double delta_y)
void dt_thumbtable_set_active_rowid(dt_thumbtable_t *table)
Update internal active row tracking.
Definition thumbtable.c:368
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_apply_grid_configuration(dt_thumbtable_t *table)
Apply grid configuration changes with proper event synchronization.
void dt_thumbtable_configure(dt_thumbtable_t *table)
Definition thumbtable.c:543
void dt_thumbtable_cleanup(dt_thumbtable_t *table)
static void dt_thumbtable_redraw_real(dt_thumbtable_t *table)
Definition thumbtable.h:375
gboolean dt_thumbtable_get_focus_regions(dt_thumbtable_t *table)
Definition thumbtable.c:890
void dt_thumbtable_set_focus_peaking(dt_thumbtable_t *table, gboolean enable)
Definition thumbtable.c:895
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.
void dt_thumbtable_invert_selection(dt_thumbtable_t *table)
Invert the current selection.
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:593
static void dt_thumbtable_show(dt_thumbtable_t *table)
Show the thumbnail table widget.
Definition thumbtable.h:389
void dt_thumbtable_stop(dt_thumbtable_t *table)
void dt_thumbtable_set_focus_regions(dt_thumbtable_t *table, gboolean enable)
Definition thumbtable.c:884
int dt_thumbtable_scroll_to_active_rowid(dt_thumbtable_t *table)
Scroll to show the active row.
Definition thumbtable.c:434
gboolean dt_thumbtable_get_draw_group_borders(dt_thumbtable_t *table)
Definition thumbtable.c:914
void dt_thumbtable_dispatch_over(dt_thumbtable_t *table, GdkEventType type, int32_t imgid)
Update the mouse-over image ID with conflict resolution.
gboolean dt_thumbtable_key_pressed_grid(GtkWidget *self, GdkEventKey *event, gpointer user_data)
void dt_thumbtable_set_overlays_mode(dt_thumbtable_t *table, dt_thumbnail_overlay_t over)
Set the overlay display mode for thumbnails.
void dt_thumbtable_refresh_thumbnail_real(dt_thumbtable_t *table, int32_t imgid, gboolean reinit)
Definition thumbtable.c:922
void dt_thumbtable_select_all(dt_thumbtable_t *table)
Select all images in the current grid.
void dt_thumbtable_reset_collection(dt_thumbtable_t *table)
gboolean dt_thumbtable_key_released_grid(GtkWidget *self, GdkEventKey *event, gpointer user_data)
dt_thumbtable_zoom_t dt_thumbtable_get_zoom(dt_thumbtable_t *table)
void dt_thumbtable_set_parent(dt_thumbtable_t *table, dt_thumbtable_mode_t mode)
void dt_thumbtable_queue_update(dt_thumbtable_t *table)
Definition thumbtable.c:217
dt_thumbtable_t * dt_thumbtable_new(dt_thumbtable_mode_t mode)
Create a new thumbnail table widget.
void dt_thumbtable_set_draw_group_borders(dt_thumbtable_t *table, gboolean enable)
Definition thumbtable.c:906
void dt_thumbtable_select_range(dt_thumbtable_t *table, const int rowid)
Select a range of images in the collection.
static void dt_thumbtable_hide(dt_thumbtable_t *table)
Hide the thumbnail table widget.
Definition thumbtable.h:404
void dt_thumbtable_update_parent(dt_thumbtable_t *table)