Correctly clean up old onhover, onscroll, etc handlers
This commit is contained in:
parent
47908304e2
commit
ee2ee94252
1 changed files with 34 additions and 35 deletions
|
@ -52,15 +52,8 @@ pub(super) fn resolve_widget_attrs(bargs: &mut BuilderArgs, gtk_widget: >k::Wi
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
let on_scroll_handler: Rc<RefCell<Option<Box<dyn Fn(ScrollDir)>>>> = Rc::new(RefCell::new(None));
|
let on_scroll_handler_id: Rc<RefCell<Option<glib::SignalHandlerId>>> = Rc::new(RefCell::new(None));
|
||||||
gtk_widget.add_events(gdk::EventMask::SCROLL_MASK);
|
let on_hover_handler_id: Rc<RefCell<Option<glib::SignalHandlerId>>> = Rc::new(RefCell::new(None));
|
||||||
gtk_widget.add_events(gdk::EventMask::SMOOTH_SCROLL_MASK);
|
|
||||||
gtk_widget.connect_scroll_event(glib::clone!(@strong on_scroll_handler => move |_, evt| {
|
|
||||||
if let Some(ref handler) = *on_scroll_handler.borrow() {
|
|
||||||
handler(if evt.get_delta().1 < 0f64 {ScrollDir::Up } else {ScrollDir::Down});
|
|
||||||
}
|
|
||||||
gtk::Inhibit(false)
|
|
||||||
}));
|
|
||||||
|
|
||||||
resolve_block!(bargs, gtk_widget, {
|
resolve_block!(bargs, gtk_widget, {
|
||||||
prop(class: as_string) { gtk_widget.get_style_context().add_class(&class) },
|
prop(class: as_string) { gtk_widget.get_style_context().add_class(&class) },
|
||||||
|
@ -79,14 +72,25 @@ pub(super) fn resolve_widget_attrs(bargs: &mut BuilderArgs, gtk_widget: >k::Wi
|
||||||
gtk_widget.get_style_context().add_provider(&css_provider, gtk::STYLE_PROVIDER_PRIORITY_APPLICATION)
|
gtk_widget.get_style_context().add_provider(&css_provider, gtk::STYLE_PROVIDER_PRIORITY_APPLICATION)
|
||||||
},
|
},
|
||||||
prop(onscroll: as_string) {
|
prop(onscroll: as_string) {
|
||||||
on_scroll_handler.replace(Some(Box::new(move |evt| run_command(&onscroll, evt))));
|
gtk_widget.add_events(gdk::EventMask::SCROLL_MASK);
|
||||||
|
gtk_widget.add_events(gdk::EventMask::SMOOTH_SCROLL_MASK);
|
||||||
|
let old_id = on_scroll_handler_id.replace(Some(
|
||||||
|
gtk_widget.connect_scroll_event(move |_, evt| {
|
||||||
|
run_command(&onscroll, if evt.get_delta().1 < 0f64 { "up" } else { "down" });
|
||||||
|
gtk::Inhibit(false)
|
||||||
|
})
|
||||||
|
));
|
||||||
|
old_id.map(|id| gtk_widget.disconnect(id));
|
||||||
},
|
},
|
||||||
prop(onhover: as_string) {
|
prop(onhover: as_string) {
|
||||||
gtk_widget.add_events(gdk::EventMask::ENTER_NOTIFY_MASK);
|
gtk_widget.add_events(gdk::EventMask::ENTER_NOTIFY_MASK);
|
||||||
gtk_widget.connect_enter_notify_event(move |_, evt| {
|
let old_id = on_hover_handler_id.replace(Some(
|
||||||
|
gtk_widget.connect_scroll_event(move |_, evt| {
|
||||||
run_command(&onhover, format!("{} {}", evt.get_position().0, evt.get_position().1));
|
run_command(&onhover, format!("{} {}", evt.get_position().0, evt.get_position().1));
|
||||||
gtk::Inhibit(false)
|
gtk::Inhibit(false)
|
||||||
});
|
})
|
||||||
|
));
|
||||||
|
old_id.map(|id| gtk_widget.disconnect(id));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -100,16 +104,21 @@ pub(super) fn resolve_container_attrs(bargs: &mut BuilderArgs, gtk_widget: >k:
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(super) fn resolve_range_attrs(bargs: &mut BuilderArgs, gtk_widget: >k::Range) {
|
pub(super) fn resolve_range_attrs(bargs: &mut BuilderArgs, gtk_widget: >k::Range) {
|
||||||
|
let on_change_handler_id: Rc<RefCell<Option<glib::SignalHandlerId>>> = Rc::new(RefCell::new(None));
|
||||||
resolve_block!(bargs, gtk_widget, {
|
resolve_block!(bargs, gtk_widget, {
|
||||||
prop(value : as_f64) { gtk_widget.set_value(value)},
|
prop(value : as_f64) { gtk_widget.set_value(value)},
|
||||||
prop(min : as_f64) { gtk_widget.get_adjustment().set_lower(min)},
|
prop(min : as_f64) { gtk_widget.get_adjustment().set_lower(min)},
|
||||||
prop(max : as_f64) { gtk_widget.get_adjustment().set_upper(max)},
|
prop(max : as_f64) { gtk_widget.get_adjustment().set_upper(max)},
|
||||||
prop(orientation : as_string) { gtk_widget.set_orientation(parse_orientation(&orientation)?) },
|
prop(orientation : as_string) { gtk_widget.set_orientation(parse_orientation(&orientation)?) },
|
||||||
prop(onchange : as_string) {
|
prop(onchange : as_string) {
|
||||||
// TODO FIX: if this is loaded by a varref, and changes, the value _must_ be disconnected.
|
gtk_widget.add_events(gdk::EventMask::ENTER_NOTIFY_MASK);
|
||||||
|
let old_id = on_change_handler_id.replace(Some(
|
||||||
gtk_widget.connect_value_changed(move |gtk_widget| {
|
gtk_widget.connect_value_changed(move |gtk_widget| {
|
||||||
run_command(&onchange, gtk_widget.get_value());
|
run_command(&onchange, gtk_widget.get_value());
|
||||||
});
|
})
|
||||||
|
));
|
||||||
|
old_id.map(|id| gtk_widget.disconnect(id));
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -136,10 +145,15 @@ fn build_gtk_scale(bargs: &mut BuilderArgs) -> Result<gtk::Scale> {
|
||||||
|
|
||||||
fn build_gtk_button(bargs: &mut BuilderArgs) -> Result<gtk::Button> {
|
fn build_gtk_button(bargs: &mut BuilderArgs) -> Result<gtk::Button> {
|
||||||
let gtk_widget = gtk::Button::new();
|
let gtk_widget = gtk::Button::new();
|
||||||
|
let on_click_handler_id: Rc<RefCell<Option<glib::SignalHandlerId>>> = Rc::new(RefCell::new(None));
|
||||||
resolve_block!(bargs, gtk_widget, {
|
resolve_block!(bargs, gtk_widget, {
|
||||||
prop(onclick: as_string) {
|
prop(onclick: as_string) {
|
||||||
// TODO FIX: if this is loaded by a varref, and changes, the value _must_ be disconnected.
|
gtk_widget.add_events(gdk::EventMask::ENTER_NOTIFY_MASK);
|
||||||
gtk_widget.connect_clicked(move |_| run_command(&onclick, ""));
|
let old_id = on_click_handler_id.replace(Some(
|
||||||
|
gtk_widget.connect_clicked(move |_| run_command(&onclick, ""))
|
||||||
|
));
|
||||||
|
old_id.map(|id| gtk_widget.disconnect(id));
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Ok(gtk_widget)
|
Ok(gtk_widget)
|
||||||
|
@ -254,18 +268,3 @@ fn connect_first_map<W: IsA<gtk::Widget>, F: Fn(&W) + 'static>(widget: &W, func:
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Eq, PartialEq)]
|
|
||||||
pub enum ScrollDir {
|
|
||||||
Up,
|
|
||||||
Down,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl fmt::Display for ScrollDir {
|
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
|
||||||
match self {
|
|
||||||
ScrollDir::Up => write!(f, "up"),
|
|
||||||
ScrollDir::Down => write!(f, "down"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue