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.
186
187 // Last parent overlay allocation (used to ignore no-op size-allocate signals).
190
191 // Last known scrollbar allocation (used to ignore no-op size-allocate signals).
194
196
197
215
231
246void dt_thumbtable_event_dnd_received(GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint target_type, guint time, gpointer user_data);
247
257
258// set zoom level
261
262// offset all the zoomed thumbnails by the same amount
263void dt_thumbtable_offset_zoom(dt_thumbtable_t *table, const double delta_x, const double delta_y);
264
267
270
273
274// signal that the current collection needs to be flushed entirely before being reloaded
276
277gboolean dt_thumbtable_key_released_grid(GtkWidget *self, GdkEventKey *event, gpointer user_data);
278gboolean dt_thumbtable_key_pressed_grid(GtkWidget *self, GdkEventKey *event, gpointer user_data);
279
280// call this when the history of an image is changed and mipmap cache needs updating.
281// reinit = TRUE will force-flush the existing thumbnail. imgid = -1 applies on all thumbnails in thumbtable.
282void dt_thumbtable_refresh_thumbnail_real(dt_thumbtable_t *table, int32_t imgid, gboolean reinit);
283#define dt_thumbtable_refresh_thumbnail(table, imgid, reinit) DT_DEBUG_TRACE_WRAPPER(DT_DEBUG_LIGHTTABLE, dt_thumbtable_refresh_thumbnail_real, (table), (imgid), (reinit))
284
285// Copy cached thumbnail metadata by image id. Returns TRUE on success.
286gboolean dt_thumbtable_get_thumbnail_info(dt_thumbtable_t *table, int32_t imgid, dt_image_t *out);
287
295
304void dt_thumbtable_select_range(dt_thumbtable_t *table, const int rowid);
305
313
323void dt_thumbtable_dispatch_over(dt_thumbtable_t *table, GdkEventType type, int32_t imgid);
324
331int dt_thumbtable_scroll_to_imgid(dt_thumbtable_t *table, int32_t imgid);
332
339
349
357
358// Scroll to the first-selected image, or default to keyboard "over" then mouse "over", then last active image,
359// in this order.
361
367{
369 gtk_widget_queue_draw(table->grid);
370}
371
372#define dt_thumbtable_redraw(table) DT_DEBUG_TRACE_WRAPPER(DT_DEBUG_LIGHTTABLE, dt_thumbtable_redraw_real, (table))
373
380static inline void dt_thumbtable_show(dt_thumbtable_t *table)
381{
382 gtk_widget_show(table->parent_overlay);
383 gtk_widget_show(table->scroll_window);
384 gtk_widget_show(table->grid);
385
386 // Thumbtable is prevented to configure and update, for
387 // as long as it's hidden. We need to force the update now.
389}
390
395static inline void dt_thumbtable_hide(dt_thumbtable_t *table)
396{
397 gtk_widget_hide(table->parent_overlay);
398 gtk_widget_hide(table->scroll_window);
399 gtk_widget_hide(table->grid);
400}
401
402// clang-format off
403// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
404// vim: shiftwidth=2 expandtab tabstop=2 cindent
405// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
406// clang-format on
const dt_colormatrix_t dt_aligned_pixel_t out
int type
static gboolean enable(dt_image_t *image)
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
GHashTable * list
Definition thumbtable.h:108
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
gboolean collection_inited
Definition thumbtable.h:130
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:192
GtkAdjustment * v_scrollbar
Definition thumbtable.h:147
dt_thumbtable_zoom_t zoom
Definition thumbtable.h:175
int last_v_scrollbar_width
Definition thumbtable.h:193
gboolean focus_regions
Definition thumbtable.h:178
GList * drag_list
Definition thumbtable.h:122
gboolean configured
Definition thumbtable.h:132
GtkWidget * scroll_window
Definition thumbtable.h:144
dt_thumbtable_cache_t * lut
Definition thumbtable.h:142
dt_thumbnail_t * drag_thumb
Definition thumbtable.h:118
gboolean thumbs_inited
Definition thumbtable.h:131
GtkAdjustment * h_scrollbar
Definition thumbtable.h:148
uint32_t thumb_nb
Definition thumbtable.h:125
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)
int dt_thumbtable_scroll_to_selection(dt_thumbtable_t *table)
Scroll to show selected content.
Definition thumbtable.c:572
int dt_thumbtable_scroll_to_imgid(dt_thumbtable_t *table, int32_t imgid)
Scroll the view to show a specific image.
Definition thumbtable.c:539
gboolean dt_thumbtable_get_focus_peaking(dt_thumbtable_t *table)
void dt_thumbtable_update(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_active_rowid(dt_thumbtable_t *table)
Update internal active row tracking.
Definition thumbtable.c:496
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.
Definition thumbtable.c:286
void dt_thumbtable_configure(dt_thumbtable_t *table)
Definition thumbtable.c:765
void dt_thumbtable_cleanup(dt_thumbtable_t *table)
static void dt_thumbtable_redraw_real(dt_thumbtable_t *table)
Definition thumbtable.h:366
gboolean dt_thumbtable_get_focus_regions(dt_thumbtable_t *table)
void dt_thumbtable_set_focus_peaking(dt_thumbtable_t *table, gboolean enable)
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:874
static void dt_thumbtable_show(dt_thumbtable_t *table)
Show the thumbnail table widget.
Definition thumbtable.h:380
void dt_thumbtable_stop(dt_thumbtable_t *table)
void dt_thumbtable_set_focus_regions(dt_thumbtable_t *table, gboolean enable)
int dt_thumbtable_scroll_to_active_rowid(dt_thumbtable_t *table)
Scroll to show the active row.
Definition thumbtable.c:562
gboolean dt_thumbtable_get_draw_group_borders(dt_thumbtable_t *table)
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)
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:229
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)
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:395
void dt_thumbtable_update_parent(dt_thumbtable_t *table)