From 97d2b19827b5a11f95b18a7aa0e7ef178e8b8dd9 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Wed, 15 Dec 2021 12:19:01 -0500 Subject: [PATCH] add handle for dock --- examples/dock/window/imp.rs | 8 ++++- examples/dock/window/mod.rs | 33 +++++++++++++------- examples/dock/window/window.ui | 57 +++++++++++++++++++++------------- 3 files changed, 64 insertions(+), 34 deletions(-) diff --git a/examples/dock/window/imp.rs b/examples/dock/window/imp.rs index 2debee23..87ecf178 100644 --- a/examples/dock/window/imp.rs +++ b/examples/dock/window/imp.rs @@ -1,4 +1,5 @@ use gtk4 as gtk; +use gtk4::Box; use gtk4::EventControllerMotion; use gtk4::Revealer; @@ -17,8 +18,13 @@ pub struct Window { pub list_view: TemplateChild, #[template_child] pub revealer: TemplateChild, + #[template_child] + pub cursor_enter_handle: TemplateChild, + #[template_child] + pub cursor_leave_handle: TemplateChild, pub model: OnceCell, - pub event_controller: OnceCell, + pub enter_event_controller: OnceCell, + pub leave_event_controller: OnceCell, } // The central trait for subclassing a GObject diff --git a/examples/dock/window/mod.rs b/examples/dock/window/mod.rs index 8cd5473b..277a2955 100644 --- a/examples/dock/window/mod.rs +++ b/examples/dock/window/mod.rs @@ -120,12 +120,13 @@ impl Window { } })); - let event_controller = &imp.event_controller.get().unwrap(); + let enter_event_controller = &imp.enter_event_controller.get().unwrap(); + let leave_event_controller = &imp.leave_event_controller.get().unwrap(); let revealer = &imp.revealer.get(); window.connect_show( - glib::clone!(@weak revealer, @weak event_controller => move |_| { - dbg!(!event_controller.contains_pointer()); - if !event_controller.contains_pointer() { + glib::clone!(@weak revealer, @weak leave_event_controller => move |_| { + dbg!(!leave_event_controller.contains_pointer()); + if !leave_event_controller.contains_pointer() { revealer.set_reveal_child(false); } }), @@ -186,11 +187,11 @@ impl Window { println!("failed to get X11 window"); } }); - event_controller.connect_enter(glib::clone!(@weak revealer => move |_evc, _x, _y| { + enter_event_controller.connect_enter(glib::clone!(@weak revealer => move |_evc, _x, _y| { dbg!("hello, mouse entered me :)"); revealer.set_reveal_child(true); })); - event_controller.connect_leave(glib::clone!(@weak revealer => move |_evc| { + leave_event_controller.connect_leave(glib::clone!(@weak revealer => move |_evc| { dbg!("hello, mouse left me :)"); revealer.set_reveal_child(false); })); @@ -198,14 +199,24 @@ impl Window { fn setup_event_controller(&self) { let imp = imp::Window::from_instance(self); - let window = &imp.revealer.get(); - let ev = EventControllerMotion::builder() + let enter_handle = &imp.cursor_enter_handle.get(); + let enter_ev = EventControllerMotion::builder() .propagation_limit(gtk4::PropagationLimit::None) .propagation_phase(gtk4::PropagationPhase::Capture) .build(); - window.add_controller(&ev); - imp.event_controller - .set(ev) + enter_handle.add_controller(&enter_ev); + let leave_handle = &imp.cursor_leave_handle.get(); + let leave_ev = EventControllerMotion::builder() + .propagation_limit(gtk4::PropagationLimit::None) + .propagation_phase(gtk4::PropagationPhase::Capture) + .build(); + enter_handle.add_controller(&enter_ev); + leave_handle.add_controller(&leave_ev); + imp.enter_event_controller + .set(enter_ev) + .expect("Could not set event controller"); + imp.leave_event_controller + .set(leave_ev) .expect("Could not set event controller"); } diff --git a/examples/dock/window/window.ui b/examples/dock/window/window.ui index 156807d3..5e8c2223 100644 --- a/examples/dock/window/window.ui +++ b/examples/dock/window/window.ui @@ -1,40 +1,53 @@