show the thing: screenshots, and a harness that makes them

Nobody installs a desktop widget they have not seen. Three shots go in the
README -- the Nativity Fast, where the week runs through three fasting
levels; ROCOR on 7 January, where the corner reads 25 December and makes the
old-calendar point in one glance; and Great Week, which uses nearly every
level there is.

shot.qml renders the real widget on a plain backdrop at a fixed position on
the overlay layer, so a screen grab of that rectangle is the widget and never
whatever was behind it. Typikon gains a forDate property, which is what lets
a screenshot show Great Week in September, and is worth having anyway for
looking ahead.

The header note now always carries the church date instead of repeating the
season the line below it already gives.
This commit is contained in:
funkpower
2026-09-18 09:52:38 -04:00
parent 92b2efbd51
commit 70e671c6f6
7 changed files with 91 additions and 14 deletions
+3 -6
View File
@@ -6,9 +6,9 @@ import qs.services
Panel {
id: root
title: "Church calendar"
note: Typikon.available
? (Typikon.season || Typikon.churchDate)
: ""
// The church date, always: on the old calendar it is the answer people
// came for, and on the new it is a harmless echo of the title bar.
note: Typikon.available ? Typikon.churchDate : ""
// The glyph carries what kind of fast it is, so obligation has to be shown
// some other way or it disappears with the text: the weekday takes the
@@ -80,9 +80,6 @@ Panel {
Layout.fillWidth: true
text: {
const bits = [Typikon.weekday];
if (Typikon.churchDate !== ""
&& Typikon.churchDate !== Qt.formatDate(new Date(), "d MMMM"))
bits.push(Typikon.churchDate);
if (Typikon.season !== "") bits.push(Typikon.season);
if (Typikon.obligatory) bits.push("obligatory");
return bits.join(" · ");
+7
View File
@@ -17,6 +17,9 @@ Singleton {
property string jurisdiction: ""
// Today plus the next six, so the week ahead is visible at a glance.
property int days: 7
// Empty means today. Set it to an ISO date to look at a different one --
// useful for seeing what Great Week will ask of you before it arrives.
property string forDate: ""
property bool available: false
property string error: ""
@@ -51,6 +54,8 @@ Singleton {
// midnight and at no other moment.
readonly property string _day: Qt.formatDateTime(clock.date, "yyyy-MM-dd")
on_DayChanged: root.refresh()
onJurisdictionChanged: root.refresh()
onForDateChanged: root.refresh()
Component.onCompleted: root.refresh()
Process {
@@ -59,6 +64,8 @@ Singleton {
const c = ["typikon", "--json", "--days", String(root.days)];
if (root.jurisdiction !== "")
c.push("--jurisdiction", root.jurisdiction);
if (root.forDate !== "")
c.push("--date", root.forDate);
return c;
}
stdout: StdioCollector {
+63
View File
@@ -0,0 +1,63 @@
//@ pragma UseQApplication
// A harness for taking the README screenshots: the real widget, on a plain
// backdrop, at a known position. Not part of the shell -- run it with
//
// SHOT_JURISDICTION=rocor SHOT_DATE=2027-01-07 quickshell -p quickshell/shot.qml
//
// It sits on the overlay layer at a fixed offset so a screen grab of that
// rectangle is always the widget and never whatever was behind it.
import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.Wayland
import qs
import qs.modules
import qs.services
ShellRoot {
PanelWindow {
id: win
screen: Quickshell.screens[0]
WlrLayershell.layer: WlrLayer.Overlay
WlrLayershell.namespace: "horologion-shot"
exclusionMode: ExclusionMode.Ignore
color: "transparent"
anchors { top: true; left: true }
margins { top: 60; left: 60 }
// Fixed, so a screen grab of exactly this rectangle is exactly this
// window and never the desktop underneath it. The widget is shorter
// than this; the crop takes care of the difference.
implicitWidth: Config.width + 68
implicitHeight: 700
Rectangle {
anchors.fill: parent
gradient: Gradient {
GradientStop { position: 0.0; color: "#1b2016" }
GradientStop { position: 1.0; color: "#0e100c" }
}
ColumnLayout {
id: body
anchors.top: parent.top
anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: 34
width: Config.width
Horologion {
Component.onCompleted: {
const j = Quickshell.env("SHOT_JURISDICTION");
const d = Quickshell.env("SHOT_DATE");
if (j && j !== "") Typikon.jurisdiction = j;
if (d && d !== "") Typikon.forDate = d;
}
}
}
}
}
}