aboutsummaryrefslogtreecommitdiffstats
path: root/examples/quick/calendar
diff options
context:
space:
mode:
Diffstat (limited to 'examples/quick/calendar')
-rw-r--r--examples/quick/calendar/calendar.pro12
-rw-r--r--examples/quick/calendar/calendar.qrc5
-rw-r--r--examples/quick/calendar/main.cpp149
-rw-r--r--examples/quick/calendar/main.qml237
4 files changed, 403 insertions, 0 deletions
diff --git a/examples/quick/calendar/calendar.pro b/examples/quick/calendar/calendar.pro
new file mode 100644
index 00000000..d08794e6
--- /dev/null
+++ b/examples/quick/calendar/calendar.pro
@@ -0,0 +1,12 @@
+TEMPLATE = app
+TARGET = calendar
+QT += quick sql
+
+SOURCES += \
+ main.cpp
+
+OTHER_FILES += \
+ main.qml
+
+RESOURCES += \
+ calendar.qrc
diff --git a/examples/quick/calendar/calendar.qrc b/examples/quick/calendar/calendar.qrc
new file mode 100644
index 00000000..5f6483ac
--- /dev/null
+++ b/examples/quick/calendar/calendar.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/">
+ <file>main.qml</file>
+ </qresource>
+</RCC>
diff --git a/examples/quick/calendar/main.cpp b/examples/quick/calendar/main.cpp
new file mode 100644
index 00000000..d8fe5921
--- /dev/null
+++ b/examples/quick/calendar/main.cpp
@@ -0,0 +1,149 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the examples 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 <QtGui>
+#include <QtQml>
+#include <QtSql>
+
+class Event : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QString name MEMBER name NOTIFY nameChanged)
+ Q_PROPERTY(QDateTime start MEMBER start NOTIFY startChanged)
+ Q_PROPERTY(QDateTime end MEMBER end NOTIFY endChanged)
+
+public:
+ explicit Event(const QString &name, QObject *parent = 0) : QObject(parent), name(name) { }
+
+ QString name;
+ QDateTime start;
+ QDateTime end;
+
+signals:
+ void nameChanged();
+ void startChanged();
+ void endChanged();
+};
+
+class SqlEventModel : public QSqlQueryModel
+{
+ Q_OBJECT
+ Q_PROPERTY(QDate min READ min CONSTANT)
+ Q_PROPERTY(QDate max READ max CONSTANT)
+
+public:
+ SqlEventModel(QObject *parent = 0) : QSqlQueryModel(parent) { }
+
+ QDate min() const
+ {
+ QSqlQuery query(QStringLiteral("SELECT MIN(start) FROM Event"));
+ if (query.next())
+ return QDateTime::fromMSecsSinceEpoch(query.value(0).toLongLong()).date();
+ return QDate();
+ }
+
+ QDate max() const
+ {
+ QSqlQuery query(QStringLiteral("SELECT MAX(end) FROM Event"));
+ if (query.next())
+ return QDateTime::fromMSecsSinceEpoch(query.value(0).toLongLong()).date();
+ return QDate();
+ }
+
+ Q_INVOKABLE QList<QObject*> eventsForDate(const QDate &date)
+ {
+ qint64 from = QDateTime(date, QTime(0, 0)).toMSecsSinceEpoch();
+ qint64 to = QDateTime(date, QTime(23, 59)).toMSecsSinceEpoch();
+
+ QSqlQuery query;
+ if (!query.exec(QStringLiteral("SELECT * FROM Event WHERE start <= %1 AND end >= %2").arg(to).arg(from)))
+ qFatal("Query failed");
+
+ QList<QObject*> events;
+ while (query.next()) {
+ Event *event = new Event(query.value("name").toString(), this);
+ event->start = QDateTime::fromMSecsSinceEpoch(query.value("start").toLongLong());
+ event->end = QDateTime::fromMSecsSinceEpoch(query.value("end").toLongLong());
+ events.append(event);
+ }
+ return events;
+ }
+};
+
+// create an in-memory SQLITE database
+static bool addEvent(QSqlQuery* query, const QString &name, const QDateTime &start, qint64 duration = 0)
+{
+ QDateTime end = start.addSecs(duration);
+ return query->exec(QStringLiteral("insert into Event values('%1', %2, %3)").arg(name)
+ .arg(start.toMSecsSinceEpoch())
+ .arg(end.toMSecsSinceEpoch()));
+}
+
+static void createDatabase()
+{
+ QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
+ db.setDatabaseName(":memory:");
+ if (!db.open()) {
+ qFatal("Cannot open database");
+ return;
+ }
+
+ QSqlQuery query;
+ query.exec("create table if not exists Event (name TEXT, start BIGINT, end BIGINT)");
+
+ const QDate current = QDate::currentDate();
+ addEvent(&query, "Job interview", QDateTime(current.addDays(-19), QTime(12, 0)));
+ addEvent(&query, "Grocery shopping", QDateTime(current.addDays(-14), QTime(18, 0)));
+ addEvent(&query, "Ice skating", QDateTime(current.addDays(-14), QTime(20, 0)), 5400);
+ addEvent(&query, "Dentist's appointment", QDateTime(current.addDays(-8), QTime(14, 0)), 1800);
+ addEvent(&query, "Cross-country skiing", QDateTime(current.addDays(1), QTime(19, 30)), 3600);
+ addEvent(&query, "Conference", QDateTime(current.addDays(10), QTime(9, 0)), 432000);
+ addEvent(&query, "Hairdresser", QDateTime(current.addDays(19), QTime(13, 0)));
+ addEvent(&query, "Doctor's appointment", QDateTime(current.addDays(21), QTime(16, 0)));
+ addEvent(&query, "Vacation", QDateTime(current.addDays(35), QTime(0, 0)), 604800);
+}
+
+int main(int argc, char *argv[])
+{
+ QGuiApplication app(argc, argv);
+ createDatabase();
+ qmlRegisterType<SqlEventModel>("io.qt.examples.calendar", 1, 0, "SqlEventModel");
+ QQmlApplicationEngine engine;
+ engine.load(QUrl("qrc:/main.qml"));
+ return app.exec();
+}
+
+#include "main.moc"
diff --git a/examples/quick/calendar/main.qml b/examples/quick/calendar/main.qml
new file mode 100644
index 00000000..7fabf979
--- /dev/null
+++ b/examples/quick/calendar/main.qml
@@ -0,0 +1,237 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the examples 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$
+**
+****************************************************************************/
+
+import QtQuick 2.4
+import QtQuick.Controls 2.0
+import QtQuick.Calendar 2.0
+import io.qt.examples.calendar 1.0
+
+ApplicationWindow {
+ id: window
+ width: 640
+ height: 400
+ minimumWidth: 400
+ minimumHeight: 300
+ color: "#f4f4f4"
+ visible: true
+ title: "Qt Quick Controls - Calendar Example"
+
+ SqlEventModel {
+ id: eventModel
+ }
+
+ Flow {
+ id: row
+ anchors.fill: parent
+ anchors.margins: 20
+ spacing: 10
+ layoutDirection: Qt.RightToLeft
+
+ ListView {
+ id: calendar
+ property date selectedDate: new Date()
+
+ clip: true
+ width: (parent.width > parent.height ? (parent.width - parent.spacing) * 0.6 : parent.width)
+ height: (parent.height > parent.width ? (parent.height - parent.spacing) * 0.6 : parent.height)
+
+ model: CalendarModel {
+ id: model
+ from: eventModel.min
+ to: eventModel.max
+ }
+
+ focus: true
+ currentIndex: -1
+ snapMode: ListView.SnapOneItem
+ highlightMoveDuration: 250
+ highlightRangeMode: ListView.StrictlyEnforceRange
+ orientation: parent.width > parent.height ? ListView.Vertical : ListView.Horizontal
+
+ delegate: CalendarView {
+ id: delegate
+
+ width: calendar.width
+ height: calendar.height
+
+ month: model.month
+ year: model.year
+
+ padding.top: title.height
+ Column {
+ id: title
+ x: delegate.contentItem.x
+ width: delegate.contentItem.width
+ spacing: window.style.spacing
+ Text {
+ width: parent.width
+ height: implicitHeight * 2
+ text: delegate.title
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ font.pointSize: 18
+ }
+ DayOfWeekRow {
+ width: parent.width
+ }
+ }
+
+ padding.left: weekNumbers.width
+ WeekNumberColumn {
+ id: weekNumbers
+ month: model.month
+ year: model.year
+ y: delegate.contentItem.y
+ height: delegate.contentItem.height
+ }
+
+ onClicked: calendar.selectedDate = date
+
+ delegate: CalendarDelegate {
+ text: model.day
+ width: delegate.contentItem.width / 7
+ height: delegate.contentItem.height / 6
+ opacity: model.month === delegate.month ? 1 : 0
+ color: model.today ? window.style.accentColor : window.style.textColor
+ Rectangle {
+ z: -1
+ anchors.centerIn: parent
+ width: Math.min(parent.width * 0.6, parent.width * 0.6)
+ height: width
+ radius: width / 2
+ opacity: 0.5
+ color: pressed ? window.style.pressColor : "transparent"
+ border.color: eventModel.eventsForDate(model.date).length > 0 ? window.style.accentColor : "transparent"
+ }
+ }
+ }
+ Rectangle {
+ z: -1
+ parent: calendar
+ anchors.fill: parent
+ border.color: window.style.frameColor
+ }
+ }
+
+ Component {
+ id: eventListHeader
+
+ Row {
+ id: eventDateRow
+ width: parent.width
+ height: eventDayLabel.height
+ spacing: 10
+
+ Label {
+ id: eventDayLabel
+ text: calendar.selectedDate.getDate()
+ font.pointSize: 35
+ }
+
+ Column {
+ height: eventDayLabel.height
+
+ Label {
+ readonly property var options: { weekday: "long" }
+ text: Qt.locale().standaloneDayName(calendar.selectedDate.getDay(), Locale.LongFormat)
+ font.pointSize: 18
+ }
+ Label {
+ text: Qt.locale().standaloneMonthName(calendar.selectedDate.getMonth())
+ + calendar.selectedDate.toLocaleDateString(Qt.locale(), " yyyy")
+ font.pointSize: 12
+ }
+ }
+ }
+ }
+
+ Rectangle {
+ width: (parent.width > parent.height ? (parent.width - parent.spacing) * 0.4 : parent.width)
+ height: (parent.height > parent.width ? (parent.height - parent.spacing) * 0.4 : parent.height)
+ border.color: window.style.frameColor
+
+ ListView {
+ id: eventsListView
+ spacing: 4
+ clip: true
+ header: eventListHeader
+ anchors.fill: parent
+ anchors.margins: 10
+ model: eventModel.eventsForDate(calendar.selectedDate)
+
+ delegate: Rectangle {
+ width: eventsListView.width
+ height: eventItemColumn.height
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ Rectangle {
+ width: parent.width
+ height: 1
+ color: "#eee"
+ }
+
+ Column {
+ id: eventItemColumn
+ x: 4
+ y: 4
+ width: parent.width - 8
+ height: timeRow.height + nameLabel.height + 8
+
+ Label {
+ id: nameLabel
+ width: parent.width
+ wrapMode: Text.Wrap
+ text: modelData.name
+ }
+ Row {
+ id: timeRow
+ width: parent.width
+ Label {
+ text: modelData.start.toLocaleTimeString(calendar.locale, Locale.ShortFormat)
+ color: "#aaa"
+ }
+ Label {
+ text: "-" + new Date(modelData.end).toLocaleTimeString(calendar.locale, Locale.ShortFormat)
+ visible: modelData.start.getTime() !== modelData.end.getTime() && modelData.start.getDate() === modelData.end.getDate()
+ color: "#aaa"
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}