slint/internal/compiler/widgets/common/combobox-base.slint
2024-01-17 15:41:32 +01:00

79 lines
No EOL
2.3 KiB
Text

// Copyright © SixtyFPS GmbH <info@slint.dev>
// SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-1.1 OR LicenseRef-Slint-commercial
export component ComboBoxBase {
in property <[string]> model;
in property <bool> enabled <=> i-focus-scope.enabled;
out property <bool> has-focus: i-focus-scope.has-focus && root.enabled;
out property <bool> pressed <=> i-touch-area.pressed;
out property <bool> has-hover: i-touch-area.has-hover;
in-out property <int> current-index: 0;
in-out property <string> current-value: root.model[root.current-index];
callback selected(/* current-value */ string);
callback show-popup();
public function select(index: int) {
if (!root.enabled) {
return;
}
root.current-index = index;
root.current-value = root.model[root.current-index];
root.selected(root.current-value);
}
public function move-selection-up() {
root.select(Math.max(root.current-index - 1, 0));
}
public function move-selection-down() {
root.select(Math.min(root.current-index + 1, root.model.length - 1));
}
private property <length> scroll-delta: 2px;
forward-focus: i-focus-scope;
i-focus-scope := FocusScope {
key-pressed(event) => {
if (!self.enabled) {
return reject;
}
if (event.text == Key.UpArrow) {
root.move-selection-up();
return accept;
} else if (event.text == Key.DownArrow) {
root.move-selection-down();
return accept;
} else if (event.text == Key.Return) {
root.show-popup();
}
return reject;
}
i-touch-area := TouchArea {
enabled: root.enabled;
clicked => {
root.focus();
root.show-popup();
}
scroll-event(event) => {
if (event.delta-y < -root.scroll-delta) {
root.move-selection-down();
return accept;
}
if (event.delta-y > root.scroll-delta) {
root.move-selection-up();
return accept;
}
reject
}
}
}
}