1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
//! Mouse events, [`on_mouse_move`](fn@on_mouse_move), [`on_mouse_enter`](fn@on_mouse_enter),
//! [`on_mouse_down`](fn@on_mouse_down) and more.
//!
//! There events are low level and directly tied to a mouse device.
//! Before using them review the [`gesture`](super::gesture) events, in particular the
//! [`on_click`](fn@super::gesture::on_click) event.

use zng_ext_input::mouse::{
    MouseClickArgs, MouseHoverArgs, MouseInputArgs, MouseMoveArgs, MouseWheelArgs, MOUSE_CLICK_EVENT, MOUSE_HOVERED_EVENT,
    MOUSE_INPUT_EVENT, MOUSE_MOVE_EVENT, MOUSE_WHEEL_EVENT,
};
use zng_wgt::prelude::*;

event_property! {
    /// Mouse cursor moved over the widget and cursor capture allows it.
    pub fn mouse_move {
        event: MOUSE_MOVE_EVENT,
        args: MouseMoveArgs,
        filter: |args| args.capture_allows(),
    }

    /// Mouse button pressed or released while the cursor is over the widget, the widget is enabled and no cursor
    /// capture blocks it.
    pub fn mouse_input {
        event: MOUSE_INPUT_EVENT,
        args: MouseInputArgs,
        filter: |args| args.is_enabled(WIDGET.id()) && args.capture_allows(),
    }

    /// Mouse button pressed or release while the cursor is over the widget, the widget is disabled and no cursor
    /// capture blocks it.
    pub fn disabled_mouse_input {
        event: MOUSE_INPUT_EVENT,
        args: MouseInputArgs,
        filter: |args| args.is_disabled(WIDGET.id()) && args.capture_allows(),
    }

    /// Mouse button pressed while the cursor is over the widget, the widget is enabled and cursor capture allows it.
    pub fn mouse_down {
        event: MOUSE_INPUT_EVENT,
        args: MouseInputArgs,
        filter: |args| args.is_mouse_down() && args.is_enabled(WIDGET.id()) && args.capture_allows(),
    }

    /// Mouse button released while the cursor if over the widget, the widget is enabled and cursor capture allows it.
    pub fn mouse_up {
        event: MOUSE_INPUT_EVENT,
        args: MouseInputArgs,
        filter: |args| args.is_mouse_up() && args.is_enabled(WIDGET.id()) && args.capture_allows(),
    }

    /// Mouse clicked on the widget with any button and including repeat clicks and it is enabled.
    pub fn mouse_any_click {
        event: MOUSE_CLICK_EVENT,
        args: MouseClickArgs,
        filter: |args| args.is_enabled(WIDGET.id()),
    }

    /// Mouse clicked on the disabled widget with any button, including repeat clicks.
    pub fn disabled_mouse_any_click {
        event: MOUSE_CLICK_EVENT,
        args: MouseClickArgs,
        filter: |args| args.is_disabled(WIDGET.id()),
    }

    /// Mouse clicked on the widget with any button but excluding repeat clicks and it is enabled.
    pub fn mouse_any_single_click {
        event: MOUSE_CLICK_EVENT,
        args: MouseClickArgs,
        filter: |args| args.is_single() && args.is_enabled(WIDGET.id()),
    }

    /// Mouse double clicked on the widget with any button and it is enabled.
    pub fn mouse_any_double_click {
        event: MOUSE_CLICK_EVENT,
        args: MouseClickArgs,
        filter: |args| args.is_double() && args.is_enabled(WIDGET.id()),
    }

    /// Mouse triple clicked on the widget with any button and it is enabled.
    pub fn mouse_any_triple_click {
        event: MOUSE_CLICK_EVENT,
        args: MouseClickArgs,
        filter: |args| args.is_triple() && args.is_enabled(WIDGET.id()),
    }

    /// Mouse clicked on the widget with the primary button including repeat clicks and it is enabled.
    pub fn mouse_click {
        event: MOUSE_CLICK_EVENT,
        args: MouseClickArgs,
        filter: |args| args.is_primary() && args.is_enabled(WIDGET.id()),
    }

    /// Mouse clicked on the disabled widget with the primary button, including repeat clicks.
    pub fn disabled_mouse_click {
        event: MOUSE_CLICK_EVENT,
        args: MouseClickArgs,
        filter: |args| args.is_primary() && args.is_disabled(WIDGET.id()),
    }

    /// Mouse clicked on the widget with the primary button excluding repeat clicks and it is enabled.
    pub fn mouse_single_click {
        event: MOUSE_CLICK_EVENT,
        args: MouseClickArgs,
        filter: |args| args.is_primary() && args.is_single() && args.is_enabled(WIDGET.id()),
    }

    /// Mouse double clicked on the widget with the primary button and it is enabled.
    pub fn mouse_double_click {
        event: MOUSE_CLICK_EVENT,
        args: MouseClickArgs,
        filter: |args| args.is_primary() && args.is_double() && args.is_enabled(WIDGET.id()),
    }

    /// Mouse triple clicked on the widget with the primary button and it is enabled.
    pub fn mouse_triple_click {
        event: MOUSE_CLICK_EVENT,
        args: MouseClickArgs,
        filter: |args| args.is_primary() && args.is_triple() && args.is_enabled(WIDGET.id()),
    }

    /// Mouse is now over the widget or a descendant widget, the widget is enabled and cursor capture allows it.
    pub fn mouse_enter {
        event: MOUSE_HOVERED_EVENT,
        args: MouseHoverArgs,
        filter: |args| args.is_mouse_enter_enabled(),
    }

    /// Mouse is no longer over the widget or any descendant widget, the widget is enabled and cursor capture allows it.
    pub fn mouse_leave {
        event: MOUSE_HOVERED_EVENT,
        args: MouseHoverArgs,
        filter: |args| args.is_mouse_leave_enabled(),
    }

    /// Mouse entered or left the widget and descendant widgets area, the widget is enabled and cursor capture allows it.
    ///
    /// You can use the [`is_mouse_enter`] and [`is_mouse_leave`] methods to determinate the state change.
    ///
    /// [`is_mouse_enter`]: MouseHoverArgs::is_mouse_enter
    /// [`is_mouse_leave`]: MouseHoverArgs::is_mouse_leave
    pub fn mouse_hovered {
        event: MOUSE_HOVERED_EVENT,
        args: MouseHoverArgs,
        filter: |args| args.is_enabled(WIDGET.id()) && args.capture_allows(),
    }

    /// Mouse entered or left the widget and descendant widgets area, the widget is disabled and cursor capture allows it.
    pub fn disabled_mouse_hovered {
        event: MOUSE_HOVERED_EVENT,
        args: MouseHoverArgs,
        filter: |args| args.is_disabled(WIDGET.id()) && args.capture_allows(),
    }

    /// Mouse wheel scrolled while pointer is hovering widget and it is enabled.
    pub fn mouse_wheel {
        event: MOUSE_WHEEL_EVENT,
        args: MouseWheelArgs,
        filter: |args| args.is_enabled(WIDGET.id()),
    }

    /// Mouse wheel scrolled while pointer is hovering widget and it is disabled.
    pub fn disabled_mouse_wheel {
        event: MOUSE_WHEEL_EVENT,
        args: MouseWheelArgs,
        filter: |args| args.is_enabled(WIDGET.id()),
    }

    /// Mouse wheel scrolled while pointer is hovering the widget and the pressed keyboard modifiers allow a scroll operation and
    /// the widget is enabled.
    pub fn mouse_scroll {
        event: MOUSE_WHEEL_EVENT,
        args: MouseWheelArgs,
        filter: |args| args.is_scroll() && args.is_enabled(WIDGET.id()),
    }

    /// Mouse wheel scrolled while pointer is hovering the widget and the pressed keyboard modifiers allow a zoom operation and
    /// the widget is enabled.
    pub fn mouse_zoom {
        event: MOUSE_WHEEL_EVENT,
        args: MouseWheelArgs,
        filter: |args| args.is_zoom() && args.is_enabled(WIDGET.id()),
    }
}