diff options
202 files changed, 20567 insertions, 0 deletions
diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..1a045fa1 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +.tag export-subst +.gitignore export-ignore +.gitattributes export-ignore +.commit-template export-ignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..5529ed3d --- /dev/null +++ b/.gitignore @@ -0,0 +1,76 @@ +# This file is used to ignore files which are generated in the Qt build system +# ---------------------------------------------------------------------------- + +/examples/quick/calendar/calendar +/examples/quick/controls/drawer/drawer +/examples/quick/controls/mirroring/mirroring +/examples/quick/controls/styles/styles +/examples/quick/controls/tabs/tabs + +/tests/auto/controls/tst_controls +/tests/auto/extras/tst_extras +/tests/benchmark/creation/tst_creation + +/src/controls/doc/qtquickcontrols2.tags + +*.so +*.so.* +*.app +*.exe +*.dll +*.dylib +*.a +*.la +*.core +*.moc +*.o +*.obj +*.orig +*.swp +*.rej +*.so +*.pbxuser +*.mode1 +*.mode1v3 +*_pch.h.cpp +*_resource.rc +*~ +.#* +*.*# +.qmake.stash +.qmake.cache +.qmake.vars +*.prl +tags +.DS_Store +*.debug +Makefile* +*.Debug +*.Release +*.prl +*.pro.user +*.qmlproject.user* +moc_*.cpp +ui_*.h +qrc_*.cpp +callgrind.out.* +pcviewer.cfg +*.flc +.*.swp +*.ib_pdb_index +*.idb +*.ilk +*.pdb +*.sln +*.suo +*.vcproj +*vcproj.*.*.user +*.ncb +.pch +.rcc +.project +.cproject +.make.cache +android-build +app_process +qtc-debugging-helper diff --git a/.qmake.conf b/.qmake.conf new file mode 100644 index 00000000..3748d167 --- /dev/null +++ b/.qmake.conf @@ -0,0 +1,4 @@ +load(qt_build_config) +CONFIG += warning_clean + +MODULE_VERSION = 5.6.0 @@ -0,0 +1 @@ +$Format:%H$ diff --git a/LICENSE.LGPLv3 b/LICENSE.LGPLv3 new file mode 100644 index 00000000..fa5e3579 --- /dev/null +++ b/LICENSE.LGPLv3 @@ -0,0 +1,172 @@ + GNU LESSER GENERAL PUBLIC LICENSE + + The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd. + Contact: http://www.qt.io/licensing/ + + You may use, distribute and copy the Qt GUI Toolkit under the terms of + GNU Lesser General Public License version 3, which is displayed below. + +------------------------------------------------------------------------- + + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright © 2007 Free Software Foundation, Inc. <http://fsf.org/> +Everyone is permitted to copy and distribute verbatim copies of this +licensedocument, but changing it is not allowed. + +This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + +0. Additional Definitions. + + As used herein, “this License” refers to version 3 of the GNU Lesser +General Public License, and the “GNU GPL” refers to version 3 of the +GNU General Public License. + + “The Library” refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An “Application” is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A “Combined Work” is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the “Linked +Version”. + + The “Minimal Corresponding Source” for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The “Corresponding Application Code” for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + +1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + +2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort + to ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + +3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this + license document. + +4. Combined Works. + + You may convey a Combined Work under terms of your choice that, taken +together, effectively do not restrict modification of the portions of +the Library contained in the Combined Work and reverse engineering for +debugging such modifications, if you also do each of the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this + license document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of + this License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with + the Library. A suitable mechanism is one that (a) uses at run + time a copy of the Library already present on the user's + computer system, and (b) will operate properly with a modified + version of the Library that is interface-compatible with the + Linked Version. + + e) Provide Installation Information, but only if you would + otherwise be required to provide such information under section 6 + of the GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the Application + with a modified version of the Linked Version. (If you use option + 4d0, the Installation Information must accompany the Minimal + Corresponding Source and Corresponding Application Code. If you + use option 4d1, you must provide the Installation Information in + the manner specified by section 6 of the GNU GPL for conveying + Corresponding Source.) + +5. Combined Libraries. + + You may place library facilities that are a work based on the Library +side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities, conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of + it is a work based on the Library, and explaining where to find + the accompanying uncombined form of the same work. + +6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +as you received it specifies that a certain numbered version of the +GNU Lesser General Public License “or any later version” applies to +it, you have the option of following the terms and conditions either +of that published version or of any later version published by the +Free Software Foundation. If the Library as you received it does not +specify a version number of the GNU Lesser General Public License, +you may choose any version of the GNU Lesser General Public License +ever published by the Free Software Foundation. + +If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the Library. diff --git a/README.md b/README.md new file mode 100644 index 00000000..681f0028 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +qtquickcontrols2 +================ diff --git a/examples/examples.pro b/examples/examples.pro new file mode 100644 index 00000000..9d95812f --- /dev/null +++ b/examples/examples.pro @@ -0,0 +1,3 @@ +TEMPLATE = subdirs +SUBDIRS += \ + quick 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" + } + } + } + } + } + } + } +} diff --git a/examples/quick/controls/controls.pro b/examples/quick/controls/controls.pro new file mode 100644 index 00000000..b39b9aea --- /dev/null +++ b/examples/quick/controls/controls.pro @@ -0,0 +1,6 @@ +TEMPLATE = subdirs +SUBDIRS += \ + drawer \ + mirroring \ + styles \ + tabs diff --git a/examples/quick/controls/drawer/drawer.pro b/examples/quick/controls/drawer/drawer.pro new file mode 100644 index 00000000..ed788c7e --- /dev/null +++ b/examples/quick/controls/drawer/drawer.pro @@ -0,0 +1,12 @@ +TEMPLATE = app +TARGET = drawer +QT += quick + +SOURCES += \ + main.cpp + +OTHER_FILES += \ + main.qml + +RESOURCES += \ + drawer.qrc diff --git a/examples/quick/controls/drawer/drawer.qrc b/examples/quick/controls/drawer/drawer.qrc new file mode 100644 index 00000000..25cc5cbe --- /dev/null +++ b/examples/quick/controls/drawer/drawer.qrc @@ -0,0 +1,7 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + <file>images/arrow.png</file> + <file>images/qt-logo.png</file> + </qresource> +</RCC> diff --git a/examples/quick/controls/drawer/images/arrow.png b/examples/quick/controls/drawer/images/arrow.png Binary files differnew file mode 100644 index 00000000..4981e0de --- /dev/null +++ b/examples/quick/controls/drawer/images/arrow.png diff --git a/examples/quick/controls/drawer/images/qt-logo.png b/examples/quick/controls/drawer/images/qt-logo.png Binary files differnew file mode 100644 index 00000000..cf350dad --- /dev/null +++ b/examples/quick/controls/drawer/images/qt-logo.png diff --git a/examples/quick/controls/drawer/main.cpp b/examples/quick/controls/drawer/main.cpp new file mode 100644 index 00000000..f6f79ce1 --- /dev/null +++ b/examples/quick/controls/drawer/main.cpp @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** 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 <QGuiApplication> +#include <QQmlApplicationEngine> + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + QQmlApplicationEngine engine; + engine.load(QUrl("qrc:/main.qml")); + return app.exec(); +} diff --git a/examples/quick/controls/drawer/main.qml b/examples/quick/controls/drawer/main.qml new file mode 100644 index 00000000..e60f6067 --- /dev/null +++ b/examples/quick/controls/drawer/main.qml @@ -0,0 +1,154 @@ +/**************************************************************************** +** +** 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.2 +import QtQuick.Controls 2.0 +import QtQuick.Extras 2.0 + +ApplicationWindow { + id: window + width: 360 + height: 520 + visible: true + title: "Qt Quick Controls - Drawer Example" + + Rectangle { + id: content + anchors.fill: parent + anchors.margins: -1 + border.color: window.style.frameColor + + Image { + width: window.width / 2 + height: window.height / 2 + anchors.centerIn: parent + anchors.horizontalCenterOffset: window.width > window.height ? width / 2 : 0 + anchors.verticalCenterOffset: window.width < window.height ? -height / 4 : 0 + fillMode: Image.PreserveAspectFit + source: "qrc:/images/qt-logo.png" + } + + Image { + width: window.width / 2 + anchors.bottom: parent.bottom + anchors.bottomMargin: height / 2 + fillMode: Image.PreserveAspectFit + source: "qrc:/images/arrow.png" + } + + transform: Translate { + x: effect.current === uncover ? drawer.position * listview.width : + effect.current === push ? drawer.position * listview.width * 0.5 : 0 + } + + z: effect.current === uncover ? 2 : 0 + } + + Drawer { + id: drawer + anchors.fill: parent + + ListView { + id: listview + + width: window.width / 3 * 2 + height: window.height + + ExclusiveGroup { + id: effect + } + + model: VisualItemModel { + Label { + text: "Settings" + x: window.style.padding + width: parent.width - window.style.padding * 2 + lineHeight: 2.0 + color: window.style.accentColor + verticalAlignment: Text.AlignVCenter + } + Rectangle { width: parent.width; height: 1; color: window.style.frameColor } + Switch { + id: dim + text: "Dim" + checked: true + width: parent.width + layoutDirection: Qt.RightToLeft + enabled: effect.current != uncover + } + Rectangle { width: parent.width; height: 1; color: window.style.frameColor } + RadioButton { + id: overlay + text: "Overlay" + checked: true + width: parent.width + Exclusive.group: effect + layoutDirection: Qt.RightToLeft + } + RadioButton { + id: push + text: "Push" + width: parent.width + Exclusive.group: effect + layoutDirection: Qt.RightToLeft + } + RadioButton { + id: uncover + text: "Uncover" + width: parent.width + Exclusive.group: effect + layoutDirection: Qt.RightToLeft + } + Rectangle { width: parent.width; height: 1; color: window.style.frameColor } + } + Rectangle { + z: -1 + anchors.fill: parent + anchors.topMargin: -1 + anchors.bottomMargin: -1 + border.color: window.style.frameColor + } + + transform: Translate { + x: effect.current === uncover ? (1.0 - drawer.position) * listview.width : 0 + } + } + + background.visible: dim.checked + + onClicked: close() + } +} diff --git a/examples/quick/controls/mirroring/main.cpp b/examples/quick/controls/mirroring/main.cpp new file mode 100644 index 00000000..f6f79ce1 --- /dev/null +++ b/examples/quick/controls/mirroring/main.cpp @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** 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 <QGuiApplication> +#include <QQmlApplicationEngine> + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + QQmlApplicationEngine engine; + engine.load(QUrl("qrc:/main.qml")); + return app.exec(); +} diff --git a/examples/quick/controls/mirroring/main.qml b/examples/quick/controls/mirroring/main.qml new file mode 100644 index 00000000..535b9227 --- /dev/null +++ b/examples/quick/controls/mirroring/main.qml @@ -0,0 +1,233 @@ +/**************************************************************************** +** +** 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.Layouts 1.0 +import QtQuick.Controls 2.0 + +ApplicationWindow { + id: window + width: 360 + height: 520 + visible: true + title: "Qt Quick Controls - Mirroring Example" + + ListView { + id: listview + anchors.fill: parent + + LayoutMirroring.enabled: headerItem.mirror + LayoutMirroring.childrenInherit: true + + headerPositioning: ListView.PullBackHeader + header: Rectangle { + property alias mirror: mirrorToggle.checked + + z: 2 + width: parent.width + height: label.implicitHeight + 96 + + Label { + id: label + text: "Beyond the essentials." + color: window.style.accentColor + anchors.fill: parent + anchors.margins: 48 + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + wrapMode: Text.WordWrap + font.pointSize: 26 + } + + ToggleButton { + id: mirrorToggle + text: "Mirror" + anchors.right: parent.right + anchors.bottom: parent.bottom + layoutDirection: Qt.RightToLeft + LayoutMirroring.enabled: false + } + + Rectangle { + width: parent.width + height: 1 + anchors.bottom: parent.bottom + color: window.style.frameColor + } + } + + model: VisualItemModel { + + Item { width: 1; height: 24 } + + Flow { + id: flow + spacing: 12 + width: Math.min(window.width, window.height) - 24 + anchors.horizontalCenter: parent.horizontalCenter + + GroupBox { + title: "CheckBox" + readonly property real preferredWidth: (flow.width - 12) / 2 + width: window.width > window.height || implicitWidth > preferredWidth ? flow.width : preferredWidth + ColumnLayout { + width: parent.width + CheckBox { + width: parent.width + text: "E-mail" + checked: true + } + CheckBox { + width: parent.width + text: "Calendar" + checked: true + } + CheckBox { + width: parent.width + text: "Contacts" + } + } + } + + GroupBox { + title: "RadioButton" + readonly property real preferredWidth: (flow.width - 12) / 2 + width: window.width > window.height || implicitWidth > preferredWidth ? flow.width : preferredWidth + ColumnLayout { + width: parent.width + ExclusiveGroup { id: eg } + RadioButton { + width: parent.width + text: "Portrait" + Exclusive.group: eg + } + RadioButton { + width: parent.width + text: "Landscape" + Exclusive.group: eg + } + RadioButton { + width: parent.width + text: "Automatic" + checked: true + Exclusive.group: eg + } + } + } + + GroupBox { + title: "Button" + width: flow.width + Row { + width: parent.width + spacing: window.style.spacing + readonly property real availableWidth: (flow.width - 12) / 2 + readonly property real contentWidth: okButton.implicitWidth + cancelButton.implicitWidth + 12 + readonly property real buttonWidth: contentWidth > availableWidth ? (width / 2 - spacing) : (width / 2 - 2 * spacing) / 2 + Button { + id: okButton + text: "Ok" + width: parent.buttonWidth + } + Button { + id: cancelButton + text: "Cancel" + width: parent.buttonWidth + } + } + } + + GroupBox { + title: "Switch" + width: flow.width + Column { + width: parent.width + Switch { + width: parent.width + text: "Wifi" + checked: true + } + Switch { + width: parent.width + text: "Bluetooth" + } + } + } + + GroupBox { + title: "ProgressBar" + width: flow.width + Column { + width: parent.width + spacing: window.style.spacing + ProgressBar { + width: parent.width + indeterminate: true + } + ProgressBar { + width: parent.width + value: slider.position + } + } + } + + GroupBox { + title: "Slider" + width: flow.width + Column { + width: parent.width + spacing: window.style.spacing + Slider { + id: slider + value: 0.4 + width: parent.width + } + Slider { + width: parent.width + snapMode: AbstractSlider.SnapAlways + stepSize: 0.2 + value: 0.8 + } + } + } + } + + Item { width: 1; height: 12 } + } + + AbstractScrollIndicator.vertical: ScrollIndicator { anchors.right: parent.right } + } +} diff --git a/examples/quick/controls/mirroring/mirroring.pro b/examples/quick/controls/mirroring/mirroring.pro new file mode 100644 index 00000000..3630b04b --- /dev/null +++ b/examples/quick/controls/mirroring/mirroring.pro @@ -0,0 +1,12 @@ +TEMPLATE = app +TARGET = mirroring +QT += quick + +SOURCES += \ + main.cpp + +OTHER_FILES += \ + main.qml + +RESOURCES += \ + mirroring.qrc diff --git a/examples/quick/controls/mirroring/mirroring.qrc b/examples/quick/controls/mirroring/mirroring.qrc new file mode 100644 index 00000000..5f6483ac --- /dev/null +++ b/examples/quick/controls/mirroring/mirroring.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + </qresource> +</RCC> diff --git a/examples/quick/controls/styles/main.cpp b/examples/quick/controls/styles/main.cpp new file mode 100644 index 00000000..f6f79ce1 --- /dev/null +++ b/examples/quick/controls/styles/main.cpp @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** 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 <QGuiApplication> +#include <QQmlApplicationEngine> + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + QQmlApplicationEngine engine; + engine.load(QUrl("qrc:/main.qml")); + return app.exec(); +} diff --git a/examples/quick/controls/styles/main.qml b/examples/quick/controls/styles/main.qml new file mode 100644 index 00000000..e0f66b17 --- /dev/null +++ b/examples/quick/controls/styles/main.qml @@ -0,0 +1,191 @@ +/**************************************************************************** +** +** 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.2 +import QtQuick.Controls 2.0 + +ApplicationWindow { + id: window + width: 360 + height: 520 + visible: true + title: "Qt Quick Controls - Styles Example" + + header: ToolBar { + ToolButton { + label: Text { + text: "\u25C0" + color: enabled ? window.style.accentColor : window.style.frameColor + anchors.centerIn: parent + } + enabled: stackview.depth > 1 + onClicked: stackview.pop() + } + } + + StackView { + id: stackview + anchors.fill: parent + initialItem: pageComponent + } + + Component { + id: pageComponent + Control { + id: page + style: Style { + padding: 6 + roundness: roundedToggle.checked ? 3 : 0 + accentColor: Qt.hsla(colorSlider.position, 0.5, 0.5, 1.0) + backgroundColor: darkButton.checked ? "#444" : "#fff" + frameColor: darkButton.checked ? "#666" : "#ccc" + textColor: darkButton.checked ? "#eee" : "#111" + pressColor: darkButton.checked ? "#33ffffff" : "#33333333" + baseColor: darkButton.checked ? "#444" : "#eee" + } + background: Rectangle { + color: style.backgroundColor + } + Flickable { + anchors.fill: parent + contentHeight: column.height + 48 + + Column { + id: column + + x: (window.width - width) / 2 + y: 24 + width: window.width / 2 + spacing: 12 + + Label { + text: "Code less. Create more." + color: page.style.accentColor + width: parent.width + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + wrapMode: Text.WordWrap + font.pointSize: 26 + } + + Item { width: 1; height: 48 } + + Rectangle { + width: parent.width + height: 1 + color: page.style.frameColor + } + + Column { + spacing: 6 + width: parent.width + Label { + text: "Accent color" + color: page.style.textColor + } + Slider { + id: colorSlider + width: parent.width + value: 0.275 + //background: Rectangle { border.color: "red" } + } + } + + Rectangle { + width: parent.width + height: 1 + color: page.style.frameColor + } + + ExclusiveGroup { + id: styleGroup + } + + Column { + width: parent.width + spacing: 6 + RadioButton { + id: lightButton + text: "Light" + width: parent.width + checked: true + layoutDirection: Qt.RightToLeft + Exclusive.group: styleGroup + //background: Rectangle { border.color: "red" } + } + RadioButton { + id: darkButton + text: "Dark" + width: parent.width + layoutDirection: Qt.RightToLeft + Exclusive.group: styleGroup + //background: Rectangle { border.color: "red" } + } + } + + Rectangle { + width: parent.width + height: 1 + color: page.style.frameColor + } + + ToggleButton { + id: roundedToggle + width: parent.width + text: "Rounded corners" + layoutDirection: Qt.RightToLeft + checked: true + //background: Rectangle { border.color: "red" } + } + + Rectangle { + width: parent.width + height: 1 + color: page.style.frameColor + } + + Button { + text: "Push" + anchors.right: parent.right + onClicked: stackview.push(pageComponent) + } + } + + AbstractScrollIndicator.vertical: ScrollIndicator { } + } + } + } +} diff --git a/examples/quick/controls/styles/styles.pro b/examples/quick/controls/styles/styles.pro new file mode 100644 index 00000000..f8fdec46 --- /dev/null +++ b/examples/quick/controls/styles/styles.pro @@ -0,0 +1,12 @@ +TEMPLATE = app +TARGET = styles +QT += quick + +SOURCES += \ + main.cpp + +OTHER_FILES += \ + main.qml + +RESOURCES += \ + styles.qrc diff --git a/examples/quick/controls/styles/styles.qrc b/examples/quick/controls/styles/styles.qrc new file mode 100644 index 00000000..5f6483ac --- /dev/null +++ b/examples/quick/controls/styles/styles.qrc @@ -0,0 +1,5 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + </qresource> +</RCC> diff --git a/examples/quick/controls/tabs/images/qt-logo.png b/examples/quick/controls/tabs/images/qt-logo.png Binary files differnew file mode 100644 index 00000000..cf350dad --- /dev/null +++ b/examples/quick/controls/tabs/images/qt-logo.png diff --git a/examples/quick/controls/tabs/main.cpp b/examples/quick/controls/tabs/main.cpp new file mode 100644 index 00000000..f6f79ce1 --- /dev/null +++ b/examples/quick/controls/tabs/main.cpp @@ -0,0 +1,46 @@ +/**************************************************************************** +** +** 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 <QGuiApplication> +#include <QQmlApplicationEngine> + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + QQmlApplicationEngine engine; + engine.load(QUrl("qrc:/main.qml")); + return app.exec(); +} diff --git a/examples/quick/controls/tabs/main.qml b/examples/quick/controls/tabs/main.qml new file mode 100644 index 00000000..96c7a6da --- /dev/null +++ b/examples/quick/controls/tabs/main.qml @@ -0,0 +1,272 @@ +/**************************************************************************** +** +** 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.2 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 2.0 +import QtQuick.XmlListModel 2.0 + +ApplicationWindow { + id: window + width: 360 + height: 520 + visible: true + title: "Qt Quick Controls - Tabs Example" + + TabView { + id: tabView + + spacing: 1 + anchors.fill: parent + background: Rectangle { color: style.frameColor } + + Rectangle { + Tab.title: "Home" + anchors.fill: parent + + Image { + id: logo + width: window.width / 2 + height: window.height / 2 + anchors.centerIn: parent + fillMode: Image.PreserveAspectFit + source: "qrc:/images/qt-logo.png" + } + + Label { + text: "Things just got better" + color: window.style.accentColor + anchors.margins: 40 + anchors.top: logo.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + wrapMode: Text.WordWrap + font.pointSize: 26 + } + } + + Rectangle { + Tab.title: "Discover" + anchors.fill: parent + + ListView { + anchors.fill: parent + anchors.topMargin: -1 + model: XmlListModel { + id: feedModel + query: "/rss/channel/item" + source: "http://blog.qt.io/feed/" + namespaceDeclarations: "declare namespace dc='http://purl.org/dc/elements/1.1/';" + XmlRole { name: "title"; query: "title/string()" } + XmlRole { name: "link"; query: "link/string()" } + XmlRole { name: "pubDate"; query: "pubDate/string()" } + XmlRole { name: "creator"; query: "dc:creator/string()" } + XmlRole { name: "description"; query: "description/string()" } + } + + delegate: Item { + width: parent.width + height: feedItem.height + Column { + id: feedItem + width: parent.width + spacing: window.style.spacing + Rectangle { + width: parent.width + height: 1 + color: window.style.frameColor + visible: index == 0 + } + Item { width: 1; height: window.style.spacing } + Label { + text: model.title + x: window.style.padding + width: parent.width - 2 * window.style.padding + elide: Text.ElideRight + color: window.style.accentColor + font.pointSize: 20 + lineHeight: 0.75 + } + Label { + text: model.description + textFormat: Qt.RichText + x: window.style.padding + width: parent.width - 2 * window.style.padding + wrapMode: Text.WordWrap + } + RowLayout { + x: window.style.padding + width: parent.width - 2 * window.style.padding + spacing: window.style.spacing + Label { + text: model.creator + height: parent.height + verticalAlignment: Text.AlignVCenter + color: window.style.focusColor + font.pointSize: 8 + } + Label { + text: model.pubDate + height: parent.height + verticalAlignment: Text.AlignVCenter + opacity: window.style.disabledOpacity + font.pointSize: 8 + } + Item { Layout.fillWidth: true } + Button { + text: "Read more..." + onClicked: Qt.openUrlExternally(model.link) + } + } + Rectangle { + width: parent.width + height: 1 + color: window.style.frameColor + } + } + } + + AbstractScrollIndicator.vertical: ScrollIndicator { } + } + + BusyIndicator { + anchors.centerIn: parent + running: feedModel.status === XmlListModel.Loading + } + } + + Rectangle { + Tab.title: "Activity" + anchors.fill: parent + + ListView { + anchors.fill: parent + anchors.topMargin: -1 + model: XmlListModel { + id: commentModel + query: "/rss/channel/item" + source: "http://blog.qt.io/comments/feed/" + namespaceDeclarations: "declare namespace dc='http://purl.org/dc/elements/1.1/';" + XmlRole { name: "title"; query: "title/string()" } + XmlRole { name: "link"; query: "link/string()" } + XmlRole { name: "pubDate"; query: "pubDate/string()" } + XmlRole { name: "creator"; query: "dc:creator/string()" } + XmlRole { name: "description"; query: "description/string()" } + } + + delegate: Rectangle { + width: parent.width + height: commentItem.height + Column { + id: commentItem + width: parent.width + spacing: window.style.spacing + Rectangle { + width: parent.width + height: 1 + color: window.style.frameColor + visible: index == 0 + } + Item { width: 1; height: window.style.spacing } + Label { + text: model.title + x: window.style.padding + width: parent.width - 2 * window.style.padding + elide: Text.ElideRight + color: window.style.accentColor + font.pointSize: 14 + lineHeight: 0.75 + } + Item { width: 1; height: window.style.spacing } + Label { + text: model.description + textFormat: Qt.RichText + x: window.style.padding + width: parent.width - 2 * window.style.padding + wrapMode: Text.WordWrap + } + RowLayout { + x: window.style.padding + width: parent.width - 2 * window.style.padding + spacing: window.style.spacing + Label { + text: model.creator + height: parent.height + verticalAlignment: Text.AlignVCenter + color: window.style.focusColor + font.pointSize: 8 + } + Label { + text: model.pubDate + height: parent.height + verticalAlignment: Text.AlignVCenter + opacity: window.style.disabledOpacity + font.pointSize: 8 + } + Item { Layout.fillWidth: true } + Button { + text: "Read more..." + onClicked: Qt.openUrlExternally(model.link) + } + } + Rectangle { + width: parent.width + height: 1 + color: window.style.frameColor + } + } + } + + AbstractScrollIndicator.vertical: ScrollIndicator { } + } + + BusyIndicator { + anchors.centerIn: parent + running: feedModel.status === XmlListModel.Loading + } + } + } + + PageIndicator { + count: tabView.count + currentIndex: tabView.currentIndex + anchors.bottom: parent.bottom + anchors.horizontalCenter: parent.horizontalCenter + } +} diff --git a/examples/quick/controls/tabs/tabs.pro b/examples/quick/controls/tabs/tabs.pro new file mode 100644 index 00000000..2d9c3e0e --- /dev/null +++ b/examples/quick/controls/tabs/tabs.pro @@ -0,0 +1,12 @@ +TEMPLATE = app +TARGET = tabs +QT += quick + +SOURCES += \ + main.cpp + +OTHER_FILES += \ + main.qml + +RESOURCES += \ + tabs.qrc diff --git a/examples/quick/controls/tabs/tabs.qrc b/examples/quick/controls/tabs/tabs.qrc new file mode 100644 index 00000000..b48259b1 --- /dev/null +++ b/examples/quick/controls/tabs/tabs.qrc @@ -0,0 +1,6 @@ +<RCC> + <qresource prefix="/"> + <file>main.qml</file> + <file>images/qt-logo.png</file> + </qresource> +</RCC> diff --git a/examples/quick/quick.pro b/examples/quick/quick.pro new file mode 100644 index 00000000..80f94e86 --- /dev/null +++ b/examples/quick/quick.pro @@ -0,0 +1,4 @@ +TEMPLATE = subdirs +SUBDIRS += \ + calendar \ + controls diff --git a/qtquickcontrols2.pro b/qtquickcontrols2.pro new file mode 100644 index 00000000..ce6617ea --- /dev/null +++ b/qtquickcontrols2.pro @@ -0,0 +1,2 @@ +requires(qtHaveModule(quick)) +load(qt_parts) diff --git a/src/calendar/calendar.pri b/src/calendar/calendar.pri new file mode 100644 index 00000000..67267388 --- /dev/null +++ b/src/calendar/calendar.pri @@ -0,0 +1,19 @@ +INCLUDEPATH += $$PWD + +HEADERS += \ + $$PWD/qquickabstractcalendarview_p.h \ + $$PWD/qquickabstractdayofweekrow_p.h \ + $$PWD/qquickabstractweeknumbercolumn_p.h \ + $$PWD/qquickcalendarmodel_p.h \ + $$PWD/qquickdayofweekmodel_p.h \ + $$PWD/qquickmonthmodel_p.h \ + $$PWD/qquickweeknumbermodel_p.h + +SOURCES += \ + $$PWD/qquickabstractcalendarview.cpp \ + $$PWD/qquickabstractdayofweekrow.cpp \ + $$PWD/qquickabstractweeknumbercolumn.cpp \ + $$PWD/qquickcalendarmodel.cpp \ + $$PWD/qquickdayofweekmodel.cpp \ + $$PWD/qquickmonthmodel.cpp \ + $$PWD/qquickweeknumbermodel.cpp diff --git a/src/calendar/calendar.pro b/src/calendar/calendar.pro new file mode 100644 index 00000000..e1f3af78 --- /dev/null +++ b/src/calendar/calendar.pro @@ -0,0 +1,14 @@ +TARGET = QtQuickCalendar +MODULE = quickcalendar +CONFIG += internal_module + +QT += quick +QT += core-private gui-private qml-private quick-private quickcontrols-private + +DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII + +HEADERS += \ + $$PWD/qtquickcalendarglobal_p.h + +include(calendar.pri) +load(qt_module) diff --git a/src/calendar/qquickabstractcalendarview.cpp b/src/calendar/qquickabstractcalendarview.cpp new file mode 100644 index 00000000..c076cc0c --- /dev/null +++ b/src/calendar/qquickabstractcalendarview.cpp @@ -0,0 +1,255 @@ +/**************************************************************************** +** +** 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 "qquickabstractcalendarview_p.h" +#include "qquickmonthmodel_p.h" + +#include <QtGui/qstylehints.h> +#include <QtGui/qguiapplication.h> +#include <QtQuickControls/private/qquickabstractcontainer_p_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractCalendarViewPrivate : public QQuickAbstractContainerPrivate +{ + Q_DECLARE_PUBLIC(QQuickAbstractCalendarView) + +public: + QQuickAbstractCalendarViewPrivate() : pressTimer(0), pressedItem(Q_NULLPTR), model(Q_NULLPTR) { } + + 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; +}; + +QQuickItem *QQuickAbstractCalendarViewPrivate::cellAt(const QPoint &pos) const +{ + Q_Q(const QQuickAbstractCalendarView); + if (contentItem) { + QPointF mapped = q->mapToItem(contentItem, pos); + return contentItem->childAt(mapped.x(), mapped.y()); + } + return Q_NULLPTR; +} + +QDate QQuickAbstractCalendarViewPrivate::dateOf(QQuickItem *cell) const +{ + if (contentItem) + return model->dateAt(contentItem->childItems().indexOf(cell)); + return QDate(); +} + +void QQuickAbstractCalendarViewPrivate::updatePress(const QPoint &pos) +{ + Q_Q(QQuickAbstractCalendarView); + clearPress(false); + pressedItem = cellAt(pos); + setContextProperty(pressedItem, QStringLiteral("pressed"), true); + pressedDate = dateOf(pressedItem); + if (pressedDate.isValid()) + emit q->pressed(pressedDate); +} + +void QQuickAbstractCalendarViewPrivate::clearPress(bool clicked) +{ + Q_Q(QQuickAbstractCalendarView); + setContextProperty(pressedItem, QStringLiteral("pressed"), false); + if (pressedDate.isValid()) { + emit q->released(pressedDate); + if (clicked) + emit q->clicked(pressedDate); + } + pressedDate = QDate(); + pressedItem = Q_NULLPTR; +} + +void QQuickAbstractCalendarViewPrivate::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); + } +} + +QQuickAbstractCalendarView::QQuickAbstractCalendarView(QQuickItem *parent) : + QQuickAbstractContainer(*(new QQuickAbstractCalendarViewPrivate), parent) +{ + Q_D(QQuickAbstractCalendarView); + setFlag(ItemIsFocusScope); + setActiveFocusOnTab(true); + setAcceptedMouseButtons(Qt::LeftButton); + + d->model = new QQuickMonthModel(this); + d->source = QVariant::fromValue(d->model); + connect(d->model, &QQuickMonthModel::monthChanged, this, &QQuickAbstractCalendarView::monthChanged); + connect(d->model, &QQuickMonthModel::yearChanged, this, &QQuickAbstractCalendarView::yearChanged); + connect(d->model, &QQuickMonthModel::localeChanged, this, &QQuickAbstractCalendarView::localeChanged); + connect(d->model, &QQuickMonthModel::titleChanged, this, &QQuickAbstractCalendarView::titleChanged); +} + +int QQuickAbstractCalendarView::month() const +{ + Q_D(const QQuickAbstractCalendarView); + return d->model->month(); +} + +void QQuickAbstractCalendarView::setMonth(int month) +{ + Q_D(QQuickAbstractCalendarView); + d->model->setMonth(month); +} + +int QQuickAbstractCalendarView::year() const +{ + Q_D(const QQuickAbstractCalendarView); + return d->model->year(); +} + +void QQuickAbstractCalendarView::setYear(int year) +{ + Q_D(QQuickAbstractCalendarView); + d->model->setYear(year); +} + +QLocale QQuickAbstractCalendarView::locale() const +{ + Q_D(const QQuickAbstractCalendarView); + return d->model->locale(); +} + +void QQuickAbstractCalendarView::setLocale(const QLocale &locale) +{ + Q_D(QQuickAbstractCalendarView); + d->model->setLocale(locale); +} + +QVariant QQuickAbstractCalendarView::source() const +{ + Q_D(const QQuickAbstractCalendarView); + return d->source; +} + +void QQuickAbstractCalendarView::setSource(const QVariant &source) +{ + Q_D(QQuickAbstractCalendarView); + if (d->source != source) { + d->source = source; + emit sourceChanged(); + } +} + +QString QQuickAbstractCalendarView::title() const +{ + Q_D(const QQuickAbstractCalendarView); + if (d->title.isNull()) + return d->model->title(); + return d->title; +} + +void QQuickAbstractCalendarView::setTitle(const QString &title) +{ + Q_D(QQuickAbstractCalendarView); + if (d->title != title) { + d->title = title; + emit titleChanged(); + } +} + +void QQuickAbstractCalendarView::componentComplete() +{ + Q_D(QQuickAbstractCalendarView); + QQuickAbstractContainer::componentComplete(); + if (d->contentItem) { + foreach (QQuickItem *child, d->contentItem->childItems()) { + if (!child->inherits("QQuickRepeater")) + d->setContextProperty(child, QStringLiteral("pressed"), false); + } + } +} + +void QQuickAbstractCalendarView::mousePressEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractCalendarView); + d->updatePress(event->pos()); + if (d->pressedDate.isValid()) + d->pressTimer = startTimer(qGuiApp->styleHints()->mousePressAndHoldInterval()); + event->accept(); +} + +void QQuickAbstractCalendarView::mouseMoveEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractCalendarView); + d->updatePress(event->pos()); + event->accept(); +} + +void QQuickAbstractCalendarView::mouseReleaseEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractCalendarView); + d->clearPress(true); + event->accept(); +} + +void QQuickAbstractCalendarView::mouseUngrabEvent() +{ + Q_D(QQuickAbstractCalendarView); + d->clearPress(false); +} + +void QQuickAbstractCalendarView::timerEvent(QTimerEvent *event) +{ + Q_D(QQuickAbstractCalendarView); + if (event->timerId() == d->pressTimer) { + if (d->pressedDate.isValid()) + emit pressAndHold(d->pressedDate); + killTimer(d->pressTimer); + } +} + +QT_END_NAMESPACE diff --git a/src/calendar/qquickabstractcalendarview_p.h b/src/calendar/qquickabstractcalendarview_p.h new file mode 100644 index 00000000..ac55b234 --- /dev/null +++ b/src/calendar/qquickabstractcalendarview_p.h @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** 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 QQUICKABSTRACTCALENDARVIEW_P_H +#define QQUICKABSTRACTCALENDARVIEW_P_H + +#include <QtQuickCalendar/private/qtquickcalendarglobal_p.h> +#include <QtQuickControls/private/qquickabstractcontainer_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractCalendarViewPrivate; + +class Q_QUICKCALENDAR_EXPORT QQuickAbstractCalendarView : public QQuickAbstractContainer +{ + 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) + +public: + explicit QQuickAbstractCalendarView(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); + +Q_SIGNALS: + void monthChanged(); + void yearChanged(); + void localeChanged(); + void sourceChanged(); + void titleChanged(); + + 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 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(QQuickAbstractCalendarView) + Q_DECLARE_PRIVATE(QQuickAbstractCalendarView) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTCALENDARVIEW_P_H diff --git a/src/calendar/qquickabstractdayofweekrow.cpp b/src/calendar/qquickabstractdayofweekrow.cpp new file mode 100644 index 00000000..0d2830de --- /dev/null +++ b/src/calendar/qquickabstractdayofweekrow.cpp @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** 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 "qquickabstractdayofweekrow_p.h" +#include "qquickdayofweekmodel_p.h" + +#include <QtQuickControls/private/qquickabstractcontainer_p_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractDayOfWeekRowPrivate : public QQuickAbstractContainerPrivate +{ +public: + QVariant source; + QQuickDayOfWeekModel *model; +}; + +QQuickAbstractDayOfWeekRow::QQuickAbstractDayOfWeekRow(QQuickItem *parent) : + QQuickAbstractContainer(*(new QQuickAbstractDayOfWeekRowPrivate), parent) +{ + Q_D(QQuickAbstractDayOfWeekRow); + d->model = new QQuickDayOfWeekModel(this); + d->source = QVariant::fromValue(d->model); + connect(d->model, &QQuickDayOfWeekModel::localeChanged, this, &QQuickAbstractDayOfWeekRow::localeChanged); +} + +QLocale QQuickAbstractDayOfWeekRow::locale() const +{ + Q_D(const QQuickAbstractDayOfWeekRow); + return d->model->locale(); +} + +void QQuickAbstractDayOfWeekRow::setLocale(const QLocale &locale) +{ + Q_D(QQuickAbstractDayOfWeekRow); + d->model->setLocale(locale); +} + +QVariant QQuickAbstractDayOfWeekRow::source() const +{ + Q_D(const QQuickAbstractDayOfWeekRow); + return d->source; +} + +void QQuickAbstractDayOfWeekRow::setSource(const QVariant &source) +{ + Q_D(QQuickAbstractDayOfWeekRow); + if (d->source != source) { + d->source = source; + emit sourceChanged(); + } +} + +QT_END_NAMESPACE diff --git a/src/calendar/qquickabstractdayofweekrow_p.h b/src/calendar/qquickabstractdayofweekrow_p.h new file mode 100644 index 00000000..68dbe6fa --- /dev/null +++ b/src/calendar/qquickabstractdayofweekrow_p.h @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** 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 QQUICKABSTRACTDAYOFWEEKROW_P_H +#define QQUICKABSTRACTDAYOFWEEKROW_P_H + +#include <QtQuickCalendar/private/qtquickcalendarglobal_p.h> +#include <QtQuickControls/private/qquickabstractcontainer_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractDayOfWeekRowPrivate; + +class Q_QUICKCALENDAR_EXPORT QQuickAbstractDayOfWeekRow : public QQuickAbstractContainer +{ + Q_OBJECT + Q_PROPERTY(QLocale locale READ locale WRITE setLocale NOTIFY localeChanged FINAL) + Q_PROPERTY(QVariant source READ source WRITE setSource NOTIFY sourceChanged FINAL) + +public: + explicit QQuickAbstractDayOfWeekRow(QQuickItem *parent = Q_NULLPTR); + + QLocale locale() const; + void setLocale(const QLocale &locale); + + QVariant source() const; + void setSource(const QVariant &source); + +Q_SIGNALS: + void localeChanged(); + void sourceChanged(); + +private: + Q_DISABLE_COPY(QQuickAbstractDayOfWeekRow) + Q_DECLARE_PRIVATE(QQuickAbstractDayOfWeekRow) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTDAYOFWEEKROW_P_H diff --git a/src/calendar/qquickabstractweeknumbercolumn.cpp b/src/calendar/qquickabstractweeknumbercolumn.cpp new file mode 100644 index 00000000..9357c0cf --- /dev/null +++ b/src/calendar/qquickabstractweeknumbercolumn.cpp @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** 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 "qquickabstractweeknumbercolumn_p.h" +#include "qquickweeknumbermodel_p.h" + +#include <QtQuickControls/private/qquickabstractcontainer_p_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractWeekNumberColumnPrivate : public QQuickAbstractContainerPrivate +{ +public: + QVariant source; + QQuickWeekNumberModel *model; +}; + +QQuickAbstractWeekNumberColumn::QQuickAbstractWeekNumberColumn(QQuickItem *parent) : + QQuickAbstractContainer(*(new QQuickAbstractWeekNumberColumnPrivate), parent) +{ + Q_D(QQuickAbstractWeekNumberColumn); + d->model = new QQuickWeekNumberModel(this); + d->source = QVariant::fromValue(d->model); + connect(d->model, &QQuickWeekNumberModel::monthChanged, this, &QQuickAbstractWeekNumberColumn::monthChanged); + connect(d->model, &QQuickWeekNumberModel::yearChanged, this, &QQuickAbstractWeekNumberColumn::yearChanged); + connect(d->model, &QQuickWeekNumberModel::localeChanged, this, &QQuickAbstractWeekNumberColumn::localeChanged); +} + +int QQuickAbstractWeekNumberColumn::month() const +{ + Q_D(const QQuickAbstractWeekNumberColumn); + return d->model->month(); +} + +void QQuickAbstractWeekNumberColumn::setMonth(int month) +{ + Q_D(QQuickAbstractWeekNumberColumn); + d->model->setMonth(month); +} + +int QQuickAbstractWeekNumberColumn::year() const +{ + Q_D(const QQuickAbstractWeekNumberColumn); + return d->model->year(); +} + +void QQuickAbstractWeekNumberColumn::setYear(int year) +{ + Q_D(QQuickAbstractWeekNumberColumn); + d->model->setYear(year); +} + +QLocale QQuickAbstractWeekNumberColumn::locale() const +{ + Q_D(const QQuickAbstractWeekNumberColumn); + return d->model->locale(); +} + +void QQuickAbstractWeekNumberColumn::setLocale(const QLocale &locale) +{ + Q_D(QQuickAbstractWeekNumberColumn); + d->model->setLocale(locale); +} + +QVariant QQuickAbstractWeekNumberColumn::source() const +{ + Q_D(const QQuickAbstractWeekNumberColumn); + return d->source; +} + +void QQuickAbstractWeekNumberColumn::setSource(const QVariant &source) +{ + Q_D(QQuickAbstractWeekNumberColumn); + if (d->source != source) { + d->source = source; + emit sourceChanged(); + } +} + +QT_END_NAMESPACE diff --git a/src/calendar/qquickabstractweeknumbercolumn_p.h b/src/calendar/qquickabstractweeknumbercolumn_p.h new file mode 100644 index 00000000..ab5ec096 --- /dev/null +++ b/src/calendar/qquickabstractweeknumbercolumn_p.h @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** 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 QQUICKABSTRACTWEEKNUMBERCOLUMN_P_H +#define QQUICKABSTRACTWEEKNUMBERCOLUMN_P_H + +#include <QtQuickCalendar/private/qtquickcalendarglobal_p.h> +#include <QtQuickControls/private/qquickabstractcontainer_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractWeekNumberColumnPrivate; + +class Q_QUICKCALENDAR_EXPORT QQuickAbstractWeekNumberColumn : public QQuickAbstractContainer +{ + 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) + +public: + explicit QQuickAbstractWeekNumberColumn(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); + +Q_SIGNALS: + void monthChanged(); + void yearChanged(); + void localeChanged(); + void sourceChanged(); + +private: + Q_DISABLE_COPY(QQuickAbstractWeekNumberColumn) + Q_DECLARE_PRIVATE(QQuickAbstractWeekNumberColumn) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTWEEKNUMBERCOLUMN_P_H diff --git a/src/calendar/qquickcalendarmodel.cpp b/src/calendar/qquickcalendarmodel.cpp new file mode 100644 index 00000000..c1386ed0 --- /dev/null +++ b/src/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/calendar/qquickcalendarmodel_p.h b/src/calendar/qquickcalendarmodel_p.h new file mode 100644 index 00000000..e5a650f8 --- /dev/null +++ b/src/calendar/qquickcalendarmodel_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 QQUICKCALENDARMODEL_P_H +#define QQUICKCALENDARMODEL_P_H + +#include <QtCore/qabstractitemmodel.h> +#include <QtCore/qdatetime.h> +#include <QtQml/qqmlparserstatus.h> +#include <QtQuickCalendar/private/qtquickcalendarglobal_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickCalendarModelPrivate; + +class Q_QUICKCALENDAR_EXPORT 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) +}; + +QT_END_NAMESPACE + +#endif // QQUICKCALENDARMODEL_P_H diff --git a/src/calendar/qquickdayofweekmodel.cpp b/src/calendar/qquickdayofweekmodel.cpp new file mode 100644 index 00000000..7f75f784 --- /dev/null +++ b/src/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/calendar/qquickdayofweekmodel_p.h b/src/calendar/qquickdayofweekmodel_p.h new file mode 100644 index 00000000..776444a3 --- /dev/null +++ b/src/calendar/qquickdayofweekmodel_p.h @@ -0,0 +1,83 @@ +/**************************************************************************** +** +** 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 + +#include <QtCore/qabstractitemmodel.h> +#include <QtCore/qlocale.h> +#include <QtQuickCalendar/private/qtquickcalendarglobal_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickDayOfWeekModelPrivate; + +class Q_QUICKCALENDAR_EXPORT 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) +}; + +QT_END_NAMESPACE + +#endif // QQUICKDAYOFWEEKMODEL_P_H diff --git a/src/calendar/qquickmonthmodel.cpp b/src/calendar/qquickmonthmodel.cpp new file mode 100644 index 00000000..61185d57 --- /dev/null +++ b/src/calendar/qquickmonthmodel.cpp @@ -0,0 +1,224 @@ +/**************************************************************************** +** +** 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) + { + QDate date = QDate::currentDate(); + month = date.month(); + year = date.year(); + } + + bool populate(int month, int year, const QLocale &locale, bool force = false); + + int month; + int year; + QString title; + QLocale locale; + QVector<QDate> dates; +}; + +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); + + 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 == QDate::currentDate(); + 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/calendar/qquickmonthmodel_p.h b/src/calendar/qquickmonthmodel_p.h new file mode 100644 index 00000000..22720cc8 --- /dev/null +++ b/src/calendar/qquickmonthmodel_p.h @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** 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 + +#include <QtCore/qabstractitemmodel.h> +#include <QtCore/qdatetime.h> +#include <QtCore/qlocale.h> +#include <QtQuickCalendar/private/qtquickcalendarglobal_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickMonthModelPrivate; + +class Q_QUICKCALENDAR_EXPORT 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) +}; + +QT_END_NAMESPACE + +#endif // QQUICKMONTHMODEL_P_H diff --git a/src/calendar/qquickweeknumbermodel.cpp b/src/calendar/qquickweeknumbermodel.cpp new file mode 100644 index 00000000..34d66202 --- /dev/null +++ b/src/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/calendar/qquickweeknumbermodel_p.h b/src/calendar/qquickweeknumbermodel_p.h new file mode 100644 index 00000000..d64da352 --- /dev/null +++ b/src/calendar/qquickweeknumbermodel_p.h @@ -0,0 +1,91 @@ +/**************************************************************************** +** +** 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 + +#include <QtCore/qabstractitemmodel.h> +#include <QtCore/qlocale.h> +#include <QtQuickCalendar/private/qtquickcalendarglobal_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickWeekNumberModelPrivate; + +class Q_QUICKCALENDAR_EXPORT 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) +}; + +QT_END_NAMESPACE + +#endif // QQUICKWEEKNUMBERMODEL_P_H diff --git a/src/calendar/qtquickcalendarglobal_p.h b/src/calendar/qtquickcalendarglobal_p.h new file mode 100644 index 00000000..8f04361e --- /dev/null +++ b/src/calendar/qtquickcalendarglobal_p.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** 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 QTQUICKCALENDARGLOBAL_P_H +#define QTQUICKCALENDARGLOBAL_P_H + +#include <QtCore/qglobal.h> + +QT_BEGIN_NAMESPACE + +#ifndef QT_STATIC +# if defined(QT_BUILD_QUICKCALENDAR_LIB) +# define Q_QUICKCALENDAR_EXPORT Q_DECL_EXPORT +# else +# define Q_QUICKCALENDAR_EXPORT Q_DECL_IMPORT +# endif +#else +# define Q_QUICKCALENDAR_EXPORT +#endif + +QT_END_NAMESPACE + +#endif // QTQUICKCALENDARGLOBAL_P_H diff --git a/src/controls/controls.pri b/src/controls/controls.pri new file mode 100644 index 00000000..af2b7b8c --- /dev/null +++ b/src/controls/controls.pri @@ -0,0 +1,64 @@ +INCLUDEPATH += $$PWD + +HEADERS += \ + $$PWD/qquickabstractapplicationwindow_p.h \ + $$PWD/qquickabstractbusyindicator_p.h \ + $$PWD/qquickabstractbutton_p.h \ + $$PWD/qquickabstractbutton_p_p.h \ + $$PWD/qquickabstractcheckable_p.h \ + $$PWD/qquickabstractcheckable_p_p.h \ + $$PWD/qquickabstractcheckbox_p.h \ + $$PWD/qquickabstractcontainer_p.h \ + $$PWD/qquickabstractcontainer_p_p.h \ + $$PWD/qquickabstractframe_p.h \ + $$PWD/qquickabstractgroupbox_p.h \ + $$PWD/qquickabstractpageindicator_p.h \ + $$PWD/qquickabstractprogressbar_p.h \ + $$PWD/qquickabstractradiobutton_p.h \ + $$PWD/qquickabstractscrollbar_p.h \ + $$PWD/qquickabstractscrollindicator_p.h \ + $$PWD/qquickabstractslider_p.h \ + $$PWD/qquickabstractspinbox_p.h \ + $$PWD/qquickabstractstackview_p.h \ + $$PWD/qquickabstractswitch_p.h \ + $$PWD/qquickabstracttabbar_p.h \ + $$PWD/qquickabstracttabbutton_p.h \ + $$PWD/qquickabstracttabview_p.h \ + $$PWD/qquickabstracttextarea_p.h \ + $$PWD/qquickabstracttextfield_p.h \ + $$PWD/qquickabstracttogglebutton_p.h \ + $$PWD/qquickabstracttoolbar_p.h \ + $$PWD/qquickcontrol_p.h \ + $$PWD/qquickcontrol_p_p.h \ + $$PWD/qquickexclusivegroup_p.h \ + $$PWD/qquickpadding_p.h \ + $$PWD/qquickstyle_p.h + +SOURCES += \ + $$PWD/qquickabstractapplicationwindow.cpp \ + $$PWD/qquickabstractbusyindicator.cpp \ + $$PWD/qquickabstractbutton.cpp \ + $$PWD/qquickabstractcheckable.cpp \ + $$PWD/qquickabstractcheckbox.cpp \ + $$PWD/qquickabstractcontainer.cpp \ + $$PWD/qquickabstractframe.cpp \ + $$PWD/qquickabstractgroupbox.cpp \ + $$PWD/qquickabstractpageindicator.cpp \ + $$PWD/qquickabstractprogressbar.cpp \ + $$PWD/qquickabstractradiobutton.cpp \ + $$PWD/qquickabstractscrollbar.cpp \ + $$PWD/qquickabstractscrollindicator.cpp \ + $$PWD/qquickabstractslider.cpp \ + $$PWD/qquickabstractspinbox.cpp \ + $$PWD/qquickabstractstackview.cpp \ + $$PWD/qquickabstractswitch.cpp \ + $$PWD/qquickabstracttabbar.cpp \ + $$PWD/qquickabstracttabbutton.cpp \ + $$PWD/qquickabstracttabview.cpp \ + $$PWD/qquickabstracttextarea.cpp \ + $$PWD/qquickabstracttextfield.cpp \ + $$PWD/qquickabstracttogglebutton.cpp \ + $$PWD/qquickabstracttoolbar.cpp \ + $$PWD/qquickcontrol.cpp \ + $$PWD/qquickexclusivegroup.cpp \ + $$PWD/qquickstyle.cpp diff --git a/src/controls/controls.pro b/src/controls/controls.pro new file mode 100644 index 00000000..c4a1ff87 --- /dev/null +++ b/src/controls/controls.pro @@ -0,0 +1,22 @@ +TARGET = QtQuickControls +MODULE = quickcontrols +CONFIG += internal_module + +QT += quick +QT += core-private gui-private qml-private quick-private + +DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII + +QMAKE_DOCS = $$PWD/doc/qtquickcontrols2.qdocconf + +HEADERS += \ + $$PWD/qtquickcontrolsglobal_p.h + +OTHER_FILES += \ + $$PWD/style.json + +RESOURCES += \ + $$PWD/controls.qrc + +include(controls.pri) +load(qt_module) diff --git a/src/controls/controls.qrc b/src/controls/controls.qrc new file mode 100644 index 00000000..c1dded8a --- /dev/null +++ b/src/controls/controls.qrc @@ -0,0 +1,5 @@ +<!DOCTYPE RCC><RCC version="1.0"> +<qresource prefix="/qtquickcontrols"> + <file>style.json</file> +</qresource> +</RCC> diff --git a/src/controls/doc/qtquickcontrols2.qdocconf b/src/controls/doc/qtquickcontrols2.qdocconf new file mode 100644 index 00000000..993493d5 --- /dev/null +++ b/src/controls/doc/qtquickcontrols2.qdocconf @@ -0,0 +1,42 @@ +include($QT_INSTALL_DOCS/global/qt-module-defaults.qdocconf) + +project = QtQuickControls2 +description = Qt Quick Controls 2 Reference Documentation +version = $QT_VERSION + +qhp.projects = QtQuickControls2 + +qhp.QtQuickControls2.file = qtquickcontrols2.qhp +qhp.QtQuickControls2.namespace = org.qt-project.qtquickcontrols2.$QT_VERSION_TAG +qhp.QtQuickControls2.virtualFolder = qtquickcontrols2 +qhp.QtQuickControls2.indexTitle = Qt Quick Controls 2 +qhp.QtQuickControls2.indexRoot = + +qhp.QtQuickControls2.filterAttributes = qtquickcontrols2 $QT_VERSION qtrefdoc +qhp.QtQuickControls2.customFilters.Qt.name = QtQuickControls2 $QT_VERSION +qhp.QtQuickControls2.customFilters.Qt.filterAttributes = qtquickcontrols2 $QT_VERSION + +qhp.QtQuickControls2.subprojects = qtquickcontrols2qmltypes + +qhp.QtQuickControls2.subprojects.qtquickcontrols2qmltypes.title = Controls 2 QML Types +qhp.QtQuickControls2.subprojects.qtquickcontrols2qmltypes.indexTitle = Qt Quick Controls 2 QML Types +qhp.QtQuickControls2.subprojects.qtquickcontrols2qmltypes.selectors = qmlclass # cannot choose qmltypes from a specific group QTBUG-32985 +qhp.QtQuickControls2.subprojects.qtquickcontrols2qmltypes.sortPages = true + +depends = qtcore qtgui qtdoc qtqml qtquick qtquicklayouts qtquickdialogs + +# Specify the install path under QT_INSTALL_EXAMPLES +# Examples will be installed under quick/controls - 'controls' subdirectory +# is given as part of \example commands +exampledirs += ../../../examples/quick/controls +examplesinstallpath = quick/controls + +headerdirs += ../ +sourcedirs += ../ + +imagedirs += images + +navigation.landingpage = "Qt Quick Controls 2" +navigation.qmltypespage = "Qt Quick Controls 2 QML Types" + +tagfile = qtquickcontrols2.tags diff --git a/src/controls/doc/src/qtquickcontrols2-index.qdoc b/src/controls/doc/src/qtquickcontrols2-index.qdoc new file mode 100644 index 00000000..028e4bd4 --- /dev/null +++ b/src/controls/doc/src/qtquickcontrols2-index.qdoc @@ -0,0 +1,48 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** 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 Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: http://www.gnu.org/copyleft/fdl.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \page qtquickcontrols2-index.html + \title Qt Quick Controls 2 + + \brief The Qt Quick Controls 2 module provides a set of UI controls for Qt Quick. + + The Qt Quick Controls 2 module provides a set of controls that can be used to + build complete interfaces in Qt Quick. + + The module is new in Qt 5.6. + + Visit the \l{Qt Quick Controls 2 Overview} page to get started. + + \section1 Related information + + \list + \li \l{Qt Quick} + \li \l{Qt Quick Controls 2 Overview} + \li \l{Qt Quick Controls 2 QML Types}{Qt Quick Controls 2 QML Types} + \endlist +*/ diff --git a/src/controls/doc/src/qtquickcontrols2-overview.qdoc b/src/controls/doc/src/qtquickcontrols2-overview.qdoc new file mode 100644 index 00000000..2140aa55 --- /dev/null +++ b/src/controls/doc/src/qtquickcontrols2-overview.qdoc @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** 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 Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: http://www.gnu.org/copyleft/fdl.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \page qtquickcontrols2-overview.html + \title Qt Quick Controls 2 Overview + \brief A set of UI controls to create user interfaces in Qt Quick + + The Qt Quick Controls 2 provide a set of UI controls to create user interfaces + in Qt Quick. + + \section1 Getting Started + + TODO + + \section1 Setting Up Controls from C++ + + TODO + + \section2 Using C++ Data From QML + + TODO + + \section2 Deploying Qt Quick Controls 2 + + TODO + + \section1 Related information + + \list + \li \l{Qt Quick} + \li \l{Qt Quick Controls 2} + \endlist +*/ diff --git a/src/controls/doc/src/qtquickcontrols2.qdoc b/src/controls/doc/src/qtquickcontrols2.qdoc new file mode 100644 index 00000000..bb188eac --- /dev/null +++ b/src/controls/doc/src/qtquickcontrols2.qdoc @@ -0,0 +1,44 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** 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 Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: http://www.gnu.org/copyleft/fdl.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \qmlmodule QtQuick.Controls 2.0 + \title Qt Quick Controls 2 QML Types + \ingroup qmlmodules + \brief Provides QML types for user interfaces. + + The \l{Qt Quick Controls 2} module provides QML types for creating user + interfaces. These QML types work in conjunction with \l{Qt Quick} and + \l{Qt Quick Layouts}. + + The QML types can be imported into your application using the + following import statement in your .qml file. + + \code + import QtQuick.Controls 2.0 + \endcode +*/ diff --git a/src/controls/qquickabstractapplicationwindow.cpp b/src/controls/qquickabstractapplicationwindow.cpp new file mode 100644 index 00000000..f6ad3084 --- /dev/null +++ b/src/controls/qquickabstractapplicationwindow.cpp @@ -0,0 +1,256 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractapplicationwindow_p.h" +#include "qquickstyle_p.h" + +#include <QtQuick/private/qquickitem_p.h> +#include <QtQuick/private/qquickitemchangelistener_p.h> + +QT_BEGIN_NAMESPACE + +/*! + \qmltype ApplicationWindow + \inherits Window + \instantiates QQuickAbstractApplicationWindow + \inqmlmodule QtQuick.Controls + \ingroup application + \brief An application window. + + TODO +*/ + +class QQuickAbstractApplicationWindowPrivate : public QQuickItemChangeListener +{ + Q_DECLARE_PUBLIC(QQuickAbstractApplicationWindow) + +public: + QQuickAbstractApplicationWindowPrivate() : contentWidth(0), contentHeight(0), + header(Q_NULLPTR), footer(Q_NULLPTR), style(Q_NULLPTR) { } + + void relayout(); + + void itemImplicitWidthChanged(QQuickItem *item) Q_DECL_OVERRIDE; + void itemImplicitHeightChanged(QQuickItem *item) Q_DECL_OVERRIDE; + + qreal contentWidth; + qreal contentHeight; + QQuickItem *header; + QQuickItem *footer; + mutable QQuickStyle *style; + QQuickAbstractApplicationWindow *q_ptr; +}; + +void QQuickAbstractApplicationWindowPrivate::relayout() +{ + Q_Q(QQuickAbstractApplicationWindow); + QQuickItem *content = q->contentItem(); + qreal hh = header ? header->height() : 0; + qreal fh = footer ? footer->height() : 0; + + content->setY(hh); + content->setHeight(q->height() - hh - fh); + + if (header) + header->setY(-hh); + if (footer) + footer->setY(content->height()); +} + +void QQuickAbstractApplicationWindowPrivate::itemImplicitWidthChanged(QQuickItem *item) +{ + Q_UNUSED(item); + relayout(); +} + +void QQuickAbstractApplicationWindowPrivate::itemImplicitHeightChanged(QQuickItem *item) +{ + Q_UNUSED(item); + relayout(); +} + +QQuickAbstractApplicationWindow::QQuickAbstractApplicationWindow(QWindow *parent) : + QQuickWindowQmlImpl(parent), d_ptr(new QQuickAbstractApplicationWindowPrivate) +{ + d_ptr->q_ptr = this; +} + +QQuickAbstractApplicationWindow::~QQuickAbstractApplicationWindow() +{ + Q_D(QQuickAbstractApplicationWindow); + if (d->header) + QQuickItemPrivate::get(d->header)->removeItemChangeListener(d, QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight); + if (d->footer) + QQuickItemPrivate::get(d->footer)->removeItemChangeListener(d, QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight); +} + +/*! + \qmlproperty Item QtQuickControls2::ApplicationWindow::header + + TODO +*/ +QQuickItem *QQuickAbstractApplicationWindow::header() const +{ + Q_D(const QQuickAbstractApplicationWindow); + return d->header; +} + +void QQuickAbstractApplicationWindow::setHeader(QQuickItem *header) +{ + Q_D(QQuickAbstractApplicationWindow); + if (d->header != header) { + delete d->header; + d->header = header; + if (header) { + header->setParentItem(contentItem()); + QQuickItemPrivate *p = QQuickItemPrivate::get(header); + p->addItemChangeListener(d, QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight); + if (qFuzzyIsNull(header->z())) + header->setZ(1); + } + emit headerChanged(); + } +} + +/*! + \qmlproperty Item QtQuickControls2::ApplicationWindow::footer + + TODO +*/ +QQuickItem *QQuickAbstractApplicationWindow::footer() const +{ + Q_D(const QQuickAbstractApplicationWindow); + return d->footer; +} + +void QQuickAbstractApplicationWindow::setFooter(QQuickItem *footer) +{ + Q_D(QQuickAbstractApplicationWindow); + if (d->footer != footer) { + delete d->footer; + d->footer = footer; + if (footer) { + footer->setParentItem(contentItem()); + QQuickItemPrivate *p = QQuickItemPrivate::get(footer); + p->addItemChangeListener(d, QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight); + if (qFuzzyIsNull(footer->z())) + footer->setZ(1); + } + emit footerChanged(); + } +} + +/*! + \qmlproperty Style QtQuickControls2::ApplicationWindow::style + + TODO +*/ +QQuickStyle *QQuickAbstractApplicationWindow::style() const +{ + Q_D(const QQuickAbstractApplicationWindow); + if (!d->style) + d->style = QQuickStyle::instance(qmlEngine(this)); + return d->style; +} + +void QQuickAbstractApplicationWindow::setStyle(QQuickStyle *style) +{ + Q_D(QQuickAbstractApplicationWindow); + if (d->style != style) { + d->style = style; + emit styleChanged(); + } +} + +/*! + \qmlproperty real QtQuickControls2::ApplicationWindow::contentWidth + + TODO +*/ +qreal QQuickAbstractApplicationWindow::contentWidth() const +{ + Q_D(const QQuickAbstractApplicationWindow); + return d->contentWidth; +} + +void QQuickAbstractApplicationWindow::setContentWidth(qreal width) +{ + Q_D(QQuickAbstractApplicationWindow); + if (d->contentWidth != width) { + d->contentWidth = width; + emit contentWidthChanged(); + } +} + +/*! + \qmlproperty real QtQuickControls2::ApplicationWindow::contentHeight + + TODO +*/ +qreal QQuickAbstractApplicationWindow::contentHeight() const +{ + Q_D(const QQuickAbstractApplicationWindow); + return d->contentHeight; +} + +void QQuickAbstractApplicationWindow::setContentHeight(qreal height) +{ + Q_D(QQuickAbstractApplicationWindow); + if (d->contentHeight != height) { + d->contentHeight = height; + emit contentHeightChanged(); + } +} + +void QQuickAbstractApplicationWindow::resizeEvent(QResizeEvent *event) +{ + QQuickWindowQmlImpl::resizeEvent(event); + + Q_D(QQuickAbstractApplicationWindow); + if (d->header) { + QQuickItemPrivate *p = QQuickItemPrivate::get(d->header); + if (!p->widthValid || qFuzzyCompare(d->header->width(), event->oldSize().width())) + d->header->setWidth(width()); + } + if (d->footer) { + QQuickItemPrivate *p = QQuickItemPrivate::get(d->footer); + if (!p->widthValid || qFuzzyCompare(d->footer->width(), event->oldSize().width())) + d->footer->setWidth(width()); + } + d->relayout(); +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractapplicationwindow_p.h b/src/controls/qquickabstractapplicationwindow_p.h new file mode 100644 index 00000000..f8f2033a --- /dev/null +++ b/src/controls/qquickabstractapplicationwindow_p.h @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTAPPLICATIONWINDOW_P_H +#define QQUICKABSTRACTAPPLICATIONWINDOW_P_H + +#include <QtQuick/private/qquickwindowmodule_p.h> +#include <QtQuickControls/private/qtquickcontrolsglobal_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickStyle; +class QQuickAbstractApplicationWindowPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractApplicationWindow : public QQuickWindowQmlImpl +{ + Q_OBJECT + Q_PROPERTY(QQuickItem *header READ header WRITE setHeader NOTIFY headerChanged FINAL) + Q_PROPERTY(QQuickItem *footer READ footer WRITE setFooter NOTIFY footerChanged FINAL) + Q_PROPERTY(QQuickStyle *style READ style WRITE setStyle NOTIFY styleChanged FINAL) + Q_PROPERTY(qreal contentWidth READ contentWidth WRITE setContentWidth NOTIFY contentWidthChanged FINAL) + Q_PROPERTY(qreal contentHeight READ contentHeight WRITE setContentHeight NOTIFY contentHeightChanged FINAL) + +public: + explicit QQuickAbstractApplicationWindow(QWindow *parent = Q_NULLPTR); + ~QQuickAbstractApplicationWindow(); + + QQuickItem *header() const; + void setHeader(QQuickItem *header); + + QQuickItem *footer() const; + void setFooter(QQuickItem *footer); + + QQuickStyle *style() const; + void setStyle(QQuickStyle *style); + + qreal contentWidth() const; + void setContentWidth(qreal width); + + qreal contentHeight() const; + void setContentHeight(qreal height); + +Q_SIGNALS: + void headerChanged(); + void footerChanged(); + void styleChanged(); + void contentWidthChanged(); + void contentHeightChanged(); + +protected: + void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE; + +private: + Q_DISABLE_COPY(QQuickAbstractApplicationWindow) + Q_DECLARE_PRIVATE(QQuickAbstractApplicationWindow) + QScopedPointer<QQuickAbstractApplicationWindowPrivate> d_ptr; +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTAPPLICATIONWINDOW_P_H diff --git a/src/controls/qquickabstractbusyindicator.cpp b/src/controls/qquickabstractbusyindicator.cpp new file mode 100644 index 00000000..4370668a --- /dev/null +++ b/src/controls/qquickabstractbusyindicator.cpp @@ -0,0 +1,110 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractbusyindicator_p.h" +#include "qquickcontrol_p_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype BusyIndicator + \inherits Control + \instantiates QQuickAbstractBusyIndicator + \inqmlmodule QtQuick.Controls + \ingroup indicators + \brief A busy indicator. + + TODO +*/ + +class QQuickAbstractBusyIndicatorPrivate : public QQuickControlPrivate +{ +public: + QQuickAbstractBusyIndicatorPrivate() : running(false), indicator(Q_NULLPTR) { } + + bool running; + QQuickItem *indicator; +}; + +QQuickAbstractBusyIndicator::QQuickAbstractBusyIndicator(QQuickItem *parent) : + QQuickControl(*(new QQuickAbstractBusyIndicatorPrivate), parent) +{ +} + +/*! + \qmlproperty bool QtQuickControls2::BusyIndicator::running + + TODO +*/ +bool QQuickAbstractBusyIndicator::isRunning() const +{ + Q_D(const QQuickAbstractBusyIndicator); + return d->running; +} + +void QQuickAbstractBusyIndicator::setRunning(bool running) +{ + Q_D(QQuickAbstractBusyIndicator); + if (d->running != running) { + d->running = running; + emit runningChanged(); + } +} + +/*! + \qmlproperty Item QtQuickControls2::BusyIndicator::indicator + + TODO +*/ +QQuickItem *QQuickAbstractBusyIndicator::indicator() const +{ + Q_D(const QQuickAbstractBusyIndicator); + return d->indicator; +} + +void QQuickAbstractBusyIndicator::setIndicator(QQuickItem *indicator) +{ + Q_D(QQuickAbstractBusyIndicator); + if (d->indicator != indicator) { + delete d->indicator; + d->indicator = indicator; + if (indicator && !indicator->parentItem()) + indicator->setParentItem(this); + emit indicatorChanged(); + } +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractbusyindicator_p.h b/src/controls/qquickabstractbusyindicator_p.h new file mode 100644 index 00000000..a99da139 --- /dev/null +++ b/src/controls/qquickabstractbusyindicator_p.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTBUSYINDICATOR_P_H +#define QQUICKABSTRACTBUSYINDICATOR_P_H + +#include <QtQuickControls/private/qquickcontrol_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractBusyIndicatorPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractBusyIndicator : public QQuickControl +{ + Q_OBJECT + Q_PROPERTY(bool running READ isRunning WRITE setRunning NOTIFY runningChanged FINAL) + Q_PROPERTY(QQuickItem *indicator READ indicator WRITE setIndicator NOTIFY indicatorChanged FINAL) + +public: + explicit QQuickAbstractBusyIndicator(QQuickItem *parent = Q_NULLPTR); + + bool isRunning() const; + void setRunning(bool running); + + QQuickItem *indicator() const; + void setIndicator(QQuickItem *indicator); + +Q_SIGNALS: + void runningChanged(); + void indicatorChanged(); + +private: + Q_DISABLE_COPY(QQuickAbstractBusyIndicator) + Q_DECLARE_PRIVATE(QQuickAbstractBusyIndicator) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTBUSYINDICATOR_P_H diff --git a/src/controls/qquickabstractbutton.cpp b/src/controls/qquickabstractbutton.cpp new file mode 100644 index 00000000..5b207520 --- /dev/null +++ b/src/controls/qquickabstractbutton.cpp @@ -0,0 +1,189 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractbutton_p.h" +#include "qquickabstractbutton_p_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype Button + \inherits Control + \instantiates QQuickAbstractButton + \inqmlmodule QtQuick.Controls + \ingroup buttons + \brief A button control. + + TODO +*/ + +QQuickAbstractButtonPrivate::QQuickAbstractButtonPrivate() : + pressed(false), label(Q_NULLPTR) +{ +} + +QQuickAbstractButton::QQuickAbstractButton(QQuickItem *parent) : + QQuickControl(*(new QQuickAbstractButtonPrivate), parent) +{ + setActiveFocusOnTab(true); + setAcceptedMouseButtons(Qt::LeftButton); +} + +QQuickAbstractButton::QQuickAbstractButton(QQuickAbstractButtonPrivate &dd, QQuickItem *parent) : + QQuickControl(dd, parent) +{ + setActiveFocusOnTab(true); + setAcceptedMouseButtons(Qt::LeftButton); +} + +/*! + \qmlproperty string QtQuickControls2::Button::text + + TODO +*/ +QString QQuickAbstractButton::text() const +{ + Q_D(const QQuickAbstractButton); + return d->text; +} + +void QQuickAbstractButton::setText(const QString &text) +{ + Q_D(QQuickAbstractButton); + if (d->text != text) { + d->text = text; + emit textChanged(); + } +} + +/*! + \qmlproperty bool QtQuickControls2::Button::pressed + + TODO +*/ +bool QQuickAbstractButton::isPressed() const +{ + Q_D(const QQuickAbstractButton); + return d->pressed; +} + +void QQuickAbstractButton::setPressed(bool pressed) +{ + Q_D(QQuickAbstractButton); + if (d->pressed != pressed) { + d->pressed = pressed; + emit pressedChanged(); + } +} + +/*! + \qmlproperty Item QtQuickControls2::Button::label + + TODO +*/ +QQuickItem *QQuickAbstractButton::label() const +{ + Q_D(const QQuickAbstractButton); + return d->label; +} + +void QQuickAbstractButton::setLabel(QQuickItem *label) +{ + Q_D(QQuickAbstractButton); + if (d->label != label) { + delete d->label; + d->label = label; + if (label && !label->parentItem()) + label->setParentItem(this); + emit labelChanged(); + } +} + +void QQuickAbstractButton::focusOutEvent(QFocusEvent *event) +{ + QQuickControl::focusOutEvent(event); + setPressed(false); +} + +void QQuickAbstractButton::keyPressEvent(QKeyEvent *event) +{ + QQuickControl::keyPressEvent(event); + if (event->key() == Qt::Key_Space) { + setPressed(true); + event->accept(); + } +} + +void QQuickAbstractButton::keyReleaseEvent(QKeyEvent *event) +{ + QQuickControl::keyReleaseEvent(event); + if (event->key() == Qt::Key_Space) { + emit clicked(); + setPressed(false); + event->accept(); + } +} + +void QQuickAbstractButton::mousePressEvent(QMouseEvent *event) +{ + QQuickControl::mousePressEvent(event); + setPressed(true); + event->accept(); +} + +void QQuickAbstractButton::mouseMoveEvent(QMouseEvent *event) +{ + QQuickControl::mouseMoveEvent(event); + setPressed(contains(event->pos())); + event->accept(); +} + +void QQuickAbstractButton::mouseReleaseEvent(QMouseEvent *event) +{ + QQuickControl::mouseReleaseEvent(event); + if (contains(event->pos())) + emit clicked(); + setPressed(false); + event->accept(); +} + +void QQuickAbstractButton::mouseUngrabEvent() +{ + QQuickControl::mouseUngrabEvent(); + setPressed(false); +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractbutton_p.h b/src/controls/qquickabstractbutton_p.h new file mode 100644 index 00000000..4be68f29 --- /dev/null +++ b/src/controls/qquickabstractbutton_p.h @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTBUTTON_P_H +#define QQUICKABSTRACTBUTTON_P_H + +#include <QtQuickControls/private/qquickcontrol_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractButtonPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractButton : public QQuickControl +{ + Q_OBJECT + Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged FINAL) + Q_PROPERTY(bool pressed READ isPressed WRITE setPressed NOTIFY pressedChanged FINAL) + Q_PROPERTY(QQuickItem *label READ label WRITE setLabel NOTIFY labelChanged FINAL) + +public: + explicit QQuickAbstractButton(QQuickItem *parent = Q_NULLPTR); + + QString text() const; + void setText(const QString &text); + + bool isPressed() const; + void setPressed(bool pressed); + + QQuickItem *label() const; + void setLabel(QQuickItem *label); + +Q_SIGNALS: + void clicked(); + void textChanged(); + void pressedChanged(); + void labelChanged(); + +protected: + QQuickAbstractButton(QQuickAbstractButtonPrivate &dd, QQuickItem *parent); + + void focusOutEvent(QFocusEvent *event) Q_DECL_OVERRIDE; + void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE; + void keyReleaseEvent(QKeyEvent *event) 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; + +private: + Q_DISABLE_COPY(QQuickAbstractButton) + Q_DECLARE_PRIVATE(QQuickAbstractButton) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTBUTTON_P_H diff --git a/src/controls/qquickabstractbutton_p_p.h b/src/controls/qquickabstractbutton_p_p.h new file mode 100644 index 00000000..fa24543b --- /dev/null +++ b/src/controls/qquickabstractbutton_p_p.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTBUTTON_P_P_H +#define QQUICKABSTRACTBUTTON_P_P_H + +#include <QtQuickControls/private/qquickcontrol_p_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractButtonPrivate : public QQuickControlPrivate +{ + Q_DECLARE_PUBLIC(QQuickAbstractButton) + +public: + QQuickAbstractButtonPrivate(); + + QString text; + bool pressed; + QQuickItem *label; +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTBUTTON_P_P_H diff --git a/src/controls/qquickabstractcheckable.cpp b/src/controls/qquickabstractcheckable.cpp new file mode 100644 index 00000000..3811ada4 --- /dev/null +++ b/src/controls/qquickabstractcheckable.cpp @@ -0,0 +1,190 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractcheckable_p.h" +#include "qquickabstractcheckable_p_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype Checkable + \inherits Button + \instantiates QQuickAbstractCheckable + \inqmlmodule QtQuick.Controls + \qmlabstract + \internal +*/ + +QQuickAbstractCheckablePrivate::QQuickAbstractCheckablePrivate() : + checked(false), exclusive(false), indicator(Q_NULLPTR), layoutDirection(Qt::LeftToRight) +{ +} + +QQuickAbstractCheckable::QQuickAbstractCheckable(QQuickItem *parent) : + QQuickAbstractButton(*(new QQuickAbstractCheckablePrivate), parent) +{ +} + +QQuickAbstractCheckable::QQuickAbstractCheckable(QQuickAbstractCheckablePrivate &dd, QQuickItem *parent) : + QQuickAbstractButton(dd, parent) +{ +} + +/*! + \qmlproperty bool QtQuickControls2::Checkable::checked + + TODO +*/ +bool QQuickAbstractCheckable::isChecked() const +{ + Q_D(const QQuickAbstractCheckable); + return d->checked; +} + +void QQuickAbstractCheckable::setChecked(bool checked) +{ + Q_D(QQuickAbstractCheckable); + if (d->checked != checked) { + d->checked = checked; + emit checkedChanged(); + } +} + +bool QQuickAbstractCheckable::isExclusive() const +{ + Q_D(const QQuickAbstractCheckable); + return d->exclusive; +} + +void QQuickAbstractCheckable::setExclusive(bool exclusive) +{ + Q_D(QQuickAbstractCheckable); + d->exclusive = exclusive; +} + +/*! + \qmlproperty Item QtQuickControls2::Checkable::indicator + + TODO +*/ +QQuickItem *QQuickAbstractCheckable::indicator() const +{ + Q_D(const QQuickAbstractCheckable); + return d->indicator; +} + +void QQuickAbstractCheckable::setIndicator(QQuickItem *indicator) +{ + Q_D(QQuickAbstractCheckable); + if (d->indicator != indicator) { + delete d->indicator; + d->indicator = indicator; + if (indicator) { + if (!indicator->parentItem()) + indicator->setParentItem(this); + indicator->setAcceptedMouseButtons(Qt::LeftButton); + } + emit indicatorChanged(); + } +} + +/*! + \qmlproperty enumeration QtQuickControls2::Checkable::layoutDirection + + TODO +*/ +Qt::LayoutDirection QQuickAbstractCheckable::layoutDirection() const +{ + Q_D(const QQuickAbstractCheckable); + return d->layoutDirection; +} + +/*! + \qmlproperty enumeration QtQuickControls2::Checkable::effectiveLayoutDirection + + TODO +*/ +Qt::LayoutDirection QQuickAbstractCheckable::effectiveLayoutDirection() const +{ + Q_D(const QQuickAbstractCheckable); + if (isMirrored()) + return d->layoutDirection == Qt::RightToLeft ? Qt::LeftToRight : Qt::RightToLeft; + return d->layoutDirection; +} + +void QQuickAbstractCheckable::setLayoutDirection(Qt::LayoutDirection direction) +{ + Q_D(QQuickAbstractCheckable); + if (d->layoutDirection != direction) { + d->layoutDirection = direction; + emit layoutDirectionChanged(); + emit effectiveLayoutDirectionChanged(); + } +} + +/*! + \qmlmethod void QtQuickControls2::Checkable::toggle() + + TODO +*/ +void QQuickAbstractCheckable::toggle() +{ + Q_D(QQuickAbstractCheckable); + setChecked(!d->checked); +} + +void QQuickAbstractCheckable::keyReleaseEvent(QKeyEvent *event) +{ + Q_D(QQuickAbstractCheckable); + QQuickAbstractButton::keyReleaseEvent(event); + if (event->key() == Qt::Key_Space) + setChecked(d->exclusive || !d->checked); +} + +void QQuickAbstractCheckable::mouseReleaseEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractCheckable); + QQuickAbstractButton::mouseReleaseEvent(event); + if (contains(event->pos())) + setChecked(d->exclusive || !d->checked); +} + +void QQuickAbstractCheckable::mirrorChange() +{ + emit effectiveLayoutDirectionChanged(); +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractcheckable_p.h b/src/controls/qquickabstractcheckable_p.h new file mode 100644 index 00000000..d82ea213 --- /dev/null +++ b/src/controls/qquickabstractcheckable_p.h @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTCHECKABLE_P_H +#define QQUICKABSTRACTCHECKABLE_P_H + +#include <QtQuickControls/private/qquickabstractbutton_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractCheckablePrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractCheckable : public QQuickAbstractButton +{ + Q_OBJECT + Q_PROPERTY(bool checked READ isChecked WRITE setChecked NOTIFY checkedChanged FINAL) + Q_PROPERTY(QQuickItem *indicator READ indicator WRITE setIndicator NOTIFY indicatorChanged FINAL) + Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged FINAL) + Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged FINAL) + +public: + explicit QQuickAbstractCheckable(QQuickItem *parent = Q_NULLPTR); + + bool isChecked() const; + void setChecked(bool checked); + + bool isExclusive() const; + void setExclusive(bool exclusive); + + QQuickItem *indicator() const; + void setIndicator(QQuickItem *indicator); + + Qt::LayoutDirection layoutDirection() const; + Qt::LayoutDirection effectiveLayoutDirection() const; + void setLayoutDirection(Qt::LayoutDirection direction); + +public Q_SLOTS: + void toggle(); + +Q_SIGNALS: + void checkedChanged(); + void indicatorChanged(); + void layoutDirectionChanged(); + void effectiveLayoutDirectionChanged(); + +protected: + QQuickAbstractCheckable(QQuickAbstractCheckablePrivate &dd, QQuickItem *parent); + + void keyReleaseEvent(QKeyEvent *event) Q_DECL_OVERRIDE; + void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + + void mirrorChange() Q_DECL_OVERRIDE; + +private: + Q_DISABLE_COPY(QQuickAbstractCheckable) + Q_DECLARE_PRIVATE(QQuickAbstractCheckable) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTCHECKABLE_P_H diff --git a/src/controls/qquickabstractcheckable_p_p.h b/src/controls/qquickabstractcheckable_p_p.h new file mode 100644 index 00000000..9788bf05 --- /dev/null +++ b/src/controls/qquickabstractcheckable_p_p.h @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTCHECKABLE_P_P_H +#define QQUICKABSTRACTCHECKABLE_P_P_H + +#include <QtQuickControls/private/qquickabstractbutton_p_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractCheckablePrivate : public QQuickAbstractButtonPrivate +{ +public: + QQuickAbstractCheckablePrivate(); + + bool checked; + bool exclusive; + QQuickItem *indicator; + Qt::LayoutDirection layoutDirection; +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTCHECKABLE_P_P_H diff --git a/src/controls/qquickabstractcheckbox.cpp b/src/controls/qquickabstractcheckbox.cpp new file mode 100644 index 00000000..67d9efab --- /dev/null +++ b/src/controls/qquickabstractcheckbox.cpp @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractcheckbox_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype CheckBox + \inherits Checkable + \instantiates QQuickAbstractCheckBox + \inqmlmodule QtQuick.Controls + \ingroup buttons + \brief A check box control. + + TODO +*/ + +QQuickAbstractCheckBox::QQuickAbstractCheckBox(QQuickItem *parent) : + QQuickAbstractCheckable(parent) +{ +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractcheckbox_p.h b/src/controls/qquickabstractcheckbox_p.h new file mode 100644 index 00000000..e97a1031 --- /dev/null +++ b/src/controls/qquickabstractcheckbox_p.h @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTCHECKBOX_P_H +#define QQUICKABSTRACTCHECKBOX_P_H + +#include <QtQuickControls/private/qquickabstractcheckable_p.h> + +QT_BEGIN_NAMESPACE + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractCheckBox : public QQuickAbstractCheckable +{ + Q_OBJECT + +public: + explicit QQuickAbstractCheckBox(QQuickItem *parent = Q_NULLPTR); +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTCHECKBOX_P_H diff --git a/src/controls/qquickabstractcontainer.cpp b/src/controls/qquickabstractcontainer.cpp new file mode 100644 index 00000000..b82f951a --- /dev/null +++ b/src/controls/qquickabstractcontainer.cpp @@ -0,0 +1,131 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractcontainer_p.h" +#include "qquickabstractcontainer_p_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype Container + \inherits Control + \instantiates QQuickAbstractContainer + \inqmlmodule QtQuick.Controls + \qmlabstract + \internal +*/ + +QQuickAbstractContainerPrivate::QQuickAbstractContainerPrivate() : + contentWidth(0), contentHeight(0), contentItem(Q_NULLPTR) +{ +} + +QQuickAbstractContainer::QQuickAbstractContainer(QQuickItem *parent) : + QQuickControl(*(new QQuickAbstractContainerPrivate), parent) +{ +} + +QQuickAbstractContainer::QQuickAbstractContainer(QQuickAbstractContainerPrivate &dd, QQuickItem *parent) : + QQuickControl(dd, parent) +{ +} + +/*! + \qmlproperty real QtQuickControls2::Container::contentWidth + + TODO +*/ +qreal QQuickAbstractContainer::contentWidth() const +{ + Q_D(const QQuickAbstractContainer); + return d->contentWidth; +} + +void QQuickAbstractContainer::setContentWidth(qreal width) +{ + Q_D(QQuickAbstractContainer); + if (d->contentWidth != width) { + d->contentWidth = width; + emit contentWidthChanged(); + } +} + +/*! + \qmlproperty real QtQuickControls2::Container::contentHeight + + TODO +*/ +qreal QQuickAbstractContainer::contentHeight() const +{ + Q_D(const QQuickAbstractContainer); + return d->contentHeight; +} + +void QQuickAbstractContainer::setContentHeight(qreal height) +{ + Q_D(QQuickAbstractContainer); + if (d->contentHeight != height) { + d->contentHeight = height; + emit contentHeightChanged(); + } +} + +/*! + \qmlproperty Item QtQuickControls2::Container::contentItem + + TODO +*/ +QQuickItem *QQuickAbstractContainer::contentItem() const +{ + Q_D(const QQuickAbstractContainer); + return d->contentItem; +} + +void QQuickAbstractContainer::setContentItem(QQuickItem *item) +{ + Q_D(QQuickAbstractContainer); + if (d->contentItem != item) { + delete d->contentItem; + d->contentItem = item; + if (item) { + if (!item->parentItem()) + item->setParentItem(this); + } + emit contentItemChanged(); + } +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractcontainer_p.h b/src/controls/qquickabstractcontainer_p.h new file mode 100644 index 00000000..c5accc0e --- /dev/null +++ b/src/controls/qquickabstractcontainer_p.h @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTCONTAINER_P_H +#define QQUICKABSTRACTCONTAINER_P_H + +#include <QtQuickControls/private/qquickcontrol_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractContainerPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractContainer : public QQuickControl +{ + Q_OBJECT + Q_PROPERTY(qreal contentWidth READ contentWidth WRITE setContentWidth NOTIFY contentWidthChanged FINAL) + Q_PROPERTY(qreal contentHeight READ contentHeight WRITE setContentHeight NOTIFY contentHeightChanged FINAL) + Q_PROPERTY(QQuickItem *contentItem READ contentItem WRITE setContentItem NOTIFY contentItemChanged FINAL) + +public: + explicit QQuickAbstractContainer(QQuickItem *parent = Q_NULLPTR); + + qreal contentWidth() const; + void setContentWidth(qreal width); + + qreal contentHeight() const; + void setContentHeight(qreal height); + + QQuickItem *contentItem() const; + void setContentItem(QQuickItem *item); + +Q_SIGNALS: + void contentWidthChanged(); + void contentHeightChanged(); + void contentItemChanged(); + +protected: + QQuickAbstractContainer(QQuickAbstractContainerPrivate &dd, QQuickItem *parent); + +private: + Q_DISABLE_COPY(QQuickAbstractContainer) + Q_DECLARE_PRIVATE(QQuickAbstractContainer) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTCONTAINER_P_H diff --git a/src/controls/qquickabstractcontainer_p_p.h b/src/controls/qquickabstractcontainer_p_p.h new file mode 100644 index 00000000..bf2080af --- /dev/null +++ b/src/controls/qquickabstractcontainer_p_p.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTCONTAINER_P_P_H +#define QQUICKABSTRACTCONTAINER_P_P_H + +#include <QtQuickControls/private/qquickcontrol_p_p.h> + +QT_BEGIN_NAMESPACE + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractContainerPrivate : public QQuickControlPrivate +{ +public: + QQuickAbstractContainerPrivate(); + + qreal contentWidth; + qreal contentHeight; + QQuickItem *contentItem; +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTCONTAINER_P_P_H diff --git a/src/controls/qquickabstractframe.cpp b/src/controls/qquickabstractframe.cpp new file mode 100644 index 00000000..9f8f2aa6 --- /dev/null +++ b/src/controls/qquickabstractframe.cpp @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractframe_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype Frame + \inherits Container + \instantiates QQuickAbstractFrame + \inqmlmodule QtQuick.Controls + \ingroup containers + \brief A frame control. + + TODO +*/ + +QQuickAbstractFrame::QQuickAbstractFrame(QQuickItem *parent) : + QQuickAbstractContainer(parent) +{ +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractframe_p.h b/src/controls/qquickabstractframe_p.h new file mode 100644 index 00000000..317e2360 --- /dev/null +++ b/src/controls/qquickabstractframe_p.h @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTFRAME_P_H +#define QQUICKABSTRACTFRAME_P_H + +#include <QtQuickControls/private/qquickabstractcontainer_p.h> + +QT_BEGIN_NAMESPACE + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractFrame : public QQuickAbstractContainer +{ + Q_OBJECT + +public: + explicit QQuickAbstractFrame(QQuickItem *parent = Q_NULLPTR); +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTFRAME_P_H diff --git a/src/controls/qquickabstractgroupbox.cpp b/src/controls/qquickabstractgroupbox.cpp new file mode 100644 index 00000000..8d2f9ec0 --- /dev/null +++ b/src/controls/qquickabstractgroupbox.cpp @@ -0,0 +1,134 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractgroupbox_p.h" +#include "qquickabstractcontainer_p_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype GroupBox + \inherits Container + \instantiates QQuickAbstractGroupBox + \inqmlmodule QtQuick.Controls + \ingroup containers + \brief A group box control. + + TODO +*/ + +class QQuickAbstractGroupBoxPrivate : public QQuickAbstractContainerPrivate +{ +public: + QQuickAbstractGroupBoxPrivate() : label(Q_NULLPTR), frame(Q_NULLPTR) { } + + QString title; + QQuickItem *label; + QQuickItem *frame; +}; + +QQuickAbstractGroupBox::QQuickAbstractGroupBox(QQuickItem *parent) : + QQuickAbstractContainer(*(new QQuickAbstractGroupBoxPrivate), parent) +{ +} + +/*! + \qmlproperty string QtQuickControls2::GroupBox::title + + TODO +*/ +QString QQuickAbstractGroupBox::title() const +{ + Q_D(const QQuickAbstractGroupBox); + return d->title; +} + +void QQuickAbstractGroupBox::setTitle(const QString &title) +{ + Q_D(QQuickAbstractGroupBox); + if (d->title != title) { + d->title = title; + emit titleChanged(); + } +} + +/*! + \qmlproperty Item QtQuickControls2::GroupBox::label + + TODO +*/ +QQuickItem *QQuickAbstractGroupBox::label() const +{ + Q_D(const QQuickAbstractGroupBox); + return d->label; +} + +void QQuickAbstractGroupBox::setLabel(QQuickItem *label) +{ + Q_D(QQuickAbstractGroupBox); + if (d->label != label) { + delete d->label; + d->label = label; + if (label && !label->parentItem()) + label->setParentItem(this); + emit labelChanged(); + } +} + +/*! + \qmlproperty Item QtQuickControls2::GroupBox::frame + + TODO +*/ +QQuickItem *QQuickAbstractGroupBox::frame() const +{ + Q_D(const QQuickAbstractGroupBox); + return d->frame; +} + +void QQuickAbstractGroupBox::setFrame(QQuickItem *frame) +{ + Q_D(QQuickAbstractGroupBox); + if (d->frame != frame) { + delete d->frame; + d->frame = frame; + if (frame && !frame->parentItem()) + frame->setParentItem(this); + emit frameChanged(); + } +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractgroupbox_p.h b/src/controls/qquickabstractgroupbox_p.h new file mode 100644 index 00000000..b1118441 --- /dev/null +++ b/src/controls/qquickabstractgroupbox_p.h @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTGROUPBOX_P_H +#define QQUICKABSTRACTGROUPBOX_P_H + +#include <QtQuickControls/private/qquickabstractcontainer_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractGroupBoxPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractGroupBox : public QQuickAbstractContainer +{ + Q_OBJECT + Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged FINAL) + Q_PROPERTY(QQuickItem *label READ label WRITE setLabel NOTIFY labelChanged FINAL) + Q_PROPERTY(QQuickItem *frame READ frame WRITE setFrame NOTIFY frameChanged FINAL) + +public: + explicit QQuickAbstractGroupBox(QQuickItem *parent = Q_NULLPTR); + + QString title() const; + void setTitle(const QString &title); + + QQuickItem *label() const; + void setLabel(QQuickItem *label); + + QQuickItem *frame() const; + void setFrame(QQuickItem *frame); + +Q_SIGNALS: + void titleChanged(); + void labelChanged(); + void frameChanged(); + +private: + Q_DISABLE_COPY(QQuickAbstractGroupBox) + Q_DECLARE_PRIVATE(QQuickAbstractGroupBox) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTGROUPBOX_P_H diff --git a/src/controls/qquickabstractpageindicator.cpp b/src/controls/qquickabstractpageindicator.cpp new file mode 100644 index 00000000..ee3b98bd --- /dev/null +++ b/src/controls/qquickabstractpageindicator.cpp @@ -0,0 +1,107 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractpageindicator_p.h" +#include "qquickabstractcontainer_p_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype PageIndicator + \inherits Control + \instantiates QQuickAbstractPageIndicator + \inqmlmodule QtQuick.Controls + \ingroup indicators + \brief A page indicator. + + TODO +*/ + +class QQuickAbstractPageIndicatorPrivate : public QQuickAbstractContainerPrivate +{ +public: + QQuickAbstractPageIndicatorPrivate() : count(0), currentIndex(0) { } + + int count; + int currentIndex; +}; + +QQuickAbstractPageIndicator::QQuickAbstractPageIndicator(QQuickItem *parent) : + QQuickAbstractContainer(*(new QQuickAbstractPageIndicatorPrivate), parent) +{ +} + +/*! + \qmlproperty int QtQuickControls2::PageIndicator::count + + TODO +*/ +int QQuickAbstractPageIndicator::count() const +{ + Q_D(const QQuickAbstractPageIndicator); + return d->count; +} + +void QQuickAbstractPageIndicator::setCount(int count) +{ + Q_D(QQuickAbstractPageIndicator); + if (d->count != count) { + d->count = count; + emit countChanged(); + } +} + +/*! + \qmlproperty int QtQuickControls2::PageIndicator::currentIndex + + TODO +*/ +int QQuickAbstractPageIndicator::currentIndex() const +{ + Q_D(const QQuickAbstractPageIndicator); + return d->currentIndex; +} + +void QQuickAbstractPageIndicator::setCurrentIndex(int index) +{ + Q_D(QQuickAbstractPageIndicator); + if (d->currentIndex != index) { + d->currentIndex = index; + emit currentIndexChanged(); + } +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractpageindicator_p.h b/src/controls/qquickabstractpageindicator_p.h new file mode 100644 index 00000000..aa6888bb --- /dev/null +++ b/src/controls/qquickabstractpageindicator_p.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTPAGEINDICATOR_P_H +#define QQUICKABSTRACTPAGEINDICATOR_P_H + +#include <QtQuickControls/private/qquickabstractcontainer_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractPageIndicatorPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractPageIndicator : public QQuickAbstractContainer +{ + Q_OBJECT + Q_PROPERTY(int count READ count WRITE setCount NOTIFY countChanged FINAL) + Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged FINAL) + +public: + explicit QQuickAbstractPageIndicator(QQuickItem *parent = Q_NULLPTR); + + int count() const; + void setCount(int count); + + int currentIndex() const; + void setCurrentIndex(int index); + +Q_SIGNALS: + void countChanged(); + void currentIndexChanged(); + +private: + Q_DISABLE_COPY(QQuickAbstractPageIndicator) + Q_DECLARE_PRIVATE(QQuickAbstractPageIndicator) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTPAGEINDICATOR_P_H diff --git a/src/controls/qquickabstractprogressbar.cpp b/src/controls/qquickabstractprogressbar.cpp new file mode 100644 index 00000000..7e38b167 --- /dev/null +++ b/src/controls/qquickabstractprogressbar.cpp @@ -0,0 +1,188 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractprogressbar_p.h" +#include "qquickcontrol_p_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype ProgressBar + \inherits Control + \instantiates QQuickAbstractProgressBar + \inqmlmodule QtQuick.Controls + \ingroup indicators + \brief A progress bar. + + TODO +*/ + +class QQuickAbstractProgressBarPrivate : public QQuickControlPrivate +{ +public: + QQuickAbstractProgressBarPrivate() : value(0), indeterminate(false), + layoutDirection(Qt::LeftToRight), indicator(Q_NULLPTR) { } + + qreal value; + bool indeterminate; + Qt::LayoutDirection layoutDirection; + QQuickItem *indicator; +}; + +QQuickAbstractProgressBar::QQuickAbstractProgressBar(QQuickItem *parent) : + QQuickControl(*(new QQuickAbstractProgressBarPrivate), parent) +{ +} + +/*! + \qmlproperty real QtQuickControls2::ProgressBar::value + + TODO +*/ +qreal QQuickAbstractProgressBar::value() const +{ + Q_D(const QQuickAbstractProgressBar); + return d->value; +} + +void QQuickAbstractProgressBar::setValue(qreal value) +{ + Q_D(QQuickAbstractProgressBar); + value = qBound(0.0, value, 1.0); + if (!qFuzzyCompare(d->value, value)) { + d->value = value; + emit valueChanged(); + emit visualPositionChanged(); + } +} + +/*! + \qmlproperty real QtQuickControls2::ProgressBar::visualPosition + + TODO +*/ +qreal QQuickAbstractProgressBar::visualPosition() const +{ + Q_D(const QQuickAbstractProgressBar); + if (effectiveLayoutDirection() == Qt::RightToLeft) + return 1.0 - d->value; + return d->value; +} + +/*! + \qmlproperty bool QtQuickControls2::ProgressBar::indeterminate + + TODO +*/ +bool QQuickAbstractProgressBar::isIndeterminate() const +{ + Q_D(const QQuickAbstractProgressBar); + return d->indeterminate; +} + +void QQuickAbstractProgressBar::setIndeterminate(bool indeterminate) +{ + Q_D(QQuickAbstractProgressBar); + if (d->indeterminate != indeterminate) { + d->indeterminate = indeterminate; + emit indeterminateChanged(); + } +} + +/*! + \qmlproperty enumeration QtQuickControls2::ProgressBar::layoutDirection + + TODO +*/ +Qt::LayoutDirection QQuickAbstractProgressBar::layoutDirection() const +{ + Q_D(const QQuickAbstractProgressBar); + return d->layoutDirection; +} + +/*! + \qmlproperty enumeration QtQuickControls2::ProgressBar::effectiveLayoutDirection + + TODO +*/ +Qt::LayoutDirection QQuickAbstractProgressBar::effectiveLayoutDirection() const +{ + Q_D(const QQuickAbstractProgressBar); + if (isMirrored()) + return d->layoutDirection == Qt::RightToLeft ? Qt::LeftToRight : Qt::RightToLeft; + return d->layoutDirection; +} + +void QQuickAbstractProgressBar::setLayoutDirection(Qt::LayoutDirection direction) +{ + Q_D(QQuickAbstractProgressBar); + if (d->layoutDirection != direction) { + d->layoutDirection = direction; + emit layoutDirectionChanged(); + emit effectiveLayoutDirectionChanged(); + } +} + +/*! + \qmlproperty Item QtQuickControls2::ProgressBar::indicator + + TODO +*/ +QQuickItem *QQuickAbstractProgressBar::indicator() const +{ + Q_D(const QQuickAbstractProgressBar); + return d->indicator; +} + +void QQuickAbstractProgressBar::setIndicator(QQuickItem *indicator) +{ + Q_D(QQuickAbstractProgressBar); + if (d->indicator != indicator) { + delete d->indicator; + d->indicator = indicator; + if (indicator && !indicator->parentItem()) + indicator->setParentItem(this); + emit indicatorChanged(); + } +} + +void QQuickAbstractProgressBar::mirrorChange() +{ + emit effectiveLayoutDirectionChanged(); + emit visualPositionChanged(); +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractprogressbar_p.h b/src/controls/qquickabstractprogressbar_p.h new file mode 100644 index 00000000..8215ad31 --- /dev/null +++ b/src/controls/qquickabstractprogressbar_p.h @@ -0,0 +1,92 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTPROGRESSBAR_P_H +#define QQUICKABSTRACTPROGRESSBAR_P_H + +#include <QtQuickControls/private/qquickcontrol_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractProgressBarPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractProgressBar : public QQuickControl +{ + Q_OBJECT + Q_PROPERTY(qreal value READ value WRITE setValue NOTIFY valueChanged FINAL) + Q_PROPERTY(qreal visualPosition READ visualPosition NOTIFY visualPositionChanged FINAL) + Q_PROPERTY(bool indeterminate READ isIndeterminate WRITE setIndeterminate NOTIFY indeterminateChanged FINAL) + Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged FINAL) + Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged FINAL) + Q_PROPERTY(QQuickItem *indicator READ indicator WRITE setIndicator NOTIFY indicatorChanged FINAL) + +public: + explicit QQuickAbstractProgressBar(QQuickItem *parent = Q_NULLPTR); + + qreal value() const; + void setValue(qreal value); + + qreal visualPosition() const; + + bool isIndeterminate() const; + void setIndeterminate(bool indeterminate); + + Qt::LayoutDirection layoutDirection() const; + Qt::LayoutDirection effectiveLayoutDirection() const; + void setLayoutDirection(Qt::LayoutDirection direction); + + QQuickItem *indicator() const; + void setIndicator(QQuickItem *indicator); + +Q_SIGNALS: + void valueChanged(); + void visualPositionChanged(); + void indeterminateChanged(); + void layoutDirectionChanged(); + void effectiveLayoutDirectionChanged(); + void indicatorChanged(); + +protected: + void mirrorChange() Q_DECL_OVERRIDE; + +private: + Q_DISABLE_COPY(QQuickAbstractProgressBar) + Q_DECLARE_PRIVATE(QQuickAbstractProgressBar) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTPROGRESSBAR_P_H diff --git a/src/controls/qquickabstractradiobutton.cpp b/src/controls/qquickabstractradiobutton.cpp new file mode 100644 index 00000000..75f47ac0 --- /dev/null +++ b/src/controls/qquickabstractradiobutton.cpp @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractradiobutton_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype RadioButton + \inherits Checkable + \instantiates QQuickAbstractRadioButton + \inqmlmodule QtQuick.Controls + \ingroup buttons + \brief A radio button control. + + TODO + + \sa ExclusiveGroup +*/ + +QQuickAbstractRadioButton::QQuickAbstractRadioButton(QQuickItem *parent) : + QQuickAbstractCheckable(parent) +{ + setExclusive(true); +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractradiobutton_p.h b/src/controls/qquickabstractradiobutton_p.h new file mode 100644 index 00000000..56d67868 --- /dev/null +++ b/src/controls/qquickabstractradiobutton_p.h @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTRADIOBUTTON_P_H +#define QQUICKABSTRACTRADIOBUTTON_P_H + +#include <QtQuickControls/private/qquickabstractcheckable_p.h> + +QT_BEGIN_NAMESPACE + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractRadioButton : public QQuickAbstractCheckable +{ + Q_OBJECT + +public: + explicit QQuickAbstractRadioButton(QQuickItem *parent = Q_NULLPTR); +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTRADIOBUTTON_P_H diff --git a/src/controls/qquickabstractscrollbar.cpp b/src/controls/qquickabstractscrollbar.cpp new file mode 100644 index 00000000..09ccace6 --- /dev/null +++ b/src/controls/qquickabstractscrollbar.cpp @@ -0,0 +1,428 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractscrollbar_p.h" +#include "qquickcontrol_p_p.h" + +#include <QtQuick/private/qquickflickable_p.h> +#include <QtQuick/private/qquickitemchangelistener_p.h> + +QT_BEGIN_NAMESPACE + +/*! + \qmltype ScrollBar + \inherits Control + \instantiates QQuickAbstractScrollBar + \inqmlmodule QtQuick.Controls + \ingroup indicators + \ingroup sliders + \brief A scroll bar. + + TODO +*/ + +class QQuickAbstractScrollBarPrivate : public QQuickControlPrivate +{ +public: + QQuickAbstractScrollBarPrivate() : size(0), position(0), offset(0), + active(false), pressed(false), moving(false), + orientation(Qt::Vertical), handle(Q_NULLPTR) { } + + static QQuickAbstractScrollBarPrivate *get(QQuickAbstractScrollBar *bar) + { + return bar->d_func(); + } + + qreal size; + qreal position; + qreal offset; + bool active; + bool pressed; + bool moving; + Qt::Orientation orientation; + QQuickItem *handle; +}; + +QQuickAbstractScrollBar::QQuickAbstractScrollBar(QQuickItem *parent) : + QQuickControl(*(new QQuickAbstractScrollBarPrivate), parent) +{ + setKeepMouseGrab(true); + setAcceptedMouseButtons(Qt::LeftButton); +} + +QQuickScrollBarAttached *QQuickAbstractScrollBar::qmlAttachedProperties(QObject *object) +{ + QQuickFlickable *flickable = qobject_cast<QQuickFlickable *>(object); + if (flickable) + return new QQuickScrollBarAttached(flickable); + + qWarning() << "ScrollBar must be attached to a Flickable" << object; + return Q_NULLPTR; +} + +/*! + \qmlproperty real QtQuickControls2::ScrollBar::size + + TODO +*/ +qreal QQuickAbstractScrollBar::size() const +{ + Q_D(const QQuickAbstractScrollBar); + return d->size; +} + +void QQuickAbstractScrollBar::setSize(qreal size) +{ + Q_D(QQuickAbstractScrollBar); + if (!qFuzzyCompare(d->size, size)) { + d->size = size; + emit sizeChanged(); + } +} + +/*! + \qmlproperty real QtQuickControls2::ScrollBar::position + + TODO +*/ +qreal QQuickAbstractScrollBar::position() const +{ + Q_D(const QQuickAbstractScrollBar); + return d->position; +} + +void QQuickAbstractScrollBar::setPosition(qreal position) +{ + Q_D(QQuickAbstractScrollBar); + if (!qFuzzyCompare(d->position, position)) { + d->position = position; + emit positionChanged(); + } +} + +/*! + \qmlproperty bool QtQuickControls2::ScrollBar::active + + TODO +*/ +bool QQuickAbstractScrollBar::isActive() const +{ + Q_D(const QQuickAbstractScrollBar); + return d->active; +} + +void QQuickAbstractScrollBar::setActive(bool active) +{ + Q_D(QQuickAbstractScrollBar); + if (d->active != active) { + d->active = active; + emit activeChanged(); + } +} + +/*! + \qmlproperty bool QtQuickControls2::ScrollBar::pressed + + TODO +*/ +bool QQuickAbstractScrollBar::isPressed() const +{ + Q_D(const QQuickAbstractScrollBar); + return d->pressed; +} + +void QQuickAbstractScrollBar::setPressed(bool pressed) +{ + Q_D(QQuickAbstractScrollBar); + if (d->pressed != pressed) { + d->pressed = pressed; + setActive(d->pressed || d->moving); + emit pressedChanged(); + } +} + +/*! + \qmlproperty enumeration QtQuickControls2::ScrollBar::orientation + + TODO +*/ +Qt::Orientation QQuickAbstractScrollBar::orientation() const +{ + Q_D(const QQuickAbstractScrollBar); + return d->orientation; +} + +void QQuickAbstractScrollBar::setOrientation(Qt::Orientation orientation) +{ + Q_D(QQuickAbstractScrollBar); + if (d->orientation != orientation) { + d->orientation = orientation; + emit orientationChanged(); + } +} + +/*! + \qmlproperty Item QtQuickControls2::ScrollBar::handle + + TODO +*/ +QQuickItem *QQuickAbstractScrollBar::handle() const +{ + Q_D(const QQuickAbstractScrollBar); + return d->handle; +} + +void QQuickAbstractScrollBar::setHandle(QQuickItem *handle) +{ + Q_D(QQuickAbstractScrollBar); + if (d->handle != handle) { + delete d->handle; + d->handle = handle; + if (handle && !handle->parentItem()) + handle->setParentItem(this); + emit handleChanged(); + } +} + +void QQuickAbstractScrollBar::mousePressEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractScrollBar); + QQuickControl::mousePressEvent(event); + d->offset = positionAt(event->pos()) - d->position; + if (d->offset < 0 || d->offset > d->size) + d->offset = d->size / 2; + setPressed(true); + event->accept(); +} + +void QQuickAbstractScrollBar::mouseMoveEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractScrollBar); + QQuickControl::mouseMoveEvent(event); + setPosition(qBound(0.0, positionAt(event->pos()) - d->offset, 1.0 - d->size)); + event->accept(); +} + +void QQuickAbstractScrollBar::mouseReleaseEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractScrollBar); + QQuickControl::mouseReleaseEvent(event); + setPosition(qBound(0.0, positionAt(event->pos()) - d->offset, 1.0 - d->size)); + d->offset = 0.0; + setPressed(false); + event->accept(); +} + +qreal QQuickAbstractScrollBar::positionAt(const QPoint &point) const +{ + Q_D(const QQuickAbstractScrollBar); + if (d->orientation == Qt::Horizontal) + return point.x() / width(); + else + return point.y() / height(); +} + +class QQuickScrollBarAttachedPrivate : public QObjectPrivate, public QQuickItemChangeListener +{ +public: + QQuickScrollBarAttachedPrivate(QQuickFlickable *flickable) : flickable(flickable), horizontal(Q_NULLPTR), vertical(Q_NULLPTR) { } + + void activateHorizontal(); + void activateVertical(); + void scrollHorizontal(); + void scrollVertical(); + + void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; + + QQuickFlickable *flickable; + QQuickAbstractScrollBar *horizontal; + QQuickAbstractScrollBar *vertical; +}; + +void QQuickScrollBarAttachedPrivate::activateHorizontal() +{ + QQuickAbstractScrollBarPrivate *p = QQuickAbstractScrollBarPrivate::get(horizontal); + p->moving = flickable->isMovingHorizontally(); + horizontal->setActive(p->moving || p->pressed); +} + +void QQuickScrollBarAttachedPrivate::activateVertical() +{ + QQuickAbstractScrollBarPrivate *p = QQuickAbstractScrollBarPrivate::get(vertical); + p->moving = flickable->isMovingVertically(); + vertical->setActive(p->moving || p->pressed); +} + +// TODO: QQuickFlickable::maxXYExtent() +class QQuickFriendlyFlickable : public QQuickFlickable +{ + friend class QQuickScrollBarAttachedPrivate; +}; + +void QQuickScrollBarAttachedPrivate::scrollHorizontal() +{ + QQuickFriendlyFlickable *f = reinterpret_cast<QQuickFriendlyFlickable *>(flickable); + + const qreal viewwidth = f->width(); + const qreal maxxextent = -f->maxXExtent() + f->minXExtent(); + qreal cx = horizontal->position() * (maxxextent + viewwidth) - f->minXExtent(); + if (!qIsNaN(cx) && !qFuzzyCompare(cx, flickable->contentX())) + flickable->setContentX(cx); +} + +void QQuickScrollBarAttachedPrivate::scrollVertical() +{ + QQuickFriendlyFlickable *f = reinterpret_cast<QQuickFriendlyFlickable *>(flickable); + + const qreal viewheight = f->height(); + const qreal maxyextent = -f->maxYExtent() + f->minYExtent(); + qreal cy = vertical->position() * (maxyextent + viewheight) - f->minYExtent(); + if (!qIsNaN(cy) && !qFuzzyCompare(cy, flickable->contentY())) + flickable->setContentY(cy); +} + +void QQuickScrollBarAttachedPrivate::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) +{ + Q_ASSERT(item == flickable); + if (horizontal) { + QQuickItemPrivate *p = QQuickItemPrivate::get(horizontal); + if (!p->widthValid || qFuzzyCompare(horizontal->width(), oldGeometry.width())) + horizontal->setWidth(newGeometry.width()); + if (qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), oldGeometry.height() - horizontal->height())) + horizontal->setY(newGeometry.height() - horizontal->height()); + } + if (vertical) { + QQuickItemPrivate *p = QQuickItemPrivate::get(vertical); + if (!p->heightValid || qFuzzyCompare(vertical->height(), oldGeometry.height())) + vertical->setHeight(newGeometry.height()); + if (!p->isMirrored() && (qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), oldGeometry.width() - vertical->width()))) + vertical->setX(newGeometry.width() - vertical->width()); + } +} + +QQuickScrollBarAttached::QQuickScrollBarAttached(QQuickFlickable *flickable) : + QObject(*(new QQuickScrollBarAttachedPrivate(flickable)), flickable) +{ + Q_D(QQuickScrollBarAttached); + QQuickItemPrivate *p = QQuickItemPrivate::get(flickable); + p->addItemChangeListener(d, QQuickItemPrivate::Geometry); +} + +QQuickAbstractScrollBar *QQuickScrollBarAttached::horizontal() const +{ + Q_D(const QQuickScrollBarAttached); + return d->horizontal; +} + +void QQuickScrollBarAttached::setHorizontal(QQuickAbstractScrollBar *horizontal) +{ + Q_D(QQuickScrollBarAttached); + if (d->horizontal != horizontal) { + if (d->horizontal) { + QObjectPrivate::disconnect(d->horizontal, &QQuickAbstractScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollHorizontal); + QObjectPrivate::disconnect(d->flickable, &QQuickFlickable::movingHorizontallyChanged, d, &QQuickScrollBarAttachedPrivate::activateHorizontal); + + // TODO: export QQuickFlickableVisibleArea + QObject *area = d->flickable->property("visibleArea").value<QObject *>(); + disconnect(area, SIGNAL(widthRatioChanged(qreal)), d->horizontal, SLOT(setSize(qreal))); + disconnect(area, SIGNAL(xPositionChanged(qreal)), d->horizontal, SLOT(setPosition(qreal))); + } + + d->horizontal = horizontal; + + if (horizontal) { + if (!horizontal->parentItem()) + horizontal->setParentItem(d->flickable); + horizontal->setOrientation(Qt::Horizontal); + + QObjectPrivate::connect(horizontal, &QQuickAbstractScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollHorizontal); + QObjectPrivate::connect(d->flickable, &QQuickFlickable::movingHorizontallyChanged, d, &QQuickScrollBarAttachedPrivate::activateHorizontal); + + // TODO: export QQuickFlickableVisibleArea + QObject *area = d->flickable->property("visibleArea").value<QObject *>(); + connect(area, SIGNAL(widthRatioChanged(qreal)), horizontal, SLOT(setSize(qreal))); + connect(area, SIGNAL(xPositionChanged(qreal)), horizontal, SLOT(setPosition(qreal))); + + horizontal->setSize(area->property("widthRatio").toReal()); + horizontal->setPosition(area->property("xPosition").toReal()); + } + emit horizontalChanged(); + } +} + +QQuickAbstractScrollBar *QQuickScrollBarAttached::vertical() const +{ + Q_D(const QQuickScrollBarAttached); + return d->vertical; +} + +void QQuickScrollBarAttached::setVertical(QQuickAbstractScrollBar *vertical) +{ + Q_D(QQuickScrollBarAttached); + if (d->vertical != vertical) { + if (d->vertical) { + QObjectPrivate::disconnect(d->vertical, &QQuickAbstractScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollVertical); + QObjectPrivate::disconnect(d->flickable, &QQuickFlickable::movingVerticallyChanged, d, &QQuickScrollBarAttachedPrivate::activateVertical); + + // TODO: export QQuickFlickableVisibleArea + QObject *area = d->flickable->property("visibleArea").value<QObject *>(); + disconnect(area, SIGNAL(heightRatioChanged(qreal)), d->vertical, SLOT(setSize(qreal))); + disconnect(area, SIGNAL(yPositionChanged(qreal)), d->vertical, SLOT(setPosition(qreal))); + } + + d->vertical = vertical; + + if (vertical) { + if (!vertical->parentItem()) + vertical->setParentItem(d->flickable); + vertical->setOrientation(Qt::Vertical); + + QObjectPrivate::connect(vertical, &QQuickAbstractScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollVertical); + QObjectPrivate::connect(d->flickable, &QQuickFlickable::movingVerticallyChanged, d, &QQuickScrollBarAttachedPrivate::activateVertical); + + // TODO: export QQuickFlickableVisibleArea + QObject *area = d->flickable->property("visibleArea").value<QObject *>(); + connect(area, SIGNAL(heightRatioChanged(qreal)), vertical, SLOT(setSize(qreal))); + connect(area, SIGNAL(yPositionChanged(qreal)), vertical, SLOT(setPosition(qreal))); + + vertical->setSize(area->property("heightRatio").toReal()); + vertical->setPosition(area->property("yPosition").toReal()); + } + emit verticalChanged(); + } +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractscrollbar_p.h b/src/controls/qquickabstractscrollbar_p.h new file mode 100644 index 00000000..ecc0114b --- /dev/null +++ b/src/controls/qquickabstractscrollbar_p.h @@ -0,0 +1,132 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTSCROLLBAR_P_H +#define QQUICKABSTRACTSCROLLBAR_P_H + +#include <QtQuickControls/private/qquickcontrol_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickFlickable; +class QQuickScrollBarAttached; +class QQuickAbstractScrollBarPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractScrollBar : public QQuickControl +{ + Q_OBJECT + Q_PROPERTY(qreal size READ size NOTIFY sizeChanged FINAL) + Q_PROPERTY(qreal position READ position NOTIFY positionChanged FINAL) + Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged FINAL) + Q_PROPERTY(bool pressed READ isPressed WRITE setPressed NOTIFY pressedChanged FINAL) + Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged FINAL) + Q_PROPERTY(QQuickItem *handle READ handle WRITE setHandle NOTIFY handleChanged FINAL) + +public: + explicit QQuickAbstractScrollBar(QQuickItem *parent = Q_NULLPTR); + + static QQuickScrollBarAttached *qmlAttachedProperties(QObject *object); + + qreal size() const; + qreal position() const; + + bool isActive() const; + void setActive(bool active); + + bool isPressed() const; + void setPressed(bool pressed); + + Qt::Orientation orientation() const; + void setOrientation(Qt::Orientation orientation); + + QQuickItem *handle() const; + void setHandle(QQuickItem *handle); + +public Q_SLOTS: + void setSize(qreal size); + void setPosition(qreal position); + +Q_SIGNALS: + void sizeChanged(); + void positionChanged(); + void activeChanged(); + void pressedChanged(); + void orientationChanged(); + void handleChanged(); + +protected: + void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + + virtual qreal positionAt(const QPoint &point) const; + +private: + Q_DISABLE_COPY(QQuickAbstractScrollBar) + Q_DECLARE_PRIVATE(QQuickAbstractScrollBar) +}; + +class QQuickScrollBarAttachedPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickScrollBarAttached : public QObject +{ + Q_OBJECT + Q_PROPERTY(QQuickAbstractScrollBar *horizontal READ horizontal WRITE setHorizontal NOTIFY horizontalChanged FINAL) + Q_PROPERTY(QQuickAbstractScrollBar *vertical READ vertical WRITE setVertical NOTIFY verticalChanged FINAL) + +public: + explicit QQuickScrollBarAttached(QQuickFlickable *flickable); + + QQuickAbstractScrollBar *horizontal() const; + void setHorizontal(QQuickAbstractScrollBar *horizontal); + + QQuickAbstractScrollBar *vertical() const; + void setVertical(QQuickAbstractScrollBar *vertical); + +Q_SIGNALS: + void horizontalChanged(); + void verticalChanged(); + +private: + Q_DISABLE_COPY(QQuickScrollBarAttached) + Q_DECLARE_PRIVATE(QQuickScrollBarAttached) +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPEINFO(QQuickAbstractScrollBar, QML_HAS_ATTACHED_PROPERTIES) + +#endif // QQUICKABSTRACTSCROLLBAR_P_H diff --git a/src/controls/qquickabstractscrollindicator.cpp b/src/controls/qquickabstractscrollindicator.cpp new file mode 100644 index 00000000..a68cc6b4 --- /dev/null +++ b/src/controls/qquickabstractscrollindicator.cpp @@ -0,0 +1,319 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractscrollindicator_p.h" +#include "qquickcontrol_p_p.h" + +#include <QtQuick/private/qquickflickable_p.h> +#include <QtQuick/private/qquickitemchangelistener_p.h> + +QT_BEGIN_NAMESPACE + +/*! + \qmltype ScrollIndicator + \inherits Control + \instantiates QQuickAbstractScrollIndicator + \inqmlmodule QtQuick.Controls + \ingroup indicators + \brief A scroll indicator. + + TODO +*/ + +class QQuickAbstractScrollIndicatorPrivate : public QQuickControlPrivate +{ +public: + QQuickAbstractScrollIndicatorPrivate() : size(0), position(0), + active(false), orientation(Qt::Vertical), indicator(Q_NULLPTR) { } + + qreal size; + qreal position; + bool active; + Qt::Orientation orientation; + QQuickItem *indicator; +}; + +QQuickAbstractScrollIndicator::QQuickAbstractScrollIndicator(QQuickItem *parent) : + QQuickControl(*(new QQuickAbstractScrollIndicatorPrivate), parent) +{ +} + +QQuickScrollIndicatorAttached *QQuickAbstractScrollIndicator::qmlAttachedProperties(QObject *object) +{ + QQuickFlickable *flickable = qobject_cast<QQuickFlickable *>(object); + if (flickable) + return new QQuickScrollIndicatorAttached(flickable); + + qWarning() << "ScrollIndicator must be attached to a Flickable" << object; + return Q_NULLPTR; +} + +/*! + \qmlproperty real QtQuickControls2::ScrollIndicator::size + + TODO +*/ +qreal QQuickAbstractScrollIndicator::size() const +{ + Q_D(const QQuickAbstractScrollIndicator); + return d->size; +} + +void QQuickAbstractScrollIndicator::setSize(qreal size) +{ + Q_D(QQuickAbstractScrollIndicator); + if (!qFuzzyCompare(d->size, size)) { + d->size = size; + emit sizeChanged(); + } +} + +/*! + \qmlproperty real QtQuickControls2::ScrollIndicator::position + + TODO +*/ +qreal QQuickAbstractScrollIndicator::position() const +{ + Q_D(const QQuickAbstractScrollIndicator); + return d->position; +} + +void QQuickAbstractScrollIndicator::setPosition(qreal position) +{ + Q_D(QQuickAbstractScrollIndicator); + if (!qFuzzyCompare(d->position, position)) { + d->position = position; + emit positionChanged(); + } +} + +/*! + \qmlproperty bool QtQuickControls2::ScrollIndicator::active + + TODO +*/ +bool QQuickAbstractScrollIndicator::isActive() const +{ + Q_D(const QQuickAbstractScrollIndicator); + return d->active; +} + +void QQuickAbstractScrollIndicator::setActive(bool active) +{ + Q_D(QQuickAbstractScrollIndicator); + if (d->active != active) { + d->active = active; + emit activeChanged(); + } +} + +/*! + \qmlproperty enumeration QtQuickControls2::ScrollIndicator::orientation + + TODO +*/ +Qt::Orientation QQuickAbstractScrollIndicator::orientation() const +{ + Q_D(const QQuickAbstractScrollIndicator); + return d->orientation; +} + +void QQuickAbstractScrollIndicator::setOrientation(Qt::Orientation orientation) +{ + Q_D(QQuickAbstractScrollIndicator); + if (d->orientation != orientation) { + d->orientation = orientation; + emit orientationChanged(); + } +} + +/*! + \qmlproperty Item QtQuickControls2::ScrollIndicator::indicator + + TODO +*/ +QQuickItem *QQuickAbstractScrollIndicator::indicator() const +{ + Q_D(const QQuickAbstractScrollIndicator); + return d->indicator; +} + +void QQuickAbstractScrollIndicator::setIndicator(QQuickItem *indicator) +{ + Q_D(QQuickAbstractScrollIndicator); + if (d->indicator != indicator) { + delete d->indicator; + d->indicator = indicator; + if (indicator && !indicator->parentItem()) + indicator->setParentItem(this); + emit indicatorChanged(); + } +} + +class QQuickScrollIndicatorAttachedPrivate : public QObjectPrivate, public QQuickItemChangeListener +{ +public: + QQuickScrollIndicatorAttachedPrivate(QQuickFlickable *flickable) : flickable(flickable), horizontal(Q_NULLPTR), vertical(Q_NULLPTR) { } + + void activateHorizontal(); + void activateVertical(); + + void itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; + + QQuickFlickable *flickable; + QQuickAbstractScrollIndicator *horizontal; + QQuickAbstractScrollIndicator *vertical; +}; + +void QQuickScrollIndicatorAttachedPrivate::activateHorizontal() +{ + horizontal->setActive(flickable->isMovingHorizontally()); +} + +void QQuickScrollIndicatorAttachedPrivate::activateVertical() +{ + vertical->setActive(flickable->isMovingVertically()); +} + +void QQuickScrollIndicatorAttachedPrivate::itemGeometryChanged(QQuickItem *item, const QRectF &newGeometry, const QRectF &oldGeometry) +{ + Q_ASSERT(item == flickable); + if (horizontal) { + QQuickItemPrivate *p = QQuickItemPrivate::get(horizontal); + if (!p->widthValid || qFuzzyCompare(horizontal->width(), oldGeometry.width())) + horizontal->setWidth(newGeometry.width()); + if (qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), oldGeometry.height() - horizontal->height())) + horizontal->setY(newGeometry.height() - horizontal->height()); + } + if (vertical) { + QQuickItemPrivate *p = QQuickItemPrivate::get(vertical); + if (!p->heightValid || qFuzzyCompare(vertical->height(), oldGeometry.height())) + vertical->setHeight(newGeometry.height()); + if (!p->isMirrored() && (qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), oldGeometry.width() - vertical->width()))) + vertical->setX(newGeometry.width() - vertical->width()); + } +} + +QQuickScrollIndicatorAttached::QQuickScrollIndicatorAttached(QQuickFlickable *flickable) : + QObject(*(new QQuickScrollIndicatorAttachedPrivate(flickable)), flickable) +{ + Q_D(QQuickScrollIndicatorAttached); + QQuickItemPrivate *p = QQuickItemPrivate::get(flickable); + p->addItemChangeListener(d, QQuickItemPrivate::Geometry); +} + +QQuickAbstractScrollIndicator *QQuickScrollIndicatorAttached::horizontal() const +{ + Q_D(const QQuickScrollIndicatorAttached); + return d->horizontal; +} + +void QQuickScrollIndicatorAttached::setHorizontal(QQuickAbstractScrollIndicator *horizontal) +{ + Q_D(QQuickScrollIndicatorAttached); + if (d->horizontal != horizontal) { + if (d->horizontal) { + QObjectPrivate::disconnect(d->flickable, &QQuickFlickable::movingHorizontallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateHorizontal); + + // TODO: export QQuickFlickableVisibleArea + QObject *area = d->flickable->property("visibleArea").value<QObject *>(); + disconnect(area, SIGNAL(widthRatioChanged(qreal)), d->horizontal, SLOT(setSize(qreal))); + disconnect(area, SIGNAL(xPositionChanged(qreal)), d->horizontal, SLOT(setPosition(qreal))); + } + + d->horizontal = horizontal; + + if (horizontal) { + if (!horizontal->parentItem()) + horizontal->setParentItem(d->flickable); + horizontal->setOrientation(Qt::Horizontal); + + QObjectPrivate::connect(d->flickable, &QQuickFlickable::movingHorizontallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateHorizontal); + + // TODO: export QQuickFlickableVisibleArea + QObject *area = d->flickable->property("visibleArea").value<QObject *>(); + connect(area, SIGNAL(widthRatioChanged(qreal)), horizontal, SLOT(setSize(qreal))); + connect(area, SIGNAL(xPositionChanged(qreal)), horizontal, SLOT(setPosition(qreal))); + + horizontal->setSize(area->property("widthRatio").toReal()); + horizontal->setPosition(area->property("xPosition").toReal()); + } + emit horizontalChanged(); + } +} + +QQuickAbstractScrollIndicator *QQuickScrollIndicatorAttached::vertical() const +{ + Q_D(const QQuickScrollIndicatorAttached); + return d->vertical; +} + +void QQuickScrollIndicatorAttached::setVertical(QQuickAbstractScrollIndicator *vertical) +{ + Q_D(QQuickScrollIndicatorAttached); + if (d->vertical != vertical) { + if (d->vertical) { + QObjectPrivate::disconnect(d->flickable, &QQuickFlickable::movingVerticallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateVertical); + + // TODO: export QQuickFlickableVisibleArea + QObject *area = d->flickable->property("visibleArea").value<QObject *>(); + disconnect(area, SIGNAL(heightRatioChanged(qreal)), d->vertical, SLOT(setSize(qreal))); + disconnect(area, SIGNAL(yPositionChanged(qreal)), d->vertical, SLOT(setPosition(qreal))); + } + + d->vertical = vertical; + + if (vertical) { + if (!vertical->parentItem()) + vertical->setParentItem(d->flickable); + vertical->setOrientation(Qt::Vertical); + + QObjectPrivate::connect(d->flickable, &QQuickFlickable::movingVerticallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateVertical); + + // TODO: export QQuickFlickableVisibleArea + QObject *area = d->flickable->property("visibleArea").value<QObject *>(); + connect(area, SIGNAL(heightRatioChanged(qreal)), vertical, SLOT(setSize(qreal))); + connect(area, SIGNAL(yPositionChanged(qreal)), vertical, SLOT(setPosition(qreal))); + + vertical->setSize(area->property("heightRatio").toReal()); + vertical->setPosition(area->property("yPosition").toReal()); + } + emit verticalChanged(); + } +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractscrollindicator_p.h b/src/controls/qquickabstractscrollindicator_p.h new file mode 100644 index 00000000..a26b650e --- /dev/null +++ b/src/controls/qquickabstractscrollindicator_p.h @@ -0,0 +1,120 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTSCROLLINDICATOR_P_H +#define QQUICKABSTRACTSCROLLINDICATOR_P_H + +#include <QtQuickControls/private/qquickcontrol_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickFlickable; +class QQuickScrollIndicatorAttached; +class QQuickAbstractScrollIndicatorPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractScrollIndicator : public QQuickControl +{ + Q_OBJECT + Q_PROPERTY(qreal size READ size NOTIFY sizeChanged FINAL) + Q_PROPERTY(qreal position READ position NOTIFY positionChanged FINAL) + Q_PROPERTY(bool active READ isActive WRITE setActive NOTIFY activeChanged FINAL) + Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged FINAL) + Q_PROPERTY(QQuickItem *indicator READ indicator WRITE setIndicator NOTIFY indicatorChanged FINAL) + +public: + explicit QQuickAbstractScrollIndicator(QQuickItem *parent = Q_NULLPTR); + + static QQuickScrollIndicatorAttached *qmlAttachedProperties(QObject *object); + + qreal size() const; + qreal position() const; + + bool isActive() const; + void setActive(bool active); + + Qt::Orientation orientation() const; + void setOrientation(Qt::Orientation orientation); + + QQuickItem *indicator() const; + void setIndicator(QQuickItem *indicator); + +public Q_SLOTS: + void setSize(qreal size); + void setPosition(qreal position); + +Q_SIGNALS: + void sizeChanged(); + void positionChanged(); + void activeChanged(); + void orientationChanged(); + void indicatorChanged(); + +private: + Q_DISABLE_COPY(QQuickAbstractScrollIndicator) + Q_DECLARE_PRIVATE(QQuickAbstractScrollIndicator) +}; + +class QQuickScrollIndicatorAttachedPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickScrollIndicatorAttached : public QObject +{ + Q_OBJECT + Q_PROPERTY(QQuickAbstractScrollIndicator *horizontal READ horizontal WRITE setHorizontal NOTIFY horizontalChanged FINAL) + Q_PROPERTY(QQuickAbstractScrollIndicator *vertical READ vertical WRITE setVertical NOTIFY verticalChanged FINAL) + +public: + explicit QQuickScrollIndicatorAttached(QQuickFlickable *flickable); + + QQuickAbstractScrollIndicator *horizontal() const; + void setHorizontal(QQuickAbstractScrollIndicator *horizontal); + + QQuickAbstractScrollIndicator *vertical() const; + void setVertical(QQuickAbstractScrollIndicator *vertical); + +Q_SIGNALS: + void horizontalChanged(); + void verticalChanged(); + +private: + Q_DISABLE_COPY(QQuickScrollIndicatorAttached) + Q_DECLARE_PRIVATE(QQuickScrollIndicatorAttached) +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPEINFO(QQuickAbstractScrollIndicator, QML_HAS_ATTACHED_PROPERTIES) + +#endif // QQUICKABSTRACTSCROLLINDICATOR_P_H diff --git a/src/controls/qquickabstractslider.cpp b/src/controls/qquickabstractslider.cpp new file mode 100644 index 00000000..52fa11af --- /dev/null +++ b/src/controls/qquickabstractslider.cpp @@ -0,0 +1,454 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractslider_p.h" +#include "qquickcontrol_p_p.h" + +#include <QtQuick/private/qquickwindow_p.h> + +QT_BEGIN_NAMESPACE + +/*! + \qmltype Slider + \inherits Control + \instantiates QQuickAbstractSlider + \inqmlmodule QtQuick.Controls + \ingroup sliders + \brief A slider control. + + TODO +*/ + +class QQuickAbstractSliderPrivate : public QQuickControlPrivate +{ + Q_DECLARE_PUBLIC(QQuickAbstractSlider) + +public: + QQuickAbstractSliderPrivate() : value(0), position(0), stepSize(0), + pressed(false), orientation(Qt::Horizontal), layoutDirection(Qt::LeftToRight), + snapMode(QQuickAbstractSlider::NoSnap), handle(Q_NULLPTR), track(Q_NULLPTR) { } + + qreal snapPosition(qreal position) const; + qreal positionAt(const QPoint &point) const; + + qreal value; + qreal position; + qreal stepSize; + bool pressed; + QPoint pressPoint; + Qt::Orientation orientation; + Qt::LayoutDirection layoutDirection; + QQuickAbstractSlider::SnapMode snapMode; + QQuickItem *handle; + QQuickItem *track; +}; + +qreal QQuickAbstractSliderPrivate::snapPosition(qreal position) const +{ + if (qFuzzyIsNull(stepSize)) + return position; + return qRound(position / stepSize) * stepSize; +} + +qreal QQuickAbstractSliderPrivate::positionAt(const QPoint &point) const +{ + Q_Q(const QQuickAbstractSlider); + if (orientation == Qt::Horizontal) { + const qreal hw = handle ? handle->width() : 0; + const qreal offset = hw / 2; + const qreal extent = q->width() - hw; + if (!qFuzzyIsNull(extent)) { + const qreal pos = (point.x() - offset) / extent; + if (q->effectiveLayoutDirection() == Qt::RightToLeft) + return 1.0 - pos; + return pos; + } + } else { + const qreal hh = handle ? handle->height() : 0; + const qreal offset = hh / 2; + const qreal extent = q->height() - hh; + if (!qFuzzyIsNull(extent)) + return (point.y() - offset) / extent; + } + return 0; +} + +QQuickAbstractSlider::QQuickAbstractSlider(QQuickItem *parent) : + QQuickControl(*(new QQuickAbstractSliderPrivate), parent) +{ + setActiveFocusOnTab(true); + setAcceptedMouseButtons(Qt::LeftButton); +} + +/*! + \qmlproperty real QtQuickControls2::Slider::value + + TODO +*/ +qreal QQuickAbstractSlider::value() const +{ + Q_D(const QQuickAbstractSlider); + return d->value; +} + +void QQuickAbstractSlider::setValue(qreal value) +{ + Q_D(QQuickAbstractSlider); + value = qBound(0.0, value, 1.0); + if (!qFuzzyCompare(d->value, value)) { + d->value = value; + setPosition(value); + emit valueChanged(); + } +} + +/*! + \qmlproperty real QtQuickControls2::Slider::position + + TODO +*/ +qreal QQuickAbstractSlider::position() const +{ + Q_D(const QQuickAbstractSlider); + return d->position; +} + +/*! + \qmlproperty real QtQuickControls2::Slider::visualPosition + + TODO +*/ +qreal QQuickAbstractSlider::visualPosition() const +{ + Q_D(const QQuickAbstractSlider); + if (d->orientation == Qt::Vertical || effectiveLayoutDirection() == Qt::RightToLeft) + return 1.0 - d->position; + return d->position; +} + +void QQuickAbstractSlider::setPosition(qreal position) +{ + Q_D(QQuickAbstractSlider); + position = qBound(0.0, position, 1.0); + if (!qFuzzyCompare(d->position, position)) { + d->position = position; + emit positionChanged(); + emit visualPositionChanged(); + } +} + +/*! + \qmlproperty real QtQuickControls2::Slider::stepSize + + TODO +*/ +qreal QQuickAbstractSlider::stepSize() const +{ + Q_D(const QQuickAbstractSlider); + return d->stepSize; +} + +void QQuickAbstractSlider::setStepSize(qreal step) +{ + Q_D(QQuickAbstractSlider); + if (!qFuzzyCompare(d->stepSize, step)) { + d->stepSize = step; + emit stepSizeChanged(); + } +} + +/*! + \qmlproperty enumeration QtQuickControls2::Slider::snapMode + + TODO +*/ +QQuickAbstractSlider::SnapMode QQuickAbstractSlider::snapMode() const +{ + Q_D(const QQuickAbstractSlider); + return d->snapMode; +} + +void QQuickAbstractSlider::setSnapMode(SnapMode mode) +{ + Q_D(QQuickAbstractSlider); + if (d->snapMode != mode) { + d->snapMode = mode; + emit snapModeChanged(); + } +} + +/*! + \qmlproperty bool QtQuickControls2::Slider::pressed + + TODO +*/ +bool QQuickAbstractSlider::isPressed() const +{ + Q_D(const QQuickAbstractSlider); + return d->pressed; +} + +void QQuickAbstractSlider::setPressed(bool pressed) +{ + Q_D(QQuickAbstractSlider); + if (d->pressed != pressed) { + d->pressed = pressed; + emit pressedChanged(); + } +} + +/*! + \qmlproperty enumeration QtQuickControls2::Slider::orientation + + TODO +*/ +Qt::Orientation QQuickAbstractSlider::orientation() const +{ + Q_D(const QQuickAbstractSlider); + return d->orientation; +} + +void QQuickAbstractSlider::setOrientation(Qt::Orientation orientation) +{ + Q_D(QQuickAbstractSlider); + if (d->orientation != orientation) { + d->orientation = orientation; + emit orientationChanged(); + } +} + +/*! + \qmlproperty enumeration QtQuickControls2::Slider::layoutDirection + + TODO +*/ +Qt::LayoutDirection QQuickAbstractSlider::layoutDirection() const +{ + Q_D(const QQuickAbstractSlider); + return d->layoutDirection; +} + +/*! + \qmlproperty enumeration QtQuickControls2::Slider::effectiveLayoutDirection + + TODO +*/ +Qt::LayoutDirection QQuickAbstractSlider::effectiveLayoutDirection() const +{ + Q_D(const QQuickAbstractSlider); + if (isMirrored()) + return d->layoutDirection == Qt::RightToLeft ? Qt::LeftToRight : Qt::RightToLeft; + return d->layoutDirection; +} + +void QQuickAbstractSlider::setLayoutDirection(Qt::LayoutDirection direction) +{ + Q_D(QQuickAbstractSlider); + if (d->layoutDirection != direction) { + d->layoutDirection = direction; + emit layoutDirectionChanged(); + emit effectiveLayoutDirectionChanged(); + } +} + +/*! + \qmlproperty Item QtQuickControls2::Slider::handle + + TODO +*/ +QQuickItem *QQuickAbstractSlider::handle() const +{ + Q_D(const QQuickAbstractSlider); + return d->handle; +} + +void QQuickAbstractSlider::setHandle(QQuickItem *handle) +{ + Q_D(QQuickAbstractSlider); + if (d->handle != handle) { + delete d->handle; + d->handle = handle; + if (handle && !handle->parentItem()) + handle->setParentItem(this); + emit handleChanged(); + } +} + +/*! + \qmlproperty Item QtQuickControls2::Slider::track + + TODO +*/ +QQuickItem *QQuickAbstractSlider::track() const +{ + Q_D(const QQuickAbstractSlider); + return d->track; +} + +void QQuickAbstractSlider::setTrack(QQuickItem *track) +{ + Q_D(QQuickAbstractSlider); + if (d->track != track) { + delete d->track; + d->track = track; + if (track && !track->parentItem()) + track->setParentItem(this); + emit trackChanged(); + } +} + +/*! + \qmlmethod void QtQuickControls2::Slider::increase() + + TODO +*/ +void QQuickAbstractSlider::increase() +{ + Q_D(QQuickAbstractSlider); + qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize; + setValue(d->value + step); +} + +/*! + \qmlmethod void QtQuickControls2::Slider::decrease() + + TODO +*/ +void QQuickAbstractSlider::decrease() +{ + Q_D(QQuickAbstractSlider); + qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize; + setValue(d->value - step); +} + +void QQuickAbstractSlider::keyPressEvent(QKeyEvent *event) +{ + Q_D(QQuickAbstractSlider); + QQuickControl::keyPressEvent(event); + if (d->orientation == Qt::Horizontal) { + if (event->key() == Qt::Key_Left) { + setPressed(true); + if (effectiveLayoutDirection() == Qt::RightToLeft) + increase(); + else + decrease(); + event->accept(); + } else if (event->key() == Qt::Key_Right) { + setPressed(true); + if (effectiveLayoutDirection() == Qt::RightToLeft) + decrease(); + else + increase(); + event->accept(); + } + } else { + if (event->key() == Qt::Key_Up) { + setPressed(true); + increase(); + event->accept(); + } else if (event->key() == Qt::Key_Down) { + setPressed(true); + decrease(); + event->accept(); + } + } +} + +void QQuickAbstractSlider::keyReleaseEvent(QKeyEvent *event) +{ + QQuickControl::keyReleaseEvent(event); + setPressed(false); +} + +void QQuickAbstractSlider::mousePressEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractSlider); + QQuickControl::mousePressEvent(event); + d->pressPoint = event->pos(); + setPressed(true); + event->accept(); +} + +void QQuickAbstractSlider::mouseMoveEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractSlider); + QQuickControl::mouseMoveEvent(event); + if (!keepMouseGrab()) { + if (d->orientation == Qt::Horizontal) + setKeepMouseGrab(QQuickWindowPrivate::dragOverThreshold(event->pos().x() - d->pressPoint.x(), Qt::XAxis, event)); + else + setKeepMouseGrab(QQuickWindowPrivate::dragOverThreshold(event->pos().y() - d->pressPoint.y(), Qt::YAxis, event)); + } + if (keepMouseGrab()) { + qreal pos = d->positionAt(event->pos()); + if (d->snapMode == SnapAlways) + pos = d->snapPosition(pos); + setPosition(pos); + } + event->accept(); +} + +void QQuickAbstractSlider::mouseReleaseEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractSlider); + QQuickControl::mouseReleaseEvent(event); + d->pressPoint = QPoint(); + if (keepMouseGrab()) { + qreal pos = d->positionAt(event->pos()); + if (d->snapMode != NoSnap) + pos = d->snapPosition(pos); + setValue(pos); + setKeepMouseGrab(false); + } + setPressed(false); + event->accept(); +} + +void QQuickAbstractSlider::mouseUngrabEvent() +{ + Q_D(QQuickAbstractSlider); + QQuickControl::mouseUngrabEvent(); + d->pressPoint = QPoint(); + setPressed(false); +} + +void QQuickAbstractSlider::mirrorChange() +{ + emit effectiveLayoutDirectionChanged(); + emit visualPositionChanged(); +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractslider_p.h b/src/controls/qquickabstractslider_p.h new file mode 100644 index 00000000..6b962aca --- /dev/null +++ b/src/controls/qquickabstractslider_p.h @@ -0,0 +1,133 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTSLIDER_P_H +#define QQUICKABSTRACTSLIDER_P_H + +#include <QtQuickControls/private/qquickcontrol_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractSliderPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractSlider : public QQuickControl +{ + Q_OBJECT + Q_PROPERTY(qreal value READ value WRITE setValue NOTIFY valueChanged FINAL) + Q_PROPERTY(qreal position READ position NOTIFY positionChanged FINAL) + Q_PROPERTY(qreal visualPosition READ visualPosition NOTIFY visualPositionChanged FINAL) + Q_PROPERTY(qreal stepSize READ stepSize WRITE setStepSize NOTIFY stepSizeChanged FINAL) + Q_PROPERTY(SnapMode snapMode READ snapMode WRITE setSnapMode NOTIFY snapModeChanged FINAL) + Q_PROPERTY(bool pressed READ isPressed WRITE setPressed NOTIFY pressedChanged FINAL) + Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged FINAL) + Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged FINAL) + Q_PROPERTY(Qt::LayoutDirection effectiveLayoutDirection READ effectiveLayoutDirection NOTIFY effectiveLayoutDirectionChanged FINAL) + Q_PROPERTY(QQuickItem *handle READ handle WRITE setHandle NOTIFY handleChanged FINAL) + Q_PROPERTY(QQuickItem *track READ track WRITE setTrack NOTIFY trackChanged FINAL) + Q_ENUMS(SnapMode) + +public: + explicit QQuickAbstractSlider(QQuickItem *parent = Q_NULLPTR); + + qreal value() const; + void setValue(qreal value); + + qreal position() const; + qreal visualPosition() const; + void setPosition(qreal position); + + qreal stepSize() const; + void setStepSize(qreal step); + + enum SnapMode { + NoSnap, + SnapAlways, + SnapOnRelease + }; + + SnapMode snapMode() const; + void setSnapMode(SnapMode mode); + + bool isPressed() const; + void setPressed(bool pressed); + + Qt::Orientation orientation() const; + void setOrientation(Qt::Orientation orientation); + + Qt::LayoutDirection layoutDirection() const; + Qt::LayoutDirection effectiveLayoutDirection() const; + void setLayoutDirection(Qt::LayoutDirection direction); + + QQuickItem *handle() const; + void setHandle(QQuickItem *handle); + + QQuickItem *track() const; + void setTrack(QQuickItem *track); + +public Q_SLOTS: + void increase(); + void decrease(); + +Q_SIGNALS: + void valueChanged(); + void positionChanged(); + void visualPositionChanged(); + void stepSizeChanged(); + void snapModeChanged(); + void pressedChanged(); + void orientationChanged(); + void layoutDirectionChanged(); + void effectiveLayoutDirectionChanged(); + void handleChanged(); + void trackChanged(); + +protected: + void keyPressEvent(QKeyEvent *event) Q_DECL_OVERRIDE; + void keyReleaseEvent(QKeyEvent *event) 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 mirrorChange() Q_DECL_OVERRIDE; + +private: + Q_DISABLE_COPY(QQuickAbstractSlider) + Q_DECLARE_PRIVATE(QQuickAbstractSlider) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTSLIDER_P_H diff --git a/src/controls/qquickabstractspinbox.cpp b/src/controls/qquickabstractspinbox.cpp new file mode 100644 index 00000000..442e479c --- /dev/null +++ b/src/controls/qquickabstractspinbox.cpp @@ -0,0 +1,300 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractspinbox_p.h" +#include "qquickcontrol_p_p.h" + +#include <QtQuick/private/qquicktextinput_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractSpinBoxPrivate : public QQuickControlPrivate +{ + Q_DECLARE_PUBLIC(QQuickAbstractSpinBox) + +public: + QQuickAbstractSpinBoxPrivate() : value(0), step(1), input(Q_NULLPTR), validator(Q_NULLPTR), + upButton(Q_NULLPTR), downButton(Q_NULLPTR), pressed(QQuickAbstractSpinBox::None) { } + + void updateText(); + void updateValue(); + + qreal value; + qreal step; + QQuickTextInput *input; + QValidator *validator; + QQuickItem *upButton; + QQuickItem *downButton; + QQuickAbstractSpinBox::SubControl pressed; +}; + +void QQuickAbstractSpinBoxPrivate::updateText() +{ + if (input) { + QString text = QString::number(value); + if (validator) { + validator->fixup(text); + int cursor = input->cursorPosition(); + if (validator->validate(text, cursor) == QValidator::Acceptable) + input->setCursorPosition(cursor); + input->setText(text); + } + } +} + +void QQuickAbstractSpinBoxPrivate::updateValue() +{ + Q_Q(QQuickAbstractSpinBox); + if (validator) { + QString text = input->text(); + validator->fixup(text); + int cursor = input->cursorPosition(); + if (validator->validate(text, cursor) == QValidator::Acceptable) + q->setValue(text.toDouble()); + } +} + +QQuickAbstractSpinBox::QQuickAbstractSpinBox(QQuickItem *parent) : + QQuickControl(*(new QQuickAbstractSpinBoxPrivate), parent) +{ + setFlag(ItemIsFocusScope); + setActiveFocusOnTab(true); + setAcceptedMouseButtons(Qt::LeftButton); +} + +qreal QQuickAbstractSpinBox::value() const +{ + Q_D(const QQuickAbstractSpinBox); + return d->value; +} + +void QQuickAbstractSpinBox::setValue(qreal value) +{ + Q_D(QQuickAbstractSpinBox); + if (!qFuzzyCompare(d->value, value)) { + d->value = value; + d->updateText(); + emit valueChanged(); + } +} + +qreal QQuickAbstractSpinBox::step() const +{ + Q_D(const QQuickAbstractSpinBox); + return d->step; +} + +void QQuickAbstractSpinBox::setStep(qreal step) +{ + Q_D(QQuickAbstractSpinBox); + if (!qFuzzyCompare(d->step, step)) { + d->step = step; + emit stepChanged(); + } +} + +QQuickTextInput *QQuickAbstractSpinBox::input() const +{ + Q_D(const QQuickAbstractSpinBox); + return d->input; +} + +void QQuickAbstractSpinBox::setInput(QQuickTextInput *input) +{ + Q_D(QQuickAbstractSpinBox); + if (d->input != input) { + delete d->input; + d->input = input; + if (input) { + if (!input->parentItem()) + input->setParentItem(this); + input->setValidator(d->validator); + input->setFocus(true); + QObjectPrivate::connect(input, &QQuickTextInput::textChanged, d, &QQuickAbstractSpinBoxPrivate::updateValue); + } + emit inputChanged(); + } +} + +QValidator *QQuickAbstractSpinBox::validator() const +{ + Q_D(const QQuickAbstractSpinBox); + return d->validator; +} + +void QQuickAbstractSpinBox::setValidator(QValidator *validator) +{ + Q_D(QQuickAbstractSpinBox); + if (d->validator != validator) { + delete d->validator; + d->validator = validator; + if (d->input) + d->input->setValidator(validator); + emit validatorChanged(); + } +} + +QQuickItem *QQuickAbstractSpinBox::upButton() const +{ + Q_D(const QQuickAbstractSpinBox); + return d->upButton; +} + +void QQuickAbstractSpinBox::setUpButton(QQuickItem *button) +{ + Q_D(QQuickAbstractSpinBox); + if (d->upButton != button) { + delete d->upButton; + d->upButton = button; + if (button && !button->parentItem()) + button->setParentItem(this); + emit upButtonChanged(); + } +} + +QQuickItem *QQuickAbstractSpinBox::downButton() const +{ + Q_D(const QQuickAbstractSpinBox); + return d->downButton; +} + +void QQuickAbstractSpinBox::setDownButton(QQuickItem *button) +{ + Q_D(QQuickAbstractSpinBox); + if (d->downButton != button) { + delete d->downButton; + d->downButton = button; + if (button && !button->parentItem()) + button->setParentItem(this); + emit downButtonChanged(); + } +} + +QQuickAbstractSpinBox::SubControl QQuickAbstractSpinBox::pressed() const +{ + Q_D(const QQuickAbstractSpinBox); + return d->pressed; +} + +void QQuickAbstractSpinBox::setPressed(SubControl control) +{ + Q_D(QQuickAbstractSpinBox); + if (d->pressed != control) { + d->pressed = control; + emit pressedChanged(); + } +} + +void QQuickAbstractSpinBox::increment() +{ + Q_D(QQuickAbstractSpinBox); + setValue(d->value + d->step); +} + +void QQuickAbstractSpinBox::decrement() +{ + Q_D(QQuickAbstractSpinBox); + setValue(d->value - d->step); +} + +void QQuickAbstractSpinBox::keyPressEvent(QKeyEvent *event) +{ + switch (event->key()) { + case Qt::Key_Up: + increment(); + event->accept(); + break; + case Qt::Key_Down: + decrement(); + event->accept(); + break; + default: + event->ignore(); + break; + } +} + +void QQuickAbstractSpinBox::mousePressEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractSpinBox); + QQuickControl::mousePressEvent(event); + if (d->upButton && d->upButton->contains(mapToItem(d->upButton, event->pos()))) + setPressed(UpButton); + else if (d->downButton && d->downButton->contains(mapToItem(d->downButton, event->pos()))) + setPressed(DownButton); + else + setPressed(None); + event->accept(); +} + +void QQuickAbstractSpinBox::mouseMoveEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractSpinBox); + QQuickControl::mouseMoveEvent(event); + if (d->upButton && d->upButton->contains(mapToItem(d->upButton, event->pos()))) + setPressed(UpButton); + else if (d->downButton && d->downButton->contains(mapToItem(d->downButton, event->pos()))) + setPressed(DownButton); + else + setPressed(None); + event->accept(); +} + +void QQuickAbstractSpinBox::mouseReleaseEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractSpinBox); + QQuickControl::mouseReleaseEvent(event); + if (d->pressed == UpButton) + increment(); + else if (d->pressed == DownButton) + decrement(); + setPressed(None); + event->accept(); +} + +void QQuickAbstractSpinBox::mouseUngrabEvent() +{ + setPressed(None); +} + +void QQuickAbstractSpinBox::componentComplete() +{ + Q_D(QQuickAbstractSpinBox); + QQuickControl::componentComplete(); + d->updateText(); +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractspinbox_p.h b/src/controls/qquickabstractspinbox_p.h new file mode 100644 index 00000000..e4585bcb --- /dev/null +++ b/src/controls/qquickabstractspinbox_p.h @@ -0,0 +1,119 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTSPINBOX_P_H +#define QQUICKABSTRACTSPINBOX_P_H + +#include <QtQuickControls/private/qquickcontrol_p.h> + +QT_BEGIN_NAMESPACE + +class QValidator; +class QQuickTextInput; +class QQuickAbstractSpinBoxPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractSpinBox : public QQuickControl +{ + Q_OBJECT + Q_PROPERTY(qreal value READ value WRITE setValue NOTIFY valueChanged FINAL) + Q_PROPERTY(qreal step READ step WRITE setStep NOTIFY stepChanged FINAL) + Q_PROPERTY(QQuickTextInput *input READ input WRITE setInput NOTIFY inputChanged FINAL) + Q_PROPERTY(QValidator *validator READ validator WRITE setValidator NOTIFY validatorChanged FINAL) + Q_PROPERTY(QQuickItem *upButton READ upButton WRITE setUpButton NOTIFY upButtonChanged FINAL) + Q_PROPERTY(QQuickItem *downButton READ downButton WRITE setDownButton NOTIFY downButtonChanged FINAL) + Q_PROPERTY(SubControl pressed READ pressed WRITE setPressed NOTIFY pressedChanged FINAL) + Q_ENUMS(SubControl) + +public: + explicit QQuickAbstractSpinBox(QQuickItem *parent = Q_NULLPTR); + + qreal value() const; + void setValue(qreal value); + + qreal step() const; + void setStep(qreal step); + + QQuickTextInput *input() const; + void setInput(QQuickTextInput *input); + + QValidator *validator() const; + void setValidator(QValidator *validator); + + QQuickItem *upButton() const; + void setUpButton(QQuickItem *button); + + QQuickItem *downButton() const; + void setDownButton(QQuickItem *button); + + enum SubControl { + None, + UpButton, + DownButton + }; + + SubControl pressed() const; + void setPressed(SubControl control); + +public Q_SLOTS: + void increment(); + void decrement(); + +Q_SIGNALS: + void valueChanged(); + void stepChanged(); + void inputChanged(); + void validatorChanged(); + void upButtonChanged(); + void downButtonChanged(); + void pressedChanged(); + +protected: + void keyPressEvent(QKeyEvent *event) 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 componentComplete() Q_DECL_OVERRIDE; + +private: + Q_DISABLE_COPY(QQuickAbstractSpinBox) + Q_DECLARE_PRIVATE(QQuickAbstractSpinBox) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTSPINBOX_P_H diff --git a/src/controls/qquickabstractstackview.cpp b/src/controls/qquickabstractstackview.cpp new file mode 100644 index 00000000..3775e180 --- /dev/null +++ b/src/controls/qquickabstractstackview.cpp @@ -0,0 +1,352 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractstackview_p.h" +#include "qquickabstractcontainer_p_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype StackView + \inherits Container + \instantiates QQuickAbstractStackView + \inqmlmodule QtQuick.Controls + \ingroup navigation + \brief A stack view control. + + TODO +*/ + +class QQuickStackElement +{ + QQuickStackElement() : ownItem(false), item(Q_NULLPTR), ownComponent(false), component(Q_NULLPTR) { } + +public: + static QQuickStackElement *fromString(const QString &str, QQmlEngine *engine, QObject *parent) + { + QQuickStackElement *element = new QQuickStackElement; + element->component = new QQmlComponent(engine, QUrl(str), parent); + element->ownComponent = true; + return element; + } + + static QQuickStackElement *fromObject(QObject *object) + { + QQuickStackElement *element = new QQuickStackElement; + element->component = qobject_cast<QQmlComponent *>(object); + element->item = qobject_cast<QQuickItem *>(object); + return element; + } + + bool ownItem; + QQuickItem *item; + + bool ownComponent; + QQmlComponent *component; +}; + +class QQuickAbstractStackViewPrivate : public QQuickAbstractContainerPrivate +{ + Q_DECLARE_PUBLIC(QQuickAbstractStackView) + +public: + QQuickAbstractStackViewPrivate() : busy(false), depth(0), currentItem(Q_NULLPTR) { } + + void setBusy(bool busy); + void setDepth(int depth); + void setCurrentItem(QQuickItem *item); + + QList<QQuickStackElement *> createElements(const QV4::ScopedValue &value); + QQuickItem *pushElements(const QList<QQuickStackElement *> &elements, QQuickAbstractStackView::Operation operation); + + bool busy; + int depth; + QVariant initialItem; + QQuickItem *currentItem; + QStack<QQuickStackElement *> elements; +}; + +void QQuickAbstractStackViewPrivate::setBusy(bool value) +{ + Q_Q(QQuickAbstractStackView); + if (busy != value) { + busy = value; + emit q->busyChanged(); + } +} + +void QQuickAbstractStackViewPrivate::setDepth(int value) +{ + Q_Q(QQuickAbstractStackView); + if (depth != value) { + depth = value; + emit q->depthChanged(); + } +} + +void QQuickAbstractStackViewPrivate::setCurrentItem(QQuickItem *item) +{ + Q_Q(QQuickAbstractStackView); + if (currentItem != item) { + currentItem = item; + emit q->currentItemChanged(); + } +} + +QList<QQuickStackElement *> QQuickAbstractStackViewPrivate::createElements(const QV4::ScopedValue &value) +{ + Q_Q(QQuickAbstractStackView); + QList<QQuickStackElement *> elements; + if (QV4::String *s = value->asString()) { + qDebug() << "### STRING:" << s->toQString(); + elements += QQuickStackElement::fromString(s->toQString(), qmlEngine(q), q); + } else if (QV4::ArrayObject *a = value->asArrayObject()) { + int len = a->getLength(); + qDebug() << "### ARRAY:" << len; + for (int i = 0; i < len; ++i) { + QV4::Scope scope(a->engine()); + QV4::ScopedValue v(scope, a->getIndexed(i)); + elements += createElements(v); + } + } else if (QV4::QObjectWrapper *o =value->as<QV4::QObjectWrapper>()) { + qDebug() << "### QOBJECT:" << o->object(); + elements += QQuickStackElement::fromObject(o->object()); + } else { + qDebug("### UNKNOWN"); + } + return elements; +} + +QQuickItem *QQuickAbstractStackViewPrivate::pushElements(const QList<QQuickStackElement *> &elems, QQuickAbstractStackView::Operation operation) +{ + Q_Q(QQuickAbstractStackView); + Q_UNUSED(operation); // TODO + if (!elems.isEmpty()) { + foreach (QQuickStackElement *elem, elems) { + elements.push(elem); + } + emit q->depthChanged(); + // TODO: load + return elems.last()->item; + } + return Q_NULLPTR; +} + +QQuickAbstractStackView::QQuickAbstractStackView(QQuickItem *parent) : + QQuickAbstractContainer(*(new QQuickAbstractStackViewPrivate), parent) +{ + setFlag(ItemIsFocusScope); +} + +QQuickAbstractStackView::~QQuickAbstractStackView() +{ + Q_D(QQuickAbstractStackView); + qDeleteAll(d->elements); +} + +/*! + \qmlproperty bool QtQuickControls2::StackView::busy + \readonly + \c true if a transition is running, and \c false otherwise. +*/ +bool QQuickAbstractStackView::busy() const +{ + Q_D(const QQuickAbstractStackView); + return d->busy; +} + +// TODO: remove +void QQuickAbstractStackView::setBusy(bool busy) +{ + Q_D(QQuickAbstractStackView); + d->setBusy(busy); +} + +/*! + \qmlproperty int QtQuickControls2::StackView::depth + \readonly + The number of items currently pushed onto the stack. +*/ +int QQuickAbstractStackView::depth() const +{ + Q_D(const QQuickAbstractStackView); + return d->depth; +} + +// TODO: remove +void QQuickAbstractStackView::setDepth(int depth) +{ + Q_D(QQuickAbstractStackView); + d->setDepth(depth); +} + +/*! + \qmlproperty Item QtQuickControls2::StackView::currentItem + \readonly + The currently top-most item in the stack. +*/ +QQuickItem *QQuickAbstractStackView::currentItem() const +{ + Q_D(const QQuickAbstractStackView); + return d->currentItem; +} + +// TODO: remove +void QQuickAbstractStackView::setCurrentItem(QQuickItem *item) +{ + Q_D(QQuickAbstractStackView); + d->setCurrentItem(item); +} + +QQuickItem *QQuickAbstractStackView::qpush(QQmlV4Function *args) +{ + Q_D(QQuickAbstractStackView); + QV4::ExecutionEngine *v4 = args->v4engine(); + QV4::Scope scope(v4); + + Operation operation = d->elements.isEmpty() ? Immediate : Transition; + QList<QQuickStackElement *> elements; + for (int i = 0; i < args->length(); ++i) { + QV4::ScopedValue value(scope, (*args)[i]); + if (value->isInt32()) + operation = static_cast<Operation>(value->toInt32()); + else + elements += d->createElements(value); + } + return d->pushElements(elements, operation); +} + +QQuickItem *QQuickAbstractStackView::qpop(QQmlV4Function *args) +{ + Q_UNUSED(args); // TODO + return Q_NULLPTR; +} + +void QQuickAbstractStackView::qclear() +{ + // TODO +} + +/*! + \qmlproperty var QtQuickControls2::StackView::initialItem + + The first \l item that should be shown when the StackView is created. + \a initialItem can take same value as the first argument to \l{StackView::push()} + {StackView.push()}. Note that this is just a convenience for writing + \c{Component.onCompleted: stackView.push(myInitialItem)} + + Examples: + + \list + \li initialItem: Qt.resolvedUrl("MyItem.qml") + \li initialItem: myItem + \li initialItem: {"item" : Qt.resolvedUrl("MyRectangle.qml"), "properties" : {"color" : "red"}} + \endlist + \sa push +*/ +QVariant QQuickAbstractStackView::initialItem() const +{ + Q_D(const QQuickAbstractStackView); + return d->initialItem; +} + +void QQuickAbstractStackView::setInitialItem(const QVariant &item) +{ + Q_D(QQuickAbstractStackView); + d->initialItem = item; +} + +void QQuickAbstractStackView::componentComplete() +{ + QQuickAbstractContainer::componentComplete(); + + Q_D(QQuickAbstractStackView); + if (QObject *o = d->initialItem.value<QObject *>()) + d->pushElements(QList<QQuickStackElement *>() << QQuickStackElement::fromObject(o), Immediate); + else if (d->initialItem.canConvert<QString>()) + d->pushElements(QList<QQuickStackElement *>() << QQuickStackElement::fromString(d->initialItem.toString(), qmlEngine(this), this), Immediate); +} + +/*! + \qmltype Stack + \inherits QtObject + \instantiates QQuickStackAttached + \inqmlmodule QtQuick.Controls + \ingroup navigation + \brief TODO + + TODO +*/ + +class QQuickStackAttachedPrivate : public QObjectPrivate +{ +public: + QQuickStackAttachedPrivate() : status(QQuickStackAttached::Inactive) { } + + QQuickStackAttached::Status status; +}; + +QQuickStackAttached::QQuickStackAttached(QObject *parent) : + QObject(*(new QQuickStackAttachedPrivate), parent) +{ +} + +QQuickStackAttached *QQuickStackAttached::qmlAttachedProperties(QObject *object) +{ + return new QQuickStackAttached(object); +} + +/*! + \qmlattachedproperty enumeration QtQuickControls2::Stack::status + + TODO +*/ +QQuickStackAttached::Status QQuickStackAttached::status() const +{ + Q_D(const QQuickStackAttached); + return d->status; +} + +void QQuickStackAttached::setStatus(Status status) +{ + Q_D(QQuickStackAttached); + if (d->status != status) { + d->status = status; + emit statusChanged(); + } +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractstackview_p.h b/src/controls/qquickabstractstackview_p.h new file mode 100644 index 00000000..93545cd1 --- /dev/null +++ b/src/controls/qquickabstractstackview_p.h @@ -0,0 +1,131 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTSTACKVIEW_P_H +#define QQUICKABSTRACTSTACKVIEW_P_H + +#include <QtQuickControls/private/qquickabstractcontainer_p.h> + +QT_BEGIN_NAMESPACE + +class QQmlV4Function; +class QQuickAbstractStackViewPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractStackView : public QQuickAbstractContainer +{ + Q_OBJECT + Q_PROPERTY(bool busy READ busy WRITE setBusy NOTIFY busyChanged FINAL) // TODO: hide setBusy + Q_PROPERTY(int depth READ depth WRITE setDepth NOTIFY depthChanged FINAL) // TODO: hide setDepth + Q_PROPERTY(QQuickItem *currentItem READ currentItem WRITE setCurrentItem NOTIFY currentItemChanged FINAL) // TODO: hide setCurrentItem + Q_PROPERTY(QVariant initialItem READ initialItem WRITE setInitialItem FINAL) + Q_ENUMS(Operation) + +public: + explicit QQuickAbstractStackView(QQuickItem *parent = Q_NULLPTR); + ~QQuickAbstractStackView(); + + bool busy() const; + void setBusy(bool busy); // TODO: hide + + int depth() const; + void setDepth(int depth); // TODO: hide + + QQuickItem *currentItem() const; + void setCurrentItem(QQuickItem *item); // TODO: hide + + QVariant initialItem() const; + void setInitialItem(const QVariant &item); + + enum Operation { + Transition, + Immediate + }; + + Q_INVOKABLE QQuickItem *qpush(QQmlV4Function *args); + Q_INVOKABLE QQuickItem *qpop(QQmlV4Function *args); + +public Q_SLOTS: + void qclear(); + +Q_SIGNALS: + void busyChanged(); + void depthChanged(); + void currentItemChanged(); + +protected: + void componentComplete() Q_DECL_OVERRIDE; + +private: + Q_DISABLE_COPY(QQuickAbstractStackView) + Q_DECLARE_PRIVATE(QQuickAbstractStackView) +}; + +class QQuickStackAttachedPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickStackAttached : public QObject +{ + Q_OBJECT + Q_PROPERTY(Status status READ status WRITE setStatus NOTIFY statusChanged) + Q_ENUMS(Status) + +public: + explicit QQuickStackAttached(QObject *parent = Q_NULLPTR); + + static QQuickStackAttached *qmlAttachedProperties(QObject *object); + + enum Status { + Inactive = 0, + Deactivating = 1, + Activating = 2, + Active = 3 + }; + + Status status() const; + void setStatus(Status status); + +Q_SIGNALS: + void statusChanged(); + +private: + Q_DISABLE_COPY(QQuickStackAttached) + Q_DECLARE_PRIVATE(QQuickStackAttached) +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPEINFO(QQuickStackAttached, QML_HAS_ATTACHED_PROPERTIES) + +#endif // QQUICKABSTRACTSTACKVIEW_P_H diff --git a/src/controls/qquickabstractswitch.cpp b/src/controls/qquickabstractswitch.cpp new file mode 100644 index 00000000..0251a887 --- /dev/null +++ b/src/controls/qquickabstractswitch.cpp @@ -0,0 +1,199 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstractswitch_p.h" +#include "qquickabstractcheckable_p_p.h" + +#include <QtQuick/private/qquickwindow_p.h> + +QT_BEGIN_NAMESPACE + +/*! + \qmltype Switch + \inherits Checkable + \instantiates QQuickAbstractSwitch + \inqmlmodule QtQuick.Controls + \ingroup buttons + \brief A switch control. + + TODO +*/ + +class QQuickAbstractSwitchPrivate : public QQuickAbstractCheckablePrivate +{ + Q_DECLARE_PUBLIC(QQuickAbstractSwitch) + +public: + QQuickAbstractSwitchPrivate() : position(0) { } + + void updatePosition(); + + qreal position; + QPoint pressPoint; +}; + +void QQuickAbstractSwitchPrivate::updatePosition() +{ + Q_Q(QQuickAbstractSwitch); + q->setPosition(checked ? 1.0 : 0.0); +} + +QQuickAbstractSwitch::QQuickAbstractSwitch(QQuickItem *parent) : + QQuickAbstractCheckable(*(new QQuickAbstractSwitchPrivate), parent) +{ + setFiltersChildMouseEvents(true); + QObjectPrivate::connect(this, &QQuickAbstractCheckable::checkedChanged, d_func(), &QQuickAbstractSwitchPrivate::updatePosition); +} + +/*! + \qmlproperty real QtQuickControls2::Switch::position + + TODO +*/ +qreal QQuickAbstractSwitch::position() const +{ + Q_D(const QQuickAbstractSwitch); + return d->position; +} + +void QQuickAbstractSwitch::setPosition(qreal position) +{ + Q_D(QQuickAbstractSwitch); + position = qBound(0.0, position, 1.0); + if (d->position != position) { + d->position = position; + emit positionChanged(); + emit visualPositionChanged(); + } +} + +/*! + \qmlproperty real QtQuickControls2::Switch::visualPosition + + TODO +*/ +qreal QQuickAbstractSwitch::visualPosition() const +{ + Q_D(const QQuickAbstractSwitch); + if (isMirrored()) + return 1.0 - d->position; + return d->position; +} + +void QQuickAbstractSwitch::mirrorChange() +{ + QQuickAbstractCheckable::mirrorChange(); + emit visualPositionChanged(); +} + +bool QQuickAbstractSwitch::childMouseEventFilter(QQuickItem *child, QEvent *event) +{ + if (child == indicator()) { + switch (event->type()) { + case QEvent::MouseButtonPress: + return handleMousePressEvent(child, static_cast<QMouseEvent *>(event)); + case QEvent::MouseMove: + return handleMouseMoveEvent(child, static_cast<QMouseEvent *>(event)); + case QEvent::MouseButtonRelease: + return handleMouseReleaseEvent(child, static_cast<QMouseEvent *>(event)); + case QEvent::UngrabMouse: + return handleMouseUngrabEvent(child); + default: + return false; + } + } + return false; +} + +bool QQuickAbstractSwitch::handleMousePressEvent(QQuickItem *child, QMouseEvent *event) +{ + Q_D(QQuickAbstractSwitch); + Q_UNUSED(child); + d->pressPoint = event->pos(); + setPressed(true); + event->accept(); + return true; +} + +bool QQuickAbstractSwitch::handleMouseMoveEvent(QQuickItem *child, QMouseEvent *event) +{ + Q_D(QQuickAbstractSwitch); + if (!child->keepMouseGrab()) + child->setKeepMouseGrab(QQuickWindowPrivate::dragOverThreshold(event->pos().x() - d->pressPoint.x(), Qt::XAxis, event)); + if (child->keepMouseGrab()) { + setPosition(positionAt(event->pos())); + event->accept(); + } + return true; +} + +bool QQuickAbstractSwitch::handleMouseReleaseEvent(QQuickItem *child, QMouseEvent *event) +{ + Q_D(QQuickAbstractSwitch); + d->pressPoint = QPoint(); + setPressed(false); + if (child->keepMouseGrab()) { + setChecked(position() > 0.5); + setPosition(isChecked() ? 1.0 : 0.0); + child->setKeepMouseGrab(false); + } else { + emit clicked(); + toggle(); + } + event->accept(); + return true; +} + +bool QQuickAbstractSwitch::handleMouseUngrabEvent(QQuickItem *child) +{ + Q_D(QQuickAbstractSwitch); + Q_UNUSED(child); + d->pressPoint = QPoint(); + setChecked(position() > 0.5); + setPosition(isChecked() ? 1.0 : 0.0); + setPressed(false); + return true; +} + +qreal QQuickAbstractSwitch::positionAt(const QPoint &point) const +{ + qreal pos = point.x() / indicator()->width(); + if (isMirrored()) + return 1.0 - pos; + return pos; +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstractswitch_p.h b/src/controls/qquickabstractswitch_p.h new file mode 100644 index 00000000..7585d80f --- /dev/null +++ b/src/controls/qquickabstractswitch_p.h @@ -0,0 +1,82 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTSWITCH_P_H +#define QQUICKABSTRACTSWITCH_P_H + +#include <QtQuickControls/private/qquickabstractcheckable_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractSwitchPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractSwitch : public QQuickAbstractCheckable +{ + Q_OBJECT + Q_PROPERTY(qreal position READ position WRITE setPosition NOTIFY positionChanged FINAL) + Q_PROPERTY(qreal visualPosition READ visualPosition NOTIFY visualPositionChanged FINAL) + +public: + explicit QQuickAbstractSwitch(QQuickItem *parent = Q_NULLPTR); + + qreal position() const; + void setPosition(qreal position); + + qreal visualPosition() const; + +Q_SIGNALS: + void positionChanged(); + void visualPositionChanged(); + +protected: + void mirrorChange() Q_DECL_OVERRIDE; + bool childMouseEventFilter(QQuickItem *child, QEvent *event) Q_DECL_OVERRIDE; + + bool handleMousePressEvent(QQuickItem *child, QMouseEvent *event); + bool handleMouseMoveEvent(QQuickItem *child, QMouseEvent *event); + bool handleMouseReleaseEvent(QQuickItem *child, QMouseEvent *event); + bool handleMouseUngrabEvent(QQuickItem *child); + + virtual qreal positionAt(const QPoint &point) const; + +private: + Q_DISABLE_COPY(QQuickAbstractSwitch) + Q_DECLARE_PRIVATE(QQuickAbstractSwitch) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTSWITCH_P_H diff --git a/src/controls/qquickabstracttabbar.cpp b/src/controls/qquickabstracttabbar.cpp new file mode 100644 index 00000000..2917a3b7 --- /dev/null +++ b/src/controls/qquickabstracttabbar.cpp @@ -0,0 +1,88 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstracttabbar_p.h" +#include "qquickabstractcontainer_p_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype TabBar + \inherits Container + \instantiates QQuickAbstractTabBar + \inqmlmodule QtQuick.Controls + \ingroup tabs + \brief A tab bar control. + + TODO +*/ + +class QQuickAbstractTabBarPrivate : public QQuickAbstractContainerPrivate +{ +public: + QQuickAbstractTabBarPrivate() : currentIndex(0) { } + + int currentIndex; +}; + +QQuickAbstractTabBar::QQuickAbstractTabBar(QQuickItem *parent) : + QQuickAbstractContainer(*(new QQuickAbstractTabBarPrivate), parent) +{ + setFlag(ItemIsFocusScope); + setActiveFocusOnTab(true); +} + +/*! + \qmlproperty int QtQuickControls2::TabBar::currentIndex + + TODO +*/ +int QQuickAbstractTabBar::currentIndex() const +{ + Q_D(const QQuickAbstractTabBar); + return d->currentIndex; +} + +void QQuickAbstractTabBar::setCurrentIndex(int index) +{ + Q_D(QQuickAbstractTabBar); + if (d->currentIndex != index) { + d->currentIndex = index; + emit currentIndexChanged(index); + } +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstracttabbar_p.h b/src/controls/qquickabstracttabbar_p.h new file mode 100644 index 00000000..30e97959 --- /dev/null +++ b/src/controls/qquickabstracttabbar_p.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTTABBAR_P_H +#define QQUICKABSTRACTTABBAR_P_H + +#include <QtQuickControls/private/qquickabstractcontainer_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractTabBarPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractTabBar : public QQuickAbstractContainer +{ + Q_OBJECT + Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged FINAL) + +public: + explicit QQuickAbstractTabBar(QQuickItem *parent = Q_NULLPTR); + + int currentIndex() const; + +public Q_SLOTS: + void setCurrentIndex(int index); + +Q_SIGNALS: + void currentIndexChanged(int index); + +private: + Q_DISABLE_COPY(QQuickAbstractTabBar) + Q_DECLARE_PRIVATE(QQuickAbstractTabBar) + friend class QQuickAbstractTabView; +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTTABBAR_P_H diff --git a/src/controls/qquickabstracttabbutton.cpp b/src/controls/qquickabstracttabbutton.cpp new file mode 100644 index 00000000..df2b2c92 --- /dev/null +++ b/src/controls/qquickabstracttabbutton.cpp @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstracttabbutton_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype TabButton + \inherits Checkable + \instantiates QQuickAbstractTabButton + \inqmlmodule QtQuick.Controls + \ingroup tabs + \brief A tab button control. + + TODO +*/ + +QQuickAbstractTabButton::QQuickAbstractTabButton(QQuickItem *parent) : + QQuickAbstractCheckable(parent) +{ + setExclusive(true); +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstracttabbutton_p.h b/src/controls/qquickabstracttabbutton_p.h new file mode 100644 index 00000000..aeabb608 --- /dev/null +++ b/src/controls/qquickabstracttabbutton_p.h @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTTABBUTTON_P_H +#define QQUICKABSTRACTTABBUTTON_P_H + +#include <QtQuickControls/private/qquickabstractcheckable_p.h> + +QT_BEGIN_NAMESPACE + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractTabButton : public QQuickAbstractCheckable +{ + Q_OBJECT + +public: + explicit QQuickAbstractTabButton(QQuickItem *parent = Q_NULLPTR); +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTTABBUTTON_P_H diff --git a/src/controls/qquickabstracttabview.cpp b/src/controls/qquickabstracttabview.cpp new file mode 100644 index 00000000..d9ae0090 --- /dev/null +++ b/src/controls/qquickabstracttabview.cpp @@ -0,0 +1,231 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstracttabview_p.h" +#include "qquickabstracttabbar_p.h" +#include "qquickabstractcontainer_p_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype TabView + \inherits Container + \instantiates QQuickAbstractTabView + \inqmlmodule QtQuick.Controls + \ingroup tabs + \brief A tab view control. + + TODO +*/ + +class QQuickAbstractTabViewPrivate : public QQuickAbstractContainerPrivate +{ +public: + QQuickAbstractTabViewPrivate() : currentIndex(0), bar(Q_NULLPTR) { } + + int currentIndex; + QQuickAbstractTabBar *bar; +}; + +QQuickAbstractTabView::QQuickAbstractTabView(QQuickItem *parent) : + QQuickAbstractContainer(*(new QQuickAbstractTabViewPrivate), parent) +{ + setFlag(ItemIsFocusScope); + setActiveFocusOnTab(true); +} + +/*! + \qmlproperty int QtQuickControls2::TabView::currentIndex + + TODO +*/ +int QQuickAbstractTabView::currentIndex() const +{ + Q_D(const QQuickAbstractTabView); + return d->currentIndex; +} + +void QQuickAbstractTabView::setCurrentIndex(int index) +{ + Q_D(QQuickAbstractTabView); + if (d->currentIndex != index) { + d->currentIndex = index; + emit currentIndexChanged(index); + } +} + +/*! + \qmlproperty TabBar QtQuickControls2::TabView::tabBar + + TODO +*/ +QQuickAbstractTabBar *QQuickAbstractTabView::tabBar() const +{ + Q_D(const QQuickAbstractTabView); + return d->bar; +} + +void QQuickAbstractTabView::setTabBar(QQuickAbstractTabBar *bar) +{ + Q_D(QQuickAbstractTabView); + if (d->bar != bar) { + if (d->bar) { + disconnect(this, &QQuickAbstractTabView::currentIndexChanged, d->bar, &QQuickAbstractTabBar::setCurrentIndex); + disconnect(d->bar, &QQuickAbstractTabBar::currentIndexChanged, this, &QQuickAbstractTabView::setCurrentIndex); + if (d->bar->parentItem() == this) + delete d->bar; + } + d->bar = bar; + if (bar) { + connect(this, &QQuickAbstractTabView::currentIndexChanged, d->bar, &QQuickAbstractTabBar::setCurrentIndex); + connect(bar, &QQuickAbstractTabBar::currentIndexChanged, this, &QQuickAbstractTabView::setCurrentIndex); + if (!bar->parentItem()) + bar->setParentItem(this); + + int barIndex = bar->currentIndex(); + if (d->currentIndex != barIndex) { + if (d->currentIndex != -1) + bar->setCurrentIndex(d->currentIndex); + else if (barIndex != -1) + setCurrentIndex(barIndex); + } + } + emit tabBarChanged(); + } +} + +void QQuickAbstractTabView::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) +{ + Q_D(QQuickAbstractTabView); + QQuickControl::geometryChanged(newGeometry, oldGeometry); + if (d->bar && (!d->bar->widthValid() || qFuzzyCompare(d->bar->width(), oldGeometry.width()))) + d->bar->setWidth(newGeometry.width()); +} + +/*! + \qmltype Tab + \inherits QtObject + \instantiates QQuickTabAttached + \inqmlmodule QtQuick.Controls + \ingroup tabs + \brief TODO + + TODO +*/ + +QQuickTabAttached::QQuickTabAttached(QObject *parent) : + QObject(parent), m_index(-1), m_visible(true), m_view(Q_NULLPTR) +{ +} + +QQuickTabAttached *QQuickTabAttached::qmlAttachedProperties(QObject *object) +{ + return new QQuickTabAttached(object); +} + +/*! + \qmlattachedproperty int QtQuickControls2::Tab::index + + TODO +*/ +int QQuickTabAttached::index() const +{ + return m_index; +} + +void QQuickTabAttached::setIndex(int index) +{ + if (m_index != index) { + m_index = index; + emit indexChanged(); + } +} + +/*! + \qmlattachedproperty string QtQuickControls2::Tab::title + + TODO +*/ +QString QQuickTabAttached::title() const +{ + return m_title; +} + +void QQuickTabAttached::setTitle(const QString &title) +{ + if (m_title != title) { + m_title = title; + emit titleChanged(); + } +} + +/*! + \qmlattachedproperty bool QtQuickControls2::Tab::visible + + TODO +*/ +bool QQuickTabAttached::isVisible() const +{ + return m_visible; +} + +void QQuickTabAttached::setVisible(bool visible) +{ + if (m_visible != visible) { + m_visible = visible; + emit visibleChanged(); + } +} + +/*! + \qmlattachedproperty TabView QtQuickControls2::Tab::view + + TODO +*/ +QQuickAbstractTabView *QQuickTabAttached::view() const +{ + return m_view; +} + +void QQuickTabAttached::setView(QQuickAbstractTabView *view) +{ + if (m_view != view) { + m_view = view; + emit viewChanged(); + } +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstracttabview_p.h b/src/controls/qquickabstracttabview_p.h new file mode 100644 index 00000000..e92ce2e5 --- /dev/null +++ b/src/controls/qquickabstracttabview_p.h @@ -0,0 +1,118 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTTABVIEW_P_H +#define QQUICKABSTRACTTABVIEW_P_H + +#include <QtQuickControls/private/qquickabstractcontainer_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractTabBar; +class QQuickAbstractTabViewPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractTabView : public QQuickAbstractContainer +{ + Q_OBJECT + Q_PROPERTY(int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged FINAL) + Q_PROPERTY(QQuickAbstractTabBar *tabBar READ tabBar WRITE setTabBar NOTIFY tabBarChanged FINAL) + +public: + explicit QQuickAbstractTabView(QQuickItem *parent = Q_NULLPTR); + + int currentIndex() const; + + QQuickAbstractTabBar *tabBar() const; + void setTabBar(QQuickAbstractTabBar *bar); + +public Q_SLOTS: + void setCurrentIndex(int index); + +Q_SIGNALS: + void currentIndexChanged(int index); + void tabBarChanged(); + +protected: + void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; + +private: + Q_DISABLE_COPY(QQuickAbstractTabView) + Q_DECLARE_PRIVATE(QQuickAbstractTabView) +}; + +class Q_QUICKCONTROLS_EXPORT QQuickTabAttached : public QObject +{ + Q_OBJECT + Q_PROPERTY(int index READ index WRITE setIndex NOTIFY indexChanged FINAL) + Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged FINAL) + Q_PROPERTY(bool visible READ isVisible WRITE setVisible NOTIFY visibleChanged FINAL) + Q_PROPERTY(QQuickAbstractTabView *view READ view WRITE setView NOTIFY viewChanged FINAL) + +public: + explicit QQuickTabAttached(QObject *parent = Q_NULLPTR); + + static QQuickTabAttached *qmlAttachedProperties(QObject *object); + + int index() const; + void setIndex(int index); + + QString title() const; + void setTitle(const QString &title); + + bool isVisible() const; + void setVisible(bool visible); + + QQuickAbstractTabView *view() const; + void setView(QQuickAbstractTabView *view); + +Q_SIGNALS: + void indexChanged(); + void titleChanged(); + void visibleChanged(); + void viewChanged(); + +private: + int m_index; + bool m_visible; + QString m_title; + QQuickAbstractTabView *m_view; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPEINFO(QQuickTabAttached, QML_HAS_ATTACHED_PROPERTIES) + +#endif // QQUICKABSTRACTTABVIEW_P_H diff --git a/src/controls/qquickabstracttextarea.cpp b/src/controls/qquickabstracttextarea.cpp new file mode 100644 index 00000000..41e24684 --- /dev/null +++ b/src/controls/qquickabstracttextarea.cpp @@ -0,0 +1,129 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstracttextarea_p.h" +#include "qquickcontrol_p_p.h" + +#include <QtQuick/private/qquicktext_p.h> +#include <QtQuick/private/qquicktextedit_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractTextAreaPrivate : public QQuickControlPrivate +{ + Q_DECLARE_PUBLIC(QQuickAbstractTextArea) + +public: + QQuickAbstractTextAreaPrivate() : edit(Q_NULLPTR), placeholder(Q_NULLPTR) { } + + void updateText(); + + QString text; + QQuickTextEdit *edit; + QQuickText *placeholder; +}; + +void QQuickAbstractTextAreaPrivate::updateText() +{ + Q_Q(QQuickAbstractTextArea); + q->setText(edit->text()); +} + +QQuickAbstractTextArea::QQuickAbstractTextArea(QQuickItem *parent) : + QQuickControl(*(new QQuickAbstractTextAreaPrivate), parent) +{ + setFlag(ItemIsFocusScope); + setActiveFocusOnTab(true); +} + +QString QQuickAbstractTextArea::text() const +{ + Q_D(const QQuickAbstractTextArea); + return d->text; +} + +void QQuickAbstractTextArea::setText(const QString &text) +{ + Q_D(QQuickAbstractTextArea); + if (d->text != text) { + d->text = text; + if (d->edit) + d->edit->setText(text); + emit textChanged(); + } +} + +QQuickTextEdit *QQuickAbstractTextArea::edit() const +{ + Q_D(const QQuickAbstractTextArea); + return d->edit; +} + +void QQuickAbstractTextArea::setEdit(QQuickTextEdit *edit) +{ + Q_D(QQuickAbstractTextArea); + if (d->edit != edit) { + delete d->edit; + d->edit = edit; + if (edit) { + if (!edit->parentItem()) + edit->setParentItem(this); + edit->setText(d->text); + QObjectPrivate::connect(edit, &QQuickTextEdit::textChanged, d, &QQuickAbstractTextAreaPrivate::updateText); + } + emit editChanged(); + } +} + +QQuickText *QQuickAbstractTextArea::placeholder() const +{ + Q_D(const QQuickAbstractTextArea); + return d->placeholder; +} + +void QQuickAbstractTextArea::setPlaceholder(QQuickText *placeholder) +{ + Q_D(QQuickAbstractTextArea); + if (d->placeholder != placeholder) { + delete d->placeholder; + d->placeholder = placeholder; + if (placeholder && !placeholder->parentItem()) + placeholder->setParentItem(this); + emit placeholderChanged(); + } +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstracttextarea_p.h b/src/controls/qquickabstracttextarea_p.h new file mode 100644 index 00000000..e5c8d0b7 --- /dev/null +++ b/src/controls/qquickabstracttextarea_p.h @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTTEXTAREA_P_H +#define QQUICKABSTRACTTEXTAREA_P_H + +#include <QtQuickControls/private/qquickcontrol_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickText; +class QQuickTextEdit; +class QQuickAbstractTextAreaPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractTextArea : public QQuickControl +{ + Q_OBJECT + Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged FINAL) + Q_PROPERTY(QQuickTextEdit *edit READ edit WRITE setEdit NOTIFY editChanged FINAL) + Q_PROPERTY(QQuickText *placeholder READ placeholder WRITE setPlaceholder NOTIFY placeholderChanged FINAL) + +public: + explicit QQuickAbstractTextArea(QQuickItem *parent = Q_NULLPTR); + + QString text() const; + void setText(const QString &text); + + QQuickTextEdit *edit() const; + void setEdit(QQuickTextEdit *edit); + + QQuickText *placeholder() const; + void setPlaceholder(QQuickText *placeholder); + +Q_SIGNALS: + void textChanged(); + void editChanged(); + void placeholderChanged(); + +private: + Q_DISABLE_COPY(QQuickAbstractTextArea) + Q_DECLARE_PRIVATE(QQuickAbstractTextArea) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTTEXTAREA_P_H diff --git a/src/controls/qquickabstracttextfield.cpp b/src/controls/qquickabstracttextfield.cpp new file mode 100644 index 00000000..70e53ab3 --- /dev/null +++ b/src/controls/qquickabstracttextfield.cpp @@ -0,0 +1,130 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstracttextfield_p.h" +#include "qquickcontrol_p_p.h" + +#include <QtQuick/private/qquicktext_p.h> +#include <QtQuick/private/qquicktextinput_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractTextFieldPrivate : public QQuickControlPrivate +{ + Q_DECLARE_PUBLIC(QQuickAbstractTextField) + +public: + QQuickAbstractTextFieldPrivate() : input(Q_NULLPTR), placeholder(Q_NULLPTR) { } + + void updateText(); + + QString text; + QQuickTextInput *input; + QQuickText *placeholder; +}; + + +void QQuickAbstractTextFieldPrivate::updateText() +{ + Q_Q(QQuickAbstractTextField); + q->setText(input->text()); +} + +QQuickAbstractTextField::QQuickAbstractTextField(QQuickItem *parent) : + QQuickControl(*(new QQuickAbstractTextFieldPrivate), parent) +{ + setFlag(ItemIsFocusScope); + setActiveFocusOnTab(true); +} + +QString QQuickAbstractTextField::text() const +{ + Q_D(const QQuickAbstractTextField); + return d->text; +} + +void QQuickAbstractTextField::setText(const QString &text) +{ + Q_D(QQuickAbstractTextField); + if (d->text != text) { + d->text = text; + if (d->input) + d->input->setText(text); + emit textChanged(); + } +} + +QQuickTextInput *QQuickAbstractTextField::input() const +{ + Q_D(const QQuickAbstractTextField); + return d->input; +} + +void QQuickAbstractTextField::setInput(QQuickTextInput *input) +{ + Q_D(QQuickAbstractTextField); + if (d->input != input) { + delete d->input; + d->input = input; + if (input) { + if (!input->parentItem()) + input->setParentItem(this); + input->setText(d->text); + QObjectPrivate::connect(input, &QQuickTextInput::textChanged, d, &QQuickAbstractTextFieldPrivate::updateText); + } + emit inputChanged(); + } +} + +QQuickText *QQuickAbstractTextField::placeholder() const +{ + Q_D(const QQuickAbstractTextField); + return d->placeholder; +} + +void QQuickAbstractTextField::setPlaceholder(QQuickText *placeholder) +{ + Q_D(QQuickAbstractTextField); + if (d->placeholder != placeholder) { + delete d->placeholder; + d->placeholder = placeholder; + if (placeholder && !placeholder->parentItem()) + placeholder->setParentItem(this); + emit placeholderChanged(); + } +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstracttextfield_p.h b/src/controls/qquickabstracttextfield_p.h new file mode 100644 index 00000000..d274c43c --- /dev/null +++ b/src/controls/qquickabstracttextfield_p.h @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTTEXTFIELD_P_H +#define QQUICKABSTRACTTEXTFIELD_P_H + +#include <QtQuickControls/private/qquickcontrol_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickText; +class QQuickTextInput; +class QQuickAbstractTextFieldPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractTextField : public QQuickControl +{ + Q_OBJECT + Q_PROPERTY(QString text READ text WRITE setText NOTIFY textChanged FINAL) + Q_PROPERTY(QQuickTextInput *input READ input WRITE setInput NOTIFY inputChanged FINAL) + Q_PROPERTY(QQuickText *placeholder READ placeholder WRITE setPlaceholder NOTIFY placeholderChanged FINAL) + +public: + explicit QQuickAbstractTextField(QQuickItem *parent = Q_NULLPTR); + + QString text() const; + void setText(const QString &text); + + QQuickTextInput *input() const; + void setInput(QQuickTextInput *input); + + QQuickText *placeholder() const; + void setPlaceholder(QQuickText *placeholder); + +Q_SIGNALS: + void textChanged(); + void inputChanged(); + void placeholderChanged(); + +private: + Q_DISABLE_COPY(QQuickAbstractTextField) + Q_DECLARE_PRIVATE(QQuickAbstractTextField) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTTEXTFIELD_P_H diff --git a/src/controls/qquickabstracttogglebutton.cpp b/src/controls/qquickabstracttogglebutton.cpp new file mode 100644 index 00000000..663817e0 --- /dev/null +++ b/src/controls/qquickabstracttogglebutton.cpp @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstracttogglebutton_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype ToggleButton + \inherits Checkable + \instantiates QQuickAbstractToggleButton + \inqmlmodule QtQuick.Controls + \ingroup buttons + \brief A toggle button control. + + TODO +*/ + +QQuickAbstractToggleButton::QQuickAbstractToggleButton(QQuickItem *parent) : + QQuickAbstractSwitch(parent) +{ +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstracttogglebutton_p.h b/src/controls/qquickabstracttogglebutton_p.h new file mode 100644 index 00000000..d51de56c --- /dev/null +++ b/src/controls/qquickabstracttogglebutton_p.h @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTTOGGLEBUTTON_P_H +#define QQUICKABSTRACTTOGGLEBUTTON_P_H + +#include <QtQuickControls/private/qquickabstractswitch_p.h> + +QT_BEGIN_NAMESPACE + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractToggleButton : public QQuickAbstractSwitch +{ + Q_OBJECT + +public: + explicit QQuickAbstractToggleButton(QQuickItem *parent = Q_NULLPTR); +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTTOGGLEBUTTON_P_H diff --git a/src/controls/qquickabstracttoolbar.cpp b/src/controls/qquickabstracttoolbar.cpp new file mode 100644 index 00000000..29119be0 --- /dev/null +++ b/src/controls/qquickabstracttoolbar.cpp @@ -0,0 +1,57 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickabstracttoolbar_p.h" + +QT_BEGIN_NAMESPACE + +/*! + \qmltype ToolBar + \inherits Container + \instantiates QQuickAbstractToolBar + \inqmlmodule QtQuick.Controls + \ingroup containers + \brief A tool bar control. + + TODO +*/ + +QQuickAbstractToolBar::QQuickAbstractToolBar(QQuickItem *parent) : + QQuickAbstractContainer(parent) +{ +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickabstracttoolbar_p.h b/src/controls/qquickabstracttoolbar_p.h new file mode 100644 index 00000000..3a7bb885 --- /dev/null +++ b/src/controls/qquickabstracttoolbar_p.h @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKABSTRACTTOOLBAR_P_H +#define QQUICKABSTRACTTOOLBAR_P_H + +#include <QtQuickControls/private/qquickabstractcontainer_p.h> + +QT_BEGIN_NAMESPACE + +class Q_QUICKCONTROLS_EXPORT QQuickAbstractToolBar : public QQuickAbstractContainer +{ + Q_OBJECT + +public: + explicit QQuickAbstractToolBar(QQuickItem *parent = Q_NULLPTR); +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTTOOLBAR_P_H diff --git a/src/controls/qquickcontrol.cpp b/src/controls/qquickcontrol.cpp new file mode 100644 index 00000000..65db0e96 --- /dev/null +++ b/src/controls/qquickcontrol.cpp @@ -0,0 +1,232 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickcontrol_p.h" +#include "qquickcontrol_p_p.h" +#include "qquickabstractapplicationwindow_p.h" +#include <QtCore/qcoreapplication.h> + +QT_BEGIN_NAMESPACE + +/*! + \qmltype Control + \inherits Item + \instantiates QQuickControl + \inqmlmodule QtQuick.Controls + \brief A basic control type. + + TODO +*/ + +QQuickControlPrivate::QQuickControlPrivate() : + style(Q_NULLPTR), attributes(QQuickControl::Attr_Count), background(Q_NULLPTR), padding(Q_NULLPTR) +{ +} + +void QQuickControlPrivate::mirrorChange() +{ + Q_Q(QQuickControl); + q->mirrorChange(); +} + +void QQuickControlPrivate::resolveStyle(QQuickStyle *res) +{ + Q_Q(QQuickControl); + if (!res && q->testAttribute(QQuickControl::Attr_HasStyle)) + return; + + // lookup parent style + if (!res) { + QQuickItem *item = q->parentItem(); + while (!res && item) { + QQuickControl *control = qobject_cast<QQuickControl *>(item); + if (control && control->testAttribute(QQuickControl::Attr_HasStyle)) + res = control->style(); + item = item->parentItem(); + } + } + + // fallback to window or global style + if (!res) { + QQuickAbstractApplicationWindow *aw = qobject_cast<QQuickAbstractApplicationWindow *>(window); + if (aw) + res = aw->style(); + if (!res) + res = QQuickStyle::instance(qmlEngine(q)); + } + + if (style != res) { + style = res; + emit q->styleChanged(); + } +} + +QQuickControl::QQuickControl(QQuickItem *parent) : + QQuickItem(*(new QQuickControlPrivate), parent) +{ +} + +QQuickControl::QQuickControl(QQuickControlPrivate &dd, QQuickItem *parent) : + QQuickItem(dd, parent) +{ +} + +/*! + \qmlpropertygroup QtQuickControls2::Control::padding + \qmlproperty real QtQuickControls2::Control::padding.top + \qmlproperty real QtQuickControls2::Control::padding.left + \qmlproperty real QtQuickControls2::Control::padding.right + \qmlproperty real QtQuickControls2::Control::padding.bottom + + This property holds the padding. +*/ +QQuickPadding *QQuickControl::padding() const +{ + Q_D(const QQuickControl); + if (!d->padding) + d->padding = new QQuickPadding(const_cast<QQuickControl *>(this)); + return d->padding; +} + +/*! + \qmlproperty Style QtQuickControls2::Control::style + + This property holds the style. +*/ +QQuickStyle *QQuickControl::style() const +{ + Q_D(const QQuickControl); + if (!d->style) + const_cast<QQuickControl *>(this)->d_func()->resolveStyle(); + return d->style; +} + +void QQuickControl::setStyle(QQuickStyle *style) +{ + Q_D(QQuickControl); + if (d->style != style) { + setAttribute(Attr_HasStyle, style); + d->resolveStyle(style); + + QEvent change(QEvent::StyleChange); + foreach (QQuickControl *control, findChildren<QQuickControl *>()) + QCoreApplication::sendEvent(control, &change); + } +} + +void QQuickControl::resetStyle() +{ + setStyle(Q_NULLPTR); +} + +/*! + \qmlproperty Item QtQuickControls2::Control::background + + This property holds the background item. +*/ +QQuickItem *QQuickControl::background() const +{ + Q_D(const QQuickControl); + return d->background; +} + +void QQuickControl::setBackground(QQuickItem *background) +{ + Q_D(QQuickControl); + if (d->background != background) { + delete d->background; + d->background = background; + if (background) { + background->setParentItem(this); + if (qFuzzyIsNull(background->z())) + background->setZ(-1); + } + emit backgroundChanged(); + } +} + +bool QQuickControl::testAttribute(Attribute attribute) const +{ + Q_D(const QQuickControl); + return d->attributes.testBit(attribute); +} + +void QQuickControl::setAttribute(Attribute attribute, bool on) +{ + Q_D(QQuickControl); + d->attributes.setBit(attribute, on); +} + +bool QQuickControl::event(QEvent *event) +{ + Q_D(QQuickControl); + if (event->type() == QEvent::StyleChange) + d->resolveStyle(); + return QQuickItem::event(event); +} + +void QQuickControl::itemChange(ItemChange change, const ItemChangeData &data) +{ + Q_D(QQuickControl); + QQuickItem::itemChange(change, data); + if (change == ItemSceneChange || change == ItemParentHasChanged) + d->resolveStyle(); +} + +void QQuickControl::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) +{ + Q_D(QQuickControl); + QQuickItem::geometryChanged(newGeometry, oldGeometry); + if (d->background) { + QQuickItemPrivate *p = QQuickItemPrivate::get(d->background); + if (!p->widthValid || qFuzzyCompare(d->background->width(), oldGeometry.width())) + d->background->setWidth(newGeometry.width()); + if (!p->heightValid || qFuzzyCompare(d->background->height(), oldGeometry.height())) + d->background->setHeight(newGeometry.height()); + } +} + +bool QQuickControl::isMirrored() const +{ + Q_D(const QQuickControl); + return d->isMirrored(); +} + +void QQuickControl::mirrorChange() +{ +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickcontrol_p.h b/src/controls/qquickcontrol_p.h new file mode 100644 index 00000000..48ceedcc --- /dev/null +++ b/src/controls/qquickcontrol_p.h @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKCONTROL_P_H +#define QQUICKCONTROL_P_H + +#include <QtQuick/qquickitem.h> +#include <QtQuickControls/private/qtquickcontrolsglobal_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickStyle; +class QQuickPadding; +class QQuickControlPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickControl : public QQuickItem +{ + Q_OBJECT + Q_PROPERTY(QQuickPadding *padding READ padding CONSTANT FINAL) + Q_PROPERTY(QQuickStyle *style READ style WRITE setStyle RESET resetStyle NOTIFY styleChanged FINAL) + Q_PROPERTY(QQuickItem *background READ background WRITE setBackground NOTIFY backgroundChanged FINAL) + +public: + explicit QQuickControl(QQuickItem *parent = Q_NULLPTR); + + QQuickPadding *padding() const; + + QQuickStyle *style() const; + void setStyle(QQuickStyle *style); + void resetStyle(); + + QQuickItem *background() const; + void setBackground(QQuickItem *background); + + enum Attribute { + Attr_HasStyle = 1, + Attr_Count + }; + + bool testAttribute(Attribute attribute) const; + void setAttribute(Attribute attribute, bool on = true); + +Q_SIGNALS: + void styleChanged(); + void backgroundChanged(); + +protected: + QQuickControl(QQuickControlPrivate &dd, QQuickItem *parent); + + bool event(QEvent *event) Q_DECL_OVERRIDE; + void itemChange(ItemChange, const ItemChangeData &data) Q_DECL_OVERRIDE; + void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; + + bool isMirrored() const; + virtual void mirrorChange(); + +private: + Q_DISABLE_COPY(QQuickControl) + Q_DECLARE_PRIVATE(QQuickControl) +}; + +QT_END_NAMESPACE + +#endif // QQUICKCONTROL_P_H diff --git a/src/controls/qquickcontrol_p_p.h b/src/controls/qquickcontrol_p_p.h new file mode 100644 index 00000000..7ef5dec0 --- /dev/null +++ b/src/controls/qquickcontrol_p_p.h @@ -0,0 +1,65 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKCONTROL_P_P_H +#define QQUICKCONTROL_P_P_H + +#include <QtQuick/private/qquickitem_p.h> +#include <QtQuickControls/private/qquickstyle_p.h> +#include <QtQuickControls/private/qquickpadding_p.h> + +QT_BEGIN_NAMESPACE + +class Q_QUICKCONTROLS_EXPORT QQuickControlPrivate : public QQuickItemPrivate +{ + Q_DECLARE_PUBLIC(QQuickControl) + +public: + QQuickControlPrivate(); + + void mirrorChange() Q_DECL_OVERRIDE; + + void resolveStyle(QQuickStyle *other = 0); + + QQuickStyle *style; + QBitArray attributes; + QQuickItem *background; + mutable QQuickPadding *padding; +}; + +QT_END_NAMESPACE + +#endif // QQUICKCONTROL_P_P_H diff --git a/src/controls/qquickexclusivegroup.cpp b/src/controls/qquickexclusivegroup.cpp new file mode 100644 index 00000000..325dfe19 --- /dev/null +++ b/src/controls/qquickexclusivegroup.cpp @@ -0,0 +1,178 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickexclusivegroup_p.h" +#include <QtCore/private/qobject_p.h> +#include <QtCore/qvariant.h> + +QT_BEGIN_NAMESPACE + +/*! + \qmltype ExclusiveGroup + \inherits QtObject + \instantiates QQuickExclusiveGroup + \inqmlmodule QtQuick.Controls + \ingroup utilities + \brief A non-visual mutually exclusive group of checkable controls. + + TODO +*/ + +class QQuickExclusiveGroupPrivate : public QObjectPrivate +{ + Q_DECLARE_PUBLIC(QQuickExclusiveGroup) + +public: + QQuickExclusiveGroupPrivate() : current(Q_NULLPTR) { } + + void _q_updateCurrent(); + + QObject *current; +}; + +void QQuickExclusiveGroupPrivate::_q_updateCurrent() +{ + Q_Q(QQuickExclusiveGroup); + QObject *object = q->sender(); + if (object->property("checked").toBool()) + q->setCurrent(object); +} + +QQuickExclusiveGroup::QQuickExclusiveGroup(QObject *parent) + : QObject(*(new QQuickExclusiveGroupPrivate), parent) +{ +} + +/*! + \qmlproperty QtObject QtQuickControls2::ExclusiveGroup::current + + TODO +*/ +QObject *QQuickExclusiveGroup::current() const +{ + Q_D(const QQuickExclusiveGroup); + return d->current; +} + +void QQuickExclusiveGroup::setCurrent(QObject *current) +{ + Q_D(QQuickExclusiveGroup); + if (d->current != current) { + if (d->current) + d->current->setProperty("checked", false); + d->current = current; + if (current) + current->setProperty("checked", true); + emit currentChanged(); + } +} + +/*! + \qmlmethod void QtQuickControls2::ExclusiveGroup::addCheckable(QtObject object) + + TODO +*/ +void QQuickExclusiveGroup::addCheckable(QObject *object) +{ + connect(object, SIGNAL(checkedChanged()), this, SLOT(_q_updateCurrent()), Qt::UniqueConnection); + connect(object, SIGNAL(destroyed(QObject*)), this, SLOT(removeCheckable(QObject*)), Qt::UniqueConnection); + + if (object->property("checked").toBool()) + setCurrent(object); +} + +/*! + \qmlmethod void QtQuickControls2::ExclusiveGroup::removeCheckable(QtObject object) + + TODO +*/ +void QQuickExclusiveGroup::removeCheckable(QObject *object) +{ + Q_D(QQuickExclusiveGroup); + if (object->metaObject()->indexOfProperty("checked") != -1) + disconnect(object, SIGNAL(checkedChanged()), this, SLOT(_q_updateCurrent())); + disconnect(object, SIGNAL(destroyed(QObject*)), this, SLOT(removeCheckable(QObject*))); + + if (d->current == object) + setCurrent(Q_NULLPTR); +} + +/*! + \qmltype Exclusive + \inherits QtObject + \instantiates QQuickExclusive + \inqmlmodule QtQuick.Controls + \ingroup utilities + \brief TODO + + TODO +*/ + +QQuickExclusiveAttached::QQuickExclusiveAttached(QObject *parent) : + QObject(parent), m_group(Q_NULLPTR) +{ +} + +QQuickExclusiveAttached *QQuickExclusiveAttached::qmlAttachedProperties(QObject *object) +{ + return new QQuickExclusiveAttached(object); +} + +/*! + \qmlattachedproperty ExclusiveGroup QtQuickControls2::Exclusive::group + + TODO +*/ +QQuickExclusiveGroup *QQuickExclusiveAttached::group() const +{ + return m_group; +} + +void QQuickExclusiveAttached::setGroup(QQuickExclusiveGroup *group) +{ + if (m_group != group) { + if (m_group) + m_group->removeCheckable(parent()); + m_group = group; + if (m_group) + m_group->addCheckable(parent()); + emit groupChanged(); + } +} + +QT_END_NAMESPACE + +#include "moc_qquickexclusivegroup_p.cpp" diff --git a/src/controls/qquickexclusivegroup_p.h b/src/controls/qquickexclusivegroup_p.h new file mode 100644 index 00000000..d7a561a2 --- /dev/null +++ b/src/controls/qquickexclusivegroup_p.h @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKEXCLUSIVEGROUP_P_H +#define QQUICKEXCLUSIVEGROUP_P_H + +#include <QtCore/qobject.h> +#include <QtQuickControls/private/qtquickcontrolsglobal_p.h> +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +class QQuickExclusiveGroupPrivate; + +class Q_QUICKCONTROLS_EXPORT QQuickExclusiveGroup : public QObject +{ + Q_OBJECT + Q_PROPERTY(QObject *current READ current WRITE setCurrent NOTIFY currentChanged) + +public: + explicit QQuickExclusiveGroup(QObject *parent = Q_NULLPTR); + + QObject *current() const; + void setCurrent(QObject *current); + +public Q_SLOTS: + void addCheckable(QObject *object); + void removeCheckable(QObject *object); + +Q_SIGNALS: + void currentChanged(); + +private: + Q_DISABLE_COPY(QQuickExclusiveGroup) + Q_DECLARE_PRIVATE(QQuickExclusiveGroup) + + Q_PRIVATE_SLOT(d_func(), void _q_updateCurrent()) +}; + +class Q_QUICKCONTROLS_EXPORT QQuickExclusiveAttached : public QObject +{ + Q_OBJECT + Q_PROPERTY(QQuickExclusiveGroup *group READ group WRITE setGroup NOTIFY groupChanged FINAL) + +public: + explicit QQuickExclusiveAttached(QObject *parent = Q_NULLPTR); + + static QQuickExclusiveAttached *qmlAttachedProperties(QObject *object); + + QQuickExclusiveGroup *group() const; + void setGroup(QQuickExclusiveGroup *group); + +Q_SIGNALS: + void groupChanged(); + +private: + QQuickExclusiveGroup *m_group; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPEINFO(QQuickExclusiveAttached, QML_HAS_ATTACHED_PROPERTIES) + +#endif // QQUICKEXCLUSIVEGROUP_H diff --git a/src/controls/qquickpadding_p.h b/src/controls/qquickpadding_p.h new file mode 100644 index 00000000..22442d16 --- /dev/null +++ b/src/controls/qquickpadding_p.h @@ -0,0 +1,73 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKPADDING_P_H +#define QQUICKPADDING_P_H + +#include <QtCore/qobject.h> +#include <QtQuickControls/private/qtquickcontrolsglobal_p.h> + +QT_BEGIN_NAMESPACE + +class Q_QUICKCONTROLS_EXPORT QQuickPadding : public QObject +{ + Q_OBJECT + Q_PROPERTY(qreal left MEMBER left NOTIFY leftChanged) + Q_PROPERTY(qreal top MEMBER top NOTIFY topChanged) + Q_PROPERTY(qreal right MEMBER right NOTIFY rightChanged) + Q_PROPERTY(qreal bottom MEMBER bottom NOTIFY bottomChanged) + +public: + QQuickPadding(QObject *parent = Q_NULLPTR) : QObject(parent), + top(0), left(0), right(0), bottom(0) + { + } + + qreal top; + qreal left; + qreal right; + qreal bottom; + +Q_SIGNALS: + void leftChanged(); + void topChanged(); + void rightChanged(); + void bottomChanged(); +}; + +QT_END_NAMESPACE + +#endif // QQUICKPADDING_P_H diff --git a/src/controls/qquickstyle.cpp b/src/controls/qquickstyle.cpp new file mode 100644 index 00000000..e52e8b3a --- /dev/null +++ b/src/controls/qquickstyle.cpp @@ -0,0 +1,168 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 "qquickstyle_p.h" +#include <QtCore/qfile.h> +#include <QtCore/qjsondocument.h> +#include <QtCore/qjsonobject.h> +#include <QtCore/qjsonvalue.h> +#include <QtCore/qdebug.h> +#include <QtQml/qqmlengine.h> + +QT_BEGIN_NAMESPACE + +/*! + \qmltype Style + \inherits QtObject + \instantiates QQuickStyle + \inqmlmodule QtQuick.Controls + \ingroup utilities + \brief A style interface. + + TODO +*/ + +/*! + \qmlproperty color QtQuickControls2::Style::accentColor +*/ + +/*! + \qmlproperty color QtQuickControls2::Style::backgroundColor +*/ + +/*! + \qmlproperty color QtQuickControls2::Style::focusColor +*/ + +/*! + \qmlproperty color QtQuickControls2::Style::frameColor +*/ + +/*! + \qmlproperty color QtQuickControls2::Style::pressColor +*/ + +/*! + \qmlproperty color QtQuickControls2::Style::selectedTextColor +*/ + +/*! + \qmlproperty color QtQuickControls2::Style::selectionColor +*/ + +/*! + \qmlproperty color QtQuickControls2::Style::shadowColor +*/ + +/*! + \qmlproperty color QtQuickControls2::Style::textColor +*/ + +/*! + \qmlproperty int QtQuickControls2::Style::padding +*/ + +/*! + \qmlproperty int QtQuickControls2::Style::roundness +*/ + +/*! + \qmlproperty int QtQuickControls2::Style::spacing +*/ + +/*! + \qmlproperty real QtQuickControls2::Style::disabledOpacity +*/ + +static QColor readColorValue(const QJsonValue &value, const QColor &defaultValue) +{ + if (value.isString()) + return QColor(value.toString()); + return QColor::fromRgba(value.toInt(defaultValue.rgba())); +} + +static double readNumberValue(const QJsonValue &value, double defaultValue) +{ + return value.toDouble(defaultValue); +} + +QQuickStyle::QQuickStyle(QObject *parent) : QObject(parent) +{ + QJsonDocument doc; + + QFile file(QStringLiteral(":/qtquickcontrols/style.json")); + if (!file.open(QFile::ReadOnly | QFile::Text)) { + qDebug() << file.error(); + qWarning() << "QQuickStyle: failed to open ':/qtquickcontrols/style.json': " << qPrintable(file.errorString()); + } else { + QJsonParseError error; + doc = QJsonDocument::fromJson(file.readAll(), &error); + if (error.error != QJsonParseError::NoError) + qWarning() << "QQuickStyle: failed to parse ':/qtquickcontrols/style.json': " << qPrintable(error.errorString()); + } + + QJsonObject style = doc.object(); + accentColor = readColorValue(style.value(QStringLiteral("accentColor")), QColor("#7bc258")); + backgroundColor = readColorValue(style.value(QStringLiteral("backgroundColor")), QColor("#ffffff")); + baseColor = readColorValue(style.value(QStringLiteral("baseColor")), QColor("#eeeeee")); + focusColor = readColorValue(style.value(QStringLiteral("focusColor")), QColor("#45a7d7")); + frameColor = readColorValue(style.value(QStringLiteral("frameColor")), QColor("#bdbebf")); + pressColor = readColorValue(style.value(QStringLiteral("pressColor")), QColor("#33333333")); + selectedTextColor = readColorValue(style.value(QStringLiteral("selectedTextColor")), QColor("#ffffff")); + selectionColor = readColorValue(style.value(QStringLiteral("selectionColor")), QColor("#45a7d7")); + shadowColor = readColorValue(style.value(QStringLiteral("shadowColor")), QColor("#28282a")); + textColor = readColorValue(style.value(QStringLiteral("textColor")), QColor("#26282a")); + padding = readNumberValue(style.value(QStringLiteral("padding")), 6); + roundness = readNumberValue(style.value(QStringLiteral("roundness")), 3); + spacing = readNumberValue(style.value(QStringLiteral("spacing")), 6); + disabledOpacity = readNumberValue(style.value(QStringLiteral("disabledOpacity")), 0.3); +} + +QQuickStyle *QQuickStyle::instance(QQmlEngine *engine) +{ + static QHash<QQmlEngine *, QQuickStyle *> styles; + QHash<QQmlEngine *, QQuickStyle *>::iterator it = styles.find(engine); + if (it == styles.end()) + it = styles.insert(engine, new QQuickStyle(engine)); + return it.value(); +} + +QQuickStyle *QQuickStyle::qmlAttachedProperties(QObject *object) +{ + return instance(qmlEngine(object)); +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickstyle_p.h b/src/controls/qquickstyle_p.h new file mode 100644 index 00000000..d26f2976 --- /dev/null +++ b/src/controls/qquickstyle_p.h @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QQUICKSTYLE_P_H +#define QQUICKSTYLE_P_H + +#include <QtCore/qobject.h> +#include <QtGui/qcolor.h> +#include <QtQuickControls/private/qtquickcontrolsglobal_p.h> +#include <QtQml/qqml.h> + +QT_BEGIN_NAMESPACE + +class QQmlEngine; +class QJSEngine; + +class Q_QUICKCONTROLS_EXPORT QQuickStyle : public QObject +{ + Q_OBJECT + Q_PROPERTY(QColor accentColor MEMBER accentColor NOTIFY accentColorChanged FINAL) + Q_PROPERTY(QColor backgroundColor MEMBER backgroundColor NOTIFY backgroundColorChanged FINAL) + Q_PROPERTY(QColor baseColor MEMBER baseColor NOTIFY baseColorChanged FINAL) + Q_PROPERTY(QColor focusColor MEMBER focusColor NOTIFY focusColorChanged FINAL) + Q_PROPERTY(QColor frameColor MEMBER frameColor NOTIFY frameColorChanged FINAL) + Q_PROPERTY(QColor pressColor MEMBER pressColor NOTIFY pressColorChanged FINAL) + Q_PROPERTY(QColor selectedTextColor MEMBER selectedTextColor NOTIFY selectedTextColorChanged FINAL) + Q_PROPERTY(QColor selectionColor MEMBER selectionColor NOTIFY selectionColorChanged FINAL) + Q_PROPERTY(QColor shadowColor MEMBER shadowColor NOTIFY shadowColorChanged FINAL) + Q_PROPERTY(QColor textColor MEMBER textColor NOTIFY textColorChanged FINAL) + Q_PROPERTY(int padding MEMBER padding NOTIFY paddingChanged FINAL) + Q_PROPERTY(int roundness MEMBER roundness NOTIFY roundnessChanged FINAL) + Q_PROPERTY(int spacing MEMBER spacing NOTIFY spacingChanged FINAL) + Q_PROPERTY(qreal disabledOpacity MEMBER disabledOpacity NOTIFY disabledOpacityChanged FINAL) + +public: + explicit QQuickStyle(QObject *parent = Q_NULLPTR); + + static QQuickStyle *instance(QQmlEngine *engine); + static QQuickStyle *qmlAttachedProperties(QObject *object); + +Q_SIGNALS: + void accentColorChanged(); + void backgroundColorChanged(); + void baseColorChanged(); + void focusColorChanged(); + void frameColorChanged(); + void pressColorChanged(); + void selectedTextColorChanged(); + void selectionColorChanged(); + void shadowColorChanged(); + void textColorChanged(); + void paddingChanged(); + void roundnessChanged(); + void spacingChanged(); + void disabledOpacityChanged(); + +private: + QColor accentColor; + QColor baseColor; + QColor backgroundColor; + QColor focusColor; + QColor frameColor; + QColor pressColor; + QColor selectedTextColor; + QColor selectionColor; + QColor shadowColor; + QColor textColor; + int padding; + int spacing; + int roundness; + qreal disabledOpacity; +}; + +QT_END_NAMESPACE + +QML_DECLARE_TYPEINFO(QQuickStyle, QML_HAS_ATTACHED_PROPERTIES) + +#endif // QQUICKSTYLE_P_H diff --git a/src/controls/qtquickcontrolsglobal_p.h b/src/controls/qtquickcontrolsglobal_p.h new file mode 100644 index 00000000..3d606db7 --- /dev/null +++ b/src/controls/qtquickcontrolsglobal_p.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 QTQUICKCONTROLSGLOBAL_P_H +#define QTQUICKCONTROLSGLOBAL_P_H + +#include <QtCore/qglobal.h> + +QT_BEGIN_NAMESPACE + +#ifndef QT_STATIC +# if defined(QT_BUILD_QUICKCONTROLS_LIB) +# define Q_QUICKCONTROLS_EXPORT Q_DECL_EXPORT +# else +# define Q_QUICKCONTROLS_EXPORT Q_DECL_IMPORT +# endif +#else +# define Q_QUICKCONTROLS_EXPORT +#endif + +QT_END_NAMESPACE + +#endif // QTQUICKCONTROLSGLOBAL_P_H diff --git a/src/controls/style.json b/src/controls/style.json new file mode 100644 index 00000000..a1a79969 --- /dev/null +++ b/src/controls/style.json @@ -0,0 +1,16 @@ +{ + "accentColor": "#7bc258", + "backgroundColor": "#ffffff", + "baseColor": "#eeeeee", + "focusColor": "#45a7d7", + "frameColor": "#bdbebf", + "pressColor": "#33333333", + "selectedTextColor": "#ffffff", + "selectionColor": "#45a7d7", + "shadowColor": "#28282a", + "textColor": "#26282a", + "padding": 6, + "roundness": 3, + "disabledOpacity": 0.3, + "spacing": 6 +} diff --git a/src/extras/extras.pri b/src/extras/extras.pri new file mode 100644 index 00000000..6b97f98c --- /dev/null +++ b/src/extras/extras.pri @@ -0,0 +1,9 @@ +INCLUDEPATH += $$PWD + +HEADERS += \ + $$PWD/qquickabstractdrawer_p.h \ + $$PWD/qquickabstractsplitview_p.h + +SOURCES += \ + $$PWD/qquickabstractdrawer.cpp \ + $$PWD/qquickabstractsplitview.cpp diff --git a/src/extras/extras.pro b/src/extras/extras.pro new file mode 100644 index 00000000..70ebcfcc --- /dev/null +++ b/src/extras/extras.pro @@ -0,0 +1,14 @@ +TARGET = QtQuickExtras +MODULE = quickextras +CONFIG += internal_module + +QT += quick +QT += core-private gui-private qml-private quick-private quickcontrols-private + +DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII + +HEADERS += \ + $$PWD/qtquickextrasglobal_p.h + +include(extras.pri) +load(qt_module) diff --git a/src/extras/qquickabstractdrawer.cpp b/src/extras/qquickabstractdrawer.cpp new file mode 100644 index 00000000..d25a7f0d --- /dev/null +++ b/src/extras/qquickabstractdrawer.cpp @@ -0,0 +1,388 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Extras 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 "qquickabstractdrawer_p.h" + +#include <QtGui/qstylehints.h> +#include <QtGui/private/qguiapplication_p.h> +#include <QtQuick/private/qquickwindow_p.h> +#include <QtQuick/private/qquickanimation_p.h> +#include <QtQuickControls/private/qquickcontrol_p_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractDrawerPrivate : public QQuickControlPrivate +{ + Q_DECLARE_PUBLIC(QQuickAbstractDrawer) + +public: + QQuickAbstractDrawerPrivate() : edge(Qt::LeftEdge), offset(0), position(0), + content(Q_NULLPTR), animation(Q_NULLPTR) { } + + void updateContent(); + bool handleMousePressEvent(QQuickItem *item, QMouseEvent *event); + bool handleMouseMoveEvent(QQuickItem *item, QMouseEvent *event); + bool handleMouseReleaseEvent(QQuickItem *item, QMouseEvent *event); + + Qt::Edge edge; + qreal offset; + qreal position; + QPointF pressPoint; + QQuickItem *content; + QQuickPropertyAnimation *animation; +}; + +void QQuickAbstractDrawerPrivate::updateContent() +{ + Q_Q(QQuickAbstractDrawer); + if (!content) + return; + + switch (edge) { + case Qt::LeftEdge: + content->setX((position - 1.0) * content->width()); + break; + case Qt::RightEdge: + content->setX(q->width() + - position * content->width()); + break; + case Qt::TopEdge: + content->setY((position - 1.0) * content->height()); + break; + case Qt::BottomEdge: + content->setY(q->height() + - position * content->height()); + break; + } +} + +bool QQuickAbstractDrawerPrivate::handleMousePressEvent(QQuickItem *item, QMouseEvent *event) +{ + Q_Q(QQuickAbstractDrawer); + pressPoint = q->mapFromItem(item, event->pos()); + + if (qFuzzyIsNull(position)) { + // only accept pressing at drag margins when fully closed + switch (edge) { + case Qt::LeftEdge: + event->setAccepted(!QQuickWindowPrivate::dragOverThreshold(event->x(), Qt::XAxis, event)); + break; + case Qt::RightEdge: + event->setAccepted(!QQuickWindowPrivate::dragOverThreshold(q->width() - event->x(), Qt::XAxis, event)); + break; + case Qt::TopEdge: + event->setAccepted(!QQuickWindowPrivate::dragOverThreshold(event->y(), Qt::YAxis, event)); + break; + case Qt::BottomEdge: + event->setAccepted(!QQuickWindowPrivate::dragOverThreshold(q->height() - event->y(), Qt::YAxis, event)); + break; + } + offset = 0; + } else { + event->accept(); + offset = q->positionAt(pressPoint) - position; + } + + return item == q; +} + +bool QQuickAbstractDrawerPrivate::handleMouseMoveEvent(QQuickItem *item, QMouseEvent *event) +{ + Q_Q(QQuickAbstractDrawer); + QPointF movePoint = q->mapFromItem(item, event->pos()); + + if (!q->keepMouseGrab()) { + bool overThreshold = false; + if (edge == Qt::LeftEdge || edge == Qt::RightEdge) + overThreshold = QQuickWindowPrivate::dragOverThreshold(movePoint.x() - pressPoint.x(), Qt::XAxis, event); + else + overThreshold = QQuickWindowPrivate::dragOverThreshold(movePoint.y() - pressPoint.y(), Qt::YAxis, event); + + if (window && overThreshold) { + QQuickItem *grabber = q->window()->mouseGrabberItem(); + if (!grabber || !grabber->keepMouseGrab()) { + q->grabMouse(); + q->setKeepMouseGrab(overThreshold); + } + } + } + + if (q->keepMouseGrab()) + q->setPosition(q->positionAt(event->pos()) - offset); + event->accept(); + + return q->keepMouseGrab(); +} + +bool QQuickAbstractDrawerPrivate::handleMouseReleaseEvent(QQuickItem *item, QMouseEvent *event) +{ + Q_Q(QQuickAbstractDrawer); + bool wasGrabbed = q->keepMouseGrab(); + if (wasGrabbed) { +// int startDragVelocity = QGuiApplication::styleHints()->startDragVelocity(); +// if (startDragVelocity && QGuiApplicationPrivate::mouseEventCaps(event) & QTouchDevice::Velocity) { +// QVector2D velocity = QGuiApplicationPrivate::mouseEventVelocity(event); +// qreal vel = (edge == Qt::LeftEdge || edge == Qt::RightEdge) ? velocity.x() : velocity.y(); +// qDebug() << vel << "vs." << startDragVelocity; +// } + if (position < 0.3) { + q->close(); + } else if (position > 0.7) { + q->open(); + } else { + switch (edge) { + case Qt::LeftEdge: + if (event->x() - pressPoint.x() > 0) + q->open(); + else + q->close(); + break; + case Qt::RightEdge: + if (event->x() - pressPoint.x() < 0) + q->open(); + else + q->close(); + break; + case Qt::TopEdge: + if (event->y() - pressPoint.y() > 0) + q->open(); + else + q->close(); + break; + case Qt::BottomEdge: + if (event->y() - pressPoint.y() < 0) + q->open(); + else + q->close(); + break; + } + } + q->setKeepMouseGrab(false); + } else { + if (item == q) + emit q->clicked(); + } + pressPoint = QPoint(); + event->accept(); + return wasGrabbed; +} + +QQuickAbstractDrawer::QQuickAbstractDrawer(QQuickItem *parent) : + QQuickControl(*(new QQuickAbstractDrawerPrivate), parent) +{ + setZ(1); + setFiltersChildMouseEvents(true); + setAcceptedMouseButtons(Qt::LeftButton); +} + +Qt::Edge QQuickAbstractDrawer::edge() const +{ + Q_D(const QQuickAbstractDrawer); + return d->edge; +} + +void QQuickAbstractDrawer::setEdge(Qt::Edge edge) +{ + Q_D(QQuickAbstractDrawer); + if (d->edge != edge) { + d->edge = edge; + if (isComponentComplete()) + d->updateContent(); + emit edgeChanged(); + } +} + +qreal QQuickAbstractDrawer::position() const +{ + Q_D(const QQuickAbstractDrawer); + return d->position; +} + +void QQuickAbstractDrawer::setPosition(qreal position) +{ + Q_D(QQuickAbstractDrawer); + position = qBound(0.0, position, 1.0); + if (!qFuzzyCompare(d->position, position)) { + d->position = position; + if (isComponentComplete()) + d->updateContent(); + emit positionChanged(); + } +} + +QQuickItem *QQuickAbstractDrawer::contentItem() const +{ + Q_D(const QQuickAbstractDrawer); + return d->content; +} + +void QQuickAbstractDrawer::setContentItem(QQuickItem *item) +{ + Q_D(QQuickAbstractDrawer); + if (d->content != item) { + delete d->content; + d->content = item; + if (item) + item->setParentItem(this); + if (isComponentComplete()) + d->updateContent(); + emit contentItemChanged(); + } +} + +QQuickPropertyAnimation *QQuickAbstractDrawer::animation() const +{ + Q_D(const QQuickAbstractDrawer); + return d->animation; +} + +void QQuickAbstractDrawer::setAnimation(QQuickPropertyAnimation *animation) +{ + Q_D(QQuickAbstractDrawer); + if (d->animation != animation) { + delete d->animation; + d->animation = animation; + if (animation) { + animation->setTargetObject(this); + animation->setProperty(QStringLiteral("position")); + } + emit animationChanged(); + } +} + +void QQuickAbstractDrawer::open() +{ + Q_D(QQuickAbstractDrawer); + if (d->animation) { + d->animation->stop(); + d->animation->setFrom(d->position); + d->animation->setTo(1.0); + d->animation->start(); + } else { + setPosition(1.0); + } +} + +void QQuickAbstractDrawer::close() +{ + Q_D(QQuickAbstractDrawer); + if (d->animation) { + d->animation->stop(); + d->animation->setFrom(d->position); + d->animation->setTo(0.0); + d->animation->start(); + } else { + setPosition(0.0); + } +} + +bool QQuickAbstractDrawer::childMouseEventFilter(QQuickItem *child, QEvent *event) +{ + Q_D(QQuickAbstractDrawer); + switch (event->type()) { + case QEvent::MouseButtonPress: + return d->handleMousePressEvent(child, static_cast<QMouseEvent *>(event)); + case QEvent::MouseMove: + return d->handleMouseMoveEvent(child, static_cast<QMouseEvent *>(event)); + case QEvent::MouseButtonRelease: + return d->handleMouseReleaseEvent(child, static_cast<QMouseEvent *>(event)); + default: + return false; + } +} + +void QQuickAbstractDrawer::mousePressEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractDrawer); + QQuickControl::mousePressEvent(event); + d->handleMousePressEvent(this, event); +} + +void QQuickAbstractDrawer::mouseMoveEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractDrawer); + QQuickControl::mouseMoveEvent(event); + d->handleMouseMoveEvent(this, event); +} + +void QQuickAbstractDrawer::mouseReleaseEvent(QMouseEvent *event) +{ + Q_D(QQuickAbstractDrawer); + QQuickControl::mouseReleaseEvent(event); + d->handleMouseReleaseEvent(this, event); +} + +void QQuickAbstractDrawer::mouseUngrabEvent() +{ + Q_D(QQuickAbstractDrawer); + QQuickControl::mouseUngrabEvent(); + d->pressPoint = QPoint(); +} + +void QQuickAbstractDrawer::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) +{ + Q_D(QQuickAbstractDrawer); + QQuickControl::geometryChanged(newGeometry, oldGeometry); + if (isComponentComplete()) + d->updateContent(); +} + +void QQuickAbstractDrawer::componentComplete() +{ + Q_D(QQuickAbstractDrawer); + QQuickControl::componentComplete(); + d->updateContent(); +} + +qreal QQuickAbstractDrawer::positionAt(const QPointF &point) const +{ + Q_D(const QQuickAbstractDrawer); + if (!d->content) + return 0.0; + + switch (d->edge) { + case Qt::TopEdge: + return point.y() / d->content->height(); + case Qt::LeftEdge: + return point.x() / d->content->width(); + case Qt::RightEdge: + return (width() - point.x()) / d->content->width(); + case Qt::BottomEdge: + return (height() - point.y()) / d->content->height(); + default: + return 0; + } +} + +QT_END_NAMESPACE diff --git a/src/extras/qquickabstractdrawer_p.h b/src/extras/qquickabstractdrawer_p.h new file mode 100644 index 00000000..5c9d44ec --- /dev/null +++ b/src/extras/qquickabstractdrawer_p.h @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Extras 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 QQUICKABSTRACTDRAWER_P_H +#define QQUICKABSTRACTDRAWER_P_H + +#include <QtQuickExtras/private/qtquickextrasglobal_p.h> +#include <QtQuickControls/private/qquickcontrol_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickPropertyAnimation; +class QQuickAbstractDrawerPrivate; + +class Q_QUICKEXTRAS_EXPORT QQuickAbstractDrawer : public QQuickControl +{ + Q_OBJECT + Q_PROPERTY(Qt::Edge edge READ edge WRITE setEdge NOTIFY edgeChanged FINAL) + Q_PROPERTY(qreal position READ position WRITE setPosition NOTIFY positionChanged FINAL) + Q_PROPERTY(QQuickItem *contentItem READ contentItem WRITE setContentItem NOTIFY contentItemChanged FINAL) + // TODO: make this a proper transition + Q_PROPERTY(QQuickPropertyAnimation *animation READ animation WRITE setAnimation NOTIFY animationChanged FINAL) + Q_CLASSINFO("DefaultProperty", "contentItem") + +public: + explicit QQuickAbstractDrawer(QQuickItem *parent = Q_NULLPTR); + + Qt::Edge edge() const; + void setEdge(Qt::Edge edge); + + qreal position() const; + void setPosition(qreal position); + + QQuickItem *contentItem() const; + void setContentItem(QQuickItem *item); + + QQuickPropertyAnimation *animation() const; + void setAnimation(QQuickPropertyAnimation *animation); + +public Q_SLOTS: + void open(); + void close(); + +Q_SIGNALS: + void clicked(); + void edgeChanged(); + void positionChanged(); + void contentItemChanged(); + void animationChanged(); + +protected: + bool childMouseEventFilter(QQuickItem *child, QEvent *event) 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 geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE; + void componentComplete() Q_DECL_OVERRIDE; + + virtual qreal positionAt(const QPointF &point) const; + +private: + Q_DISABLE_COPY(QQuickAbstractDrawer) + Q_DECLARE_PRIVATE(QQuickAbstractDrawer) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTDRAWER_P_H diff --git a/src/extras/qquickabstractsplitview.cpp b/src/extras/qquickabstractsplitview.cpp new file mode 100644 index 00000000..cf20945e --- /dev/null +++ b/src/extras/qquickabstractsplitview.cpp @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Extras 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 "qquickabstractsplitview_p.h" + +#include <QtQuickControls/private/qquickabstractcontainer_p_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractSplitViewPrivate : public QQuickAbstractContainerPrivate +{ +public: + QQuickAbstractSplitViewPrivate() : orientation(Qt::Horizontal) { } + + bool resizing; + Qt::Orientation orientation; +}; + +QQuickAbstractSplitView::QQuickAbstractSplitView(QQuickItem *parent) : + QQuickAbstractContainer(*(new QQuickAbstractSplitViewPrivate), parent) +{ +} + +Qt::Orientation QQuickAbstractSplitView::orientation() const +{ + Q_D(const QQuickAbstractSplitView); + return d->orientation; +} + +void QQuickAbstractSplitView::setOrientation(Qt::Orientation orientation) +{ + Q_D(QQuickAbstractSplitView); + if (d->orientation != orientation) { + d->orientation = orientation; + emit orientationChanged(); + } +} + +bool QQuickAbstractSplitView::isResizing() const +{ + Q_D(const QQuickAbstractSplitView); + return d->resizing; +} + +void QQuickAbstractSplitView::setResizing(bool resizing) +{ + Q_D(QQuickAbstractSplitView); + if (d->resizing != resizing) { + d->resizing = resizing; + emit resizingChanged(); + } +} + +void QQuickAbstractSplitView::addItem(QQuickItem *item) +{ + // TODO + Q_UNUSED(item); +} + +void QQuickAbstractSplitView::componentComplete() +{ +} + +QT_END_NAMESPACE diff --git a/src/extras/qquickabstractsplitview_p.h b/src/extras/qquickabstractsplitview_p.h new file mode 100644 index 00000000..e8bad706 --- /dev/null +++ b/src/extras/qquickabstractsplitview_p.h @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Extras 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 QQUICKABSTRACTSPLITVIEW_P_H +#define QQUICKABSTRACTSPLITVIEW_P_H + +#include <QtQuickExtras/private/qtquickextrasglobal_p.h> +#include <QtQuickControls/private/qquickabstractcontainer_p.h> + +QT_BEGIN_NAMESPACE + +class QQuickAbstractSplitViewPrivate; + +class Q_QUICKEXTRAS_EXPORT QQuickAbstractSplitView : public QQuickAbstractContainer +{ + Q_OBJECT + Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged FINAL) + Q_PROPERTY(bool resizing READ isResizing NOTIFY resizingChanged FINAL) + +public: + explicit QQuickAbstractSplitView(QQuickItem *parent = Q_NULLPTR); + + Qt::Orientation orientation() const; + void setOrientation(Qt::Orientation orientation); + + bool isResizing() const; + void setResizing(bool resizing); + +public Q_SLOTS: + void addItem(QQuickItem *item); + +Q_SIGNALS: + void orientationChanged(); + void resizingChanged(); + +protected: + void componentComplete() Q_DECL_OVERRIDE; + +private: + Q_DISABLE_COPY(QQuickAbstractSplitView) + Q_DECLARE_PRIVATE(QQuickAbstractSplitView) +}; + +QT_END_NAMESPACE + +#endif // QQUICKABSTRACTSPLITVIEW_P_H diff --git a/src/extras/qtquickextrasglobal_p.h b/src/extras/qtquickextrasglobal_p.h new file mode 100644 index 00000000..d0922dca --- /dev/null +++ b/src/extras/qtquickextrasglobal_p.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Extras 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 QTQUICKEXTRASGLOBAL_P_H +#define QTQUICKEXTRASGLOBAL_P_H + +#include <QtCore/qglobal.h> + +QT_BEGIN_NAMESPACE + +#ifndef QT_STATIC +# if defined(QT_BUILD_QUICKEXTRAS_LIB) +# define Q_QUICKEXTRAS_EXPORT Q_DECL_EXPORT +# else +# define Q_QUICKEXTRAS_EXPORT Q_DECL_IMPORT +# endif +#else +# define Q_QUICKEXTRAS_EXPORT +#endif + +QT_END_NAMESPACE + +#endif // QTQUICKEXTRASGLOBAL_P_H diff --git a/src/imports/calendar/CalendarDelegate.qml b/src/imports/calendar/CalendarDelegate.qml new file mode 100644 index 00000000..a6b000b7 --- /dev/null +++ b/src/imports/calendar/CalendarDelegate.qml @@ -0,0 +1,60 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 +import QtQuick.Calendar 2.0 + +Item { + property alias text: label.text + property alias color: label.color + property real padding + + implicitWidth: label.implicitWidth * 3 + implicitHeight: label.implicitHeight * 3 + + Text { + id: label + x: padding + y: padding + width: parent.width - 2 * padding + height: parent.height - 2 * padding + minimumPointSize: 8 + fontSizeMode: Text.Fit + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } +} diff --git a/src/imports/calendar/CalendarView.qml b/src/imports/calendar/CalendarView.qml new file mode 100644 index 00000000..ce6e9908 --- /dev/null +++ b/src/imports/calendar/CalendarView.qml @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 +import QtQuick.Calendar 2.0 + +AbstractCalendarView { + id: control + + property Component delegate: CalendarDelegate { + width: grid.width ? grid.width / 7 : implicitWidth + height: grid.height ? grid.height / 6 : implicitHeight + opacity: model.month === control.month ? 1 : 0 + color: model.today ? style.accentColor : style.textColor + text: model.day + padding: style.padding + } + + contentWidth: grid.implicitWidth + contentHeight: grid.implicitHeight + + implicitWidth: Math.max(background ? background.implicitWidth : 0, contentWidth + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + padding.top + padding.bottom) + + Accessible.name: title + + contentItem: Grid { + id: grid + + rows: 6 + columns: 7 + + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + Repeater { + id: repeater + model: control.source + delegate: control.delegate + } + } +} diff --git a/src/imports/calendar/DayOfWeekRow.qml b/src/imports/calendar/DayOfWeekRow.qml new file mode 100644 index 00000000..5a33b5ee --- /dev/null +++ b/src/imports/calendar/DayOfWeekRow.qml @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 +import QtQuick.Calendar 2.0 + +AbstractDayOfWeekRow { + id: control + + property Component delegate: Text { + text: model.shortName + font.bold: true + color: control.style.textColor + width: row.width ? row.width / 7 : implicitWidth + height: row.height ? row.height : implicitHeight + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + + contentWidth: row.implicitWidth + contentHeight: row.implicitHeight + + implicitWidth: Math.max(background ? background.implicitWidth : 0, contentWidth + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + padding.top + padding.bottom) + + padding { top: style.padding; bottom: style.padding } + + contentItem: Row { + id: row + + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + Repeater { + model: control.source + delegate: control.delegate + } + } +} diff --git a/src/imports/calendar/WeekNumberColumn.qml b/src/imports/calendar/WeekNumberColumn.qml new file mode 100644 index 00000000..e2d1f63c --- /dev/null +++ b/src/imports/calendar/WeekNumberColumn.qml @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 +import QtQuick.Calendar 2.0 + +AbstractWeekNumberColumn { + id: control + + property Component delegate: Text { + text: model.weekNumber + font.bold: true + color: control.style.textColor + width: column.width ? column.width : implicitWidth + height: column.height ? column.height / 6 : implicitHeight + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + + contentWidth: column.implicitWidth + contentHeight: column.implicitHeight + + implicitWidth: Math.max(background ? background.implicitWidth : 0, contentWidth + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + padding.top + padding.bottom) + + padding { left: style.padding; right: style.padding } + + contentItem: Column { + id: column + + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + Repeater { + model: control.source + delegate: control.delegate + } + } +} diff --git a/src/imports/calendar/calendar.pro b/src/imports/calendar/calendar.pro new file mode 100644 index 00000000..625be272 --- /dev/null +++ b/src/imports/calendar/calendar.pro @@ -0,0 +1,21 @@ +TARGET = qtquickcalendar2plugin +TARGETPATH = QtQuick/Calendar.2 +IMPORT_VERSION = 2.0 + +QT += qml quick +QT += core-private gui-private qml-private quick-private quickcontrols-private quickcalendar-private + +OTHER_FILES += \ + qmldir + +QML_FILES = \ + CalendarDelegate.qml \ + CalendarView.qml \ + DayOfWeekRow.qml \ + WeekNumberColumn.qml + +SOURCES += \ + $$PWD/qtquickcalendar2plugin.cpp + +CONFIG += no_cxx_module +load(qml_plugin) diff --git a/src/imports/calendar/qmldir b/src/imports/calendar/qmldir new file mode 100644 index 00000000..af87241f --- /dev/null +++ b/src/imports/calendar/qmldir @@ -0,0 +1,7 @@ +module QtQuick.Calendar +plugin qtquickcalendar2plugin +classname QtQuickCalendar2Plugin +CalendarDelegate 2.0 CalendarDelegate.qml +CalendarView 2.0 CalendarView.qml +DayOfWeekRow 2.0 DayOfWeekRow.qml +WeekNumberColumn 2.0 WeekNumberColumn.qml diff --git a/src/imports/calendar/qtquickcalendar2plugin.cpp b/src/imports/calendar/qtquickcalendar2plugin.cpp new file mode 100644 index 00000000..8e84e094 --- /dev/null +++ b/src/imports/calendar/qtquickcalendar2plugin.cpp @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** 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 <QtQml/qqmlextensionplugin.h> + +#include <QtQuickCalendar/private/qquickabstractcalendarview_p.h> +#include <QtQuickCalendar/private/qquickabstractdayofweekrow_p.h> +#include <QtQuickCalendar/private/qquickabstractweeknumbercolumn_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> + +QT_BEGIN_NAMESPACE + +class QtQuickCalendar2Plugin: public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface/1.0") + +public: + void registerTypes(const char *uri); +}; + +void QtQuickCalendar2Plugin::registerTypes(const char *uri) +{ + qmlRegisterType<QQuickAbstractCalendarView>(uri, 2, 0, "AbstractCalendarView"); + qmlRegisterType<QQuickAbstractDayOfWeekRow>(uri, 2, 0, "AbstractDayOfWeekRow"); + qmlRegisterType<QQuickAbstractWeekNumberColumn>(uri, 2, 0, "AbstractWeekNumberColumn"); + qmlRegisterType<QQuickCalendarModel>(uri, 2, 0, "CalendarModel"); + qmlRegisterType<QQuickDayOfWeekModel>(uri, 2, 0, "DayOfWeekModel"); + qmlRegisterType<QQuickMonthModel>(uri, 2, 0, "MonthModel"); + qmlRegisterType<QQuickWeekNumberModel>(uri, 2, 0, "WeekNumberModel"); +} + +QT_END_NAMESPACE + +#include "qtquickcalendar2plugin.moc" diff --git a/src/imports/controls/ApplicationWindow.qml b/src/imports/controls/ApplicationWindow.qml new file mode 100644 index 00000000..036630e4 --- /dev/null +++ b/src/imports/controls/ApplicationWindow.qml @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Window 2.2 +import QtQuick.Controls 2.0 + +AbstractApplicationWindow { + id: window + + color: style.backgroundColor + flags: Qt.Window | Qt.WindowFullscreenButtonHint + + contentWidth: contentItem.children.length === 1 ? contentItem.children[0].implicitWidth : 0 + contentHeight: contentItem.children.length === 1 ? contentItem.children[0].implicitHeight : 0 + + minimumWidth: Math.max(contentWidth, + (header ? header.implicitWidth : 0), + (footer ? footer.implicitWidth : 0)) + minimumHeight: contentHeight + (header ? header.implicitHeight : 0) + + (footer ? footer.implicitHeight : 0) +} diff --git a/src/imports/controls/BusyIndicator.qml b/src/imports/controls/BusyIndicator.qml new file mode 100644 index 00000000..09abd9dc --- /dev/null +++ b/src/imports/controls/BusyIndicator.qml @@ -0,0 +1,80 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractBusyIndicator { + id: control + + implicitWidth: indicator.implicitWidth + padding.left + padding.right + implicitHeight: indicator.implicitHeight + padding.top + padding.bottom + + Accessible.role: Accessible.Indicator + + padding { top: style.padding; left: style.padding; right: style.padding; bottom: style.padding } + + indicator: Item { + id: delegate + implicitWidth: 48 + implicitHeight: 48 + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + width: parent.width + height: parent.height + + opacity: control.running ? 1 : 0 + Behavior on opacity { OpacityAnimator { duration: 250 } } + + Image { + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + width: Math.min(parent.width, parent.height) + height: width + source: width <= 32 ? "qrc:/images/spinner_small.png" : + width >= 48 ? "qrc:/images/spinner_large.png" : + "qrc:/images/spinner_medium.png" + + RotationAnimator on rotation { + duration: 800 + loops: Animation.Infinite + from: 0 + to: 360 + running: control.visible && (control.running || delegate.opacity > 0) + } + } + } +} diff --git a/src/imports/controls/Button.qml b/src/imports/controls/Button.qml new file mode 100644 index 00000000..8ec7065b --- /dev/null +++ b/src/imports/controls/Button.qml @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractButton { + id: control + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + label ? label.implicitWidth + padding.left + padding.right : 0) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + label ? label.implicitHeight + padding.top + padding.bottom : 0) + + Accessible.name: text + Accessible.pressed: pressed + Accessible.role: Accessible.Button + + padding { top: style.padding; left: style.padding; right: style.padding; bottom: style.padding } + + label: Text { + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + text: control.text + color: control.style.selectedTextColor + elide: Text.ElideRight + opacity: enabled ? 1.0 : control.style.disabledOpacity + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + + background: Rectangle { + implicitWidth: 26 + implicitHeight: 26 + + radius: style.roundness + opacity: control.enabled ? 1.0 : style.disabledOpacity + color: Qt.tint(Qt.tint(style.accentColor, + control.activeFocus ? style.focusColor : "transparent"), + control.pressed ? style.pressColor : "transparent") + } +} diff --git a/src/imports/controls/CheckBox.qml b/src/imports/controls/CheckBox.qml new file mode 100644 index 00000000..6bc8f473 --- /dev/null +++ b/src/imports/controls/CheckBox.qml @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractCheckBox { + id: control + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + (label ? label.implicitWidth : 0) + + (indicator ? indicator.implicitWidth : 0) + + (label && indicator ? style.spacing : 0) + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + Math.max(label ? label.implicitHeight : 0, + indicator ? indicator.implicitHeight : 0) + padding.top + padding.bottom) + + Accessible.name: text + Accessible.checked: checked + Accessible.pressed: pressed + Accessible.role: Accessible.CheckBox + + padding { top: style.padding; left: style.padding; right: style.padding; bottom: style.padding } + + indicator: Rectangle { + readonly property bool mirror: control.effectiveLayoutDirection == Qt.RightToLeft + + implicitWidth: 20 + implicitHeight: 20 + x: text ? (mirror ? parent.width - width - padding.right : padding.left) : (parent.width - width) / 2 + y: (parent.height - height) / 2 + + radius: style.roundness + border.width: control.activeFocus ? 2 : 1 + border.color: control.activeFocus ? style.focusColor : style.frameColor + opacity: enabled ? 1.0 : style.disabledOpacity + color: style.backgroundColor + + Rectangle { + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + width: 12 + height: 12 + color: Qt.tint(Qt.tint(control.checked ? style.accentColor : style.baseColor, + control.checked && control.activeFocus ? style.focusColor : "transparent"), + control.pressed ? style.pressColor : "transparent") + border.width: control.checked || control.pressed ? 0 : 1 + border.color: style.frameColor + } + } + + label: Text { + readonly property bool mirror: control.effectiveLayoutDirection == Qt.RightToLeft + + x: mirror ? padding.left : (indicator.x + indicator.width + control.style.spacing) + y: padding.top + width: parent.width - indicator.width - control.style.spacing - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + text: control.text + color: control.style.textColor + elide: Text.ElideRight + visible: control.text + opacity: enabled ? 1.0 : control.style.disabledOpacity + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + } +} diff --git a/src/imports/controls/Frame.qml b/src/imports/controls/Frame.qml new file mode 100644 index 00000000..62582263 --- /dev/null +++ b/src/imports/controls/Frame.qml @@ -0,0 +1,68 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractFrame { + id: control + + default property alias data: content.data + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + contentWidth + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + contentHeight + padding.top + padding.bottom) + + contentWidth: content.children.length === 1 ? content.children[0].implicitWidth : 0 + contentHeight: content.children.length === 1 ? content.children[0].implicitHeight : 0 + + padding { top: style.padding; left: style.padding; right: style.padding; bottom: style.padding } + + contentItem: Item { + id: content + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + } + + background: Rectangle { + color: "transparent" + radius: style.roundness + border.color: style.frameColor + } +} diff --git a/src/imports/controls/GroupBox.qml b/src/imports/controls/GroupBox.qml new file mode 100644 index 00000000..39e45adb --- /dev/null +++ b/src/imports/controls/GroupBox.qml @@ -0,0 +1,89 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractGroupBox { + id: control + + default property alias data: content.data + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + contentWidth + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + contentHeight + padding.top + padding.bottom) + + contentWidth: content.children.length === 1 ? content.children[0].implicitWidth : 0 + contentHeight: content.children.length === 1 ? content.children[0].implicitHeight : 0 + + padding { + top: style.padding + (label && title ? label.implicitHeight + style.spacing : 0) + left: style.padding + right: style.padding + bottom: style.padding + } + + contentItem: Item { + id: content + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + } + + label: Text { + x: padding.left + width: parent.width - padding.left - padding.right + + text: control.title + color: control.style.textColor + elide: Text.ElideRight + opacity: enabled ? 1.0 : control.style.disabledOpacity + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + } + + frame: Rectangle { + y: padding.top - style.padding + width: parent.width + height: parent.height - padding.top + style.padding + + color: "transparent" + radius: style.roundness + border.color: style.frameColor + } +} diff --git a/src/imports/controls/Label.qml b/src/imports/controls/Label.qml new file mode 100644 index 00000000..872cb978 --- /dev/null +++ b/src/imports/controls/Label.qml @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +Text { + id: control + + // TODO: color: style.textColor + + Accessible.name: text + Accessible.role: Accessible.StaticText +} diff --git a/src/imports/controls/PageIndicator.qml b/src/imports/controls/PageIndicator.qml new file mode 100644 index 00000000..db6dbdde --- /dev/null +++ b/src/imports/controls/PageIndicator.qml @@ -0,0 +1,81 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractPageIndicator { + id: control + + property alias spacing: row.spacing + + property Component delegate: Rectangle { + implicitWidth: 8 + implicitHeight: 8 + + radius: width / 2 + color: style.shadowColor // TODO + + opacity: index === currentIndex ? 0.75 : 0.25 + Behavior on opacity { OpacityAnimator { duration: 100 } } + } + + Accessible.role: Accessible.Indicator + + contentWidth: row.implicitWidth + contentHeight: row.implicitHeight + + implicitWidth: Math.max(background ? background.implicitWidth : 0, contentWidth + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + padding.top + padding.bottom) + + padding { top: style.padding; left: style.padding; right: style.padding; bottom: style.padding } + + contentItem: Row { + id: row + + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + spacing: style.spacing + + Repeater { + model: control.count + delegate: control.delegate + } + } +} diff --git a/src/imports/controls/ProgressBar.qml b/src/imports/controls/ProgressBar.qml new file mode 100644 index 00000000..8e6342ee --- /dev/null +++ b/src/imports/controls/ProgressBar.qml @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractProgressBar { + id: control + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + indicator ? indicator.implicitWidth : 0) + padding.left + padding.right + implicitHeight: Math.max(background ? background.implicitHeight : 0, + indicator ? indicator.implicitHeight : 0) + padding.top + padding.bottom + + Accessible.role: Accessible.ProgressBar + + padding { top: style.padding; left: style.padding; right: style.padding; bottom: style.padding } + + indicator: Item { + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + scale: control.effectiveLayoutDirection === Qt.RightToLeft ? -1 : 1 + + Repeater { + model: indeterminate ? 2 : 1 + + Rectangle { + property real offset: indeterminate ? 0 : control.value + + x: 2 + (indeterminate ? offset * parent.width - 4 : 0) + y: (parent.height - height) / 2 + width: offset * (parent.width - x) - 2 + height: 2 + + color: style.accentColor + radius: style.roundness + + SequentialAnimation on offset { + loops: Animation.Infinite + running: indeterminate && visible + PauseAnimation { duration: index ? 520 : 0 } + NumberAnimation { + easing.type: Easing.OutCubic + duration: 1240 + from: 0 + to: 1 + } + PauseAnimation { duration: index ? 0 : 520 } + } + } + } + } + + background: Rectangle { + implicitWidth: 120 + implicitHeight: 6 + x: padding.left + y: (parent.height - height) / 2 + width: parent.width - padding.left - padding.bottom + height: 6 + + radius: style.roundness + border.color: style.frameColor + color: "transparent" + } +} diff --git a/src/imports/controls/RadioButton.qml b/src/imports/controls/RadioButton.qml new file mode 100644 index 00000000..919ab947 --- /dev/null +++ b/src/imports/controls/RadioButton.qml @@ -0,0 +1,102 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractRadioButton { + id: control + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + (label ? label.implicitWidth : 0) + + (indicator ? indicator.implicitWidth : 0) + + (label && indicator ? style.spacing : 0) + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + Math.max(label ? label.implicitHeight : 0, + indicator ? indicator.implicitHeight : 0) + padding.top + padding.bottom) + + Accessible.name: text + Accessible.checked: checked + Accessible.pressed: pressed + Accessible.role: Accessible.RadioButton + + padding { top: style.padding; left: style.padding; right: style.padding; bottom: style.padding } + + indicator: Rectangle { + readonly property bool mirror: control.effectiveLayoutDirection == Qt.RightToLeft + + implicitWidth: 20 + implicitHeight: 20 + x: text ? (mirror ? parent.width - width - padding.right : padding.left) : (parent.width - width) / 2 + y: (parent.height - height) / 2 + + radius: width / 2 + border.width: control.activeFocus ? 2 : 1 + border.color: control.activeFocus ? style.focusColor : style.frameColor + opacity: enabled ? 1.0 : style.disabledOpacity + color: style.backgroundColor + + Rectangle { + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + width: 12 + height: 12 + radius: width / 2 + color: Qt.tint(Qt.tint(control.checked ? style.accentColor : style.baseColor, + control.checked && control.activeFocus ? style.focusColor : "transparent"), + control.pressed ? style.pressColor : "transparent") + border.width: control.checked || control.pressed ? 0 : 1 + border.color: style.frameColor + } + } + + label: Text { + readonly property bool mirror: control.effectiveLayoutDirection == Qt.RightToLeft + + x: mirror ? padding.left : (indicator.x + indicator.width + control.style.spacing) + y: padding.top + width: parent.width - indicator.width - control.style.spacing - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + text: control.text + color: control.style.textColor + elide: Text.ElideRight + visible: control.text + opacity: enabled ? 1.0 : control.style.disabledOpacity + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + } +} diff --git a/src/imports/controls/ScrollBar.qml b/src/imports/controls/ScrollBar.qml new file mode 100644 index 00000000..83e8ac6b --- /dev/null +++ b/src/imports/controls/ScrollBar.qml @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractScrollBar { + id: control + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + handle.implicitWidth + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + handle.implicitHeight + padding.top + padding.bottom) + + Accessible.pressed: pressed + Accessible.role: Accessible.ScrollBar + + padding { top: 2; left: 2; right: 2; bottom: 2 } + + handle: Rectangle { + id: handle + + implicitWidth: 6 + implicitHeight: 6 + + radius: width / 2 + color: control.pressed ? style.shadowColor : style.frameColor + visible: control.size < 1.0 + opacity: 0.0 + + readonly property bool horizontal: control.orientation === Qt.Horizontal + x: padding.left + (horizontal ? control.position * control.width : 0) + y: padding.top + (horizontal ? 0 : control.position * control.height) + width: horizontal ? control.size * control.width - padding.left - padding.right : implicitWidth + height: horizontal ? implicitHeight : control.size * control.height - padding.top - padding.bottom + + states: State { + name: "active" + when: control.active + PropertyChanges { target: handle; opacity: 1.0 - style.disabledOpacity } + } + + transitions: Transition { + from: "active" + SequentialAnimation { + PauseAnimation { duration: 450 } + NumberAnimation { target: handle; duration: 200; property: "opacity"; to: 0.0 } + } + } + } +} diff --git a/src/imports/controls/ScrollIndicator.qml b/src/imports/controls/ScrollIndicator.qml new file mode 100644 index 00000000..7a4bbba6 --- /dev/null +++ b/src/imports/controls/ScrollIndicator.qml @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractScrollIndicator { + id: control + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + indicator.implicitWidth + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + indicator.implicitHeight + padding.top + padding.bottom) + + Accessible.role: Accessible.Indicator + + padding { top: 2; left: 2; right: 2; bottom: 2 } + + indicator: Rectangle { + id: indicator + + implicitWidth: 2 + implicitHeight: 2 + + color: style.frameColor + visible: control.size < 1.0 + opacity: 0.0 + + readonly property bool horizontal: control.orientation === Qt.Horizontal + x: padding.left + (horizontal ? control.position * control.width : 0) + y: padding.top + (horizontal ? 0 : control.position * control.height) + width: horizontal ? control.size * control.width - padding.left - padding.right : implicitWidth + height: horizontal ? implicitHeight : control.size * control.height - padding.top - padding.bottom + + states: State { + name: "active" + when: control.active + PropertyChanges { target: indicator; opacity: 1.0 - style.disabledOpacity } + } + + transitions: [ + Transition { + from: "active" + SequentialAnimation { + PauseAnimation { duration: 450 } + NumberAnimation { target: indicator; duration: 200; property: "opacity"; to: 0.0 } + } + } + ] + } +} diff --git a/src/imports/controls/Slider.qml b/src/imports/controls/Slider.qml new file mode 100644 index 00000000..fc6abc60 --- /dev/null +++ b/src/imports/controls/Slider.qml @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractSlider { + id: control + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + Math.max(track ? track.implicitWidth : 0, + handle ? handle.implicitWidth : 0) + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + Math.max(track ? track.implicitHeight : 0, + handle ? handle.implicitHeight : 0) + padding.top + padding.bottom) + + Accessible.pressed: pressed + Accessible.role: Accessible.Slider + + padding { top: style.padding; left: style.padding; right: style.padding; bottom: style.padding } + + handle: Rectangle { + implicitWidth: 20 + implicitHeight: 20 + radius: width / 2 + border.width: control.activeFocus ? 2 : 1 + border.color: control.activeFocus ? style.focusColor : style.frameColor + color: style.backgroundColor + + readonly property bool horizontal: control.orientation === Qt.Horizontal + x: horizontal ? control.visualPosition * (control.width - width) : (control.width - width) / 2 + y: horizontal ? (control.height - height) / 2 : control.visualPosition * (control.height - height) + + Rectangle { + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + width: 12 + height: 12 + radius: width / 2 + + color: Qt.tint(Qt.tint(style.accentColor, + control.activeFocus ? style.focusColor : "transparent"), + control.pressed ? style.pressColor : "transparent") + } + } + + track: Rectangle { + readonly property bool horizontal: control.orientation === Qt.Horizontal + implicitWidth: horizontal ? 120 : 6 + implicitHeight: horizontal ? 6 : 120 + x: horizontal ? padding.left : (control.width - width) / 2 + y: horizontal ? (control.height - height) / 2 : padding.top + width: horizontal ? parent.width - padding.left - padding.right : implicitWidth + height: horizontal ? implicitHeight : parent.height - padding.top - padding.bottom + + radius: style.roundness + border.color: style.frameColor + color: style.backgroundColor + scale: control.effectiveLayoutDirection === Qt.RightToLeft ? -1 : 1 + + Rectangle { + x: 2 + y: 2 + width: control.position * parent.width - 4 + height: 2 + + color: style.accentColor + radius: style.roundness + } + } +} diff --git a/src/imports/controls/SpinBox.qml b/src/imports/controls/SpinBox.qml new file mode 100644 index 00000000..cf11cfdb --- /dev/null +++ b/src/imports/controls/SpinBox.qml @@ -0,0 +1,132 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractSpinBox { + id: control + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + (upButton ? upButton.implicitWidth : 0) + + (downButton ? downButton.implicitWidth : 0) + + (input ? input.implicitWidth : 0) + style.padding * 2) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + (upButton ? upButton.implicitHeight : 0), + (downButton ? downButton.implicitHeight : 0), + (input ? input.implicitHeight : 0) + style.padding * 2) + + Accessible.role: Accessible.SpinBox + + input: TextInput { + x: upButton.width + width: parent.width - upButton.width - downButton.width + height: parent.height + + color: style.textColor + selectionColor: style.selectionColor + selectedTextColor: style.selectedTextColor + horizontalAlignment: Qt.AlignHCenter + verticalAlignment: Qt.AlignVCenter + Keys.forwardTo: control + } + + validator: IntValidator { } + + upButton: Item { + implicitWidth: 26 + height: parent.height + x: parent.width - width + + opacity: enabled ? 1.0 : style.disabledOpacity + clip: true + Rectangle { + x: -radius + width: parent.width + radius + height: parent.height + radius: style.roundness + color: Qt.tint(Qt.tint(style.accentColor, + control.activeFocus ? style.focusColor : "transparent"), + pressed === AbstractSpinBox.UpButton ? style.pressColor : "transparent") + } + Rectangle { + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + width: parent.width / 3 + height: 2 + color: control.style.selectedTextColor + } + Rectangle { + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + width: 2 + height: parent.height / 3 + color: control.style.selectedTextColor + } + } + + downButton: Item { + implicitWidth: 26 + height: parent.height + + opacity: enabled ? 1.0 : style.disabledOpacity + clip: true + Rectangle { + width: parent.width + radius + height: parent.height + radius: style.roundness + color: Qt.tint(Qt.tint(style.accentColor, + control.activeFocus ? style.focusColor : "transparent"), + pressed === AbstractSpinBox.DownButton ? style.pressColor : "transparent") + } + Rectangle { + x: (parent.width - width) / 2 + y: (parent.height - height) / 2 + width: parent.width / 3 + height: 2 + color: control.style.selectedTextColor + } + } + + background: Rectangle { + implicitWidth: 120 + radius: style.roundness + border.width: control.activeFocus ? 2 : 1 + border.color: control.activeFocus ? style.focusColor : style.frameColor + opacity: enabled ? 1.0 : style.disabledOpacity + color: input.acceptableInput ? "white" : "lightpink" + } +} diff --git a/src/imports/controls/StackView.js b/src/imports/controls/StackView.js new file mode 100644 index 00000000..37e2066d --- /dev/null +++ b/src/imports/controls/StackView.js @@ -0,0 +1,63 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +var stackView = []; + +function push(p) +{ + if (!p) + return + stackView.push(p) + __depth++ + return p +} + +function pop() +{ + if (stackView.length === 0) + return null + var p = stackView.pop() + __depth-- + return p +} + +function current() +{ + if (stackView.length === 0) + return null + return stackView[stackView.length-1] +} + diff --git a/src/imports/controls/StackView.qml b/src/imports/controls/StackView.qml new file mode 100644 index 00000000..2c75f063 --- /dev/null +++ b/src/imports/controls/StackView.qml @@ -0,0 +1,954 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.2 +import QtQuick.Controls 2.0 +import "StackView.js" as JSArray + +/*! + \qmltype StackView + \inherits Item + \ingroup views + \inqmlmodule QtQuick.Controls + \since 5.1 + + \brief Provides a stack-based navigation model. + + \image stackview.png + + StackView implements a stack-based navigation model, which can be used + with a set of interlinked information pages. Items are pushed onto the stack + as the user navigates deeper into the material, and popped off again when he + chooses to go back. + + The \l{Qt Quick Controls - Touch Gallery}{touch gallery} example is a good + starting point to understand how StackView works. The following snippet + from the example shows how it can be used: + + \qml + StackView { + id: stack + initialItem: view + + Component { + id: view + + MouseArea { + Text { + text: stack.depth + anchors.centerIn: parent + } + onClicked: stack.push(view) + } + } + } + \endqml + + \section1 Using StackView in an Application + Using the StackView in the application is typically a simple matter of adding + the StackView as a child of a Window. The stack is usually anchored to the + edges of the window, except at the top or bottom where it might be anchored + to a status bar, or some other similar UI component. The stack can then be + used by invoking its navigation methods. The first item to show in the StackView + is commonly loaded assigning it to \l initialItem. + + \note Items pushed onto the stack view have \l{Supported Attached Properties}{Stack attached properties}. + + \section1 Basic Navigation + There are three primary navigation operations in StackView: push(), pop(), and + replace (replace by specifying argument \c replace to push()). + These correspond to classic stack operations where "push" adds an item to the + top of a stack, "pop" removes the top item from the stack, and "replace" is like a + pop followed by a push in that it replaces the topmost item on the stack with + a new item (but the applied transtition might be different). The topmost item + in the stack corresponds to the one that is \l{StackView::currentItem} {currently} + visible on the screen. That means that "push" is the logical equivalent of navigating + forward or deeper into the application, "pop" is the equivalent of navigating back, + and "replace" is the equivalent of replacing the current item. + + Sometimes it is necessary to go back more than a single step in the stack, for + example, to return to a "main" item or some kind of section item in the application. + For this use case, it is possible to specify an item as a parameter for pop(). + This is called an "unwind" operation as the stack gets unwound to the specified item. + If the item is not found then the stack unwinds until there is only a single item in + the stack, which becomes the current item. To explicitly unwind to the bottom + of the stack it is recommended to use \l{pop()} {pop(null)}, though technically any + non-existent item will do. + + Given the stack [A, B, C]: + + \list + \li \l{push()}{push(D)} => [A, B, C, D] - "push" transition animation between C and D + \li pop() => [A, B] - "pop" transition animation between C and B + \li \l{push()}{push(D, replace)} => [A, B, D] - "replace" transition between C and D + \li \l{pop()}{pop(A)} => [A] - "pop" transition between C and A + \endlist + + \note Note that when the stack is empty, a push() will not perform a + transition animation because there is nothing to transition from (typically during + application start-up). A pop() on a stack with depth 1 or 0 is a no-operation. + If removing all items from the stack is needed, a separate function clear() is + available. + + Calling push() returns the item that was pushed onto the stack. + Calling pop() returns the item that was popped off the stack. When pop() is + called in an unwind operation the top-most item (the first item that was + popped, which will also be the one transitioning out) is returned. + + \section1 Deep Linking + \e{Deep linking} means launching an application into a particular state. For example, + a newspaper application could be launched into showing a particular article, + bypassing the front item (and possibly a section item) that would normally have + to be navigated through to get to the article concerned. In terms of StackView, deep + linking means the ability to modify the state of the stack, so much so that it is + possible to push a set of items to the top of the stack, or to completely reset + the stack to a given state. + + The API for deep linking in StackView is the same as for basic navigation. Pushing + an array instead of a single item, will involve that all the items in that array will + be pushed onto the stack. The transition animation, however, will be conducted as + if only the last item in the array was pushed onto the stack. The normal semantics + of push() apply for deep linking, meaning that push() adds whatever is pushed onto + the stack. Note also that only the last item of the array will be loaded. + The rest will be lazy-loaded as needed when entering the screen upon subsequent + calls to pop (or when requesting the item by using \a get). + + This gives us the following result, given the stack [A, B, C]: + + \list + \li \l{push()}{push([D, E, F])} => [A, B, C, D, E, F] - "push" transition animation between C and F + \li \l{push()}{push([D, E, F], replace)} => [A, B, D, E, F] - "replace" transition animation between C and F + \li clear(); \l{push()}{push([D, E, F])} => [D, E, F] - no transition animation (since the stack was empty) + \endlist + + \section1 Pushing items + + An item pushed onto the StackView can be either an Item, a URL, a string + with a URL, or a Component. To push it, assign it to a property "item" + inside a property list, and send it as an argument to \l{StackView::push}{push}: + + \code + stackView.push({item: yourItem}) + \endcode + + The list can contain several properties that control how the item should be pushed: + \list + \li \c item: this property is required, and holds the item to be pushed. + \li \c properties: a list of QML properties to be assigned to the item upon push. These + properties will be copied into the item at load time, or when the item will become + the current item (normally upon push). + \li \c immediate: set this property to \c true to skip transition effects. When pushing + an array, this property only needs to be set on the first element to make the + whole operation immediate. + \li \c replace: set this property to replace the current item on the stack. When pushing + an array, you only need to set this property on the first element to replace + as many elements on the stack as inside the array. + \li \c destroyOnPop: set this boolean to true if StackView needs to destroy the item when + it is popped off the stack. By default (if \a destroyOnPop is not specified), StackView + will destroy items pushed as components or URLs. Items not destroyed will be re-parented + back to the original parents they had before being pushed onto the stack and hidden. + If you need to set this property, do it with care, so that items are not leaked. + \endlist + + If the only argument needed is "item", the following short-hand notation can be applied: + + \code + stackView.push(yourItem) + \endcode + + You can push several items in one go by using an array of property lists. This is + optimizing compared to pushing items one by one, since StackView then can load only the + last item in the list. The rest will be loaded as they are about to become + the current item (which happens when the stack is popped). The following example shows how + to push an array of items: + + \code + stackView.push([{item: yourItem1}, {item: yourItem2}]) + \endcode + + If an inline item is pushed, the item is temporarily re-parented into the StackView. When the item + is later popped off, it gets re-parented back to its original owner again. + If, however, an item is pushed as a component or a URL, the actual item will be created as an + item from that component. This happens automatically when the item is about to become the current + item in the stack. Ownership of the item will then normally be taken by the StackView. It will as + such automatically destroy the item when it is later popped off. The component that declared the item, by + contrast, remains in the ownership of the application and is not destroyed by the stack. + This can be overridden by explicitly setting \c{destroyOnPop} in the list of arguments given to push. + + If the \c properties to be pushed are specified, they will be copied into the item at loading time + (in case of a component or URL), or when the item will become the current item (in case of an inline + item). The following example shows how this can be done: + + \code + stackView.push({item: someItem, properties: {fgcolor: "red", bgcolor: "blue"}}) + \endcode + + + \note Note that if an item is declared inside another item, and if that parent gets destroyed, + (even if a component was used), that child item will also be destroyed. + This follows normal Qt parent-child destruction rules, but sometimes comes as a surprise + for developers. + + \section1 Lifecycle + An item's lifecycle in the StackView can have the following transitions: + \list 1 + \li instantiation + \li inactive + \li activating + \li active + \li deactivating + \li inactive + \li destruction + \endlist + + It can move any number of times between inactive and active. When an item is activated, + it's visible on the screen and is considered to be the current item. An item + in a StackView that is not visible is not activated, even if the item is currently the + top-most item in the stack. When the stack becomes visible, the item that is top-most gets + activated. Likewise if the stack is then hidden, the topmost item would be deactivated. + Popping the item off the top of the stack at this point would not result in further + deactivation since the item is not active. + + There is an attached \l{Stack::status}{Stack.status} property that tracks the lifecycle. The + status values list is an enumeration with values \c Stack.Inactive, \c Stack.Activating, + \c Stack.Active and \c Stack.Deactivating. Combined with the normal \c Component.onComplete and + \c Component.onDestruction signals the entire lifecycle is thus: + + \list + \li Created: Component.onCompleted() + \li Activating: Stack.onStatusChanged (Stack.status is Stack.Activating) + \li Acivated: Stack.onStatusChanged (Stack.status is Stack.Active) + \li Deactivating: Stack.onStatusChanged (Stack.status is Stack.Deactivating) + \li Deactivated: Stack.onStatusChanged (Stack.status is Stack.Inactive) + \li Destruction: Component.onDestruction() + \endlist + + \section1 Finding items + Sometimes it is necessary to search for an item, for example, in order to unwind the stack to + an item to which the application does not have a reference. This is facilitated using a + function find() in StackView. The find() function takes a callback function as its + only argument. The callback gets invoked for each item in the stack (starting at the top). + If the callback returns true, then it signals that a match has been found and the find() + function returns that item. If the callback fails to return true (no match is found), + then find() returns \c null. + + The code below searches for an item in the stack that has a name "order_id" and then unwinds to + that item. Note that since find() returns \c {null} if no item is found, and since pop unwinds to + the bottom of the stack if null is given as the target item, the code works well even in + case no matching item is found. + + \code + stackView.pop(stackView.find(function(item) { + return item.name == "order_id"; + })); + \endcode + + You can also get to an item in the stack using \l {get()}{get(index)}. You should use + this function if your item depends on another item in the stack, as the function will + ensure that the item at the given index gets loaded before it is returned. + + \code + previousItem = stackView.get(myItem.Stack.index - 1)); + \endcode + + \section1 Transitions + + A transition is performed whenever a item is pushed or popped, and consists of + two items: enterItem and exitItem. The StackView itself will never move items + around, but instead delegate the job to an external animation set provided + by the style or the application developer. How items should visually enter and leave the stack + (and the geometry they should end up with) is therefore completely controlled from the outside. + + When the transition starts, the StackView will search for a transition that + matches the operation executed. There are three transitions to choose + from: pushTransition, popTransition, and replaceTransition. Each implements how + enterItem should animate in, and exitItem out. The transitions are + collected inside a StackViewDelegate object assigned to + \l {StackView::delegate}{delegate}. By default, popTransition and + replaceTransition will be the same as pushTransition, unless you set them + to something else. + + A simple fade transition could be implemented as: + + \qml + StackView { + delegate: StackViewDelegate { + function transitionFinished(properties) + { + properties.exitItem.opacity = 1 + } + + pushTransition: StackViewTransition { + PropertyAnimation { + target: enterItem + property: "opacity" + from: 0 + to: 1 + } + PropertyAnimation { + target: exitItem + property: "opacity" + from: 1 + to: 0 + } + } + } + } + \endqml + + PushTransition needs to inherit from StackViewTransition, which is a ParallelAnimation that + contains the properties \c enterItem and \c exitItem. You set the target of your + inner animations to those items. Since the same items instance can be pushed several + times to a StackView, you should always override + \l {StackViewDelegate::transitionFinished()}{StackViewDelegate.transitionFinished()}. + Implement this function to reset any properties animated on the exitItem so that later + transitions can expect the items to be in a default state. + + A more complex example could look like the following. Here, the items are lying on the side before + being rotated to an upright position: + + \qml + StackView { + delegate: StackViewDelegate { + function transitionFinished(properties) + { + properties.exitItem.x = 0 + properties.exitItem.rotation = 0 + } + + pushTransition: StackViewTransition { + SequentialAnimation { + ScriptAction { + script: enterItem.rotation = 90 + } + PropertyAnimation { + target: enterItem + property: "x" + from: enterItem.width + to: 0 + } + PropertyAnimation { + target: enterItem + property: "rotation" + from: 90 + to: 0 + } + } + PropertyAnimation { + target: exitItem + property: "x" + from: 0 + to: -exitItem.width + } + } + } + } + \endqml + + \section2 Advanced usage + + When the StackView needs a new transition, it first calls + \l {StackViewDelegate::getTransition()}{StackViewDelegate.getTransition()}. + The base implementation of this function just looks for a property named \c properties.name inside + itself (root), which is how it finds \c {property Component pushTransition} in the examples above. + + \code + function getTransition(properties) + { + return root[properties.name] + } + \endcode + + You can override this function for your delegate if you need extra logic to decide which + transition to return. You could for example introspect the items, and return different animations + depending on the their internal state. StackView will expect you to return a Component that + contains a StackViewTransition, or a StackViewTransition directly. The former is easier, as StackView will + then create the transition and later destroy it when it's done, while avoiding any sideeffects + caused by the transition being alive long after it has run. Returning a StackViewTransition directly + can be useful if you need to write some sort of transition caching for performance reasons. + As an optimization, you can also return \c null to signal that you just want to show/hide the items + immediately without creating or running any transitions. You can also override this function if + you need to alter the items in any way before the transition starts. + + \c properties contains the properties that will be assigned to the StackViewTransition before + it runs. In fact, you can add more properties to this object during the call + if you need to initialize additional properties of your custom StackViewTransition when the returned + component is instantiated. + + The following example shows how you can decide which animation to use during runtime : + + \qml + StackViewDelegate { + function getTransition(properties) + { + return (properties.enterItem.Stack.index % 2) ? horizontalTransition : verticalTransition + } + + function transitionFinished(properties) + { + properties.exitItem.x = 0 + properties.exitItem.y = 0 + } + + property Component horizontalTransition: StackViewTransition { + PropertyAnimation { + target: enterItem + property: "x" + from: target.width + to: 0 + duration: 300 + } + PropertyAnimation { + target: exitItem + property: "x" + from: 0 + to: target.width + duration: 300 + } + } + + property Component verticalTransition: StackViewTransition { + PropertyAnimation { + target: enterItem + property: "y" + from: target.height + to: 0 + duration: 300 + } + PropertyAnimation { + target: exitItem + property: "y" + from: 0 + to: target.height + duration: 300 + } + } + } + \endqml + + \section1 Supported Attached Properties + + Items in a StackView support these attached properties: + \list + \li \l{Stack::index}{Stack.index} - Contains the index of the item inside the StackView + \li \l{Stack::view}{Stack.view} - Contains the StackView the item is in + \li \l{Stack::status}{Stack.status} - Contains the status of the item + \endlist +*/ + +AbstractStackView { + id: root + + depth: root.__depth + currentItem: root.__currentItem + initialItem: null + busy: __currentTransition !== null + + /*! The transitions to use when pushing or popping items. + For better understanding on how to apply custom transitions, read \l{Transitions}. + \sa {Stack::transitions}{Stack.transitions} */ + property StackViewDelegate delegate: StackViewDelegate {} + + /*! Pushes an item onto the stack. The function takes a property list as argument, which + should contain one or more of the following properties: + \list + \li \c item: this property is required, and holds the item you want to push. + \li \c properties: a list of QML properties that should be assigned + to the item upon push. These properties will be copied into the item when it is + loaded (in case of a component or URL), or when it becomes the current item for the + first time (normally upon push). + \li \c immediate: set this property to \c true to skip transition effects. When pushing + an array, you only need to set this property on the first element to make the + whole operation immediate. + \li \c replace: set this property to replace the current item on the stack. When pushing + an array, you only need to set this property on the first element to replace + as many elements on the stack as inside the array. + \li \c destroyOnPop: set this property to specify if the item needs to be destroyed + when its popped off the stack. By default (if \a destroyOnPop is not specified), + StackView will destroy items pushed as components or URLs. Items + not destroyed will be re-parented to the original parents they had before being + pushed onto the stack, and hidden. If you need to set this property, do it with + care, so that items are not leaked. + \endlist + + You can also push an array of items (property lists) if you need to push several items + in one go. A transition will then only occur between the current item and the last + item in the list. Loading the other items will be deferred until needed. + + Examples: + \list + \li stackView.push({item:anItem}) + \li stackView.push({item:aURL, immediate: true, replace: true}) + \li stackView.push({item:aRectangle, properties:{color:"red"}}) + \li stackView.push({item:aComponent, properties:{color:"red"}}) + \li stackView.push({item:aComponent.createObject(), destroyOnPop:true}) + \li stackView.push([{item:anitem, immediate:true}, {item:aURL}]) + \endlist + + \note Note: if the only argument needed is "item", you can apply the following short- + hand notation: \c{stackView.push(anItem)}. + + Returns the item that became current. + + \sa initialItem + \sa {Pushing items} + */ + function push(item) { + // Note: we support two different APIs in this function; The old meego API, and + // the new "property list" API. Hence the reason for hiding the fact that you + // can pass more arguments than shown in the signature: + if (__recursionGuard(true)) + return + var properties = arguments[1] + var immediate = arguments[2] + var replace = arguments[3] + var arrayPushed = (item instanceof Array) + var firstItem = arrayPushed ? item[0] : item + immediate = (immediate || JSArray.stackView.length === 0) + + if (firstItem && firstItem.item && firstItem.hasOwnProperty("x") === false) { + // Property list API used: + immediate = immediate || firstItem.immediate + replace = replace || firstItem.replace + } + + // Create, and push, a new javascript object, called "element", onto the stack. + // This element contains all the information necessary to construct the item, and + // will, after loaded, also contain the loaded item: + if (arrayPushed) { + if (item.length === 0) + return + var outElement = replace ? JSArray.pop() : JSArray.current() + for (var i=0; i<item.length; ++i) + JSArray.push({itemComponent:item[i], loaded: false, index: __depth, properties: properties}); + } else { + outElement = replace ? JSArray.pop() : JSArray.current() + JSArray.push({itemComponent:item, loaded: false, index: __depth, properties: properties}) + } + + var currentElement = JSArray.current() + var transition = { + inElement: currentElement, + outElement: outElement, + immediate: immediate, + replace: replace, + push: true + } + __performTransition(transition) + __recursionGuard(false) + return __currentItem + } + + /*! Pops one or more items off the stack. The function takes a property list as argument + which can contain one or more of the following properties: + \list + \li \c item: if specified, all items down to (but not including) \a item will be + popped off. If \a item is \c null, all items down to (but not including) the + first item will be popped. If not specified, only the current item will be + popped. + \li \c immediate: set this property to \c true to skip transition effects. + \endlist + + Examples: + \list + \li stackView.pop() + \li stackView.pop({item:someItem, immediate: true}) + \li stackView.pop({immediate: true}) + \li stackView.pop(null) + \endlist + + \note Note: If the only argument needed is "item", you can apply the following short- + hand notation: \c{stackView.pop(anItem)}. + + Returns the item that was popped off + \sa clear() + */ + function pop(item) { + if (__depth <= 1) + return null + if (item && item.hasOwnProperty("x") === false) { + // Property list API used: + var immediate = (item.immediate === true) + item = item.item + } else { + immediate = (arguments[1] === true) + } + + if (item === __currentItem) + return + + if (__recursionGuard(true)) + return + + var outElement = JSArray.pop() + var inElement = JSArray.current() + + if (__depth > 1 && item !== undefined && item !== inElement.item) { + // Pop from the top until we find 'item', and return the corresponding + // element. Skip all non-loaded items (except the first), since no one + // has any references to such items anyway: + while (__depth > 1 && !JSArray.current().loaded) + JSArray.pop() + inElement = JSArray.current() + while (__depth > 1 && item !== inElement.item) { + JSArray.pop() + __cleanup(inElement) + while (__depth > 1 && !JSArray.current().loaded) + JSArray.pop() + inElement = JSArray.current() + } + } + + var transition = { + inElement: inElement, + outElement: outElement, + immediate: immediate, + replace: false, + push: false + } + __performTransition(transition) + __recursionGuard(false) + return outElement.item; + } + + /*! Remove all items from the stack. No animations will be applied. */ + function clear() { + if (__recursionGuard(true)) + return + if (__currentTransition) + __currentTransition.animation.complete() + __currentItem = null + var count = __depth + for (var i=0; i<count; ++i) { + var element = JSArray.pop() + if (element.item) + __cleanup(element); + } + __recursionGuard(false) + } + + /*! Search for a specific item inside the stack. \a func will + be called for each item in the stack (with the item as argument) + until the function returns true. Return value will be the item found. For + example: + find(function(item, index) { return item.isTheOne }) + Set \a onlySearchLoadedItems to \c true to not load items that are + not loaded into memory */ + function find(func, onlySearchLoadedItems) { + for (var i=__depth-1; i>=0; --i) { + var element = JSArray.stackView[i]; + if (onlySearchLoadedItems !== true) + __loadElement(element) + else if (!element.item) + continue + if (func(element.item, i)) + return element.item + } + return null; + } + + /*! Returns the item at position \a index in + the stack. If \a dontLoad is true, the + item will not be forced to load (and \c null + will be returned if not yet loaded) */ + function get(index, dontLoad) + { + if (index < 0 || index >= JSArray.stackView.length) + return null + var element = JSArray.stackView[index] + if (dontLoad !== true) { + __loadElement(element) + return element.item + } else if (element.item) { + return element.item + } else { + return null + } + } + + /*! Immediately completes any ongoing transition. + /sa Animation.complete + */ + function completeTransition() + { + if (__recursionGuard(true)) + return + if (__currentTransition) + __currentTransition.animation.complete() + __recursionGuard(false) + } + + /********* DEPRECATED API *********/ + + /*! \internal + \deprecated Use Push() instead */ + function replace(item, properties, immediate) { + push(item, properties, immediate, true) + } + + /********* PRIVATE API *********/ + + /*! \internal The currently top-most item on the stack. */ + property Item __currentItem: null + /*! \internal The number of items currently pushed onto the stack. */ + property int __depth: 0 + /*! \internal Stores the transition info while a transition is ongoing */ + property var __currentTransition: null + /*! \internal Stops the user from pushing items while preparing a transition */ + property bool __guard: false + + Component.onCompleted: { + if (initialItem) + push(initialItem) + } + + Component.onDestruction: { + if (__currentTransition) + __currentTransition.animation.complete() + __currentItem = null + } + + /*! \internal */ + function __recursionGuard(use) + { + if (use && __guard) { + console.warn("Warning: StackView: You cannot push/pop recursively!") + console.trace() + return true + } + __guard = use + } + + /*! \internal */ + function __loadElement(element) + { + if (element.loaded) { + if (!element.item) { + element.item = invalidItemReplacement.createObject(root) + element.item.text = "\nError: The item has been deleted outside StackView!" + } + return + } + if (!element.itemComponent) { + element.item = invalidItemReplacement.createObject(root) + element.item.text = "\nError: Invalid item (item was 'null'). " + + "This might indicate that the item was deleted outside StackView!" + return + } + + var comp = __resolveComponent(element.itemComponent, element) + + // Assign properties to item: + if (!element.properties) + element.properties = {} + + if (comp.hasOwnProperty("createObject")) { + if (comp.status === Component.Error) { + element.item = invalidItemReplacement.createObject(root) + element.item.text = "\nError: Could not load: " + comp.errorString() + } else { + element.item = comp.createObject(root, element.properties) + // Destroy items we create unless the user specified something else: + if (!element.hasOwnProperty("destroyOnPop")) + element.destroyOnPop = true + } + } else { + // comp is already an Item, so just re-parent it into the StackView: + element.item = comp + element.originalParent = parent + element.item.parent = root + for (var prop in element.properties) { + if (element.item.hasOwnProperty(prop)) + element.item[prop] = element.properties[prop]; + } + // Do not destroy items we didn't create, unless the user specified something else: + if (!element.hasOwnProperty("destroyOnPop")) + element.destroyOnPop = false + } + +//TODO element.item.Stack.__index = element.index +//TODO element.item.Stack.__view = root + // Let item fill all available space by default: + element.item.width = Qt.binding(function() { return root.width }) + element.item.height = Qt.binding(function() { return root.height }) + element.loaded = true + } + + /*! \internal */ + function __resolveComponent(unknownObjectType, element) + { + // We need this extra resolve function since we don't really + // know what kind of object the user pushed. So we try to + // figure it out by inspecting the object: + if (unknownObjectType.hasOwnProperty("createObject")) { + return unknownObjectType + } else if (typeof unknownObjectType == "string") { + return Qt.createComponent(unknownObjectType) + } else if (unknownObjectType.hasOwnProperty("x")) { + return unknownObjectType + } else if (unknownObjectType.hasOwnProperty("item")) { + // INVARIANT: user pushed a JS-object + element.properties = unknownObjectType.properties + if (!unknownObjectType.item) + unknownObjectType.item = invalidItemReplacement + if (unknownObjectType.hasOwnProperty("destroyOnPop")) + element.destroyOnPop = unknownObjectType.destroyOnPop + return __resolveComponent(unknownObjectType.item, element) + } else { + // We cannot determine the type, so assume its a URL: + return Qt.createComponent(unknownObjectType) + } + } + + /*! \internal */ + function __cleanup(element) { + // INVARIANT: element has been removed from JSArray. Destroy its + // item, or re-parent it back to the parent it had before it was pushed: + var item = element.item + if (element.destroyOnPop) { + item.destroy() + } else { + // Mark the item as no longer part of the StackView. It + // might reenter on pop if pushed several times: + item.visible = false + __setStatus(item, Stack.Inactive) +//TODO item.Stack.__view = null +//TODO item.Stack.__index = -1 + if (element.originalParent) + item.parent = element.originalParent + } + } + + /*! \internal */ + function __setStatus(item, status) { + item.Stack.status = status + } + + /*! \internal */ + function __performTransition(transition) + { + // Animate item in "outElement" out, and item in "inElement" in. Set a guard to protect + // the user from pushing new items on signals that will fire while preparing for the transition + // (e.g Stack.onCompleted, Stack.onStatusChanged, Stack.onIndexChanged etc). Otherwise, we will enter + // this function several times, which causes the items to be updated half-way. + if (__currentTransition) + __currentTransition.animation.complete() + __loadElement(transition.inElement) + + transition.name = transition.replace ? "replaceTransition" : (transition.push ? "pushTransition" : "popTransition") + var enterItem = transition.inElement.item + transition.enterItem = enterItem + + // Since an item can be pushed several times, we need to update its properties: + enterItem.parent = root +//TODO enterItem.Stack.__view = root +//TODO enterItem.Stack.__index = transition.inElement.index + __currentItem = enterItem + + if (!transition.outElement) { + // A transition consists of two items, but we got just one. So just show the item: + enterItem.visible = true + __setStatus(enterItem, Stack.Activating) + __setStatus(enterItem, Stack.Active) + return + } + + var exitItem = transition.outElement.item + transition.exitItem = exitItem + if (enterItem === exitItem) + return + + if (root.delegate) { + transition.properties = { + "name":transition.name, + "enterItem":transition.enterItem, + "exitItem":transition.exitItem, + "immediate":transition.immediate } + var anim = root.delegate.getTransition(transition.properties) + if (anim.createObject) { + anim = anim.createObject(null, transition.properties) + anim.runningChanged.connect(function(){ if (anim.running === false) anim.destroy() }) + } + transition.animation = anim + } + + if (!transition.animation) { + console.warn("Warning: StackView: no", transition.name, "found!") + return + } + if (enterItem.anchors.fill || exitItem.anchors.fill) + console.warn("Warning: StackView: cannot transition an item that is anchored!") + + __currentTransition = transition + __setStatus(exitItem, Stack.Deactivating) + enterItem.visible = true + __setStatus(enterItem, Stack.Activating) + transition.animation.runningChanged.connect(animationFinished) + transition.animation.start() + // NB! For empty animations, "animationFinished" is already + // executed at this point, leaving __animation === null: + if (transition.immediate === true && transition.animation) + transition.animation.complete() + } + + /*! \internal */ + function animationFinished() + { + if (!__currentTransition || __currentTransition.animation.running) + return + + __currentTransition.animation.runningChanged.disconnect(animationFinished) + __currentTransition.exitItem.visible = false + __setStatus(__currentTransition.exitItem, Stack.Inactive); + __setStatus(__currentTransition.enterItem, Stack.Active); + __currentTransition.properties.animation = __currentTransition.animation + root.delegate.transitionFinished(__currentTransition.properties) + + if (!__currentTransition.push || __currentTransition.replace) + __cleanup(__currentTransition.outElement) + + __currentTransition = null + } + + /*! \internal */ + property Component invalidItemReplacement: Component { + Text { + width: parent.width + height: parent.height + wrapMode: Text.WrapAtWordBoundaryOrAnywhere + } + } +} diff --git a/src/imports/controls/StackViewDelegate.qml b/src/imports/controls/StackViewDelegate.qml new file mode 100644 index 00000000..2d4355bd --- /dev/null +++ b/src/imports/controls/StackViewDelegate.qml @@ -0,0 +1,142 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.2 + +/*! + \qmltype StackViewDelegate + \inqmlmodule QtQuick.Controls + \since 5.1 + + \brief A delegate used by StackView for loading transitions. + + See the documentation for the \l {StackView} component. + +*/ +QtObject { + id: root + + property bool horizontal: true + + function getTransition(properties) + { + return root[horizontal ? "horizontalSlide" : "verticalSlide"][properties.name] + } + + function transitionFinished(properties) + { + properties.exitItem.x = 0 + properties.exitItem.y = 0 + } + + property QtObject horizontalSlide: QtObject { + property Component pushTransition: StackViewTransition { + PropertyAnimation { + target: enterItem + property: "x" + from: target.width + to: 0 + duration: 400 + easing.type: Easing.OutCubic + } + PropertyAnimation { + target: exitItem + property: "x" + from: 0 + to: -target.width + duration: 400 + easing.type: Easing.OutCubic + } + } + + property Component popTransition: StackViewTransition { + PropertyAnimation { + target: enterItem + property: "x" + from: -target.width + to: 0 + duration: 400 + easing.type: Easing.OutCubic + } + PropertyAnimation { + target: exitItem + property: "x" + from: 0 + to: target.width + duration: 400 + easing.type: Easing.OutCubic + } + } + property Component replaceTransition: pushTransition + } + + property QtObject verticalSlide: QtObject { + property Component pushTransition: StackViewTransition { + PropertyAnimation { + target: enterItem + property: "y" + from: target.height + to: 0 + duration: 300 + } + PropertyAnimation { + target: exitItem + property: "y" + from: 0 + to: -target.height + duration: 300 + } + } + + property Component popTransition: StackViewTransition { + PropertyAnimation { + target: enterItem + property: "y" + from: -target.height + to: 0 + duration: 300 + } + PropertyAnimation { + target: exitItem + property: "y" + from: 0 + to: target.height + duration: 300 + } + property Component replaceTransition: pushTransition + } + } +} diff --git a/src/imports/controls/StackViewTransition.qml b/src/imports/controls/StackViewTransition.qml new file mode 100644 index 00000000..f057791c --- /dev/null +++ b/src/imports/controls/StackViewTransition.qml @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.2 + +ParallelAnimation { + id: root + /*! The name of the animation that is running. Can be one of the following: + \list + \li 'PushTransition' + \li 'PopTransition' + \li 'ReplaceTransition' + \endlist + */ + property string name + /*! The page that is transitioning in. */ + property Item enterItem + /*! The page that is transitioning out */ + property Item exitItem + /*! Set to \c true if the transition is told to + fast-forward directly to its end-state */ + property bool immediate +} diff --git a/src/imports/controls/Switch.qml b/src/imports/controls/Switch.qml new file mode 100644 index 00000000..51768cc6 --- /dev/null +++ b/src/imports/controls/Switch.qml @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractSwitch { + id: control + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + (label ? label.implicitWidth : 0) + + (indicator ? indicator.implicitWidth : 0) + + (label && indicator ? style.spacing : 0) + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + Math.max(label ? label.implicitHeight : 0, + indicator ? indicator.implicitHeight : 0) + padding.top + padding.bottom) + + Accessible.name: text + Accessible.checkable: true + Accessible.checked: checked + Accessible.pressed: pressed + Accessible.role: Accessible.Button // TODO: Switch? + + padding { top: style.padding; left: style.padding; right: style.padding; bottom: style.padding } + + indicator: Rectangle { + readonly property bool mirror: control.effectiveLayoutDirection == Qt.RightToLeft + + implicitWidth: 36 + implicitHeight: 20 + x: text ? (mirror ? parent.width - width - padding.right : padding.left) : (parent.width - width) / 2 + y: (parent.height - height) / 2 + + radius: 10 + border.width: control.activeFocus ? 2 : 1 + border.color: control.activeFocus ? style.focusColor : style.frameColor + opacity: enabled ? 1.0 : style.disabledOpacity + color: style.backgroundColor + + Rectangle { + width: 12 + height: 12 + radius: 6 + + color: Qt.tint(Qt.tint(control.checked ? style.accentColor : style.baseColor, + control.checked && control.activeFocus ? style.focusColor : "transparent"), + control.pressed ? style.pressColor : "transparent") + border.width: control.checked || control.pressed ? 0 : 1 + border.color: style.frameColor + + x: Math.max(4, Math.min(parent.width - width - 4, + control.visualPosition * parent.width - (width / 2))) + y: (parent.height - height) / 2 + + Behavior on x { + enabled: !control.pressed + SmoothedAnimation { velocity: 200 } + } + } + } + + label: Text { + readonly property bool mirror: control.effectiveLayoutDirection == Qt.RightToLeft + + x: mirror ? padding.left : (indicator.x + indicator.width + control.style.spacing) + y: padding.top + width: parent.width - indicator.width - control.style.spacing - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + text: control.text + color: control.style.textColor + elide: Text.ElideRight + visible: control.text + opacity: enabled ? 1.0 : control.style.disabledOpacity + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + } +} diff --git a/src/imports/controls/TabBar.qml b/src/imports/controls/TabBar.qml new file mode 100644 index 00000000..fa6faea9 --- /dev/null +++ b/src/imports/controls/TabBar.qml @@ -0,0 +1,120 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractTabBar { + id: control + + property list<Item> items + readonly property int count: items.length + property alias highlight: listView.highlight + property alias spacing: listView.spacing + + property Component delegate: TabButton { + width: (listView.width - Math.max(0, count - 1) * spacing) / count + } + + contentWidth: listView.contentWidth + contentHeight: listView.contentHeight + + implicitWidth: Math.max(background ? background.implicitWidth : 0, contentWidth + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + padding.top + padding.bottom) + + Accessible.role: Accessible.PageTabList + + ExclusiveGroup { + id: group + } + + contentItem: ListView { + id: listView + + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + spacing: 1 + orientation: ListView.Horizontal + boundsBehavior: Flickable.StopAtBounds + snapMode: ListView.SnapToItem + + model: control.items + currentIndex: control.currentIndex + + delegate: Loader { + sourceComponent: control.delegate + visible: modelData.Tab.visible + Binding { target: item; property: "Exclusive.group"; value: group } + Binding { target: item; property: "text"; value: modelData.Tab.title } + Binding { target: item; property: "checked"; value: control.currentIndex === index } + Connections { target: item; onClicked: control.currentIndex = index } + } + + property bool completed: false + Component.onCompleted: completed = true + + highlightMoveDuration: completed ? 250 : 0 + highlightResizeDuration: 0 + highlightFollowsCurrentItem: true + highlight: Item { + z: 2 + Rectangle { + height: 4 + width: parent.width + y: parent.height - height + color: style.accentColor + } + } + } + + background: Rectangle { + implicitWidth: 26 + implicitHeight: 26 + width: listView.width + border.color: style.backgroundColor + border.width: 8 + color: listView.count > 1 ? style.frameColor : style.backgroundColor + Rectangle { + y: parent.height - height + width: parent.width + height: 1 + color: style.frameColor + } + } +} diff --git a/src/imports/controls/TabButton.qml b/src/imports/controls/TabButton.qml new file mode 100644 index 00000000..3676a4bc --- /dev/null +++ b/src/imports/controls/TabButton.qml @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractTabButton { + id: control + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + label ? label.implicitWidth + padding.left + padding.right : 0) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + label ? label.implicitHeight + padding.top + padding.bottom : 0) + + Accessible.name: text + Accessible.pressed: pressed + Accessible.selected: checked + Accessible.role: Accessible.PageTab + + padding { top: style.padding; left: style.padding; right: style.padding; bottom: style.padding } + + label: Text { + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + text: control.text + font.pointSize: 10 + elide: Text.ElideRight + color: control.pressed ? control.style.accentColor : control.style.textColor + opacity: enabled ? 1.0 : control.style.disabledOpacity + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + + background: Rectangle { + height: parent.height - 1 + implicitHeight: 26 + color: style.backgroundColor + } +} diff --git a/src/imports/controls/TabView.qml b/src/imports/controls/TabView.qml new file mode 100644 index 00000000..db61675b --- /dev/null +++ b/src/imports/controls/TabView.qml @@ -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 Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 +import QtQml.Models 2.1 + +AbstractTabView { + id: control + + default property alias items: listView.items + readonly property alias currentItem: listView.currentItem + property alias spacing: listView.spacing + property alias count: listView.count + + contentWidth: listView.implicitWidth + contentHeight: listView.contentHeight + + implicitWidth: Math.max(background ? background.implicitWidth : 0, contentWidth + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, contentHeight + padding.top + padding.bottom) + + padding.top: tabBar && tabBar.parent === control ? tabBar.height : 0 + + tabBar: TabBar { } + + Accessible.role: Accessible.PageTabList + + Binding { target: tabBar; property: "items"; value: control.items } + + contentItem: ListView { + id: listView + + property list<Item> items + + Binding { target: control; property: "currentIndex"; value: listView.currentIndex } + Binding { target: listView; property: "currentIndex"; value: control.currentIndex } + + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + orientation: Qt.Horizontal + snapMode: ListView.SnapOneItem + boundsBehavior: Flickable.StopAtBounds + highlightRangeMode: ListView.StrictlyEnforceRange + preferredHighlightBegin: 0 + preferredHighlightEnd: 0 + highlightMoveDuration: 250 + + model: items + + delegate: Item { + id: delegate + width: listView.width + height: listView.height + visible: modelData.Tab.visible + Binding { target: modelData; property: "parent"; value: delegate } + Binding { target: modelData; property: "Tab.index"; value: index } + Binding { target: modelData; property: "Tab.view"; value: control } + } + } +} diff --git a/src/imports/controls/TextArea.qml b/src/imports/controls/TextArea.qml new file mode 100644 index 00000000..e88fafc8 --- /dev/null +++ b/src/imports/controls/TextArea.qml @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractTextArea { + id: control + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + Math.max(edit ? edit.implicitWidth : 0, + placeholder ? placeholder.implicitWidth : 0) + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + Math.max(edit ? edit.implicitHeight : 0, + placeholder ? placeholder.implicitHeight : 0) + padding.top + padding.bottom) + + Accessible.name: text + Accessible.multiLine: true + Accessible.role: Accessible.EditableText + Accessible.readOnly: !edit || edit.readOnly + Accessible.description: placeholder ? placeholder.text : "" + + edit: TextEdit { + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + color: style.textColor + selectionColor: style.selectionColor + selectedTextColor: style.selectedTextColor + Keys.forwardTo: control + } + + placeholder: Text { + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + color: control.style.textColor + opacity: control.style.disabledOpacity + visible: edit ? !edit.length : !control.text + } +} diff --git a/src/imports/controls/TextField.qml b/src/imports/controls/TextField.qml new file mode 100644 index 00000000..b303b05d --- /dev/null +++ b/src/imports/controls/TextField.qml @@ -0,0 +1,90 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractTextField { + id: control + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + Math.max(input ? input.implicitWidth : 0, + placeholder ? placeholder.implicitWidth : 0) + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + Math.max(input ? input.implicitHeight : 0, + placeholder ? placeholder.implicitHeight : 0) + padding.top + padding.bottom) + + Accessible.name: text + Accessible.role: Accessible.EditableText + Accessible.readOnly: !input || input.readOnly + Accessible.description: placeholder ? placeholder.text : "" + Accessible.passwordEdit: !!input && (input.echoMode == TextInput.Password || + input.echoMode === TextInput.PasswordEchoOnEdit) + + padding { top: style.padding; left: style.padding; right: style.padding; bottom: style.padding } + + input: TextInput { + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + color: style.textColor + selectionColor: style.selectionColor + selectedTextColor: style.selectedTextColor + verticalAlignment: TextInput.AlignVCenter + Keys.forwardTo: control + } + + placeholder: Text { + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + color: control.style.textColor + opacity: control.style.disabledOpacity + visible: input ? !input.displayText : !control.text + } + + background: Rectangle { + implicitWidth: 120 // TODO + radius: style.roundness + border.width: control.activeFocus ? 2 : 1 + border.color: control.activeFocus ? style.focusColor : style.frameColor + opacity: enabled ? 1.0 : style.disabledOpacity + } +} diff --git a/src/imports/controls/ToggleButton.qml b/src/imports/controls/ToggleButton.qml new file mode 100644 index 00000000..102c752f --- /dev/null +++ b/src/imports/controls/ToggleButton.qml @@ -0,0 +1,110 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractToggleButton { + id: control + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + (label ? label.implicitWidth : 0) + + (indicator ? indicator.implicitWidth : 0) + + (label && indicator ? style.spacing : 0) + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + Math.max(label ? label.implicitHeight : 0, + indicator ? indicator.implicitHeight : 0) + padding.top + padding.bottom) + + Accessible.name: text + Accessible.checkable: true + Accessible.checked: checked + Accessible.pressed: pressed + Accessible.role: Accessible.Button + + padding { top: style.padding; left: style.padding; right: style.padding; bottom: style.padding } + + indicator: Rectangle { + readonly property bool mirror: control.effectiveLayoutDirection == Qt.RightToLeft + + implicitWidth: 36 + implicitHeight: 20 + x: text ? (mirror ? parent.width - width - padding.right : padding.left) : (parent.width - width) / 2 + y: (parent.height - height) / 2 + + radius: style.roundness + border.width: control.activeFocus ? 2 : 1 + border.color: control.activeFocus ? style.focusColor : style.frameColor + opacity: enabled ? 1.0 : style.disabledOpacity + color: style.backgroundColor + + Rectangle { + width: 12 + height: 12 + + color: Qt.tint(Qt.tint(control.checked ? style.accentColor : style.baseColor, + control.checked && control.activeFocus ? style.focusColor : "transparent"), + control.pressed ? style.pressColor : "transparent") + border.width: control.checked || control.pressed ? 0 : 1 + border.color: style.frameColor + + x: Math.max(4, Math.min(parent.width - width - 4, + control.visualPosition * parent.width - (width / 2))) + y: (parent.height - height) / 2 + + Behavior on x { + enabled: !control.pressed + SmoothedAnimation { velocity: 200 } + } + } + } + + label: Text { + readonly property bool mirror: control.effectiveLayoutDirection == Qt.RightToLeft + + x: mirror ? padding.left : (indicator.x + indicator.width + control.style.spacing) + y: padding.top + width: parent.width - indicator.width - control.style.spacing - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + text: control.text + color: control.style.textColor + elide: Text.ElideRight + visible: control.text + opacity: enabled ? 1.0 : control.style.disabledOpacity + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + } +} diff --git a/src/imports/controls/ToolBar.qml b/src/imports/controls/ToolBar.qml new file mode 100644 index 00000000..87ada6c9 --- /dev/null +++ b/src/imports/controls/ToolBar.qml @@ -0,0 +1,67 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractToolBar { + id: control + + default property alias data: content.data + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + contentWidth + padding.left + padding.right) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + contentHeight + padding.top + padding.bottom) + + contentWidth: content.children.length === 1 ? content.children[0].implicitWidth : 0 + contentHeight: content.children.length === 1 ? content.children[0].implicitHeight : 0 + + Accessible.role: Accessible.ToolBar + + contentItem: Item { + id: content + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + } + + background: Rectangle { + implicitHeight: 26 + color: style.baseColor + } +} diff --git a/src/imports/controls/ToolButton.qml b/src/imports/controls/ToolButton.qml new file mode 100644 index 00000000..c5171c45 --- /dev/null +++ b/src/imports/controls/ToolButton.qml @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 + +AbstractButton { + id: control + + implicitWidth: Math.max(background ? background.implicitWidth : 0, + label ? label.implicitWidth + padding.left + padding.right : 0) + implicitHeight: Math.max(background ? background.implicitHeight : 0, + label ? label.implicitHeight + padding.top + padding.bottom : 0) + + Accessible.name: text + Accessible.pressed: pressed + Accessible.role: Accessible.Button + + padding { top: style.padding; left: style.padding; right: style.padding; bottom: style.padding } + + label: Text { + x: padding.left + y: padding.top + width: parent.width - padding.left - padding.right + height: parent.height - padding.top - padding.bottom + + text: control.text + color: control.style.textColor + elide: Text.ElideRight + opacity: enabled ? 1.0 : control.style.disabledOpacity + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + } + + background: Rectangle { + implicitWidth: 26 + implicitHeight: 26 + + opacity: style.disabledOpacity + color: style.frameColor + visible: control.pressed + } +} diff --git a/src/imports/controls/controls.pro b/src/imports/controls/controls.pro new file mode 100644 index 00000000..d9de2bf9 --- /dev/null +++ b/src/imports/controls/controls.pro @@ -0,0 +1,47 @@ +TARGET = qtquickcontrols2plugin +TARGETPATH = QtQuick/Controls.2 +IMPORT_VERSION = 2.0 + +QT += qml quick +QT += core-private gui-private qml-private quick-private quickcontrols-private + +OTHER_FILES += \ + qmldir + +QML_FILES = \ + ApplicationWindow.qml \ + BusyIndicator.qml \ + Button.qml \ + CheckBox.qml \ + Frame.qml \ + GroupBox.qml \ + Label.qml \ + PageIndicator.qml \ + ProgressBar.qml \ + RadioButton.qml \ + ScrollBar.qml \ + ScrollIndicator.qml \ + Slider.qml \ + SpinBox.qml \ + StackView.js \ + StackView.qml \ + StackViewDelegate.qml \ + StackViewTransition.qml \ + Switch.qml \ + TabBar.qml \ + TabButton.qml \ + TabView.qml \ + TextArea.qml \ + TextField.qml \ + ToggleButton.qml \ + ToolBar.qml \ + ToolButton.qml + +SOURCES += \ + $$PWD/qtquickcontrols2plugin.cpp + +RESOURCES += \ + $$PWD/qtquickcontrols2plugin.qrc + +CONFIG += no_cxx_module +load(qml_plugin) diff --git a/src/imports/controls/images/spinner_large.png b/src/imports/controls/images/spinner_large.png Binary files differnew file mode 100644 index 00000000..bfd1b637 --- /dev/null +++ b/src/imports/controls/images/spinner_large.png diff --git a/src/imports/controls/images/spinner_medium.png b/src/imports/controls/images/spinner_medium.png Binary files differnew file mode 100644 index 00000000..41409d45 --- /dev/null +++ b/src/imports/controls/images/spinner_medium.png diff --git a/src/imports/controls/images/spinner_small.png b/src/imports/controls/images/spinner_small.png Binary files differnew file mode 100644 index 00000000..2f6048e4 --- /dev/null +++ b/src/imports/controls/images/spinner_small.png diff --git a/src/imports/controls/qmldir b/src/imports/controls/qmldir new file mode 100644 index 00000000..fcd8700d --- /dev/null +++ b/src/imports/controls/qmldir @@ -0,0 +1,29 @@ +module QtQuick.Controls +plugin qtquickcontrols2plugin +classname QtQuickControls2Plugin +ApplicationWindow 2.0 ApplicationWindow.qml +BusyIndicator 2.0 BusyIndicator.qml +Button 2.0 Button.qml +CheckBox 2.0 CheckBox.qml +Frame 2.0 Frame.qml +GroupBox 2.0 GroupBox.qml +Label 2.0 Label.qml +PageIndicator 2.0 PageIndicator.qml +ProgressBar 2.0 ProgressBar.qml +RadioButton 2.0 RadioButton.qml +ScrollBar 2.0 ScrollBar.qml +ScrollIndicator 2.0 ScrollIndicator.qml +Slider 2.0 Slider.qml +SpinBox 2.0 SpinBox.qml +StackView 2.0 StackView.qml +StackViewDelegate 2.0 StackViewDelegate.qml +StackViewTransition 2.0 StackViewTransition.qml +Switch 2.0 Switch.qml +TabBar 2.0 TabBar.qml +TabButton 2.0 TabButton.qml +TabView 2.0 TabView.qml +TextArea 2.0 TextArea.qml +TextField 2.0 TextField.qml +ToggleButton 2.0 ToggleButton.qml +ToolBar 2.0 ToolBar.qml +ToolButton 2.0 ToolButton.qml diff --git a/src/imports/controls/qtquickcontrols2plugin.cpp b/src/imports/controls/qtquickcontrols2plugin.cpp new file mode 100644 index 00000000..84a02f54 --- /dev/null +++ b/src/imports/controls/qtquickcontrols2plugin.cpp @@ -0,0 +1,128 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Controls 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 <QtQml/qqmlextensionplugin.h> + +#include <QtQuickControls/private/qquickabstractapplicationwindow_p.h> +#include <QtQuickControls/private/qquickabstractbusyindicator_p.h> +#include <QtQuickControls/private/qquickabstractbutton_p.h> +#include <QtQuickControls/private/qquickabstractcheckbox_p.h> +#include <QtQuickControls/private/qquickabstractframe_p.h> +#include <QtQuickControls/private/qquickabstractgroupbox_p.h> +#include <QtQuickControls/private/qquickabstractpageindicator_p.h> +#include <QtQuickControls/private/qquickabstractprogressbar_p.h> +#include <QtQuickControls/private/qquickabstractradiobutton_p.h> +#include <QtQuickControls/private/qquickabstractscrollbar_p.h> +#include <QtQuickControls/private/qquickabstractscrollindicator_p.h> +#include <QtQuickControls/private/qquickabstractslider_p.h> +#include <QtQuickControls/private/qquickabstractspinbox_p.h> +#include <QtQuickControls/private/qquickabstractstackview_p.h> +#include <QtQuickControls/private/qquickabstractswitch_p.h> +#include <QtQuickControls/private/qquickabstracttabbar_p.h> +#include <QtQuickControls/private/qquickabstracttabbutton_p.h> +#include <QtQuickControls/private/qquickabstracttabview_p.h> +#include <QtQuickControls/private/qquickabstracttextarea_p.h> +#include <QtQuickControls/private/qquickabstracttextfield_p.h> +#include <QtQuickControls/private/qquickabstracttogglebutton_p.h> +#include <QtQuickControls/private/qquickabstracttoolbar_p.h> + +#include <QtQuickControls/private/qquickcontrol_p.h> +#include <QtQuickControls/private/qquickexclusivegroup_p.h> +#include <QtQuickControls/private/qquickpadding_p.h> +#include <QtQuickControls/private/qquickstyle_p.h> + +void initResources() +{ + Q_INIT_RESOURCE(qtquickcontrols2plugin); +} + +QT_BEGIN_NAMESPACE + +class QtQuickControls2Plugin: public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface/1.0") + +public: + void registerTypes(const char *uri); + void initializeEngine(QQmlEngine *engine, const char *uri); +}; + +void QtQuickControls2Plugin::registerTypes(const char *uri) +{ + qmlRegisterType<QQuickAbstractApplicationWindow>(uri, 2, 0, "AbstractApplicationWindow"); + qmlRegisterType<QQuickAbstractBusyIndicator>(uri, 2, 0, "AbstractBusyIndicator"); + qmlRegisterType<QQuickAbstractButton>(uri, 2, 0, "AbstractButton"); + qmlRegisterType<QQuickAbstractCheckBox>(uri, 2, 0, "AbstractCheckBox"); + qmlRegisterType<QQuickAbstractFrame>(uri, 2, 0, "AbstractFrame"); + qmlRegisterType<QQuickAbstractGroupBox>(uri, 2, 0, "AbstractGroupBox"); + qmlRegisterType<QQuickAbstractPageIndicator>(uri, 2, 0, "AbstractPageIndicator"); + qmlRegisterType<QQuickAbstractProgressBar>(uri, 2, 0, "AbstractProgressBar"); + qmlRegisterType<QQuickAbstractRadioButton>(uri, 2, 0, "AbstractRadioButton"); + qmlRegisterType<QQuickAbstractScrollBar>(uri, 2, 0, "AbstractScrollBar"); + qmlRegisterType<QQuickAbstractScrollIndicator>(uri, 2, 0, "AbstractScrollIndicator"); + qmlRegisterType<QQuickAbstractSlider>(uri, 2, 0, "AbstractSlider"); + qmlRegisterType<QQuickAbstractSpinBox>(uri, 2, 0, "AbstractSpinBox"); + qmlRegisterType<QQuickAbstractStackView>(uri, 2, 0, "AbstractStackView"); + qmlRegisterType<QQuickAbstractSwitch>(uri, 2, 0, "AbstractSwitch"); + qmlRegisterType<QQuickAbstractTabBar>(uri, 2, 0, "AbstractTabBar"); + qmlRegisterType<QQuickAbstractTabButton>(uri, 2, 0, "AbstractTabButton"); + qmlRegisterType<QQuickAbstractTabView>(uri, 2, 0, "AbstractTabView"); + qmlRegisterType<QQuickAbstractTextArea>(uri, 2, 0, "AbstractTextArea"); + qmlRegisterType<QQuickAbstractTextField>(uri, 2, 0, "AbstractTextField"); + qmlRegisterType<QQuickAbstractToggleButton>(uri, 2, 0, "AbstractToggleButton"); + qmlRegisterType<QQuickAbstractToolBar>(uri, 2, 0, "AbstractToolBar"); + + qmlRegisterUncreatableType<QQuickExclusiveAttached>(uri, 2, 0, "Exclusive", "Exclusive is an attached property"); + qmlRegisterUncreatableType<QQuickStackAttached>(uri, 2, 0, "Stack", "Stack is an attached property"); + qmlRegisterUncreatableType<QQuickTabAttached>(uri, 2, 0, "Tab", "Tab is an attached property"); + + qmlRegisterType<QQuickControl>(uri, 2, 0, "Control"); + qmlRegisterType<QQuickExclusiveGroup>(uri, 2, 0, "ExclusiveGroup"); + qmlRegisterType<QQuickPadding>(uri, 2, 0, "Padding"); + qmlRegisterType<QQuickStyle>(uri, 2, 0, "Style"); +} + +void QtQuickControls2Plugin::initializeEngine(QQmlEngine *engine, const char *uri) +{ + Q_UNUSED(engine); + Q_UNUSED(uri); + initResources(); +} + +QT_END_NAMESPACE + +#include "qtquickcontrols2plugin.moc" diff --git a/src/imports/controls/qtquickcontrols2plugin.qrc b/src/imports/controls/qtquickcontrols2plugin.qrc new file mode 100644 index 00000000..544c42f5 --- /dev/null +++ b/src/imports/controls/qtquickcontrols2plugin.qrc @@ -0,0 +1,7 @@ +<!DOCTYPE RCC><RCC version="1.0"> +<qresource> + <file>images/spinner_small.png</file> + <file>images/spinner_medium.png</file> + <file>images/spinner_large.png</file> +</qresource> +</RCC> diff --git a/src/imports/extras/Drawer.qml b/src/imports/extras/Drawer.qml new file mode 100644 index 00000000..6a5a9950 --- /dev/null +++ b/src/imports/extras/Drawer.qml @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Extras 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$ +** +****************************************************************************/ + +import QtQuick 2.4 +import QtQuick.Controls 2.0 +import QtQuick.Extras 2.0 + +AbstractDrawer { + id: control + + width: parent.width // TODO: Window.width + height: parent.height // TODO: Window.height + + background: Rectangle { + color: style.shadowColor + opacity: position * style.disabledOpacity + } + + // TODO: make this a proper transition + animation: SmoothedAnimation { + velocity: 5 + } +} diff --git a/src/imports/extras/SplitView.qml b/src/imports/extras/SplitView.qml new file mode 100644 index 00000000..56eb56f4 --- /dev/null +++ b/src/imports/extras/SplitView.qml @@ -0,0 +1,556 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Extras 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$ +** +****************************************************************************/ + +import QtQuick 2.2 +import QtQuick.Controls 1.2 +import QtQuick.Layouts 1.0 +import QtQuick.Controls.Private 1.0 as Private +import QtQuick.Window 2.1 + +/*! + \qmltype SplitView + \inqmlmodule QtQuick.Controls + \since 5.1 + \ingroup views + \brief Lays out items with a draggable splitter between each item. + + \image splitview.png + + SplitView is a control that lays out items horizontally or + vertically with a draggable splitter between each item. + + There will always be one (and only one) item in the SplitView that has \l{Layout::fillWidth}{Layout.fillWidth} + set to \c true (or \l{Layout::fillHeight}{Layout.fillHeight}, if orientation is Qt.Vertical). This means that the + item will get all leftover space when other items have been laid out. + By default, the last visible child of the SplitView will have this set, but + it can be changed by explicitly setting fillWidth to \c true on another item. + As the fillWidth item will automatically be resized to fit the extra space, explicit assignments + to width and height will be ignored (but \l{Layout::minimumWidth}{Layout.minimumWidth} and + \l{Layout::maximumWidth}{Layout.maximumWidth} will still be respected). + + A handle can belong to the item either on the left or top side, or on the right or bottom side: + \list + \li If the fillWidth item is to the right: the handle belongs to the left item. + \li if the fillWidth item is on the left: the handle belongs to the right item. + \endlist + + This will again control which item gets resized when the user drags a handle, + and which handle gets hidden when an item is told to hide. + + SplitView supports setting attached Layout properties on child items, which + means that you can set the following attached properties for each child: + \list + \li \l{Layout::minimumWidth}{Layout.minimumWidth} + \li \l{Layout::minimumHeight}{Layout.minimumHeight} + \li \l{Layout::maximumWidth}{Layout.maximumWidth} + \li \l{Layout::maximumHeight}{Layout.maximumHeight} + \li \l{Layout::fillWidth}{Layout.fillWidth} (\c true for only one child) + \li \l{Layout::fillHeight}{Layout.fillHeight} (\c true for only one child) + \endlist + + \note Please import QtQuick.Layout 1.0 in your QML file in order to use the Layout + attached properties inside SplitView. + + Example: + + To create a SplitView with three items, and let the center item get superfluous space, one + could do the following: + + \qml + SplitView { + anchors.fill: parent + orientation: Qt.Horizontal + + Rectangle { + width: 200 + Layout.maximumWidth: 400 + color: "lightblue" + Text { + text: "View 1" + anchors.centerIn: parent + } + } + Rectangle { + id: centerItem + Layout.minimumWidth: 50 + Layout.fillWidth: true + color: "lightgray" + Text { + text: "View 2" + anchors.centerIn: parent + } + } + Rectangle { + width: 200 + color: "lightgreen" + Text { + text: "View 3" + anchors.centerIn: parent + } + } + } + + \endqml +*/ + +Item { + id: root + + /*! + \qmlproperty enumeration SplitView::orientation + + This property holds the orientation of the SplitView. + The value can be either \c Qt.Horizontal or \c Qt.Vertical. + The default value is \c Qt.Horizontal. + */ + property int orientation: Qt.Horizontal + + /*! + This property holds the delegate that will be instantiated between each + child item. Inside the delegate the following properties are available: + + \table + \row \li readonly property bool styleData.index \li Specifies the index of the splitter handle. The handle + between the first and the second item will get index 0, + the next handle index 1 etc. + \row \li readonly property bool styleData.hovered \li The handle is being hovered. + \row \li readonly property bool styleData.pressed \li The handle is being pressed. + \row \li readonly property bool styleData.resizing \li The handle is being dragged. + \endtable + +*/ + property Component handleDelegate: Rectangle { + width: 1 + height: 1 + color: Qt.darker(pal.window, 1.5) + } + + /*! + This property is \c true when the user is resizing any of the items by + dragging on the splitter handles. + */ + property bool resizing: false + + /*! \internal */ + default property alias __contents: contents.data + /*! \internal */ + property alias __items: splitterItems.children + /*! \internal */ + property alias __handles: splitterHandles.children + + clip: true + Component.onCompleted: d.init() + onWidthChanged: d.updateLayout() + onHeightChanged: d.updateLayout() + onOrientationChanged: d.changeOrientation() + + /*! Add an item to the end of the view. + \since QtQuick.Controls 1.3 */ + function addItem(item) { + d.updateLayoutGuard = true + + d.addItem_impl(item) + + d.calculateImplicitSize() + d.updateLayoutGuard = false + d.updateFillIndex() + } + + SystemPalette { id: pal } + + QtObject { + id: d + + readonly property string leftMargin: horizontal ? "leftMargin" : "topMargin" + readonly property string topMargin: horizontal ? "topMargin" : "leftMargin" + readonly property string rightMargin: horizontal ? "rightMargin" : "bottomMargin" + + property bool horizontal: orientation == Qt.Horizontal + readonly property string minimum: horizontal ? "minimumWidth" : "minimumHeight" + readonly property string maximum: horizontal ? "maximumWidth" : "maximumHeight" + readonly property string otherMinimum: horizontal ? "minimumHeight" : "minimumWidth" + readonly property string otherMaximum: horizontal ? "maximumHeight" : "maximumWidth" + readonly property string offset: horizontal ? "x" : "y" + readonly property string otherOffset: horizontal ? "y" : "x" + readonly property string size: horizontal ? "width" : "height" + readonly property string otherSize: horizontal ? "height" : "width" + readonly property string implicitSize: horizontal ? "implicitWidth" : "implicitHeight" + readonly property string implicitOtherSize: horizontal ? "implicitHeight" : "implicitWidth" + + property int fillIndex: -1 + property bool updateLayoutGuard: true + + function extraMarginSize(item, other) { + if (typeof(other) === 'undefined') + other = false; + if (other === horizontal) + // vertical + return item.Layout.topMargin + item.Layout.bottomMargin + return item.Layout.leftMargin + item.Layout.rightMargin + } + + function addItem_impl(item) + { + // temporarily set fillIndex to new item + fillIndex = __items.length + if (splitterItems.children.length > 0) + handleLoader.createObject(splitterHandles, {"__handleIndex":splitterItems.children.length - 1}) + + item.parent = splitterItems + + // should match disconnections in Component.onDestruction + item.widthChanged.connect(d.updateLayout) + item.heightChanged.connect(d.updateLayout) + item.Layout.maximumWidthChanged.connect(d.updateLayout) + item.Layout.minimumWidthChanged.connect(d.updateLayout) + item.Layout.maximumHeightChanged.connect(d.updateLayout) + item.Layout.minimumHeightChanged.connect(d.updateLayout) + item.Layout.leftMarginChanged.connect(d.updateLayout) + item.Layout.topMarginChanged.connect(d.updateLayout) + item.Layout.rightMarginChanged.connect(d.updateLayout) + item.Layout.bottomMarginChanged.connect(d.updateLayout) + item.visibleChanged.connect(d.updateFillIndex) + item.Layout.fillWidthChanged.connect(d.updateFillIndex) + item.Layout.fillHeightChanged.connect(d.updateFillIndex) + } + + function init() + { + for (var i=0; i<__contents.length; ++i) { + var item = __contents[i]; + if (!item.hasOwnProperty("x")) + continue + addItem_impl(item) + i-- // item was removed from list + } + + d.calculateImplicitSize() + d.updateLayoutGuard = false + d.updateFillIndex() + } + + function updateFillIndex() + { + if (lastItem.visible !== root.visible) + return + var policy = (root.orientation === Qt.Horizontal) ? "fillWidth" : "fillHeight" + for (var i=0; i<__items.length-1; ++i) { + if (__items[i].Layout[policy] === true) + break; + } + + d.fillIndex = i + d.updateLayout() + } + + function changeOrientation() + { + if (__items.length == 0) + return; + d.updateLayoutGuard = true + + // Swap width/height for items and handles: + for (var i=0; i<__items.length; ++i) { + var item = __items[i] + var tmp = item.x + item.x = item.y + item.y = tmp + tmp = item.width + item.width = item.height + item.height = tmp + + var handle = __handles[i] + if (handle) { + tmp = handle.x + handle.x = handle.y + handle.y = handle.x + tmp = handle.width + handle.width = handle.height + handle.height = tmp + } + } + + // Change d.horizontal explicit, since the binding will change too late: + d.horizontal = orientation == Qt.Horizontal + d.updateLayoutGuard = false + d.updateFillIndex() + } + + function calculateImplicitSize() + { + var implicitSize = 0 + var implicitOtherSize = 0 + + for (var i=0; i<__items.length; ++i) { + var item = __items[i]; + implicitSize += clampedMinMax(item[d.size], item.Layout[minimum], item.Layout[maximum]) + extraMarginSize(item) + var os = clampedMinMax(item[otherSize], item.Layout[otherMinimum], item.Layout[otherMaximum]) + implicitOtherSize = Math.max(implicitOtherSize, os) + + var handle = __handles[i] + if (handle) + implicitSize += handle[d.size] //### Can handles have margins?? + } + + root[d.implicitSize] = implicitSize + root[d.implicitOtherSize] = implicitOtherSize + extraMarginSize(item, true) + } + + function clampedMinMax(value, minimum, maximum) + { + if (value < minimum) + value = minimum + if (value > maximum) + value = maximum + return value + } + + function accumulatedSize(firstIndex, lastIndex, includeFillItemMinimum) + { + // Go through items and handles, and + // calculate their accummulated width. + var w = 0 + for (var i=firstIndex; i<lastIndex; ++i) { + + var item = __items[i] + if (item.visible || i == d.fillIndex) { + if (i !== d.fillIndex) + w += item[d.size] + extraMarginSize(item) + else if (includeFillItemMinimum && item.Layout[minimum] !== undefined) + w += item.Layout[minimum] + extraMarginSize(item) + } + + var handle = __handles[i] + if (handle && handle.visible) + w += handle[d.size] + } + return w + } + + function updateLayout() + { + // This function will reposition both handles and + // items according to the their width/height: + if (__items.length === 0) + return; + if (!lastItem.visible) + return; + if (d.updateLayoutGuard === true) + return + d.updateLayoutGuard = true + + // Ensure all items within their min/max: + for (var i=0; i<__items.length; ++i) { + if (i !== d.fillIndex) { + var item = __items[i]; + var clampedSize = clampedMinMax(item[d.size], item.Layout[d.minimum], item.Layout[d.maximum]) + if (clampedSize != item[d.size]) + item[d.size] = clampedSize + } + } + + // Set size of fillItem to remaining available space. + // Special case: If SplitView size is zero, we leave fillItem with the size + // it already got, and assume that SplitView ends up with implicit size as size: + if (root[d.size] != 0) { + var fillItem = __items[fillIndex] + var superfluous = root[d.size] - d.accumulatedSize(0, __items.length, false) + fillItem[d.size] = clampedMinMax(superfluous - extraMarginSize(fillItem), fillItem.Layout[minimum], fillItem.Layout[maximum]); + } + + // Position items and handles according to their width: + var lastVisibleItem, lastVisibleHandle, handle + var pos = 0; + for (i=0; i<__items.length; ++i) { + // Position item to the right of the previous visible handle: + item = __items[i]; + if (item.visible || i == d.fillIndex) { + pos += item.Layout[leftMargin] + item[d.offset] = pos + item[d.otherOffset] = item.Layout[topMargin] + item[d.otherSize] = clampedMinMax(root[otherSize], item.Layout[otherMinimum], item.Layout[otherMaximum]) - extraMarginSize(item, true) + lastVisibleItem = item + pos += Math.max(0, item[d.size]) + item.Layout[rightMargin] + } + + handle = __handles[i] + if (handle && handle.visible) { + handle[d.offset] = pos + handle[d.otherOffset] = 0 //### can handles have margins? + handle[d.otherSize] = root[d.otherSize] + lastVisibleHandle = handle + pos += handle[d.size] + } + } + + d.updateLayoutGuard = false + } + } + + Component { + id: handleLoader + Loader { + id: itemHandle + + property int __handleIndex: -1 + property QtObject styleData: QtObject { + readonly property int index: __handleIndex + readonly property alias hovered: mouseArea.containsMouse + readonly property alias pressed: mouseArea.pressed + readonly property bool resizing: mouseArea.drag.active + onResizingChanged: root.resizing = resizing + } + property bool resizeLeftItem: (d.fillIndex > __handleIndex) + visible: __items[__handleIndex + (resizeLeftItem ? 0 : 1)].visible + sourceComponent: handleDelegate + onWidthChanged: d.updateLayout() + onHeightChanged: d.updateLayout() + onXChanged: moveHandle() + onYChanged: moveHandle() + + MouseArea { + id: mouseArea + anchors.fill: parent + property real defaultMargin: Private.Settings.hasTouchScreen ? Screen.pixelDensity * 3.5 : 2 + anchors.leftMargin: (parent.width <= 1) ? -defaultMargin : 0 + anchors.rightMargin: (parent.width <= 1) ? -defaultMargin : 0 + anchors.topMargin: (parent.height <= 1) ? -defaultMargin : 0 + anchors.bottomMargin: (parent.height <= 1) ? -defaultMargin : 0 + hoverEnabled: true + drag.threshold: 0 + drag.target: parent + drag.axis: root.orientation === Qt.Horizontal ? Drag.XAxis : Drag.YAxis + cursorShape: root.orientation === Qt.Horizontal ? Qt.SplitHCursor : Qt.SplitVCursor + } + + function moveHandle() { + // Moving the handle means resizing an item. Which one, + // left or right, depends on where the fillItem is. + // 'updateLayout' will be overridden in case new width violates max/min. + // 'updateLayout' will be triggered when an item changes width. + if (d.updateLayoutGuard) + return + + var leftHandle, leftItem, rightItem, rightHandle + var leftEdge, rightEdge, newWidth, leftStopX, rightStopX + var i + + if (resizeLeftItem) { + // Ensure that the handle is not crossing other handles. So + // find the first visible handle to the left to determine the left edge: + leftEdge = 0 + for (i=__handleIndex-1; i>=0; --i) { + leftHandle = __handles[i] + if (leftHandle.visible) { + leftEdge = leftHandle[d.offset] + leftHandle[d.size] + break; + } + } + + // Ensure: leftStopX >= itemHandle[d.offset] >= rightStopX + var min = d.accumulatedSize(__handleIndex+1, __items.length, true) + rightStopX = root[d.size] - min - itemHandle[d.size] + leftStopX = Math.max(leftEdge, itemHandle[d.offset]) + itemHandle[d.offset] = Math.min(rightStopX, Math.max(leftStopX, itemHandle[d.offset])) + + newWidth = itemHandle[d.offset] - leftEdge + leftItem = __items[__handleIndex] + // The next line will trigger 'updateLayout': + leftItem[d.size] = newWidth + } else { + // Resize item to the right. + // Ensure that the handle is not crossing other handles. So + // find the first visible handle to the right to determine the right edge: + rightEdge = root[d.size] + for (i=__handleIndex+1; i<__handles.length; ++i) { + rightHandle = __handles[i] + if (rightHandle.visible) { + rightEdge = rightHandle[d.offset] + break; + } + } + + // Ensure: leftStopX <= itemHandle[d.offset] <= rightStopX + min = d.accumulatedSize(0, __handleIndex+1, true) + leftStopX = min - itemHandle[d.size] + rightStopX = Math.min((rightEdge - itemHandle[d.size]), itemHandle[d.offset]) + itemHandle[d.offset] = Math.max(leftStopX, Math.min(itemHandle[d.offset], rightStopX)) + + newWidth = rightEdge - (itemHandle[d.offset] + itemHandle[d.size]) + rightItem = __items[__handleIndex+1] + // The next line will trigger 'updateLayout': + rightItem[d.size] = newWidth + } + } + } + } + + Item { + id: contents + visible: false + anchors.fill: parent + } + Item { + id: splitterItems + anchors.fill: parent + } + Item { + id: splitterHandles + anchors.fill: parent + } + + Item { + id: lastItem + onVisibleChanged: d.updateFillIndex() + } + + Component.onDestruction: { + for (var i=0; i<splitterItems.children.length; ++i) { + var item = splitterItems.children[i]; + + // should match connections in init() + item.widthChanged.disconnect(d.updateLayout) + item.heightChanged.disconnect(d.updateLayout) + item.Layout.maximumWidthChanged.disconnect(d.updateLayout) + item.Layout.minimumWidthChanged.disconnect(d.updateLayout) + item.Layout.maximumHeightChanged.disconnect(d.updateLayout) + item.Layout.minimumHeightChanged.disconnect(d.updateLayout) + item.visibleChanged.disconnect(d.updateFillIndex) + item.Layout.fillWidthChanged.disconnect(d.updateFillIndex) + item.Layout.fillHeightChanged.disconnect(d.updateFillIndex) + } + } +} diff --git a/src/imports/extras/extras.pro b/src/imports/extras/extras.pro new file mode 100644 index 00000000..18a2da18 --- /dev/null +++ b/src/imports/extras/extras.pro @@ -0,0 +1,19 @@ +TARGET = qtquickextras2plugin +TARGETPATH = QtQuick/Extras.2 +IMPORT_VERSION = 2.0 + +QT += qml quick +QT += core-private gui-private qml-private quick-private quickcontrols-private quickextras-private + +OTHER_FILES += \ + qmldir + +QML_FILES = \ + Drawer.qml \ + SplitView.qml + +SOURCES += \ + $$PWD/qtquickextras2plugin.cpp + +CONFIG += no_cxx_module +load(qml_plugin) diff --git a/src/imports/extras/qmldir b/src/imports/extras/qmldir new file mode 100644 index 00000000..850e5a72 --- /dev/null +++ b/src/imports/extras/qmldir @@ -0,0 +1,5 @@ +module QtQuick.Extras +plugin qtquickextras2plugin +classname QtQuickExtras2Plugin +Drawer 2.0 Drawer.qml +SplitView 2.0 SplitView.qml diff --git a/src/imports/extras/qtquickextras2plugin.cpp b/src/imports/extras/qtquickextras2plugin.cpp new file mode 100644 index 00000000..08c62dc3 --- /dev/null +++ b/src/imports/extras/qtquickextras2plugin.cpp @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Quick Extras 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 <QtQml/qqmlextensionplugin.h> + +#include <QtQuickExtras/private/qquickabstractdrawer_p.h> +#include <QtQuickExtras/private/qquickabstractsplitview_p.h> + +QT_BEGIN_NAMESPACE + +class QtQuickExtras2Plugin: public QQmlExtensionPlugin +{ + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface/1.0") + +public: + void registerTypes(const char *uri); +}; + +void QtQuickExtras2Plugin::registerTypes(const char *uri) +{ + qmlRegisterType<QQuickAbstractDrawer>(uri, 2, 0, "AbstractDrawer"); + qmlRegisterType<QQuickAbstractSplitView>(uri, 2, 0, "AbstractSplitView"); +} + +QT_END_NAMESPACE + +#include "qtquickextras2plugin.moc" diff --git a/src/imports/imports.pro b/src/imports/imports.pro new file mode 100644 index 00000000..d141f378 --- /dev/null +++ b/src/imports/imports.pro @@ -0,0 +1,5 @@ +TEMPLATE = subdirs +SUBDIRS += \ + controls \ + calendar \ + extras diff --git a/src/src.pro b/src/src.pro new file mode 100644 index 00000000..9ad5f141 --- /dev/null +++ b/src/src.pro @@ -0,0 +1,10 @@ +TEMPLATE = subdirs +SUBDIRS += \ + controls \ + calendar \ + extras \ + imports + +calendar.depends = controls +extras.depends = controls +imports.depends = controls calendar extras diff --git a/sync.profile b/sync.profile new file mode 100644 index 00000000..7442fc4d --- /dev/null +++ b/sync.profile @@ -0,0 +1,19 @@ +%modules = ( # path to module name map + "QtQuickControls" => "$basedir/src/controls", + "QtQuickCalendar" => "$basedir/src/calendar", + "QtQuickExtras" => "$basedir/src/extras", +); +%moduleheaders = ( # restrict the module headers to those found in relative path +); +# Module dependencies. +# Every module that is required to build this module should have one entry. +# Each of the module version specifiers can take one of the following values: +# - A specific Git revision. +# - any git symbolic ref resolvable from the module's repository (e.g. "refs/heads/master" to track master branch) +# - an empty string to use the same branch under test (dependencies will become "refs/heads/master" if we are in the master branch) +# +%dependencies = ( + "qtbase" => "", + "qtdeclarative" => "", + "qtxmlpatterns" => "", +); diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro new file mode 100644 index 00000000..4e36fdca --- /dev/null +++ b/tests/auto/auto.pro @@ -0,0 +1,4 @@ +TEMPLATE = subdirs +SUBDIRS += \ + controls \ + extras diff --git a/tests/auto/cmake/CMakeLists.txt b/tests/auto/cmake/CMakeLists.txt new file mode 100644 index 00000000..3d77b9e5 --- /dev/null +++ b/tests/auto/cmake/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 2.8) + +project(qmake_cmake_files) + +enable_testing() + +find_package(Qt5Core REQUIRED) + +include("${_Qt5CTestMacros}") + +test_module_includes( +) diff --git a/tests/auto/cmake/cmake.pro b/tests/auto/cmake/cmake.pro new file mode 100644 index 00000000..0a5e7e75 --- /dev/null +++ b/tests/auto/cmake/cmake.pro @@ -0,0 +1,7 @@ + +# Cause make to do nothing. +TEMPLATE = subdirs + +CMAKE_QT_MODULES_UNDER_TEST = quick qml + +CONFIG += ctest_testcase diff --git a/tests/auto/controls/controls.pro b/tests/auto/controls/controls.pro new file mode 100644 index 00000000..81f18623 --- /dev/null +++ b/tests/auto/controls/controls.pro @@ -0,0 +1,12 @@ +TEMPLATE = app +TARGET = tst_controls +CONFIG += qmltestcase + +SOURCES += \ + $$PWD/tst_controls.cpp + +OTHER_FILES += \ + $$PWD/data/* + +TESTDATA += \ + $$PWD/data/* diff --git a/tests/auto/controls/data/tst_busyindicator.qml b/tests/auto/controls/data/tst_busyindicator.qml new file mode 100644 index 00000000..ca8472ed --- /dev/null +++ b/tests/auto/controls/data/tst_busyindicator.qml @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 400 + height: 400 + visible: true + when: windowShown + name: "BusyIndicator" + + Component { + id: busyIndicator + BusyIndicator { } + } + + function test_running() { + var control = busyIndicator.createObject(testCase) + compare(control.running, false) + control.running = true + compare(control.running, true) + control.destroy() + } +} diff --git a/tests/auto/controls/data/tst_button.qml b/tests/auto/controls/data/tst_button.qml new file mode 100644 index 00000000..1ef76095 --- /dev/null +++ b/tests/auto/controls/data/tst_button.qml @@ -0,0 +1,172 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 200 + height: 200 + visible: true + when: windowShown + name: "Button" + + SignalSpy { + id: pressedSpy + signalName: "pressedChanged" + } + + SignalSpy { + id: clickedSpy + signalName: "clicked" + } + + Component { + id: button + Button { } + } + + function init() { + verify(!pressedSpy.target) + verify(!clickedSpy.target) + compare(pressedSpy.count, 0) + compare(clickedSpy.count, 0) + } + + function cleanup() { + pressedSpy.target = null + clickedSpy.target = null + pressedSpy.clear() + clickedSpy.clear() + } + + function test_defaults() { + var control = button.createObject(testCase) + verify(control) + verify(control.label) + compare(control.text, "") + compare(control.pressed, false) + control.destroy() + } + + function test_text() { + var control = button.createObject(testCase) + compare(control.text, "") + control.text = "Button" + compare(control.text, "Button") + control.text = "" + compare(control.text, "") + control.destroy() + } + + function test_mouse() { + var control = button.createObject(testCase) + + pressedSpy.target = control + clickedSpy.target = control + verify(pressedSpy.valid) + verify(clickedSpy.valid) + + // check + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 1) + compare(control.pressed, true) + mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(clickedSpy.count, 1) + compare(pressedSpy.count, 2) + compare(control.pressed, false) + + // uncheck + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 3) + compare(control.pressed, true) + mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(clickedSpy.count, 2) + compare(pressedSpy.count, 4) + compare(control.pressed, false) + + // release outside + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 5) + compare(control.pressed, true) + mouseMove(control, control.width * 2, control.height * 2, 0, Qt.LeftButton) + compare(control.pressed, false) + mouseRelease(control, control.width * 2, control.height * 2, Qt.LeftButton) + compare(clickedSpy.count, 2) + compare(pressedSpy.count, 6) + compare(control.pressed, false) + + // right button + mousePress(control, control.width / 2, control.height / 2, Qt.RightButton) + compare(pressedSpy.count, 6) + compare(control.pressed, false) + mouseRelease(control, control.width / 2, control.height / 2, Qt.RightButton) + compare(clickedSpy.count, 2) + compare(pressedSpy.count, 6) + compare(control.pressed, false) + + control.destroy() + } + + function test_keys() { + var control = button.createObject(testCase) + + clickedSpy.target = control + verify(clickedSpy.valid) + + control.forceActiveFocus() + verify(control.activeFocus) + + // check + keyClick(Qt.Key_Space) + compare(clickedSpy.count, 1) + + // uncheck + keyClick(Qt.Key_Space) + compare(clickedSpy.count, 2) + + // no change + var keys = [Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape, Qt.Key_Tab] + for (var i = 0; i < keys.length; ++i) { + keyClick(keys[i]) + compare(clickedSpy.count, 2) + } + + control.destroy() + } +} diff --git a/tests/auto/controls/data/tst_checkbox.qml b/tests/auto/controls/data/tst_checkbox.qml new file mode 100644 index 00000000..6d4cc703 --- /dev/null +++ b/tests/auto/controls/data/tst_checkbox.qml @@ -0,0 +1,274 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 200 + height: 200 + visible: true + when: windowShown + name: "CheckBox" + + SignalSpy { + id: checkedSpy + signalName: "checkedChanged" + } + + SignalSpy { + id: pressedSpy + signalName: "pressedChanged" + } + + SignalSpy { + id: clickedSpy + signalName: "clicked" + } + + Component { + id: checkBox + CheckBox { } + } + + function init() { + verify(!checkedSpy.target) + verify(!pressedSpy.target) + verify(!clickedSpy.target) + compare(checkedSpy.count, 0) + compare(pressedSpy.count, 0) + compare(clickedSpy.count, 0) + } + + function cleanup() { + checkedSpy.target = null + pressedSpy.target = null + clickedSpy.target = null + checkedSpy.clear() + pressedSpy.clear() + clickedSpy.clear() + } + + function test_defaults() { + var control = checkBox.createObject(testCase) + verify(control) + verify(control.label) + verify(control.indicator) + compare(control.text, "") + compare(control.pressed, false) + compare(control.checked, false) + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + control.destroy() + } + + function test_layoutDirection() { + var control = checkBox.createObject(testCase) + + verify(!control.LayoutMirroring.enabled) + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.layoutDirection = Qt.RightToLeft + compare(control.layoutDirection, Qt.RightToLeft) + compare(control.effectiveLayoutDirection, Qt.RightToLeft) + + control.LayoutMirroring.enabled = true + compare(control.layoutDirection, Qt.RightToLeft) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.layoutDirection = Qt.LeftToRight + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.RightToLeft) + + control.LayoutMirroring.enabled = false + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.destroy() + } + + function test_text() { + var control = checkBox.createObject(testCase) + compare(control.text, "") + control.text = "CheckBox" + compare(control.text, "CheckBox") + control.text = "" + compare(control.text, "") + control.destroy() + } + + function test_checked() { + var control = checkBox.createObject(testCase) + + checkedSpy.target = control + verify(checkedSpy.valid) + + compare(control.checked, false) + compare(checkedSpy.count, 0) + + control.checked = true + compare(control.checked, true) + compare(checkedSpy.count, 1) + + control.checked = false + compare(control.checked, false) + compare(checkedSpy.count, 2) + + control.destroy() + } + + function test_mouse() { + var control = checkBox.createObject(testCase) + + checkedSpy.target = control + pressedSpy.target = control + clickedSpy.target = control + verify(checkedSpy.valid) + verify(pressedSpy.valid) + verify(clickedSpy.valid) + + // check + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 1) + compare(control.pressed, true) + mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(clickedSpy.count, 1) + compare(checkedSpy.count, 1) + compare(pressedSpy.count, 2) + compare(control.checked, true) + compare(control.pressed, false) + + // uncheck + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 3) + compare(control.pressed, true) + mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 2) + compare(pressedSpy.count, 4) + compare(control.checked, false) + compare(control.pressed, false) + + // release outside + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 5) + compare(control.pressed, true) + mouseMove(control, control.width * 2, control.height * 2, 0, Qt.LeftButton) + compare(control.pressed, false) + mouseRelease(control, control.width * 2, control.height * 2, Qt.LeftButton) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 2) + compare(pressedSpy.count, 6) + compare(control.checked, false) + compare(control.pressed, false) + + // right button + mousePress(control, control.width / 2, control.height / 2, Qt.RightButton) + compare(pressedSpy.count, 6) + compare(control.pressed, false) + mouseRelease(control, control.width / 2, control.height / 2, Qt.RightButton) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 2) + compare(pressedSpy.count, 6) + compare(control.checked, false) + compare(control.pressed, false) + + control.destroy() + } + + function test_keys() { + var control = checkBox.createObject(testCase) + + checkedSpy.target = control + clickedSpy.target = control + verify(checkedSpy.valid) + verify(clickedSpy.valid) + + control.forceActiveFocus() + verify(control.activeFocus) + + // check + keyClick(Qt.Key_Space) + compare(clickedSpy.count, 1) + compare(checkedSpy.count, 1) + compare(control.checked, true) + + // uncheck + keyClick(Qt.Key_Space) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 2) + compare(control.checked, false) + + // no change + var keys = [Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape, Qt.Key_Tab] + for (var i = 0; i < keys.length; ++i) { + keyClick(keys[i]) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 2) + compare(control.checked, false) + } + + control.destroy() + } + + Component { + id: twoCheckBoxes + Item { + property CheckBox cb1: CheckBox { id: cb1 } + property CheckBox cb2: CheckBox { id: cb2; checked: cb1.checked; enabled: false } + } + } + + function test_binding() { + var container = twoCheckBoxes.createObject(testCase) + + compare(container.cb1.checked, false) + compare(container.cb2.checked, false) + + container.cb1.checked = true + compare(container.cb1.checked, true) + compare(container.cb2.checked, true) + + container.cb1.checked = false + compare(container.cb1.checked, false) + compare(container.cb2.checked, false) + + container.destroy() + } +} diff --git a/tests/auto/controls/data/tst_exclusivegroup.qml b/tests/auto/controls/data/tst_exclusivegroup.qml new file mode 100644 index 00000000..856b7ad5 --- /dev/null +++ b/tests/auto/controls/data/tst_exclusivegroup.qml @@ -0,0 +1,224 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 200 + height: 200 + visible: true + when: windowShown + name: "ExclusiveGroup" + + SignalSpy { + id: currentSpy + signalName: "currentChanged" + } + + Component { + id: exclusiveGroup + ExclusiveGroup { } + } + + function init() { + verify(!currentSpy.target) + compare(currentSpy.count, 0) + } + + function cleanup() { + currentSpy.target = null + currentSpy.clear() + } + + function test_defaults() { + var group = exclusiveGroup.createObject(testCase) + verify(group) + verify(!group.current) + group.destroy() + } + + Component { + id: checkable + QtObject { property bool checked } + } + + function test_current() { + var group = exclusiveGroup.createObject(testCase) + + currentSpy.target = group + verify(currentSpy.valid) + + var checkable1 = checkable.createObject(testCase, {checked: true}) + var checkable2 = checkable.createObject(testCase, {checked: false}) + var checkable3 = checkable.createObject(testCase, {checked: true}) + + // add checked + group.addCheckable(checkable1) + compare(group.current, checkable1) + compare(checkable1.checked, true) + compare(checkable2.checked, false) + compare(checkable3.checked, true) + compare(currentSpy.count, 1) + + // add non-checked + group.addCheckable(checkable2) + compare(group.current, checkable1) + compare(checkable1.checked, true) + compare(checkable2.checked, false) + compare(checkable3.checked, true) + compare(currentSpy.count, 1) + + // add checked + group.addCheckable(checkable3) + compare(group.current, checkable3) + compare(checkable1.checked, false) + compare(checkable2.checked, false) + compare(checkable3.checked, true) + compare(currentSpy.count, 2) + + // change current + group.current = checkable2 + compare(group.current, checkable2) + compare(checkable1.checked, false) + compare(checkable2.checked, true) + compare(checkable3.checked, false) + compare(currentSpy.count, 3) + + // check + checkable1.checked = true + compare(group.current, checkable1) + compare(checkable1.checked, true) + compare(checkable2.checked, false) + compare(checkable3.checked, false) + compare(currentSpy.count, 4) + + // remove non-checked + group.removeCheckable(checkable2) + compare(group.current, checkable1) + compare(checkable1.checked, true) + compare(checkable2.checked, false) + compare(checkable3.checked, false) + compare(currentSpy.count, 4) + + // remove checked + group.removeCheckable(checkable1) + verify(!group.current) + compare(checkable1.checked, false) + compare(checkable2.checked, false) + compare(checkable3.checked, false) + compare(currentSpy.count, 5) + + group.destroy() + } + + Component { + id: checkBoxes + Item { + property ExclusiveGroup group: ExclusiveGroup { id: group } + property CheckBox control1: CheckBox { Exclusive.group: group } + property CheckBox control2: CheckBox { Exclusive.group: group } + property CheckBox control3: CheckBox { Exclusive.group: group } + } + } + + Component { + id: radioButtons + Item { + property ExclusiveGroup group: ExclusiveGroup { id: group } + property RadioButton control1: RadioButton { Exclusive.group: group } + property RadioButton control2: RadioButton { Exclusive.group: group } + property RadioButton control3: RadioButton { Exclusive.group: group } + } + } + + Component { + id: switches + Item { + property ExclusiveGroup group: ExclusiveGroup { id: group } + property Switch control1: Switch { Exclusive.group: group } + property Switch control2: Switch { Exclusive.group: group } + property Switch control3: Switch { Exclusive.group: group } + } + } + + Component { + id: toggleButtons + Item { + property ExclusiveGroup group: ExclusiveGroup { id: group } + property ToggleButton control1: ToggleButton { Exclusive.group: group } + property ToggleButton control2: ToggleButton { Exclusive.group: group } + property ToggleButton control3: ToggleButton { Exclusive.group: group } + } + } + + function test_controls_data() { + return [ + { tag: "CheckBox", component: checkBoxes }, + { tag: "RadioButton", component: radioButtons }, + { tag: "Switch", component: switches }, + { tag: "ToggleButton", component: toggleButtons } + ] + } + + function test_controls(data) { + var container = data.component.createObject(testCase) + + verify(!container.group.current) + + container.control1.checked = true + compare(container.group.current, container.control1) + compare(container.control1.checked, true) + compare(container.control2.checked, false) + compare(container.control3.checked, false) + + container.control2.checked = true + compare(container.group.current, container.control2) + compare(container.control1.checked, false) + compare(container.control2.checked, true) + compare(container.control3.checked, false) + + container.control3.checked = true + compare(container.group.current, container.control3) + compare(container.control1.checked, false) + compare(container.control2.checked, false) + compare(container.control3.checked, true) + + container.destroy() + } +} diff --git a/tests/auto/controls/data/tst_frame.qml b/tests/auto/controls/data/tst_frame.qml new file mode 100644 index 00000000..276f46e9 --- /dev/null +++ b/tests/auto/controls/data/tst_frame.qml @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 400 + height: 400 + visible: true + when: windowShown + name: "Frame" + + Component { + id: frame + Frame { } + } + + Component { + id: oneChildFrame + GroupBox { + Item { + implicitWidth: 100 + implicitHeight: 30 + } + } + } + + Component { + id: twoChildrenFrame + GroupBox { + Item { + implicitWidth: 100 + implicitHeight: 30 + } + Item { + implicitWidth: 200 + implicitHeight: 60 + } + } + } + + function test_defaults() { + var control = frame.createObject(testCase) + verify(control.contentItem) + compare(control.contentWidth, 0) + compare(control.contentHeight, 0) + control.destroy() + } + + function test_oneChild() { + var control = oneChildFrame.createObject(testCase) + compare(control.contentWidth, 100) + compare(control.contentHeight, 30) + verify(control.implicitWidth > 100) + verify(control.implicitHeight > 30) + control.destroy() + } + + function test_twoChildren() { + var control = twoChildrenFrame.createObject(testCase) + compare(control.contentWidth, 0) + compare(control.contentHeight, 0) + verify(control.implicitWidth > 0) + verify(control.implicitHeight > 0) + control.destroy() + } +} diff --git a/tests/auto/controls/data/tst_groupbox.qml b/tests/auto/controls/data/tst_groupbox.qml new file mode 100644 index 00000000..4b88b474 --- /dev/null +++ b/tests/auto/controls/data/tst_groupbox.qml @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 400 + height: 400 + visible: true + when: windowShown + name: "GroupBox" + + Component { + id: groupBox + GroupBox { } + } + + Component { + id: oneChildBox + GroupBox { + Item { + implicitWidth: 100 + implicitHeight: 30 + } + } + } + + Component { + id: twoChildrenBox + GroupBox { + Item { + implicitWidth: 100 + implicitHeight: 30 + } + Item { + implicitWidth: 200 + implicitHeight: 60 + } + } + } + + function test_defaults() { + var control = groupBox.createObject(testCase) + verify(control.contentItem) + compare(control.title, "") + compare(control.contentWidth, 0) + compare(control.contentHeight, 0) + control.destroy() + } + + function test_oneChild() { + var control = oneChildBox.createObject(testCase) + compare(control.contentWidth, 100) + compare(control.contentHeight, 30) + verify(control.implicitWidth > 100) + verify(control.implicitHeight > 30) + control.destroy() + } + + function test_twoChildren() { + var control = twoChildrenBox.createObject(testCase) + compare(control.contentWidth, 0) + compare(control.contentHeight, 0) + verify(control.implicitWidth > 0) + verify(control.implicitHeight > 0) + control.destroy() + } +} diff --git a/tests/auto/controls/data/tst_progressbar.qml b/tests/auto/controls/data/tst_progressbar.qml new file mode 100644 index 00000000..c4a7347c --- /dev/null +++ b/tests/auto/controls/data/tst_progressbar.qml @@ -0,0 +1,121 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 400 + height: 400 + visible: true + when: windowShown + name: "ProgressBar" + + Component { + id: progressBar + ProgressBar { } + } + + function test_defaults() { + var control = progressBar.createObject(testCase) + compare(control.value, 0) + compare(control.visualPosition, 0) + compare(control.indeterminate, false) + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + control.destroy() + } + + function test_value() { + var control = progressBar.createObject(testCase, {value: 0.5}) + compare(control.value, 0.5) + control.value = 1.0 + compare(control.value, 1.0) + control.value = -1.0 + compare(control.value, 0.0) + control.value = 2.0 + compare(control.value, 1.0) + control.destroy() + } + + function test_layoutDirection() { + var control = progressBar.createObject(testCase) + + verify(!control.LayoutMirroring.enabled) + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.layoutDirection = Qt.RightToLeft + compare(control.layoutDirection, Qt.RightToLeft) + compare(control.effectiveLayoutDirection, Qt.RightToLeft) + + control.LayoutMirroring.enabled = true + compare(control.layoutDirection, Qt.RightToLeft) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.layoutDirection = Qt.LeftToRight + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.RightToLeft) + + control.LayoutMirroring.enabled = false + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.destroy() + } + + function test_visualPosition() { + var control = progressBar.createObject(testCase, {value: 0.25}) + compare(control.value, 0.25) + compare(control.visualPosition, 0.25) + + control.layoutDirection = Qt.RightToLeft + compare(control.visualPosition, 0.75) + + control.LayoutMirroring.enabled = true + compare(control.visualPosition, 0.25) + + control.layoutDirection = Qt.LeftToRight + compare(control.visualPosition, 0.75) + + control.LayoutMirroring.enabled = false + compare(control.visualPosition, 0.25) + + control.destroy() + } +} diff --git a/tests/auto/controls/data/tst_radiobutton.qml b/tests/auto/controls/data/tst_radiobutton.qml new file mode 100644 index 00000000..25a32536 --- /dev/null +++ b/tests/auto/controls/data/tst_radiobutton.qml @@ -0,0 +1,274 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 200 + height: 200 + visible: true + when: windowShown + name: "RadioButton" + + SignalSpy { + id: checkedSpy + signalName: "checkedChanged" + } + + SignalSpy { + id: pressedSpy + signalName: "pressedChanged" + } + + SignalSpy { + id: clickedSpy + signalName: "clicked" + } + + Component { + id: radioButton + RadioButton { } + } + + function init() { + verify(!checkedSpy.target) + verify(!pressedSpy.target) + verify(!clickedSpy.target) + compare(checkedSpy.count, 0) + compare(pressedSpy.count, 0) + compare(clickedSpy.count, 0) + } + + function cleanup() { + checkedSpy.target = null + pressedSpy.target = null + clickedSpy.target = null + checkedSpy.clear() + pressedSpy.clear() + clickedSpy.clear() + } + + function test_defaults() { + var control = radioButton.createObject(testCase) + verify(control) + verify(control.label) + verify(control.indicator) + compare(control.text, "") + compare(control.pressed, false) + compare(control.checked, false) + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + control.destroy() + } + + function test_layoutDirection() { + var control = radioButton.createObject(testCase) + + verify(!control.LayoutMirroring.enabled) + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.layoutDirection = Qt.RightToLeft + compare(control.layoutDirection, Qt.RightToLeft) + compare(control.effectiveLayoutDirection, Qt.RightToLeft) + + control.LayoutMirroring.enabled = true + compare(control.layoutDirection, Qt.RightToLeft) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.layoutDirection = Qt.LeftToRight + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.RightToLeft) + + control.LayoutMirroring.enabled = false + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.destroy() + } + + function test_text() { + var control = radioButton.createObject(testCase) + compare(control.text, "") + control.text = "RadioButton" + compare(control.text, "RadioButton") + control.text = "" + compare(control.text, "") + control.destroy() + } + + function test_checked() { + var control = radioButton.createObject(testCase) + + checkedSpy.target = control + verify(checkedSpy.valid) + + compare(control.checked, false) + compare(checkedSpy.count, 0) + + control.checked = true + compare(control.checked, true) + compare(checkedSpy.count, 1) + + control.checked = false + compare(control.checked, false) + compare(checkedSpy.count, 2) + + control.destroy() + } + + function test_mouse() { + var control = radioButton.createObject(testCase) + + checkedSpy.target = control + pressedSpy.target = control + clickedSpy.target = control + verify(checkedSpy.valid) + verify(pressedSpy.valid) + verify(clickedSpy.valid) + + // check + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 1) + compare(control.pressed, true) + mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(clickedSpy.count, 1) + compare(checkedSpy.count, 1) + compare(pressedSpy.count, 2) + compare(control.checked, true) + compare(control.pressed, false) + + // attempt uncheck + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 3) + compare(control.pressed, true) + mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 1) + compare(pressedSpy.count, 4) + compare(control.checked, true) + compare(control.pressed, false) + + // release outside + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 5) + compare(control.pressed, true) + mouseMove(control, control.width * 2, control.height * 2, 0, Qt.LeftButton) + compare(control.pressed, false) + mouseRelease(control, control.width * 2, control.height * 2, Qt.LeftButton) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 1) + compare(pressedSpy.count, 6) + compare(control.checked, true) + compare(control.pressed, false) + + // right button + mousePress(control, control.width / 2, control.height / 2, Qt.RightButton) + compare(pressedSpy.count, 6) + compare(control.pressed, false) + mouseRelease(control, control.width / 2, control.height / 2, Qt.RightButton) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 1) + compare(pressedSpy.count, 6) + compare(control.checked, true) + compare(control.pressed, false) + + control.destroy() + } + + function test_keys() { + var control = radioButton.createObject(testCase) + + checkedSpy.target = control + clickedSpy.target = control + verify(checkedSpy.valid) + verify(clickedSpy.valid) + + control.forceActiveFocus() + verify(control.activeFocus) + + // check + keyClick(Qt.Key_Space) + compare(clickedSpy.count, 1) + compare(checkedSpy.count, 1) + compare(control.checked, true) + + // attempt uncheck + keyClick(Qt.Key_Space) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 1) + compare(control.checked, true) + + // no change + var keys = [Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape, Qt.Key_Tab] + for (var i = 0; i < keys.length; ++i) { + keyClick(keys[i]) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 1) + compare(control.checked, true) + } + + control.destroy() + } + + Component { + id: twoRadioButtones + Item { + property RadioButton rb1: RadioButton { id: rb1 } + property RadioButton rb2: RadioButton { id: rb2; checked: rb1.checked; enabled: false } + } + } + + function test_binding() { + var container = twoRadioButtones.createObject(testCase) + + compare(container.rb1.checked, false) + compare(container.rb2.checked, false) + + container.rb1.checked = true + compare(container.rb1.checked, true) + compare(container.rb2.checked, true) + + container.rb1.checked = false + compare(container.rb1.checked, false) + compare(container.rb2.checked, false) + + container.destroy() + } +} diff --git a/tests/auto/controls/data/tst_scrollbar.qml b/tests/auto/controls/data/tst_scrollbar.qml new file mode 100644 index 00000000..92c7ed48 --- /dev/null +++ b/tests/auto/controls/data/tst_scrollbar.qml @@ -0,0 +1,192 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 400 + height: 400 + visible: true + when: windowShown + name: "ScrollBar" + + SignalSpy{ + id: pressedSpy + signalName: "pressedChanged" + } + + Component { + id: scrollBar + ScrollBar { } + } + + Component { + id: flickable + Flickable { + width: 100 + height: 100 + contentWidth: 200 + contentHeight: 200 + boundsBehavior: Flickable.StopAtBounds + flickableDirection: Flickable.HorizontalAndVerticalFlick + } + } + + function init() { + verify(!pressedSpy.target) + compare(pressedSpy.count, 0) + } + + function cleanup() { + pressedSpy.target = null + pressedSpy.clear() + } + + function test_defaults() { + var control = scrollBar.createObject(testCase) + verify(control) + verify(control.handle) + compare(control.size, 0.0) + compare(control.position, 0.0) + compare(control.active, false) + compare(control.orientation, Qt.Vertical) + control.destroy() + } + + function test_attach() { + var container = flickable.createObject(testCase) + waitForRendering(container) + + var vertical = scrollBar.createObject() + verify(!vertical.parent) + container.AbstractScrollBar.vertical = vertical + compare(vertical.parent, container) + compare(vertical.orientation, Qt.Vertical) + compare(vertical.size, container.visibleArea.heightRatio) + compare(vertical.position, container.visibleArea.yPosition) + + var horizontal = scrollBar.createObject() + verify(!horizontal.parent) + container.AbstractScrollBar.horizontal = horizontal + compare(horizontal.parent, container) + compare(horizontal.orientation, Qt.Horizontal) + compare(horizontal.size, container.visibleArea.widthRatio) + compare(horizontal.position, container.visibleArea.xPosition) + + var velocity = container.maximumFlickVelocity + + compare(container.flicking, false) + container.flick(-velocity, -velocity) + compare(container.flicking, true) + tryCompare(container, "flicking", false) + + compare(vertical.size, container.visibleArea.heightRatio) + compare(vertical.position, container.visibleArea.yPosition) + compare(horizontal.size, container.visibleArea.widthRatio) + compare(horizontal.position, container.visibleArea.xPosition) + + compare(container.flicking, false) + container.flick(velocity, velocity) + compare(container.flicking, true) + tryCompare(container, "flicking", false) + + compare(vertical.size, container.visibleArea.heightRatio) + compare(vertical.position, container.visibleArea.yPosition) + compare(horizontal.size, container.visibleArea.widthRatio) + compare(horizontal.position, container.visibleArea.xPosition) + + container.destroy() + } + + function test_mouse_data() { + return [ + { tag: "horizontal", properties: { visible: true, orientation: Qt.Horizontal, width: testCase.width } }, + { tag: "vertical", properties: { visible: true, orientation: Qt.Vertical, height: testCase.height } } + ] + } + + function test_mouse(data) { + var control = scrollBar.createObject(testCase, data.properties) + + pressedSpy.target = control + verify(pressedSpy.valid) + + mousePress(control, 0, 0, Qt.LeftButton) + compare(pressedSpy.count, 1) + compare(control.pressed, true) + compare(control.position, 0.0) + + mouseMove(control, -control.width, -control.height, 0, Qt.LeftButton) + compare(pressedSpy.count, 1) + compare(control.pressed, true) + compare(control.position, 0.0) + + mouseMove(control, control.width * 0.5, control.height * 0.5, 0, Qt.LeftButton) + compare(pressedSpy.count, 1) + compare(control.pressed, true) + verify(control.position, 0.5) + + mouseRelease(control, control.width * 0.5, control.height * 0.5, Qt.LeftButton) + compare(pressedSpy.count, 2) + compare(control.pressed, false) + compare(control.position, 0.5) + + mousePress(control, control.width, control.height, Qt.LeftButton) + compare(pressedSpy.count, 3) + compare(control.pressed, true) + compare(control.position, 0.5) + + mouseMove(control, control.width * 2, control.height * 2, 0, Qt.LeftButton) + compare(pressedSpy.count, 3) + compare(control.pressed, true) + compare(control.position, 1.0) + + mouseMove(control, control.width * 0.75, control.height * 0.75, 0, Qt.LeftButton) + compare(pressedSpy.count, 3) + compare(control.pressed, true) + compare(control.position, 0.75) + + mouseRelease(control, control.width * 0.25, control.height * 0.25, Qt.LeftButton) + compare(pressedSpy.count, 4) + compare(control.pressed, false) + compare(control.position, 0.25) + + control.destroy() + } +} diff --git a/tests/auto/controls/data/tst_scrollindicator.qml b/tests/auto/controls/data/tst_scrollindicator.qml new file mode 100644 index 00000000..36149827 --- /dev/null +++ b/tests/auto/controls/data/tst_scrollindicator.qml @@ -0,0 +1,121 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 400 + height: 400 + visible: true + when: windowShown + name: "ScrollIndicator" + + Component { + id: scrollIndicator + ScrollIndicator { } + } + + Component { + id: flickable + Flickable { + width: 100 + height: 100 + contentWidth: 200 + contentHeight: 200 + boundsBehavior: Flickable.StopAtBounds + flickableDirection: Flickable.HorizontalAndVerticalFlick + } + } + + function test_defaults() { + var control = scrollIndicator.createObject(testCase) + verify(control) + verify(control.indicator) + compare(control.size, 0.0) + compare(control.position, 0.0) + compare(control.active, false) + compare(control.orientation, Qt.Vertical) + control.destroy() + } + + function test_attach() { + var container = flickable.createObject(testCase) + waitForRendering(container) + + var vertical = scrollIndicator.createObject() + verify(!vertical.parent) + container.AbstractScrollIndicator.vertical = vertical + compare(vertical.parent, container) + compare(vertical.orientation, Qt.Vertical) + compare(vertical.size, container.visibleArea.heightRatio) + compare(vertical.position, container.visibleArea.yPosition) + + var horizontal = scrollIndicator.createObject() + verify(!horizontal.parent) + container.AbstractScrollIndicator.horizontal = horizontal + compare(horizontal.parent, container) + compare(horizontal.orientation, Qt.Horizontal) + compare(horizontal.size, container.visibleArea.widthRatio) + compare(horizontal.position, container.visibleArea.xPosition) + + var velocity = container.maximumFlickVelocity + + compare(container.flicking, false) + container.flick(-velocity, -velocity) + compare(container.flicking, true) + tryCompare(container, "flicking", false) + + compare(vertical.size, container.visibleArea.heightRatio) + compare(vertical.position, container.visibleArea.yPosition) + compare(horizontal.size, container.visibleArea.widthRatio) + compare(horizontal.position, container.visibleArea.xPosition) + + compare(container.flicking, false) + container.flick(velocity, velocity) + compare(container.flicking, true) + tryCompare(container, "flicking", false) + + compare(vertical.size, container.visibleArea.heightRatio) + compare(vertical.position, container.visibleArea.yPosition) + compare(horizontal.size, container.visibleArea.widthRatio) + compare(horizontal.position, container.visibleArea.xPosition) + + container.destroy() + } +} diff --git a/tests/auto/controls/data/tst_slider.qml b/tests/auto/controls/data/tst_slider.qml new file mode 100644 index 00000000..5b74f1a6 --- /dev/null +++ b/tests/auto/controls/data/tst_slider.qml @@ -0,0 +1,283 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 400 + height: 400 + visible: true + when: windowShown + name: "Slider" + + SignalSpy{ + id: pressedSpy + signalName: "pressedChanged" + } + + Component { + id: slider + Slider { } + } + + function init() { + verify(!pressedSpy.target) + compare(pressedSpy.count, 0) + } + + function cleanup() { + pressedSpy.target = null + pressedSpy.clear() + } + + function test_defaults() { + var control = slider.createObject(testCase) + verify(control) + verify(control.handle) + verify(control.track) + compare(control.value, 0) + compare(control.position, 0) + compare(control.visualPosition, 0) + compare(control.stepSize, 0) + compare(control.snapMode, AbstractSlider.NoSnap) + compare(control.pressed, false) + compare(control.orientation, Qt.Horizontal) + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + control.destroy() + } + + function test_layoutDirection() { + var control = slider.createObject(testCase) + + verify(!control.LayoutMirroring.enabled) + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.layoutDirection = Qt.RightToLeft + compare(control.layoutDirection, Qt.RightToLeft) + compare(control.effectiveLayoutDirection, Qt.RightToLeft) + + control.LayoutMirroring.enabled = true + compare(control.layoutDirection, Qt.RightToLeft) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.layoutDirection = Qt.LeftToRight + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.RightToLeft) + + control.LayoutMirroring.enabled = false + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.destroy() + } + + function test_visualPosition() { + var control = slider.createObject(testCase, {value: 0.25}) + compare(control.value, 0.25) + compare(control.visualPosition, 0.25) + + control.layoutDirection = Qt.RightToLeft + compare(control.visualPosition, 0.75) + + control.LayoutMirroring.enabled = true + compare(control.visualPosition, 0.25) + + control.layoutDirection = Qt.LeftToRight + compare(control.visualPosition, 0.75) + + control.LayoutMirroring.enabled = false + compare(control.visualPosition, 0.25) + + control.destroy() + } + + function test_orientation() { + var control = slider.createObject(testCase) + compare(control.orientation, Qt.Horizontal) + verify(control.width > control.height) + control.orientation = Qt.Vertical + compare(control.orientation, Qt.Vertical) + verify(control.width < control.height) + control.destroy() + } + + function test_mouse_data() { + return [ + { tag: "horizontal", orientation: Qt.Horizontal }, + { tag: "vertical", orientation: Qt.Vertical } + ] + } + + function test_mouse(data) { + var control = slider.createObject(testCase, {orientation: data.orientation}) + + pressedSpy.target = control + verify(pressedSpy.valid) + + mousePress(control, 0, 0, Qt.LeftButton) + compare(pressedSpy.count, 1) + compare(control.pressed, true) + compare(control.value, 0.0) + compare(control.position, 0.0) + + mouseMove(control, -control.width, -control.height, 0, Qt.LeftButton) + compare(pressedSpy.count, 1) + compare(control.pressed, true) + compare(control.value, 0.0) + compare(control.position, 0.0) + + mouseMove(control, control.width * 0.5, control.height * 0.5, 0, Qt.LeftButton) + compare(pressedSpy.count, 1) + compare(control.pressed, true) + compare(control.value, 0.0) + verify(control.position, 0.5) + + mouseRelease(control, control.width * 0.5, control.height * 0.5, Qt.LeftButton) + compare(pressedSpy.count, 2) + compare(control.pressed, false) + compare(control.value, 0.5) + compare(control.position, 0.5) + + mousePress(control, control.width, control.height, Qt.LeftButton) + compare(pressedSpy.count, 3) + compare(control.pressed, true) + compare(control.value, 0.5) + compare(control.position, 0.5) + + mouseMove(control, control.width * 2, control.height * 2, 0, Qt.LeftButton) + compare(pressedSpy.count, 3) + compare(control.pressed, true) + compare(control.value, 0.5) + compare(control.position, 1.0) + + mouseMove(control, control.width * 0.75, control.height * 0.75, 0, Qt.LeftButton) + compare(pressedSpy.count, 3) + compare(control.pressed, true) + compare(control.value, 0.5) + verify(control.position >= 0.75) + + mouseRelease(control, control.width * 0.25, control.height * 0.25, Qt.LeftButton) + compare(pressedSpy.count, 4) + compare(control.pressed, false) + compare(control.value, control.position) + verify(control.value <= 0.25 && control.value >= 0.0) + verify(control.position <= 0.25 && control.position >= 0.0) + + control.destroy() + } + + function test_keys_data() { + return [ + { tag: "horizontal", orientation: Qt.Horizontal, decrease: Qt.Key_Left, increase: Qt.Key_Right }, + { tag: "vertical", orientation: Qt.Vertical, decrease: Qt.Key_Down, increase: Qt.Key_Up } + ] + } + + function test_keys(data) { + var control = slider.createObject(testCase, {orientation: data.orientation}) + + var pressedCount = 0 + + pressedSpy.target = control + verify(pressedSpy.valid) + + control.forceActiveFocus() + verify(control.activeFocus) + + control.value = 0.5 + + for (var d1 = 1; d1 <= 10; ++d1) { + keyPress(data.decrease) + compare(control.pressed, true) + compare(pressedSpy.count, ++pressedCount) + + compare(control.value, Math.max(0.0, 0.5 - d1 * 0.1)) + compare(control.value, control.position) + + keyRelease(data.decrease) + compare(control.pressed, false) + compare(pressedSpy.count, ++pressedCount) + } + + for (var i1 = 1; i1 <= 20; ++i1) { + keyPress(data.increase) + compare(control.pressed, true) + compare(pressedSpy.count, ++pressedCount) + + compare(control.value, Math.min(1.0, 0.0 + i1 * 0.1)) + compare(control.value, control.position) + + keyRelease(data.increase) + compare(control.pressed, false) + compare(pressedSpy.count, ++pressedCount) + } + + control.stepSize = 0.25 + + for (var d2 = 1; d2 <= 10; ++d2) { + keyPress(data.decrease) + compare(control.pressed, true) + compare(pressedSpy.count, ++pressedCount) + + compare(control.value, Math.max(0.0, 1.0 - d2 * 0.25)) + compare(control.value, control.position) + + keyRelease(data.decrease) + compare(control.pressed, false) + compare(pressedSpy.count, ++pressedCount) + } + + for (var i2 = 1; i2 <= 10; ++i2) { + keyPress(data.increase) + compare(control.pressed, true) + compare(pressedSpy.count, ++pressedCount) + + compare(control.value, Math.min(1.0, 0.0 + i2 * 0.25)) + compare(control.value, control.position) + + keyRelease(data.increase) + compare(control.pressed, false) + compare(pressedSpy.count, ++pressedCount) + } + + control.destroy() + } +} diff --git a/tests/auto/controls/data/tst_stackview.qml b/tests/auto/controls/data/tst_stackview.qml new file mode 100644 index 00000000..ac317f32 --- /dev/null +++ b/tests/auto/controls/data/tst_stackview.qml @@ -0,0 +1,284 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 200 + height: 200 + visible: true + when: windowShown + name: "StackView" + + Item { id: item } + TextField { id: textField } + Component { id: component; Item { } } + + Component { + id: stackView + StackView { } + } + + function test_defaults() { + var control = stackView.createObject(testCase) + verify(control) + verify(control.delegate) + compare(control.depth, 0) + compare(control.busy, false) + compare(control.currentItem, null) + compare(control.initialItem, null) + control.destroy() + } + + function test_initialItem() { + var control1 = stackView.createObject(testCase, {initialItem: item}) + compare(control1.currentItem, item) + control1.destroy() + + var control2 = stackView.createObject(testCase, {initialItem: component}) + verify(control2.currentItem) + control2.destroy() + } + + function test_currentItem() { + var control = stackView.createObject(testCase, {initialItem: item}) + compare(control.currentItem, item) + control.push(component) + verify(control.currentItem !== item) + control.pop({immediate: true}) + compare(control.currentItem, item) + control.destroy() + } + + function test_busy() { + var control = stackView.createObject(testCase) + compare(control.busy, false) + control.push(component) + compare(control.busy, false) + control.push(component) + compare(control.busy, true) + tryCompare(control, "busy", false) + control.pop() + compare(control.busy, true) + tryCompare(control, "busy", false) + control.destroy() + } + + function test_status() { + var control = stackView.createObject(testCase) + + var item1 = component.createObject(control) + compare(item1.Stack.status, Stack.Inactive) + control.push(item1) + compare(item1.Stack.status, Stack.Active) + + var item2 = component.createObject(control) + compare(item2.Stack.status, Stack.Inactive) + control.push(item2) + compare(item2.Stack.status, Stack.Activating) + compare(item1.Stack.status, Stack.Deactivating) + tryCompare(item2.Stack, "status", Stack.Active) + tryCompare(item1.Stack, "status", Stack.Inactive) + + control.pop() + compare(item2.Stack.status, Stack.Deactivating) + compare(item1.Stack.status, Stack.Activating) + tryCompare(item2.Stack, "status", Stack.Inactive) + tryCompare(item1.Stack, "status", Stack.Active) + + control.destroy() + } + + function test_depth() { + var control = stackView.createObject(testCase) + compare(control.depth, 0) + control.push(item) + compare(control.depth, 1) + control.push(item) + compare(control.depth, 2) + control.pop() + compare(control.depth, 1) + control.push(component) + compare(control.depth, 2) + control.pop() + compare(control.depth, 1) + control.pop() // ignored + compare(control.depth, 1) + control.clear() + compare(control.depth, 0) + control.destroy() + } + + function test_size() { + var container = component.createObject(testCase, {width: 200, height: 200}) + var control = stackView.createObject(container, {width: 100, height: 100}) + container.width += 10 + container.height += 20 + compare(control.width, 100) + compare(control.height, 100) + container.destroy() + } + + function test_focus() { + var control = stackView.createObject(testCase, {initialItem: item, width: 200, height: 200}) + + control.forceActiveFocus() + verify(control.activeFocus) + + control.push({item: textField, immediate: true}) + compare(control.currentItem, textField) + textField.forceActiveFocus() + verify(textField.activeFocus) + + control.pop({immediate: true}) + compare(control.currentItem, item) + verify(control.activeFocus) + verify(!textField.activeFocus) + + control.destroy() + } + + function test_find() { + var control = stackView.createObject(testCase) + + var item1 = component.createObject(control, {objectName: "1"}) + var item2 = component.createObject(control, {objectName: "2"}) + var item3 = component.createObject(control, {objectName: "3"}) + + control.push(item1, {immediate: true}) + control.push(item2, {immediate: true}) + control.push(item3, {immediate: true}) + + compare(control.find(function(item, index) { return index === 0 }), item1) + compare(control.find(function(item) { return item.objectName === "1" }), item1) + + compare(control.find(function(item, index) { return index === 1 }), item2) + compare(control.find(function(item) { return item.objectName === "2" }), item2) + + compare(control.find(function(item, index) { return index === 2 }), item3) + compare(control.find(function(item) { return item.objectName === "3" }), item3) + + compare(control.find(function() { return false }), null) + compare(control.find(function() { return true }), item3) + + control.destroy() + } + + function test_get() { + var control = stackView.createObject(testCase) + + control.push([item, component, component]) + + verify(!control.get(0, true)) // dontLoad=true + compare(control.get(0, false), item) // dontLoad=false + + verify(!control.get(1, true)) // dontLoad=true + verify(control.get(1, false)) // dontLoad=false + + verify(control.get(2, true)) // dontLoad=true + verify(control.get(2, false)) // dontLoad=false + + control.destroy() + } + + function test_pushpop() { + var control = stackView.createObject(testCase) + + var item1 = component.createObject(control, {objectName:"1"}) + compare(control.push(item1), item1) + compare(control.depth, 1) + compare(control.currentItem, item1) + + var item2 = component.createObject(control, {objectName:"2"}) + compare(control.push({item: item2}), item2) + compare(control.depth, 2) + compare(control.currentItem, item2) + + var item3 = component.createObject(control, {objectName:"3"}) + compare(control.push(item3, {}, true), item3) + compare(control.depth, 3) + compare(control.currentItem, item3) + + var item4 = component.createObject(control, {objectName:"4"}) + compare(control.push(item4, {}, true, true), item4) + compare(control.depth, 3) + compare(control.currentItem, item4) + + var item5 = component.createObject(control, {objectName:"5"}) + compare(control.push({item:item5, immediate:true, replace:true}), item5) + compare(control.depth, 3) + compare(control.currentItem, item5) + + var item6 = control.push(component, {objectName:"6"}) + compare(control.depth, 4) + compare(control.currentItem, item6) + + var item7 = control.push({item:component, properties:{objectName:"7"}}) + compare(control.depth, 5) + compare(control.currentItem, item7) + + var item8 = component.createObject(control, {objectName:"8"}) + var item9 = component.createObject(control, {objectName:"9"}) + compare(control.push([component, {item:component, properties:{objectName:"?"}}, {item:item8}, item9]), item9) + compare(control.depth, 9) + compare(control.currentItem, item9) + + compare(control.pop(), item9) + compare(control.depth, 8) + compare(control.currentItem, item8) + + compare(control.pop(), item8) + compare(control.depth, 7) + + verify(control.pop({immediate:true})) + verify(control.pop({immediate:false})) + compare(control.depth, 5) + compare(control.currentItem, item7) + + compare(control.pop(item5), item7) + compare(control.depth, 3) + compare(control.currentItem, item5) + + control.pop(null) + compare(control.depth, 1) + compare(control.currentItem, item1) + + control.destroy() + } +} diff --git a/tests/auto/controls/data/tst_switch.qml b/tests/auto/controls/data/tst_switch.qml new file mode 100644 index 00000000..faacacfe --- /dev/null +++ b/tests/auto/controls/data/tst_switch.qml @@ -0,0 +1,287 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 200 + height: 200 + visible: true + when: windowShown + name: "Switch" + + SignalSpy { + id: checkedSpy + signalName: "checkedChanged" + } + + SignalSpy { + id: pressedSpy + signalName: "pressedChanged" + } + + SignalSpy { + id: clickedSpy + signalName: "clicked" + } + + Component { + id: swtch + Switch { } + } + + function init() { + verify(!checkedSpy.target) + verify(!pressedSpy.target) + verify(!clickedSpy.target) + compare(checkedSpy.count, 0) + compare(pressedSpy.count, 0) + compare(clickedSpy.count, 0) + } + + function cleanup() { + checkedSpy.target = null + pressedSpy.target = null + clickedSpy.target = null + checkedSpy.clear() + pressedSpy.clear() + clickedSpy.clear() + } + + function test_defaults() { + var control = swtch.createObject(testCase) + verify(control) + verify(control.label) + verify(control.indicator) + compare(control.text, "") + compare(control.pressed, false) + compare(control.checked, false) + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + control.destroy() + } + + function test_layoutDirection() { + var control = swtch.createObject(testCase) + + verify(!control.LayoutMirroring.enabled) + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.layoutDirection = Qt.RightToLeft + compare(control.layoutDirection, Qt.RightToLeft) + compare(control.effectiveLayoutDirection, Qt.RightToLeft) + + control.LayoutMirroring.enabled = true + compare(control.layoutDirection, Qt.RightToLeft) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.layoutDirection = Qt.LeftToRight + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.RightToLeft) + + control.LayoutMirroring.enabled = false + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.destroy() + } + + function test_text() { + var control = swtch.createObject(testCase) + compare(control.text, "") + control.text = "Switch" + compare(control.text, "Switch") + control.text = "" + compare(control.text, "") + control.destroy() + } + + function test_checked() { + var control = swtch.createObject(testCase) + + checkedSpy.target = control + verify(checkedSpy.valid) + + compare(control.checked, false) + compare(checkedSpy.count, 0) + + control.checked = true + compare(control.checked, true) + compare(checkedSpy.count, 1) + + control.checked = false + compare(control.checked, false) + compare(checkedSpy.count, 2) + + control.destroy() + } + + function test_mouse() { + var control = swtch.createObject(testCase) + + checkedSpy.target = control + pressedSpy.target = control + clickedSpy.target = control + verify(checkedSpy.valid) + verify(pressedSpy.valid) + verify(clickedSpy.valid) + + // check + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 1) + compare(control.pressed, true) + mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(clickedSpy.count, 1) + compare(checkedSpy.count, 1) + compare(pressedSpy.count, 2) + compare(control.checked, true) + compare(control.pressed, false) + + // uncheck + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 3) + compare(control.pressed, true) + mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 2) + compare(pressedSpy.count, 4) + compare(control.checked, false) + compare(control.pressed, false) + + // release on the right + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 5) + compare(control.pressed, true) + mouseMove(control, control.width * 2, control.height / 2, 0, Qt.LeftButton) + compare(control.pressed, true) + mouseRelease(control, control.width * 2, control.height / 2, Qt.LeftButton) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 3) + compare(pressedSpy.count, 6) + compare(control.checked, true) + compare(control.pressed, false) + + // release on the left + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 7) + compare(control.pressed, true) + mouseMove(control, -control.width, control.height / 2, 0, Qt.LeftButton) + compare(control.pressed, true) + mouseRelease(control, -control.width, control.height / 2, Qt.LeftButton) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 4) + compare(pressedSpy.count, 8) + compare(control.checked, false) + compare(control.pressed, false) + + // right button + mousePress(control, control.width / 2, control.height / 2, Qt.RightButton) + compare(pressedSpy.count, 8) + compare(control.pressed, false) + mouseRelease(control, control.width / 2, control.height / 2, Qt.RightButton) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 4) + compare(pressedSpy.count, 8) + compare(control.checked, false) + compare(control.pressed, false) + + control.destroy() + } + + function test_keys() { + var control = swtch.createObject(testCase) + + checkedSpy.target = control + clickedSpy.target = control + verify(checkedSpy.valid) + verify(clickedSpy.valid) + + control.forceActiveFocus() + verify(control.activeFocus) + + // check + keyClick(Qt.Key_Space) + compare(clickedSpy.count, 1) + compare(checkedSpy.count, 1) + compare(control.checked, true) + + // uncheck + keyClick(Qt.Key_Space) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 2) + compare(control.checked, false) + + // no change + var keys = [Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape, Qt.Key_Tab] + for (var i = 0; i < keys.length; ++i) { + keyClick(keys[i]) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 2) + compare(control.checked, false) + } + + control.destroy() + } + + Component { + id: twoSwitches + Item { + property Switch sw1: Switch { id: sw1 } + property Switch sw2: Switch { id: sw2; checked: sw1.checked; enabled: false } + } + } + + function test_binding() { + var container = twoSwitches.createObject(testCase) + + compare(container.sw1.checked, false) + compare(container.sw2.checked, false) + + container.sw1.checked = true + compare(container.sw1.checked, true) + compare(container.sw2.checked, true) + + container.sw1.checked = false + compare(container.sw1.checked, false) + compare(container.sw2.checked, false) + + container.destroy() + } +} diff --git a/tests/auto/controls/data/tst_togglebutton.qml b/tests/auto/controls/data/tst_togglebutton.qml new file mode 100644 index 00000000..834852c5 --- /dev/null +++ b/tests/auto/controls/data/tst_togglebutton.qml @@ -0,0 +1,287 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 200 + height: 200 + visible: true + when: windowShown + name: "ToggleButton" + + SignalSpy { + id: checkedSpy + signalName: "checkedChanged" + } + + SignalSpy { + id: pressedSpy + signalName: "pressedChanged" + } + + SignalSpy { + id: clickedSpy + signalName: "clicked" + } + + Component { + id: toggleButton + ToggleButton { } + } + + function init() { + verify(!checkedSpy.target) + verify(!pressedSpy.target) + verify(!clickedSpy.target) + compare(checkedSpy.count, 0) + compare(pressedSpy.count, 0) + compare(clickedSpy.count, 0) + } + + function cleanup() { + checkedSpy.target = null + pressedSpy.target = null + clickedSpy.target = null + checkedSpy.clear() + pressedSpy.clear() + clickedSpy.clear() + } + + function test_defaults() { + var control = toggleButton.createObject(testCase) + verify(control) + verify(control.label) + verify(control.indicator) + compare(control.text, "") + compare(control.pressed, false) + compare(control.checked, false) + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + control.destroy() + } + + function test_layoutDirection() { + var control = toggleButton.createObject(testCase) + + verify(!control.LayoutMirroring.enabled) + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.layoutDirection = Qt.RightToLeft + compare(control.layoutDirection, Qt.RightToLeft) + compare(control.effectiveLayoutDirection, Qt.RightToLeft) + + control.LayoutMirroring.enabled = true + compare(control.layoutDirection, Qt.RightToLeft) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.layoutDirection = Qt.LeftToRight + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.RightToLeft) + + control.LayoutMirroring.enabled = false + compare(control.layoutDirection, Qt.LeftToRight) + compare(control.effectiveLayoutDirection, Qt.LeftToRight) + + control.destroy() + } + + function test_text() { + var control = toggleButton.createObject(testCase) + compare(control.text, "") + control.text = "ToggleButton" + compare(control.text, "ToggleButton") + control.text = "" + compare(control.text, "") + control.destroy() + } + + function test_checked() { + var control = toggleButton.createObject(testCase) + + checkedSpy.target = control + verify(checkedSpy.valid) + + compare(control.checked, false) + compare(checkedSpy.count, 0) + + control.checked = true + compare(control.checked, true) + compare(checkedSpy.count, 1) + + control.checked = false + compare(control.checked, false) + compare(checkedSpy.count, 2) + + control.destroy() + } + + function test_mouse() { + var control = toggleButton.createObject(testCase) + + checkedSpy.target = control + pressedSpy.target = control + clickedSpy.target = control + verify(checkedSpy.valid) + verify(pressedSpy.valid) + verify(clickedSpy.valid) + + // check + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 1) + compare(control.pressed, true) + mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(clickedSpy.count, 1) + compare(checkedSpy.count, 1) + compare(pressedSpy.count, 2) + compare(control.checked, true) + compare(control.pressed, false) + + // uncheck + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 3) + compare(control.pressed, true) + mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 2) + compare(pressedSpy.count, 4) + compare(control.checked, false) + compare(control.pressed, false) + + // release on the right + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 5) + compare(control.pressed, true) + mouseMove(control, control.width * 2, control.height / 2, 0, Qt.LeftButton) + compare(control.pressed, true) + mouseRelease(control, control.width * 2, control.height / 2, Qt.LeftButton) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 3) + compare(pressedSpy.count, 6) + compare(control.checked, true) + compare(control.pressed, false) + + // release on the left + mousePress(control, control.width / 2, control.height / 2, Qt.LeftButton) + compare(pressedSpy.count, 7) + compare(control.pressed, true) + mouseMove(control, -control.width, control.height / 2, 0, Qt.LeftButton) + compare(control.pressed, true) + mouseRelease(control, -control.width, control.height / 2, Qt.LeftButton) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 4) + compare(pressedSpy.count, 8) + compare(control.checked, false) + compare(control.pressed, false) + + // right button + mousePress(control, control.width / 2, control.height / 2, Qt.RightButton) + compare(pressedSpy.count, 8) + compare(control.pressed, false) + mouseRelease(control, control.width / 2, control.height / 2, Qt.RightButton) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 4) + compare(pressedSpy.count, 8) + compare(control.checked, false) + compare(control.pressed, false) + + control.destroy() + } + + function test_keys() { + var control = toggleButton.createObject(testCase) + + checkedSpy.target = control + clickedSpy.target = control + verify(checkedSpy.valid) + verify(clickedSpy.valid) + + control.forceActiveFocus() + verify(control.activeFocus) + + // check + keyClick(Qt.Key_Space) + compare(clickedSpy.count, 1) + compare(checkedSpy.count, 1) + compare(control.checked, true) + + // uncheck + keyClick(Qt.Key_Space) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 2) + compare(control.checked, false) + + // no change + var keys = [Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape, Qt.Key_Tab] + for (var i = 0; i < keys.length; ++i) { + keyClick(keys[i]) + compare(clickedSpy.count, 2) + compare(checkedSpy.count, 2) + compare(control.checked, false) + } + + control.destroy() + } + + Component { + id: twoToggleButtones + Item { + property ToggleButton tb1: ToggleButton { id: tb1 } + property ToggleButton tb2: ToggleButton { id: tb2; checked: tb1.checked; enabled: false } + } + } + + function test_binding() { + var container = twoToggleButtones.createObject(testCase) + + compare(container.tb1.checked, false) + compare(container.tb2.checked, false) + + container.tb1.checked = true + compare(container.tb1.checked, true) + compare(container.tb2.checked, true) + + container.tb1.checked = false + compare(container.tb1.checked, false) + compare(container.tb2.checked, false) + + container.destroy() + } +} diff --git a/tests/auto/controls/data/tst_toolbar.qml b/tests/auto/controls/data/tst_toolbar.qml new file mode 100644 index 00000000..683a0918 --- /dev/null +++ b/tests/auto/controls/data/tst_toolbar.qml @@ -0,0 +1,103 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 400 + height: 400 + visible: true + when: windowShown + name: "ToolBar" + + Component { + id: toolBar + ToolBar { } + } + + Component { + id: oneChildBar + GroupBox { + Item { + implicitWidth: 100 + implicitHeight: 30 + } + } + } + + Component { + id: twoChildrenBar + GroupBox { + Item { + implicitWidth: 100 + implicitHeight: 30 + } + Item { + implicitWidth: 200 + implicitHeight: 60 + } + } + } + + function test_defaults() { + var control = toolBar.createObject(testCase) + verify(control.contentItem) + compare(control.contentWidth, 0) + compare(control.contentHeight, 0) + control.destroy() + } + + function test_oneChild() { + var control = oneChildBar.createObject(testCase) + compare(control.contentWidth, 100) + compare(control.contentHeight, 30) + verify(control.implicitWidth > 100) + verify(control.implicitHeight > 30) + control.destroy() + } + + function test_twoChildren() { + var control = twoChildrenBar.createObject(testCase) + compare(control.contentWidth, 0) + compare(control.contentHeight, 0) + verify(control.implicitWidth > 0) + verify(control.implicitHeight > 0) + control.destroy() + } +} diff --git a/tests/auto/controls/data/tst_toolbutton.qml b/tests/auto/controls/data/tst_toolbutton.qml new file mode 100644 index 00000000..f7f98a5d --- /dev/null +++ b/tests/auto/controls/data/tst_toolbutton.qml @@ -0,0 +1,172 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Controls 2.0 + +TestCase { + id: testCase + width: 200 + height: 200 + visible: true + when: windowShown + name: "ToolButton" + + SignalSpy { + id: pressedSpy + signalName: "pressedChanged" + } + + SignalSpy { + id: clickedSpy + signalName: "clicked" + } + + Component { + id: toolButton + ToolButton { } + } + + function init() { + verify(!pressedSpy.target) + verify(!clickedSpy.target) + compare(pressedSpy.count, 0) + compare(clickedSpy.count, 0) + } + + function cleanup() { + pressedSpy.target = null + clickedSpy.target = null + pressedSpy.clear() + clickedSpy.clear() + } + + function test_defaults() { + var control = toolButton.createObject(testCase) + verify(control) + verify(control.label) + compare(control.text, "") + compare(control.pressed, false) + control.destroy() + } + + function test_text() { + var control = toolButton.createObject(testCase) + compare(control.text, "") + control.text = "ToolButton" + compare(control.text, "ToolButton") + control.text = "" + compare(control.text, "") + control.destroy() + } + + function test_mouse() { + var control = toolButton.createObject(testCase) + + pressedSpy.target = control + clickedSpy.target = control + verify(pressedSpy.valid) + verify(clickedSpy.valid) + + // check + mousePress(control, control.width / 2, control.height / 2, Qt.LeftToolButton) + compare(pressedSpy.count, 1) + compare(control.pressed, true) + mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftToolButton) + compare(clickedSpy.count, 1) + compare(pressedSpy.count, 2) + compare(control.pressed, false) + + // uncheck + mousePress(control, control.width / 2, control.height / 2, Qt.LeftToolButton) + compare(pressedSpy.count, 3) + compare(control.pressed, true) + mouseRelease(control, control.width / 2, control.height / 2, Qt.LeftToolButton) + compare(clickedSpy.count, 2) + compare(pressedSpy.count, 4) + compare(control.pressed, false) + + // release outside + mousePress(control, control.width / 2, control.height / 2, Qt.LeftToolButton) + compare(pressedSpy.count, 5) + compare(control.pressed, true) + mouseMove(control, control.width * 2, control.height * 2, 0, Qt.LeftToolButton) + compare(control.pressed, false) + mouseRelease(control, control.width * 2, control.height * 2, Qt.LeftToolButton) + compare(clickedSpy.count, 2) + compare(pressedSpy.count, 6) + compare(control.pressed, false) + + // right button + mousePress(control, control.width / 2, control.height / 2, Qt.RightButton) + compare(pressedSpy.count, 6) + compare(control.pressed, false) + mouseRelease(control, control.width / 2, control.height / 2, Qt.RightButton) + compare(clickedSpy.count, 2) + compare(pressedSpy.count, 6) + compare(control.pressed, false) + + control.destroy() + } + + function test_keys() { + var control = toolButton.createObject(testCase) + + clickedSpy.target = control + verify(clickedSpy.valid) + + control.forceActiveFocus() + verify(control.activeFocus) + + // check + keyClick(Qt.Key_Space) + compare(clickedSpy.count, 1) + + // uncheck + keyClick(Qt.Key_Space) + compare(clickedSpy.count, 2) + + // no change + var keys = [Qt.Key_Enter, Qt.Key_Return, Qt.Key_Escape, Qt.Key_Tab] + for (var i = 0; i < keys.length; ++i) { + keyClick(keys[i]) + compare(clickedSpy.count, 2) + } + + control.destroy() + } +} diff --git a/tests/auto/controls/tst_controls.cpp b/tests/auto/controls/tst_controls.cpp new file mode 100644 index 00000000..89cc39f0 --- /dev/null +++ b/tests/auto/controls/tst_controls.cpp @@ -0,0 +1,38 @@ +/**************************************************************************** +** +** 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: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 <QtQuickTest/quicktest.h> +QUICK_TEST_MAIN(tst_controls) diff --git a/tests/auto/extras/data/tst_splitview.qml b/tests/auto/extras/data/tst_splitview.qml new file mode 100644 index 00000000..7473cc89 --- /dev/null +++ b/tests/auto/extras/data/tst_splitview.qml @@ -0,0 +1,328 @@ +/**************************************************************************** +** +** 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: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.2 +import QtTest 1.0 +import QtQuick.Extras 2.0 +import QtQuick.Layouts 1.0 + +TestCase { + id: testCase + name: "Tests_SplitView" + when: windowShown + width: 400 + height: 500 + visible: true + property int handleWidth: 1 + property int handleHeight: 5 + + Component { + id: splitView + SplitView { + anchors.fill: parent + property alias item1: item1 + property alias item2: item2 + handleDelegate: Rectangle { width: handleWidth; height: handleHeight; color: "black" } + + Rectangle { + id: item1 + width: 100 + height: 80 + color: "red" + } + Rectangle { + id: item2 + width: 200 + height: 90 + color: "blue" + } + } + } + + Component { + id: splitView_hide_item_after_fillWidth + SplitView { + anchors.fill: parent + property alias item3: item3 + handleDelegate: Rectangle { width: handleWidth; height: handleHeight; color: "black" } + Rectangle { + color: "yellow" + Layout.fillWidth: true + } + Rectangle { + color: "green" + Layout.minimumWidth: 100 + visible: false + } + Rectangle { + id: item3 + color: "blue" + Layout.minimumWidth: 100 + } + } + } + + function test_01_splitView() { + var view = splitView.createObject(testCase); + verify (view !== null, "splitview created is null") + waitForRendering(view) + verify (view.orientation === Qt.Horizontal) + compare (view.__items.length, 2) + compare (view.item1.x, 0) + compare (view.item1.y, 0) + compare (view.item1.width, 100) + compare (view.item1.height, 500) + compare (view.item2.x, view.item1.x + view.item1.width + handleWidth) + compare (view.item2.y, 0) + compare (view.item2.width, testCase.width - view.item1.width - handleWidth) + compare (view.item2.height, 500) + view.destroy() + } + + function test_02_splitView_initial_orientation_vertical() { + var view = splitView.createObject(testCase, {orientation:Qt.Vertical}); + verify (view !== null, "splitview created is null") + waitForRendering(view) + compare (view.orientation, Qt.Vertical) + compare (view.__items.length, 2) + compare (view.item1.x, 0) + compare (view.item1.y, 0) + compare (view.item1.width, 400) + compare (view.item1.height, 80) + compare (view.item2.x, 0) + compare (view.item2.y, view.item1.y + view.item1.height + handleHeight) + compare (view.item2.width, 400) + compare (view.item2.height, testCase.height - view.item1.height - handleHeight) + view.destroy() + } + + function test_03_orientation_change() { + var view = splitView.createObject(testCase); + verify (view !== null, "splitview created is null") + waitForRendering(view) + verify (view.orientation === Qt.Horizontal) + + view.orientation = Qt.Vertical + verify (view.orientation === Qt.Vertical) + compare (view.item1.x, 0) + compare (view.item1.y, 0) + compare (view.item1.width, 400) + compare (view.item1.height, 100) + compare (view.item2.x, 0) + // We use handleWidth rather than handleHeight, since the layout is just flipped: + compare (view.item2.y, view.item1.y + view.item1.height + handleWidth) + compare (view.item2.width, 400) + compare (view.item2.height, testCase.height - view.item1.height - handleWidth) + + view.orientation = Qt.Horizontal + verify (view.orientation === Qt.Horizontal) + compare (view.item1.x, 0) + compare (view.item1.y, 0) + compare (view.item1.width, 100) + compare (view.item1.height, 500) + compare (view.item2.x, view.item1.x + view.item1.width + handleWidth) + compare (view.item2.y, 0) + compare (view.item2.width, testCase.width - view.item1.width - handleWidth) + compare (view.item2.height, 500) + view.destroy() + } + + function test_04_hide_item() { + var view = splitView.createObject(testCase); + verify (view !== null, "splitview created is null") + waitForRendering(view) + verify (view.item1.visible) + verify (view.item2.visible) + view.item1.visible = false + verify (view.item1.visible === false) + + compare (view.item1.x, 0) + compare (view.item1.y, 0) + compare (view.item1.width, 100) + compare (view.item1.height, 500) + compare (view.item2.x, 0) + compare (view.item2.y, 0) + compare (view.item2.width, testCase.width) + compare (view.item2.height, 500) + view.destroy() + } + + function test_05_hide_fillWidth_item() { + var view = splitView.createObject(testCase); + verify (view !== null, "splitview created is null") + waitForRendering(view) + verify (view.item1.visible) + verify (view.item2.visible) + view.item2.visible = false + verify (view.item2.visible === false) + + compare (view.item1.x, 0) + compare (view.item1.y, 0) + compare (view.item1.width, 100) + compare (view.item1.height, 500) + compare (view.item2.x, view.item1.x + view.item1.width + handleWidth) + compare (view.item2.y, 0) + compare (view.item2.width, testCase.width - view.item1.width - handleWidth) + compare (view.item2.height, 500) + view.destroy() + } + + function test_hide_item_after_fillWidth() { + // QTBUG-33448 + var view = splitView_hide_item_after_fillWidth.createObject(testCase); + verify (view !== null, "splitview created is null") + waitForRendering(view) + compare (view.item3.x, view.width - view.item3.width) + view.destroy() + } + + Component { + id: item_to_add_dynamically + Rectangle { + width: 50 + height: 100 + color: "yellow" + } + } + + function test_dynamic_item_add() { + // QTBUG-35281 + var view = splitView.createObject(testCase); + verify (view !== null, "splitview created is null") + verify (view.orientation === Qt.Horizontal) + waitForRendering(view) + + var item3 = item_to_add_dynamically.createObject() + view.addItem(item3) + // reset item2 width + view.item2.width = 200 + waitForRendering(view) + + compare (view.__items.length, 3) + + compare (view.item1.x, 0) + compare (view.item1.y, 0) + compare (view.item1.width, 100) + compare (view.item1.height, 500) + + compare (view.item2.x, view.item1.x + view.item1.width + handleWidth) + compare (view.item2.y, 0) + compare (view.item2.width, 200) + compare (view.item2.height, 500) + + compare (item3.x, view.item2.x + view.item2.width + handleWidth) + compare (item3.y, 0) + compare (item3.width, testCase.width - view.item2.width - view.item1.width - (handleWidth*2)) + compare (item3.height, 500) + + view.destroy() + } + + function test_dynamic_item_add_fillWidth() { + var view = splitView.createObject(testCase); + verify (view !== null, "splitview created is null") + verify (view.orientation === Qt.Horizontal) + view.item2.Layout.fillWidth = true + waitForRendering(view) + + var item3 = item_to_add_dynamically.createObject() + view.addItem(item3) + waitForRendering(view) + + compare (view.__items.length, 3) + + compare (view.item1.x, 0) + compare (view.item1.y, 0) + compare (view.item1.width, 100) + compare (view.item1.height, 500) + + compare (view.item2.x, view.item1.x + view.item1.width + handleWidth) + compare (view.item2.y, 0) + compare (view.item2.width, testCase.width - view.item1.width - item3.width - (handleWidth*2)) + compare (view.item2.height, 500) + + compare (item3.x, view.item2.x + view.item2.width + handleWidth) + compare (item3.y, 0) + compare (item3.width, 50) + compare (item3.height, 500) + + view.destroy() + } + + Component { + id: splitViewMargins + SplitView { + anchors.fill: parent + property alias item1: item1 + property alias item2: item2 + handleDelegate: Rectangle { width: handleWidth; height: handleHeight; color: "black" } + + Rectangle { + id: item1 + width: 100 + height: 80 + color: "red" + Layout.margins: 3 + } + Rectangle { + id: item2 + width: 200 + height: 90 + color: "blue" + Layout.margins: 7 + Layout.fillWidth: true + } + } + } + + function test_item_margins() { + var view = splitViewMargins.createObject(testCase); + verify (view !== null, "splitview created is null") + verify (view.orientation === Qt.Horizontal) + compare(view.implicitWidth, 100 + 3*2 + 1 + 200 + 7*2) + waitForRendering(view) + + compare(view.item1.width, 100) + + compare(view.item2.width, testCase.width - 100 - (3*2) - handleWidth - (7*2)) + compare(view.item2.height, testCase.height - 7*2) + + view.item2.Layout.rightMargin = 0 + compare(view.item2.width, testCase.width - 100 - 3*2 - handleWidth - 7) + + view.destroy() + } +} diff --git a/tests/auto/extras/extras.pro b/tests/auto/extras/extras.pro new file mode 100644 index 00000000..29256e33 --- /dev/null +++ b/tests/auto/extras/extras.pro @@ -0,0 +1,9 @@ +TEMPLATE = app +TARGET = tst_extras +CONFIG += qmltestcase + +SOURCES += \ + $$PWD/tst_extras.cpp + +TESTDATA += \ + $$PWD/data/* diff --git a/tests/auto/extras/tst_extras.cpp b/tests/auto/extras/tst_extras.cpp new file mode 100644 index 00000000..057176d1 --- /dev/null +++ b/tests/auto/extras/tst_extras.cpp @@ -0,0 +1,38 @@ +/**************************************************************************** +** +** 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: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 <QtQuickTest/quicktest.h> +QUICK_TEST_MAIN(tst_extras) diff --git a/tests/benchmark/benchmark.pro b/tests/benchmark/benchmark.pro new file mode 100644 index 00000000..8e241044 --- /dev/null +++ b/tests/benchmark/benchmark.pro @@ -0,0 +1,3 @@ +TEMPLATE = subdirs +SUBDIRS += \ + creation diff --git a/tests/benchmark/creation/creation.pro b/tests/benchmark/creation/creation.pro new file mode 100644 index 00000000..5750cb9f --- /dev/null +++ b/tests/benchmark/creation/creation.pro @@ -0,0 +1,9 @@ +TEMPLATE = app +TARGET = tst_creation + +QT += qml testlib +CONFIG += testcase +osx:CONFIG -= app_bundle + +SOURCES += \ + tst_creation.cpp diff --git a/tests/benchmark/creation/tst_creation.cpp b/tests/benchmark/creation/tst_creation.cpp new file mode 100644 index 00000000..3fbbf3c3 --- /dev/null +++ b/tests/benchmark/creation/tst_creation.cpp @@ -0,0 +1,159 @@ +/**************************************************************************** +** +** 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: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 <QtQml> +#include <QtTest> + +//#define QT_QUICK_CONTROLS_V1 + +class tst_Creation : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + + void testControls(); + void testControls_data(); + + void testCalendar(); + void testCalendar_data(); + +private: + QQmlEngine engine; +}; + +void tst_Creation::initTestCase() +{ + engine.clearComponentCache(); +} + +void tst_Creation::testControls() +{ + QFETCH(QByteArray, control); + + QQmlComponent component(&engine); +#ifdef QT_QUICK_CONTROLS_V1 + component.setData("import QtQuick.Controls 1.3;" + control + "{}", QUrl()); +#else + component.setData("import QtQuick.Controls 2.0;" + control + "{}", QUrl()); +#endif + + QObjectList objects; + QBENCHMARK { + QObject *object = component.create(); + if (!object) + qFatal("%s", qPrintable(component.errorString())); + objects += object; + } + qDeleteAll(objects); + engine.clearComponentCache(); +} + +void tst_Creation::testControls_data() +{ + QTest::addColumn<QByteArray>("control"); + + QTest::newRow("ApplicationWindow") << QByteArray("ApplicationWindow"); + QTest::newRow("BusyIndicator") << QByteArray("BusyIndicator"); + QTest::newRow("Button") << QByteArray("Button"); + QTest::newRow("CheckBox") << QByteArray("CheckBox"); +#ifndef QT_QUICK_CONTROLS_V1 + QTest::newRow("Frame") << QByteArray("Frame"); +#endif + QTest::newRow("GroupBox") << QByteArray("GroupBox"); + QTest::newRow("Label") << QByteArray("Label"); + QTest::newRow("ProgressBar") << QByteArray("ProgressBar"); + QTest::newRow("RadioButton") << QByteArray("RadioButton"); +#ifdef QT_QUICK_CONTROLS_V1 + QTest::newRow("ScrollView") << QByteArray("ScrollView"); +#else + QTest::newRow("ScrollBar") << QByteArray("ScrollBar"); + QTest::newRow("ScrollIndicator") << QByteArray("ScrollIndicator"); +#endif + QTest::newRow("Slider") << QByteArray("Slider"); + QTest::newRow("SpinBox") << QByteArray("SpinBox"); + QTest::newRow("Switch") << QByteArray("Switch"); +#ifndef QT_QUICK_CONTROLS_V1 + QTest::newRow("TabBar") << QByteArray("TabBar"); + QTest::newRow("TabButton") << QByteArray("TabButton"); +#endif + QTest::newRow("TabView") << QByteArray("TabView"); + QTest::newRow("TextArea") << QByteArray("TextArea"); + QTest::newRow("TextField") << QByteArray("TextField"); + QTest::newRow("ToolBar") << QByteArray("ToolBar"); + QTest::newRow("ToolButton") << QByteArray("ToolButton"); +} + +void tst_Creation::testCalendar() +{ + QFETCH(QByteArray, control); + + QQmlComponent component(&engine); +#ifdef QT_QUICK_CONTROLS_V1 + component.setData("import QtQuick.Controls 1.3;" + control + "{}", QUrl()); +#else + component.setData("import QtQuick.Calendar 2.0;" + control + "{}", QUrl()); +#endif + + QObjectList objects; + QBENCHMARK { + QObject *object = component.create(); + if (!object) + qFatal("%s", qPrintable(component.errorString())); + objects += object; + } + qDeleteAll(objects); + engine.clearComponentCache(); +} + +void tst_Creation::testCalendar_data() +{ + QTest::addColumn<QByteArray>("control"); + +#ifdef QT_QUICK_CONTROLS_V1 + QTest::newRow("Calendar") << QByteArray("Calendar"); +#else + QTest::newRow("CalendarModel") << QByteArray("CalendarModel"); + QTest::newRow("CalendarView") << QByteArray("CalendarView"); + QTest::newRow("DayOfWeekRow") << QByteArray("DayOfWeekRow"); + QTest::newRow("WeekNumberColumn") << QByteArray("WeekNumberColumn"); +#endif +} + +QTEST_MAIN(tst_Creation) + +#include "tst_creation.moc" diff --git a/tests/tests.pro b/tests/tests.pro new file mode 100644 index 00000000..0fb2302b --- /dev/null +++ b/tests/tests.pro @@ -0,0 +1,4 @@ +TEMPLATE = subdirs +SUBDIRS += \ + auto \ + benchmark |