init
This commit is contained in:
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user