64#include <glib-object.h>
78#define thumb_return_if_fails(thumb, ...) { if(!thumb || !thumb->widget || !thumb->w_main) return __VA_ARGS__; }
83 if(!GTK_IS_WIDGET(w))
return;
86 gtk_widget_set_state_flags(w,
flag,
FALSE);
88 gtk_widget_unset_state_flags(w,
flag);
105 tt = g_strdup_printf(
"\n\u2022 <b>%s (%s)</b>", _(
"current"), _(
"leader"));
110 tt = g_strdup_printf(
"%s\n\u2022 <b>%s (%s)</b>", _(
"\nclick here to set this image as group leader\n"), leader.
filename, _(
"leader"));
115 for(GList *
m = members;
m;
m = g_list_next(
m))
134 gchar *ttf = g_strdup_printf(
"%d %s\n%s", nb, _(
"grouped images"), tt);
138 gtk_widget_set_tooltip_markup(thumb->
w_group, ttf);
147 gchar *cn = g_strdup_printf(
"dt_thumbnail_rating_%d",
i);
165 gchar *label = g_strdup_printf(
"%s #%i", uext, thumb->
rowid + 1);
166 gtk_label_set_text(GTK_LABEL(thumb->
w_ext), label);
172 void (*activate_callback)(
GtkWidget *widget,
176 GtkWidget *menu_item = gtk_menu_item_new_with_label(
"");
177 GtkWidget *child = gtk_bin_get_child(GTK_BIN(menu_item));
178 gtk_label_set_markup(GTK_LABEL(child), label);
179 gtk_menu_item_set_reserve_indicator(GTK_MENU_ITEM(menu_item),
FALSE);
180 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
182 if(activate_callback) g_signal_connect(G_OBJECT(menu_item),
"activate", G_CALLBACK(activate_callback), thumb);
191 gchar *text = g_strdup_printf(
"%s%s", label,
value);
199 int color = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget),
"custom-data"));
200 GList *imgs = g_list_append(NULL, GINT_TO_POINTER(thumb->
info.
id));
212 GString *text = (GString *)user_data;
213 const gboolean has_multi = (multi && multi[0] && strcmp(multi,
" "));
216 g_string_append_printf(text,
"%d. %s (%s)\n", num, op ? op :
"?", multi);
218 g_string_append_printf(text,
"%d. %s\n", num, op ? op :
"?");
226 GString *text = g_string_new(NULL);
227 g_string_append_printf(text,
"image id: %d\nfile: %s\n\n", thumb->
info.
id,
231 if(text->len == 0) g_string_assign(text, _(
"No active modules"));
238 GtkWidget *dialog = gtk_dialog_new_with_buttons(_(
"Active modules"),
239 GTK_IS_WINDOW(main_window) ? GTK_WINDOW(main_window) : NULL,
240 GTK_DIALOG_DESTROY_WITH_PARENT,
241 _(
"_Close"), GTK_RESPONSE_CLOSE,
243 gtk_window_set_modal(GTK_WINDOW(dialog),
TRUE);
245 GtkWidget *content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
247 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(
scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
248 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(
scrolled), GTK_SHADOW_IN);
249 gtk_widget_set_size_request(
scrolled, 420, 260);
250 gtk_container_set_border_width(GTK_CONTAINER(
scrolled), 4);
254 gtk_text_view_set_editable(GTK_TEXT_VIEW(
view),
FALSE);
255 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(
view),
FALSE);
256 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(
view), GTK_WRAP_WORD_CHAR);
257 gtk_text_view_set_monospace(GTK_TEXT_VIEW(
view),
TRUE);
258 gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(
view)), text->str, -1);
262 gtk_widget_show_all(dialog);
264 g_signal_connect(dialog,
"response", G_CALLBACK(gtk_widget_destroy), NULL);
266 g_string_free(text,
TRUE);
276 gtk_widget_set_sensitive(menu_item,
FALSE);
278 GtkWidget *sep = gtk_separator_menu_item_new();
279 gtk_menu_shell_append(GTK_MENU_SHELL(menu), sep);
284 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), sub_menu);
291 sep = gtk_separator_menu_item_new();
292 gtk_menu_shell_append(GTK_MENU_SHELL(menu), sep);
296 sub_menu = gtk_menu_new();
297 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_item), sub_menu);
300 g_object_set_data(G_OBJECT(menu_item),
"custom-data", GINT_TO_POINTER(0));
303 g_object_set_data(G_OBJECT(menu_item),
"custom-data", GINT_TO_POINTER(1));
306 g_object_set_data(G_OBJECT(menu_item),
"custom-data", GINT_TO_POINTER(2));
309 g_object_set_data(G_OBJECT(menu_item),
"custom-data", GINT_TO_POINTER(3));
312 g_object_set_data(G_OBJECT(menu_item),
"custom-data", GINT_TO_POINTER(4));
315 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
317 sep = gtk_separator_menu_item_new();
318 gtk_menu_shell_append(GTK_MENU_SHELL(menu), sep);
321 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
323 gtk_widget_show_all(menu);
333 GtkStateFlags
state = gtk_widget_get_state_flags(thumb->
w_cursor);
334 GtkStyleContext *context = gtk_widget_get_style_context(thumb->
w_cursor);
336 gtk_style_context_get_color(context,
state, &col);
338 cairo_set_source_rgba(cr, col.red, col.green, col.blue, col.alpha);
339 cairo_line_to(cr, gtk_widget_get_allocated_width(widget), 0);
340 cairo_line_to(cr, gtk_widget_get_allocated_width(widget) / 2, gtk_widget_get_allocated_height(widget));
341 cairo_line_to(cr, 0, 0);
342 cairo_close_path(cr);
351 if(thumb->
img_surf && cairo_surface_get_reference_count(thumb->
img_surf) > 0)
352 cairo_surface_destroy(thumb->
img_surf);
399 const gboolean was_gating = (thumb->
job == job);
409 redraw_widget = g_object_ref(thumb->
w_image);
415 GMainContext *context = g_main_context_default();
416 g_main_context_invoke_full(context, G_PRIORITY_DEFAULT,
419 (GDestroyNotify)g_object_unref);
420 g_main_context_wakeup(context);
426 if(GTK_IS_WIDGET(widget))
428 gtk_widget_queue_draw(widget);
431 return G_SOURCE_REMOVE;
442 const gboolean was_gating =
IS_NULL_PTR(job) || thumb->
job == job;
452 redraw_widget = g_object_ref(thumb->
w_image);
458 GMainContext *context = g_main_context_default();
459 g_main_context_invoke_full(context, G_PRIORITY_DEFAULT,
462 (GDestroyNotify)g_object_unref);
463 g_main_context_wakeup(context);
485 int img_w = thumb->
img_w;
486 int img_h = thumb->
img_h;
492 const int32_t imgid = thumb->
info.
id;
502 float x_center = 0.f;
503 float y_center = 0.f;
510 cairo_surface_t *surface = NULL;
519 img_width = cairo_image_surface_get_width(surface);
520 img_height = cairo_image_surface_get_height(surface);
524 if(surface) cairo_surface_destroy(surface);
534 cairo_t *cri = cairo_create(surface);
535 unsigned char *rgbbuf = cairo_image_surface_get_data(surface);
538 if(
dt_focuspeaking(cri, rgbbuf, img_width, img_height, show_focus_peaking, &x_center, &y_center) != 0)
541 cairo_surface_destroy(surface);
551 if(zoom_in && x_center > 0.f && y_center > 0.f && thumb)
553 zoomx = (
double)img_width / 2. - x_center;
554 zoomy = (
double)img_height / 2. - y_center;
559 if(show_focus_clusters)
561 uint8_t *full_res_thumb = NULL;
562 int32_t full_res_thumb_wd, full_res_thumb_ht;
568 const int frows = 5, fcols = 5;
572 cairo_t *cri = cairo_create(surface);
574 full_res_thumb_ht, full_res_focus, frows, fcols, 1.0, 0, 0);
585 double sx = 1.0, sy = 1.0;
586 cairo_surface_get_device_scale(surface, &sx, &sy);
589 const gboolean still_valid = (thumb->
job == job
595 thumb->
img_width = roundf(img_width / sx);
597 thumb->
zoomx = zoomx / sx;
598 thumb->
zoomy = zoomy / sy;
609 cairo_surface_destroy(surface);
629 if(job_running)
return 0;
639 int img_w = gtk_widget_get_allocated_width(thumb->
w_image);
640 int img_h = gtk_widget_get_allocated_height(thumb->
w_image);
641 if(img_w < 2 || img_h < 2)
642 gtk_widget_get_size_request(thumb->
w_image, &img_w, &img_h);
645 if(img_w < 2 || img_h < 2)
return 0;
647 img_w =
MAX(img_w, 32);
648 img_h =
MAX(img_h, 32);
651 thumb->
img_w = img_w;
652 thumb->
img_h = img_h;
679 if(thumb->
job == job) thumb->
job = NULL;
696 int w = gtk_widget_get_allocated_width(widget);
697 int h = gtk_widget_get_allocated_height(widget);
698 if(w < 2 || h < 2)
return TRUE;
712 if(thumb->
img_surf && cairo_surface_get_reference_count(thumb->
img_surf) > 0)
716 double x_offset = (w - thumb->
img_width) / 2.;
717 double y_offset = (h - thumb->
img_height) / 2.;
722 thumb->
zoomx = CLAMP(thumb->
zoomx, -fabs(x_offset), fabs(x_offset));
723 thumb->
zoomy = CLAMP(thumb->
zoomy, -fabs(y_offset), fabs(y_offset));
731 cairo_set_source_surface(cr, thumb->
img_surf, thumb->
zoomx + x_offset, thumb->
zoomy + y_offset);
735 GtkStyleContext *context = gtk_widget_get_style_context(thumb->
w_image);
736 gtk_style_context_get_color(context, gtk_widget_get_state_flags(thumb->
w_image), &im_color);
737 cairo_paint_with_alpha(cr, im_color.alpha);
740 gtk_render_frame(context, cr, 0, 0, w, h);
766 if(GTK_IS_WIDGET(thumb->
w_group))
768 if(GTK_IS_WIDGET(thumb->
w_audio))
770 if(GTK_IS_WIDGET(thumb->
w_color))
776 if(GTK_IS_WIDGET(thumb->
w_ext))
777 gtk_widget_set_visible(thumb->
w_ext, show ||
DEBUG);
788 if(GTK_IS_WIDGET(thumb->
w_stars[
i]))
802 if(!gtk_widget_is_visible(thumb->
widget))
return TRUE;
812 if(event->button == 1 && event->type == GDK_2BUTTON_PRESS)
818 else if(event->button == GDK_BUTTON_SECONDARY && event->type == GDK_BUTTON_PRESS)
821 gtk_menu_popup_at_pointer(GTK_MENU(menu), NULL);
835 if(event->button == 1
848 else if(event->button == 1
864 if(event->button == 1)
869 else if(widget == thumb->
w_stars[0])
871 else if(widget == thumb->
w_stars[1])
873 else if(widget == thumb->
w_stars[2])
875 else if(widget == thumb->
w_stars[3])
877 else if(widget == thumb->
w_stars[4])
903 if(event->button == 1)
905 gboolean start_audio =
TRUE;
943 char *exposure_field = g_strdup_printf(
"%.0f ISO - f/%.1f - %s",
952 gtk_label_set_text(GTK_LABEL(thumb->
w_exposure), exposure_field);
955 gtk_label_set_text(GTK_LABEL(thumb->
w_focal), focal);
979 gtk_widget_queue_draw(thumb->
widget);
1034 if(!gtk_widget_is_visible(thumb->
widget))
return TRUE;
1055 if(!gtk_widget_is_visible(thumb->
widget))
return TRUE;
1070 if(!gtk_widget_is_visible(thumb->
widget))
return TRUE;
1131 const gboolean global_shift =
dt_modifier_is(event->state, GDK_SHIFT_MASK) && thumb->
table;
1141 thumb->
zoomx += delta_x;
1142 thumb->
zoomy += delta_y;
1150 gtk_widget_queue_draw(thumb->
w_image);
1170 thumb->
widget = gtk_event_box_new();
1172 gtk_widget_set_events(thumb->
widget, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK | GDK_POINTER_MOTION_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
1177 g_object_set_data(G_OBJECT(thumb->
widget),
"thumb", thumb);
1178 gtk_widget_show(thumb->
widget);
1188 thumb->
w_main = gtk_overlay_new();
1190 gtk_widget_set_valign(thumb->
w_main, GTK_ALIGN_CENTER);
1191 gtk_widget_set_halign(thumb->
w_main, GTK_ALIGN_CENTER);
1192 gtk_container_add(GTK_CONTAINER(thumb->
widget), thumb->
w_main);
1193 gtk_widget_show(thumb->
w_main);
1197 gtk_widget_set_valign(thumb->
w_background, GTK_ALIGN_FILL);
1198 gtk_widget_set_halign(thumb->
w_background, GTK_ALIGN_FILL);
1204 thumb->
w_cursor = gtk_drawing_area_new();
1206 gtk_widget_set_valign(thumb->
w_cursor, GTK_ALIGN_START);
1207 gtk_widget_set_halign(thumb->
w_cursor, GTK_ALIGN_CENTER);
1209 gtk_overlay_add_overlay(GTK_OVERLAY(thumb->
w_main), thumb->
w_cursor);
1212 thumb->
w_image = gtk_drawing_area_new();
1214 gtk_widget_set_valign(thumb->
w_image, GTK_ALIGN_CENTER);
1215 gtk_widget_set_halign(thumb->
w_image, GTK_ALIGN_CENTER);
1216 gtk_widget_set_events(thumb->
w_image, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK);
1221 gtk_widget_show(thumb->
w_image);
1222 gtk_overlay_add_overlay(GTK_OVERLAY(thumb->
w_main), thumb->
w_image);
1223 gtk_overlay_set_overlay_pass_through(GTK_OVERLAY(thumb->
w_main), thumb->
w_image,
TRUE);
1226 gtk_widget_set_valign(thumb->
w_bottom_eb, GTK_ALIGN_END);
1227 gtk_widget_set_halign(thumb->
w_bottom_eb, GTK_ALIGN_FILL);
1233 gtk_container_add(GTK_CONTAINER(thumb->
w_bottom_eb), bottom_box);
1234 gtk_widget_show(bottom_box);
1239 gtk_widget_set_valign(thumb->
w_reject, GTK_ALIGN_CENTER);
1240 gtk_widget_set_halign(thumb->
w_reject, GTK_ALIGN_START);
1246 gtk_box_pack_start(GTK_BOX(bottom_box), stars_box,
TRUE,
TRUE, 0);
1247 gtk_widget_set_valign(stars_box, GTK_ALIGN_CENTER);
1248 gtk_widget_set_halign(stars_box, GTK_ALIGN_CENTER);
1249 gtk_widget_set_hexpand(stars_box,
TRUE);
1250 gtk_widget_show(stars_box);
1261 gtk_widget_set_valign(thumb->
w_stars[
i], GTK_ALIGN_CENTER);
1262 gtk_widget_set_halign(thumb->
w_stars[
i], GTK_ALIGN_CENTER);
1263 gtk_widget_show(thumb->
w_stars[
i]);
1270 gtk_widget_set_valign(thumb->
w_color, GTK_ALIGN_CENTER);
1271 gtk_widget_set_halign(thumb->
w_color, GTK_ALIGN_END);
1275 thumb->
w_top_eb = gtk_event_box_new();
1276 gtk_widget_set_valign(thumb->
w_top_eb, GTK_ALIGN_START);
1277 gtk_widget_set_halign(thumb->
w_top_eb, GTK_ALIGN_FILL);
1279 gtk_overlay_add_overlay(GTK_OVERLAY(thumb->
w_main), thumb->
w_top_eb);
1283 gtk_container_add(GTK_CONTAINER(thumb->
w_top_eb), top_box);
1284 gtk_widget_show(top_box);
1287 thumb->
w_ext = gtk_label_new(
"");
1289 gtk_widget_set_valign(thumb->
w_ext, GTK_ALIGN_CENTER);
1290 gtk_widget_show(thumb->
w_ext);
1296 gtk_widget_set_tooltip_text(thumb->
w_local_copy, _(
"This picture is locally copied on your disk cache"));
1297 gtk_widget_set_valign(thumb->
w_local_copy, GTK_ALIGN_CENTER);
1305 gtk_widget_set_valign(thumb->
w_altered, GTK_ALIGN_CENTER);
1313 g_signal_connect(G_OBJECT(thumb->
w_group),
"enter-notify-event", G_CALLBACK(
_group_enter), thumb);
1314 gtk_widget_set_valign(thumb->
w_group, GTK_ALIGN_CENTER);
1322 gtk_widget_set_valign(thumb->
w_audio, GTK_ALIGN_CENTER);
1328 gtk_widget_set_halign(thumb->
w_alternative, GTK_ALIGN_FILL);
1329 gtk_widget_set_valign(thumb->
w_alternative, GTK_ALIGN_FILL);
1333 gtk_container_add(GTK_CONTAINER(thumb->
w_alternative), box);
1337 gtk_widget_set_valign(
bbox, GTK_ALIGN_START);
1340 gtk_label_set_ellipsize(GTK_LABEL(thumb->
w_filename), PANGO_ELLIPSIZE_MIDDLE);
1344 thumb->
w_folder = gtk_label_new(
"");
1345 gtk_label_set_ellipsize(GTK_LABEL(thumb->
w_folder), PANGO_ELLIPSIZE_MIDDLE);
1349 gtk_widget_set_valign(
bbox, GTK_ALIGN_CENTER);
1357 gtk_widget_set_valign(
bbox, GTK_ALIGN_END);
1359 thumb->
w_camera = gtk_label_new(
"");
1361 thumb->
w_lens = gtk_label_new(
"");
1362 gtk_label_set_ellipsize(GTK_LABEL(thumb->
w_lens), PANGO_ELLIPSIZE_MIDDLE);
1364 thumb->
w_focal = gtk_label_new(
"");
1395 thumb->
rowid = rowid;
1397 thumb->
table = table;
1430 if(g_hash_table_lookup(thumb->
table->
list, GINT_TO_POINTER(thumb->
info.
id)) == thumb)
1431 g_hash_table_remove(thumb->
table->
list, GINT_TO_POINTER(thumb->
info.
id));
1448 while(g_idle_remove_by_data(thumb->
widget))
1450 while(g_idle_remove_by_data(thumb->
w_image))
1453 if(thumb->
img_surf && cairo_surface_get_reference_count(thumb->
img_surf) > 0)
1454 cairo_surface_destroy(thumb->
img_surf);
1460 if(parent && GTK_IS_CONTAINER(parent))
1461 gtk_container_remove(GTK_CONTAINER(parent), thumb->
widget);
1470 thumb->
w_ext = NULL;
1498 if(GTK_IS_WIDGET(thumb->
w_color))
1517 GtkStateFlags
state = gtk_widget_get_state_flags(w);
1518 GtkStyleContext *context = gtk_widget_get_style_context(w);
1521 gtk_style_context_get_margin(context,
state, &margins);
1523 int width = *parent_width - margins.left - margins.right;
1524 int height = *parent_height - margins.top - margins.bottom;
1531 GtkAllocation alloc = { .x = 0, .y = 0, .width =
width, .height =
height };
1532 gtk_widget_size_allocate(w, &alloc);
1537 *parent_width =
width;
1562 int icon_size = roundf(2 * r1);
1565 gtk_widget_set_size_request(thumb->
w_reject, icon_size, icon_size);
1569 gtk_widget_set_size_request(thumb->
w_stars[
i], icon_size, icon_size);
1572 gtk_widget_set_size_request(thumb->
w_color, icon_size, icon_size);
1576 gtk_widget_set_size_request(thumb->
w_local_copy, icon_size, icon_size);
1579 gtk_widget_set_size_request(thumb->
w_altered, icon_size, icon_size);
1582 gtk_widget_set_size_request(thumb->
w_group, icon_size, icon_size);
1585 gtk_widget_set_size_request(thumb->
w_audio, icon_size, icon_size);
1588 gtk_widget_set_size_request(thumb->
w_cursor, 6.0 * r1, 1.5 * r1);
1591 PangoAttrList *attrlist = pango_attr_list_new();
1592 PangoAttribute *attr = pango_attr_size_new_absolute(icon_size * PANGO_SCALE * 0.9);
1593 pango_attr_list_insert(attrlist, attr);
1594 gtk_label_set_attributes(GTK_LABEL(thumb->
w_ext), attrlist);
1595 pango_attr_list_unref(attrlist);
1623 gtk_widget_show_all(thumb->
widget);
1639 int margin_bottom = 0, margin_top = 0;
1640 gtk_widget_get_preferred_height(thumb->
w_bottom_eb, NULL, &margin_bottom);
1641 gtk_widget_get_preferred_height(thumb->
w_top_eb, NULL, &margin_top);
1642 height -= 2 *
MAX(
MAX(margin_top, margin_bottom), icon_size);
1700 gtk_drag_dest_unset(thumb->
w_main);
1726 if(thumb->
w_main) gtk_widget_queue_draw(thumb->
w_main);
1727 return G_SOURCE_REMOVE;
Handle default and user-set shortcuts (accelerators)
GtkWidget * dt_gui_main_window(void)
int scrolled(struct dt_iop_module_t *self, double x, double y, int up, uint32_t state)
void dt_atomic_set_int(dt_atomic_int *var, int value)
int dt_atomic_get_int(dt_atomic_int *var)
int dt_atomic_sub_int(dt_atomic_int *var, int decr)
int dt_atomic_add_int(dt_atomic_int *var, int incr)
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
void dt_colorlabels_toggle_label_on_list(GList *list, const int color, const gboolean undo_on)
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
void dt_control_draw_busy_msg(cairo_t *cr, int width, int height)
void dt_control_set_mouse_over_id(int32_t value)
struct dt_control_t * dt_control_get_global(void)
struct dt_view_manager_t * dt_view_manager_get_global(void)
GHashTable * selected
set of checked row labels, mirrored to conf on every change
GtkWidget * view
the tree view
static const GtkTargetEntry target_list_all[]
static const guint n_targets_all
static int dt_pthread_mutex_unlock(dt_pthread_mutex_t *mutex) RELEASE(mutex) NO_THREAD_SAFETY_ANALYSIS
static int dt_pthread_mutex_init(dt_pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
Initialise a mutex. With mutexattr NULL – which is how 54 of the 56 call sites in this tree spell it ...
static int dt_pthread_mutex_destroy(dt_pthread_mutex_t *mutex)
static int dt_pthread_mutex_lock(dt_pthread_mutex_t *mutex) ACQUIRE(mutex) NO_THREAD_SAFETY_ANALYSIS
void dt_thumbtable_offset_zoom(dt_thumbtable_t *table, const double delta_x, const double delta_y)
static void dt_focus_draw_clusters(cairo_t *cr, int width, int height, int32_t imgid, int buffer_width, int buffer_height, dt_focus_cluster_t *focus, int frows, int fcols, float full_zoom, float full_x, float full_y)
static void dt_focus_create_clusters(dt_focus_cluster_t *focus, int frows, int fcols, uint8_t *buffer, int buffer_width, int buffer_height)
int dt_focuspeaking(cairo_t *cr, uint8_t *const restrict image, const int buf_width, const int buf_height, gboolean draw, float *x, float *y)
int dt_grouping_change_representative(const int32_t image_id)
static gboolean enable(const dt_image_t *image)
char * dt_history_get_items_as_string(const int32_t imgid)
void dt_history_repository_foreach_active_module(const int32_t imgid, dt_history_repository_active_module_cb cb, void *user_data)
Every module an image has enabled, once each, in the order they run.
dt_view_image_over_t
What a thumbnail shows over an image: its rating, or one of the badge states.
void dt_image_group_member_free(gpointer data)
Free one dt_image_group_member_t. Suits g_list_free_full().
GList * dt_image_repository_get_group_member_rows(const int32_t group_id)
Every member of group_id, in row order, named. Free with g_list_free_full(list, dt_image_group_member...
Reading and writing one dt_image_t to and from the library database. The SQL half of what used to be ...
int dt_imageio_large_thumbnail(const char *filename, uint8_t **buffer, int32_t *th_width, int32_t *th_height, dt_colorspaces_color_profile_type_t *color_space, const int width, const int height)
Load the thumbnail embedded into a RAW file having at least the size MAX(width, height) x MAX(width,...
dt_job_state_t dt_control_job_get_state(_dt_job_t *job)
dt_job_t * dt_control_job_create(dt_job_execute_callback execute, const char *msg,...)
int dt_control_add_job(dt_control_t *control, dt_job_queue_t queue_id, _dt_job_t *job)
void * dt_control_job_get_params(const _dt_job_t *job)
void dt_control_job_set_state_callback(_dt_job_t *job, dt_job_state_change_callback cb)
void dt_control_job_set_params(_dt_job_t *job, void *params, dt_job_destroy_callback callback)
void dt_control_job_dispose(_dt_job_t *job)
void dt_gui_textview_set_padding(GtkTextView *textview)
Apply the standard recessed-input text padding to a GtkTextView.
void dt_print(dt_debug_thread_t thread, const char *msg,...) __attribute__((format(printf
Print to stdout when thread is enabled, prefixed with seconds since startup.
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
dt_colorspaces_color_profile_type_t color_space
#define dt_pixelpipe_cache_free_align(mem)
void dt_preview_window_spawn(const int32_t imgid)
dt_colorspaces_color_profile_type_t
void dt_ratings_apply_on_image(const int32_t imgid, const int rating, const gboolean single_star_toggle, const gboolean undo_on, const gboolean group_on)
struct dt_selection_t * dt_selection_get_global(void)
gboolean dt_selection_is_id_selected(struct dt_selection_t *selection, int32_t imgid)
void dt_selection_select_single(dt_selection_t *selection, int32_t imgid)
void dt_selection_toggle(dt_selection_t *selection, int32_t imgid)
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
struct dt_control_signal_t * dt_control_signal_get_global(void)
@ DT_SIGNAL_VIEWMANAGER_THUMBTABLE_ACTIVATE
@ DT_SIGNAL_VIEWMANAGER_FILMSTRIP_ACTIVATE
This signal is raised when a thumb is single-clicked in the filmstrip. Views that want filmstrip clic...
static const dt_aligned_pixel_simd_t value
const float uint32_t state[4]
One member of a group, with what a tooltip needs to name it.
float exif_focus_distance
char camera_makermodel[128]
char filename[DT_MAX_FILENAME_LEN]
char fullpath[DT_PATH_MAX]
GtkWidget * w_alternative
GtkWidget * w_exposure_bias
dt_thumbnail_border_t group_borders
gboolean alternative_mode
struct dt_thumbtable_t * table
dt_thumbnail_overlay_t over
cairo_surface_t * img_surf
dt_thumbtable_mode_t mode
dt_thumbtable_zoom_t zoom
dt_thumbtable_cache_t * lut
typedef double((*spd)(unsigned long int wavelength, double TempK))
static gboolean _event_audio_release(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
static void _free_image_surface(dt_thumbnail_t *thumb)
static gboolean _event_image_motion(GtkWidget *widget, GdkEventMotion *event, gpointer user_data)
void dt_thumbnail_set_drop(dt_thumbnail_t *thumb, gboolean accept_drop)
static void _color_label_callback(GtkWidget *widget, dt_thumbnail_t *thumb)
gboolean _event_expose(GtkWidget *self, cairo_t *cr, gpointer user_data)
#define thumb_return_if_fails(thumb,...)
static void _thumbnail_free(dt_thumbnail_t *thumb)
dt_thumbnail_t * dt_thumbnail_new(int rowid, dt_thumbnail_overlay_t over, dt_thumbtable_t *table, dt_image_t *info)
static GtkWidget * _menuitem_from_text(const char *label, const char *value, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, dt_thumbnail_t *thumb), dt_thumbnail_t *thumb)
static gboolean _event_star_enter(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
static gboolean _main_context_queue_draw(GtkWidget *widget)
void dt_thumbnail_set_mouseover(dt_thumbnail_t *thumb, gboolean over)
static gboolean _event_main_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
static void _image_update_group_tooltip(dt_thumbnail_t *thumb)
static GtkWidget * _gtk_menu_item_new_with_markup(const char *label, GtkWidget *menu, void(*activate_callback)(GtkWidget *widget, dt_thumbnail_t *thumb), dt_thumbnail_t *thumb)
static void _thumb_update_icons(dt_thumbnail_t *thumb)
static gboolean _thumb_draw_image(GtkWidget *widget, cairo_t *cr, gpointer user_data)
GtkWidget * dt_thumbnail_create_widget(dt_thumbnail_t *thumb)
static gboolean _event_cursor_draw(GtkWidget *widget, cairo_t *cr, gpointer user_data)
static void _thumbnail_release(void *data)
static GtkWidget * _create_menu(dt_thumbnail_t *thumb)
static gboolean _event_main_leave(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
static gboolean _event_star_leave(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
static gboolean _event_main_enter(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
static void _thumb_update_rating_class(dt_thumbnail_t *thumb)
static gboolean _event_grouping_release(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
void _create_alternative_view(dt_thumbnail_t *thumb)
void dt_thumbnail_resync_info(dt_thumbnail_t *thumb, const dt_image_t *const info)
static gboolean _event_rating_release(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
void dt_thumbnail_set_overlay(dt_thumbnail_t *thumb, dt_thumbnail_overlay_t mode)
static void _active_module_row(void *user_data, const int num, const char *op, const char *multi)
static void _set_flag(GtkWidget *w, GtkStateFlags flag, gboolean activate)
void dt_thumbnail_set_group_border(dt_thumbnail_t *thumb, dt_thumbnail_border_t border)
static gboolean _event_image_release(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
int dt_thumbnail_destroy(dt_thumbnail_t *thumb)
int dt_thumbnail_image_refresh_real(dt_thumbnail_t *thumb)
int32_t _get_image_buffer(dt_job_t *job)
void dt_thumbnail_update_gui(dt_thumbnail_t *thumb)
void dt_thumbnail_update_selection(dt_thumbnail_t *thumb, gboolean selected)
static gboolean _altered_enter(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
static void _thumb_job_state_changed(dt_job_t *job, dt_job_state_t state)
static gboolean _event_main_motion(GtkWidget *widget, GdkEventMotion *event, gpointer user_data)
static gboolean _event_image_press(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
static gboolean _group_enter(GtkWidget *widget, GdkEventCrossing *event, gpointer user_data)
void dt_thumbnail_alternative_mode(dt_thumbnail_t *thumb, gboolean enable)
static gboolean _event_main_release(GtkWidget *widget, GdkEventButton *event, gpointer user_data)
static void _thumb_write_extension(dt_thumbnail_t *thumb)
static int _finish_buffer_thread(dt_thumbnail_t *thumb, dt_job_t *job, gboolean success)
static void _preview_window_open(GtkWidget *widget, dt_thumbnail_t *thumb)
static int _thumb_resize_overlays(dt_thumbnail_t *thumb, int width, int height)
void _widget_set_size(GtkWidget *w, int *parent_width, int *parent_height, const gboolean update)
void dt_thumbnail_resize(dt_thumbnail_t *thumb, int width, int height)
int dt_thumbnail_get_image_buffer(dt_thumbnail_t *thumb)
static void _active_modules_popup(GtkWidget *widget, dt_thumbnail_t *thumb)
@ DT_THUMBNAIL_BORDER_BOTTOM
@ DT_THUMBNAIL_BORDER_NONE
@ DT_THUMBNAIL_BORDER_TOP
@ DT_THUMBNAIL_BORDER_RIGHT
@ DT_THUMBNAIL_BORDER_LEFT
@ DT_THUMBNAIL_OVERLAYS_ALWAYS_NORMAL
@ DT_THUMBNAIL_OVERLAYS_NONE
GtkWidget * dtgtk_thumbnail_btn_new(DTGTKCairoPaintIconFunc paint, gint paintflags, void *paintdata)
gboolean dtgtk_thumbnail_btn_is_hidden(GtkWidget *widget)
gboolean dt_thumbtable_get_thumbnail_info(dt_thumbtable_t *table, int32_t imgid, dt_image_t *out)
void dt_thumbtable_dispatch_over(dt_thumbtable_t *table, GdkEventType type, int32_t imgid)
Update the mouse-over image ID with conflict resolution.
void dt_thumbtable_select_range(dt_thumbtable_t *table, const int rowid)
Select a range of images in the collection.
A widget to manage and display image thumbnails in Ansel's lighttable and filmstrip views.
@ DT_THUMBTABLE_MODE_FILMSTRIP
@ DT_THUMBTABLE_MODE_FILEMANAGER
void dt_thumbtable_copy_image(dt_image_t *info, const dt_image_t *const img)
static gboolean dt_thumbtable_info_is_grouped(const dt_image_t info)
static gboolean dt_thumbtable_info_is_altered(const dt_image_t info)
char * dt_util_format_exposure(const float exposuretime)
gchar * dt_util_dstrcat(gchar *str, const gchar *format,...)
void dt_view_audio_start(dt_view_manager_t *vm, int32_t imgid)
void dt_view_audio_stop(dt_view_manager_t *vm)
dt_view_surface_value_t dt_view_image_get_surface(int32_t imgid, int width, int height, cairo_surface_t **surface, int zoom)
char * dt_view_extend_modes_str(const char *name, const gboolean is_hdr, const gboolean is_bw, const gboolean is_bw_flow)