diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-03-15 15:30:56 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-03-17 13:54:09 +0000 |
commit | 7c73d40b8215e8947b123dd006e7c62e93d396fa (patch) | |
tree | 3ecb996c74f3d57f4d50472188c7a82d41f61dce /src/controls | |
parent | f337d1a2d836edaf8576a561d3ad901c6c152c2f (diff) |
Add public API for setting and getting the style from C++
TODO: setup QtLabsControls C++ module docs
Task-number: QTBUG-50787
Change-Id: I382bad34df88d13fb9a74b3d2f9203280dfb4a66
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
Diffstat (limited to 'src/controls')
-rw-r--r-- | src/controls/controls.pri | 2 | ||||
-rw-r--r-- | src/controls/qquickstyle.cpp | 168 | ||||
-rw-r--r-- | src/controls/qquickstyle.h | 56 | ||||
-rw-r--r-- | src/controls/qquickstyleselector.cpp | 79 | ||||
-rw-r--r-- | src/controls/qquickstyleselector_p.h | 3 | ||||
-rw-r--r-- | src/controls/qquickstyleselector_p_p.h | 3 |
6 files changed, 264 insertions, 47 deletions
diff --git a/src/controls/controls.pri b/src/controls/controls.pri index dcc40024..a0c82fce 100644 --- a/src/controls/controls.pri +++ b/src/controls/controls.pri @@ -1,6 +1,7 @@ HEADERS += \ $$PWD/qquickcolorimageprovider_p.h \ $$PWD/qquickproxytheme_p.h \ + $$PWD/qquickstyle.h \ $$PWD/qquickstyleattached_p.h \ $$PWD/qquickstyleselector_p.h \ $$PWD/qquickstyleselector_p_p.h \ @@ -9,6 +10,7 @@ HEADERS += \ SOURCES += \ $$PWD/qquickcolorimageprovider.cpp \ $$PWD/qquickproxytheme.cpp \ + $$PWD/qquickstyle.cpp \ $$PWD/qquickstyleattached.cpp \ $$PWD/qquickstyleselector.cpp \ $$PWD/qquickpaddedrectangle.cpp diff --git a/src/controls/qquickstyle.cpp b/src/controls/qquickstyle.cpp new file mode 100644 index 00000000..e6be5efd --- /dev/null +++ b/src/controls/qquickstyle.cpp @@ -0,0 +1,168 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs 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.h" +#include "qquickstyleattached_p.h" + +#include <QtCore/qsettings.h> +#include <QtGui/private/qguiapplication_p.h> +#include <QtQml/private/qqmlmetatype_p.h> +#include <QtQml/qqmlfile.h> + +QT_BEGIN_NAMESPACE + +/*! + \class QQuickStyle + \brief The QQQuickStyle class allows configuring the application style. + \inmodule QtLabsControls + + QQuickStyle provides API for querying and configuring the application + \l {Styling Qt Labs Controls}{styles} of Qt Labs Controls. + + \code + #include <QGuiApplication> + #include <QQmlApplicationEngine> + #include <QQuickStyle> + + int main(int argc, char *argv[]) + { + QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QGuiApplication app(argc, argv); + + QQuickStyle::setStyle("Material"); + + QQmlApplicationEngine engine; + engine.load(QUrl("qrc:/main.qml")); + + return app.exec(); + } + \endcode + + \note The style must be configured \b before loading QML that imports + Qt Labs Controls. It is not possible to change the style after the QML + types have been registered. + + \sa {Styling Qt Labs Controls} +*/ + +struct QQuickStyleSpec +{ + QQuickStyleSpec() : resolved(false) { } + + QString name() + { + if (!resolved) + resolve(); + return style.mid(style.lastIndexOf(QLatin1Char('/')) + 1); + } + + QString path() + { + if (!resolved) + resolve(); + QString s = style; + if (QQmlFile::isLocalFile(s)) + s = QQmlFile::urlToLocalFileOrQrc(s); + return s.left(s.lastIndexOf(QLatin1Char('/')) + 1); + } + + void setStyle(const QString &s) + { + style = s; + resolved = !s.isEmpty(); + } + + void resolve() + { + style = QGuiApplicationPrivate::styleOverride; + if (style.isEmpty()) + style = QString::fromLatin1(qgetenv("QT_LABS_CONTROLS_STYLE")); + if (style.isEmpty()) { + QSharedPointer<QSettings> settings = QQuickStyleAttached::settings(QStringLiteral("Controls")); + if (settings) + style = settings->value(QStringLiteral("Style")).toString(); + } + resolved = QGuiApplication::instance(); + } + + bool resolved; + QString style; +}; + +Q_GLOBAL_STATIC(QQuickStyleSpec, styleSpec) + +/*! + Returns the name of the application style. + + \note The application style can be specified by passing a \c -style command + line argument. Therefore \c name() may not return a fully resolved + value if called before constructing a QGuiApplication. +*/ +QString QQuickStyle::name() +{ + return styleSpec()->name(); +} + +/*! + Returns the path of an overridden application style, or an empty + string if the style is one of the built-in Qt Labs Controls styles. + + \note The application style can be specified by passing a \c -style command + line argument. Therefore \c path() may not return a fully resolved + value if called before constructing a QGuiApplication. +*/ +QString QQuickStyle::path() +{ + return styleSpec()->path(); +} + +/*! + Sets the application style. + + \note The style must be configured \b before loading QML that imports Qt Labs Controls. + It is not possible to change the style after the QML types have been registered. +*/ +void QQuickStyle::setStyle(const QString &style) +{ + if (QQmlMetaType::isModule(QStringLiteral("Qt.labs.controls"), 1, 0)) { + qWarning() << "ERROR: QQuickStyle::setStyle() must be called before loading QML that imports Qt Labs Controls."; + return; + } + + styleSpec()->setStyle(style); +} + +QT_END_NAMESPACE diff --git a/src/controls/qquickstyle.h b/src/controls/qquickstyle.h new file mode 100644 index 00000000..062b7fbb --- /dev/null +++ b/src/controls/qquickstyle.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the Qt Labs 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_H +#define QQUICKSTYLE_H + +#include <QtCore/qurl.h> +#include <QtCore/qstring.h> +#include <QtLabsControls/qtlabscontrolsglobal.h> + +QT_BEGIN_NAMESPACE + +class Q_LABSCONTROLS_EXPORT QQuickStyle +{ +public: + static QString name(); + static QString path(); + static void setStyle(const QString &style); +}; + +QT_END_NAMESPACE + +#endif // QQUICKSTYLE_H diff --git a/src/controls/qquickstyleselector.cpp b/src/controls/qquickstyleselector.cpp index 792812cf..a9778b07 100644 --- a/src/controls/qquickstyleselector.cpp +++ b/src/controls/qquickstyleselector.cpp @@ -34,6 +34,7 @@ #include "qquickstyleselector_p.h" #include "qquickstyleselector_p_p.h" +#include "qquickstyle.h" #include <QtCore/QDir> #include <QtCore/QMutex> @@ -45,7 +46,6 @@ #include <QtCore/QSettings> #include <QtGui/private/qguiapplication_p.h> -#include <QtLabsControls/private/qquickstyleattached_p.h> QT_BEGIN_NAMESPACE @@ -58,15 +58,6 @@ QQuickStyleSelectorPrivate::QQuickStyleSelectorPrivate() QQuickStyleSelector::QQuickStyleSelector() : d_ptr(new QQuickStyleSelectorPrivate) { - Q_D(QQuickStyleSelector); - d->style = QGuiApplicationPrivate::styleOverride.toLower(); - if (d->style.isEmpty()) - d->style = QString::fromLatin1(qgetenv("QT_LABS_CONTROLS_STYLE")).toLower(); - if (d->style.isEmpty()) { - QSharedPointer<QSettings> settings = QQuickStyleAttached::settings(QStringLiteral("Controls")); - if (settings) - d->style = settings->value(QStringLiteral("Style")).toString().toLower(); - } } QQuickStyleSelector::~QQuickStyleSelector() @@ -82,22 +73,6 @@ static bool isLocalScheme(const QString &file) return local; } -QString QQuickStyleSelector::select(const QString &fileName) const -{ - Q_D(const QQuickStyleSelector); - QUrl url(d->baseUrl.toString() + QLatin1Char('/') + fileName); - if (isLocalScheme(url.scheme()) || url.isLocalFile()) { - if (isLocalScheme(url.scheme())) { - QString equivalentPath = QLatin1Char(':') + url.path(); - QString selectedPath = d->select(equivalentPath); - url.setPath(selectedPath.remove(0, 1)); - } else { - url = QUrl::fromLocalFile(d->select(url.toLocalFile())); - } - } - return url.toString(); -} - static QString selectionHelper(const QString &path, const QString &fileName, const QStringList &selectors) { /* selectionHelper does a depth-first search of possible selected files. Because there is strict @@ -124,6 +99,35 @@ static QString selectionHelper(const QString &path, const QString &fileName, con return path + fileName; } +QString QQuickStyleSelector::select(const QString &fileName) const +{ + Q_D(const QQuickStyleSelector); + const QString overridePath = QQuickStyle::path(); + if (!overridePath.isEmpty()) { + const QString stylePath = overridePath + QQuickStyle::name() + QLatin1Char('/'); + if (QFile::exists(stylePath + fileName)) { + // the style name is included to the path, so exclude it from the selectors. + // the rest of the selectors (os, locale) are still valid, though. + const QString selectedPath = selectionHelper(stylePath, fileName, d->allSelectors(false)); + if (selectedPath.startsWith(QLatin1Char(':'))) + return QLatin1String("qrc") + selectedPath; + return QUrl::fromLocalFile(selectedPath).toString(); + } + } + + QUrl url(d->baseUrl.toString() + QLatin1Char('/') + fileName); + if (isLocalScheme(url.scheme()) || url.isLocalFile()) { + if (isLocalScheme(url.scheme())) { + QString equivalentPath = QLatin1Char(':') + url.path(); + QString selectedPath = d->select(equivalentPath); + url.setPath(selectedPath.remove(0, 1)); + } else { + url = QUrl::fromLocalFile(d->select(url.toLocalFile())); + } + } + return url.toString(); +} + QString QQuickStyleSelectorPrivate::select(const QString &filePath) const { QFileInfo fi(filePath); @@ -132,32 +136,23 @@ QString QQuickStyleSelectorPrivate::select(const QString &filePath) const return filePath; QString ret = selectionHelper(fi.path().isEmpty() ? QString() : fi.path() + QLatin1Char('/'), - fi.fileName(), allSelectors()); + fi.fileName(), allSelectors(true)); if (!ret.isEmpty()) return ret; return filePath; } -QString QQuickStyleSelector::style() const -{ - Q_D(const QQuickStyleSelector); - return d->style; -} - -void QQuickStyleSelector::setStyle(const QString &s) -{ - Q_D(QQuickStyleSelector); - d->style = s; -} - -QStringList QQuickStyleSelectorPrivate::allSelectors() const +QStringList QQuickStyleSelectorPrivate::allSelectors(bool includeStyle) const { QMutexLocker locker(&sharedDataMutex); updateSelectors(); QStringList selectors = sharedData->staticSelectors; - if (!style.isEmpty()) - selectors.prepend(style); + if (includeStyle) { + QString style = QQuickStyle::name(); + if (!style.isEmpty()) + selectors.prepend(style.toLower()); + } return selectors; } diff --git a/src/controls/qquickstyleselector_p.h b/src/controls/qquickstyleselector_p.h index d972dd95..56a3b386 100644 --- a/src/controls/qquickstyleselector_p.h +++ b/src/controls/qquickstyleselector_p.h @@ -62,9 +62,6 @@ public: QString select(const QString &fileName) const; - QString style() const; - void setStyle(const QString &s); - void setBaseUrl(const QUrl &base); QUrl baseUrl() const; diff --git a/src/controls/qquickstyleselector_p_p.h b/src/controls/qquickstyleselector_p_p.h index e4df1035..dc91af5f 100644 --- a/src/controls/qquickstyleselector_p_p.h +++ b/src/controls/qquickstyleselector_p_p.h @@ -69,9 +69,8 @@ public: static void addStatics(const QStringList &); //For loading GUI statics from other Qt modules QQuickStyleSelectorPrivate(); QString select(const QString &filePath) const; - QStringList allSelectors() const; + QStringList allSelectors(bool includeStyle) const; - QString style; QUrl baseUrl; }; |