1use zng_txt::Txt;
4use zng_view_api::access::AccessCmd;
5
6pub use zng_view_api::access::ScrollCmd;
7
8use crate::{
9 event::{event, event_args},
10 update::EventUpdate,
11 widget::WidgetId,
12 window::WindowId,
13};
14
15pub(super) fn on_access_init(window_id: WindowId) -> EventUpdate {
16 let args = AccessInitedArgs::now(window_id);
17 ACCESS_INITED_EVENT.new_update(args)
18}
19
20pub(super) fn on_access_deinit(window_id: WindowId) -> EventUpdate {
21 let args = AccessDeinitedArgs::now(window_id);
22 ACCESS_DEINITED_EVENT.new_update(args)
23}
24
25pub(super) fn on_access_command(window_id: WindowId, widget_id: WidgetId, command: AccessCmd) -> Option<EventUpdate> {
26 match command {
27 AccessCmd::Click(primary) => {
28 let args = AccessClickArgs::now(window_id, widget_id, primary);
29 Some(ACCESS_CLICK_EVENT.new_update(args))
30 }
31 AccessCmd::Focus(focus) => {
32 let args = AccessFocusArgs::now(window_id, widget_id, focus);
33 Some(ACCESS_FOCUS_EVENT.new_update(args))
34 }
35 AccessCmd::FocusNavOrigin => {
36 let args = AccessFocusNavOriginArgs::now(window_id, widget_id);
37 Some(ACCESS_FOCUS_NAV_ORIGIN_EVENT.new_update(args))
38 }
39 AccessCmd::SetExpanded(expanded) => {
40 let args = AccessExpanderArgs::now(window_id, widget_id, expanded);
41 Some(ACCESS_EXPANDER_EVENT.new_update(args))
42 }
43 AccessCmd::Increment(inc) => {
44 let args = AccessIncrementArgs::now(window_id, widget_id, inc);
45 Some(ACCESS_INCREMENT_EVENT.new_update(args))
46 }
47 AccessCmd::SetToolTipVis(vis) => {
48 let args = AccessToolTipArgs::now(window_id, widget_id, vis);
49 Some(ACCESS_TOOLTIP_EVENT.new_update(args))
50 }
51 AccessCmd::ReplaceSelectedText(s) => {
52 let args = AccessTextArgs::now(window_id, widget_id, s, true);
53 Some(ACCESS_TEXT_EVENT.new_update(args))
54 }
55 AccessCmd::Scroll(s) => {
56 let args = AccessScrollArgs::now(window_id, widget_id, s);
57 Some(ACCESS_SCROLL_EVENT.new_update(args))
58 }
59 AccessCmd::SelectText {
60 start: (start_wgt, start_idx),
61 caret: (caret_wgt, caret_idx),
62 } => {
63 let start_wgt = WidgetId::from_raw(start_wgt.0);
64 let caret_wgt = WidgetId::from_raw(caret_wgt.0);
65 let args = AccessSelectionArgs::now(window_id, (start_wgt, start_idx), (caret_wgt, caret_idx));
66 Some(ACCESS_SELECTION_EVENT.new_update(args))
67 }
68 AccessCmd::SetString(s) => {
69 let args = AccessTextArgs::now(window_id, widget_id, s, false);
70 Some(ACCESS_TEXT_EVENT.new_update(args))
71 }
72 AccessCmd::SetNumber(n) => {
73 let args = AccessNumberArgs::now(window_id, widget_id, n);
74 Some(ACCESS_NUMBER_EVENT.new_update(args))
75 }
76 a => {
77 tracing::warn!("access command `{a:?}` not implemented");
78 None
79 }
80 }
81}
82
83event_args! {
84 pub struct AccessInitedArgs {
86 pub window_id: WindowId,
88
89 ..
90
91 fn delivery_list(&self, list: &mut UpdateDeliveryList) {
93 list.search_all()
94 }
95 }
96
97 pub struct AccessDeinitedArgs {
99 pub window_id: WindowId,
101
102 ..
103
104 fn delivery_list(&self, list: &mut UpdateDeliveryList) {
106 list.search_all()
107 }
108 }
109
110 pub struct AccessClickArgs {
112 pub window_id: WindowId,
114
115 pub widget_id: WidgetId,
117
118 pub is_primary: bool,
122
123 ..
124
125 fn delivery_list(&self, list: &mut UpdateDeliveryList) {
127 list.search_widget(self.widget_id);
128 }
129 }
130
131 pub struct AccessFocusArgs {
133 pub window_id: WindowId,
135
136 pub widget_id: WidgetId,
138
139 pub focus: bool,
143
144 ..
145
146 fn delivery_list(&self, list: &mut UpdateDeliveryList) {
148 list.search_widget(self.widget_id)
149 }
150 }
151
152 pub struct AccessFocusNavOriginArgs {
154 pub window_id: WindowId,
156
157 pub widget_id: WidgetId,
159
160 ..
161
162 fn delivery_list(&self, list: &mut UpdateDeliveryList) {
164 list.search_widget(self.widget_id)
165 }
166 }
167
168 pub struct AccessExpanderArgs {
170 pub window_id: WindowId,
172
173 pub widget_id: WidgetId,
175
176 pub expanded: bool,
178
179 ..
180
181 fn delivery_list(&self, list: &mut UpdateDeliveryList) {
183 list.search_widget(self.widget_id)
184 }
185 }
186
187 pub struct AccessIncrementArgs {
189 pub window_id: WindowId,
191
192 pub widget_id: WidgetId,
194
195 pub delta: i32,
199
200 ..
201
202 fn delivery_list(&self, list: &mut UpdateDeliveryList) {
204 list.search_widget(self.widget_id)
205 }
206 }
207
208 pub struct AccessToolTipArgs {
210 pub window_id: WindowId,
212
213 pub widget_id: WidgetId,
215
216 pub visible: bool,
218
219 ..
220
221 fn delivery_list(&self, list: &mut UpdateDeliveryList) {
223 list.search_widget(self.widget_id)
224 }
225 }
226
227 pub struct AccessScrollArgs {
229 pub window_id: WindowId,
231
232 pub widget_id: WidgetId,
234
235 pub command: ScrollCmd,
237
238 ..
239
240 fn delivery_list(&self, list: &mut UpdateDeliveryList) {
242 list.search_widget(self.widget_id)
243 }
244 }
245
246 pub struct AccessTextArgs {
248 pub window_id: WindowId,
250
251 pub widget_id: WidgetId,
253
254 pub txt: Txt,
256
257 pub selection_only: bool,
262
263 ..
264
265 fn delivery_list(&self, list: &mut UpdateDeliveryList) {
267 list.search_widget(self.widget_id)
268 }
269 }
270
271 pub struct AccessNumberArgs {
273 pub window_id: WindowId,
275
276 pub widget_id: WidgetId,
278
279 pub num: f64,
281
282 ..
283
284 fn delivery_list(&self, list: &mut UpdateDeliveryList) {
286 list.search_widget(self.widget_id)
287 }
288 }
289
290 pub struct AccessSelectionArgs {
292 pub window_id: WindowId,
294
295 pub start: (WidgetId, usize),
299 pub caret: (WidgetId, usize),
303
304 ..
305
306 fn delivery_list(&self, list: &mut UpdateDeliveryList) {
308 list.search_widget(self.start.0);
309 list.search_widget(self.caret.0);
310 }
311 }
312}
313impl AccessClickArgs {
314 pub fn is_context(&self) -> bool {
316 !self.is_primary
317 }
318}
319
320event! {
321 pub static ACCESS_INITED_EVENT: AccessInitedArgs;
323
324 pub static ACCESS_DEINITED_EVENT: AccessDeinitedArgs;
326
327 pub static ACCESS_CLICK_EVENT: AccessClickArgs;
329
330 pub static ACCESS_FOCUS_EVENT: AccessFocusArgs;
332
333 pub static ACCESS_FOCUS_NAV_ORIGIN_EVENT: AccessFocusNavOriginArgs;
335
336 pub static ACCESS_EXPANDER_EVENT: AccessExpanderArgs;
338
339 pub static ACCESS_INCREMENT_EVENT: AccessIncrementArgs;
341
342 pub static ACCESS_TOOLTIP_EVENT: AccessToolTipArgs;
344
345 pub static ACCESS_SCROLL_EVENT: AccessScrollArgs;
347
348 pub static ACCESS_TEXT_EVENT: AccessTextArgs;
350
351 pub static ACCESS_NUMBER_EVENT: AccessNumberArgs;
353
354 pub static ACCESS_SELECTION_EVENT: AccessSelectionArgs;
356}
357
358pub struct ACCESS;
360
361impl ACCESS {
362 pub fn click(&self, window_id: impl Into<WindowId>, widget_id: impl Into<WidgetId>, is_primary: bool) {
366 let win = window_id.into();
367 let wgt = widget_id.into();
368 ACCESS_CLICK_EVENT.notify(AccessClickArgs::now(win, wgt, is_primary));
369 }
370
371 pub fn show_tooltip(&self, window_id: impl Into<WindowId>, widget_id: impl Into<WidgetId>) {
375 let win = window_id.into();
376 let wgt = widget_id.into();
377 ACCESS_TOOLTIP_EVENT.notify(AccessToolTipArgs::now(win, wgt, true));
378 }
379
380 pub fn hide_tooltip(&self, window_id: impl Into<WindowId>, widget_id: impl Into<WidgetId>) {
382 let win = window_id.into();
383 let wgt = widget_id.into();
384 ACCESS_TOOLTIP_EVENT.notify(AccessToolTipArgs::now(win, wgt, false));
385 }
386}