[nautilus/wip/exalm/libhandy] Port to HdyTabView and HdyTabBar




commit dcbbb16e1ca7deb7608f224f01b34e8b38a17f5d
Author: Alexander Mikhaylenko <alexm gnome org>
Date:   Wed Sep 9 02:46:32 2020 +0500

    Port to HdyTabView and HdyTabBar

 src/meson.build                     |   2 -
 src/nautilus-application.c          |   3 -
 src/nautilus-notebook.c             | 572 ------------------------------------
 src/nautilus-notebook.h             |  61 ----
 src/nautilus-window-slot-dnd.c      |  38 +--
 src/nautilus-window-slot.c          |  44 ++-
 src/nautilus-window.c               | 474 ++++++++++++------------------
 src/nautilus-window.h               |   2 +-
 src/resources/css/Adwaita.css       |   4 +-
 src/resources/ui/nautilus-window.ui |  41 ++-
 10 files changed, 265 insertions(+), 976 deletions(-)
---
diff --git a/src/meson.build b/src/meson.build
index cbc9ab15e..913ea6101 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -100,8 +100,6 @@ libnautilus_sources = [
   'nautilus-location-entry.h',
   'nautilus-mime-actions.c',
   'nautilus-mime-actions.h',
-  'nautilus-notebook.c',
-  'nautilus-notebook.h',
   'nautilus-other-locations-window-slot.c',
   'nautilus-other-locations-window-slot.h',
   'nautilus-pathbar.c',
diff --git a/src/nautilus-application.c b/src/nautilus-application.c
index 9f7445407..10478da9c 100644
--- a/src/nautilus-application.c
+++ b/src/nautilus-application.c
@@ -34,7 +34,6 @@
 #include <glib/gi18n.h>
 #include <glib/gstdio.h>
 #include <gtk/gtk.h>
-#include <handy.h>
 #include <nautilus-extension.h>
 #include <sys/stat.h>
 #include <sys/types.h>
@@ -1327,8 +1326,6 @@ nautilus_application_startup_common (NautilusApplication *self)
      */
     G_APPLICATION_CLASS (nautilus_application_parent_class)->startup (G_APPLICATION (self));
 
-    hdy_init ();
-
     gtk_window_set_default_icon_name (APPLICATION_ID);
 
     setup_theme_extensions ();
diff --git a/src/nautilus-window-slot-dnd.c b/src/nautilus-window-slot-dnd.c
index 96c5d9cc8..f0acc70cc 100644
--- a/src/nautilus-window-slot-dnd.c
+++ b/src/nautilus-window-slot-dnd.c
@@ -25,7 +25,6 @@
 
 #include <config.h>
 
-#include "nautilus-notebook.h"
 #include "nautilus-application.h"
 #include "nautilus-files-view-dnd.h"
 #include "nautilus-window-slot-dnd.h"
@@ -49,35 +48,9 @@ typedef struct
     NautilusWindowSlot *target_slot;
     GtkWidget *widget;
 
-    gboolean is_notebook;
     guint switch_location_timer;
 } NautilusDragSlotProxyInfo;
 
-static void
-switch_tab (NautilusDragSlotProxyInfo *drag_info)
-{
-    GtkWidget *notebook, *slot;
-    gint idx, n_pages;
-
-    if (drag_info->target_slot == NULL)
-    {
-        return;
-    }
-
-    notebook = gtk_widget_get_ancestor (GTK_WIDGET (drag_info->target_slot), NAUTILUS_TYPE_NOTEBOOK);
-    n_pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook));
-
-    for (idx = 0; idx < n_pages; idx++)
-    {
-        slot = gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), idx);
-        if (NAUTILUS_WINDOW_SLOT (slot) == drag_info->target_slot)
-        {
-            gtk_notebook_set_current_page (GTK_NOTEBOOK (notebook), idx);
-            break;
-        }
-    }
-}
-
 static void
 switch_location (NautilusDragSlotProxyInfo *drag_info)
 {
@@ -106,14 +79,7 @@ slot_proxy_switch_location_timer (gpointer user_data)
 
     drag_info->switch_location_timer = 0;
 
-    if (drag_info->is_notebook)
-    {
-        switch_tab (drag_info);
-    }
-    else
-    {
-        switch_location (drag_info);
-    }
+    switch_location (drag_info);
 
     return FALSE;
 }
