Workcat: cute desktop cat, no window closing
Reworks the example into a pure desktop-pet: the cat wanders, sits, grooms, stretches, dashes and naps, reacts to petting and dragging, and follows the cursor with its eyes. The window-scanning and Accessibility code is gone. The cat is drawn from rounded primitives plus Shape paths in a fixed 100x90 design space, so it scales cleanly to any size. Linux/X11 is the primary target: the tray is optional, Wayland gets a warning, and WORKCAT_X11_BYPASS / WORKCAT_OPAQUE cover uncooperative window managers. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
commit
acef398f49
17 files changed
+1584
No files matched your search
@@ -0,0 +1,169 @@
|
||||
pragma ComponentBehavior: Bound
|
||||
import QtQuick
|
||||
import QtQuick.Controls.Basic
|
||||
import QtQuick.Layouts
|
||||
import Workcat
|
||||
|
||||
Window {
|
||||
id: win
|
||||
|
||||
required property CatController cat
|
||||
required property AppSettings settings
|
||||
|
||||
readonly property var coats: [
|
||||
{ name: qsTr("Apricot"), color: "#f4b183" },
|
||||
{ name: qsTr("Ivory"), color: "#f3ede2" },
|
||||
{ name: qsTr("Grey"), color: "#a4a6b3" },
|
||||
{ name: qsTr("Charcoal"), color: "#3c3b46" },
|
||||
{ name: qsTr("Sage"), color: "#a9bfa0" },
|
||||
{ name: qsTr("Plum"), color: "#9a7bb0" }
|
||||
]
|
||||
|
||||
width: 440
|
||||
height: 600
|
||||
minimumWidth: 380
|
||||
minimumHeight: 520
|
||||
title: qsTr("Workcat")
|
||||
color: "#faf7f2"
|
||||
flags: Qt.Dialog | Qt.WindowStaysOnTopHint
|
||||
|
||||
ColumnLayout {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 24
|
||||
spacing: 18
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: 16
|
||||
Cat {
|
||||
Layout.preferredWidth: 110
|
||||
Layout.preferredHeight: 99
|
||||
coat: win.settings.coat
|
||||
mood: "sitting"
|
||||
petted: previewHover.hovered
|
||||
HoverHandler { id: previewHover }
|
||||
}
|
||||
ColumnLayout {
|
||||
Layout.fillWidth: true
|
||||
spacing: 4
|
||||
Label {
|
||||
Layout.fillWidth: true
|
||||
text: qsTr("Workcat")
|
||||
font.pixelSize: 26
|
||||
font.bold: true
|
||||
color: "#2f2a36"
|
||||
}
|
||||
Label {
|
||||
Layout.fillWidth: true
|
||||
wrapMode: Text.WordWrap
|
||||
text: qsTr("A little cat that wanders along the bottom of your screen. Drag it around, pet it with a click, and it will purr.")
|
||||
color: "#7a7484"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GroupBox {
|
||||
Layout.fillWidth: true
|
||||
title: qsTr("Coat")
|
||||
Flow {
|
||||
anchors.fill: parent
|
||||
spacing: 10
|
||||
Repeater {
|
||||
model: win.coats
|
||||
Column {
|
||||
id: swatch
|
||||
required property var modelData
|
||||
readonly property bool selected: Qt.colorEqual(win.settings.coat, modelData.color)
|
||||
spacing: 4
|
||||
Rectangle {
|
||||
width: 40; height: 40
|
||||
radius: 20
|
||||
color: swatch.modelData.color
|
||||
border.width: swatch.selected ? 3 : 1
|
||||
border.color: swatch.selected ? "#f25f7a" : "#d8d2ca"
|
||||
antialiasing: true
|
||||
Accessible.role: Accessible.RadioButton
|
||||
Accessible.name: swatch.modelData.name
|
||||
Accessible.checked: swatch.selected
|
||||
activeFocusOnTab: true
|
||||
Keys.onSpacePressed: win.settings.coat = swatch.modelData.color
|
||||
TapHandler { onTapped: win.settings.coat = swatch.modelData.color }
|
||||
}
|
||||
Label {
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
text: swatch.modelData.name
|
||||
font.pixelSize: 11
|
||||
color: "#7a7484"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
GridLayout {
|
||||
Layout.fillWidth: true
|
||||
columns: 2
|
||||
columnSpacing: 14
|
||||
rowSpacing: 12
|
||||
|
||||
Label { text: qsTr("Size") }
|
||||
Slider {
|
||||
Layout.fillWidth: true
|
||||
from: 72; to: 260; stepSize: 4
|
||||
value: win.settings.catSize
|
||||
onMoved: win.settings.catSize = value
|
||||
}
|
||||
|
||||
Label { text: qsTr("Pace") }
|
||||
Slider {
|
||||
Layout.fillWidth: true
|
||||
from: 10; to: 200; stepSize: 5
|
||||
value: win.settings.walkSpeed
|
||||
onMoved: win.settings.walkSpeed = value
|
||||
}
|
||||
|
||||
Label { text: qsTr("Eyes") }
|
||||
Switch {
|
||||
text: qsTr("Follow the mouse")
|
||||
checked: win.settings.followCursor
|
||||
onToggled: win.settings.followCursor = checked
|
||||
}
|
||||
|
||||
Label { text: qsTr("Cat") }
|
||||
Switch {
|
||||
text: checked ? qsTr("Napping") : qsTr("Awake")
|
||||
checked: win.cat.paused
|
||||
onToggled: win.cat.paused = checked
|
||||
}
|
||||
}
|
||||
|
||||
GroupBox {
|
||||
Layout.fillWidth: true
|
||||
title: qsTr("Tricks")
|
||||
Flow {
|
||||
anchors.fill: parent
|
||||
spacing: 8
|
||||
Button { text: qsTr("Sit"); onClicked: win.cat.doTrick(CatController.Sitting) }
|
||||
Button { text: qsTr("Groom"); onClicked: win.cat.doTrick(CatController.Grooming) }
|
||||
Button { text: qsTr("Stretch"); onClicked: win.cat.doTrick(CatController.Stretching) }
|
||||
Button { text: qsTr("Dash"); onClicked: win.cat.doTrick(CatController.Running) }
|
||||
Button { text: qsTr("Nap"); onClicked: win.cat.doTrick(CatController.Sleeping) }
|
||||
}
|
||||
}
|
||||
|
||||
Item { Layout.fillHeight: true }
|
||||
|
||||
RowLayout {
|
||||
Layout.fillWidth: true
|
||||
Label {
|
||||
Layout.fillWidth: true
|
||||
text: qsTr("%n pet(s) so far.", "", win.settings.petCount)
|
||||
color: "#7a7484"
|
||||
}
|
||||
Button {
|
||||
text: qsTr("Quit")
|
||||
onClicked: Qt.quit()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user