1// Copyright © SixtyFPS GmbH <info@slint.dev>
2// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0
3
4export component TestCase {
5 width: 300px;
6 height: 300px;
7
8 in-out property <bool> popup-created;
9 in-out property <int> click-count;
10 in-out property <int> popup-selector: 0;
11 in-out property <int> popup-clicked;
12 out property <length> last-underneath-mouse-x: ta.mouse-x;
13 out property <length> last-underneath-mouse-y: ta.mouse-y;
14
15 callback do-close;
16 do-close => {
17 close-from-outside.close();
18 }
19
20 default-popup := PopupWindow {
21 x: 10px;
22 y: 10px;
23 width: parent.width - 20px;
24 height: parent.height - 20px;
25 Text {
26 text: "I'm a default";
27 }
28 init => {
29 root.popup-created = true;
30 }
31
32 TouchArea {
33 width: 7px; x: 0px;
34 clicked => {
35 popup-clicked += 1;
36 }
37 }
38 }
39
40 self-closing-popup := PopupWindow {
41 close-on-click: false;
42 x: 10px;
43 y: 10px;
44 width: parent.width - 20px;
45 height: parent.height - 20px;
46 Text {
47 text: "I'm a self-closing popup";
48 }
49 TouchArea {
50 clicked => {
51 self-closing-popup.close();
52 }
53 }
54 init => {
55 root.popup-created = true;
56 }
57 }
58
59 close-from-outside := PopupWindow {
60 close-on-click: false;
61 x: 10px;
62 y: 10px;
63 width: parent.width - 20px;
64 height: parent.height - 20px;
65 Text {
66 text: "I'm a popup that only close from outside";
67 }
68 TouchArea {
69 clicked => {
70 popup-clicked += 1000;
71 }
72 }
73 init => {
74 root.popup-created = true;
75 }
76 }
77
78 ta := TouchArea {
79 clicked => {
80 root.click-count = root.click-count + 1;
81 if (root.popup-selector == 0) {
82 root.popup-selector = 3;
83 default-popup.show();
84 } else if (root.popup-selector == 1) {
85 root.popup-selector = 3;
86 self-closing-popup.show();
87 } else if (root.popup-selector == 2) {
88 root.popup-selector = 3;
89 close-from-outside.show();
90 }
91 }
92 }
93}
94/*
95
96```rust
97use slint::{platform::WindowEvent, platform::PointerEventButton, LogicalPosition};
98
99let instance = TestCase::new().unwrap();
100
101assert_eq!(instance.get_click_count(), 0);
102assert_eq!(instance.get_popup_created(), false);
103
104// --------- Default popup
105instance.set_popup_selector(0);
106instance.set_popup_created(false);
107instance.set_click_count(0);
108slint_testing::send_mouse_click(&instance, 15., 15.);
109assert_eq!(instance.get_click_count(), 1);
110assert_eq!(instance.get_popup_created(), true);
111assert_eq!(instance.get_popup_clicked(), 0);
112
113// Click to close
114slint_testing::send_mouse_click(&instance, 15., 15.);
115assert_eq!(instance.get_click_count(), 1);
116// Subsequent click to verify that it was closed
117slint_testing::send_mouse_click(&instance, 15., 15.);
118assert_eq!(instance.get_click_count(), 2);
119assert_eq!(instance.get_popup_clicked(), 1);
120
121// --------- Default popup but verify closed on press when outside
122instance.set_popup_selector(0);
123instance.set_popup_created(false);
124instance.set_click_count(0);
125
126slint_testing::send_mouse_click(&instance, 15., 15.);
127assert_eq!(instance.get_last_underneath_mouse_x(), 15.);
128assert_eq!(instance.get_last_underneath_mouse_y(), 15.);
129assert_eq!(instance.get_click_count(), 1);
130assert_eq!(instance.get_popup_created(), true);
131assert_eq!(instance.get_popup_clicked(), 1);
132
133// mouse grabbed, underneath won't notice
134instance.window().dispatch_event(WindowEvent::PointerMoved { position: LogicalPosition::new(1.0, 1.0) });
135assert_eq!(instance.get_last_underneath_mouse_x(), 15.);
136assert_eq!(instance.get_last_underneath_mouse_y(), 15.);
137
138// press should close
139instance.window().dispatch_event(WindowEvent::PointerPressed { position: LogicalPosition::new(1.0, 1.0), button: PointerEventButton::Left });
140
141// if it was closed, the underneath should receive the move event
142instance.window().dispatch_event(WindowEvent::PointerMoved { position: LogicalPosition::new(12.0, 12.0) });
143assert_eq!(instance.get_last_underneath_mouse_x(), 12.);
144assert_eq!(instance.get_last_underneath_mouse_y(), 12.);
145
146slint_testing::mock_elapsed_time(50);
147instance.window().dispatch_event(WindowEvent::PointerReleased { position: LogicalPosition::new(12.0, 12.0), button: PointerEventButton::Left });
148
149assert_eq!(instance.get_click_count(), 1);
150
151// Subsequent click to verify that it was closed
152slint_testing::send_mouse_click(&instance, 15., 15.);
153assert_eq!(instance.get_click_count(), 2);
154assert_eq!(instance.get_popup_clicked(), 1);
155
156// --------- Popup with close-on-click: false
157instance.set_popup_selector(1);
158instance.set_popup_created(false);
159instance.set_click_count(0);
160
161slint_testing::send_mouse_click(&instance, 15., 15.);
162assert_eq!(instance.get_click_count(), 1);
163assert_eq!(instance.get_popup_created(), true);
164assert_eq!(instance.get_popup_clicked(), 1);
165
166// Click outside, nothing happens
167slint_testing::send_mouse_click(&instance, 1., 1.);
168assert_eq!(instance.get_click_count(), 1);
169// Click outside again, nothing happens
170slint_testing::send_mouse_click(&instance, 295., 295.);
171assert_eq!(instance.get_click_count(), 1);
172assert_eq!(instance.get_popup_clicked(), 1);
173
174// Click on the popup, it's registered and the custom TouchArea calls close()
175slint_testing::send_mouse_click(&instance, 15., 15.);
176assert_eq!(instance.get_click_count(), 1);
177
178// Subsequent click to verify that it was closed
179slint_testing::send_mouse_click(&instance, 15., 15.);
180assert_eq!(instance.get_click_count(), 2);
181assert_eq!(instance.get_popup_clicked(), 1);
182
183// --------- Popup with close-on-click: false closed externally
184instance.set_popup_selector(2);
185instance.set_popup_created(false);
186instance.set_click_count(0);
187slint_testing::send_mouse_click(&instance, 15., 15.);
188assert_eq!(instance.get_click_count(), 1);
189assert_eq!(instance.get_popup_created(), true);
190assert_eq!(instance.get_popup_clicked(), 1);
191
192// Click outside, nothing happens
193slint_testing::send_mouse_click(&instance, 1., 1.);
194assert_eq!(instance.get_click_count(), 1);
195assert_eq!(instance.get_popup_clicked(), 1);
196
197// Click on the popup, it's registered but nothing is done
198slint_testing::send_mouse_click(&instance, 15., 15.);
199assert_eq!(instance.get_click_count(), 1);
200assert_eq!(instance.get_popup_clicked(), 1001);
201// Click again to verify that it was _not_ closed
202slint_testing::send_mouse_click(&instance, 15., 15.);
203assert_eq!(instance.get_click_count(), 1);
204assert_eq!(instance.get_popup_clicked(), 2001);
205
206// Close manually and verify that subsequent click is passed through
207instance.invoke_do_close();
208slint_testing::send_mouse_click(&instance, 15., 15.);
209assert_eq!(instance.get_click_count(), 2);
210instance.invoke_do_close();
211slint_testing::send_mouse_click(&instance, 15., 15.);
212assert_eq!(instance.get_click_count(), 3);
213assert_eq!(instance.get_popup_clicked(), 2001);
214
215
216```
217
218```cpp
219auto handle = TestCase::create();
220const TestCase &instance = *handle;
221
222assert_eq(instance.get_click_count(), 0);
223assert_eq(instance.get_popup_created(), false);
224
225// --------- Default popup
226instance.set_popup_selector(0);
227instance.set_popup_created(false);
228instance.set_click_count(0);
229slint_testing::send_mouse_click(&instance, 15., 15.);
230assert_eq(instance.get_click_count(), 1);
231assert_eq(instance.get_popup_created(), true);
232assert_eq(instance.get_popup_clicked(), 0);
233
234// Click to close
235slint_testing::send_mouse_click(&instance, 15., 15.);
236assert_eq(instance.get_click_count(), 1);
237// Subsequent click to verify that it was closed
238slint_testing::send_mouse_click(&instance, 15., 15.);
239assert_eq(instance.get_click_count(), 2);
240assert_eq(instance.get_popup_clicked(), 1);
241
242// --------- Default popup but verify closed on press when outside
243instance.set_popup_selector(0);
244instance.set_popup_created(false);
245instance.set_click_count(0);
246
247slint_testing::send_mouse_click(&instance, 15., 15.);
248assert_eq(instance.get_last_underneath_mouse_x(), 15.);
249assert_eq(instance.get_last_underneath_mouse_y(), 15.);
250assert_eq(instance.get_click_count(), 1);
251assert_eq(instance.get_popup_created(), true);
252assert_eq(instance.get_popup_clicked(), 1);
253
254// mouse grabbed, underneath won't notice
255instance.window().dispatch_pointer_move_event(slint::LogicalPosition({1.0, 1.0}));
256assert_eq(instance.get_last_underneath_mouse_x(), 15.);
257assert_eq(instance.get_last_underneath_mouse_y(), 15.);
258
259// press should close
260instance.window().dispatch_pointer_press_event(slint::LogicalPosition({1.0, 1.0}), slint::PointerEventButton::Left);
261
262// if it was closed, the underneath should receive the move event
263instance.window().dispatch_pointer_move_event(slint::LogicalPosition({12.0, 12.0}));
264assert_eq(instance.get_last_underneath_mouse_x(), 12.);
265assert_eq(instance.get_last_underneath_mouse_y(), 12.);
266
267slint_testing::mock_elapsed_time(50);
268instance.window().dispatch_pointer_release_event(slint::LogicalPosition({12.0, 12.0}), slint::PointerEventButton::Left);
269
270assert_eq(instance.get_click_count(), 1);
271
272// Subsequent click to verify that it was closed
273slint_testing::send_mouse_click(&instance, 15., 15.);
274assert_eq(instance.get_click_count(), 2);
275assert_eq(instance.get_popup_clicked(), 1);
276
277// --------- Popup with close-on-click: false
278instance.set_popup_selector(1);
279instance.set_popup_created(false);
280instance.set_click_count(0);
281
282slint_testing::send_mouse_click(&instance, 15., 15.);
283assert_eq(instance.get_click_count(), 1);
284assert_eq(instance.get_popup_created(), true);
285assert_eq(instance.get_popup_clicked(), 1);
286
287// Click outside, nothing happens
288slint_testing::send_mouse_click(&instance, 1., 1.);
289assert_eq(instance.get_click_count(), 1);
290// Click outside again, nothing happens
291slint_testing::send_mouse_click(&instance, 295., 295.);
292assert_eq(instance.get_click_count(), 1);
293assert_eq(instance.get_popup_clicked(), 1);
294
295// Click on the popup, it's registered and the custom TouchArea calls close()
296slint_testing::send_mouse_click(&instance, 15., 15.);
297assert_eq(instance.get_click_count(), 1);
298
299// Subsequent click to verify that it was closed
300slint_testing::send_mouse_click(&instance, 15., 15.);
301assert_eq(instance.get_click_count(), 2);
302assert_eq(instance.get_popup_clicked(), 1);
303
304// --------- Popup with close-on-click: false closed externally
305instance.set_popup_selector(2);
306instance.set_popup_created(false);
307instance.set_click_count(0);
308slint_testing::send_mouse_click(&instance, 15., 15.);
309assert_eq(instance.get_click_count(), 1);
310assert_eq(instance.get_popup_created(), true);
311assert_eq(instance.get_popup_clicked(), 1);
312
313// Click outside, nothing happens
314slint_testing::send_mouse_click(&instance, 1., 1.);
315assert_eq(instance.get_click_count(), 1);
316assert_eq(instance.get_popup_clicked(), 1);
317
318// Click on the popup, it's registered but nothing is done
319slint_testing::send_mouse_click(&instance, 15., 15.);
320assert_eq(instance.get_click_count(), 1);
321assert_eq(instance.get_popup_clicked(), 1001);
322
323// Click again to verify that it was _not_ closed
324slint_testing::send_mouse_click(&instance, 15., 15.);
325assert_eq(instance.get_click_count(), 1);
326assert_eq(instance.get_popup_clicked(), 2001);
327
328// Close manually and verify that subsequent click is passed through
329instance.invoke_do_close();
330slint_testing::send_mouse_click(&instance, 15., 15.);
331assert_eq(instance.get_click_count(), 2);
332instance.invoke_do_close();
333slint_testing::send_mouse_click(&instance, 15., 15.);
334assert_eq(instance.get_click_count(), 3);
335assert_eq(instance.get_popup_clicked(), 2001);
336```
337
338```js
339var instance = new slint.TestCase({});
340
341assert.equal(instance.click_count, 0);
342assert.equal(instance.popup_created, false);
343
344instance.popup_selector = 0;
345instance.popup_created = false;
346instance.click_count = 0;
347slintlib.private_api.send_mouse_click(instance, 15., 15.);
348assert.equal(instance.click_count, 1);
349assert.equal(instance.popup_created, true);
350slintlib.private_api.send_mouse_click(instance, 15., 15.);
351assert.equal(instance.click_count, 1);
352slintlib.private_api.send_mouse_click(instance, 15., 15.);
353assert.equal(instance.click_count, 2);
354
355instance.popup_selector = 1;
356instance.popup_created = false;
357instance.click_count = 0;
358slintlib.private_api.send_mouse_click(instance, 15., 15.);
359assert.equal(instance.click_count, 1);
360assert.equal(instance.popup_created, true);
361slintlib.private_api.send_mouse_click(instance, 1., 1.);
362assert.equal(instance.click_count, 1);
363slintlib.private_api.send_mouse_click(instance, 15., 15.);
364assert.equal(instance.click_count, 1);
365slintlib.private_api.send_mouse_click(instance, 15., 15.);
366assert.equal(instance.click_count, 2);
367
368instance.popup_selector = 2;
369instance.popup_created = false;
370instance.click_count = 0;
371slintlib.private_api.send_mouse_click(instance, 15., 15.);
372assert.equal(instance.click_count, 1);
373assert.equal(instance.popup_created, true);
374slintlib.private_api.send_mouse_click(instance, 15., 15.);
375assert.equal(instance.click_count, 1);
376slintlib.private_api.send_mouse_click(instance, 15., 15.);
377assert.equal(instance.click_count, 1);
378
379instance.do_close();
380slintlib.private_api.send_mouse_click(instance, 15., 15.);
381assert.equal(instance.click_count, 2);
382instance.do_close();
383slintlib.private_api.send_mouse_click(instance, 15., 15.);
384assert.equal(instance.click_count, 3);
385```
386
387*/
388