aboutsummaryrefslogtreecommitdiffstats
path: root/src/controls
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2016-03-15 15:30:56 +0100
committerJ-P Nurmi <jpnurmi@theqtcompany.com>2016-03-17 13:54:09 +0000
commit7c73d40b8215e8947b123dd006e7c62e93d396fa (patch)
tree3ecb996c74f3d57f4d50472188c7a82d41f61dce /src/controls
parentf337d1a2d836edaf8576a561d3ad901c6c152c2f (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.pri2
-rw-r--r--src/controls/qquickstyle.cpp168
-rw-r--r--src/controls/qquickstyle.h56
-rw-r--r--src/controls/qquickstyleselector.cpp79
-rw-r--r--src/controls/qquickstyleselector_p.h3
-rw-r--r--src/controls/qquickstyleselector_p_p.h3
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;
};