[niepce/gtk4] gtk4: Fix the context menu on ImageGridView
- From: Hubert Figuière <hub src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [niepce/gtk4] gtk4: Fix the context menu on ImageGridView
- Date: Mon, 9 May 2022 01:47:25 +0000 (UTC)
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: >k4::TreeModel) -> Self {
+ pub fn new(store: >k4::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: >k4::IconView,
+ menu: &Option<gtk4::PopoverMenu>,
+ gesture: >k4::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(
- >k4::TreeModel::from_glib_full(store),
+ >k4::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]