forked from Shinonome/dots-hyprland
143 lines
4.1 KiB
QML
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"
|
|
}
|
|
}
|
|
}
|