diff --git a/views/calendar/qml/View.qml b/views/calendar/qml/View.qml index 07ae20c5..b2df0215 100644 --- a/views/calendar/qml/View.qml +++ b/views/calendar/qml/View.qml @@ -1,272 +1,242 @@ /* * Copyright (C) 2018 Michael Bohlender, * Copyright (C) 2019 Christian Mollekopf, * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import QtQuick 2.9 import QtQuick.Controls 2 import QtQuick.Layouts 1.2 import org.kube.framework 1.0 as Kube import "dateutils.js" as DateUtils - Kube.View { id: root property date currentDate: new Date() property date selectedDate: currentDate property bool autoUpdateDate: true onSelectedDateChanged: { console.log("Selected date changed", selectedDate) } onRefresh: { Kube.Fabric.postMessage(Kube.Messages.synchronize, {"type": "calendar"}) Kube.Fabric.postMessage(Kube.Messages.synchronize, {"type": "event"}) } - function getFirstDayOfWeek(date, stayWithinMonth) { - var firstDay = Qt.locale().firstDayOfWeek - var year = date.getFullYear() - var month = date.getMonth() - //Jup, getDate returns the day of the month - var day = date.getDate() - - while (true) { - if (date.getDay() === firstDay) { - break - } - //If we get to the beginning of the month we have to search forward for the start day instead - //so we don't end up in the previous month. - if (day == 1 && stayWithinMonth) { - return getFirstDayOfWeek(new Date(year, month, 8), true) - } - - day = day - 1 - date = new Date(year, month, day) - } - return date - } - - function getFirstDayOfMonth(date) { - var d = date - d.setDate(1) - return d - } - RowLayout { Timer { running: autoUpdateDate interval: 2000; repeat: true onTriggered: root.currentDate = new Date() } Rectangle { Layout.fillHeight: true width: Kube.Units.gridUnit * 10 color: Kube.Colors.darkBackgroundColor Column { id: topLayout anchors { top: parent.top left: parent.left right: parent.right margins: Kube.Units.largeSpacing } spacing: Kube.Units.largeSpacing Kube.PositiveButton { id: newEventButton objectName: "newEventButton" anchors { left: parent.left right: parent.right } focus: true text: qsTr("New Event") onClicked: eventPopup.createObject(root, {start: DateUtils.sameDay(root.currentDate, root.selectedDate) ? root.currentDate : root.selectedDate}).open() } RowLayout { anchors { left: parent.left right: parent.right } spacing: Kube.Units.smallSpacing ButtonGroup { id: viewButtonGroup } Kube.TextButton { id: weekViewButton Layout.fillWidth: true text: qsTr("Week") textColor: Kube.Colors.highlightedTextColor checkable: true checked: true ButtonGroup.group: viewButtonGroup } Kube.TextButton { id: monthViewButton Layout.fillWidth: true text: qsTr("Month") textColor: Kube.Colors.highlightedTextColor checkable: true ButtonGroup.group: viewButtonGroup } } DateView { anchors { left: parent.left right: parent.right } date: root.currentDate MouseArea { anchors.fill: parent onClicked: { root.selectedDate = root.currentDate } } } DateSelector { id: dateSelector anchors { left: parent.left right: parent.right } selectedDate: root.selectedDate onSelected: { root.selectedDate = date } onNext: { if (weekViewButton.checked) { root.selectedDate = DateUtils.nextWeek(root.selectedDate) } else { root.selectedDate = DateUtils.nextMonth(root.selectedDate) } } onPrevious: { if (weekViewButton.checked) { root.selectedDate = DateUtils.previousWeek(root.selectedDate) } else { root.selectedDate = DateUtils.previousMonth(root.selectedDate) } } } } Kube.CalendarSelector { id: accountSwitcher //Grow from the button but don't go over topLayout anchors { bottom: statusBarContainer.top left: topLayout.left right: parent.right bottomMargin: Kube.Units.largeSpacing rightMargin: Kube.Units.largeSpacing } height: parent.height - (topLayout.y + topLayout.height) - Kube.Units.largeSpacing - anchors.bottomMargin - statusBarContainer.height } Item { id: statusBarContainer anchors { topMargin: Kube.Units.smallSpacing bottom: parent.bottom left: parent.left right: parent.right } height: childrenRect.height Rectangle { id: border visible: statusBar.visible anchors { right: parent.right left: parent.left margins: Kube.Units.smallSpacing } height: 1 color: Kube.Colors.viewBackgroundColor opacity: 0.3 } Kube.StatusBar { id: statusBar accountId: accountSwitcher.currentAccount height: Kube.Units.gridUnit * 2 anchors { top: border.bottom left: statusBarContainer.left right: statusBarContainer.right } } } } WeekView { visible: weekViewButton.checked Layout.fillHeight: true Layout.fillWidth: true currentDate: root.currentDate - startDate: getFirstDayOfWeek(root.selectedDate, false) + startDate: DateUtils.getFirstDayOfWeek(root.selectedDate) calendarFilter: accountSwitcher.enabledCalendars } MonthView { visible: monthViewButton.checked Layout.fillHeight: true Layout.fillWidth: true currentDate: root.currentDate - startDate: getFirstDayOfWeek(getFirstDayOfMonth(root.selectedDate), true) + startDate: DateUtils.getFirstDayOfWeek(DateUtils.getFirstDayOfMonth(root.selectedDate)) month: root.selectedDate.getMonth() calendarFilter: accountSwitcher.enabledCalendars } } Kube.Listener { filter: Kube.Messages.eventEditor onMessageReceived: eventPopup.createObject(root, message).open() } Component { id: eventPopup Kube.Popup { id: popup property alias start: editor.start property alias allDay: editor.allDay x: root.width * 0.15 y: root.height * 0.15 width: root.width * 0.7 height: root.height * 0.7 padding: 0 EventEditor { id: editor anchors.fill: parent onDone: popup.close() accountId: accountSwitcher.currentAccount } } } } diff --git a/views/calendar/qml/dateutils.js b/views/calendar/qml/dateutils.js index 51904d62..9a464796 100644 --- a/views/calendar/qml/dateutils.js +++ b/views/calendar/qml/dateutils.js @@ -1,88 +1,113 @@ /** * Returns the week number for this date. dowOffset is the day of week the week * "starts" on for your locale - it can be from 0 to 6. If dowOffset is 1 (Monday), * the week returned is the ISO 8601 week number. * @param int dowOffset * @return int */ function getWeek(date, dowOffset) { var newYear = new Date(date.getFullYear(),0,1); var day = newYear.getDay() - dowOffset; //the day of week the year begins on day = (day >= 0 ? day : day + 7); var daynum = Math.floor((date.getTime() - newYear.getTime() - (date.getTimezoneOffset()-newYear.getTimezoneOffset())*60000)/86400000) + 1; var weeknum; //if the year starts before the middle of a week if(day < 4) { weeknum = Math.floor((daynum+day-1)/7) + 1; if(weeknum > 52) { var nYear = new Date(date.getFullYear() + 1,0,1); var nday = nYear.getDay() - dowOffset; nday = nday >= 0 ? nday : nday + 7; /*if the next year starts before the middle of the week, it is week #1 of that year*/ weeknum = nday < 4 ? 1 : 53; } } else { weeknum = Math.floor((daynum+day-1)/7); } return weeknum; } function roundToDay(date) { return new Date(date.getFullYear(), date.getMonth(), date.getDate()) } function roundToMinutes(date, delta) { var totalMinutes = date.getHours() * 60 + date.getMinutes() //Round to nearest delta totalMinutes = Math.round(totalMinutes / delta) * delta var minutes = totalMinutes % 60 var hours = (totalMinutes - minutes) / 60 return new Date(date.getFullYear(), date.getMonth(), date.getDate(), hours, minutes, 0) } function addDaysToDate(date, days) { var date = new Date(date); date.setDate(date.getDate() + days); return date; } function addMinutesToDate(date, minutes) { return new Date(date.getTime() + minutes*60000); } function sameDay(date1, date2) { return date1.getFullYear() == date2.getFullYear() && date1.getMonth() == date2.getMonth() && date1.getDate() == date2.getDate() } function sameMonth(date1, date2) { return date1.getFullYear() == date2.getFullYear() && date1.getMonth() == date2.getMonth() } function nextWeek(date) { var d = date d.setTime(date.getTime() + (24*60*60*1000) * 7); return d } function previousWeek(date) { var d = date d.setTime(date.getTime() - (24*60*60*1000) * 7); return d } function nextMonth(date) { var d = date //FIXME, if you add a month to the 31.3 you will end up on the 5.1 because April has only 30 days. Wtf javascript d.setMonth(date.getMonth() + 1); return d } function previousMonth(date) { var d = date d.setMonth(date.getMonth() - 1); return d } +function getFirstDayOfWeek(date) { + var firstDay = Qt.locale().firstDayOfWeek + var year = date.getFullYear() + var month = date.getMonth() + //Jup, getDate returns the day of the month + var day = date.getDate() + var d = date + + while (true) { + if (d.getDay() === firstDay) { + break + } + day = day - 1 + //This works with negative days to get to the previous month + d = new Date(year, month, day) + } + return d +} + +function getFirstDayOfMonth(date) { + var d = date + d.setDate(1) + return d +} +