[baobab/wip/cdavis/menu-to-popover: 1/2] window: Use popover instead of GtkMenu




commit 959ef4b4768d6a192f715115029dd3d15d40069f
Author: Christopher Davis <christopherdavis gnome org>
Date:   Tue Sep 21 22:12:44 2021 -0700

    window: Use popover instead of GtkMenu
    
    GtkMenu is gone in GTK4

 data/baobab.gresource.xml       |  1 +
 data/ui/baobab-main-window.ui   | 32 ++---------------
 data/ui/baobab-treeview-menu.ui | 19 ++++++++++
 src/baobab-window.vala          | 78 +++++++++++++++++++++--------------------
 4 files changed, 63 insertions(+), 67 deletions(-)
---
diff --git a/data/baobab.gresource.xml b/data/baobab.gresource.xml
index d61d46c..2f1709f 100644
--- a/data/baobab.gresource.xml
+++ b/data/baobab.gresource.xml
@@ -9,6 +9,7 @@
     <file compressed="true">ui/baobab-main-window.ui</file>
     <file compressed="true">ui/baobab-pathbutton.ui</file>
     <file compressed="true">ui/baobab-preferences-dialog.ui</file>
+    <file compressed="true">ui/baobab-treeview-menu.ui</file>
     <file compressed="true">gtk/help-overlay.ui</file>
     <file compressed="true">gtk/menus.ui</file>
     <file compressed="true">icons/scalable/actions/view-ringschart-symbolic.svg</file>
diff --git a/data/ui/baobab-main-window.ui b/data/ui/baobab-main-window.ui
index b677cb5..e1cd76a 100644
--- a/data/ui/baobab-main-window.ui
+++ b/data/ui/baobab-main-window.ui
@@ -31,36 +31,10 @@
       </item>
     </section>
   </menu>
-  <object class="GtkMenu" id="treeview_popup_menu">
-    <property name="visible">True</property>
+  <object class="GtkPopoverMenu" id="treeview_popover_menu">
     <property name="can_focus">False</property>
-    <child>
-      <object class="GtkMenuItem" id="treeview_popup_open">
-        <property name="use_action_appearance">False</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label" translatable="yes">_Open Folder</property>
-        <property name="use_underline">True</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="treeview_popup_copy">
-        <property name="use_action_appearance">False</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label" translatable="yes">_Copy Path to Clipboard</property>
-        <property name="use_underline">True</property>
-      </object>
-    </child>
-    <child>
-      <object class="GtkMenuItem" id="treeview_popup_trash">
-        <property name="use_action_appearance">False</property>
-        <property name="visible">True</property>
-        <property name="can_focus">False</property>
-        <property name="label" translatable="yes">Mo_ve to Trash</property>
-        <property name="use_underline">True</property>
-      </object>
-    </child>
+    <property name="relative-to">treeview</property>
+    <property name="position">bottom</property>
   </object>
   <template class="BaobabWindow" parent="HdyApplicationWindow">
     <property name="title" translatable="yes">Disk Usage Analyzer</property>
