// Copyright © SixtyFPS GmbH // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0 export component SpinBoxBase { in property minimum; in property maximum: 100; in property enabled: true; in property color <=> text-input.color; in property font-size <=> text-input.font-size; in property font-weight <=> text-input.font-weight; in property selection-background-color <=> text-input.selection-background-color; in property selection-foreground-color <=> text-input.selection-foreground-color; in property horizontal-alignment <=> text-input.horizontal-alignment; in property step-size: 1; out property has-focus <=> text-input.has-focus; in-out property value: minimum; callback edited(value: int); public function update-value(value: int) { if root.value == value || (value >= root.minimum && value <= root.maximum) { root.value = value; root.edited(value); } } public function increment() { root.update-value(root.value + root.step-size); } public function decrement() { root.update-value(root.value - root.step-size); } private property scroll-delta: 2px; forward-focus: text-input; changed value => { root.set-text-to-value(); } function set-text-to-value() { text-input.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; } reject } } text-input := TextInput { vertical-alignment: center; horizontal-alignment: left; text: root.value; enabled: root.enabled; width: 100%; height: 100%; // Disable TextInput's built-in accessibility support as the widget takes care of that. accessible-role: none; accepted => { if !self.text.is-float() { root.set-text-to-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.set-text-to-value(); } } } }