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