aboutsummaryrefslogtreecommitdiff
path: root/quickshell/Calendar.qml
diff options
context:
space:
mode:
Diffstat (limited to 'quickshell/Calendar.qml')
-rw-r--r--quickshell/Calendar.qml143
1 files changed, 143 insertions, 0 deletions
diff --git a/quickshell/Calendar.qml b/quickshell/Calendar.qml
new file mode 100644
index 0000000..0b79553
--- /dev/null
+++ b/quickshell/Calendar.qml
@@ -0,0 +1,143 @@
+import QtQuick
+import QtQuick.Layouts
+import Quickshell
+import Quickshell.Io
+
+Rectangle {
+ id: calendarRoot
+
+ color: shellRoot.black
+ antialiasing: true
+ focus: true
+
+ property bool isVisible: false
+ property int monthOffset: 0
+
+ signal requestClose()
+ Keys.onEscapePressed: {
+ monthOffset = 0;
+ requestClose()
+ }
+
+ Column {
+ anchors.fill: parent
+ spacing: 1
+ Rectangle {
+ width: parent.width
+ height: parent.height
+ color: shellRoot.black
+
+ Column {
+ anchors.fill: parent
+ anchors.margins: 5
+ spacing: 6
+
+ RowLayout {
+ width: parent.width
+ Text {
+ text: " <"
+ font.pixelSize: 20
+ font.family: shellRoot.fontFamily
+ color: shellRoot.white
+ MouseArea {
+ anchors.fill: parent
+ onClicked: monthOffset--;
+ }
+ }
+ Item { Layout.fillWidth: true }
+ Text {
+ text: {
+ const now = new Date()
+ const monthNames = ["January", "February", "March", "April", "May", "June",
+ "July", "August", "September", "October", "November", "December"]
+ let shiftedMonth = now.getMonth() + monthOffset;
+ let year = now.getFullYear();
+ year += Math.floor(shiftedMonth / 12);
+ shiftedMonth %= 12;
+ return monthNames[shiftedMonth] + " " + year
+ }
+ font.family: shellRoot.fontFamily
+ font.pixelSize: 20
+ font.weight: Font.Medium
+ color: shellRoot.white
+ horizontalAlignment: Text.AlignHCenter
+ }
+ Item { Layout.fillWidth: true }
+ Text {
+ text: "> "
+ font.pixelSize: 20
+ font.family: shellRoot.fontFamily
+ color: shellRoot.white
+ MouseArea {
+ anchors.fill: parent
+ onClicked: monthOffset++;
+ }
+ }
+ }
+ Grid {
+ width: parent.width
+ columns: 7
+ columnSpacing: 1
+ rowSpacing: 1
+
+ Repeater {
+ model: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]
+
+ Text {
+ text: modelData
+ font.family: shellRoot.fontFamily
+ font.pixelSize: 15
+ font.weight: Font.Medium
+ color: shellRoot.white
+ width: 50
+ height: 20
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ }
+ }
+ Repeater {
+ model: 35
+
+ Rectangle {
+ width: 60
+ height: 60
+
+ property var now: new Date()
+ property int currentDay: now.getDate()
+ property int currentMonth: (now.getMonth() + monthOffset) % 12
+ property int currentYear: now.getFullYear() + Math.floor((now.getMonth() + monthOffset) / 12)
+
+ // Calculate what day this cell represents
+ property var firstDay: new Date(currentYear, currentMonth, 1)
+ property int startOffset: firstDay.getDay() // 0 = Sunday
+ property int dayNumber: index - startOffset + 1
+ property var lastDay: new Date(currentYear, currentMonth + 1, 0)
+ property int daysInMonth: lastDay.getDate()
+ property bool isCurrentDay: dayNumber === currentDay
+ property bool isValidDay: dayNumber >= 1 && dayNumber <= daysInMonth
+
+ color: {
+ if (!isValidDay) return "transparent"
+ if (monthOffset == 0 && isCurrentDay) return shellRoot.green
+ return shellRoot.gray
+ }
+
+ Text {
+ anchors.centerIn: parent
+ text: parent.isValidDay ? parent.dayNumber : ""
+ font.family: shellRoot.fontFamily
+ font.pixelSize: 20
+ color: {
+ if (parent.isValidDay && parent.isCurrentDay) return shellRoot.white
+ if (!parent.isValidDay) return shellRoot.white
+ return shellRoot.white
+ }
+ font.weight: parent.isValidDay && parent.isCurrentDay ? Font.DemiBold : Font.Normal
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}