dioxus_use_cursor/hooks/use_hover/
mod.rs

1mod display;
2
3use super::*;
4
5///
6pub struct UseHover {
7    data: Rc<RefCell<UseHoverData>>,
8    listen_mouse_over: Option<EventListener>,
9    listen_mouse_out: Option<EventListener>,
10}
11
12#[derive(Debug, Clone)]
13struct UseHoverData {
14    hover: bool,
15}
16
17impl UseCursorBuilder {
18    /// hooks for window's size with config
19    ///
20    /// # Arguments
21    ///
22    /// * `cx`: [`Scope`] or [`ScopeState`]
23    ///
24    /// returns: [`WindowSize`]
25    ///
26    /// # Examples
27    ///
28    /// ```
29    /// use dioxus::prelude::*;
30    /// use dioxus_use_cursor::use_hover;
31    ///
32    /// fn App(cx: Scope) -> Element {
33    ///     let hook = use_hover(&cx);
34    ///
35    ///     cx.render(rsx!(
36    ///         h1 { "Cursor is hovering: {hook}" }
37    ///     ))
38    /// }
39    /// ```
40    pub fn use_hover<'a>(&self, cx: &'a ScopeState) -> &'a mut UseHover {
41        let hook = UseHover::new(cx, todo!());
42        cx.use_hook(|| hook)
43    }
44}
45
46impl UseHover {
47    fn new(cx: &ScopeState, target: &EventTarget) -> Self {
48        let data = Rc::new(RefCell::new(UseHoverData::default()));
49        let listen_mouse_over = Some(Self::on_pointer_over(cx, target, &data));
50        let listen_mouse_out = Some(Self::on_pointer_out(cx, target, &data));
51        Self { data, listen_mouse_over, listen_mouse_out }
52    }
53    fn on_pointer_over(cx: &ScopeState, target: &EventTarget, data: &Rc<RefCell<UseHoverData>>) -> EventListener {
54        #[cfg(debug_assertions)]
55        {
56            info!("Mouse Over Listener Initialized at {}!", cx.scope_id().0);
57        }
58        let setter = data.clone();
59        let regenerate = cx.schedule_update();
60        EventListener::new(target, "pointerover", move |_| {
61            let mut setter = setter.borrow_mut();
62            setter.hover = true;
63            regenerate()
64        })
65    }
66    fn on_pointer_out(cx: &ScopeState, target: &EventTarget, data: &Rc<RefCell<UseHoverData>>) -> EventListener {
67        #[cfg(debug_assertions)]
68        {
69            info!("Mouse Out Listener Initialized at {}!", cx.scope_id().0);
70        }
71        let setter = data.clone();
72        let regenerate = cx.schedule_update();
73        EventListener::new(target, "pointerout", move |_| {
74            let mut setter = setter.borrow_mut();
75            setter.hover = false;
76            regenerate()
77        })
78    }
79}
80
81impl UseHover {
82    /// check if the target is hovering
83    #[inline]
84    pub fn get(&self) -> bool {
85        self.data.borrow().hover
86    }
87}