38#include <gdk/gdkkeysyms.h>
73 return _(
"lighttable");
78 static const char *
v[] = {
"lighttable", NULL};
98 GdkModifierType modifier, gpointer data)
101 int current_level =
dt_conf_get_int(
"plugins/lighttable/images_in_row");
102 int new_level = CLAMP(current_level - 1, 1, 12);
109 GdkModifierType modifier, gpointer data)
112 int current_level =
dt_conf_get_int(
"plugins/lighttable/images_in_row");
113 int new_level = CLAMP(current_level + 1, 1, 12);
121 const int next, gpointer user_data)
128 int current_level =
dt_conf_get_int(
"plugins/lighttable/images_in_row");
139 dt_conf_set_int(
"plugins/lighttable/images_in_row_backup", current_level);
143 dt_conf_set_int(
"plugins/lighttable/images_in_row_backup", current_level);
148 dt_conf_set_int(
"plugins/lighttable/images_in_row_backup", current_level);
158 dt_conf_set_int(
"plugins/lighttable/images_in_row_backup", current_level);
174static gboolean
_zoom_combobox_changed(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
176 const int level = GPOINTER_TO_INT(
get_custom_data(GTK_WIDGET(user_data)));
198 int current_level =
dt_conf_get_int(
"plugins/lighttable/images_in_row");
199 int new_level = CLAMP(current_level + CLAMP(scroll_y, -1, 1), 1, 12);
208static gboolean
_focus_toggle_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
222static gboolean
focus_peaking_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
240 NULL, 0, 0, accel_group);
244 GDK_CONTROL_MASK | GDK_SHIFT_MASK, accel_group);
263 self->
data = (
void *)
d;
267 gtk_widget_set_halign(self->
widget, GTK_ALIGN_END);
272 GtkWidget *menu_bar = gtk_menu_bar_new();
275 d->menu_items = NULL;
277 gtk_box_pack_start(GTK_BOX(self->
widget), GTK_WIDGET(menu_bar),
FALSE,
FALSE, 0);
281 GtkWidget *spacer = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
284 GtkWidget *label = gtk_label_new(C_(
"quickfilter",
"Columns"));
285 gtk_box_pack_start(GTK_BOX(self->
widget), GTK_WIDGET(label),
FALSE,
FALSE, 0);
287 d->columns = gtk_spin_button_new_with_range(1., 12., 1.);
288 gtk_box_pack_start(GTK_BOX(self->
widget), GTK_WIDGET(
d->columns),
FALSE,
FALSE, 0);
289 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
d->columns),
dt_conf_get_int(
"plugins/lighttable/images_in_row"));
295 GDK_KEY_plus, GDK_CONTROL_MASK, _(
"Triggers the action"));
297 GDK_KEY_minus, GDK_CONTROL_MASK, _(
"Triggers the action"));
319 if(
d->scroll_handler_id > 0)
323 g_signal_handler_disconnect(G_OBJECT(table->
scroll_window),
d->scroll_handler_id);
324 d->scroll_handler_id = 0;
327 GList *menu_widgets = NULL;
328 for(GList *iter =
d->menu_items; iter; iter = g_list_next(iter))
332 menu_widgets = g_list_prepend(menu_widgets, g_object_ref(entry->
widget));
335 for(GList *iter = menu_widgets; iter; iter = g_list_next(iter))
337 GtkWidget *widget = GTK_WIDGET(iter->data);
338 if(GTK_IS_WIDGET(widget)) gtk_widget_destroy(widget);
339 g_object_unref(widget);
341 g_list_free(menu_widgets);
343 g_list_free(
d->menu_items);
344 d->menu_items = NULL;
365 const int cols = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(
d->columns));
373 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
d->columns), columns);
uint32_t dt_collection_get_count(const dt_collection_t *collection)
dt_collection_properties_t
int dt_conf_key_exists(const char *key)
void dt_conf_set_int(const char *name, int val)
int dt_conf_get_int(const char *name)
#define DT_MODULE(MODVER)
static gboolean dt_modifier_is(const GdkModifierType state, const GdkModifierType desired_modifier_mask)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
gboolean dt_gui_get_scroll_unit_deltas(const GdkEventScroll *event, int *delta_x, int *delta_y)
void dt_accels_disconnect_on_text_input(GtkWidget *widget)
Disconnects accels when a text or search entry gets the focus, and reconnects them when it looses it....
void dt_gui_add_class(GtkWidget *widget, const gchar *class_name)
#define dt_accels_new_lighttable_action(a, b, c, d, e, f, g)
#define DT_GUI_BOX_SPACING
#define DT_DEBUG_CONTROL_SIGNAL_DISCONNECT(ctlsig, cb, user_data)
@ DT_SIGNAL_COLLECTION_CHANGED
This signal is raised when collection changed. To avoid leaking the list, dt_collection_t is connecte...
#define DT_DEBUG_CONTROL_SIGNAL_CONNECT(ctlsig, signal, cb, user_data)
struct _GtkWidget GtkWidget
const float uint32_t state[4]
struct dt_gui_gtk_t * gui
struct dt_collection_t * collection
struct dt_control_signal_t * signals
GtkAccelGroup * lighttable_accels
GtkWidget * scroll_window
dt_thumbtable_t * thumbtable_lighttable
void dt_thumbtable_set_zoom(dt_thumbtable_t *table, dt_thumbtable_zoom_t level)
gboolean dt_thumbtable_get_focus_peaking(dt_thumbtable_t *table)
void dt_thumbtable_apply_grid_configuration(dt_thumbtable_t *table)
Apply grid configuration changes with proper event synchronization.
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_set_focus_regions(dt_thumbtable_t *table, gboolean enable)
dt_thumbtable_zoom_t dt_thumbtable_get_zoom(dt_thumbtable_t *table)
A widget to manage and display image thumbnails in Ansel's lighttable and filmstrip views.
@ DT_UI_CONTAINER_PANEL_TOP_SECOND_ROW