diff options
Diffstat (limited to 'src/quickcontrols2/qquickstyle.cpp')
-rw-r--r-- | src/quickcontrols2/qquickstyle.cpp | 59 |
1 files changed, 39 insertions, 20 deletions
diff --git a/src/quickcontrols2/qquickstyle.cpp b/src/quickcontrols2/qquickstyle.cpp index f432eded..ca5beafe 100644 --- a/src/quickcontrols2/qquickstyle.cpp +++ b/src/quickcontrols2/qquickstyle.cpp @@ -35,6 +35,7 @@ ****************************************************************************/ #include "qquickstyle.h" +#include "qquickstyle_p.h" #include "qquickstyleattached_p.h" #include <QtCore/qdir.h> @@ -88,8 +89,6 @@ struct QQuickStyleSpec QString name() { - if (!resolved) - resolve(); return style.mid(style.lastIndexOf(QLatin1Char('/')) + 1); } @@ -110,7 +109,25 @@ struct QQuickStyleSpec resolve(); } - void resolve() + static QString findStyle(const QString &path, const QString &name) + { + QDir dir(path); + if (!dir.exists()) + return QString(); + + if (name.isEmpty()) + return dir.absolutePath() + QLatin1Char('/'); + + const QStringList entries = dir.entryList(QStringList(), QDir::Dirs | QDir::NoDotAndDotDot); + for (const QString &entry : entries) { + if (entry.compare(name, Qt::CaseInsensitive) == 0) + return dir.absoluteFilePath(entry); + } + + return QString(); + } + + void resolve(const QUrl &baseUrl = QUrl()) { if (style.isEmpty()) style = QGuiApplicationPrivate::styleOverride; @@ -122,30 +139,27 @@ struct QQuickStyleSpec style = settings->value(QStringLiteral("Style")).toString(); } + if (baseUrl.isValid()) { + QString path = QQmlFile::urlToLocalFileOrQrc(baseUrl); + QString stylePath = findStyle(path, style); + if (!stylePath.isEmpty()) { + style = stylePath; + resolved = true; + } + } + if (QGuiApplication::instance()) { if (!style.contains(QLatin1Char('/'))) { const QString targetPath = QStringLiteral("QtQuick/Controls.2"); const QStringList importPaths = QQmlEngine().importPathList(); for (const QString &importPath : importPaths) { - QDir importDir(importPath); - if (importDir.cd(targetPath)) { - if (style.isEmpty()) { - style = importDir.absolutePath() + QLatin1Char('/'); - resolved = true; - break; - } - 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) + QString stylePath = findStyle(importPath + QLatin1Char('/') + targetPath, style); + if (!stylePath.isEmpty()) { + style = stylePath; + resolved = true; break; + } } } resolved = true; @@ -158,6 +172,11 @@ struct QQuickStyleSpec Q_GLOBAL_STATIC(QQuickStyleSpec, styleSpec) +void QQuickStylePrivate::init(const QUrl &baseUrl) +{ + styleSpec()->resolve(baseUrl); +} + /*! Returns the name of the application style. |