From 8d33d2d7372308d0b1f4d3ab7af645ebe9677e83 Mon Sep 17 00:00:00 2001 From: David Edmundson Date: Wed, 21 Oct 2020 13:24:53 +0100 Subject: [PATCH] [kcms/activities] Port to QQuickWidget from nested QQuickWindows Nested QQuickWindows are still somewhat problematic especially when used in systemsettings which is already a very hybrid mix. At some point this will all be fully ported to QtQuick anyway, there isn't anything especially complex going on in the UI that isn't QtQuick already. This is a small backportable patch to supress the bugs. BUG: 394899 BUG: 423682 BUG: 416253 Fixed-in: 5.20.0 --- kcms/activities/ActivitiesTab.cpp | 17 ++---- kcms/activities/ActivitiesTab.h | 4 +- kcms/activities/CMakeLists.txt | 1 + kcms/activities/PrivacyTab.cpp | 16 +---- kcms/activities/imports/dialog.cpp | 9 ++- kcms/activities/ui/PrivacyTabBase.ui | 90 ++++++++++++++-------------- kcms/activities/utils.h | 57 ------------------ 7 files changed, 61 insertions(+), 133 deletions(-) delete mode 100644 kcms/activities/utils.h diff --git a/kcms/activities/ActivitiesTab.cpp b/kcms/activities/ActivitiesTab.cpp index 5123f51be..33e4cbc62 100644 --- a/kcms/activities/ActivitiesTab.cpp +++ b/kcms/activities/ActivitiesTab.cpp @@ -35,26 +35,19 @@ #include "kactivities-kcm-features.h" -#include "utils.h" - class ActivitiesTab::Private { public: - std::unique_ptr viewActivities; ExtraActivitiesInterface *extraActivitiesInterface; }; ActivitiesTab::ActivitiesTab(QWidget *parent) - : QWidget(parent) + : QQuickWidget(parent) , d() { - new QVBoxLayout(this); - - d->extraActivitiesInterface = new ExtraActivitiesInterface(this); - - d->viewActivities = createView(this); - d->viewActivities->rootContext()->setContextProperty( - QStringLiteral("kactivitiesExtras"), d->extraActivitiesInterface); - setViewSource(d->viewActivities, QStringLiteral("/qml/activitiesTab/main.qml")); + setClearColor(QGuiApplication::palette().window().color()); + setResizeMode(QQuickWidget::SizeRootObjectToView); + rootContext()->setContextProperty(QStringLiteral("kactivitiesExtras"), d->extraActivitiesInterface); + setSource(QUrl::fromLocalFile(KAMD_KCM_DATADIR + QStringLiteral("/qml/activitiesTab/main.qml"))); } ActivitiesTab::~ActivitiesTab() diff --git a/kcms/activities/ActivitiesTab.h b/kcms/activities/ActivitiesTab.h index 24162b12d..f88a7ab25 100644 --- a/kcms/activities/ActivitiesTab.h +++ b/kcms/activities/ActivitiesTab.h @@ -21,14 +21,14 @@ #ifndef ACTIVITIES_TAB_H #define ACTIVITIES_TAB_H -#include +#include #include /** * ActivitiesTab */ -class ActivitiesTab : public QWidget { +class ActivitiesTab : public QQuickWidget { Q_OBJECT public: explicit ActivitiesTab(QWidget *parent); diff --git a/kcms/activities/CMakeLists.txt b/kcms/activities/CMakeLists.txt index 70a423e27..a5d152858 100644 --- a/kcms/activities/CMakeLists.txt +++ b/kcms/activities/CMakeLists.txt @@ -56,6 +56,7 @@ add_library (kcm_activities MODULE ${KAMD_KCM_SRCS}) target_link_libraries (kcm_activities Qt5::Quick + Qt5::QuickWidgets Qt5::Core Qt5::Sql Qt5::Qml diff --git a/kcms/activities/PrivacyTab.cpp b/kcms/activities/PrivacyTab.cpp index 7f36bf817..5bc155f24 100644 --- a/kcms/activities/PrivacyTab.cpp +++ b/kcms/activities/PrivacyTab.cpp @@ -28,7 +28,7 @@ #include #include -#include +#include #include #include @@ -43,22 +43,16 @@ #include "common/dbus/common.h" -#include "utils.h" - class PrivacyTab::Private : public Ui::PrivacyTabBase { public: KActivityManagerdSettings *mainConfig; KActivityManagerdPluginsSettings *pluginConfig; BlacklistedApplicationsModel *blacklistedApplicationsModel; - QObject *viewBlacklistedApplicationsRoot; - std::unique_ptr viewBlacklistedApplications; Private(QObject *parent) : mainConfig(new KActivityManagerdSettings(parent)) , pluginConfig(new KActivityManagerdPluginsSettings(parent)) - , viewBlacklistedApplicationsRoot(nullptr) - , viewBlacklistedApplications(nullptr) { } }; @@ -104,14 +98,10 @@ PrivacyTab::PrivacyTab(QWidget *parent) connect(d->blacklistedApplicationsModel, &BlacklistedApplicationsModel::changed, this, &PrivacyTab::blackListModelChanged); connect(d->blacklistedApplicationsModel, &BlacklistedApplicationsModel::defaulted, this, &PrivacyTab::blackListModelDefaulted); - new QGridLayout(d->viewBlacklistedApplicationsContainer); - - d->viewBlacklistedApplications - = createView(d->viewBlacklistedApplicationsContainer); + d->viewBlacklistedApplications->setClearColor(QGuiApplication::palette().window().color()); d->viewBlacklistedApplications->rootContext()->setContextProperty( QStringLiteral("applicationModel"), d->blacklistedApplicationsModel); - setViewSource(d->viewBlacklistedApplications, - QStringLiteral("/qml/privacyTab/BlacklistApplicationView.qml")); + d->viewBlacklistedApplications->setSource(QUrl::fromLocalFile(KAMD_KCM_DATADIR + QStringLiteral("/qml/privacyTab/BlacklistApplicationView.qml"))); // React to changes diff --git a/kcms/activities/imports/dialog.cpp b/kcms/activities/imports/dialog.cpp index 0ef4f0115..7f36ce639 100644 --- a/kcms/activities/imports/dialog.cpp +++ b/kcms/activities/imports/dialog.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -47,7 +48,6 @@ #include "common/dbus/common.h" #include "utils/continue_with.h" #include "utils/d_ptr_implementation.h" -#include "../utils.h" class Dialog::Private { public: @@ -82,11 +82,14 @@ public: view->rootContext()->setContextProperty(QStringLiteral("dialog"), q); - if (setViewSource(view, QStringLiteral("/qml/activityDialog/") + file)) { + const QString sourceFile = QStringLiteral(KAMD_KCM_DATADIR) +"qml/activityDialog/" + file; + + if (QFile::exists(sourceFile)) { + view->setSource(QUrl::fromLocalFile(sourceFile)); tabs->addTab(view, title); } else { message->setText(i18n("Error loading the QML files. Check your installation.\nMissing %1", - QStringLiteral(KAMD_KCM_DATADIR) + QStringLiteral("/qml/activityDialog/") + file)); + sourceFile)); message->setVisible(true); } diff --git a/kcms/activities/ui/PrivacyTabBase.ui b/kcms/activities/ui/PrivacyTabBase.ui index cef3bfccd..a14bfbcc7 100644 --- a/kcms/activities/ui/PrivacyTabBase.ui +++ b/kcms/activities/ui/PrivacyTabBase.ui @@ -6,7 +6,7 @@ 0 0 - 500 + 629 500 @@ -63,33 +63,33 @@ true - - - - - For a&ll applications - - - true - - - - - - - &Do not remember - - - - - - - O&nly for specific applications: - - - - - + + + + + For a&ll applications + + + true + + + + + + + &Do not remember + + + + + + + O&nly for specific applications: + + + + + @@ -101,13 +101,22 @@ - + - + 0 0 + + + 0 + 200 + + + + QQuickWidget::SizeRootObjectToView + @@ -132,25 +141,14 @@ QFrame
kmessagewidget.h
+ + QQuickWidget + QWidget +
QtQuickWidgets/QQuickWidget
+
- - radioRememberSpecificApplications - toggled(bool) - viewBlacklistedApplicationsContainer - setEnabled(bool) - - - 352 - 167 - - - 249 - 363 - - - radioRememberSpecificApplications toggled(bool) diff --git a/kcms/activities/utils.h b/kcms/activities/utils.h deleted file mode 100644 index 13a7f0f45..000000000 --- a/kcms/activities/utils.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2015 - 2016 by Ivan Cukic - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License or (at your option) version 3 or any later version - * accepted by the membership of KDE e.V. (or its successor approved - * by the membership of KDE e.V.), which shall act as a proxy - * defined in Section 14 of version 3 of the license. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef UTILS_H -#define UTILS_H - -#include - -inline std::unique_ptr createView(QWidget *parent) -{ - auto view = new QQuickView(); - view->setColor(QGuiApplication::palette().window().color()); - view->setResizeMode(QQuickView::SizeRootObjectToView); - - auto container = QWidget::createWindowContainer(view, parent); - container->setFocusPolicy(Qt::TabFocus); - - parent->layout()->addWidget(container); - - return std::unique_ptr(view); -} - -template -inline bool setViewSource(View &view, const QString &file) -{ - QString sourceFile = QStringLiteral(KAMD_KCM_DATADIR) + file; - - if (QFile::exists(sourceFile)) { - view->setSource(QUrl::fromLocalFile(sourceFile)); - - return true; - - } else { - return false; - } - -} - -#endif // UTILS_H - -- GitLab