// SPDX-FileCopyrightText: 2024 vivi developers // SPDX-License-Identifier: MIT import { CheckBoxBase, FocusTouchArea, Border, HorizontalLayoutBase } from "../foundation.slint"; import { StateLayer } from "./state_layer.slint"; import { MagicIcon } from "./magic_icon.slint"; import { MagicText } from "./magic_text.slint"; import { MagicPalette, MagicFontSettings, MagicIconSettings, MagicAnimationSettings, MagicSizeSettings, MagicIconSettings, MagicBorderSettings, MagicLayoutSettings } from "./styling.slint"; export component Switch inherits CheckBoxBase { in property text; in property checked_icon; in property unchecked_icon; property indicator_padding: 2px; style: { border_style: { background: !root.checked ? MagicPalette.background : MagicPalette.accent_background, border_brush: MagicPalette.border, border_width: MagicBorderSettings.control_border_width, }, box_style: { background: MagicPalette.foreground, border_width: MagicBorderSettings.control_border_width, border_brush: MagicPalette.border, }, box_icon_style: { icon_size: MagicIconSettings.body.icon_size, foreground: MagicPalette.accent_foreground, }, text_style: MagicFontSettings.body, layout_style: { spacing: MagicLayoutSettings.control_spacing, } }; min_width: content_layer.min_width; forward_focus: touch_area; accessible_role: switch; accessible_action_default => { touch_area.clicked(); } touch_area := FocusTouchArea { width: 100%; height: 100%; enabled: root.enabled; mouse_cursor: root.enabled ? pointer : not-allowed; clicked => { root.toggle(); } } content_layer := HorizontalLayoutBase { style: root.style.layout_style; track := Border { width: 2 * self.height; min_height: MagicSizeSettings.box_height; horizontal_stretch: 0; style: root.style.border_style; border_radius: self.height / 2; state_layer := StateLayer { width: 100%; height: 100%; border_radius: track.border-radius; pressed: touch_area.pressed || touch_area.enter_pressed; has_hover: touch_area.has_hover; has_focus: touch_area.has_focus; } if root.checked_icon.width > 0 && root.checked_icon.height > 0 : MagicIcon { x: root.indicator_padding + (indicator.width - self.width) / 2; icon: root.checked_icon; style: root.style.box_icon_style; } if root.unchecked_icon.width > 0 && root.unchecked_icon.height > 0 : MagicIcon { x: parent.width - root.indicator_padding - (indicator.width - self.width) / 2 - self.width; icon: root.unchecked_icon; style: root.style.box_icon_style; colorize: root.style.text_style.foreground; } indicator := Border { x: root.indicator_padding; width: self.height; height: parent.height - 2 * root.indicator_padding; style: root.style.box_style; border_radius: self.height / 2; states [ checked when root.checked : { x: parent.width - self.width - root.indicator_padding; background: MagicPalette.background; } ] animate x { duration: MagicAnimationSettings.fast_resize_duration; } } animate background { duration: MagicAnimationSettings.color_duration; } } if root.text != "" : MagicText { text: root.text; style: root.style.text_style; vertical_alignment: center; } } states [ disabled when !root.enabled : { root.opacity: 0.5; } ] }