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 "gui/dtgtk/thumbnail.h"
47#include "common/debug.h"
48#include "common/logging.h"
49
50#include <gtk/gtk.h>
51#include <gdk/gdk.h>
52#include <stdint.h>
53
54#ifndef DT_GUI_DTGTK_THUMBTABLE_H
55#define DT_GUI_DTGTK_THUMBTABLE_H
56
57
68
69
70
82
83
94
95
96// Per-mode layout strategy; defined privately in dtgtk/thumbtable_internal.h and set once in
97// dt_thumbtable_new(). Stored here as an opaque pointer so external callers keep an intact struct
98// without seeing the vtable internals.
100
101typedef struct dt_thumbtable_t
102{
104
105 // Layout strategy selected from `mode` at construction (grid vs. filmstrip frontend).
107
109
110 GtkWidget *grid; // GtkGrid
111
112 // Store the current number of columns in grid
114
115 // Hash table of thumbnails loaded inside main widget (dt_thumbnail_t), keyed by imgid
116 // for filmstrip and filemanager, this is all the images drawn at screen (even partially)
117 // for zoommable, this is all the images in the row drawn at screen. We don't load laterals images on fly.
118 GHashTable *list;
119
120 int thumbs_per_row; // number of image in a row (1 for filmstrip ; MAX_ZOOM for zoomable)
121 int thumb_width; // demanded thumb size (real size can differ of 1 due to rounding)
123 int view_width, view_height; // last main widget size
124
125 gboolean dragging;
126 int last_x, last_y; // last position of cursor during move
127 int drag_dx, drag_dy; // distance of move of the current dragging session
128 dt_thumbnail_t *drag_thumb; // thumb currently dragged (under the mouse)
129
130 // when performing a drag, we store the list of items to drag here
131 // as this can change during the drag and drop (esp. because of the image_over_id)
132 GList *drag_list;
133
134 // nb of thumbnails loaded
135 uint32_t thumb_nb;
136
137 // Set to TRUE once the current collection has been loaded into thumbnails,
138 // reset to FALSE on collection changed events.
139 // When TRUE, we bypass (re)-init of the thumbnails.
142 gboolean configured;
143
144 // Checksum of the collection query for caching
147
150
151 // Our LUT of collection, mapping rowid (index) to imgid (content)
153
155
156 // References to the scrollbar adjustments belonging to the parent widget
157 GtkAdjustment *v_scrollbar;
158 GtkAdjustment *h_scrollbar;
161
162 // Overlay in which we insert the grid, in central view and filmstrip
164
165 // Since GUI and background signals can init/delete/populate/iterate over the same stuff,
166 // ensure iterations don't happen on stuff being deleted at the same time.
167 // Protect only the loops of dynamic size
168 dt_pthread_mutex_t lock;
169
170 // signal that the current collection needs to be entirely flushed unconditionnaly
172
173 // show extended overlays while holding alt key
175
176 // The rowid (aka index in thumbnail sequence) of the last active thumbnail
177 // used as a fallback for missing imgid to sync scrolling when an image is evicted
178 // from current collection
179 int rowid;
180
181 // Set to TRUE to only display the group leader image
183
184 // Thumbnails inner zoom level
186
187 // Show focus regions on thumbnails
190
192
193 // Coalesce layout/scroll updates outside of draw handlers.
196
197 // Last parent overlay allocation (used to ignore no-op size-allocate signals).
200
201 // Last known scrollbar allocation (used to ignore no-op size-allocate signals).
204
206
207
225
241
256void dt_thumbtable_event_dnd_received(GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint target_type, guint time, gpointer user_data);
257
267
268// set zoom level
271
272// offset all the zoomed thumbnails by the same amount
273void dt_thumbtable_offset_zoom(dt_thumbtable_t *table, const double delta_x, const double delta_y);
274
277
280
283
284// signal that the current collection needs to be flushed entirely before being reloaded
286
287gboolean dt_thumbtable_key_released_grid(GtkWidget *self, GdkEventKey *event, gpointer user_data);
288gboolean dt_thumbtable_key_pressed_grid(GtkWidget *self, GdkEventKey *event, gpointer user_data);
289
290// call this when the history of an image is changed and mipmap cache needs updating.
291// reinit = TRUE will force-flush the existing thumbnail. imgid = -1 applies on all thumbnails in thumbtable.
292void dt_thumbtable_refresh_thumbnail_real(dt_thumbtable_t *table, int32_t imgid, gboolean reinit);
298#define dt_thumbtable_refresh_thumbnail(table, imgid, reinit) DT_DEBUG_TRACE_WRAPPER(DT_DEBUG_LIGHTTABLE, dt_thumbtable_refresh_thumbnail_real, (table), (imgid), (reinit))
299
300// Copy cached thumbnail metadata by image id. Returns TRUE on success.
301gboolean dt_thumbtable_get_thumbnail_info(dt_thumbtable_t *table, int32_t imgid, dt_image_t *out);
302
310
319void dt_thumbtable_select_range(dt_thumbtable_t *table, const int rowid);
320
328
338void dt_thumbtable_dispatch_over(dt_thumbtable_t *table, GdkEventType type, int32_t imgid);
339
346int dt_thumbtable_scroll_to_imgid(dt_thumbtable_t *table, int32_t imgid);
347
354
364
372
373// Scroll to the first-selected image, or default to keyboard "over" then mouse "over", then last active image,
374// in this order.
376
382{
384 gtk_widget_queue_draw(table->grid);
385}
386
387#define dt_thumbtable_redraw(table) DT_DEBUG_TRACE_WRAPPER(DT_DEBUG_LIGHTTABLE, dt_thumbtable_redraw_real, (table))
388
395static inline void dt_thumbtable_show(dt_thumbtable_t *table)
396{
397 gtk_widget_show(table->parent_overlay);
398 gtk_widget_show(table->scroll_window);
399 gtk_widget_show(table->grid);
400
401 // Thumbtable is prevented to configure and update, for
402 // as long as it's hidden. We need to force the update now.
404}
405
410static inline void dt_thumbtable_hide(dt_thumbtable_t *table)
411{
412 gtk_widget_hide(table->parent_overlay);
413 gtk_widget_hide(table->scroll_window);
414 gtk_widget_hide(table->grid);
415}
416
417#endif // DT_GUI_DTGTK_THUMBTABLE_H
418
419// clang-format off
420// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
421// vim: shiftwidth=2 expandtab tabstop=2 cindent
422// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
423// clang-format on
static const float x
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
Definition colorspaces.h:98
const dt_colormatrix_t dt_aligned_pixel_t out
Call tracing for functions you do not want to edit every caller of.
static gboolean enable(const dt_image_t *image)
Definition highlights.c:879
_lib_location_type_t type
Definition location.c:1
unsigned __int64 uint64_t
Definition strptime.c:75
Cache entry for a single thumbnail.
Definition thumbtable.h:89
dt_thumbnail_t * thumb
Definition thumbtable.h:90
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:106
GHashTable * list
Definition thumbtable.h:118
gboolean focus_peaking
Definition thumbtable.h:189
gboolean collapse_groups
Definition thumbtable.h:182
GtkWidget * grid
Definition thumbtable.h:110
gboolean alternate_mode
Definition thumbtable.h:174
gboolean collection_inited
Definition thumbtable.h:140
dt_thumbtable_mode_t mode
Definition thumbtable.h:103
dt_pthread_mutex_t lock
Definition thumbtable.h:168
gboolean dragging
Definition thumbtable.h:125
int last_h_scrollbar_height
Definition thumbtable.h:202
GtkAdjustment * v_scrollbar
Definition thumbtable.h:157
dt_thumbtable_zoom_t zoom
Definition thumbtable.h:185
int last_v_scrollbar_width
Definition thumbtable.h:203
gboolean focus_regions
Definition thumbtable.h:188
GList * drag_list
Definition thumbtable.h:132
gboolean configured
Definition thumbtable.h:142
GtkWidget * scroll_window
Definition thumbtable.h:154
dt_thumbtable_cache_t * lut
Definition thumbtable.h:152
dt_thumbnail_t * drag_thumb
Definition thumbtable.h:128
gboolean thumbs_inited
Definition thumbtable.h:141
GtkAdjustment * h_scrollbar
Definition thumbtable.h:158
uint32_t thumb_nb
Definition thumbtable.h:135
dt_thumbnail_overlay_t overlays
Definition thumbtable.h:108
gboolean reset_collection
Definition thumbtable.h:171
GtkWidget * parent_overlay
Definition thumbtable.h:163
uint64_t collection_hash
Definition thumbtable.h:145
gboolean draw_group_borders
Definition thumbtable.h:191
dt_thumbnail_overlay_t
Definition thumbnail.h:59
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:457
int dt_thumbtable_scroll_to_imgid(dt_thumbtable_t *table, int32_t imgid)
Scroll the view to show a specific image.
Definition thumbtable.c:424
gboolean dt_thumbtable_get_focus_peaking(dt_thumbtable_t *table)
Definition thumbtable.c:914
void dt_thumbtable_update(dt_thumbtable_t *table)
Definition thumbtable.c:789
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:381
dt_thumbtable_mode_t
Display modes for the thumbnail table.
Definition thumbtable.h:63
@ DT_THUMBTABLE_MODE_NONE
Definition thumbtable.h:64
@ DT_THUMBTABLE_MODE_FILMSTRIP
Definition thumbtable.h:66
@ DT_THUMBTABLE_MODE_FILEMANAGER
Definition thumbtable.h:65
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:556
void dt_thumbtable_cleanup(dt_thumbtable_t *table)
static void dt_thumbtable_redraw_real(dt_thumbtable_t *table)
Definition thumbtable.h:381
gboolean dt_thumbtable_get_focus_regions(dt_thumbtable_t *table)
Definition thumbtable.c:903
void dt_thumbtable_set_focus_peaking(dt_thumbtable_t *table, gboolean enable)
Definition thumbtable.c:908
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:76
@ DT_THUMBTABLE_ZOOM_TWICE
Definition thumbtable.h:80
@ DT_THUMBTABLE_ZOOM_FULL
Definition thumbtable.h:79
@ DT_THUMBTABLE_ZOOM_HALF
Definition thumbtable.h:78
@ DT_THUMBTABLE_ZOOM_FIT
Definition thumbtable.h:77
gboolean dt_thumbtable_get_thumbnail_info(dt_thumbtable_t *table, int32_t imgid, dt_image_t *out)
Definition thumbtable.c:606
static void dt_thumbtable_show(dt_thumbtable_t *table)
Show the thumbnail table widget.
Definition thumbtable.h:395
void dt_thumbtable_stop(dt_thumbtable_t *table)
void dt_thumbtable_set_focus_regions(dt_thumbtable_t *table, gboolean enable)
Definition thumbtable.c:897
int dt_thumbtable_scroll_to_active_rowid(dt_thumbtable_t *table)
Scroll to show the active row.
Definition thumbtable.c:447
gboolean dt_thumbtable_get_draw_group_borders(dt_thumbtable_t *table)
Definition thumbtable.c:927
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:935
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:230
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:919
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:410
void dt_thumbtable_update_parent(dt_thumbtable_t *table)