This commit is contained in:
2026-07-05 23:16:16 +05:30
commit 8abef18b68
28 changed files with 3212 additions and 0 deletions
+231
View File
@@ -0,0 +1,231 @@
pragma ComponentBehavior: Bound
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls
import Quickshell
import Quickshell.Hyprland
Item {
id: root
property var popups: null
readonly property bool expanded: popups ? popups.current === "clock" : false
property var now: new Date()
property int viewYear: now.getFullYear()
property int viewMonth: now.getMonth()
implicitWidth: label.implicitWidth
implicitHeight: 30
function shiftMonth(delta: int): void {
let m = root.viewMonth + delta;
let y = root.viewYear;
if (m < 0) {
m = 11;
y -= 1;
} else if (m > 11) {
m = 0;
y += 1;
}
root.viewMonth = m;
root.viewYear = y;
}
Timer {
interval: 1000
running: true
repeat: true
onTriggered: root.now = new Date()
}
// Snap the calendar back to the current month each time it's opened.
onExpandedChanged: {
if (expanded) {
root.viewYear = root.now.getFullYear();
root.viewMonth = root.now.getMonth();
}
}
Text {
id: label
anchors.centerIn: parent
color: "#cdd6f4"
text: Qt.formatDateTime(root.now, "hh:mm:ss dd MMM")
}
MouseArea {
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: if (root.popups) root.popups.toggle("clock")
}
LazyLoader {
active: root.expanded
PanelWindow {
id: win
anchors.top: true
anchors.right: true
margins.top: 6
margins.right: 8
implicitWidth: 300
implicitHeight: card.implicitHeight
color: "transparent"
exclusiveZone: 0
HyprlandFocusGrab {
active: true
windows: [win]
onCleared: if (root.popups) root.popups.current = ""
}
Rectangle {
id: card
width: parent.width
implicitHeight: col.implicitHeight + 24
radius: 16
color: "#f21e1e2e"
border.color: "#45475a"
border.width: 1
ColumnLayout {
id: col
anchors.left: parent.left
anchors.right: parent.right
anchors.top: parent.top
anchors.margins: 12
spacing: 10
ColumnLayout {
Layout.fillWidth: true
spacing: 0
Text {
color: "#89b4fa"
font.pixelSize: 26
font.bold: true
text: Qt.formatDateTime(root.now, "dddd")
}
Text {
color: "#a6adc8"
font.pixelSize: 13
text: Qt.formatDateTime(root.now, "dd MMMM yyyy \u00B7 hh:mm:ss")
}
}
Rectangle {
Layout.fillWidth: true
implicitHeight: 1
color: "#313244"
}
RowLayout {
Layout.fillWidth: true
spacing: 4
Text {
Layout.fillWidth: true
color: "#cdd6f4"
font.pixelSize: 14
font.bold: true
text: grid.title
}
NavBtn {
glyph: "\u{F0141}"
onClicked: root.shiftMonth(-1)
}
NavBtn {
glyph: "\u{F0142}"
onClicked: root.shiftMonth(1)
}
}
DayOfWeekRow {
Layout.fillWidth: true
locale: grid.locale
delegate: Text {
required property string shortName
horizontalAlignment: Text.AlignHCenter
color: "#6c7086"
font.pixelSize: 11
font.bold: true
text: shortName
}
}
MonthGrid {
id: grid
Layout.fillWidth: true
month: root.viewMonth
year: root.viewYear
spacing: 2
delegate: Item {
id: cell
required property var model
readonly property bool isToday: model.today
readonly property bool inMonth: model.month === grid.month
implicitWidth: 36
implicitHeight: 30
Rectangle {
anchors.centerIn: parent
width: 26
height: 26
radius: 13
color: cell.isToday ? "#89b4fa" : "transparent"
}
Text {
anchors.centerIn: parent
text: cell.model.day
font.pixelSize: 12
color: cell.isToday ? "#11111b" : (cell.inMonth ? "#cdd6f4" : "#585b70")
}
}
}
}
}
}
}
component NavBtn: Rectangle {
id: navBtn
property string glyph: ""
signal clicked
implicitWidth: 26
implicitHeight: 26
radius: 13
color: navMouse.containsMouse ? "#313244" : "transparent"
Text {
anchors.centerIn: parent
font.family: "JetBrainsMono Nerd Font"
font.pixelSize: 16
color: "#cdd6f4"
text: navBtn.glyph
}
MouseArea {
id: navMouse
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: navBtn.clicked()
}
}
}