summaryrefslogtreecommitdiffstats
path: root/src/controls/Private/CalendarUtils.js
diff options
context:
space:
mode:
authorMitch Curtis <mitch.curtis@digia.com>2013-07-15 22:57:52 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-14 13:13:53 +0100
commite023dd212c81a2ad4ba4b4db22df9cde65a502e8 (patch)
tree2c3521e8a4154d65a55fc3032254b58b181d957e /src/controls/Private/CalendarUtils.js
parente88bdffe644e53912dfbce95117555cb6a87bfd2 (diff)
Add Calendar to Qt Quick Controls.
Task-number: QTBUG-29948 [ChangeLog][QtQuickControls] Calendar was added. Calendar allows selection of dates from a grid of days, similar to QCalendarWidget. Change-Id: I279130e704bc0dfd8dfe114ec9b6b49e111faf96 Reviewed-by: Jens Bache-Wiig <jens.bache-wiig@digia.com>
Diffstat (limited to 'src/controls/Private/CalendarUtils.js')
-rw-r--r--src/controls/Private/CalendarUtils.js132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/controls/Private/CalendarUtils.js b/src/controls/Private/CalendarUtils.js
new file mode 100644
index 000000000..c055118e5
--- /dev/null
+++ b/src/controls/Private/CalendarUtils.js
@@ -0,0 +1,132 @@
+/****************************************************************************
+**
+** 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$
+**
+****************************************************************************/
+
+.pragma library
+
+var daysInAWeek = 7;
+var monthsInAYear = 12;
+
+// Not the number of weeks per month, but the number of weeks that are
+// shown on a typical calendar.
+var weeksOnACalendarMonth = 6;
+
+// Can't create year 1 directly...
+var minimumCalendarDate = new Date(-1, 0, 1);
+minimumCalendarDate.setFullYear(minimumCalendarDate.getFullYear() + 2);
+var maximumCalendarDate = new Date(275759, 9, 25);
+
+function daysInMonth(date) {
+ // Passing 0 as the day will give us the previous month, which will be
+ // date.getMonth() since we added 1 to it.
+ return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();
+}
+
+/*!
+ Returns a copy of \a date with its month set to \a month, keeping the same
+ day if possible. Does not modify \a date.
+*/
+function setMonth(date, month) {
+ var oldDay = date.getDate();
+ var newDate = new Date(date);
+ // Set the day first, because setting the month could cause it to skip ahead
+ // a month if the day is larger than the latest day in that month.
+ newDate.setDate(1);
+ newDate.setMonth(month);
+ // We'd like to have the previous day still selected when we change
+ // months, but it might not be possible, so use the smallest of the two.
+ newDate.setDate(Math.min(oldDay, daysInMonth(newDate)));
+ return newDate;
+}
+
+function cellRectAt(index, columns, rows, availableWidth, availableHeight) {
+ var col = Math.floor(index % columns);
+ var row = Math.floor(index / columns);
+
+ var remainingHorizontalSpace = Math.floor(availableWidth % columns);
+ var remainingVerticalSpace = Math.floor(availableHeight % rows);
+ var baseCellWidth = Math.floor(availableWidth / columns);
+ var baseCellHeight = Math.floor(availableHeight / rows);
+
+ var rect = Qt.rect(0, 0, 0, 0);
+
+ rect.x = baseCellWidth * col;
+ rect.width = baseCellWidth;
+ if (remainingHorizontalSpace > 0) {
+ if (col < remainingHorizontalSpace) {
+ ++rect.width;
+ }
+
+ // This cell's x position should be increased by 1 for every column above it.
+ rect.x += Math.min(remainingHorizontalSpace, col);
+ }
+
+ rect.y = baseCellHeight * row;
+ rect.height = baseCellHeight;
+ if (remainingVerticalSpace > 0) {
+ if (row < remainingVerticalSpace) {
+ ++rect.height;
+ }
+
+ // This cell's y position should be increased by 1 for every row above it.
+ rect.y += Math.min(remainingVerticalSpace, row);
+ }
+
+ return rect;
+}
+
+function cellIndexAt(x, y, columns, rows, availableWidth, availableHeight) {
+ var remainingHorizontalSpace = Math.floor(availableWidth % columns);
+ var remainingVerticalSpace = Math.floor(availableHeight % rows);
+ var baseCellWidth = Math.floor(availableWidth / columns);
+ var baseCellHeight = Math.floor(availableHeight / rows);
+
+ // TODO: improve this.
+ for (var row = 0; row < rows; ++row) {
+ for (var col = 0; col < columns; ++col) {
+ var index = row * columns + col;
+ var rect = cellRectAt(index, columns, rows, availableWidth, availableHeight);
+ if (x >= rect.x && x < rect.x + rect.width && y >= rect.y && y < rect.y + rect.height) {
+ return index;
+ }
+ }
+ }
+
+ return -1;
+}