// Copyright (C) 2026 Danilo M. // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License version 2 as // published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. import QtQuick import "../.." import "../appearance" import "../../companion" // The desktop companion's settings: whether she is shown, the same // preference SUPER+\ toggles, so the switch follows the key; and where her // wallpaper list is, marked with the heart in the wallpaper picker. Module { name: "companion" label: "Companion" // nf-md-account_heart, present in Inconsolata Nerd Font. icon: "\u{F0899}" settings: true group: "Companion" keywords: ["companion", "2b", "mascot", "character", "show", "hide", "wallpaper", "blush", "leotard", "timeout"] page: Component { Page { title: "Companion" Column { width: parent.width spacing: 6 Item { width: parent.width height: 34 Text { id: lbl anchors { left: parent.left; verticalCenter: parent.verticalCenter } width: 160 text: "Shown" color: Theme.subtext font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 3 } } Switch { id: sw anchors { left: lbl.right; leftMargin: 8; verticalCenter: parent.verticalCenter } checked: Prefs.companion onToggled: on => Prefs.setCompanion(on) } Text { anchors { left: sw.right; leftMargin: 10; right: parent.right; verticalCenter: parent.verticalCenter } elide: Text.ElideRight text: "Also SUPER+\\. Kept across restarts." color: Theme.overlay font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 5 } } } // After the self-destruct. Off keeps the leotard until she is // hidden and shown again; turning it back on starts from the // seconds in the field. Item { width: parent.width height: 34 Text { id: lblSk anchors { left: parent.left; verticalCenter: parent.verticalCenter } width: 160 text: "Leotard timeout" color: Theme.subtext font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 3 } } Switch { id: swSk anchors { left: lblSk.right; leftMargin: 8; verticalCenter: parent.verticalCenter } checked: Prefs.companionSkirtless > 0 onToggled: on => Prefs.setCompanionSkirtless(on ? (parseInt(fSk.value) || 60) : 0) } Field { id: fSk anchors { left: swSk.right; leftMargin: 10; verticalCenter: parent.verticalCenter } width: 60 enabled: swSk.checked opacity: enabled ? 1 : 0.4 value: String(Prefs.companionSkirtless || 60) placeholder: "60" onEdited: { const n = parseInt(value); if (n >= 1 && String(n) === value.trim()) Prefs.setCompanionSkirtless(n); else value = String(Prefs.companionSkirtless || 60); } } Text { anchors { left: fSk.right; leftMargin: 10; right: parent.right; verticalCenter: parent.verticalCenter } elide: Text.ElideRight text: swSk.checked ? "seconds" : "until she is hidden and shown again" color: Theme.overlay font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 5 } } } Item { width: parent.width height: 34 Text { id: lbl2 anchors { left: parent.left; verticalCenter: parent.verticalCenter } width: 160 text: "Wallpaper list" color: Theme.subtext font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 3 } } Field { anchors { left: lbl2.right; leftMargin: 8; right: parent.right; verticalCenter: parent.verticalCenter } value: Prefs.companionBlushFile placeholder: Admired.defaultPath.replace(Admired.home, "~") onEdited: Prefs.setCompanionBlushFile(value) } } Text { width: parent.width wrapMode: Text.WordWrap text: "One path per line. She blushes at these on an empty workspace; the heart in Wallpaper adds and removes them." color: Theme.overlay font { family: Theme.fontFamily; pixelSize: Theme.fontSize - 5 } } } } } }