Files
illogical-impulse/dots/.config/quickshell/ii/modules/waffle/notificationCenter/CalendarWidget.qml
T
2025-12-10 22:38:07 +01:00

143 lines
4.1 KiB
QML

pragma ComponentBehavior: Bound
import QtQml
import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell
import qs
import qs.services
import qs.modules.common
import qs.modules.common.widgets
import qs.modules.common.functions
import qs.modules.waffle.looks
BodyRectangle {
id: root
// State
property bool collapsed
// Locale
property var locale: Qt.locale(Config.options.calendar.locale)
implicitHeight: collapsed ? 0 : contentColumn.implicitHeight
implicitWidth: contentColumn.implicitWidth
Behavior on implicitHeight {
animation: Looks.transition.enter.createObject(this)
}
clip: true
ColumnLayout {
id: contentColumn
spacing: 12
CalendarHeader {
Layout.topMargin: 10
Layout.fillWidth: true
}
ColumnLayout {
Layout.fillWidth: true
Layout.leftMargin: 5
Layout.rightMargin: 5
spacing: 1
DayOfWeekRow {
Layout.fillWidth: true
locale: root.locale
spacing: calendarView.buttonSpacing
implicitHeight: calendarView.buttonSize
delegate: Item {
id: dayOfWeekItem
required property var model
implicitHeight: calendarView.buttonSize
implicitWidth: calendarView.buttonSize
WText {
anchors.centerIn: parent
text: {
var result = dayOfWeekItem.model.shortName;
if (Config.options.waffles.calendar.force2CharDayOfWeek) result = result.substring(0,2);
return result;
}
color: Looks.colors.fg
font.pixelSize: Looks.font.pixelSize.large
}
}
}
CalendarView {
id: calendarView
locale: root.locale
verticalPadding: 2
buttonSize: 41 // ???
buttonSpacing: 6
buttonVerticalSpacing: 1
Layout.fillWidth: true
delegate: DayButton {}
}
}
}
component DayButton: WButton {
id: dayButton
required property var model
checked: model.today
enabled: hovered || calendarView.scrolling || checked || model.month === calendarView.focusedMonth
implicitWidth: calendarView.buttonSize
implicitHeight: calendarView.buttonSize
radius: height / 2
required property int index
contentItem: Item {
WText {
anchors.centerIn: parent
text: dayButton.model.day
color: dayButton.fgColor
font.pixelSize: Looks.font.pixelSize.larger
}
}
}
component CalendarHeader: RowLayout {
Layout.leftMargin: 8
Layout.rightMargin: 8
spacing: 8
WBorderlessButton {
Layout.fillWidth: true
implicitHeight: 34
contentItem: Item {
WText {
anchors.fill: parent
horizontalAlignment: Text.AlignLeft
text: Qt.locale().toString(calendarView.focusedDate, "MMMM yyyy")
font.pixelSize: Looks.font.pixelSize.large
font.weight: Looks.font.weight.strong
}
}
}
ScrollMonthButton {
scrollDown: false
}
ScrollMonthButton {
scrollDown: true
}
}
component ScrollMonthButton: WBorderlessButton {
id: scrollMonthButton
required property bool scrollDown
Layout.alignment: Qt.AlignVCenter
onClicked: {
calendarView.scrollMonthsAndSnap(scrollDown ? 1 : -1);
}
implicitWidth: 32
implicitHeight: 34
contentItem: FluentIcon {
filled: true
implicitSize: 12
icon: scrollMonthButton.scrollDown ? "caret-down" : "caret-up"
}
}
}