@@ -526,8 +492,6 @@ nautilus_drag_slot_proxy_init (GtkWidget          *widget,
     g_object_set_data_full (G_OBJECT (widget), "drag-slot-proxy-data", drag_info,
                             drag_info_free);
 
-    drag_info->is_notebook = (g_object_get_data (G_OBJECT (widget), "nautilus-notebook-tab") != NULL);
-
     if (target_file != NULL)
     {
         drag_info->target_file = nautilus_file_ref (target_file);
diff --git a/src/nautilus-window-slot.c b/src/nautilus-window-slot.c
index b5ff00008..5be145bac 100644
--- a/src/nautilus-window-slot.c
+++ b/src/nautilus-window-slot.c
@@ -61,6 +61,8 @@ enum
     PROP_SELECTION,
     PROP_LOCATION,
     PROP_TOOLTIP,
+    PROP_ALLOW_STOP,
+    PROP_TITLE,
     NUM_PROPERTIES
 };
 
@@ -957,6 +959,18 @@ nautilus_window_slot_get_property (GObject    *object,
         }
         break;
 
+        case PROP_ALLOW_STOP:
+        {
+            g_value_set_boolean (value, nautilus_window_slot_get_allow_stop (self));
+        }
+        break;
+
+        case PROP_TITLE:
+        {
+            g_value_set_string (value, nautilus_window_slot_get_title (self));
+        }
+        break;
+
         default:
         {
             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -1030,6 +1044,7 @@ nautilus_window_slot_constructed (GObject *object)
                             G_BINDING_DEFAULT);
 
     priv->title = g_strdup (_("Loading…"));
+    g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TITLE]);
 }
 
 static void
@@ -3285,6 +3300,20 @@ nautilus_window_slot_class_init (NautilusWindowSlotClass *klass)
                              NULL,
                              G_PARAM_READWRITE);
 
+    properties[PROP_ALLOW_STOP] =
+        g_param_spec_boolean ("allow-stop",
+                              "Allow stop",
+                              "Whether the slot allows stopping the loading",
+                              FALSE,
+                              G_PARAM_READABLE);
+
+    properties[PROP_TITLE] =
+        g_param_spec_string ("title",
+                             "Title",
+                             "The title of the slot",
+                             NULL,
+                             G_PARAM_READABLE);
+
     g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);
 }
 
@@ -3402,6 +3431,8 @@ nautilus_window_slot_update_title (NautilusWindowSlot *self)
     if (do_sync)
     {
         nautilus_window_sync_title (window, self);
+
+        g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TITLE]);
     }
 
     if (title != NULL)
@@ -3435,6 +3466,8 @@ nautilus_window_slot_set_allow_stop (NautilusWindowSlot *self,
 
     window = nautilus_window_slot_get_window (self);
     nautilus_window_sync_allow_stop (window, self);
+
+    g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ALLOW_STOP]);
 }
 
 void
