diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-02-23 10:19:08 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-02-23 11:20:55 +0000 |
commit | 32990fc8c58f7271bceff5a4e9da2c73642048f1 (patch) | |
tree | 881aa2604c2cce3eb95d423b5d87e245b626d653 | |
parent | 8778db4d8ca3727370137ad8578a5ef5461e0e71 (diff) |
Fix CalendarModel month indices
Change-Id: I25c683cce19436d103d3225ad098daedf6212b64
Task-number: QTBUG-51108
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
-rw-r--r-- | src/imports/calendar/qquickcalendarmodel.cpp | 38 | ||||
-rw-r--r-- | tests/auto/calendar/data/tst_calendarmodel.qml | 115 |
2 files changed, 147 insertions, 6 deletions
diff --git a/src/imports/calendar/qquickcalendarmodel.cpp b/src/imports/calendar/qquickcalendarmodel.cpp index 6b59d45a..9d214450 100644 --- a/src/imports/calendar/qquickcalendarmodel.cpp +++ b/src/imports/calendar/qquickcalendarmodel.cpp @@ -60,9 +60,28 @@ QT_BEGIN_NAMESPACE \row \li \b model.year : int \li The number of the year \endtable + The Qt Labs Calendar module uses 0-based month numbers to be consistent + with the JavaScript Date type, that is used by the QML language. This + means that \c Date::getMonth() can be passed to the methods as is. When + dealing with dealing with month numbers directly, it is highly recommended + to use the following enumeration values to avoid confusion. + + \value Calendar.January January (0) + \value Calendar.February February (1) + \value Calendar.March March (2) + \value Calendar.April April (3) + \value Calendar.May May (4) + \value Calendar.June June (5) + \value Calendar.July July (6) + \value Calendar.August August (7) + \value Calendar.September September (8) + \value Calendar.October October (9) + \value Calendar.November November (10) + \value Calendar.December December (11) + \labs - \sa MonthGrid + \sa MonthGrid, Calendar */ class QQuickCalendarModelPrivate : public QAbstractItemModelPrivate @@ -87,9 +106,16 @@ public: int QQuickCalendarModelPrivate::getCount(const QDate& from, const QDate &to) { + if (!from.isValid() || !to.isValid()) + return 0; + 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 days = f.daysTo(t); + if (days < 0) + return 0; + + QDate r = QDate(1, 1, 1).addDays(days); int years = r.year() - 1; int months = r.month() - 1; return 12 * years + months + (r.day() / t.day()); @@ -169,7 +195,7 @@ void QQuickCalendarModel::setTo(const QDate &to) int QQuickCalendarModel::monthAt(int index) const { Q_D(const QQuickCalendarModel); - return d->from.addMonths(index).month(); + return d->from.addMonths(index).month() - 1; } /*! @@ -190,7 +216,8 @@ int QQuickCalendarModel::yearAt(int index) const */ int QQuickCalendarModel::indexOf(const QDate &date) const { - return indexOf(date.year(), date.month()); + Q_D(const QQuickCalendarModel); + return d->getCount(d->from, date) - 1; } /*! @@ -200,8 +227,7 @@ int QQuickCalendarModel::indexOf(const QDate &date) const */ int QQuickCalendarModel::indexOf(int year, int month) const { - Q_D(const QQuickCalendarModel); - return d->getCount(d->from, QDate(year, month, 1)) - 1; + return indexOf(QDate(year, month + 1, 1)); } QVariant QQuickCalendarModel::data(const QModelIndex &index, int role) const diff --git a/tests/auto/calendar/data/tst_calendarmodel.qml b/tests/auto/calendar/data/tst_calendarmodel.qml new file mode 100644 index 00000000..da2f3d8b --- /dev/null +++ b/tests/auto/calendar/data/tst_calendarmodel.qml @@ -0,0 +1,115 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the test suite 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 The Qt Company Ltd 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 QtTest 1.0 +import QtQml 2.2 +import Qt.labs.calendar 1.0 + +TestCase { + id: testCase + name: "CalendarModel" + + Component { + id: calendarModel + CalendarModel { } + } + + Component { + id: instantiator + Instantiator { + model: CalendarModel { + from: new Date(2016, 0, 1) + to: new Date(2016, 11, 31) + } + QtObject { + readonly property int month: model.month + readonly property int year: model.year + } + } + } + + function test_indices_data() { + return [ + { tag: "2013", from: "2013-01-01", to: "2013-12-31", count: 12 }, + { tag: "2016", from: "2016-01-01", to: "2016-03-31", count: 3 } + ] + } + + function test_indices(data) { + var model = calendarModel.createObject(testCase, {from: data.from, to: data.to}) + verify(model) + + compare(model.count, data.count) + + var y = parseInt(data.tag) + for (var m = 0; m < 12; ++m) { + compare(model.yearAt(m), y) + compare(model.indexOf(y, m), m) + compare(model.indexOf(new Date(y, m, 1)), m) + compare(model.monthAt(m), m) + } + + model.destroy() + } + + function test_invalid() { + var model = calendarModel.createObject(testCase) + verify(model) + + compare(model.indexOf(-1, -1), -1) + compare(model.indexOf(new Date(-1, -1, -1)), -1) + + model.destroy() + } + + function test_instantiator() { + var inst = instantiator.createObject(testCase) + verify(inst) + + compare(inst.count, 12) + for (var m = 0; m < inst.count; ++m) { + compare(inst.objectAt(m).month, m) + compare(inst.objectAt(m).year, 2016) + } + + inst.destroy() + } +} |