diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-04-22 10:31:19 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2016-04-23 12:37:46 +0000 |
commit | 8e066180fd5668c3459038edc192290f3002706a (patch) | |
tree | 25b711eb064891387d9be789d30cddaa78ae14a8 | |
parent | caa42afa5d4d9188a66b7c4d004f29eb4eb0fb04 (diff) |
Implement case-insensitive style name lookup
Fixes the issue that "./app -style material" did no longer work,
but the case had to match exactly (./app -style Material).
Change-Id: I446654110af670c391f8e304ce8008fbd6e9acaa
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | src/quickcontrols2/qquickstyle.cpp | 56 | ||||
-rw-r--r-- | tests/auto/auto.pro | 1 | ||||
-rw-r--r-- | tests/auto/qquickstyle/qquickstyle.pro | 7 | ||||
-rw-r--r-- | tests/auto/qquickstyle/tst_qquickstyle.cpp | 72 |
5 files changed, 134 insertions, 3 deletions
@@ -22,6 +22,7 @@ /tests/auto/menu/tst_menu /tests/auto/popup/tst_popup /tests/auto/pressandhold/tst_pressandhold +/tests/auto/qquickstyle/tst_qquickstyle /tests/auto/sanity/tst_sanity /tests/auto/snippets/tst_snippets /tests/auto/styles/tst_styles diff --git a/src/quickcontrols2/qquickstyle.cpp b/src/quickcontrols2/qquickstyle.cpp index d4c22f84..6dcf9328 100644 --- a/src/quickcontrols2/qquickstyle.cpp +++ b/src/quickcontrols2/qquickstyle.cpp @@ -37,9 +37,11 @@ #include "qquickstyle.h" #include "qquickstyleattached_p.h" +#include <QtCore/qdir.h> #include <QtCore/qsettings.h> #include <QtGui/private/qguiapplication_p.h> #include <QtQml/private/qqmlmetatype_p.h> +#include <QtQml/qqmlengine.h> #include <QtQml/qqmlfile.h> QT_BEGIN_NAMESPACE @@ -102,12 +104,14 @@ struct QQuickStyleSpec void setStyle(const QString &s) { style = s; - resolved = !s.isEmpty(); + resolved = false; + resolve(); } void resolve() { - style = QGuiApplicationPrivate::styleOverride; + if (style.isEmpty()) + style = QGuiApplicationPrivate::styleOverride; if (style.isEmpty()) style = QString::fromLatin1(qgetenv("QT_QUICK_CONTROLS_STYLE")); if (style.isEmpty()) { @@ -115,7 +119,53 @@ struct QQuickStyleSpec if (settings) style = settings->value(QStringLiteral("Style")).toString(); } - resolved = QGuiApplication::instance(); + + if (QGuiApplication::instance()) { + if (!style.contains(QLatin1Char('/'))) { + const QString targetPath = QStringLiteral("QtQuick/Controls.2"); + const QStringList importPaths = QQmlEngine().importPathList(); + + // do a case-sensitive lookup first... + for (const QString &importPath : importPaths) { + QDir importDir(importPath); + if (importDir.cd(targetPath)) { + if (style.isEmpty()) { + style = importDir.absolutePath() + QLatin1Char('/'); + resolved = true; + break; + } +#ifndef Q_OS_WIN + // only on case-sensitive file systems + else if (importDir.exists(style)) { + style = importDir.absoluteFilePath(style); + resolved = true; + break; + } +#endif // Q_OS_WIN + } + } + + // ... and fallback to a case-insensitive lookup + if (!resolved) { + for (const QString &importPath : importPaths) { + QDir importDir(importPath); + if (importDir.cd(targetPath)) { + const QStringList entries = importDir.entryList(QStringList(), QDir::Dirs | QDir::NoDotAndDotDot); + for (const QString &entry : entries) { + if (entry.compare(style, Qt::CaseInsensitive) == 0) { + style = importDir.absoluteFilePath(entry); + resolved = true; + break; + } + } + } + if (resolved) + break; + } + } + } + resolved = true; + } } bool resolved; diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index 569ca811..e370ed68 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -9,6 +9,7 @@ SUBDIRS += \ menu \ popup \ pressandhold \ + qquickstyle \ sanity \ snippets \ styles \ diff --git a/tests/auto/qquickstyle/qquickstyle.pro b/tests/auto/qquickstyle/qquickstyle.pro new file mode 100644 index 00000000..b6173c1b --- /dev/null +++ b/tests/auto/qquickstyle/qquickstyle.pro @@ -0,0 +1,7 @@ +CONFIG += testcase +TARGET = tst_qquickstyle +SOURCES += tst_qquickstyle.cpp + +osx:CONFIG -= app_bundle + +QT += quickcontrols2 testlib diff --git a/tests/auto/qquickstyle/tst_qquickstyle.cpp b/tests/auto/qquickstyle/tst_qquickstyle.cpp new file mode 100644 index 00000000..b4da3045 --- /dev/null +++ b/tests/auto/qquickstyle/tst_qquickstyle.cpp @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2016 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 <QtTest/qtest.h> +#include <QtQml/qqmlengine.h> +#include <QtQml/qqmlcomponent.h> +#include <QtQuickControls2/qquickstyle.h> + +class tst_QQuickStyle : public QObject +{ + Q_OBJECT + +private slots: + void lookup(); +}; + +void tst_QQuickStyle::lookup() +{ + QVERIFY(QQuickStyle::name().isEmpty()); + QVERIFY(!QQuickStyle::path().isEmpty()); + + QQuickStyle::setStyle("material"); + QCOMPARE(QQuickStyle::name(), QString("Material")); + QVERIFY(!QQuickStyle::path().isEmpty()); + + QQmlEngine engine; + QQmlComponent component(&engine); + component.setData("import QtQuick 2.0; import QtQuick.Controls 2.0; Control { }", QUrl()); + + QScopedPointer<QObject> object(component.create()); + QVERIFY(!object.isNull()); + + QCOMPARE(QQuickStyle::name(), QString("Material")); + QVERIFY(!QQuickStyle::path().isEmpty()); +} + +QTEST_MAIN(tst_QQuickStyle) + +#include "tst_qquickstyle.moc" |