@@ -3665,15 +3698,16 @@ nautilus_window_slot_set_active (NautilusWindowSlot *self,
 
         if (active)
         {
-            int page_num;
+            HdyTabView *tab_view;
+            HdyTabPage *page;
 
             priv = nautilus_window_slot_get_instance_private (self);
             window = priv->window;
-            page_num = gtk_notebook_page_num (GTK_NOTEBOOK (nautilus_window_get_notebook (window)),
-                                              GTK_WIDGET (self));
-            g_assert (page_num >= 0);
 
-            gtk_notebook_set_current_page (GTK_NOTEBOOK (nautilus_window_get_notebook (window)), page_num);
+            tab_view = nautilus_window_get_tab_view (window);
+            page = hdy_tab_view_get_page (tab_view, GTK_WIDGET (self));
+
+            hdy_tab_view_set_selected_page (tab_view, page);
 
             /* sync window to new slot */
             nautilus_window_sync_allow_stop (window, self);
diff --git a/src/nautilus-window.c b/src/nautilus-window.c
index df724f4e7..52b76b28e 100644
--- a/src/nautilus-window.c
+++ b/src/nautilus-window.c
@@ -60,7 +60,6 @@
 #include "nautilus-location-entry.h"
 #include "nautilus-metadata.h"
 #include "nautilus-mime-actions.h"
-#include "nautilus-notebook.h"
 #include "nautilus-other-locations-window-slot.h"
 #include "nautilus-pathbar.h"
 #include "nautilus-profile.h"
@@ -83,7 +82,7 @@ static void nautilus_window_initialize_actions (NautilusWindow *window);
 static GtkWidget *nautilus_window_ensure_location_entry (NautilusWindow *window);
 static void close_slot (NautilusWindow     *window,
                         NautilusWindowSlot *slot,
-                        gboolean            remove_from_notebook);
+                        gboolean            remove_tab);
 
 /* Sanity check: highest mouse button value I could find was 14. 5 is our
  * lower threshold (well-documented to be the one of the button events for the
@@ -100,7 +99,8 @@ struct _NautilusWindow
 {
     HdyApplicationWindow parent_instance;
 
-    GtkWidget *notebook;
+    HdyTabView *tab_view;
+    HdyTabPage *menu_page;
 
     /* available slots, and active slot.
      * Both of them may never be NULL.
@@ -151,7 +151,6 @@ struct _NautilusWindow
     GtkPadController *pad_controller;
 
     GtkGesture *multi_press_gesture;
-    GtkGesture *notebook_multi_press_gesture;
 };
 
 enum
@@ -202,13 +201,15 @@ action_close_current_view (GSimpleAction *action,
                            GVariant      *state,
                            gpointer       user_data)
 {
-    NautilusWindow *window;
-    NautilusWindowSlot *slot;
+    NautilusWindow *window = user_data;
+    HdyTabPage *page = window->menu_page;
 
-    window = NAUTILUS_WINDOW (user_data);
-    slot = nautilus_window_get_active_slot (window);
+    if (!page)
+    {
+        page = hdy_tab_view_get_selected_page (window->tab_view);
+    }
 
-    nautilus_window_slot_close (window, slot);
+    hdy_tab_view_close_page (window->tab_view, page);
 }
 
 static void
@@ -328,34 +329,20 @@ action_enter_location (GSimpleAction *action,
     nautilus_window_ensure_location_entry (window);
 }
 
-static void
-action_tab_previous (GSimpleAction *action,
-                     GVariant      *state,
-                     gpointer       user_data)
-{
-    NautilusWindow *window = user_data;
-
-    nautilus_notebook_prev_page (NAUTILUS_NOTEBOOK (window->notebook));
-}
-
-static void
-action_tab_next (GSimpleAction *action,
-                 GVariant      *state,
-                 gpointer       user_data)
-{
-    NautilusWindow *window = user_data;
-
-    nautilus_notebook_next_page (NAUTILUS_NOTEBOOK (window->notebook));
-}
-
 static void
 action_tab_move_left (GSimpleAction *action,
                       GVariant      *state,
                       gpointer       user_data)
 {
     NautilusWindow *window = user_data;
+    HdyTabPage *page = window->menu_page;
+
+    if (!page)
+    {
+        page = hdy_tab_view_get_selected_page (window->tab_view);
+    }
 
-    nautilus_notebook_reorder_current_child_relative (NAUTILUS_NOTEBOOK (window->notebook), -1);
+    hdy_tab_view_reorder_backward (window->tab_view, page);
 }
 
 static void
@@ -364,8 +351,14 @@ action_tab_move_right (GSimpleAction *action,
                        gpointer       user_data)
 {
     NautilusWindow *window = user_data;
+    HdyTabPage *page = window->menu_page;
 
-    nautilus_notebook_reorder_current_child_relative (NAUTILUS_NOTEBOOK (window->notebook), 1);
+    if (!page)
+    {
+        page = hdy_tab_view_get_selected_page (window->tab_view);
+    }
+
+    hdy_tab_view_reorder_forward (window->tab_view, page);
 }
 
 static void
@@ -374,15 +367,14 @@ action_go_to_tab (GSimpleAction *action,
                   gpointer       user_data)
 {
     NautilusWindow *window = NAUTILUS_WINDOW (user_data);
-    GtkNotebook *notebook;
     gint16 num;
 
-    notebook = GTK_NOTEBOOK (window->notebook);
-
     num = g_variant_get_int32 (value);
-    if (num < gtk_notebook_get_n_pages (notebook))
+    if (num < hdy_tab_view_get_n_pages (window->tab_view))
     {
-        gtk_notebook_set_current_page (notebook, num);
+        HdyTabPage *page = hdy_tab_view_get_nth_page (window->tab_view, num);
+
+        hdy_tab_view_set_selected_page (window->tab_view, page);
     }
 }
 
@@ -479,15 +471,45 @@ on_slot_selection_changed (NautilusWindowSlot *slot,
 }
 
 static void
-notebook_switch_page_cb (GtkNotebook    *notebook,
-                         GtkWidget      *page,
-                         unsigned int    page_num,
-                         NautilusWindow *window)
+tab_view_setup_menu_cb (HdyTabView     *tab_view,
+                        HdyTabPage     *page,
+                        NautilusWindow *window)
 {
+    GAction *move_tab_left_action;
+    GAction *move_tab_right_action;
+    int position, n_pages;
+
+    if (page)
+    {
+        position = hdy_tab_view_get_page_position (tab_view, page);
+        n_pages = hdy_tab_view_get_n_pages (tab_view);
+    }
+
+    move_tab_left_action = g_action_map_lookup_action (G_ACTION_MAP (window),
+                                                       "tab-move-left");
+    move_tab_right_action = g_action_map_lookup_action (G_ACTION_MAP (window),
+                                                        "tab-move-right");
+
+    g_simple_action_set_enabled (G_SIMPLE_ACTION (move_tab_left_action),
+                                 !page || position > 0);
+    g_simple_action_set_enabled (G_SIMPLE_ACTION (move_tab_right_action),
+                                 !page || position < n_pages - 1);
+
+    window->menu_page = page;
+}
+
+static void
+tab_view_notify_selected_page_cb (HdyTabView     *tab_view,
+                                  GParamSpec     *pspec,
+                                  NautilusWindow *window)
+{
+    HdyTabPage *page;
     NautilusWindowSlot *slot;
     GtkWidget *widget;
 
-    widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->notebook), page_num);
+    page = hdy_tab_view_get_selected_page (tab_view);
+    widget = hdy_tab_page_get_child (page);
+
     g_assert (widget != NULL);
 
     /* find slot corresponding to the target page */
@@ -574,28 +596,80 @@ replace_active_slot (NautilusWindow          *window,
     return new_slot;
 }
 
+static gboolean
+location_to_tooltip (GBinding           *binding,
+                     const GValue       *input,
+                     GValue             *output,
+                     NautilusWindowSlot *slot)
+{
+    GFile *location = g_value_get_object (input);
+    g_autofree gchar *location_name = NULL;
+
+    if (!location)
+    {
+        return TRUE;
+    }
+
+    /* Set the tooltip on the label's parent (the tab label hbox),
+     * so it covers all of the tab label.
+     */
+    location_name = g_file_get_parse_name (location);
+
+    if (eel_uri_is_search (location_name))
+    {
+        g_value_set_string (output, nautilus_window_slot_get_title (slot));
+    }
+    else
+    {
+        g_value_set_string (output, location_name);
+    }
+
+    return TRUE;
+}
+
 void
 nautilus_window_initialize_slot (NautilusWindow          *window,
                                  NautilusWindowSlot      *slot,
                                  NautilusWindowOpenFlags  flags)
 {
+    HdyTabPage *page;
+
     g_assert (NAUTILUS_IS_WINDOW (window));
     g_assert (NAUTILUS_IS_WINDOW_SLOT (slot));
 
     connect_slot (window, slot);
 
-    g_signal_handlers_block_by_func (window->notebook,
-                                     G_CALLBACK (notebook_switch_page_cb),
-                                     window);
-    nautilus_notebook_add_tab (NAUTILUS_NOTEBOOK (window->notebook),
-                               slot,
-                               (flags & NAUTILUS_WINDOW_OPEN_SLOT_APPEND) != 0 ?
-                               -1 :
-                               gtk_notebook_get_current_page (GTK_NOTEBOOK (window->notebook)) + 1,
-                               FALSE);
-    g_signal_handlers_unblock_by_func (window->notebook,
-                                       G_CALLBACK (notebook_switch_page_cb),
-                                       window);
+    if ((flags & NAUTILUS_WINDOW_OPEN_SLOT_APPEND) != 0)
+    {
+        page = hdy_tab_view_append (window->tab_view, GTK_WIDGET (slot));
+    }
+    else
+    {
+        HdyTabPage *current = hdy_tab_view_get_selected_page (window->tab_view);
+
+        if (current)
+        {
+            int position = hdy_tab_view_get_page_position (window->tab_view, current) + 1;
+
+            page = hdy_tab_view_insert (window->tab_view, GTK_WIDGET (slot), position);
+        }
+        else
+        {
+            page = hdy_tab_view_prepend (window->tab_view, GTK_WIDGET (slot));
+        }
+    }
+
+    g_object_bind_property (slot, "allow-stop",
+                            page, "loading",
+                            G_BINDING_SYNC_CREATE);
+    g_object_bind_property (slot, "title",
+                            page, "title",
+                            G_BINDING_SYNC_CREATE);
+    g_object_bind_property_full (slot, "location",
+                                 page, "tooltip",
+                                 G_BINDING_SYNC_CREATE,
+                                 (GBindingTransformFunc) location_to_tooltip,
+                                 NULL, window, NULL);
 
     window->slots = g_list_append (window->slots, slot);
     g_signal_emit (window, signals[SLOT_ADDED], 0, slot);
@@ -748,14 +822,10 @@ location_entry_location_changed_callback (GtkWidget      *widget,
 static void
 close_slot (NautilusWindow     *window,
             NautilusWindowSlot *slot,
-            gboolean            remove_from_notebook)
+            gboolean            remove_tab)
 {
-    int page_num;
-    GtkNotebook *notebook;
-
     g_assert (NAUTILUS_IS_WINDOW_SLOT (slot));
 
-
     DEBUG ("Closing slot %p", slot);
 
     disconnect_slot (window, slot);
@@ -764,15 +834,12 @@ close_slot (NautilusWindow     *window,
 
     g_signal_emit (window, signals[SLOT_REMOVED], 0, slot);
 
-    notebook = GTK_NOTEBOOK (window->notebook);
-
-    if (remove_from_notebook)
+    if (remove_tab)
     {
-        page_num = gtk_notebook_page_num (notebook, GTK_WIDGET (slot));
-        g_assert (page_num >= 0);
+        HdyTabPage *page = hdy_tab_view_get_page (window->tab_view,
+                                                  GTK_WIDGET (slot));
 
-        /* this will call gtk_widget_destroy on the slot */
-        gtk_notebook_remove_page (notebook, page_num);
+        hdy_tab_view_close_page (window->tab_view, page);
     }
 }
 
@@ -864,22 +931,15 @@ nautilus_window_sync_allow_stop (NautilusWindow     *window,
         {
             update_cursor (window);
         }
-
-        /* Avoid updating the notebook if we are calling on dispose or
-         * on removal of a notebook tab */
-        if (nautilus_notebook_contains_slot (NAUTILUS_NOTEBOOK (window->notebook), slot))
-        {
-            nautilus_notebook_sync_loading (NAUTILUS_NOTEBOOK (window->notebook), slot);
-        }
     }
 }
 
-GtkWidget *
-nautilus_window_get_notebook (NautilusWindow *window)
+HdyTabView *
+nautilus_window_get_tab_view (NautilusWindow *window)
 {
     g_return_val_if_fail (NAUTILUS_IS_WINDOW (window), NULL);
 
-    return window->notebook;
+    return window->tab_view;
 }
 
 static gboolean
@@ -1831,143 +1891,6 @@ path_bar_location_changed_callback (GtkWidget      *widget,
     nautilus_window_open_location_full (window, location, 0, NULL, NULL);
 }
 
-static void
-notebook_popup_menu_new_tab_cb (GtkMenuItem *menuitem,
-                                gpointer     user_data)
-{
-    NautilusWindow *window = user_data;
-
-    nautilus_window_new_tab (window);
-}
-
-static void
-notebook_popup_menu_move_left_cb (GtkMenuItem *menuitem,
-                                  gpointer     user_data)
-{
-    NautilusWindow *window = user_data;
-
-    nautilus_notebook_reorder_current_child_relative (NAUTILUS_NOTEBOOK (window->notebook), -1);
-}
-
-static void
-notebook_popup_menu_move_right_cb (GtkMenuItem *menuitem,
-                                   gpointer     user_data)
-{
-    NautilusWindow *window = user_data;
-
-
-    nautilus_notebook_reorder_current_child_relative (NAUTILUS_NOTEBOOK (window->notebook), 1);
-}
-
-static void
-notebook_popup_menu_close_cb (GtkMenuItem *menuitem,
-                              gpointer     user_data)
-{
-    NautilusWindow *window = user_data;
-    NautilusWindowSlot *slot;
-
-    slot = window->active_slot;
-    nautilus_window_slot_close (window, slot);
-}
-
-static void
-notebook_popup_menu_show (NautilusWindow *window,
-                          const GdkEvent *event)
-{
-    GtkWidget *popup;
-    GtkWidget *item;
-    gboolean can_move_left, can_move_right;
-    NautilusNotebook *notebook;
-
-    notebook = NAUTILUS_NOTEBOOK (window->notebook);
-
-    can_move_left = nautilus_notebook_can_reorder_current_child_relative (notebook, -1);
-    can_move_right = nautilus_notebook_can_reorder_current_child_relative (notebook, 1);
-
-    popup = gtk_menu_new ();
-
-    item = gtk_menu_item_new_with_mnemonic (_("_New Tab"));
-    g_signal_connect (item, "activate",
-                      G_CALLBACK (notebook_popup_menu_new_tab_cb),
-                      window);
-    gtk_menu_shell_append (GTK_MENU_SHELL (popup),
-                           item);
-
-    gtk_menu_shell_append (GTK_MENU_SHELL (popup),
-                           gtk_separator_menu_item_new ());
-
-    item = gtk_menu_item_new_with_mnemonic (_("Move Tab _Left"));
-    g_signal_connect (item, "activate",
-                      G_CALLBACK (notebook_popup_menu_move_left_cb),
-                      window);
-    gtk_menu_shell_append (GTK_MENU_SHELL (popup),
-                           item);
-    gtk_widget_set_sensitive (item, can_move_left);
-
-    item = gtk_menu_item_new_with_mnemonic (_("Move Tab _Right"));
-    g_signal_connect (item, "activate",
-                      G_CALLBACK (notebook_popup_menu_move_right_cb),
-                      window);
-    gtk_menu_shell_append (GTK_MENU_SHELL (popup),
-                           item);
-    gtk_widget_set_sensitive (item, can_move_right);
-
-    gtk_menu_shell_append (GTK_MENU_SHELL (popup),
-                           gtk_separator_menu_item_new ());
-
-    item = gtk_menu_item_new_with_mnemonic (_("_Close Tab"));
-    g_signal_connect (item, "activate",
-                      G_CALLBACK (notebook_popup_menu_close_cb), window);
-    gtk_menu_shell_append (GTK_MENU_SHELL (popup),
-                           item);
-
-    gtk_widget_show_all (popup);
-
-    gtk_menu_popup_at_pointer (GTK_MENU (popup), event);
-}
-
-/* emitted when the user clicks the "close" button of tabs */
-static void
-notebook_tab_close_requested (NautilusNotebook   *notebook,
-                              NautilusWindowSlot *slot,
-                              NautilusWindow     *window)
-{
-    nautilus_window_slot_close (window, slot);
-}
-
-static void
-notebook_button_press_cb (GtkGestureMultiPress *gesture,
-                          gint                  n_press,
-                          gdouble               x,
-                          gdouble               y,
-                          gpointer              user_data)
-{
-    NautilusWindow *window;
-    GdkEventSequence *sequence;
-    const GdkEvent *event;
-
-    window = NAUTILUS_WINDOW (user_data);
-
-    if (nautilus_notebook_content_area_hit (NAUTILUS_NOTEBOOK (window->notebook), x, y))
-    {
-        return;
-    }
-
-    sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (gesture));
-    event = gtk_gesture_get_last_event (GTK_GESTURE (gesture), sequence);
-
-    notebook_popup_menu_show (window, event);
-}
-
-static gboolean
-notebook_popup_menu_cb (GtkWidget *widget,
-                        gpointer   user_data)
-{
-    NautilusWindow *window = user_data;
-    notebook_popup_menu_show (window, NULL);
-    return TRUE;
-}
-
 GtkWidget *
 nautilus_window_get_toolbar (NautilusWindow *window)
 {
@@ -2002,16 +1925,31 @@ setup_toolbar (NautilusWindow *window)
                              G_CALLBACK (location_entry_cancel_callback), window, 0);
 }
 
