// Copyright © SixtyFPS GmbH // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-1.1 OR LicenseRef-Slint-commercial export component SpinBoxBase { in property minimum; in property maximum: 100; in property enabled: true; in property color <=> i-text-input.color; in property font-size <=> i-text-input.font-size; in property font-weight <=> i-text-input.font-weight; in property selection-background-color <=> i-text-input.selection-background-color; in property selection-foreground-color <=> i-text-input.selection-foreground-color; in property horizontal-alignment <=> i-text-input.horizontal-alignment; out property has-focus <=> i-text-input.has-focus; in-out property value; callback edited(/* value */ int); public function update-value(value: int) { if (value >= root.minimum && value <= root.maximum) { root.value = value; root.edited(value); } i-text-input.text = root.value; } public function increment() { root.update-value(root.value + 1); } public function decrement() { root.update-value(root.value - 1); } private property scroll-delta: 2px; forward-focus: i-text-input; i-text-input := TextInput { vertical-alignment: center; horizontal-alignment: left; text: root.value; enabled: root.enabled; width: 100%; height: 100%; accepted => { if (!self.text.is-float()) { self.text = root.value; } } edited => { if (self.text.is-float() && self.text.to-float() != root.value) { root.update-value(self.text.to-float()); } else if (!self.text.is-float()) { self.text = root.value; } } } TouchArea { enabled: root.enabled; scroll-event(event) => { if (event.delta-y < 0) { root.increment(); return accept; } if (event.delta-y > 0) { root.decrement(); return accept; } return reject; } clicked => { i-text-input.focus(); } } }