diff options
author | Christopher Davis <christopherdavis@gnome.org> | 2021-09-21 22:12:44 -0700 |
---|---|---|
committer | Christopher Davis <christopherdavis@gnome.org> | 2021-09-22 02:08:38 -0700 |
commit | 959ef4b4768d6a192f715115029dd3d15d40069f (patch) | |
tree | 4f01f2417332de0e00d919c59a67d681ad988349 | |
parent | 3b628ac25b6209d414d1f8964a743e0a2b0a29f9 (diff) | |
download | baobab-959ef4b4768d6a192f715115029dd3d15d40069f.tar.gz |
window: Use popover instead of GtkMenu
GtkMenu is gone in GTK4
-rw-r--r-- | data/baobab.gresource.xml | 1 | ||||
-rw-r--r-- | data/ui/baobab-main-window.ui | 32 | ||||
-rw-r--r-- | data/ui/baobab-treeview-menu.ui | 19 | ||||
-rw-r--r-- | 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) => { |