diff --git a/data/ui/baobab-treeview-menu.ui b/data/ui/baobab-treeview-menu.ui
new file mode 100644
index 0000000..26ad7db
--- /dev/null
+++ b/data/ui/baobab-treeview-menu.ui
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <menu id="treeview_menu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Open Folder</attribute>
+        <attribute name="action">win.treeview-open-folder</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">_Copy Path to Clipboard</attribute>
+        <attribute name="action">win.treeview-copy</attribute>
+      </item>
+      <item>
+        <attribute name="label" translatable="yes">Mo_ve to Trash</attribute>
+        <attribute name="action">win.treeview-trash</attribute>
+      </item>
+    </section>
+  </menu>
+</interface>
diff --git a/src/baobab-window.vala b/src/baobab-window.vala
index fb978a1..3126b20 100644
--- a/src/baobab-window.vala
+++ b/src/baobab-window.vala
@@ -57,13 +57,7 @@ namespace Baobab {
         [GtkChild]
         private unowned Gtk.TreeView treeview;
         [GtkChild]
-        private unowned Gtk.Menu treeview_popup_menu;
-        [GtkChild]
-        private unowned Gtk.MenuItem treeview_popup_open;
-        [GtkChild]
-        private unowned Gtk.MenuItem treeview_popup_copy;
-        [GtkChild]
-        private unowned Gtk.MenuItem treeview_popup_trash;
+        private unowned Gtk.PopoverMenu treeview_popover_menu;
         [GtkChild]
         private unowned Gtk.TreeViewColumn size_column;
         [GtkChild]
@@ -97,7 +91,10 @@ namespace Baobab {
             { "clear-recent", on_clear_recent },
             { "show-preferences", on_show_preferences },
             { "help", on_help_activate },
-            { "about", on_about_activate }
+            { "about", on_about_activate },
+            { "treeview-open-folder", on_treeview_open_folder },
+            { "treeview-copy", on_treeview_copy },
+            { "treeview-trash", on_treeview_trash }
         };
 
         protected struct ActionState {
@@ -133,7 +130,11 @@ namespace Baobab {
 
             location_list.location_activated.connect (location_activated);
 
+            var builder = new Gtk.Builder.from_resource("/org/gnome/baobab/ui/baobab-treeview-menu.ui");
+            GLib.MenuModel treeview_menu = (GLib.MenuModel) builder.get_object ("treeview_menu");
+
             setup_treeview ();
+            treeview_popover_menu.bind_model (treeview_menu, null);
 
             infobar_close_button.clicked.connect (() => { clear_message (); });
 
@@ -352,13 +353,10 @@ namespace Baobab {
             Gtk.drag_dest_unset (this);
         }
 
-        bool show_treeview_popup (Gtk.Menu popup, Gdk.EventButton? event) {
-            if (event != null) {
-                popup.popup_at_pointer (event);
-            } else {
-                popup.popup_at_widget (treeview, Gdk.Gravity.CENTER, Gdk.Gravity.CENTER);
-                popup.select_first (false);
-            }
+        bool show_treeview_popover (Gtk.PopoverMenu popover, int x, int y) {
+            Gdk.Rectangle  rect = { x, y, 0, 0, };
+            popover.set_pointing_to (rect);
+            popover.popup ();
             return Gdk.EVENT_STOP;
         }
 
@@ -424,13 +422,34 @@ namespace Baobab {
             return sort.convert_child_path_to_path (filter_path);
         }
 
+        void on_treeview_open_folder () {
+            Gtk.TreeIter iter;
+            if (get_selected_iter (out iter)) {
+                open_item (iter);
+            }
+        }
+
+        void on_treeview_copy () {
+            Gtk.TreeIter iter;
+            if (get_selected_iter (out iter)) {
+                copy_path (iter);
+            }
+        }
+
+        void on_treeview_trash () {
+            Gtk.TreeIter iter;
+            if (get_selected_iter (out iter)) {
+                trash_file (iter);
+            }
+        }
+
         void setup_treeview () {
             treeview.button_press_event.connect ((event) => {
                 if (event.triggers_context_menu ()) {
                     Gtk.TreePath path;
                     if (treeview.get_path_at_pos ((int)event.x, (int)event.y, out path, null, null, null)) {
                         treeview.get_selection ().select_path (path);
-                        return show_treeview_popup (treeview_popup_menu, event);
+                        return show_treeview_popover (treeview_popover_menu,  (int) event.x, (int) event.y);
                     }
                 }
 
@@ -468,28 +487,11 @@ namespace Baobab {
             });
 
             treeview.popup_menu.connect (() => {
-                return show_treeview_popup (treeview_popup_menu, null);
-            });
-
-            treeview_popup_open.activate.connect (() => {
-                Gtk.TreeIter iter;
-                if (get_selected_iter (out iter)) {
-                    open_item (iter);
-                }
-            });
-
-            treeview_popup_copy.activate.connect (() => {
-                Gtk.TreeIter iter;
-                if (get_selected_iter (out iter)) {
-                    copy_path (iter);
-                }
-            });
-
-            treeview_popup_trash.activate.connect (() => {
-                Gtk.TreeIter iter;
-                if (get_selected_iter (out iter)) {
-                    trash_file (iter);
-                }
+                Gtk.Allocation allocation;
+                treeview.get_allocated_size (out allocation, null);
+                return show_treeview_popover (treeview_popover_menu,
+                                              allocation.width / 2,
+                                              allocation.height / 2);
             });
 
             treeview.row_activated.connect ((wrapper_path, column) => {


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