summaryrefslogtreecommitdiff
path: root/src/controls/Calendar.qml
diff options
context:
space:
mode:
Diffstat (limited to 'src/controls/Calendar.qml')
-rw-r--r--src/controls/Calendar.qml401
1 files changed, 401 insertions, 0 deletions
diff --git a/src/controls/Calendar.qml b/src/controls/Calendar.qml
new file mode 100644
index 00000000..07e9b4ad
--- /dev/null
+++ b/src/controls/Calendar.qml
@@ -0,0 +1,401 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
+** of its contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Styles 1.1
+import QtQuick.Controls.Private 1.0
+
+/*!
+ \qmltype Calendar
+ \inqmlmodule QtQuick.Controls
+ \since 5.3
+ \ingroup controls
+ \brief Provides a way to select dates from a calendar
+
+ Calendar allows selection of dates from a grid of days, similar to
+ QCalendarWidget.
+
+ The dates on the calendar can be selected with the mouse, or navigated
+ with the keyboard.
+
+ The selected date can be set through \l selectedDate.
+ A minimum and maximum date can be set through \l minimumDate and
+ \l maximumDate. The earliest minimum date that can be set is 1 January, 1
+ AD. The latest maximum date that can be set is 25 October, 275759 AD.
+
+ The selected date is displayed using the format in the application's
+ default locale.
+
+ Week numbers can be displayed by setting the weekNumbersVisible property to
+ \c true.
+
+ You can create a custom appearance for Calendar by assigning a
+ \l {QtQuick.Controls.Styles::CalendarStyle}{CalendarStyle}.
+*/
+
+Control {
+ id: calendar
+
+ implicitWidth: 250
+ implicitHeight: 250
+
+ /*!
+ \qmlproperty date Calendar::selectedDate
+
+ The date that has been selected by the user.
+
+ This property is subject to the following validation:
+
+ \list
+ \li If selectedDate is outside the range of \l minimumDate and
+ \l maximumDate, it will be clamped to be within that range.
+
+ \li selectedDate will not be changed if \c undefined or some other
+ invalid value is assigned.
+
+ \li If there are hours, minutes, seconds or milliseconds set, they
+ will be removed.
+ \endlist
+
+ The default value is the current date, which is equivalent to:
+
+ \code
+ new Date()
+ \endcode
+ */
+ property alias selectedDate: rangedDate.date
+
+ /*!
+ \qmlproperty date Calendar::minimumDate
+
+ The earliest date that this calendar will accept.
+
+ By default, this property is set to the earliest minimum date
+ (1 January, 1 AD).
+ */
+ property alias minimumDate: rangedDate.minimumDate
+
+ /*!
+ \qmlproperty date Calendar::maximumDate
+
+ The latest date that this calendar will accept.
+
+ By default, this property is set to the latest maximum date
+ (25 October, 275759 AD).
+ */
+ property alias maximumDate: rangedDate.maximumDate
+
+ /*!
+ This property determines which month in visibleYear is shown on the
+ calendar.
+
+ The month is from \c 0 to \c 11 to be consistent with the JavaScript
+ Date object.
+
+ \sa visibleYear
+ */
+ property int visibleMonth: selectedDate.getMonth()
+
+ /*!
+ This property determines which year is shown on the
+ calendar.
+
+ \sa visibleMonth
+ */
+ property int visibleYear: selectedDate.getFullYear()
+
+ onSelectedDateChanged: {
+ // When the selected date changes, the view should move back to that date.
+ visibleMonth = selectedDate.getMonth();
+ visibleYear = selectedDate.getFullYear();
+ }
+
+ RangedDate {
+ id: rangedDate
+ date: new Date()
+ minimumDate: CalendarUtils.minimumCalendarDate
+ maximumDate: CalendarUtils.maximumCalendarDate
+ }
+
+ /*!
+ This property determines the visibility of the grid.
+
+ The default value is \c true.
+ */
+ property bool gridVisible: true
+
+ /*!
+ This property determines the visibility of week numbers.
+
+ The default value is \c false.
+ */
+ property bool weekNumbersVisible: false
+
+ /*!
+ \qmlproperty enum Calendar::dayOfWeekFormat
+
+ The format in which the days of the week (in the header) are displayed.
+
+ \c Locale.ShortFormat is the default and recommended format, as
+ \c Locale.NarrowFormat may not be fully supported by each locale (see
+ \l {Locale String Format Types}) and
+ \c Locale.LongFormat may not fit within the header cells.
+ */
+ property int dayOfWeekFormat: Locale.ShortFormat
+
+ /*!
+ The locale that this calendar should use to display itself.
+
+ Affects how dates and day names are localized, as well as which
+ day is considered the first in a week.
+
+ To set an Australian locale, for example:
+
+ \code
+ locale: Qt.locale("en_AU")
+ \endcode
+
+ The default locale is \c Qt.locale().
+ */
+ property var __locale: Qt.locale()
+
+ /*!
+ \internal
+
+ This property holds the model that will be used by the Calendar to
+ populate the dates available to the user.
+ */
+ property CalendarModel __model: CalendarModel {
+ locale: calendar.__locale
+ visibleDate: new Date(visibleYear, visibleMonth, 1)
+ }
+
+ style: Qt.createComponent(Settings.style + "/CalendarStyle.qml", calendar)
+
+ /*!
+ \qmlsignal Calendar::hovered(date date)
+
+ Emitted when the mouse hovers over a valid date in the calendar.
+
+ \a date is the date that was hovered over.
+ */
+ signal hovered(date date)
+
+ /*!
+ \qmlsignal Calendar::pressed(date date)
+
+ Emitted when the mouse is pressed on a valid date in the calendar.
+
+ This is also emitted when dragging the mouse to another date while it is pressed.
+
+ \a date is the date that the mouse was pressed on.
+ */
+ signal pressed(date date)
+
+ /*!
+ \qmlsignal Calendar::released(date date)
+
+ Emitted when the mouse is released over a valid date in the calendar.
+
+ \a date is the date that the mouse was released over.
+ */
+ signal released(date date)
+
+ /*!
+ \qmlsignal Calendar::clicked(date date)
+
+ Emitted when the mouse is clicked on a valid date in the calendar.
+
+ \a date is the date that the mouse was clicked on.
+ */
+ signal clicked(date date)
+
+ /*!
+ \qmlsignal Calendar::doubleClicked(date date)
+
+ Emitted when the mouse is double-clicked on a valid date in the calendar.
+
+ \a date is the date that the mouse was double-clicked on.
+ */
+ signal doubleClicked(date date)
+
+ /*!
+ Sets visibleMonth to the previous month.
+ */
+ function showPreviousMonth() {
+ if (visibleMonth === 0) {
+ visibleMonth = CalendarUtils.monthsInAYear - 1;
+ --visibleYear;
+ } else {
+ --visibleMonth;
+ }
+ }
+
+ /*!
+ Sets visibleMonth to the next month.
+ */
+ function showNextMonth() {
+ if (visibleMonth === CalendarUtils.monthsInAYear - 1) {
+ visibleMonth = 0;
+ ++visibleYear;
+ } else {
+ ++visibleMonth;
+ }
+ }
+
+ /*!
+ Sets visibleYear to the previous year.
+ */
+ function showPreviousYear() {
+ if (visibleYear - 1 >= minimumDate.getFullYear()) {
+ --visibleYear;
+ }
+ }
+
+ /*!
+ Sets visibleYear to the next year.
+ */
+ function showNextYear() {
+ if (visibleYear + 1 <= maximumDate.getFullYear()) {
+ ++visibleYear;
+ }
+ }
+
+ /*!
+ Selects the month before the current month in \l selectedDate.
+ */
+ function __selectPreviousMonth() {
+ calendar.selectedDate = CalendarUtils.setMonth(calendar.selectedDate, calendar.selectedDate.getMonth() - 1);
+ }
+
+ /*!
+ Selects the month after the current month in \l selectedDate.
+ */
+ function __selectNextMonth() {
+ calendar.selectedDate = CalendarUtils.setMonth(calendar.selectedDate, calendar.selectedDate.getMonth() + 1);
+ }
+
+ /*!
+ Selects the week before the current week in \l selectedDate.
+ */
+ function __selectPreviousWeek() {
+ var newDate = new Date(calendar.selectedDate);
+ newDate.setDate(newDate.getDate() - CalendarUtils.daysInAWeek);
+ calendar.selectedDate = newDate;
+ }
+
+ /*!
+ Selects the week after the current week in \l selectedDate.
+ */
+ function __selectNextWeek() {
+ var newDate = new Date(calendar.selectedDate);
+ newDate.setDate(newDate.getDate() + CalendarUtils.daysInAWeek);
+ calendar.selectedDate = newDate;
+ }
+
+ /*!
+ Selects the first day of the current month in \l selectedDate.
+ */
+ function __selectFirstDayOfMonth() {
+ var newDate = new Date(calendar.selectedDate);
+ newDate.setDate(1);
+ calendar.selectedDate = newDate;
+ }
+
+ /*!
+ Selects the last day of the current month in \l selectedDate.
+ */
+ function __selectLastDayOfMonth() {
+ var newDate = new Date(calendar.selectedDate);
+ newDate.setDate(CalendarUtils.daysInMonth(newDate));
+ calendar.selectedDate = newDate;
+ }
+
+ /*!
+ Selects the day before the current day in \l selectedDate.
+ */
+ function __selectPreviousDay() {
+ var newDate = new Date(calendar.selectedDate);
+ newDate.setDate(newDate.getDate() - 1);
+ calendar.selectedDate = newDate;
+ }
+
+ /*!
+ Selects the day after the current day in \l selectedDate.
+ */
+ function __selectNextDay() {
+ var newDate = new Date(calendar.selectedDate);
+ newDate.setDate(newDate.getDate() + 1);
+ calendar.selectedDate = newDate;
+ }
+
+ Keys.onLeftPressed: {
+ calendar.__selectPreviousDay();
+ }
+
+ Keys.onUpPressed: {
+ calendar.__selectPreviousWeek();
+ }
+
+ Keys.onDownPressed: {
+ calendar.__selectNextWeek();
+ }
+
+ Keys.onRightPressed: {
+ calendar.__selectNextDay();
+ }
+
+ Keys.onPressed: {
+ if (event.key === Qt.Key_Home) {
+ calendar.__selectFirstDayOfMonth();
+ event.accepted = true;
+ } else if (event.key === Qt.Key_End) {
+ calendar.__selectLastDayOfMonth();
+ event.accepted = true;
+ } else if (event.key === Qt.Key_PageUp) {
+ calendar.__selectPreviousMonth();
+ event.accepted = true;
+ } else if (event.key === Qt.Key_PageDown) {
+ calendar.__selectNextMonth();
+ event.accepted = true;
+ }
+ }
+}