74 g_snprintf(lay,
sizeof(lay),
"%d/", 0);
78 return g_strdup_printf(
"%s/ui/%s%s", cv->
module_name, lay, suffix);
118 g_return_val_if_fail(GTK_IS_WIDGET(ui->
panels[
p]),
FALSE);
119 return gtk_widget_is_ancestor(w, ui->
panels[
p]) || gtk_widget_is_ancestor(ui->
panels[
p], w);
168 gtk_widget_show_all(w);
175 if(strcmp(gtk_widget_get_name(widget),
"right") == 0)
180 if(
key) gtk_widget_set_size_request(widget, s, -1);
182 else if(strcmp(gtk_widget_get_name(widget),
"left") == 0)
187 if(
key) gtk_widget_set_size_request(widget, s, -1);
189 else if(strcmp(gtk_widget_get_name(widget),
"bottom") == 0)
195 if(
key) gtk_widget_set_size_request(widget, -1, s);
239 GtkWidget *widget = GTK_WIDGET(user_data);
240 const gboolean bottom = (strcmp(gtk_widget_get_name(widget),
"bottom") == 0);
242 gtk_widget_get_size_request(widget, &w, &h);
243 if(bottom)
return (h > 0) ? h : gtk_widget_get_allocated_height(widget);
244 return (w > 0) ? w : gtk_widget_get_allocated_width(widget);
249 GtkWidget *widget = GTK_WIDGET(user_data);
250 const char *
name = gtk_widget_get_name(widget);
252 int win_w = 0, win_h = 0;
253 gtk_window_get_size(GTK_WINDOW(
window), &win_w, &win_h);
256 int size = requested_size;
257 if(strcmp(
name,
"right") == 0)
259 size = CLAMP(requested_size, 150, win_w / 2);
261 gtk_widget_set_size_request(widget,
size, -1);
263 else if(strcmp(
name,
"left") == 0)
265 size = CLAMP(requested_size, 150, win_w / 2);
267 gtk_widget_set_size_request(widget,
size, -1);
269 else if(strcmp(
name,
"bottom") == 0)
271 size = CLAMP(requested_size, 48, win_h / 3);
273 gtk_widget_set_size_request(widget, -1,
size);
310 for(
const GList *libs =
dt_lib_get_global()->plugins; libs; libs = g_list_next(libs))
313 if(!
IS_NULL_PTR(module) &&
module->expander == target) return TRUE;
321 for(
const GList *iops = dev->
iop; iops; iops = g_list_next(iops))
335 GtkAllocation allocation;
338 const int side = GPOINTER_TO_INT(user_data);
342 const float height = gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_lower(adjustment);
344 if(
height == last_height[side])
return;
345 last_height[side] =
height;
357 gtk_adjustment_set_value(adjustment, allocation.y);
369 a[0] = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 100, 1, 10, 10));
370 a[1] = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 100, 1, 10, 10));
371 a[2] = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 100, 1, 10, 10));
372 a[3] = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 100, 1, 10, 10));
375 widget = gtk_scrolled_window_new(a[0], a[1]);
378 gtk_widget_set_name(widget,
"panel-scroll");
379 gtk_widget_set_can_focus(widget,
TRUE);
380 gtk_scrolled_window_set_placement(GTK_SCROLLED_WINDOW(widget),
381 left ? GTK_CORNER_TOP_LEFT : GTK_CORNER_TOP_RIGHT);
383 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
385 g_signal_connect(G_OBJECT(gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(widget))),
"notify::lower",
391 widget = gtk_viewport_new(a[2], a[3]);
392 gtk_viewport_set_shadow_type(GTK_VIEWPORT(widget), GTK_SHADOW_NONE);
393 gtk_container_add(GTK_CONTAINER(
container), widget);
398 widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
399 gtk_widget_set_name(widget,
"plugins_box");
400 gtk_container_add(GTK_CONTAINER(
container), widget);
424 gtk_widget_set_name(widget,
"left");
428 gtk_container_add(GTK_CONTAINER(over), widget);
431 _(
"Drag to resize panel"),
433 gtk_overlay_add_overlay(GTK_OVERLAY(over), handle);
434 gtk_widget_show(handle);
436 gtk_grid_attach(GTK_GRID(
container), over, 1, 1, 1, 1);
455 gtk_widget_set_name(widget,
"right");
459 gtk_container_add(GTK_CONTAINER(over), widget);
462 _(
"Drag to resize panel"),
464 gtk_overlay_add_overlay(GTK_OVERLAY(over), handle);
465 gtk_widget_show(handle);
467 gtk_grid_attach(GTK_GRID(
container), over, 3, 1, 1, 1);
488 gtk_widget_set_hexpand(GTK_WIDGET(widget),
TRUE);
489 gtk_grid_attach(GTK_GRID(
container), widget, 1, 0, 3, 1);
493 gtk_widget_set_name(ui->
top_panel,
"top-first-line");
515 gtk_grid_attach(GTK_GRID(
container), over, 1, 2, 3, 1);
522 _(
"Drag to resize panel"),
525 gtk_overlay_add_overlay(GTK_OVERLAY(over), handle);
526 gtk_widget_show(handle);
532 gtk_widget_queue_draw(widget);
552 gtk_widget_set_name(widget,
"main-widget");
553 gtk_widget_set_hexpand(GTK_WIDGET(widget),
TRUE);
554 gtk_widget_set_vexpand(GTK_WIDGET(widget),
TRUE);
555 gtk_grid_attach(GTK_GRID(
container), widget, 2, 1, 1, 1);
563 gtk_widget_show(ocda);
566 gtk_widget_set_hexpand(ocda,
TRUE);
567 gtk_widget_set_vexpand(ocda,
TRUE);
568 gtk_widget_set_app_paintable(cda,
TRUE);
569 gtk_widget_set_events(cda, GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK
570 | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK
580 gtk_container_add(GTK_CONTAINER(ocda), cda);
587 gtk_box_pack_start(GTK_BOX(widget), ocda,
TRUE,
TRUE, 0);
626 gtk_header_bar_set_decoration_layout(GTK_HEADER_BAR(ui->
header->
titlebar), NULL);
632 gtk_header_bar_set_custom_title(GTK_HEADER_BAR(ui->
header->
titlebar), box);
633 gtk_widget_set_no_show_all(box,
TRUE);
644 gtk_header_bar_pack_start(GTK_HEADER_BAR(ui->
header->
titlebar), widget);
653 gtk_header_bar_pack_end(GTK_HEADER_BAR(ui->
header->
titlebar), widget);
666 gtk_window_close(GTK_WINDOW((
GtkWidget *)data));
671 gtk_window_iconify(GTK_WINDOW((
GtkWidget *)data));
689 gchar *labels [
DT_MENU_LAST] = { _(
"_File"), _(
"_Edit"), _(
"_Selection"), _(
"_Image"), _(
"_Styles"), _(
"_Run"), _(
"_Display"), _(
"_Ateliers"), _(
"_Help") };
713 GtkWidget *search_button = gtk_button_new_from_icon_name(
"edit-find", GTK_ICON_SIZE_SMALL_TOOLBAR);
714 gtk_button_set_label (GTK_BUTTON(search_button), _(
"Search actions..."));
715 gtk_widget_set_halign(search_button, GTK_ALIGN_CENTER);
716 gtk_widget_set_valign(search_button, GTK_ALIGN_CENTER);
717 gtk_widget_set_hexpand(search_button,
TRUE);
718 gtk_widget_set_name(search_button,
"search-button");
721 gtk_widget_show(search_button);
724 ui->
header->
close = gtk_button_new_from_icon_name(
"window-close", GTK_ICON_SIZE_LARGE_TOOLBAR);
726 gtk_widget_set_size_request(ui->
header->
close, 24, 24);
730 ui->
header->
iconify = gtk_button_new_from_icon_name(
"window-minimize", GTK_ICON_SIZE_LARGE_TOOLBAR);
736 ui->
header->
home = gtk_button_new_from_icon_name(
"go-home", GTK_ICON_SIZE_LARGE_TOOLBAR);
737 gtk_widget_set_tooltip_text(ui->
header->
home, _(
"Go back to lighttable"));
739 gtk_widget_set_size_request(ui->
header->
home, 24, 24);
744 GtkWidget *spacer = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
746 gtk_widget_show(spacer);
750 gtk_label_set_ellipsize(GTK_LABEL(ui->
header->
hinter), PANGO_ELLIPSIZE_END);
752 gtk_widget_set_halign(ui->
header->
hinter, GTK_ALIGN_END);
753 gtk_label_set_justify(GTK_LABEL(ui->
header->
hinter), GTK_JUSTIFY_RIGHT);
758 spacer = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
760 gtk_widget_show(spacer);
764 gtk_label_set_ellipsize(GTK_LABEL(ui->
header->
image_info), PANGO_ELLIPSIZE_MIDDLE);
778 gtk_widget_set_visible(ui->
header->
close, visible);
787 char **split = g_strsplit(message,
"\n", -1);
788 char *joined = g_strjoinv(
", ", split);
789 gtk_label_set_markup(GTK_LABEL(ui->
header->
hinter), joined);
void dt_accels_search(dt_accels_t *accels, GtkWindow *main_window, GtkWidget *anchor)
Handle default and user-set shortcuts (accelerators)
GtkWidget * dt_gui_main_window(void)
struct dt_accels_t * dt_gui_get_accels(void)
struct dt_ui_t * dt_gui_get_ui(void)
uint32_t container(dt_lib_module_t *self)
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
int dt_conf_get_bool(const char *name)
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.
void dt_ctl_switch_mode_to(const char *mode)
struct dt_develop_t * dt_dev_get_global(void)
struct dt_lib_t * dt_lib_get_global(void)
struct dt_view_manager_t * dt_view_manager_get_global(void)
struct dt_gui_gtk_t * dt_gui_get_global(void)
void dt_ui_panel_show(dt_ui_t *ui, const dt_ui_panel_t p, gboolean show, gboolean write)
shows/hide a panel
void append_display(GtkWidget **menus, GList **lists, const dt_menus_t index)
void append_edit(GtkWidget **menus, GList **lists, const dt_menus_t index)
void append_file(GtkWidget **menus, GList **lists, const dt_menus_t index)
void append_image(GtkWidget **menus, GList **lists, const dt_menus_t index)
void append_help(GtkWidget **menus, GList **lists, const dt_menus_t index)
gboolean dt_iop_gui_owns_widget(const dt_iop_module_t *module, const GtkWidget *target)
float *const restrict const size_t k
#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.
GtkWidget * dtgtk_resize_handle_new(GtkOrientation orientation, gboolean invert, const char *tooltip, dtgtk_resize_handle_get_size_f get_size, dtgtk_resize_handle_resize_f resize, gpointer user_data)
Create a themed handle widget driving one-dimensional resize gestures.
GtkWidget * dtgtk_side_panel_new()
struct dt_control_signal_t * dt_control_signal_get_global(void)
@ DT_SIGNAL_CONTROL_REDRAW_CENTER
This signal is raised when dt_control_queue_redraw_center() is called. no param, no returned value.
#define DT_DEBUG_CONTROL_SIGNAL_CONNECT(ctlsig, signal, cb, user_data)
const float uint32_t state[4]
GtkWidget * parent_overlay
dt_thumbtable_t * thumbtable_lighttable
GtkWidget * containers[DT_UI_CONTAINER_SIZE]
struct dt_header_t * header
dt_thumbtable_t * thumbtable_filmstrip
GtkWidget * panels[DT_UI_PANEL_SIZE]
void dt_thumbtable_cleanup(dt_thumbtable_t *table)
dt_thumbtable_t * dt_thumbtable_new(dt_thumbtable_mode_t mode)
Create a new thumbnail table widget.
A widget to manage and display image thumbnails in Ansel's lighttable and filmstrip views.
@ DT_THUMBTABLE_MODE_FILMSTRIP
@ DT_THUMBTABLE_MODE_FILEMANAGER
gchar * dt_util_dstrcat(gchar *str, const gchar *format,...)
dt_darkroom_layout_t dt_view_darkroom_get_layout(dt_view_manager_t *vm)
const dt_view_t * dt_view_manager_get_current_view(dt_view_manager_t *vm)
static void _ui_panel_size_changed(GtkAdjustment *adjustment, GParamSpec *pspec, gpointer user_data)
GtkWidget * dt_ui_toast_msg(dt_ui_t *ui)
GtkWidget * dt_ui_center(dt_ui_t *ui)
static void _ui_widget_redraw_callback(gpointer instance, GtkWidget *widget)
gchar * panels_get_view_path(char *suffix)
void dt_ui_cleanup_titlebar(dt_ui_t *ui)
static void _ui_init_panel_right(dt_ui_t *ui, GtkWidget *container)
void _open_accel_search_callback(GtkWidget *w, gpointer data)
static void _ui_init_panel_size(GtkWidget *widget, dt_ui_t *ui)
gchar * panels_get_panel_path(dt_ui_panel_t panel, char *suffix)
void dt_ui_init_titlebar(dt_ui_t *ui)
static GtkWidget * _ui_init_panel_container_bottom(GtkWidget *container)
int dt_ui_panel_get_size(dt_ui_t *ui, const dt_ui_panel_t p)
void dt_ui_set_window_buttons_visible(dt_ui_t *ui, gboolean visible)
gboolean dt_ui_panel_ancestor(dt_ui_t *ui, const dt_ui_panel_t p, GtkWidget *w)
void dt_ui_cleanup_main_table(dt_ui_t *ui)
static void _ui_init_panel_bottom(dt_ui_t *ui, GtkWidget *container)
void _iconify_callback(GtkWidget *w, gpointer data)
void dt_ui_titlebar_pack_start(dt_ui_t *ui, GtkWidget *widget)
GtkWidget * dt_ui_log_msg(dt_ui_t *ui)
void dt_ui_init_global_menu(dt_ui_t *ui)
static void _ui_init_panel_left(dt_ui_t *ui, GtkWidget *container)
static GtkWidget * _ui_init_panel_container_top(GtkWidget *container)
void dt_ui_titlebar_pack_end(dt_ui_t *ui, GtkWidget *widget)
void _close_callback(GtkWidget *w, gpointer data)
GtkWidget * dt_ui_main_window(dt_ui_t *ui)
void dt_ui_restore_panels(dt_ui_t *ui)
static GtkWidget * _ui_init_panel_container_center(GtkWidget *container, gboolean left)
void dt_ui_init_main_table(GtkWidget *parent, dt_ui_t *ui)
void dt_ui_set_image_info_label(dt_ui_t *ui, const char *label)
static gboolean _ui_scroll_target_is_live_widget(const GtkWidget *target, const int side)
Check whether a deferred panel scroll target is still a live module widget.
static void _ui_init_panel_top(dt_ui_t *ui, GtkWidget *container)
void dt_ui_container_add_widget(dt_ui_t *ui, const dt_ui_container_t c, GtkWidget *w)
void dt_hinter_set_message(dt_ui_t *ui, const char *message)
GtkWidget * dt_ui_center_base(dt_ui_t *ui)
static int _panel_handle_resize(int requested_size, gboolean finished, gpointer user_data)
const char * _ui_panel_config_names[]
static int _panel_handle_get_size(gpointer user_data)
GtkBox * dt_ui_get_container(dt_ui_t *ui, const dt_ui_container_t c)
@ DT_UI_CONTAINER_PANEL_LEFT_BOTTOM
@ DT_UI_CONTAINER_PANEL_RIGHT_BOTTOM
@ DT_UI_CONTAINER_PANEL_RIGHT_CENTER
@ DT_UI_CONTAINER_PANEL_LEFT_CENTER
@ DT_UI_CONTAINER_PANEL_LEFT_TOP
@ DT_UI_CONTAINER_PANEL_RIGHT_TOP
@ DT_UI_CONTAINER_PANEL_TOP_SECOND_ROW
#define DT_UI_PANEL_MODULE_SPACING
#define DT_UI_PANEL_SIDE_DEFAULT_SIZE
#define DT_UI_PANEL_BOTTOM_DEFAULT_SIZE