232 lines
6.6 KiB
QML
232 lines
6.6 KiB
QML
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()
|
|
}
|
|
}
|
|
}
|