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
4import { ComboBox } from "std-widgets.slint";
5export component TestCase inherits Window {
6 width: 200px;
7 height: 200px;
8
9 in-out property <string> output;
10 TouchArea {
11 clicked => { output += "clicked-under\n"; }
12 }
13
14 VerticalLayout {
15 alignment: center;
16 box := ComboBox {
17 model: ["Aaa", "Bbb", "Ccc"];
18 selected => {
19 output += "selected("+self.current-value+","+self.current-index+")\n";
20 }
21 }
22 }
23
24 public function unfocus() {
25 box.clear-focus();
26 }
27
28 in-out property current-index <=> box.current-index;
29 in-out property current-value <=> box.current-value;
30 in-out property model <=> box.model;
31 out property has-focus <=> box.has-focus;
32}
33
34/*
35
36
37```rust
38use std::rc::Rc;
39use slint::{platform::WindowEvent, platform::Key, VecModel, SharedString, LogicalPosition};
40use i_slint_backend_testing::mock_elapsed_time;
41
42let instance = TestCase::new().unwrap();
43
44assert_eq!(instance.get_current_value(), "Aaa");
45assert_eq!(instance.get_current_index(), 0);
46assert_eq!(instance.get_has_focus(), false);
47
48let mut combobox_search = slint_testing::ElementHandle::find_by_element_id(&instance, "TestCase::box");
49let combobox = combobox_search.next().unwrap();
50assert_eq!(combobox.accessible_expandable(), Some(true));
51assert_eq!(combobox.accessible_expanded(), Some(false));
52assert_eq!(combobox.accessible_value(), Some(SharedString::from("Aaa")));
53
54// Change the index programmatically
55instance.set_current_index(1);
56assert_eq!(instance.get_current_value(), "Bbb");
57assert_eq!(instance.get_current_index(), 1);
58assert_eq!(combobox.accessible_value(), Some(SharedString::from("Bbb")));
59assert_eq!(instance.get_output(), "");
60instance.set_current_index(0);
61assert_eq!(instance.get_current_value(), "Aaa");
62assert_eq!(instance.get_current_index(), 0);
63assert_eq!(combobox.accessible_value(), Some(SharedString::from("Aaa")));
64assert_eq!(instance.get_output(), "");
65assert_eq!(instance.get_has_focus(), false);
66
67// Open the combobox
68slint_testing::send_mouse_click(&instance, 100., 100.);
69assert_eq!(instance.get_output(), "");
70assert_eq!(instance.get_has_focus(), true);
71assert_eq!(combobox.accessible_expanded(), Some(true));
72
73// click outside of the combobox, this should close it
74slint_testing::send_mouse_click(&instance, 100., 10.);
75assert_eq!(instance.get_output(), "");
76assert_eq!(instance.get_current_value(), "Aaa");
77assert_eq!(instance.get_current_index(), 0);
78assert_eq!(combobox.accessible_value(), Some(SharedString::from("Aaa")));
79assert_eq!(instance.get_has_focus(), true);
80assert_eq!(combobox.accessible_expanded(), Some(false));
81
82// click outside of the combobox again
83slint_testing::send_mouse_click(&instance, 100., 10.);
84assert_eq!(instance.get_output(), "clicked-under\n");
85instance.set_output(Default::default());
86assert_eq!(instance.get_current_value(), "Aaa");
87assert_eq!(instance.get_current_index(), 0);
88assert_eq!(combobox.accessible_value(), Some(SharedString::from("Aaa")));
89assert_eq!(instance.get_has_focus(), true);
90assert_eq!(combobox.accessible_expanded(), Some(false));
91
92
93// The arrow change the values
94slint_testing::send_keyboard_string_sequence(&instance, &SharedString::from(Key::DownArrow));
95assert_eq!(instance.get_current_value(), "Bbb");
96assert_eq!(instance.get_current_index(), 1);
97assert_eq!(combobox.accessible_value(), Some(SharedString::from("Bbb")));
98assert_eq!(instance.get_output(), "selected(Bbb,1)\n");
99slint_testing::send_keyboard_string_sequence(&instance, &SharedString::from(Key::DownArrow));
100assert_eq!(instance.get_current_value(), "Ccc");
101assert_eq!(instance.get_current_index(), 2);
102assert_eq!(combobox.accessible_value(), Some(SharedString::from("Ccc")));
103assert_eq!(instance.get_output(), "selected(Bbb,1)\nselected(Ccc,2)\n");
104slint_testing::send_keyboard_string_sequence(&instance, &SharedString::from(Key::UpArrow));
105assert_eq!(instance.get_current_value(), "Bbb");
106assert_eq!(instance.get_current_index(), 1);
107assert_eq!(combobox.accessible_value(), Some(SharedString::from("Bbb")));
108assert_eq!(instance.get_output(), "selected(Bbb,1)\nselected(Ccc,2)\nselected(Bbb,1)\n");
109instance.set_output(Default::default());
110
111// show the popup
112slint_testing::send_keyboard_string_sequence(&instance, &SharedString::from(Key::Return));
113assert_eq!(instance.get_output(), "");
114assert_eq!(combobox.accessible_expanded(), Some(true));
115// click outside causes the popup to close
116slint_testing::send_mouse_click(&instance, 100., 10.);
117assert_eq!(instance.get_output(), "");
118assert_eq!(instance.get_has_focus(), true);
119assert_eq!(combobox.accessible_expanded(), Some(false));
120slint_testing::send_mouse_click(&instance, 100., 10.);
121assert_eq!(instance.get_output(), "clicked-under\n");
122assert_eq!(instance.get_has_focus(), true);
123assert_eq!(combobox.accessible_expanded(), Some(false));
124instance.set_output(Default::default());
125
126instance.set_current_index(0);
127
128
129// show the popup
130slint_testing::send_keyboard_string_sequence(&instance, &SharedString::from(Key::Return));
131// The arrow change the values while the popup is shown
132slint_testing::send_keyboard_string_sequence(&instance, &SharedString::from(Key::DownArrow));
133assert_eq!(instance.get_current_value(), "Bbb");
134assert_eq!(instance.get_current_index(), 1);
135assert_eq!(combobox.accessible_value(), Some(SharedString::from("Bbb")));
136assert_eq!(instance.get_output(), "selected(Bbb,1)\n");
137slint_testing::send_keyboard_string_sequence(&instance, &SharedString::from(Key::DownArrow));
138assert_eq!(instance.get_current_value(), "Ccc");
139assert_eq!(instance.get_current_index(), 2);
140assert_eq!(combobox.accessible_value(), Some(SharedString::from("Ccc")));
141assert_eq!(instance.get_output(), "selected(Bbb,1)\nselected(Ccc,2)\n");
142slint_testing::send_keyboard_string_sequence(&instance, &SharedString::from(Key::UpArrow));
143assert_eq!(instance.get_current_value(), "Bbb");
144assert_eq!(instance.get_current_index(), 1);
145assert_eq!(combobox.accessible_value(), Some(SharedString::from("Bbb")));
146assert_eq!(instance.get_output(), "selected(Bbb,1)\nselected(Ccc,2)\nselected(Bbb,1)\n");
147// close the popup
148slint_testing::send_keyboard_string_sequence(&instance, &SharedString::from(Key::Escape));
149assert_eq!(instance.get_current_value(), "Bbb");
150assert_eq!(instance.get_current_index(), 1);
151assert_eq!(combobox.accessible_value(), Some(SharedString::from("Bbb")));
152assert_eq!(instance.get_output(), "selected(Bbb,1)\nselected(Ccc,2)\nselected(Bbb,1)\n");
153instance.set_output(Default::default());
154slint_testing::send_mouse_click(&instance, 100., 10.);
155assert_eq!(instance.get_output(), "clicked-under\n");
156assert_eq!(combobox.accessible_expanded(), Some(false));
157assert_eq!(instance.get_has_focus(), true);
158instance.set_output(Default::default());
159
160
161// The accessible expand action should open the popup
162combobox.invoke_accessible_expand_action();
163assert_eq!(instance.get_output(), "");
164assert_eq!(instance.get_has_focus(), true);
165assert_eq!(combobox.accessible_expanded(), Some(true));
166// close the popup
167slint_testing::send_keyboard_string_sequence(&instance, &SharedString::from(Key::Escape));
168assert_eq!(instance.get_output(), "");
169assert_eq!(instance.get_has_focus(), true);
170assert_eq!(combobox.accessible_expanded(), Some(false));
171
172// Scroll with the wheel
173let wheel_change_value = !module_path!().contains("cupertino");
174instance.set_output(Default::default());
175instance.window().dispatch_event(WindowEvent::PointerScrolled { position: LogicalPosition::new(100.0, 100.0), delta_x: 0.0, delta_y: 20.0 });
176if wheel_change_value {
177 assert_eq!(instance.get_current_value(), "Aaa");
178 assert_eq!(instance.get_current_index(), 0);
179 assert_eq!(instance.get_output(), "selected(Aaa,0)\n");
180} else {
181 assert_eq!(instance.get_current_value(), "Bbb");
182 assert_eq!(instance.get_current_index(), 1);
183 assert_eq!(instance.get_output(), "");
184}
185instance.window().dispatch_event(WindowEvent::PointerScrolled { position: LogicalPosition::new(100.0, 100.0), delta_x: 0.0, delta_y: -5.0 });
186assert_eq!(instance.get_has_focus(), true);
187assert_eq!(instance.get_current_value(), "Bbb");
188assert_eq!(instance.get_current_index(), 1);
189if wheel_change_value {
190 assert_eq!(instance.get_output(), "selected(Aaa,0)\nselected(Bbb,1)\n");
191}
192// When not having focus, do nothing
193instance.invoke_unfocus();
194instance.set_output(Default::default());
195assert_eq!(instance.get_has_focus(), false);
196instance.window().dispatch_event(WindowEvent::PointerScrolled { position: LogicalPosition::new(100.0, 100.0), delta_x: 0.0, delta_y: 20.0 });
197assert_eq!(instance.get_current_value(), "Bbb");
198assert_eq!(instance.get_current_index(), 1);
199instance.window().dispatch_event(WindowEvent::PointerScrolled { position: LogicalPosition::new(100.0, 100.0), delta_x: 0.0, delta_y: -5.0 });
200assert_eq!(instance.get_has_focus(), false);
201assert_eq!(instance.get_current_value(), "Bbb");
202assert_eq!(instance.get_current_index(), 1);
203assert_eq!(instance.get_output(), "");
204slint_testing::send_keyboard_string_sequence(&instance, "\t");
205assert_eq!(instance.get_has_focus(), true);
206
207// Set current-index to -1
208instance.set_current_index(-1);
209mock_elapsed_time(500);
210assert_eq!(instance.get_current_value(), &SharedString::from(""));
211assert_eq!(combobox.accessible_value(), Some(SharedString::from("")));
212
213// Replace model
214instance.set_model(Rc::new(VecModel::from_slice(&[SharedString::from("A"), SharedString::from("B")])).into());
215mock_elapsed_time(500);
216assert_eq!(instance.get_current_index(), 0);
217assert_eq!(instance.get_current_value(), &SharedString::from("A"));
218assert_eq!(combobox.accessible_value(), Some(SharedString::from("A")));
219```
220
221*/
222