add handle for dock
This commit is contained in:
parent
b59d8a434c
commit
0984a13fa5
3 changed files with 64 additions and 34 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue