41#include <gdk/gdkkeysyms.h>
74 return _(
"lighttable");
79 static const char *
v[] = {
"lighttable", NULL};
99 GdkModifierType modifier, gpointer data)
102 int current_level =
dt_conf_get_int(
"plugins/lighttable/images_in_row");
103 int new_level = CLAMP(current_level - 1, 1, 12);
110 GdkModifierType modifier, gpointer data)
113 int current_level =
dt_conf_get_int(
"plugins/lighttable/images_in_row");
114 int new_level = CLAMP(current_level + 1, 1, 12);
122 const int next, gpointer user_data)
138 int current_level =
dt_conf_get_int(
"plugins/lighttable/images_in_row");
149 dt_conf_set_int(
"plugins/lighttable/images_in_row_backup", current_level);
153 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);
168 dt_conf_set_int(
"plugins/lighttable/images_in_row_backup", current_level);
184static gboolean
_zoom_combobox_changed(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
186 const int level = GPOINTER_TO_INT(
get_custom_data(GTK_WIDGET(user_data)));
208 int current_level =
dt_conf_get_int(
"plugins/lighttable/images_in_row");
209 int new_level = CLAMP(current_level + CLAMP(scroll_y, -1, 1), 1, 12);
218static gboolean
_focus_toggle_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
232static gboolean
focus_peaking_callback(GtkAccelGroup *group, GObject *acceleratable, guint keyval, GdkModifierType mods, gpointer user_data)
250 NULL, 0, 0, accel_group);
273 self->
data = (
void *)
d;
277 gtk_widget_set_halign(self->
widget, GTK_ALIGN_END);
282 GtkWidget *menu_bar = gtk_menu_bar_new();
285 d->menu_items = NULL;
287 gtk_box_pack_start(GTK_BOX(self->
widget), GTK_WIDGET(menu_bar),
FALSE,
FALSE, 0);
291 GtkWidget *spacer = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
294 GtkWidget *label = gtk_label_new(C_(
"quickfilter",
"Columns"));
295 gtk_box_pack_start(GTK_BOX(self->
widget), GTK_WIDGET(label),
FALSE,
FALSE, 0);
297 d->columns = gtk_spin_button_new_with_range(1., 12., 1.);
298 gtk_box_pack_start(GTK_BOX(self->
widget), GTK_WIDGET(
d->columns),
FALSE,
FALSE, 0);
299 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
d->columns),
dt_conf_get_int(
"plugins/lighttable/images_in_row"));
329 if(
d->scroll_handler_id > 0)
333 g_signal_handler_disconnect(G_OBJECT(table->
scroll_window),
d->scroll_handler_id);
334 d->scroll_handler_id = 0;
337 GList *menu_widgets = NULL;
338 for(GList *iter =
d->menu_items; iter; iter = g_list_next(iter))
342 menu_widgets = g_list_prepend(menu_widgets, g_object_ref(entry->
widget));
345 for(GList *iter = menu_widgets; iter; iter = g_list_next(iter))
347 GtkWidget *widget = GTK_WIDGET(iter->data);
348 if(GTK_IS_WIDGET(widget)) gtk_widget_destroy(widget);
349 g_object_unref(widget);
351 g_list_free(menu_widgets);
353 g_list_free(
d->menu_items);
354 d->menu_items = NULL;
375 const int cols = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(
d->columns));
383 gtk_spin_button_set_value(GTK_SPIN_BUTTON(
d->columns), columns);
void dt_accels_disconnect_on_text_input(GtkWidget *widget)
Disconnect accels while a text or search entry has the focus, and reconnect them when it loses it....
Handle default and user-set shortcuts (accelerators)
struct dt_accels_t * dt_gui_get_accels(void)
struct dt_ui_t * dt_gui_get_ui(void)
#define dt_accels_new_lighttable_action(a, b, w, c, d, e, f, g)
dt_collection_t * dt_collection_get_global(void)
uint32_t dt_collection_get_count(const dt_collection_t *collection)
dt_collection_properties_t
@ DT_COLLECTION_CHANGE_BACKGROUND_SYNC
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
int dt_conf_key_exists(const char *key)
Does key have a value?
void dt_conf_set_int(const char *name, int val)
int dt_conf_get_int(const char *name)
Integer for name, clamped to the bounds declared in the XML.
struct dt_gui_gtk_t * dt_gui_get_global(void)
void dt_thumbtable_set_zoom(dt_thumbtable_t *table, dt_thumbtable_zoom_t level)
void dt_thumbtable_apply_grid_configuration(dt_thumbtable_t *table)
Apply grid configuration changes with proper event synchronization.
dt_thumbtable_zoom_t dt_thumbtable_get_zoom(dt_thumbtable_t *table)
#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.
#define DT_MODULE(MODVER)
Instantiate the version handshake every module must export. Use once, at file scope,...
#define DT_DEBUG_CONTROL_SIGNAL_DISCONNECT(ctlsig, cb, user_data)
struct dt_control_signal_t * dt_control_signal_get_global(void)
@ 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)
const float uint32_t state[4]
GtkAccelGroup * lighttable_accels
GtkWidget * scroll_window
dt_thumbtable_t * thumbtable_lighttable
gboolean dt_thumbtable_get_focus_peaking(dt_thumbtable_t *table)
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)
A widget to manage and display image thumbnails in Ansel's lighttable and filmstrip views.
@ DT_UI_CONTAINER_PANEL_TOP_SECOND_ROW