54 = {
"header",
"toolbar_top",
"toolbar_bottom",
"left",
"right",
"bottom" };
66 g_snprintf(lay,
sizeof(lay),
"%d/", 0);
70 return g_strdup_printf(
"%s/ui/%s%s", cv->
module_name, lay, suffix);
110 g_return_val_if_fail(GTK_IS_WIDGET(ui->
panels[
p]),
FALSE);
111 return gtk_widget_is_ancestor(w, ui->
panels[
p]) || gtk_widget_is_ancestor(ui->
panels[
p], w);
160 gtk_widget_show_all(w);
167 if(strcmp(gtk_widget_get_name(widget),
"right") == 0)
172 if(
key) gtk_widget_set_size_request(widget, s, -1);
174 else if(strcmp(gtk_widget_get_name(widget),
"left") == 0)
179 if(
key) gtk_widget_set_size_request(widget, s, -1);
181 else if(strcmp(gtk_widget_get_name(widget),
"bottom") == 0)
187 if(
key) gtk_widget_set_size_request(widget, -1, s);
231 GtkWidget *widget = GTK_WIDGET(user_data);
232 const gboolean bottom = (strcmp(gtk_widget_get_name(widget),
"bottom") == 0);
234 gtk_widget_get_size_request(widget, &w, &h);
235 if(bottom)
return (h > 0) ? h : gtk_widget_get_allocated_height(widget);
236 return (w > 0) ? w : gtk_widget_get_allocated_width(widget);
241 GtkWidget *widget = GTK_WIDGET(user_data);
242 const char *
name = gtk_widget_get_name(widget);
244 int win_w = 0, win_h = 0;
245 gtk_window_get_size(GTK_WINDOW(window), &win_w, &win_h);
248 int size = requested_size;
249 if(strcmp(
name,
"right") == 0)
251 size = CLAMP(requested_size, 150, win_w / 2);
253 gtk_widget_set_size_request(widget,
size, -1);
255 else if(strcmp(
name,
"left") == 0)
257 size = CLAMP(requested_size, 150, win_w / 2);
259 gtk_widget_set_size_request(widget,
size, -1);
261 else if(strcmp(
name,
"bottom") == 0)
263 size = CLAMP(requested_size, 48, win_h / 3);
265 gtk_widget_set_size_request(widget, -1,
size);
305 if(!
IS_NULL_PTR(module) &&
module->expander == target) return TRUE;
316 if(module->expander == target || module->header == target)
return TRUE;
326 GtkAllocation allocation;
329 const int side = GPOINTER_TO_INT(user_data);
333 const float height = gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_lower(adjustment);
335 if(
height == last_height[side])
return;
336 last_height[side] =
height;
348 gtk_adjustment_set_value(adjustment, allocation.y);
360 a[0] = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 100, 1, 10, 10));
361 a[1] = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 100, 1, 10, 10));
362 a[2] = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 100, 1, 10, 10));
363 a[3] = GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 100, 1, 10, 10));
366 widget = gtk_scrolled_window_new(a[0], a[1]);
369 gtk_widget_set_name(widget,
"panel-scroll");
370 gtk_widget_set_can_focus(widget,
TRUE);
371 gtk_scrolled_window_set_placement(GTK_SCROLLED_WINDOW(widget),
372 left ? GTK_CORNER_TOP_LEFT : GTK_CORNER_TOP_RIGHT);
374 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
376 g_signal_connect(G_OBJECT(gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(widget))),
"notify::lower",
382 widget = gtk_viewport_new(a[2], a[3]);
383 gtk_viewport_set_shadow_type(GTK_VIEWPORT(widget), GTK_SHADOW_NONE);
384 gtk_container_add(GTK_CONTAINER(
container), widget);
389 widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
390 gtk_widget_set_name(widget,
"plugins_box");
391 gtk_container_add(GTK_CONTAINER(
container), widget);
411 gtk_widget_set_name(widget,
"left");
415 gtk_container_add(GTK_CONTAINER(over), widget);
418 _(
"Drag to resize panel"),
420 gtk_overlay_add_overlay(GTK_OVERLAY(over), handle);
421 gtk_widget_show(handle);
423 gtk_grid_attach(GTK_GRID(
container), over, 1, 1, 1, 1);
442 gtk_widget_set_name(widget,
"right");
446 gtk_container_add(GTK_CONTAINER(over), widget);
449 _(
"Drag to resize panel"),
451 gtk_overlay_add_overlay(GTK_OVERLAY(over), handle);
452 gtk_widget_show(handle);
454 gtk_grid_attach(GTK_GRID(
container), over, 3, 1, 1, 1);
475 gtk_widget_set_hexpand(GTK_WIDGET(widget),
TRUE);
476 gtk_grid_attach(GTK_GRID(
container), widget, 1, 0, 3, 1);
480 gtk_widget_set_name(ui->
top_panel,
"top-first-line");
502 gtk_grid_attach(GTK_GRID(
container), over, 1, 2, 3, 1);
509 _(
"Drag to resize panel"),
512 gtk_overlay_add_overlay(GTK_OVERLAY(over), handle);
513 gtk_widget_show(handle);
519 gtk_widget_queue_draw(widget);
539 gtk_widget_set_name(widget,
"main-widget");
540 gtk_widget_set_hexpand(GTK_WIDGET(widget),
TRUE);
541 gtk_widget_set_vexpand(GTK_WIDGET(widget),
TRUE);
542 gtk_grid_attach(GTK_GRID(
container), widget, 2, 1, 1, 1);
550 gtk_widget_show(ocda);
553 gtk_widget_set_hexpand(ocda,
TRUE);
554 gtk_widget_set_vexpand(ocda,
TRUE);
555 gtk_widget_set_app_paintable(cda,
TRUE);
556 gtk_widget_set_events(cda, GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_KEY_PRESS_MASK
557 | GDK_BUTTON_RELEASE_MASK | GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK
559 gtk_overlay_add_overlay(GTK_OVERLAY(ocda), cda);
566 gtk_box_pack_start(GTK_BOX(widget), ocda,
TRUE,
TRUE, 0);
605 gtk_header_bar_set_decoration_layout(GTK_HEADER_BAR(ui->
header->
titlebar), NULL);
611 gtk_header_bar_set_custom_title(GTK_HEADER_BAR(ui->
header->
titlebar), box);
612 gtk_widget_set_no_show_all(box,
TRUE);
623 gtk_header_bar_pack_start(GTK_HEADER_BAR(ui->
header->
titlebar), widget);
632 gtk_header_bar_pack_end(GTK_HEADER_BAR(ui->
header->
titlebar), widget);
645 gtk_window_close(GTK_WINDOW((
GtkWidget *)data));
650 gtk_window_iconify(GTK_WINDOW((
GtkWidget *)data));
668 gchar *labels [
DT_MENU_LAST] = { _(
"_File"), _(
"_Edit"), _(
"_Selection"), _(
"_Image"), _(
"_Styles"), _(
"_Run"), _(
"_Display"), _(
"_Ateliers"), _(
"_Help") };
692 GtkWidget *search_button = gtk_button_new_from_icon_name(
"edit-find", GTK_ICON_SIZE_SMALL_TOOLBAR);
693 gtk_button_set_label (GTK_BUTTON(search_button), _(
"Search actions..."));
694 gtk_widget_set_halign(search_button, GTK_ALIGN_CENTER);
695 gtk_widget_set_valign(search_button, GTK_ALIGN_CENTER);
696 gtk_widget_set_hexpand(search_button,
TRUE);
697 gtk_widget_set_name(search_button,
"search-button");
700 gtk_widget_show(search_button);
703 ui->
header->
close = gtk_button_new_from_icon_name(
"window-close", GTK_ICON_SIZE_LARGE_TOOLBAR);
705 gtk_widget_set_size_request(ui->
header->
close, 24, 24);
709 ui->
header->
iconify = gtk_button_new_from_icon_name(
"window-minimize", GTK_ICON_SIZE_LARGE_TOOLBAR);
715 ui->
header->
home = gtk_button_new_from_icon_name(
"go-home", GTK_ICON_SIZE_LARGE_TOOLBAR);
716 gtk_widget_set_tooltip_text(ui->
header->
home, _(
"Go back to lighttable"));
718 gtk_widget_set_size_request(ui->
header->
home, 24, 24);
723 GtkWidget *spacer = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
725 gtk_widget_show(spacer);
729 gtk_label_set_ellipsize(GTK_LABEL(ui->
header->
hinter), PANGO_ELLIPSIZE_END);
731 gtk_widget_set_halign(ui->
header->
hinter, GTK_ALIGN_END);
732 gtk_label_set_justify(GTK_LABEL(ui->
header->
hinter), GTK_JUSTIFY_RIGHT);
737 spacer = gtk_separator_new(GTK_ORIENTATION_VERTICAL);
739 gtk_widget_show(spacer);
743 gtk_label_set_ellipsize(GTK_LABEL(ui->
header->
image_info), PANGO_ELLIPSIZE_MIDDLE);
757 gtk_widget_set_visible(ui->
header->
close, visible);
766 char **split = g_strsplit(message,
"\n", -1);
767 char *joined = g_strjoinv(
", ", split);
768 gtk_label_set_markup(GTK_LABEL(ui->
header->
hinter), joined);
void dt_accels_search(dt_accels_t *accels, GtkWindow *main_window, GtkWidget *anchor)
uint32_t container(dt_lib_module_t *self)
GtkWidget * dt_bauhaus_resize_handle_new(GtkOrientation orientation, gboolean invert, const char *tooltip, dt_bauhaus_resize_handle_get_size_f get_size, dt_bauhaus_resize_handle_resize_f resize, gpointer user_data)
Create a themed handle widget driving one-dimensional resize gestures.
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
int dt_conf_get_bool(const char *name)
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)
void dt_ctl_switch_mode_to(const char *mode)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
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 dt_gui_add_class(GtkWidget *widget, const gchar *class_name)
#define DT_GUI_BOX_SPACING
#define DT_PIXEL_APPLY_DPI(value)
void append_image(GtkWidget **menus, GList **lists, const dt_menus_t index)
void append_help(GtkWidget **menus, GList **lists, const dt_menus_t index)
float *const restrict const size_t k
GtkWidget * dtgtk_side_panel_new()
@ 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)
struct _GtkWidget GtkWidget
const float uint32_t state[4]
struct dt_gui_gtk_t * gui
struct dt_control_signal_t * signals
struct dt_develop_t * develop
struct dt_view_manager_t * view_manager
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.
@ 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)
get the toast message widget
GtkWidget * dt_ui_center(dt_ui_t *ui)
get the center drawable widget
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)
get width of right, left, or bottom panel
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)
is the panel ancestor of widget
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)
get the log message widget
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)
get the main window widget
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