diff options
Diffstat (limited to 'examples/quick/calendar')
-rw-r--r-- | examples/quick/calendar/calendar.pro | 12 | ||||
-rw-r--r-- | examples/quick/calendar/calendar.qrc | 5 | ||||
-rw-r--r-- | examples/quick/calendar/main.cpp | 149 | ||||
-rw-r--r-- | examples/quick/calendar/main.qml | 237 |
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" + } + } + } + } + } + } + } +} |