From 78c15641e0aa6f780c6766056a848428ab1d8e60 Mon Sep 17 00:00:00 2001 From: Andre Miranda <andreldm@xfce.org> Date: Mon, 16 Dec 2019 12:34:05 -0300 Subject: [PATCH] Extra padding for Eject button when scrollbar is visible (Bug #15312) It also gets rid of the extra column just for the button and spinner, so no more wasted space! --- thunar/thunar-shortcuts-model.c | 8 ++++++ thunar/thunar-shortcuts-model.h | 1 + thunar/thunar-shortcuts-pane.c | 28 ++++++++++++++++++ thunar/thunar-shortcuts-view.c | 51 ++++++++++++++++++++++++--------- thunar/thunar-shortcuts-view.h | 3 ++ 5 files changed, 77 insertions(+), 14 deletions(-) diff --git a/thunar/thunar-shortcuts-model.c b/thunar/thunar-shortcuts-model.c index aa38b705b..d5e92df26 100644 --- a/thunar/thunar-shortcuts-model.c +++ b/thunar/thunar-shortcuts-model.c @@ -495,6 +495,9 @@ thunar_shortcuts_model_get_column_type (GtkTreeModel *tree_model, case THUNAR_SHORTCUTS_MODEL_COLUMN_BUSY_PULSE: return G_TYPE_UINT; + + case THUNAR_SHORTCUTS_MODEL_COLUMN_HIDDEN: + return G_TYPE_BOOLEAN; } _thunar_assert_not_reached (); @@ -711,6 +714,11 @@ thunar_shortcuts_model_get_value (GtkTreeModel *tree_model, g_value_set_uint (value, shortcut->busy_pulse); break; + case THUNAR_SHORTCUTS_MODEL_COLUMN_HIDDEN: + g_value_init (value, G_TYPE_BOOLEAN); + g_value_set_boolean (value, FALSE); + break; + default: _thunar_assert_not_reached (); } diff --git a/thunar/thunar-shortcuts-model.h b/thunar/thunar-shortcuts-model.h index cb87a1f7f..677e9b431 100644 --- a/thunar/thunar-shortcuts-model.h +++ b/thunar/thunar-shortcuts-model.h @@ -52,6 +52,7 @@ typedef enum THUNAR_SHORTCUTS_MODEL_COLUMN_GROUP, THUNAR_SHORTCUTS_MODEL_COLUMN_BUSY, THUNAR_SHORTCUTS_MODEL_COLUMN_BUSY_PULSE, + THUNAR_SHORTCUTS_MODEL_COLUMN_HIDDEN, THUNAR_SHORTCUTS_MODEL_N_COLUMNS, } ThunarShortcutsModelColumn; diff --git a/thunar/thunar-shortcuts-pane.c b/thunar/thunar-shortcuts-pane.c index f72ec39a5..2cc26a202 100644 --- a/thunar/thunar-shortcuts-pane.c +++ b/thunar/thunar-shortcuts-pane.c @@ -66,6 +66,8 @@ static void thunar_shortcuts_pane_set_ui_manager (ThunarComponen GtkUIManager *ui_manager); static void thunar_shortcuts_pane_action_shortcuts_add (GtkAction *action, ThunarShortcutsPane *shortcuts_pane); +static void thunar_shortcuts_pane_show_shortcuts_view_padding (GtkWidget *widget); +static void thunar_shortcuts_pane_hide_shortcuts_view_padding (GtkWidget *widget); @@ -162,6 +164,8 @@ thunar_shortcuts_pane_side_pane_init (ThunarSidePaneIface *iface) static void thunar_shortcuts_pane_init (ThunarShortcutsPane *shortcuts_pane) { + GtkWidget *vscrollbar; + /* setup the action group for the shortcuts actions */ G_GNUC_BEGIN_IGNORE_DEPRECATIONS shortcuts_pane->action_group = gtk_action_group_new ("ThunarShortcutsPane"); @@ -180,6 +184,14 @@ G_GNUC_END_IGNORE_DEPRECATIONS gtk_container_add (GTK_CONTAINER (shortcuts_pane), shortcuts_pane->view); gtk_widget_show (shortcuts_pane->view); + vscrollbar = gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW (shortcuts_pane)); + g_signal_connect_swapped (G_OBJECT (vscrollbar), "map", + G_CALLBACK (thunar_shortcuts_pane_show_shortcuts_view_padding), + shortcuts_pane->view); + g_signal_connect_swapped (G_OBJECT (vscrollbar), "unmap", + G_CALLBACK (thunar_shortcuts_pane_hide_shortcuts_view_padding), + shortcuts_pane->view); + /* add widget to css class */ gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (shortcuts_pane)), "shortcuts-pane"); @@ -508,3 +520,19 @@ G_GNUC_END_IGNORE_DEPRECATIONS thunar_g_file_list_free (lp); } } + + + +static void +thunar_shortcuts_pane_show_shortcuts_view_padding (GtkWidget *widget) +{ + thunar_shortcuts_view_toggle_padding (THUNAR_SHORTCUTS_VIEW (widget), TRUE); +} + + + +static void +thunar_shortcuts_pane_hide_shortcuts_view_padding (GtkWidget *widget) +{ + thunar_shortcuts_view_toggle_padding (THUNAR_SHORTCUTS_VIEW (widget), FALSE); +} diff --git a/thunar/thunar-shortcuts-view.c b/thunar/thunar-shortcuts-view.c index d5597b371..5e1695b28 100644 --- a/thunar/thunar-shortcuts-view.c +++ b/thunar/thunar-shortcuts-view.c @@ -168,6 +168,9 @@ struct _ThunarShortcutsView ThunarPreferences *preferences; GtkCellRenderer *icon_renderer; + GtkCellRenderer *padding_renderer; + GtkTreeViewColumn *column; + gboolean padding_enabled; ThunarxProviderFactory *provider_factory; @@ -269,7 +272,7 @@ thunar_shortcuts_view_class_init (ThunarShortcutsViewClass *klass) static void thunar_shortcuts_view_init (ThunarShortcutsView *view) { - GtkTreeViewColumn *column, *column_eject; + GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkTreeSelection *selection; @@ -288,18 +291,14 @@ thunar_shortcuts_view_init (ThunarShortcutsView *view) g_signal_connect_swapped (G_OBJECT (view->preferences), "notify::shortcuts-icon-emblems", G_CALLBACK (gtk_widget_queue_draw), view); /* allocate a single column for our renderers */ - column = g_object_new (GTK_TYPE_TREE_VIEW_COLUMN, + column = view->column = g_object_new (GTK_TYPE_TREE_VIEW_COLUMN, "reorderable", FALSE, "resizable", FALSE, "expand", TRUE, - "sizing", GTK_TREE_VIEW_COLUMN_AUTOSIZE, "spacing", 2, NULL); gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); - column_eject = gtk_tree_view_column_new (); - gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_eject); - /* queue a resize on the column whenever the icon size is changed */ view->queue_resize_signal_id = g_signal_connect_swapped (G_OBJECT (view->preferences), "notify::shortcuts-icon-size", G_CALLBACK (gtk_tree_view_column_queue_resize), column); @@ -311,7 +310,7 @@ thunar_shortcuts_view_init (ThunarShortcutsView *view) "ypad", 4, "ellipsize", PANGO_ELLIPSIZE_END, NULL); - gtk_tree_view_column_pack_start (column, renderer, FALSE); + gtk_tree_view_column_pack_end (column, renderer, FALSE); gtk_tree_view_column_set_attributes (column, renderer, "text", THUNAR_SHORTCUTS_MODEL_COLUMN_NAME, "visible", THUNAR_SHORTCUTS_MODEL_COLUMN_IS_HEADER, @@ -354,8 +353,8 @@ thunar_shortcuts_view_init (ThunarShortcutsView *view) /* spinner to indicate (un)mount/eject delay */ renderer = gtk_cell_renderer_spinner_new (); - gtk_tree_view_column_pack_start (column_eject, renderer, FALSE); - gtk_tree_view_column_set_attributes (column_eject, renderer, + gtk_tree_view_column_pack_start (column, renderer, FALSE); + gtk_tree_view_column_set_attributes (column, renderer, "visible", THUNAR_SHORTCUTS_MODEL_COLUMN_BUSY, "active", THUNAR_SHORTCUTS_MODEL_COLUMN_BUSY, "pulse", THUNAR_SHORTCUTS_MODEL_COLUMN_BUSY_PULSE, @@ -364,8 +363,17 @@ thunar_shortcuts_view_init (ThunarShortcutsView *view) /* allocate icon renderer for the eject symbol */ renderer = gtk_cell_renderer_pixbuf_new (); g_object_set (renderer, "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, "icon-name", "media-eject", NULL); - gtk_tree_view_column_pack_start (column_eject, renderer, FALSE); - gtk_tree_view_column_set_attributes (column_eject, renderer, + gtk_tree_view_column_pack_start (column, renderer, FALSE); + gtk_tree_view_column_set_attributes (column, renderer, + "visible", THUNAR_SHORTCUTS_MODEL_COLUMN_CAN_EJECT, + NULL); + + /* padding for the eject symbol so it's not covered by scroll bar */ + view->padding_enabled = FALSE; + view->padding_renderer = gtk_cell_renderer_text_new (); + g_object_set (G_OBJECT (view->padding_renderer), "xpad", 6, NULL); + gtk_tree_view_column_pack_start (column, view->padding_renderer, FALSE); + gtk_tree_view_column_set_attributes (column, view->padding_renderer, "visible", THUNAR_SHORTCUTS_MODEL_COLUMN_CAN_EJECT, NULL); @@ -418,7 +426,7 @@ thunar_shortcuts_view_button_press_event (GtkWidget *widget, GtkTreeIter iter; gboolean result; gboolean can_eject; - gint icon_width, icon_height, column_width; + gint icon_width, column_width; /* reset the pressed button state */ view->pressed_button = -1; @@ -453,8 +461,8 @@ thunar_shortcuts_view_button_press_event (GtkWidget *widget, { /* check if we clicked the eject button area */ column_width = gtk_tree_view_column_get_width (gtk_tree_view_get_column (GTK_TREE_VIEW (view), 0)); - gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &icon_width, &icon_height); - if (event->button == 1 && event->x > column_width) + gtk_icon_size_lookup (GTK_ICON_SIZE_MENU, &icon_width, NULL); + if (event->button == 1 && event->x >= column_width - icon_width - (view->padding_enabled ? 16 : 3)) { /* check if that shortcut actually has an eject button */ model = gtk_tree_view_get_model (GTK_TREE_VIEW (view)); @@ -2197,3 +2205,18 @@ thunar_shortcuts_view_select_by_file (ThunarShortcutsView *view, else gtk_tree_selection_unselect_all (selection); } + + + +void +thunar_shortcuts_view_toggle_padding (ThunarShortcutsView *view, + gboolean enable) +{ + gtk_tree_view_column_set_attributes (view->column, view->padding_renderer, + "visible", enable ? + THUNAR_SHORTCUTS_MODEL_COLUMN_CAN_EJECT : + THUNAR_SHORTCUTS_MODEL_COLUMN_HIDDEN, + NULL); + + view->padding_enabled = enable; +} diff --git a/thunar/thunar-shortcuts-view.h b/thunar/thunar-shortcuts-view.h index 5f81f0b25..3a0a30873 100644 --- a/thunar/thunar-shortcuts-view.h +++ b/thunar/thunar-shortcuts-view.h @@ -41,6 +41,9 @@ GtkWidget *thunar_shortcuts_view_new (void) G_GNUC_MALLOC; void thunar_shortcuts_view_select_by_file (ThunarShortcutsView *view, ThunarFile *file); +void thunar_shortcuts_view_toggle_padding (ThunarShortcutsView *view, + gboolean enable); + G_END_DECLS; #endif /* !__THUNAR_SHORTCUTS_VIEW_H__ */ -- GitLab