// Copyright © SixtyFPS GmbH // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-Slint-Royalty-free-2.0 OR LicenseRef-Slint-Software-3.0 import { Icons, CosmicPalette, CosmicFontSettings, CosmicSizeSettings } from "styling.slint"; export component StateLayerBase { in property border-radius <=> overlay.border-radius; in property has-focus; in property pressed; in property has-hover; in property checked; in property enabled: true; in property focus-boder-margin: 3px; out property background <=> overlay.background; @children overlay := Rectangle {} if (root.has-focus && root.enabled) : Rectangle { width: root.width + root.focus-boder-margin * 2; height: root.height + root.focus-boder-margin * 2; border-width: 1px; border-radius: root.border-radius + root.focus-boder-margin; border-color: CosmicPalette.state-focus; } states [ pressed when root.pressed : { overlay.background: CosmicPalette.state-pressed; } hover when root.has-hover : { overlay.background: CosmicPalette.state-hover; } checked when root.checked : { overlay.background: CosmicPalette.state-selected; } ] } export component StateLayer inherits TouchArea { in property border-radius <=> base.border-radius; out property has-focus: focus-scope.has-focus; in-out property checked; in property focus-boder-margin <=> base.focus-boder-margin; forward-focus: focus-scope; focus-scope := FocusScope { x: 0; width: 0; // Do not react on clicks enabled <=> root.enabled; key-pressed(event) => { if (event.text == " " || event.text == "\n") { root.clicked(); return accept; } return reject; } } base := StateLayerBase { width: 100%; height: 100%; has-focus: root.has-focus; pressed: root.pressed; has-hover: root.has-hover; checked: root.checked; enabled: root.enabled; @children } } export component MenuBorder inherits Rectangle { border-radius: 8px; background: CosmicPalette.alternate-background; drop-shadow-blur: 16px; drop-shadow-offset-y: 4px; drop-shadow-color: CosmicPalette.shadow; Rectangle { border-width: 1px; border-radius: parent.border-radius; border-color: CosmicPalette.control-divider; } } export component ListItem { in property is-selected; in property item; in property has-focus; in property has-hover; in property pressed; in property index; in property pressed-x; in property pressed-y; min-width: layout.min-width; min-height: max(CosmicSizeSettings.item-height, layout.min-height); vertical-stretch: 0; horizontal-stretch: 1; accessible-role: list-item; accessible-label: root.item.text; accessible-item-selectable: true; accessible-item-selected: root.is-selected; accessible-item-index: root.index; states [ is-selected when root.is-selected : { text.color: CosmicPalette.accent-text; } ] layout := HorizontalLayout { padding-bottom: 8px; StateLayerBase { width: 100%; pressed: root.pressed; has-hover: root.has-hover; has-focus: root.has-focus; checked: root.is-selected; border-radius: 16px; focus-boder-margin: 0; HorizontalLayout { padding-left: 16px; padding-right: 16px; spacing: 8px; text := Text { text: root.item.text; color: CosmicPalette.control-foreground; font-size: CosmicFontSettings.body.font-size; font-weight: CosmicFontSettings.body.font-weight; vertical-alignment: center; horizontal-alignment: left; overflow: elide; accessible-role: none; } Image { width: 16px; height: 16px; y: (parent.height - self.height) / 2; visible: root.is-selected; colorize: text.color; source: Icons.check-mark; accessible-role: none; } } @children } } }