add handle for dock

This commit is contained in:
Ashley Wulber 2021-12-15 12:19:01 -05:00
parent b59d8a434c
commit 0984a13fa5
3 changed files with 64 additions and 34 deletions

View file

@ -1,4 +1,5 @@
use gtk4 as gtk; use gtk4 as gtk;
use gtk4::Box;
use gtk4::EventControllerMotion; use gtk4::EventControllerMotion;
use gtk4::Revealer; use gtk4::Revealer;
@ -17,8 +18,13 @@ pub struct Window {
pub list_view: TemplateChild<ListView>, pub list_view: TemplateChild<ListView>,
#[template_child] #[template_child]
pub revealer: TemplateChild<Revealer>, pub revealer: TemplateChild<Revealer>,
#[template_child]
pub cursor_enter_handle: TemplateChild<Box>,
#[template_child]
pub cursor_leave_handle: TemplateChild<Box>,
pub model: OnceCell<gio::ListStore>, pub model: OnceCell<gio::ListStore>,
pub event_controller: OnceCell<EventControllerMotion>, pub enter_event_controller: OnceCell<EventControllerMotion>,
pub leave_event_controller: OnceCell<EventControllerMotion>,
} }
// The central trait for subclassing a GObject // The central trait for subclassing a GObject

View file

@ -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(); let revealer = &imp.revealer.get();
window.connect_show( window.connect_show(
glib::clone!(@weak revealer, @weak event_controller => move |_| { glib::clone!(@weak revealer, @weak leave_event_controller => move |_| {
dbg!(!event_controller.contains_pointer()); dbg!(!leave_event_controller.contains_pointer());
if !event_controller.contains_pointer() { if !leave_event_controller.contains_pointer() {
revealer.set_reveal_child(false); revealer.set_reveal_child(false);
} }
}), }),
@ -186,11 +187,11 @@ impl Window {
println!("failed to get X11 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 :)"); dbg!("hello, mouse entered me :)");
revealer.set_reveal_child(true); 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 :)"); dbg!("hello, mouse left me :)");
revealer.set_reveal_child(false); revealer.set_reveal_child(false);
})); }));
@ -198,14 +199,24 @@ impl Window {
fn setup_event_controller(&self) { fn setup_event_controller(&self) {
let imp = imp::Window::from_instance(self); let imp = imp::Window::from_instance(self);
let window = &imp.revealer.get(); let enter_handle = &imp.cursor_enter_handle.get();
let ev = EventControllerMotion::builder() let enter_ev = EventControllerMotion::builder()
.propagation_limit(gtk4::PropagationLimit::None) .propagation_limit(gtk4::PropagationLimit::None)
.propagation_phase(gtk4::PropagationPhase::Capture) .propagation_phase(gtk4::PropagationPhase::Capture)
.build(); .build();
window.add_controller(&ev); enter_handle.add_controller(&enter_ev);
imp.event_controller let leave_handle = &imp.cursor_leave_handle.get();
.set(ev) 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"); .expect("Could not set event controller");
} }

View file

@ -1,40 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<template class="LauncherWindow" parent="GtkApplicationWindow"> <template class="LauncherWindow" parent="GtkApplicationWindow">
<property name="height-request">20</property> <property name="height-request">70</property>
<property name="title">Gtk Pop Dock</property> <property name="title">Gtk Pop Dock</property>
<property name="decorated">false</property> <property name="decorated">false</property>
<property name="resizable">false</property> <property name="resizable">false</property>
<child> <child>
<object class="GtkRevealer" id="revealer"> <object class="GtkBox" id="cursor_leave_handle">
<property name="reveal-child">true</property> <property name="orientation">vertical</property>
<property name="transition-duration">200</property>
<property name="transition-type">swing-up</property>
<child> <child>
<object class="GtkBox"> <object class="GtkBox">
<property name="orientation">horizontal</property> <property name="height-request">0</property>
<property name="margin-start">4</property> <property name="vexpand">true</property>
<property name="margin-end">4</property> </object>
<property name="margin-top">4</property> </child>
<property name="margin-bottom">4</property> <child>
<property name="spacing">4</property> <object class="GtkRevealer" id="revealer">
<property name="name">dock-container</property> <property name="reveal-child">true</property>
<property name="transition-duration">200</property>
<property name="transition-type">swing-up</property>
<child> <child>
<object class="GtkListView" id="list_view"> <object class="GtkBox">
<property name="orientation">horizontal</property> <property name="orientation">horizontal</property>
<property name="hexpand">true</property> <property name="margin-start">4</property>
</object> <property name="margin-end">4</property>
</child> <property name="spacing">4</property>
<child> <property name="name">dock-container</property>
<object class="GtkSeparator"> <child>
<property name="margin-top">4</property> <object class="GtkListView" id="list_view">
<property name="margin-bottom">4</property> <property name="orientation">horizontal</property>
<property name="orientation">vertical</property> <property name="hexpand">true</property>
<property name="vexpand">true</property> </object>
</child>
<child>
<object class="GtkSeparator">
<property name="margin-top">4</property>
<property name="margin-bottom">4</property>
<property name="orientation">vertical</property>
</object>
</child>
</object> </object>
</child> </child>
</object> </object>
</child> </child>
<child>
<object class="GtkBox" id="cursor_enter_handle">
<property name="height-request">10</property>
</object>
</child>
</object> </object>
</child> </child>
</template> </template>