aboutsummaryrefslogtreecommitdiffstats
path: root/src/imports/calendar
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2015-09-07 16:18:52 +0200
committerJ-P Nurmi <jpnurmi@theqtcompany.com>2015-09-08 11:39:57 +0000
commit6eca2e4238ba40db3f6156e6c4ee6435f4d5128e (patch)
tree4ede6f278284d30954fd00f1d1b0ac7417d10e0b /src/imports/calendar
parent58605b099b2ea6c9927877e93502fcde89c95a1c (diff)
Calendar: merge C++ lib to the QML plugin
Change-Id: I7eeb0335fd88002c85f93136fc71dfb394788421 Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
Diffstat (limited to 'src/imports/calendar')
-rw-r--r--src/imports/calendar/calendar.pri22
-rw-r--r--src/imports/calendar/calendar.pro13
-rw-r--r--src/imports/calendar/qquickcalendarmodel.cpp195
-rw-r--r--src/imports/calendar/qquickcalendarmodel_p.h108
-rw-r--r--src/imports/calendar/qquickcalendarview.cpp310
-rw-r--r--src/imports/calendar/qquickcalendarview_p.h123
-rw-r--r--src/imports/calendar/qquickdayofweekmodel.cpp123
-rw-r--r--src/imports/calendar/qquickdayofweekmodel_p.h95
-rw-r--r--src/imports/calendar/qquickdayofweekrow.cpp143
-rw-r--r--src/imports/calendar/qquickdayofweekrow_p.h96
-rw-r--r--src/imports/calendar/qquickmonthmodel.cpp226
-rw-r--r--src/imports/calendar/qquickmonthmodel_p.h114
-rw-r--r--src/imports/calendar/qquickweeknumbercolumn.cpp169
-rw-r--r--src/imports/calendar/qquickweeknumbercolumn_p.h106
-rw-r--r--src/imports/calendar/qquickweeknumbermodel.cpp182
-rw-r--r--src/imports/calendar/qquickweeknumbermodel_p.h103
-rw-r--r--src/imports/calendar/qtquickcalendar2plugin.cpp14
17 files changed, 2129 insertions, 13 deletions
diff --git a/src/imports/calendar/calendar.pri b/src/imports/calendar/calendar.pri
new file mode 100644
index 00000000..9fc4d94f
--- /dev/null
+++ b/src/imports/calendar/calendar.pri
@@ -0,0 +1,22 @@
+QML_FILES = \
+ CalendarView.qml \
+ DayOfWeekRow.qml \
+ WeekNumberColumn.qml
+
+HEADERS += \
+ $$PWD/qquickcalendarmodel_p.h \
+ $$PWD/qquickcalendarview_p.h \
+ $$PWD/qquickdayofweekmodel_p.h \
+ $$PWD/qquickdayofweekrow_p.h \
+ $$PWD/qquickmonthmodel_p.h \
+ $$PWD/qquickweeknumbercolumn_p.h \
+ $$PWD/qquickweeknumbermodel_p.h
+
+SOURCES += \
+ $$PWD/qquickcalendarmodel.cpp \
+ $$PWD/qquickcalendarview.cpp \
+ $$PWD/qquickdayofweekmodel.cpp \
+ $$PWD/qquickdayofweekrow.cpp \
+ $$PWD/qquickmonthmodel.cpp \
+ $$PWD/qquickweeknumbercolumn.cpp \
+ $$PWD/qquickweeknumbermodel.cpp
diff --git a/src/imports/calendar/calendar.pro b/src/imports/calendar/calendar.pro
index b8318672..f7fc993b 100644
--- a/src/imports/calendar/calendar.pro
+++ b/src/imports/calendar/calendar.pro
@@ -3,18 +3,19 @@ TARGETPATH = QtQuick/Calendar.2
IMPORT_VERSION = 2.0
QT += qml quick
-QT += core-private gui-private qml-private quick-private quickcontrols2-private quickcalendar2-private
+QT += core-private gui-private qml-private quick-private quickcontrols2-private
+
+DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII
+
+INCLUDEPATH += $$PWD
OTHER_FILES += \
qmldir
-QML_FILES = \
- CalendarView.qml \
- DayOfWeekRow.qml \
- WeekNumberColumn.qml
-
SOURCES += \
$$PWD/qtquickcalendar2plugin.cpp
+include(calendar.pri)
+
CONFIG += no_cxx_module
load(qml_plugin)
diff --git a/src/imports/calendar/qquickcalendarmodel.cpp b/src/imports/calendar/qquickcalendarmodel.cpp
new file mode 100644
index 00000000..c1386ed0
--- /dev/null
+++ b/src/imports/calendar/qquickcalendarmodel.cpp
@@ -0,0 +1,195 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Calendar module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qquickcalendarmodel_p.h"
+
+#include <QtCore/private/qabstractitemmodel_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQuickCalendarModelPrivate : public QAbstractItemModelPrivate
+{
+ Q_DECLARE_PUBLIC(QQuickCalendarModel)
+
+public:
+ QQuickCalendarModelPrivate() : complete(false),
+ from(1,1,1), to(275759, 9, 25), count(0)
+ {
+ }
+
+ static int getCount(const QDate& from, const QDate &to);
+
+ void populate(const QDate &from, const QDate &to, bool force = false);
+
+ bool complete;
+ QDate from;
+ QDate to;
+ int count;
+};
+
+int QQuickCalendarModelPrivate::getCount(const QDate& from, const QDate &to)
+{
+ QDate f(from.year(), from.month(), 1);
+ QDate t(to.year(), to.month(), to.daysInMonth());
+ QDate r = QDate(1, 1, 1).addDays(f.daysTo(t));
+ int years = r.year() - 1;
+ int months = r.month() - 1;
+ return 12 * years + months + (r.day() / t.day());
+}
+
+void QQuickCalendarModelPrivate::populate(const QDate &f, const QDate &t, bool force)
+{
+ Q_Q(QQuickCalendarModel);
+ if (!force && f == from && t == to)
+ return;
+
+ int c = getCount(from, to);
+ if (c != count) {
+ q->beginResetModel();
+ count = c;
+ q->endResetModel();
+ emit q->countChanged();
+ } else {
+ emit q->dataChanged(q->index(0, 0), q->index(c - 1, 0));
+ }
+}
+
+QQuickCalendarModel::QQuickCalendarModel(QObject *parent) :
+ QAbstractListModel(*(new QQuickCalendarModelPrivate), parent)
+{
+}
+
+QDate QQuickCalendarModel::from() const
+{
+ Q_D(const QQuickCalendarModel);
+ return d->from;
+}
+
+void QQuickCalendarModel::setFrom(const QDate &from)
+{
+ Q_D(QQuickCalendarModel);
+ if (d->from != from) {
+ if (d->complete)
+ d->populate(from, d->to);
+ d->from = from;
+ emit fromChanged();
+ }
+}
+
+QDate QQuickCalendarModel::to() const
+{
+ Q_D(const QQuickCalendarModel);
+ return d->to;
+}
+
+void QQuickCalendarModel::setTo(const QDate &to)
+{
+ Q_D(QQuickCalendarModel);
+ if (d->to != to) {
+ if (d->complete)
+ d->populate(d->from, to);
+ d->to = to;
+ emit fromChanged();
+ }
+}
+
+int QQuickCalendarModel::monthAt(int index) const
+{
+ Q_D(const QQuickCalendarModel);
+ return d->from.addMonths(index).month();
+}
+
+int QQuickCalendarModel::yearAt(int index) const
+{
+ Q_D(const QQuickCalendarModel);
+ return d->from.addMonths(index).year();
+}
+
+int QQuickCalendarModel::indexOf(const QDate &date) const
+{
+ return indexOf(date.year(), date.month());
+}
+
+int QQuickCalendarModel::indexOf(int year, int month) const
+{
+ Q_D(const QQuickCalendarModel);
+ return d->getCount(d->from, QDate(year, month, 1)) - 1;
+}
+
+QVariant QQuickCalendarModel::data(const QModelIndex &index, int role) const
+{
+ Q_D(const QQuickCalendarModel);
+ if (index.isValid() && index.row() < d->count) {
+ switch (role) {
+ case MonthRole:
+ return monthAt(index.row());
+ case YearRole:
+ return yearAt(index.row());
+ default:
+ break;
+ }
+ }
+ return QVariant();
+}
+
+int QQuickCalendarModel::rowCount(const QModelIndex &parent) const
+{
+ Q_D(const QQuickCalendarModel);
+ if (!parent.isValid())
+ return d->count;
+ return 0;
+}
+
+QHash<int, QByteArray> QQuickCalendarModel::roleNames() const
+{
+ QHash<int, QByteArray> roles;
+ roles[MonthRole] = QByteArrayLiteral("month");
+ roles[YearRole] = QByteArrayLiteral("year");
+ return roles;
+}
+
+void QQuickCalendarModel::classBegin()
+{
+}
+
+void QQuickCalendarModel::componentComplete()
+{
+ Q_D(QQuickCalendarModel);
+ d->complete = true;
+ d->populate(d->from, d->to, true);
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/calendar/qquickcalendarmodel_p.h b/src/imports/calendar/qquickcalendarmodel_p.h
new file mode 100644
index 00000000..2501acfb
--- /dev/null
+++ b/src/imports/calendar/qquickcalendarmodel_p.h
@@ -0,0 +1,108 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Calendar module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QQUICKCALENDARMODEL_P_H
+#define QQUICKCALENDARMODEL_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qabstractitemmodel.h>
+#include <QtCore/qdatetime.h>
+#include <QtQml/qqmlparserstatus.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQuickCalendarModelPrivate;
+
+class QQuickCalendarModel : public QAbstractListModel, public QQmlParserStatus
+{
+ Q_OBJECT
+ Q_INTERFACES(QQmlParserStatus)
+ Q_PROPERTY(QDate from READ from WRITE setFrom NOTIFY fromChanged FINAL)
+ Q_PROPERTY(QDate to READ to WRITE setTo NOTIFY toChanged FINAL)
+ Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
+
+public:
+ explicit QQuickCalendarModel(QObject *parent = Q_NULLPTR);
+
+ QDate from() const;
+ void setFrom(const QDate &from);
+
+ QDate to() const;
+ void setTo(const QDate &to);
+
+ Q_INVOKABLE int monthAt(int index) const;
+ Q_INVOKABLE int yearAt(int index) const;
+ Q_INVOKABLE int indexOf(const QDate &date) const;
+ Q_INVOKABLE int indexOf(int year, int month) const;
+
+ enum {
+ MonthRole,
+ YearRole
+ };
+
+ QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE;
+ QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;
+ int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
+
+Q_SIGNALS:
+ void fromChanged();
+ void toChanged();
+ void countChanged();
+
+protected:
+ void classBegin() Q_DECL_OVERRIDE;
+ void componentComplete() Q_DECL_OVERRIDE;
+
+private:
+ Q_DISABLE_COPY(QQuickCalendarModel)
+ Q_DECLARE_PRIVATE(QQuickCalendarModel)
+};
+
+Q_DECLARE_TYPEINFO(QQuickCalendarModel, Q_COMPLEX_TYPE);
+
+QT_END_NAMESPACE
+
+#endif // QQUICKCALENDARMODEL_P_H
diff --git a/src/imports/calendar/qquickcalendarview.cpp b/src/imports/calendar/qquickcalendarview.cpp
new file mode 100644
index 00000000..bdc67d43
--- /dev/null
+++ b/src/imports/calendar/qquickcalendarview.cpp
@@ -0,0 +1,310 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Calendar module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qquickcalendarview_p.h"
+#include "qquickmonthmodel_p.h"
+
+#include <QtGui/qstylehints.h>
+#include <QtGui/qguiapplication.h>
+#include <QtQuickControls/private/qquickcontrol_p_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQuickCalendarViewPrivate : public QQuickControlPrivate
+{
+ Q_DECLARE_PUBLIC(QQuickCalendarView)
+
+public:
+ QQuickCalendarViewPrivate() : pressTimer(0), pressedItem(Q_NULLPTR), model(Q_NULLPTR), delegate(Q_NULLPTR) { }
+
+ void resizeItems();
+
+ QQuickItem *cellAt(const QPoint &pos) const;
+ QDate dateOf(QQuickItem *cell) const;
+
+ void updatePress(const QPoint &pos);
+ void clearPress(bool clicked);
+
+ static void setContextProperty(QQuickItem *item, const QString &name, const QVariant &value);
+
+ QString title;
+ QVariant source;
+ QDate pressedDate;
+ int pressTimer;
+ QQuickItem *pressedItem;
+ QQuickMonthModel *model;
+ QQmlComponent *delegate;
+};
+
+void QQuickCalendarViewPrivate::resizeItems()
+{
+ if (!contentItem)
+ return;
+
+ QSizeF itemSize;
+ itemSize.setWidth((contentItem->width() - 6 * spacing) / 7);
+ itemSize.setHeight((contentItem->height() - 5 * spacing) / 6);
+
+ foreach (QQuickItem *item, contentItem->childItems())
+ item->setSize(itemSize);
+}
+
+QQuickItem *QQuickCalendarViewPrivate::cellAt(const QPoint &pos) const
+{
+ Q_Q(const QQuickCalendarView);
+ if (contentItem) {
+ QPointF mapped = q->mapToItem(contentItem, pos);
+ return contentItem->childAt(mapped.x(), mapped.y());
+ }
+ return Q_NULLPTR;
+}
+
+QDate QQuickCalendarViewPrivate::dateOf(QQuickItem *cell) const
+{
+ if (contentItem)
+ return model->dateAt(contentItem->childItems().indexOf(cell));
+ return QDate();
+}
+
+void QQuickCalendarViewPrivate::updatePress(const QPoint &pos)
+{
+ Q_Q(QQuickCalendarView);
+ clearPress(false);
+ pressedItem = cellAt(pos);
+ setContextProperty(pressedItem, QStringLiteral("pressed"), true);
+ pressedDate = dateOf(pressedItem);
+ if (pressedDate.isValid())
+ emit q->pressed(pressedDate);
+}
+
+void QQuickCalendarViewPrivate::clearPress(bool clicked)
+{
+ Q_Q(QQuickCalendarView);
+ setContextProperty(pressedItem, QStringLiteral("pressed"), false);
+ if (pressedDate.isValid()) {
+ emit q->released(pressedDate);
+ if (clicked)
+ emit q->clicked(pressedDate);
+ }
+ pressedDate = QDate();
+ pressedItem = Q_NULLPTR;
+}
+
+void QQuickCalendarViewPrivate::setContextProperty(QQuickItem *item, const QString &name, const QVariant &value)
+{
+ QQmlContext *context = qmlContext(item);
+ if (context && context->isValid()) {
+ context = context->parentContext();
+ if (context && context->isValid())
+ context->setContextProperty(name, value);
+ }
+}
+
+QQuickCalendarView::QQuickCalendarView(QQuickItem *parent) :
+ QQuickControl(*(new QQuickCalendarViewPrivate), parent)
+{
+ Q_D(QQuickCalendarView);
+ setFlag(ItemIsFocusScope);
+ setActiveFocusOnTab(true);
+ setAcceptedMouseButtons(Qt::LeftButton);
+
+ d->model = new QQuickMonthModel(this);
+ d->source = QVariant::fromValue(d->model);
+ connect(d->model, &QQuickMonthModel::monthChanged, this, &QQuickCalendarView::monthChanged);
+ connect(d->model, &QQuickMonthModel::yearChanged, this, &QQuickCalendarView::yearChanged);
+ connect(d->model, &QQuickMonthModel::localeChanged, this, &QQuickCalendarView::localeChanged);
+ connect(d->model, &QQuickMonthModel::titleChanged, this, &QQuickCalendarView::titleChanged);
+}
+
+int QQuickCalendarView::month() const
+{
+ Q_D(const QQuickCalendarView);
+ return d->model->month();
+}
+
+void QQuickCalendarView::setMonth(int month)
+{
+ Q_D(QQuickCalendarView);
+ d->model->setMonth(month);
+}
+
+int QQuickCalendarView::year() const
+{
+ Q_D(const QQuickCalendarView);
+ return d->model->year();
+}
+
+void QQuickCalendarView::setYear(int year)
+{
+ Q_D(QQuickCalendarView);
+ d->model->setYear(year);
+}
+
+QLocale QQuickCalendarView::locale() const
+{
+ Q_D(const QQuickCalendarView);
+ return d->model->locale();
+}
+
+void QQuickCalendarView::setLocale(const QLocale &locale)
+{
+ Q_D(QQuickCalendarView);
+ d->model->setLocale(locale);
+}
+
+QVariant QQuickCalendarView::source() const
+{
+ Q_D(const QQuickCalendarView);
+ return d->source;
+}
+
+void QQuickCalendarView::setSource(const QVariant &source)
+{
+ Q_D(QQuickCalendarView);
+ if (d->source != source) {
+ d->source = source;
+ emit sourceChanged();
+ }
+}
+
+QString QQuickCalendarView::title() const
+{
+ Q_D(const QQuickCalendarView);
+ if (d->title.isNull())
+ return d->model->title();
+ return d->title;
+}
+
+void QQuickCalendarView::setTitle(const QString &title)
+{
+ Q_D(QQuickCalendarView);
+ if (d->title != title) {
+ d->title = title;
+ emit titleChanged();
+ }
+}
+
+QQmlComponent *QQuickCalendarView::delegate() const
+{
+ Q_D(const QQuickCalendarView);
+ return d->delegate;
+}
+
+void QQuickCalendarView::setDelegate(QQmlComponent *delegate)
+{
+ Q_D(QQuickCalendarView);
+ if (d->delegate != delegate) {
+ d->delegate = delegate;
+ emit delegateChanged();
+ }
+}
+
+void QQuickCalendarView::componentComplete()
+{
+ Q_D(QQuickCalendarView);
+ QQuickControl::componentComplete();
+ if (d->contentItem) {
+ foreach (QQuickItem *child, d->contentItem->childItems()) {
+ if (!QQuickItemPrivate::get(child)->isTransparentForPositioner())
+ d->setContextProperty(child, QStringLiteral("pressed"), false);
+ }
+ }
+ d->resizeItems();
+}
+
+void QQuickCalendarView::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+ Q_D(QQuickCalendarView);
+ QQuickControl::geometryChanged(newGeometry, oldGeometry);
+ if (isComponentComplete())
+ d->resizeItems();
+}
+
+void QQuickCalendarView::paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding)
+{
+ Q_D(QQuickCalendarView);
+ QQuickControl::paddingChange(newPadding, oldPadding);
+ if (isComponentComplete())
+ d->resizeItems();
+}
+
+void QQuickCalendarView::updatePolish()
+{
+ Q_D(QQuickCalendarView);
+ QQuickControl::updatePolish();
+ d->resizeItems();
+}
+
+void QQuickCalendarView::mousePressEvent(QMouseEvent *event)
+{
+ Q_D(QQuickCalendarView);
+ d->updatePress(event->pos());
+ if (d->pressedDate.isValid())
+ d->pressTimer = startTimer(qGuiApp->styleHints()->mousePressAndHoldInterval());
+ event->accept();
+}
+
+void QQuickCalendarView::mouseMoveEvent(QMouseEvent *event)
+{
+ Q_D(QQuickCalendarView);
+ d->updatePress(event->pos());
+ event->accept();
+}
+
+void QQuickCalendarView::mouseReleaseEvent(QMouseEvent *event)
+{
+ Q_D(QQuickCalendarView);
+ d->clearPress(true);
+ event->accept();
+}
+
+void QQuickCalendarView::mouseUngrabEvent()
+{
+ Q_D(QQuickCalendarView);
+ d->clearPress(false);
+}
+
+void QQuickCalendarView::timerEvent(QTimerEvent *event)
+{
+ Q_D(QQuickCalendarView);
+ if (event->timerId() == d->pressTimer) {
+ if (d->pressedDate.isValid())
+ emit pressAndHold(d->pressedDate);
+ killTimer(d->pressTimer);
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/calendar/qquickcalendarview_p.h b/src/imports/calendar/qquickcalendarview_p.h
new file mode 100644
index 00000000..b6094da1
--- /dev/null
+++ b/src/imports/calendar/qquickcalendarview_p.h
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Calendar module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QQUICKCALENDARVIEW_P_H
+#define QQUICKCALENDARVIEW_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtQuickControls/private/qquickcontrol_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQmlComponent;
+class QQuickCalendarViewPrivate;
+
+class QQuickCalendarView : public QQuickControl
+{
+ Q_OBJECT
+ Q_PROPERTY(int month READ month WRITE setMonth NOTIFY monthChanged FINAL)
+ Q_PROPERTY(int year READ year WRITE setYear NOTIFY yearChanged FINAL)
+ Q_PROPERTY(QLocale locale READ locale WRITE setLocale NOTIFY localeChanged FINAL)
+ Q_PROPERTY(QVariant source READ source WRITE setSource NOTIFY sourceChanged FINAL)
+ Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged FINAL)
+ Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged FINAL)
+
+public:
+ explicit QQuickCalendarView(QQuickItem *parent = Q_NULLPTR);
+
+ int month() const;
+ void setMonth(int month);
+
+ int year() const;
+ void setYear(int year);
+
+ QLocale locale() const;
+ void setLocale(const QLocale &locale);
+
+ QVariant source() const;
+ void setSource(const QVariant &source);
+
+ QString title() const;
+ void setTitle(const QString &title);
+
+ QQmlComponent *delegate() const;
+ void setDelegate(QQmlComponent *delegate);
+
+Q_SIGNALS:
+ void monthChanged();
+ void yearChanged();
+ void localeChanged();
+ void sourceChanged();
+ void titleChanged();
+ void delegateChanged();
+
+ void pressed(const QDate &date);
+ void released(const QDate &date);
+ void clicked(const QDate &date);
+ void pressAndHold(const QDate &date);
+
+protected:
+ void componentComplete() Q_DECL_OVERRIDE;
+ void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE;
+ void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) Q_DECL_OVERRIDE;
+ void updatePolish() Q_DECL_OVERRIDE;
+
+ void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
+ void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
+ void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
+ void mouseUngrabEvent() Q_DECL_OVERRIDE;
+ void timerEvent(QTimerEvent *event) Q_DECL_OVERRIDE;
+
+private:
+ Q_DISABLE_COPY(QQuickCalendarView)
+ Q_DECLARE_PRIVATE(QQuickCalendarView)
+};
+
+Q_DECLARE_TYPEINFO(QQuickCalendarView, Q_COMPLEX_TYPE);
+
+QT_END_NAMESPACE
+
+#endif // QQUICKCALENDARVIEW_P_H
diff --git a/src/imports/calendar/qquickdayofweekmodel.cpp b/src/imports/calendar/qquickdayofweekmodel.cpp
new file mode 100644
index 00000000..7f75f784
--- /dev/null
+++ b/src/imports/calendar/qquickdayofweekmodel.cpp
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Calendar module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qquickdayofweekmodel_p.h"
+
+#include <QtCore/private/qabstractitemmodel_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQuickDayOfWeekModelPrivate : public QAbstractItemModelPrivate
+{
+ Q_DECLARE_PUBLIC(QQuickDayOfWeekModel)
+
+public:
+ QLocale locale;
+};
+
+QQuickDayOfWeekModel::QQuickDayOfWeekModel(QObject *parent) :
+ QAbstractListModel(*(new QQuickDayOfWeekModelPrivate), parent)
+{
+}
+
+QLocale QQuickDayOfWeekModel::locale() const
+{
+ Q_D(const QQuickDayOfWeekModel);
+ return d->locale;
+}
+
+void QQuickDayOfWeekModel::setLocale(const QLocale &locale)
+{
+ Q_D(QQuickDayOfWeekModel);
+ if (d->locale != locale) {
+ bool changed = d->locale.firstDayOfWeek() != locale.firstDayOfWeek();
+ d->locale = locale;
+ emit localeChanged();
+ if (changed)
+ emit dataChanged(index(0, 0), index(6, 0));
+ }
+}
+
+int QQuickDayOfWeekModel::dayAt(int index) const
+{
+ Q_D(const QQuickDayOfWeekModel);
+ int day = d->locale.firstDayOfWeek() + index;
+ if (day > 7)
+ day -= 7;
+ if (day == 7)
+ day = 0; // Qt::Sunday = 7, but Sunday is 0 in JS Date
+ return day;
+}
+
+QVariant QQuickDayOfWeekModel::data(const QModelIndex &index, int role) const
+{
+ Q_D(const QQuickDayOfWeekModel);
+ if (index.isValid() && index.row() < 7) {
+ int day = dayAt(index.row());
+ switch (role) {
+ case DayRole:
+ return day;
+ case LongNameRole:
+ return d->locale.standaloneDayName(day == 0 ? Qt::Sunday : day, QLocale::LongFormat);
+ case ShortNameRole:
+ return d->locale.standaloneDayName(day == 0 ? Qt::Sunday : day, QLocale::ShortFormat);
+ case NarrowNameRole:
+ return d->locale.standaloneDayName(day == 0 ? Qt::Sunday : day, QLocale::NarrowFormat);
+ default:
+ break;
+ }
+ }
+ return QVariant();
+}
+
+int QQuickDayOfWeekModel::rowCount(const QModelIndex &parent) const
+{
+ if (parent.isValid())
+ return 0;
+ return 7;
+}
+
+QHash<int, QByteArray> QQuickDayOfWeekModel::roleNames() const
+{
+ QHash<int, QByteArray> roles;
+ roles[DayRole] = QByteArrayLiteral("day");
+ roles[LongNameRole] = QByteArrayLiteral("longName");
+ roles[ShortNameRole] = QByteArrayLiteral("shortName");
+ roles[NarrowNameRole] = QByteArrayLiteral("narrowName");
+ return roles;
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/calendar/qquickdayofweekmodel_p.h b/src/imports/calendar/qquickdayofweekmodel_p.h
new file mode 100644
index 00000000..4e827ad9
--- /dev/null
+++ b/src/imports/calendar/qquickdayofweekmodel_p.h
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Calendar module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QQUICKDAYOFWEEKMODEL_P_H
+#define QQUICKDAYOFWEEKMODEL_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qabstractitemmodel.h>
+#include <QtCore/qlocale.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQuickDayOfWeekModelPrivate;
+
+class QQuickDayOfWeekModel : public QAbstractListModel
+{
+ Q_OBJECT
+ Q_PROPERTY(QLocale locale READ locale WRITE setLocale NOTIFY localeChanged FINAL)
+ Q_PROPERTY(int count READ rowCount CONSTANT FINAL)
+
+public:
+ explicit QQuickDayOfWeekModel(QObject *parent = Q_NULLPTR);
+
+ QLocale locale() const;
+ void setLocale(const QLocale &locale);
+
+ Q_INVOKABLE int dayAt(int index) const;
+
+ enum {
+ DayRole = Qt::UserRole + 1,
+ LongNameRole,
+ ShortNameRole,
+ NarrowNameRole
+ };
+
+ QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE;
+ QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;
+ int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
+
+Q_SIGNALS:
+ void localeChanged();
+
+private:
+ Q_DISABLE_COPY(QQuickDayOfWeekModel)
+ Q_DECLARE_PRIVATE(QQuickDayOfWeekModel)
+};
+
+Q_DECLARE_TYPEINFO(QQuickDayOfWeekModel, Q_COMPLEX_TYPE);
+
+QT_END_NAMESPACE
+
+#endif // QQUICKDAYOFWEEKMODEL_P_H
diff --git a/src/imports/calendar/qquickdayofweekrow.cpp b/src/imports/calendar/qquickdayofweekrow.cpp
new file mode 100644
index 00000000..e4b42302
--- /dev/null
+++ b/src/imports/calendar/qquickdayofweekrow.cpp
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Calendar module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qquickdayofweekrow_p.h"
+#include "qquickdayofweekmodel_p.h"
+
+#include <QtQuickControls/private/qquickcontrol_p_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQuickDayOfWeekRowPrivate : public QQuickControlPrivate
+{
+public:
+ QQuickDayOfWeekRowPrivate() : delegate(Q_NULLPTR), model(Q_NULLPTR) { }
+
+ void resizeItems();
+
+ QVariant source;
+ QQmlComponent *delegate;
+ QQuickDayOfWeekModel *model;
+};
+
+void QQuickDayOfWeekRowPrivate::resizeItems()
+{
+ if (!contentItem)
+ return;
+
+ QSizeF itemSize;
+ itemSize.setWidth((contentItem->width() - 6 * spacing) / 7);
+ itemSize.setHeight(contentItem->height());
+
+ foreach (QQuickItem *item, contentItem->childItems())
+ item->setSize(itemSize);
+}
+
+QQuickDayOfWeekRow::QQuickDayOfWeekRow(QQuickItem *parent) :
+ QQuickControl(*(new QQuickDayOfWeekRowPrivate), parent)
+{
+ Q_D(QQuickDayOfWeekRow);
+ d->model = new QQuickDayOfWeekModel(this);
+ d->source = QVariant::fromValue(d->model);
+ connect(d->model, &QQuickDayOfWeekModel::localeChanged, this, &QQuickDayOfWeekRow::localeChanged);
+}
+
+QLocale QQuickDayOfWeekRow::locale() const
+{
+ Q_D(const QQuickDayOfWeekRow);
+ return d->model->locale();
+}
+
+void QQuickDayOfWeekRow::setLocale(const QLocale &locale)
+{
+ Q_D(QQuickDayOfWeekRow);
+ d->model->setLocale(locale);
+}
+
+QVariant QQuickDayOfWeekRow::source() const
+{
+ Q_D(const QQuickDayOfWeekRow);
+ return d->source;
+}
+
+void QQuickDayOfWeekRow::setSource(const QVariant &source)
+{
+ Q_D(QQuickDayOfWeekRow);
+ if (d->source != source) {
+ d->source = source;
+ emit sourceChanged();
+ }
+}
+
+QQmlComponent *QQuickDayOfWeekRow::delegate() const
+{
+ Q_D(const QQuickDayOfWeekRow);
+ return d->delegate;
+}
+
+void QQuickDayOfWeekRow::setDelegate(QQmlComponent *delegate)
+{
+ Q_D(QQuickDayOfWeekRow);
+ if (d->delegate != delegate) {
+ d->delegate = delegate;
+ emit delegateChanged();
+ }
+}
+
+void QQuickDayOfWeekRow::componentComplete()
+{
+ Q_D(QQuickDayOfWeekRow);
+ QQuickControl::componentComplete();
+ d->resizeItems();
+}
+
+void QQuickDayOfWeekRow::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+ Q_D(QQuickDayOfWeekRow);
+ QQuickControl::geometryChanged(newGeometry, oldGeometry);
+ if (isComponentComplete())
+ d->resizeItems();
+}
+
+void QQuickDayOfWeekRow::paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding)
+{
+ Q_D(QQuickDayOfWeekRow);
+ QQuickControl::paddingChange(newPadding, oldPadding);
+ if (isComponentComplete())
+ d->resizeItems();
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/calendar/qquickdayofweekrow_p.h b/src/imports/calendar/qquickdayofweekrow_p.h
new file mode 100644
index 00000000..de733812
--- /dev/null
+++ b/src/imports/calendar/qquickdayofweekrow_p.h
@@ -0,0 +1,96 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Calendar module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QQUICKDAYOFWEEKROW_P_H
+#define QQUICKDAYOFWEEKROW_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtQuickControls/private/qquickcontrol_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQmlComponent;
+class QQuickDayOfWeekRowPrivate;
+
+class QQuickDayOfWeekRow : public QQuickControl
+{
+ Q_OBJECT
+ Q_PROPERTY(QLocale locale READ locale WRITE setLocale NOTIFY localeChanged FINAL)
+ Q_PROPERTY(QVariant source READ source WRITE setSource NOTIFY sourceChanged FINAL)
+ Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged FINAL)
+
+public:
+ explicit QQuickDayOfWeekRow(QQuickItem *parent = Q_NULLPTR);
+
+ QLocale locale() const;
+ void setLocale(const QLocale &locale);
+
+ QVariant source() const;
+ void setSource(const QVariant &source);
+
+ QQmlComponent *delegate() const;
+ void setDelegate(QQmlComponent *delegate);
+
+Q_SIGNALS:
+ void localeChanged();
+ void sourceChanged();
+ void delegateChanged();
+
+protected:
+ void componentComplete() Q_DECL_OVERRIDE;
+ void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE;
+ void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) Q_DECL_OVERRIDE;
+
+private:
+ Q_DISABLE_COPY(QQuickDayOfWeekRow)
+ Q_DECLARE_PRIVATE(QQuickDayOfWeekRow)
+};
+
+Q_DECLARE_TYPEINFO(QQuickDayOfWeekRow, Q_COMPLEX_TYPE);
+
+QT_END_NAMESPACE
+
+#endif // QQUICKDAYOFWEEKROW_P_H
diff --git a/src/imports/calendar/qquickmonthmodel.cpp b/src/imports/calendar/qquickmonthmodel.cpp
new file mode 100644
index 00000000..064712ca
--- /dev/null
+++ b/src/imports/calendar/qquickmonthmodel.cpp
@@ -0,0 +1,226 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Calendar module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qquickmonthmodel_p.h"
+
+#include <QtCore/private/qabstractitemmodel_p.h>
+
+namespace {
+ static const int daysInAWeek = 7;
+ static const int weeksOnACalendarMonth = 6;
+ static const int daysOnACalendarMonth = daysInAWeek * weeksOnACalendarMonth;
+}
+
+QT_BEGIN_NAMESPACE
+
+class QQuickMonthModelPrivate : public QAbstractItemModelPrivate
+{
+ Q_DECLARE_PUBLIC(QQuickMonthModel)
+
+public:
+ QQuickMonthModelPrivate() : dates(daysOnACalendarMonth)
+ {
+ today = QDate::currentDate();
+ month = today.month();
+ year = today.year();
+ }
+
+ bool populate(int month, int year, const QLocale &locale, bool force = false);
+
+ int month;
+ int year;
+ QString title;
+ QLocale locale;
+ QVector<QDate> dates;
+ QDate today;
+};
+
+bool QQuickMonthModelPrivate::populate(int m, int y, const QLocale &l, bool force)
+{
+ Q_Q(QQuickMonthModel);
+ if (!force && m == month && y == year && l.firstDayOfWeek() == locale.firstDayOfWeek())
+ return false;
+
+ // The actual first (1st) day of the month.
+ QDate firstDayOfMonthDate(y, m, 1);
+ int difference = ((firstDayOfMonthDate.dayOfWeek() - l.firstDayOfWeek()) + 7) % 7;
+ // The first day to display should never be the 1st of the month, as we want some days from
+ // the previous month to be visible.
+ if (difference == 0)
+ difference += 7;
+ QDate firstDateToDisplay = firstDayOfMonthDate.addDays(-difference);
+
+ today = QDate::currentDate();
+ for (int i = 0; i < daysOnACalendarMonth; ++i)
+ dates[i] = firstDateToDisplay.addDays(i);
+
+ q->setTitle(l.standaloneMonthName(m) + QStringLiteral(" ") + QString::number(y));
+
+ return true;
+}
+
+QQuickMonthModel::QQuickMonthModel(QObject *parent) :
+ QAbstractListModel(*(new QQuickMonthModelPrivate), parent)
+{
+ Q_D(QQuickMonthModel);
+ d->populate(d->month, d->year, d->locale, true);
+}
+
+int QQuickMonthModel::month() const
+{
+ Q_D(const QQuickMonthModel);
+ return d->month;
+}
+
+void QQuickMonthModel::setMonth(int month)
+{
+ Q_D(QQuickMonthModel);
+ if (d->month != month) {
+ if (d->populate(month, d->year, d->locale))
+ emit dataChanged(index(0, 0), index(daysOnACalendarMonth - 1, 0));
+ d->month = month;
+ emit monthChanged();
+ }
+}
+
+int QQuickMonthModel::year() const
+{
+ Q_D(const QQuickMonthModel);
+ return d->year;
+}
+
+void QQuickMonthModel::setYear(int year)
+{
+ Q_D(QQuickMonthModel);
+ if (d->year != year) {
+ if (d->populate(d->month, year, d->locale))
+ emit dataChanged(index(0, 0), index(daysOnACalendarMonth - 1, 0));
+ d->year = year;
+ emit yearChanged();
+ }
+}
+
+QLocale QQuickMonthModel::locale() const
+{
+ Q_D(const QQuickMonthModel);
+ return d->locale;
+}
+
+void QQuickMonthModel::setLocale(const QLocale &locale)
+{
+ Q_D(QQuickMonthModel);
+ if (d->locale != locale) {
+ if (d->populate(d->month, d->year, locale))
+ emit dataChanged(index(0, 0), index(daysOnACalendarMonth - 1, 0));
+ d->locale = locale;
+ emit localeChanged();
+ }
+}
+
+QString QQuickMonthModel::title() const
+{
+ Q_D(const QQuickMonthModel);
+ return d->title;
+}
+
+void QQuickMonthModel::setTitle(const QString &title)
+{
+ Q_D(QQuickMonthModel);
+ if (d->title != title) {
+ d->title = title;
+ emit titleChanged();
+ }
+}
+
+QDate QQuickMonthModel::dateAt(int index) const
+{
+ Q_D(const QQuickMonthModel);
+ return d->dates.value(index);
+}
+
+int QQuickMonthModel::indexOf(const QDate &date) const
+{
+ Q_D(const QQuickMonthModel);
+ if (date < d->dates.first() || date > d->dates.last())
+ return -1;
+ return qMax(qint64(0), d->dates.first().daysTo(date));
+}
+
+QVariant QQuickMonthModel::data(const QModelIndex &index, int role) const
+{
+ Q_D(const QQuickMonthModel);
+ if (index.isValid() && index.row() < daysOnACalendarMonth) {
+ const QDate date = d->dates.at(index.row());
+ switch (role) {
+ case DateRole:
+ return date;
+ case DayRole:
+ return date.day();
+ case TodayRole:
+ return date == d->today;
+ case WeekNumberRole:
+ return date.weekNumber();
+ case MonthRole:
+ return date.month();
+ case YearRole:
+ return date.year();
+ default:
+ break;
+ }
+ }
+ return QVariant();
+}
+
+int QQuickMonthModel::rowCount(const QModelIndex &parent) const
+{
+ if (parent.isValid())
+ return 0;
+ return daysOnACalendarMonth;
+}
+
+QHash<int, QByteArray> QQuickMonthModel::roleNames() const
+{
+ QHash<int, QByteArray> roles;
+ roles[DateRole] = QByteArrayLiteral("date");
+ roles[DayRole] = QByteArrayLiteral("day");
+ roles[TodayRole] = QByteArrayLiteral("today");
+ roles[WeekNumberRole] = QByteArrayLiteral("weekNumber");
+ roles[MonthRole] = QByteArrayLiteral("month");
+ roles[YearRole] = QByteArrayLiteral("year");
+ return roles;
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/calendar/qquickmonthmodel_p.h b/src/imports/calendar/qquickmonthmodel_p.h
new file mode 100644
index 00000000..da4afcb4
--- /dev/null
+++ b/src/imports/calendar/qquickmonthmodel_p.h
@@ -0,0 +1,114 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Calendar module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QQUICKMONTHMODEL_P_H
+#define QQUICKMONTHMODEL_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qabstractitemmodel.h>
+#include <QtCore/qdatetime.h>
+#include <QtCore/qlocale.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQuickMonthModelPrivate;
+
+class QQuickMonthModel : public QAbstractListModel
+{
+ Q_OBJECT
+ Q_PROPERTY(int month READ month WRITE setMonth NOTIFY monthChanged FINAL)
+ Q_PROPERTY(int year READ year WRITE setYear NOTIFY yearChanged FINAL)
+ Q_PROPERTY(QLocale locale READ locale WRITE setLocale NOTIFY localeChanged FINAL)
+ Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged FINAL)
+ Q_PROPERTY(int count READ rowCount CONSTANT FINAL)
+
+public:
+ explicit QQuickMonthModel(QObject *parent = Q_NULLPTR);
+
+ int month() const;
+ void setMonth(int month);
+
+ int year() const;
+ void setYear(int year);
+
+ QLocale locale() const;
+ void setLocale(const QLocale &locale);
+
+ QString title() const;
+ void setTitle(const QString &title);
+
+ Q_INVOKABLE QDate dateAt(int index) const;
+ Q_INVOKABLE int indexOf(const QDate &date) const;
+
+ enum {
+ DateRole = Qt::UserRole + 1,
+ DayRole,
+ TodayRole,
+ WeekNumberRole,
+ MonthRole,
+ YearRole
+ };
+
+ QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE;
+ QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;
+ int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
+
+Q_SIGNALS:
+ void monthChanged();
+ void yearChanged();
+ void localeChanged();
+ void titleChanged();
+
+private:
+ Q_DISABLE_COPY(QQuickMonthModel)
+ Q_DECLARE_PRIVATE(QQuickMonthModel)
+};
+
+Q_DECLARE_TYPEINFO(QQuickMonthModel, Q_COMPLEX_TYPE);
+
+QT_END_NAMESPACE
+
+#endif // QQUICKMONTHMODEL_P_H
diff --git a/src/imports/calendar/qquickweeknumbercolumn.cpp b/src/imports/calendar/qquickweeknumbercolumn.cpp
new file mode 100644
index 00000000..56c4af97
--- /dev/null
+++ b/src/imports/calendar/qquickweeknumbercolumn.cpp
@@ -0,0 +1,169 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Calendar module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qquickweeknumbercolumn_p.h"
+#include "qquickweeknumbermodel_p.h"
+
+#include <QtQuickControls/private/qquickcontrol_p_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQuickWeekNumberColumnPrivate : public QQuickControlPrivate
+{
+public:
+ QQuickWeekNumberColumnPrivate() : delegate(Q_NULLPTR), model(Q_NULLPTR) { }
+
+ void resizeItems();
+
+ QVariant source;
+ QQmlComponent *delegate;
+ QQuickWeekNumberModel *model;
+};
+
+void QQuickWeekNumberColumnPrivate::resizeItems()
+{
+ if (!contentItem)
+ return;
+
+ QSizeF itemSize;
+ itemSize.setWidth(contentItem->width());
+ itemSize.setHeight((contentItem->height() - 5 * spacing) / 6);
+
+ foreach (QQuickItem *item, contentItem->childItems())
+ item->setSize(itemSize);
+}
+
+QQuickWeekNumberColumn::QQuickWeekNumberColumn(QQuickItem *parent) :
+ QQuickControl(*(new QQuickWeekNumberColumnPrivate), parent)
+{
+ Q_D(QQuickWeekNumberColumn);
+ d->model = new QQuickWeekNumberModel(this);
+ d->source = QVariant::fromValue(d->model);
+ connect(d->model, &QQuickWeekNumberModel::monthChanged, this, &QQuickWeekNumberColumn::monthChanged);
+ connect(d->model, &QQuickWeekNumberModel::yearChanged, this, &QQuickWeekNumberColumn::yearChanged);
+ connect(d->model, &QQuickWeekNumberModel::localeChanged, this, &QQuickWeekNumberColumn::localeChanged);
+}
+
+int QQuickWeekNumberColumn::month() const
+{
+ Q_D(const QQuickWeekNumberColumn);
+ return d->model->month();
+}
+
+void QQuickWeekNumberColumn::setMonth(int month)
+{
+ Q_D(QQuickWeekNumberColumn);
+ d->model->setMonth(month);
+}
+
+int QQuickWeekNumberColumn::year() const
+{
+ Q_D(const QQuickWeekNumberColumn);
+ return d->model->year();
+}
+
+void QQuickWeekNumberColumn::setYear(int year)
+{
+ Q_D(QQuickWeekNumberColumn);
+ d->model->setYear(year);
+}
+
+QLocale QQuickWeekNumberColumn::locale() const
+{
+ Q_D(const QQuickWeekNumberColumn);
+ return d->model->locale();
+}
+
+void QQuickWeekNumberColumn::setLocale(const QLocale &locale)
+{
+ Q_D(QQuickWeekNumberColumn);
+ d->model->setLocale(locale);
+}
+
+QVariant QQuickWeekNumberColumn::source() const
+{
+ Q_D(const QQuickWeekNumberColumn);
+ return d->source;
+}
+
+void QQuickWeekNumberColumn::setSource(const QVariant &source)
+{
+ Q_D(QQuickWeekNumberColumn);
+ if (d->source != source) {
+ d->source = source;
+ emit sourceChanged();
+ }
+}
+
+QQmlComponent *QQuickWeekNumberColumn::delegate() const
+{
+ Q_D(const QQuickWeekNumberColumn);
+ return d->delegate;
+}
+
+void QQuickWeekNumberColumn::setDelegate(QQmlComponent *delegate)
+{
+ Q_D(QQuickWeekNumberColumn);
+ if (d->delegate != delegate) {
+ d->delegate = delegate;
+ emit delegateChanged();
+ }
+}
+
+void QQuickWeekNumberColumn::componentComplete()
+{
+ Q_D(QQuickWeekNumberColumn);
+ QQuickControl::componentComplete();
+ d->resizeItems();
+}
+
+void QQuickWeekNumberColumn::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+ Q_D(QQuickWeekNumberColumn);
+ QQuickControl::geometryChanged(newGeometry, oldGeometry);
+ if (isComponentComplete())
+ d->resizeItems();
+}
+
+void QQuickWeekNumberColumn::paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding)
+{
+ Q_D(QQuickWeekNumberColumn);
+ QQuickControl::paddingChange(newPadding, oldPadding);
+ if (isComponentComplete())
+ d->resizeItems();
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/calendar/qquickweeknumbercolumn_p.h b/src/imports/calendar/qquickweeknumbercolumn_p.h
new file mode 100644
index 00000000..fc60431c
--- /dev/null
+++ b/src/imports/calendar/qquickweeknumbercolumn_p.h
@@ -0,0 +1,106 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Calendar module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QQUICKWEEKNUMBERCOLUMN_P_H
+#define QQUICKWEEKNUMBERCOLUMN_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtQuickControls/private/qquickcontrol_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQmlComponent;
+class QQuickWeekNumberColumnPrivate;
+
+class QQuickWeekNumberColumn : public QQuickControl
+{
+ Q_OBJECT
+ Q_PROPERTY(int month READ month WRITE setMonth NOTIFY monthChanged FINAL)
+ Q_PROPERTY(int year READ year WRITE setYear NOTIFY yearChanged FINAL)
+ Q_PROPERTY(QLocale locale READ locale WRITE setLocale NOTIFY localeChanged FINAL)
+ Q_PROPERTY(QVariant source READ source WRITE setSource NOTIFY sourceChanged FINAL)
+ Q_PROPERTY(QQmlComponent *delegate READ delegate WRITE setDelegate NOTIFY delegateChanged FINAL)
+
+public:
+ explicit QQuickWeekNumberColumn(QQuickItem *parent = Q_NULLPTR);
+
+ int month() const;
+ void setMonth(int month);
+
+ int year() const;
+ void setYear(int year);
+
+ QLocale locale() const;
+ void setLocale(const QLocale &locale);
+
+ QVariant source() const;
+ void setSource(const QVariant &source);
+
+ QQmlComponent *delegate() const;
+ void setDelegate(QQmlComponent *delegate);
+
+Q_SIGNALS:
+ void monthChanged();
+ void yearChanged();
+ void localeChanged();
+ void sourceChanged();
+ void delegateChanged();
+
+protected:
+ void componentComplete() Q_DECL_OVERRIDE;
+ void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE;
+ void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding) Q_DECL_OVERRIDE;
+
+private:
+ Q_DISABLE_COPY(QQuickWeekNumberColumn)
+ Q_DECLARE_PRIVATE(QQuickWeekNumberColumn)
+};
+
+Q_DECLARE_TYPEINFO(QQuickWeekNumberColumn, Q_COMPLEX_TYPE);
+
+QT_END_NAMESPACE
+
+#endif // QQUICKWEEKNUMBERCOLUMN_P_H
diff --git a/src/imports/calendar/qquickweeknumbermodel.cpp b/src/imports/calendar/qquickweeknumbermodel.cpp
new file mode 100644
index 00000000..34d66202
--- /dev/null
+++ b/src/imports/calendar/qquickweeknumbermodel.cpp
@@ -0,0 +1,182 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Calendar module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qquickweeknumbermodel_p.h"
+
+#include <QtCore/private/qabstractitemmodel_p.h>
+#include <QtCore/qdatetime.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQuickWeekNumberModelPrivate : public QAbstractItemModelPrivate
+{
+ Q_DECLARE_PUBLIC(QQuickWeekNumberModel)
+
+public:
+ QQuickWeekNumberModelPrivate()
+ {
+ QDate date = QDate::currentDate();
+ month = date.month();
+ year = date.year();
+ first = calculateFirst(month, year, locale);
+ }
+
+ void init(int month, int year, const QLocale &locale = QLocale());
+ static int calculateFirst(int month, int year, const QLocale &locale);
+
+ int month;
+ int year;
+ int first;
+ QLocale locale;
+};
+
+void QQuickWeekNumberModelPrivate::init(int m, int y, const QLocale &l)
+{
+ Q_Q(QQuickWeekNumberModel);
+ if (m == month && y == year && l.firstDayOfWeek() == locale.firstDayOfWeek())
+ return;
+
+ first = calculateFirst(m, y, l);
+
+ emit q->dataChanged(q->index(0, 0), q->index(5, 0));
+}
+
+int QQuickWeekNumberModelPrivate::calculateFirst(int month, int year, const QLocale &locale)
+{
+ // The actual first (1st) day of the month.
+ QDate firstDayOfMonthDate(year, month, 1);
+ int difference = ((firstDayOfMonthDate.dayOfWeek() - locale.firstDayOfWeek()) + 7) % 7;
+ // The first day to display should never be the 1st of the month, as we want some days from
+ // the previous month to be visible.
+ if (difference == 0)
+ difference += 7;
+ return firstDayOfMonthDate.addDays(-difference).weekNumber();
+}
+
+QQuickWeekNumberModel::QQuickWeekNumberModel(QObject *parent) :
+ QAbstractListModel(*(new QQuickWeekNumberModelPrivate), parent)
+{
+}
+
+int QQuickWeekNumberModel::month() const
+{
+ Q_D(const QQuickWeekNumberModel);
+ return d->month;
+}
+
+void QQuickWeekNumberModel::setMonth(int month)
+{
+ Q_D(QQuickWeekNumberModel);
+ if (d->month != month) {
+ d->init(month, d->year, d->locale);
+ d->month = month;
+ emit monthChanged();
+ }
+}
+
+int QQuickWeekNumberModel::year() const
+{
+ Q_D(const QQuickWeekNumberModel);
+ return d->year;
+}
+
+void QQuickWeekNumberModel::setYear(int year)
+{
+ Q_D(QQuickWeekNumberModel);
+ if (d->year != year) {
+ d->init(d->month, year, d->locale);
+ d->year = year;
+ emit yearChanged();
+ }
+}
+
+QLocale QQuickWeekNumberModel::locale() const
+{
+ Q_D(const QQuickWeekNumberModel);
+ return d->locale;
+}
+
+void QQuickWeekNumberModel::setLocale(const QLocale &locale)
+{
+ Q_D(QQuickWeekNumberModel);
+ if (d->locale != locale) {
+ d->init(d->month, d->year, locale);
+ d->locale = locale;
+ emit localeChanged();
+ }
+}
+
+int QQuickWeekNumberModel::weekNumberAt(int index) const
+{
+ Q_D(const QQuickWeekNumberModel);
+ if (index < 0 || index > 5)
+ return -1;
+ return d->first + index;
+}
+
+int QQuickWeekNumberModel::indexOf(int weekNumber) const
+{
+ Q_D(const QQuickWeekNumberModel);
+ if (weekNumber < d->first || weekNumber > d->first + 6)
+ return -1;
+ return weekNumber - d->first;
+}
+
+QVariant QQuickWeekNumberModel::data(const QModelIndex &index, int role) const
+{
+ if (role == WeekNumberRole) {
+ int weekNumber = weekNumberAt(index.row());
+ if (weekNumber != -1)
+ return weekNumber;
+ }
+ return QVariant();
+}
+
+int QQuickWeekNumberModel::rowCount(const QModelIndex &parent) const
+{
+ if (parent.isValid())
+ return 0;
+ return 6;
+}
+
+QHash<int, QByteArray> QQuickWeekNumberModel::roleNames() const
+{
+ QHash<int, QByteArray> roles;
+ roles[WeekNumberRole] = QByteArrayLiteral("weekNumber");
+ return roles;
+}
+
+QT_END_NAMESPACE
diff --git a/src/imports/calendar/qquickweeknumbermodel_p.h b/src/imports/calendar/qquickweeknumbermodel_p.h
new file mode 100644
index 00000000..2ca706c4
--- /dev/null
+++ b/src/imports/calendar/qquickweeknumbermodel_p.h
@@ -0,0 +1,103 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the Qt Quick Calendar module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL3$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPLv3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or later as published by the Free
+** Software Foundation and appearing in the file LICENSE.GPL included in
+** the packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 2.0 requirements will be
+** met: http://www.gnu.org/licenses/gpl-2.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QQUICKWEEKNUMBERMODEL_P_H
+#define QQUICKWEEKNUMBERMODEL_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qabstractitemmodel.h>
+#include <QtCore/qlocale.h>
+
+QT_BEGIN_NAMESPACE
+
+class QQuickWeekNumberModelPrivate;
+
+class QQuickWeekNumberModel : public QAbstractListModel
+{
+ Q_OBJECT
+ Q_PROPERTY(int month READ month WRITE setMonth NOTIFY monthChanged FINAL)
+ Q_PROPERTY(int year READ year WRITE setYear NOTIFY yearChanged FINAL)
+ Q_PROPERTY(QLocale locale READ locale WRITE setLocale NOTIFY localeChanged FINAL)
+ Q_PROPERTY(int count READ rowCount CONSTANT FINAL)
+
+public:
+ explicit QQuickWeekNumberModel(QObject *parent = Q_NULLPTR);
+
+ int month() const;
+ void setMonth(int month);
+
+ int year() const;
+ void setYear(int year);
+
+ QLocale locale() const;
+ void setLocale(const QLocale &locale);
+
+ Q_INVOKABLE int weekNumberAt(int index) const;
+ Q_INVOKABLE int indexOf(int weekNumber) const;
+
+ enum {
+ WeekNumberRole = Qt::UserRole + 1
+ };
+
+ QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE;
+ QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;
+ int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
+
+Q_SIGNALS:
+ void monthChanged();
+ void yearChanged();
+ void localeChanged();
+
+private:
+ Q_DISABLE_COPY(QQuickWeekNumberModel)
+ Q_DECLARE_PRIVATE(QQuickWeekNumberModel)
+};
+
+Q_DECLARE_TYPEINFO(QQuickWeekNumberModel, Q_COMPLEX_TYPE);
+
+QT_END_NAMESPACE
+
+#endif // QQUICKWEEKNUMBERMODEL_P_H
diff --git a/src/imports/calendar/qtquickcalendar2plugin.cpp b/src/imports/calendar/qtquickcalendar2plugin.cpp
index 68ef2ad0..be4bfb19 100644
--- a/src/imports/calendar/qtquickcalendar2plugin.cpp
+++ b/src/imports/calendar/qtquickcalendar2plugin.cpp
@@ -36,13 +36,13 @@
#include <QtQml/qqmlextensionplugin.h>
-#include <QtQuickCalendar/private/qquickcalendarview_p.h>
-#include <QtQuickCalendar/private/qquickdayofweekrow_p.h>
-#include <QtQuickCalendar/private/qquickweeknumbercolumn_p.h>
-#include <QtQuickCalendar/private/qquickcalendarmodel_p.h>
-#include <QtQuickCalendar/private/qquickdayofweekmodel_p.h>
-#include <QtQuickCalendar/private/qquickmonthmodel_p.h>
-#include <QtQuickCalendar/private/qquickweeknumbermodel_p.h>
+#include "qquickcalendarview_p.h"
+#include "qquickdayofweekrow_p.h"
+#include "qquickweeknumbercolumn_p.h"
+#include "qquickcalendarmodel_p.h"
+#include "qquickdayofweekmodel_p.h"
+#include "qquickmonthmodel_p.h"
+#include "qquickweeknumbermodel_p.h"
QT_BEGIN_NAMESPACE