/* * 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) }