Warning, /pim/kube/views/calendar/qml/DateSelector.qml is written in an unsupported language. File is not indexed.
0001 /*
0002 * Copyright (C) 2018 Christian Mollekopf, <mollekopf@kolabsys.com>
0003 *
0004 * This program is free software; you can redistribute it and/or modify
0005 * it under the terms of the GNU General Public License as published by
0006 * the Free Software Foundation; either version 2 of the License, or
0007 * (at your option) any later version.
0008 *
0009 * This program is distributed in the hope that it will be useful,
0010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0012 * GNU General Public License for more details.
0013 *
0014 * You should have received a copy of the GNU General Public License along
0015 * with this program; if not, write to the Free Software Foundation, Inc.,
0016 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
0017 */
0018 import QtQuick 2.4
0019 import QtQuick.Controls 2.2
0020 import Qt.labs.calendar 1.0
0021 import QtQuick.Layouts 1.3
0022
0023 import "dateutils.js" as DateUtils
0024
0025 import org.kube.framework 1.0 as Kube
0026
0027 Item {
0028 id: root
0029 property date selectedDate
0030 property var selectedEnd: null
0031 property date notBefore: new Date(0) //Earliest possible by epoch
0032 property color backgroundColor: Kube.Colors.darkBackgroundColor
0033 property color textColor: Kube.Colors.highlightedTextColor
0034 property bool invertIcons: true
0035 property bool rangeSelection: false
0036
0037
0038 // Private
0039 property date currentDate: selectedDate
0040
0041 function next() {
0042 root.currentDate = DateUtils.nextMonth(root.currentDate)
0043 }
0044 function previous() {
0045 root.currentDate = DateUtils.previousMonth(root.currentDate)
0046 }
0047 signal selected(date date)
0048 signal endSelected(date date)
0049
0050 implicitWidth: Math.max(grid.implicitWidth, dateLabel.implicitWidth + 2 * Kube.Units.gridUnit)
0051 implicitHeight: column.implicitHeight
0052
0053 onNotBeforeChanged: {
0054 if (notBefore.getTime() > selectedDate.getTime()) {
0055 root.selected(notBefore)
0056 }
0057 }
0058
0059 Column {
0060 id: column
0061 anchors.fill: parent
0062 spacing: Kube.Units.smallSpacing
0063 Item {
0064 anchors {
0065 left: parent.left
0066 right: parent.right
0067 }
0068 height: Kube.Units.gridUnit
0069 Kube.IconButton {
0070 anchors {
0071 verticalCenter: parent.verticalCenter
0072 left: parent.left
0073 }
0074 height: parent.height
0075 width: parent.height
0076 color: root.backgroundColor
0077 iconName: Kube.Icons.iconName(Kube.Icons.goBack, root.invertIcons)
0078 visible: root.notBefore.getTime() < (new Date(root.selectedDate.getFullYear(), root.selectedDate.getMonth(), root.selectedDate.getDate())).getTime()
0079 onClicked: {
0080 root.previous()
0081 }
0082 }
0083 Kube.Label {
0084 id: dateLabel
0085 anchors {
0086 verticalCenter: parent.verticalCenter
0087 horizontalCenter: parent.horizontalCenter
0088 }
0089 color: root.textColor
0090 font.bold: true
0091 text: root.currentDate.toLocaleString(Qt.locale(), "MMMM yyyy")
0092 }
0093 Kube.IconButton {
0094 anchors {
0095 verticalCenter: parent.verticalCenter
0096 right: parent.right
0097 }
0098 height: parent.height
0099 width: parent.height
0100 color: root.backgroundColor
0101 iconName: Kube.Icons.iconName(Kube.Icons.goNext, root.invertIcons)
0102 onClicked: {
0103 root.next()
0104 }
0105 }
0106 }
0107
0108 MonthGrid {
0109 id: grid
0110 anchors {
0111 left: parent.left
0112 right: parent.right
0113 }
0114
0115 month: root.currentDate.getMonth()
0116 year: root.currentDate.getFullYear()
0117 locale: Qt.locale()
0118
0119 contentItem: GridLayout {
0120 rows: 6
0121 columns: 7
0122 rowSpacing: grid.spacing
0123 columnSpacing: grid.spacing
0124
0125 Repeater {
0126 model: grid.source
0127 delegate: grid.delegate
0128 }
0129 }
0130
0131 delegate: Text {
0132 horizontalAlignment: Text.AlignHCenter
0133 verticalAlignment: Text.AlignVCenter
0134 opacity: (model.month === grid.month && model.date.getTime() >= root.notBefore.getTime()) ? 1 : 0.5
0135 text: model.day
0136 font: grid.font
0137 color: root.textColor
0138 Layout.preferredHeight: Kube.Units.gridUnit / 4 * 3
0139 Layout.fillWidth: true
0140
0141 Rectangle {
0142 anchors {
0143 left: parent.left
0144 right: parent.right
0145 bottom: parent.bottom
0146 }
0147 function dateIsInRange(day, month, selectedDate, selectedEnd) {
0148 const startMonth = selectedDate.getMonth();
0149 const startDay = selectedDate.getDate();
0150 if (day === startDay && month === startMonth) {
0151 return true;
0152 }
0153 if (selectedEnd) {
0154 const endMonth = selectedEnd.getMonth();
0155 const endDay = selectedEnd.getDate();
0156 if (
0157 (month < endMonth && month === startMonth && day >= startDay) ||
0158 (month > startMonth && month < endMonth) ||
0159 (month > startMonth && month === endMonth && day <= endDay) ||
0160 (month === startMonth && day >= startDay && day <= endDay)
0161 ) {
0162 return true;
0163 }
0164 }
0165 return false;
0166 }
0167 height: 2
0168 color: Kube.Colors.plasmaBlue
0169 opacity: 0.6
0170 visible: dateIsInRange(model.day, model.month, root.selectedDate, root.selectedEnd)
0171 }
0172 }
0173
0174 onClicked: {
0175 if (
0176 root.rangeSelection && root.selectedDate && !root.selectedEnd &&
0177 date.getTime() >= root.selectedDate.getTime()
0178 ) {
0179 //Select the end of the range
0180 root.selectedEnd = date
0181 root.endSelected(date)
0182 } else {
0183 if (date.getTime() >= root.notBefore.getTime()) {
0184 //Set the start
0185 root.selectedEnd = null
0186 root.selected(date)
0187 root.endSelected(date)
0188 }
0189 }
0190 }
0191 }
0192 }
0193 }