+static gboolean
+tab_view_close_page_cb (HdyTabView     *view,
+                        HdyTabPage     *page,
+                        NautilusWindow *window)
+{
+    NautilusWindowSlot *slot;
+
+    slot = NAUTILUS_WINDOW_SLOT (hdy_tab_page_get_child (page));
+
+    nautilus_window_slot_close (window, slot);
+
+    return GDK_EVENT_PROPAGATE;
+}
+
 static void
-notebook_page_removed_cb (GtkNotebook *notebook,
-                          GtkWidget   *page,
-                          guint        page_num,
-                          gpointer     user_data)
+tab_view_page_detached_cb (HdyTabView     *tab_view,
+                           HdyTabPage     *page,
+                           gint            position,
+                           NautilusWindow *window)
 {
-    NautilusWindow *window = user_data;
-    NautilusWindowSlot *slot = NAUTILUS_WINDOW_SLOT (page), *next_slot;
+    NautilusWindowSlot *slot, *next_slot;
     gboolean dnd_slot;
 
+    slot = NAUTILUS_WINDOW_SLOT (hdy_tab_page_get_child (page));
+
     dnd_slot = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (slot), "dnd-window-slot"));
     if (!dnd_slot)
     {
@@ -2028,16 +1966,16 @@ notebook_page_removed_cb (GtkNotebook *notebook,
 }
 
 static void
-notebook_page_added_cb (GtkNotebook *notebook,
-                        GtkWidget   *page,
-                        guint        page_num,
-                        gpointer     user_data)
+tab_view_page_attached_cb (HdyTabView     *tab_view,
+                           HdyTabPage     *page,
+                           gint            position,
+                           NautilusWindow *window)
 {
-    NautilusWindow *window = user_data;
-    NautilusWindowSlot *slot = NAUTILUS_WINDOW_SLOT (page);
-    NautilusWindowSlot *dummy_slot;
+    NautilusWindowSlot *slot, *dummy_slot;
     gboolean dnd_slot;
 
+    slot = NAUTILUS_WINDOW_SLOT (hdy_tab_page_get_child (page));
+
     dnd_slot = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (slot), "dnd-window-slot"));
     if (!dnd_slot)
     {
@@ -2062,59 +2000,44 @@ notebook_page_added_cb (GtkNotebook *notebook,
     gtk_widget_show (GTK_WIDGET (window));
 }
 
-static GtkNotebook *
-notebook_create_window_cb (GtkNotebook *notebook,
-                           GtkWidget   *page,
-                           gint         x,
-                           gint         y,
-                           gpointer     user_data)
+static HdyTabView *
+tab_view_create_window_cb (HdyTabView     *tab_view,
+                           NautilusWindow *window)
 {
     NautilusApplication *app;
     NautilusWindow *new_window;
-    NautilusWindowSlot *slot;
-
-    if (!NAUTILUS_IS_WINDOW_SLOT (page))
-    {
-        return NULL;
-    }
 
     app = NAUTILUS_APPLICATION (g_application_get_default ());
     new_window = nautilus_application_create_window
-                     (app, gtk_widget_get_screen (GTK_WIDGET (notebook)));
-
-    slot = NAUTILUS_WINDOW_SLOT (page);
-    g_object_set_data (G_OBJECT (slot), "dnd-window-slot",
-                       GINT_TO_POINTER (TRUE));
+                     (app, gtk_widget_get_screen (GTK_WIDGET (tab_view)));
 
     gtk_window_set_position (GTK_WINDOW (new_window), GTK_WIN_POS_MOUSE);
 
-    return GTK_NOTEBOOK (new_window->notebook);
+    gtk_window_present (GTK_WINDOW (new_window));
+
+    return new_window->tab_view;
 }
 
 static void
-setup_notebook (NautilusWindow *window)
+setup_tab_view (NautilusWindow *window)
 {
-    g_signal_connect (window->notebook, "tab-close-request",
-                      G_CALLBACK (notebook_tab_close_requested),
-                      window);
-    g_signal_connect (window->notebook, "popup-menu",
-                      G_CALLBACK (notebook_popup_menu_cb),
+    g_signal_connect (window->tab_view, "close-page",
+                      G_CALLBACK (tab_view_close_page_cb),
                       window);
-    g_signal_connect (window->notebook, "switch-page",
-                      G_CALLBACK (notebook_switch_page_cb),
+    g_signal_connect (window->tab_view, "setup-menu",
+                      G_CALLBACK (tab_view_setup_menu_cb),
                       window);
-    g_signal_connect (window->notebook, "create-window",
-                      G_CALLBACK (notebook_create_window_cb),
+    g_signal_connect (window->tab_view, "notify::selected-page",
+                      G_CALLBACK (tab_view_notify_selected_page_cb),
                       window);
-    g_signal_connect (window->notebook, "page-added",
-                      G_CALLBACK (notebook_page_added_cb),
+    g_signal_connect (window->tab_view, "create-window",
+                      G_CALLBACK (tab_view_create_window_cb),
                       window);
-    g_signal_connect (window->notebook, "page-removed",
-                      G_CALLBACK (notebook_page_removed_cb),
+    g_signal_connect (window->tab_view, "page-attached",
+                      G_CALLBACK (tab_view_page_attached_cb),
                       window);
-
-    g_signal_connect (window->notebook_multi_press_gesture, "pressed",
-                      G_CALLBACK (notebook_button_press_cb),
+    g_signal_connect (window->tab_view, "page-detached",
+                      G_CALLBACK (tab_view_page_detached_cb),
                       window);
 }
 
@@ -2134,8 +2057,6 @@ const GActionEntry win_entries[] =
     /* Only accesible by shorcuts */
     { "close-current-view", action_close_current_view },
     { "go-home", action_go_home },
-    { "tab-previous", action_tab_previous },
-    { "tab-next", action_tab_next },
     { "tab-move-left", action_tab_move_left },
     { "tab-move-right", action_tab_move_right },
     { "prompt-root-location", action_prompt_for_location_root },
@@ -2195,8 +2116,6 @@ nautilus_window_initialize_actions (NautilusWindow *window)
     nautilus_application_set_accelerator (app, "win.bookmark-current-location", "<control>d");
     nautilus_application_set_accelerator (app, "win.up", "<alt>Up");
     nautilus_application_set_accelerator (app, "win.go-home", "<alt>Home");
-    nautilus_application_set_accelerator (app, "win.tab-previous", "<control>Page_Up");
-    nautilus_application_set_accelerator (app, "win.tab-next", "<control>Page_Down");
     nautilus_application_set_accelerator (app, "win.tab-move-left", "<shift><control>Page_Up");
     nautilus_application_set_accelerator (app, "win.tab-move-right", "<shift><control>Page_Down");
     nautilus_application_set_accelerators (app, "win.prompt-root-location", prompt_root_location_accels);
@@ -2246,7 +2165,7 @@ nautilus_window_constructed (GObject *self)
                                  NAUTILUS_WINDOW_DEFAULT_WIDTH,
                                  NAUTILUS_WINDOW_DEFAULT_HEIGHT);
 
-    setup_notebook (window);
+    setup_tab_view (window);
     nautilus_window_set_up_sidebar (window);
 
 
@@ -2333,18 +2252,6 @@ nautilus_window_destroy (GtkWidget *object)
     GTK_WIDGET_CLASS (nautilus_window_parent_class)->destroy (object);
 }
 
-static void
-nautilus_window_dispose (GObject *object)
-{
-    NautilusWindow *window;
-
-    window = NAUTILUS_WINDOW (object);
-
-    g_clear_object (&window->notebook_multi_press_gesture);
-
-    G_OBJECT_CLASS (nautilus_window_parent_class)->dispose (object);
-}
-
 static void
 nautilus_window_finalize (GObject *object)
 {
@@ -2552,8 +2459,6 @@ nautilus_window_sync_title (NautilusWindow     *window,
     {
         gtk_window_set_title (GTK_WINDOW (window), nautilus_window_slot_get_title (slot));
     }
-
-    nautilus_notebook_sync_tab_label (NAUTILUS_NOTEBOOK (window->notebook), slot);
 }
 
 #ifdef GDK_WINDOWING_WAYLAND
@@ -2770,7 +2675,6 @@ nautilus_window_init (NautilusWindow *window)
     GtkWindowGroup *window_group;
 
     g_type_ensure (NAUTILUS_TYPE_TOOLBAR);
-    g_type_ensure (NAUTILUS_TYPE_NOTEBOOK);
     gtk_widget_init_template (GTK_WIDGET (window));
 
     g_signal_connect (window, "notify::is-maximized",
@@ -2807,13 +2711,6 @@ nautilus_window_init (NautilusWindow *window)
 
     g_signal_connect (window->multi_press_gesture, "pressed",
                       G_CALLBACK (on_multi_press_gesture_pressed), NULL);
-
-    window->notebook_multi_press_gesture = gtk_gesture_multi_press_new (window->notebook);
-
-    gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (window->notebook_multi_press_gesture),
-                                                GTK_PHASE_CAPTURE);
-    gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (window->notebook_multi_press_gesture),
-                                   GDK_BUTTON_SECONDARY);
 }
 
 static void
@@ -2822,7 +2719,6 @@ nautilus_window_class_init (NautilusWindowClass *class)
     GObjectClass *oclass = G_OBJECT_CLASS (class);
     GtkWidgetClass *wclass = GTK_WIDGET_CLASS (class);
 
-    oclass->dispose = nautilus_window_dispose;
     oclass->finalize = nautilus_window_finalize;
     oclass->constructed = nautilus_window_constructed;
 
@@ -2840,7 +2736,7 @@ nautilus_window_class_init (NautilusWindowClass *class)
     gtk_widget_class_bind_template_child (wclass, NautilusWindow, sidebar);
     gtk_widget_class_bind_template_child (wclass, NautilusWindow, places_sidebar);
     gtk_widget_class_bind_template_child (wclass, NautilusWindow, main_view);
-    gtk_widget_class_bind_template_child (wclass, NautilusWindow, notebook);
+    gtk_widget_class_bind_template_child (wclass, NautilusWindow, tab_view);
     gtk_widget_class_bind_template_child (wclass, NautilusWindow, in_app_notification_undo);
     gtk_widget_class_bind_template_child (wclass, NautilusWindow, in_app_notification_undo_label);
     gtk_widget_class_bind_template_child (wclass, NautilusWindow, in_app_notification_undo_undo_button);
diff --git a/src/nautilus-window.h b/src/nautilus-window.h
index 83cc99a27..b65592a4f 100644
--- a/src/nautilus-window.h
+++ b/src/nautilus-window.h
@@ -83,7 +83,7 @@ void     nautilus_window_back_or_forward      (NautilusWindow *window,
                                                NautilusWindowOpenFlags flags);
 void nautilus_window_reset_menus (NautilusWindow *window);
 
-GtkWidget *         nautilus_window_get_notebook (NautilusWindow *window);
+HdyTabView * nautilus_window_get_tab_view (NautilusWindow *window);
 
 NautilusWindowOpenFlags nautilus_event_get_window_open_flags   (void);
 void     nautilus_window_show_about_dialog    (NautilusWindow *window);
diff --git a/src/resources/css/Adwaita.css b/src/resources/css/Adwaita.css
index 546d3e98a..4097944d1 100644
--- a/src/resources/css/Adwaita.css
+++ b/src/resources/css/Adwaita.css
@@ -1,6 +1,4 @@
-.nautilus-window,
-.nautilus-window notebook,
-.nautilus-window notebook > stack {
+.nautilus-window {
     background: @theme_base_color;
 }
 
diff --git a/src/resources/ui/nautilus-window.ui b/src/resources/ui/nautilus-window.ui
index 97fce2573..53f9f6951 100644
--- a/src/resources/ui/nautilus-window.ui
+++ b/src/resources/ui/nautilus-window.ui
@@ -47,10 +47,21 @@
               <object class="GtkOverlay" id="main_view">
                 <property name="visible">True</property>
                 <child>
-                  <object class="NautilusNotebook" id="notebook">
+                  <object class="GtkBox">
                     <property name="visible">True</property>
-                    <property name="show-tabs">False</property>
-                    <property name="show-border">False</property>
+                    <property name="orientation">vertical</property>
+                    <child>
+                      <object class="HdyTabBar">
+                        <property name="visible">True</property>
+                        <property name="view">tab_view</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="HdyTabView" id="tab_view">
+                        <property name="visible">True</property>
+                        <property name="menu-model">tab_menu</property>
+                      </object>
+                    </child>
                   </object>
                 </child>
                 <child type="overlay">
@@ -200,4 +211,28 @@
       </object>
     </child>
   </template>
+  <menu id="tab_menu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_New Tab</attribute>
+        <attribute name="action">win.new-tab</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">Move Tab _Left</attribute>
+        <attribute name="action">win.tab-move-left</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Move Tab _Right</attribute>
+        <attribute name="action">win.tab-move-right</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Close Tab</attribute>
+        <attribute name="action">win.close-current-view</attribute>
+      </item>
+    </section>
+  </menu>
 </interface>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]