mirror of
https://codeberg.org/vyn/mirai.git
synced 2025-07-04 02:33:19 +00:00
125 lines
4 KiB
QML
125 lines
4 KiB
QML
|
/*
|
||
|
* Mirai. Copyright (C) 2024 Vyn
|
||
|
* This file is licensed under version 3 of the GNU General Public License (GPL-3.0-only)
|
||
|
* The license can be found in the LICENSE file or at https://www.gnu.org/licenses/gpl-3.0.txt
|
||
|
*/
|
||
|
|
||
|
import Mirai
|
||
|
import QtQuick
|
||
|
|
||
|
ListView {
|
||
|
id: root
|
||
|
|
||
|
function set(date) {
|
||
|
selectedDate = new Date(date)
|
||
|
positionViewAtIndex((selectedDate.getFullYear()) * 12 + selectedDate.getMonth(), ListView.Center) // index from month year
|
||
|
}
|
||
|
|
||
|
signal clicked(date date);
|
||
|
signal reset();
|
||
|
|
||
|
property date selectedDate: new Date()
|
||
|
|
||
|
width: 500
|
||
|
height: 100
|
||
|
snapMode: ListView.SnapOneItem
|
||
|
orientation: Qt.Horizontal
|
||
|
clip: true
|
||
|
|
||
|
model: 3000 * 12 // index == months since January of the year 0
|
||
|
|
||
|
delegate: Item {
|
||
|
property int year: Math.floor(index / 12)
|
||
|
property int month: index % 12 // 0 January
|
||
|
property int firstDay: new Date(year, month, 1).getDay() // 0 Sunday to 6 Saturday
|
||
|
|
||
|
width: root.width
|
||
|
height: root.height
|
||
|
|
||
|
Column {
|
||
|
Item { // month year header
|
||
|
width: root.width
|
||
|
height: root.height - grid.height
|
||
|
|
||
|
AppText { // month year
|
||
|
anchors.centerIn: parent
|
||
|
text: ['January', 'February', 'March', 'April', 'May', 'June',
|
||
|
'July', 'August', 'September', 'October', 'November', 'December'][month] + ' ' + year
|
||
|
font {pixelSize: 0.5 * grid.cellHeight}
|
||
|
}
|
||
|
|
||
|
AppButton {
|
||
|
text: "Remove"
|
||
|
onClicked: {
|
||
|
root.reset()
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Grid { // 1 month calender
|
||
|
id: grid
|
||
|
|
||
|
width: root.width
|
||
|
height: 0.875 * root.height
|
||
|
property real cellWidth: width / columns;
|
||
|
property real cellHeight: height / rows // width and height of each cell in the grid.
|
||
|
|
||
|
columns: 7 // days
|
||
|
rows: 7
|
||
|
|
||
|
Repeater {
|
||
|
model: grid.columns * grid.rows // 49 cells per month
|
||
|
|
||
|
delegate: Rectangle { // index is 0 to 48
|
||
|
property int day: index - 7 // 0 = top left below Sunday (-7 to 41)
|
||
|
property int date: day - firstDay + 2 // 1-31
|
||
|
|
||
|
color: internal.selected ? colorPalette.selected.filterSelected
|
||
|
: mouseArea.containsMouse ? colorPalette.selected.filterHovered
|
||
|
: "transparent"
|
||
|
width: grid.cellWidth; height: grid.cellHeight
|
||
|
radius: 0.02 * root.height
|
||
|
opacity: !mouseArea.pressed? 1: 0.3
|
||
|
|
||
|
QtObject {
|
||
|
id: internal
|
||
|
property bool selected: new Date(year, month, date).toDateString() == selectedDate.toDateString() && text.text && day >= 0
|
||
|
}
|
||
|
|
||
|
AppText {
|
||
|
id: text
|
||
|
|
||
|
anchors.centerIn: parent
|
||
|
font.pixelSize: 0.5 * parent.height
|
||
|
font.bold: new Date(year, month, date).toDateString() == new Date().toDateString() // today
|
||
|
text: {
|
||
|
if(day < 0)
|
||
|
['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'][index] // Su-Sa
|
||
|
else if(new Date(year, month, date).getMonth() == month)
|
||
|
date // 1-31
|
||
|
else
|
||
|
''
|
||
|
}
|
||
|
}
|
||
|
|
||
|
MouseArea {
|
||
|
id: mouseArea
|
||
|
|
||
|
anchors.fill: parent
|
||
|
enabled: text.text && day >= 0
|
||
|
hoverEnabled: true
|
||
|
|
||
|
onClicked: {
|
||
|
selectedDate = new Date(year, month, date)
|
||
|
root.clicked(selectedDate)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Component.onCompleted: set(new Date()) // today (otherwise Jan 0000)
|
||
|
}
|