diff options
author | Mitch Curtis <mitch.curtis@qt.io> | 2020-09-18 18:49:39 +0200 |
---|---|---|
committer | Mitch Curtis <mitch.curtis@qt.io> | 2020-09-24 13:48:32 +0200 |
commit | 6059a7765b123a6f3fb221db9674a995bae1881c (patch) | |
tree | 695271fabb37abb29f1d497cd93e44c1d71188f8 /src/imports/controls/qtquickcontrols2plugin.cpp | |
parent | 69ecf83b2355e40210f6bd2ce892d8d829168952 (diff) |
QtQuickControls2Plugin: store style values returned from QQuickStyle API
In follow-up commits, QQuickStylePlugin will be reponsible for calling
QQuickStylePrivate::reset(), which may happen before
~QtQuickControls2Plugin is called. To avoid issues, we need to store
anything we need from QQuickStyle APIs so that we can be sure that it's
valid in QtQuickControls2Plugin::unregisterTypes().
This also avoids unnecessary calls to QQuickStyleSpec::resolve().
Change-Id: I7f659b432741b96ee58452c4867b7ecd12c6cfde
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Diffstat (limited to 'src/imports/controls/qtquickcontrols2plugin.cpp')
-rw-r--r-- | src/imports/controls/qtquickcontrols2plugin.cpp | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/src/imports/controls/qtquickcontrols2plugin.cpp b/src/imports/controls/qtquickcontrols2plugin.cpp index b089daa2..47263570 100644 --- a/src/imports/controls/qtquickcontrols2plugin.cpp +++ b/src/imports/controls/qtquickcontrols2plugin.cpp @@ -68,7 +68,14 @@ public: private: QQuickTheme *createTheme(const QString &name); - bool registeredFallbackImport = false; + // We store these because the style plugins can be unregistered before + // QtQuickControls2Plugin, and since QQuickStylePlugin calls QQuickStylePrivate::reset(), + // the style information can be lost when it comes time to call qmlUnregisterModuleImport(). + // It also avoids unnecessarily resolving the style after resetting it just to get the style + // name in unregisterTypes(). + bool customStyle = false; + QString registeredStyleUri; + QString registeredFallbackStyleUri; }; static const char *qtQuickControlsUri = "QtQuick.Controls"; @@ -125,25 +132,25 @@ void QtQuickControls2Plugin::registerTypes(const char *uri) // provides all controls. Also, if we didn't return early here, we can get an infinite import loop // when the style is set to Default. if (styleName != fallbackStyleName && styleName != QLatin1String("Default")) { - const QString fallbackstyleUri = ::fallbackStyleUri(); + registeredFallbackStyleUri = ::fallbackStyleUri(); qCDebug(lcQtQuickControlsStylePlugin) << "calling qmlRegisterModuleImport() to register fallback style with" - << "uri \"" << qtQuickControlsUri << "\" moduleMajor" << QQmlModuleImportModuleAny << "import" << fallbackstyleUri - << "importMajor" << QQmlModuleImportAuto; + << "uri \"" << qtQuickControlsUri << "\" moduleMajor" << QQmlModuleImportModuleAny + << "import" << registeredFallbackStyleUri << "importMajor" << QQmlModuleImportAuto; // The fallback style must be a built-in style, so we match the version number. - qmlRegisterModuleImport(qtQuickControlsUri, QQmlModuleImportModuleAny, fallbackstyleUri.toUtf8().constData(), + qmlRegisterModuleImport(qtQuickControlsUri, QQmlModuleImportModuleAny, registeredFallbackStyleUri.toUtf8().constData(), QQmlModuleImportAuto, QQmlModuleImportAuto); - registeredFallbackImport = true; } - const QString styleUri = ::styleUri(); // If the user imports QtQuick.Controls 2.15, and they're using the Material style, we should import version 2.15. // However, if they import QtQuick.Controls 2.15, but are using a custom style, we want to use the latest version // number of their style. - const int importMajor = !QQuickStylePrivate::isCustomStyle() ? QQmlModuleImportAuto : QQmlModuleImportLatest; + customStyle = QQuickStylePrivate::isCustomStyle(); + registeredStyleUri = ::styleUri(); + const int importMajor = !customStyle ? QQmlModuleImportAuto : QQmlModuleImportLatest; qCDebug(lcQtQuickControlsStylePlugin).nospace() << "calling qmlRegisterModuleImport() to register primary style with" - << " uri \"" << qtQuickControlsUri << "\" moduleMajor " << importMajor << " import " << styleUri - << " importMajor " << importMajor; - qmlRegisterModuleImport(qtQuickControlsUri, QQmlModuleImportModuleAny, styleUri.toUtf8().constData(), importMajor); + << " uri \"" << qtQuickControlsUri << "\" moduleMajor " << importMajor + << " import " << registeredStyleUri << " importMajor " << importMajor; + qmlRegisterModuleImport(qtQuickControlsUri, QQmlModuleImportModuleAny, registeredStyleUri.toUtf8().constData(), importMajor); const QString style = QQuickStyle::name(); if (!style.isEmpty()) @@ -154,16 +161,17 @@ void QtQuickControls2Plugin::unregisterTypes() { qCDebug(lcQtQuickControlsStylePlugin) << "unregisterTypes() called"; - if (registeredFallbackImport) { - const QString fallbackStyleUri = ::fallbackStyleUri(); - qmlUnregisterModuleImport(qtQuickControlsUri, QQmlModuleImportModuleAny, fallbackStyleUri.toUtf8().constData(), + if (!registeredFallbackStyleUri.isEmpty()) { + // We registered a fallback style, so now we need to unregister it. + qmlUnregisterModuleImport(qtQuickControlsUri, QQmlModuleImportModuleAny, registeredFallbackStyleUri.toUtf8().constData(), QQmlModuleImportAuto, QQmlModuleImportAuto); + registeredFallbackStyleUri.clear(); } - const QString primary = QQuickStylePrivate::effectiveStyleName(QQuickStyle::name()); - const QString styleUri = ::styleUri(); - const int importMajor = !QQuickStylePrivate::isCustomStyle() ? QQmlModuleImportAuto : QQmlModuleImportLatest; - qmlUnregisterModuleImport(qtQuickControlsUri, QQmlModuleImportModuleAny, styleUri.toUtf8().constData(), importMajor); + const int importMajor = !customStyle ? QQmlModuleImportAuto : QQmlModuleImportLatest; + qmlUnregisterModuleImport(qtQuickControlsUri, QQmlModuleImportModuleAny, registeredStyleUri.toUtf8().constData(), importMajor); + customStyle = false; + registeredStyleUri.clear(); QQuickThemePrivate::instance.reset(); |