diff options
author | Katja Marttila <[email protected]> | 2025-05-22 11:46:16 +0300 |
---|---|---|
committer | Katja Marttila <[email protected]> | 2025-05-27 15:51:10 +0300 |
commit | f4ec5b8ef15b2574076b4f3d0dabb6e42d8bdb22 (patch) | |
tree | 316d9bc45bc861d69cbe7d5310e15af3daad8fd8 | |
parent | af6aa8d69d2633196cbe1e08b0a1709087032619 (diff) |
Introducing new invokable methods, addWizardPageWarning() and
removeWizardPageWarning() to add and remove warning messages to existing pages.
Warning messages can be added also with existing addWizardPageItem()
-function, but the new method utilizes the LabelWithPixmap -class, which
draws a warning image and a label with text wrapped.
Task-number: QTIFW-3555
Change-Id: Ie7867d369762f7616ce8c7ca47d102111d651da5
Reviewed-by: Arttu Tarkiainen <[email protected]>
-rw-r--r-- | doc/scripting-api/packagemanagercore.qdoc | 29 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 50 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.h | 4 | ||||
-rw-r--r-- | src/libs/installer/packagemanagergui.cpp | 81 | ||||
-rw-r--r-- | src/libs/installer/packagemanagergui.h | 2 |
5 files changed, 151 insertions, 15 deletions
diff --git a/doc/scripting-api/packagemanagercore.qdoc b/doc/scripting-api/packagemanagercore.qdoc index e24ee9f16..ad6fb53cd 100644 --- a/doc/scripting-api/packagemanagercore.qdoc +++ b/doc/scripting-api/packagemanagercore.qdoc @@ -557,6 +557,35 @@ */ /*! + \qmlmethod boolean installer::addWizardPageWarning(string message, + int page, string id, int position) + + Adds a warning label into the installer's GUI wizard. The label is added on + \a page ordered by \a position number. If several widgets are added to the same + page, the widget with lower \a position number will be inserted on top. The label + is identified with \a id. + + See \l{Controller Scripting} for the possible values of \a page. + + If the installation is not a command line install, returns \c true and emits the + wizardPageWarningInsertionRequested() signal. + + \sa removeWizardPageWarning(), wizardPageWarningInsertionRequested() +*/ + +/*! + \fn boolean removeWizardPageWarning(string id) + + Removes the widget with the identification \a id, previously added to the + installer's wizard by addWarningMessage(). + + If the installation is not a command line install, returns \c true and + emits the wizardPageWarningRemovalRequested() signal. + + \sa addWizardPageWarning() +*/ + +/*! \qmlmethod void installer::addUserRepositories(stringlist repositories) Registers additional \a repositories. diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 81fd8ad18..8bcbd3ba8 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -1999,6 +1999,56 @@ bool PackageManagerCore::removeWizardPageItem(Component *component, const QStrin } /*! + \fn QInstaller::PackageManagerCore::addWizardPageWarning(const QString &message, + PackageManagerCore::WizardPage page, const QString &id, int position) + + Adds a warning label into the installer's GUI wizard. The label is added on + \a page ordered by \a position number. If several widgets are added to the same + page, the widget with lower \a position number will be inserted on top. The label + is identified with \a id. + + See \l{Controller Scripting} for the possible values of \a page. + + If the installation is not a command line install, returns \c true and emits the + wizardPageWarningInsertionRequested() signal. + + \sa {installer::addWizardPageWarning}{installer.addWizardPageWarning} + \sa removeWizardPageWarning(), wizardPageWarningInsertionRequested() +*/ + +bool PackageManagerCore::addWizardPageWarning(const QString &message, PackageManagerCore::WizardPage page, const QString &id, int position) +{ + if (!isCommandLineInstance()) { + emit wizardPageWarningInsertionRequested(message, static_cast<WizardPage>(page), id, position); + return true; + } else { + qCDebug(QInstaller::lcDeveloperBuild) << "Headless installation: skip warning page item addition: " << id; + } + return false; +} + +/*! + \fn QInstaller::PackageManagerCore::removeWizardPageWarning(const QString &id) + + Removes the widget with the identification \a id, previously added to the + installer's wizard by addWizardPageWarning(). + + If the installation is not a command line install, returns \c true and + emits the wizardPageWarningRemovalRequested() signal. + + \sa {installer::removeWizardPageWarning}{installer.removeWizardPageWarning} + \sa addWizardPageWarning() +*/ +bool PackageManagerCore::removeWizardPageWarning(const QString &id) +{ + if (!isCommandLineInstance()) { + emit wizardPageWarningRemovalRequested(id); + return true; + } + return false; +} + +/*! Registers additional \a repositories. \sa {installer::addUserRepositories}{installer.addUserRepositories} diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h index f896f89d5..2c89f412a 100644 --- a/src/libs/installer/packagemanagercore.h +++ b/src/libs/installer/packagemanagercore.h @@ -365,6 +365,8 @@ public: Q_INVOKABLE bool addWizardPageItem(QInstaller::Component *component, const QString &name, int page, int position = 100); Q_INVOKABLE bool removeWizardPageItem(QInstaller::Component *component, const QString &name); + Q_INVOKABLE bool addWizardPageWarning(const QString &message, PackageManagerCore::WizardPage page, const QString &id, int position = 100); + Q_INVOKABLE bool removeWizardPageWarning(const QString &id); Q_INVOKABLE bool setDefaultPageVisible(int page, bool visible); Q_INVOKABLE void setValidatorForCustomPage(QInstaller::Component *component, const QString &name, const QString &callbackName); @@ -457,6 +459,8 @@ Q_SIGNALS: void wizardWidgetInsertionRequested(QWidget *widget, QInstaller::PackageManagerCore::WizardPage page, int position); void wizardWidgetRemovalRequested(QWidget *widget); + void wizardPageWarningInsertionRequested(const QString &message, PackageManagerCore::WizardPage page, const QString &id, int position); + void wizardPageWarningRemovalRequested(const QString &id); void wizardPageVisibilityChangeRequested(bool visible, int page); void setValidatorForCustomPageRequested(QInstaller::Component *component, const QString &name, const QString &callbackName); diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp index 0412d67ef..8b3293de1 100644 --- a/src/libs/installer/packagemanagergui.cpp +++ b/src/libs/installer/packagemanagergui.cpp @@ -44,6 +44,7 @@ #include "loggingutils.h" #include "readyforinstallationpage_p.h" #include "clickablelabel.h" +#include "labelwithpixmap.h" #include "sysinfo.h" #include "globals.h" @@ -253,6 +254,25 @@ public: m_showSettingsButton = show; } + void addAndOrderCustomWidgets(PackageManagerPage *p, QWidget *widget) + { + if (p->m_customWidgets.count() > 1 ) { + //Reorder the custom widgets based on their position + QMultiMap<int, QWidget*>::Iterator it = p->m_customWidgets.begin(); + while (it != p->m_customWidgets.end()) { + p->layout()->removeWidget(it.value()); + ++it; + } + it = p->m_customWidgets.begin(); + while (it != p->m_customWidgets.end()) { + p->layout()->addWidget(it.value()); + ++it; + } + } else { + p->layout()->addWidget(widget); + } + } + PackageManagerGui *q; int m_currentId; bool m_modified; @@ -455,6 +475,10 @@ PackageManagerGui::PackageManagerGui(PackageManagerCore *core, QWidget *parent) this, &PackageManagerGui::wizardWidgetInsertionRequested); connect(m_core, &PackageManagerCore::wizardWidgetRemovalRequested, this, &PackageManagerGui::wizardWidgetRemovalRequested); + connect(m_core, &PackageManagerCore::wizardPageWarningInsertionRequested, + this, &PackageManagerGui::wizardPageWarningInsertionRequested); + connect(m_core, &PackageManagerCore::wizardPageWarningRemovalRequested, + this, &PackageManagerGui::wizardPageWarningRemovalRequested); connect(m_core, &PackageManagerCore::wizardPageVisibilityChangeRequested, this, &PackageManagerGui::wizardPageVisibilityChangeRequested, Qt::QueuedConnection); @@ -889,21 +913,7 @@ void PackageManagerGui::wizardWidgetInsertionRequested(QWidget *widget, if (PackageManagerPage *p = qobject_cast<PackageManagerPage *>(QWizard::page(page))) { p->m_customWidgets.insert(position, widget); - if (p->m_customWidgets.count() > 1 ) { - //Reorder the custom widgets based on their position - QMultiMap<int, QWidget*>::Iterator it = p->m_customWidgets.begin(); - while (it != p->m_customWidgets.end()) { - p->layout()->removeWidget(it.value()); - ++it; - } - it = p->m_customWidgets.begin(); - while (it != p->m_customWidgets.end()) { - p->layout()->addWidget(it.value()); - ++it; - } - } else { - p->layout()->addWidget(widget); - } + d->addAndOrderCustomWidgets(p, widget); packageManagerCore()->controlScriptEngine()->addToGlobalObject(p); packageManagerCore()->componentScriptEngine()->addToGlobalObject(p); } @@ -927,6 +937,47 @@ void PackageManagerGui::wizardWidgetRemovalRequested(QWidget *widget) } /*! + Requests the insertion of warning label on \a page. Warning label consists of a warning + image and \a message. Widget with lower \a position number will be inserted on top. + Warning label is identified with \a id. +*/ +void PackageManagerGui::wizardPageWarningInsertionRequested(const QString &message, PackageManagerCore::WizardPage page, const QString &id, int position) +{ + // Check if the warning is already added + if (findChild<LabelWithPixmap* >(QLatin1String("LabelWithPixmap_") + id)) { + qCDebug(QInstaller::lcDeveloperBuild) << "Warning label with id " << id << "already added"; + return; + } + + if (PackageManagerPage *p = qobject_cast<PackageManagerPage *>(QWizard::page(page))) { + LabelWithPixmap *warningLabel = new LabelWithPixmap(message, QLatin1String(":/warning.png")); + warningLabel->setObjectName(QLatin1String("LabelWithPixmap_") + id); + p->m_customWidgets.insert(position, warningLabel); + d->addAndOrderCustomWidgets(p, warningLabel); + packageManagerCore()->controlScriptEngine()->addToGlobalObject(warningLabel); + packageManagerCore()->componentScriptEngine()->addToGlobalObject(warningLabel); + } +} + +/*! + Requests the removal of the warning label, identified with \a id, from installer page. +*/ +void PackageManagerGui::wizardPageWarningRemovalRequested(const QString &id) +{ + LabelWithPixmap *warningLabel = findChild<LabelWithPixmap* >(QLatin1String("LabelWithPixmap_") + id); + if (!warningLabel) + return; + const QList<int> pages = pageIds(); + for (const int id : pages) { + PackageManagerPage *managerPage = qobject_cast<PackageManagerPage *>(page(id)); + managerPage->removeCustomWidget(warningLabel); + } + warningLabel->setParent(nullptr); + packageManagerCore()->controlScriptEngine()->removeFromGlobalObject(warningLabel); + packageManagerCore()->componentScriptEngine()->removeFromGlobalObject(warningLabel); +} + +/*! Requests changing the visibility of the page specified by \a p to \a visible. */ diff --git a/src/libs/installer/packagemanagergui.h b/src/libs/installer/packagemanagergui.h index 95ec6cb2e..397cfefe5 100644 --- a/src/libs/installer/packagemanagergui.h +++ b/src/libs/installer/packagemanagergui.h @@ -122,6 +122,8 @@ protected Q_SLOTS: void wizardWidgetInsertionRequested(QWidget *widget, QInstaller::PackageManagerCore::WizardPage page, int position); void wizardWidgetRemovalRequested(QWidget *widget); + void wizardPageWarningInsertionRequested(const QString &message, PackageManagerCore::WizardPage page, const QString &id, int position); + void wizardPageWarningRemovalRequested(const QString &id); void wizardPageVisibilityChangeRequested(bool visible, int page); void setValidatorForCustomPageRequested(QInstaller::Component *component, const QString &name, const QString &callbackName); |