[niepce/gtk4] gtk4: Fix the context menu on ImageGridView



commit 9338a6e2d75cbc5e64a5a4475ff7f72d1e150ea5
Author: Hubert Figuière <hub figuiere net>
Date:   Fri May 6 20:07:49 2022 -0400

    gtk4: Fix the context menu on ImageGridView

 niepce-main/build.rs                         |  1 +
 niepce-main/src/niepce/ui/image_grid_view.rs | 44 ++++++++++++++++++++--------
 src/niepce/ui/dialogs/importdialog.cpp       |  2 +-
 src/niepce/ui/gridviewmodule.cpp             | 11 ++++---
 4 files changed, 41 insertions(+), 17 deletions(-)
---
diff --git a/niepce-main/build.rs b/niepce-main/build.rs
index a267cd7..5697a2f 100644
--- a/niepce-main/build.rs
+++ b/niepce-main/build.rs
@@ -37,6 +37,7 @@ fn main() {
             .exclude_item("GtkIconView")
             .exclude_item("GtkListStore")
             .exclude_item("GtkTreePath")
+            .exclude_item("GtkPopoverMenu")
             .exclude_item("GtkCellRenderer")
             .exclude_item("GtkWidget")
             .exclude_item("GFileInfo")
diff --git a/niepce-main/src/niepce/ui/image_grid_view.rs b/niepce-main/src/niepce/ui/image_grid_view.rs
index 401425c..c24b86c 100644
--- a/niepce-main/src/niepce/ui/image_grid_view.rs
+++ b/niepce-main/src/niepce/ui/image_grid_view.rs
@@ -28,14 +28,16 @@ pub struct ImageGridView {
 }
 
 impl ImageGridView {
-    pub fn new(store: &gtk4::TreeModel) -> Self {
+    pub fn new(store: &gtk4::TreeModel, context_menu: Option<gtk4::PopoverMenu>) -> Self {
         let icon_view = gtk4::IconView::with_model(store);
 
         let click = gtk4::GestureClick::new();
-        //        click.connect_pressed(glib::clone!(@weak obj => move |gesture, n, x, y| {
-        // XXX handle press event
-        // self.press_event(x, y);
-        //        }));
+        click.set_button(0);
+        click.connect_pressed(
+            glib::clone!(@weak icon_view, @strong context_menu => move |gesture, _, x, y| {
+                Self::press_event(&icon_view, &context_menu, gesture, x, y);
+            }),
+        );
         icon_view.add_controller(&click);
 
         ImageGridView { icon_view }
@@ -51,13 +53,24 @@ impl std::ops::Deref for ImageGridView {
 }
 
 impl ImageGridView {
-    fn press_event(&self, x: f64, y: f64) {
-        // let event = gesture.last_event();
-
-        // XXX forward to the icon_view or something
-        // self.parent_button_press_event(widget, event);
+    fn press_event(
+        icon_view: &gtk4::IconView,
+        menu: &Option<gtk4::PopoverMenu>,
+        gesture: &gtk4::GestureClick,
+        x: f64,
+        y: f64,
+    ) {
+        gesture.last_event(None).and_then(|event| {
+            if event.triggers_context_menu() {
+                if let Some(ref menu) = menu {
+                    menu.set_pointing_to(Some(&gdk4::Rectangle::new(x as i32, y as i32, 0, 0)));
+                    menu.popup();
+                }
+            }
+            Some(())
+        });
 
-        if let Some((_, cell)) = self.icon_view.item_at_pos(x as i32, y as i32) {
+        if let Some((_, cell)) = icon_view.item_at_pos(x as i32, y as i32) {
             if let Ok(mut cell) = cell.downcast::<LibraryCellRenderer>() {
                 cell.hit(x as i32, y as i32);
             }
@@ -65,14 +78,21 @@ impl ImageGridView {
     }
 }
 
+/// Create a new `ImageGridView`
+///
 /// # Safety
 /// Use raw pointers.
+///
+/// The `store` and `context_menu` will get ref.
+/// context_menu can be `nullptr`
 #[no_mangle]
 pub unsafe extern "C" fn npc_image_grid_view_new(
     store: *mut gtk4_sys::GtkTreeModel,
+    context_menu: *mut gtk4_sys::GtkPopoverMenu,
 ) -> *mut ImageGridView {
     Box::into_raw(Box::new(ImageGridView::new(
-        &gtk4::TreeModel::from_glib_full(store),
+        &gtk4::TreeModel::from_glib_none(store),
+        Option::<gtk4::PopoverMenu>::from_glib_none(context_menu),
     )))
 }
 
diff --git a/src/niepce/ui/dialogs/importdialog.cpp b/src/niepce/ui/dialogs/importdialog.cpp
index 2c2c1a2..8c09906 100644
--- a/src/niepce/ui/dialogs/importdialog.cpp
+++ b/src/niepce/ui/dialogs/importdialog.cpp
@@ -119,7 +119,7 @@ void ImportDialog::setup_widget()
     m_images_list_model = Gtk::ListStore::create(m_grid_columns);
     m_image_gridview = std::shared_ptr<ffi::ImageGridView>(
         ffi::npc_image_grid_view_new(
-            GTK_TREE_MODEL(g_object_ref(m_images_list_model->gobj()))),
+            GTK_TREE_MODEL(g_object_ref(m_images_list_model->gobj())), nullptr),
         ffi::npc_image_grid_view_release);
     m_gridview = Gtk::manage(Glib::wrap(GTK_ICON_VIEW(
                                             ffi::npc_image_grid_view_get_icon_view(
diff --git a/src/niepce/ui/gridviewmodule.cpp b/src/niepce/ui/gridviewmodule.cpp
index dc94e93..87e3b22 100644
--- a/src/niepce/ui/gridviewmodule.cpp
+++ b/src/niepce/ui/gridviewmodule.cpp
@@ -20,6 +20,7 @@
 #include <gtkmm/liststore.h>
 #include <gtkmm/treestore.h>
 #include <gtkmm/treeselection.h>
+#include <gtkmm/popovermenu.h>
 
 #include <exempi/xmpconsts.h>
 
@@ -116,10 +117,14 @@ Gtk::Widget * GridViewModule::buildWidget()
     return m_widget;
   }
   m_widget = &m_lib_splitview;
+  auto shell_menu = m_shell.getMenu();
+  m_context_menu = Gtk::manage(new Gtk::PopoverMenu(shell_menu));
+
   m_image_grid_view = std::shared_ptr<ffi::ImageGridView>(
       ffi::npc_image_grid_view_new(
-          GTK_TREE_MODEL(g_object_ref(
-                             m_model->gobjmm()->gobj()))),
+          GTK_TREE_MODEL(m_model->gobjmm()->gobj()),
+          GTK_POPOVER_MENU(m_context_menu->gobj())
+      ),
       ffi::npc_image_grid_view_release);
   m_librarylistview = Gtk::manage(
       Glib::wrap(
@@ -132,8 +137,6 @@ Gtk::Widget * GridViewModule::buildWidget()
   m_librarylistview->property_margin() = 0;
   m_librarylistview->set_vexpand(true);
 
-  auto shell_menu = m_shell.getMenu();
-  m_context_menu = Gtk::manage(new Gtk::PopoverMenu(shell_menu));
   m_context_menu->set_parent(*m_librarylistview);
   m_librarylistview->signal_unrealize().connect([this] {
       m_context_menu->unparent();


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