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
//! Window events, [`on_window_open`](fn@on_window_open) and [`on_window_close_requested`](fn@on_window_close_requested).
//!
//! These events are re-exported by [`Window!`](struct@crate::Window) as `on_open` and `on_close_requested`, but you can
//! attach then in any widget inside a window using the property full name.
//!
//! There is no event property for the [`WINDOW_CLOSE_EVENT`] because that event notifies
//! after the window is deinited. You can use [`on_deinit`](fn@zng_wgt::on_deinit) in the
//! [`Window!`](struct@crate::Window) widget to handle a window closing, or create an app level handler for the
//! event using [`EVENTS`](zng_app::event::EVENTS).
//!
//! [`WINDOW_CLOSE_EVENT`]: zng_ext_window::WINDOW_CLOSE_EVENT

use zng_ext_window::*;
use zng_wgt::prelude::*;

event_property! {
    /// On window opened.
    ///
    /// This event notifies once per window, after the window content is inited.
    pub fn window_open {
        event: WINDOW_OPEN_EVENT,
        args: WindowOpenArgs,
        filter: |args| args.window_id == WINDOW.id(),
    }

    /// On window loaded.
    ///
    /// This event notifies once per window, after the first layout and all [`WindowLoadingHandle`]
    /// have expired or dropped.
    ///
    /// [`WindowLoadingHandle`]: zng_ext_window::WindowLoadingHandle
    pub fn window_load {
        event: WINDOW_LOAD_EVENT,
        args: WindowOpenArgs,
        filter: |args| args.window_id == WINDOW.id(),
    }

    /// On window moved, resized or other state changed.
    ///
    /// This event aggregates events moves, resizes and other state changes into a
    /// single event to simplify tracking composite changes, for example, the window changes size and position
    /// when maximized, this can be trivially observed with this event.
    pub fn window_changed {
        event: WINDOW_CHANGED_EVENT,
        args: WindowChangedArgs,
        filter: |args| args.window_id == WINDOW.id(),
    }

    /// On window position changed.
    pub fn window_moved {
        event: WINDOW_CHANGED_EVENT,
        args: WindowChangedArgs,
        filter: |args| args.window_id == WINDOW.id() && args.is_moved(),
    }

    /// On window size changed.
    pub fn window_resized {
        event: WINDOW_CHANGED_EVENT,
        args: WindowChangedArgs,
        filter: |args| args.window_id == WINDOW.id() && args.is_resized(),
    }

    /// On window close requested.
    ///
    /// Calling `propagation().stop()` on this event cancels the window close.
    pub fn window_close_requested {
        event: WINDOW_CLOSE_REQUESTED_EVENT,
        args: WindowCloseRequestedArgs,
        filter: |args| args.windows.contains(&WINDOW.id()),
    }

    /// On window closed.
    ///
    /// See [`WINDOW_CLOSE_EVENT`] for more details of when this event notifies.
    pub fn window_close {
        event: WINDOW_CLOSE_EVENT,
        args: WindowCloseArgs,
        filter: |args| args.windows.contains(&WINDOW.id()),
    }

    /// On window state changed.
    ///
    /// This event notifies every time the user or the app changes the [`WindowVars::state`].
    ///
    /// [`WindowVars::state`]: zng_ext_window::WindowVars
    pub fn window_state_changed {
        event: WINDOW_CHANGED_EVENT,
        args: WindowChangedArgs,
        filter: |args| args.window_id == WINDOW.id() && args.is_state_changed(),
    }

    /// On window state changed to [`WindowState::Maximized`].
    ///
    /// [`WindowState::Maximized`]: zng_ext_window::WindowState::Maximized
    pub fn window_maximized {
        event: WINDOW_CHANGED_EVENT,
        args: WindowChangedArgs,
        filter: |args| args.window_id == WINDOW.id() && args.entered_state(WindowState::Maximized),
    }

    /// On window state changed from [`WindowState::Maximized`].
    ///
    /// [`WindowState::Maximized`]: zng_ext_window::WindowState::Maximized
    pub fn window_unmaximized {
        event: WINDOW_CHANGED_EVENT,
        args: WindowChangedArgs,
        filter: |args| args.window_id == WINDOW.id() && args.exited_state(WindowState::Maximized),
    }

    /// On window state changed to [`WindowState::Minimized`].
    ///
    /// [`WindowState::Minimized`]: zng_ext_window::WindowState::Minimized
    pub fn window_minimized {
        event: WINDOW_CHANGED_EVENT,
        args: WindowChangedArgs,
        filter: |args| args.window_id == WINDOW.id() && args.entered_state(WindowState::Minimized),
    }

    /// On window state changed from [`WindowState::Minimized`].
    ///
    /// [`WindowState::Minimized`]: zng_ext_window::WindowState::Minimized
    pub fn window_unminimized {
        event: WINDOW_CHANGED_EVENT,
        args: WindowChangedArgs,
        filter: |args| args.window_id == WINDOW.id() && args.exited_state(WindowState::Minimized),
    }

    /// On window state changed to [`WindowState::Normal`].
    ///
    /// [`WindowState::Normal`]: zng_ext_window::WindowState::Normal
    pub fn window_restored {
        event: WINDOW_CHANGED_EVENT,
        args: WindowChangedArgs,
        filter: |args| args.window_id == WINDOW.id() && args.entered_state(WindowState::Normal),
    }

    /// On window state changed to [`WindowState::is_fullscreen`].
    ///
    /// [`WindowState::is_fullscreen`]: zng_ext_window::WindowState::is_fullscreen
    pub fn window_fullscreen {
        event: WINDOW_CHANGED_EVENT,
        args: WindowChangedArgs,
        filter: |args| args.window_id == WINDOW.id() && args.entered_fullscreen(),
    }

    /// On window state changed from [`WindowState::is_fullscreen`].
    ///
    /// [`WindowState::is_fullscreen`]: zng_ext_window::WindowState::is_fullscreen
    pub fn window_exited_fullscreen {
        event: WINDOW_CHANGED_EVENT,
        args: WindowChangedArgs,
        filter: |args| args.window_id == WINDOW.id() && args.exited_fullscreen(),
    }

    /// On window frame rendered.
    pub fn frame_image_ready {
        event: FRAME_IMAGE_READY_EVENT,
        args: FrameImageReadyArgs,
        filter: |args| args.window_id == WINDOW.id(),
    }

    /// On Input Method Editor event.
    pub fn ime {
        event: IME_EVENT,
        args: ImeArgs,
        filter: |args| args.target.widget_id() == WIDGET.id(),
    }
}