diff options
author | Eike Ziller <eike.ziller@qt.io> | 2020-06-03 15:56:43 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2020-06-05 06:15:15 +0000 |
commit | 461319954882f25743a78e747cfb27805726aa20 (patch) | |
tree | 46d1c0228bd917dc96862a1f54b6c33cefa44875 /src/plugins/coreplugin/plugindialog.cpp | |
parent | 65ced9733bd0520695286dc99230e6cdebfe75cc (diff) |
Extract plugin install wizard
It will become more complicated, so pull it into its own files.
Change-Id: If362f0775cc9d97a3c715c046d32d6a20c30a1f9
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
Diffstat (limited to 'src/plugins/coreplugin/plugindialog.cpp')
-rw-r--r-- | src/plugins/coreplugin/plugindialog.cpp | 220 |
1 files changed, 3 insertions, 217 deletions
diff --git a/src/plugins/coreplugin/plugindialog.cpp b/src/plugins/coreplugin/plugindialog.cpp index 03c840eccc..d86930cd65 100644 --- a/src/plugins/coreplugin/plugindialog.cpp +++ b/src/plugins/coreplugin/plugindialog.cpp @@ -28,6 +28,7 @@ #include "icore.h" #include "dialogs/restartdialog.h" +#include "plugininstallwizard.h" #include <app/app_version.h> @@ -37,24 +38,15 @@ #include <extensionsystem/pluginspec.h> #include <extensionsystem/pluginview.h> -#include <utils/archive.h> #include <utils/fancylineedit.h> -#include <utils/infolabel.h> -#include <utils/pathchooser.h> -#include <utils/wizard.h> -#include <utils/wizardpage.h> -#include <QButtonGroup> #include <QCheckBox> #include <QDebug> #include <QDialog> #include <QDialogButtonBox> -#include <QDir> -#include <QFileInfo> #include <QHBoxLayout> #include <QLabel> #include <QPushButton> -#include <QRadioButton> #include <QVBoxLayout> using namespace Utils; @@ -64,163 +56,6 @@ namespace Internal { static bool s_isRestartRequired = false; -const char kPath[] = "Path"; -const char kApplicationInstall[] = "ApplicationInstall"; - -static bool hasLibSuffix(const FilePath &path) -{ - return (HostOsInfo().isWindowsHost() && path.endsWith(".dll")) - || (HostOsInfo().isLinuxHost() && path.toFileInfo().completeSuffix().startsWith(".so")) - || (HostOsInfo().isMacHost() && path.endsWith(".dylib")); -} - -class SourcePage : public WizardPage -{ -public: - SourcePage(QWidget *parent) - : WizardPage(parent) - { - setTitle(PluginDialog::tr("Source")); - auto vlayout = new QVBoxLayout; - setLayout(vlayout); - - auto label = new QLabel( - "<p>" - + PluginDialog::tr( - "Choose source location. This can be a plugin library file or a zip file.") - + "</p>"); - label->setWordWrap(true); - vlayout->addWidget(label); - - auto path = new PathChooser; - path->setExpectedKind(PathChooser::Any); - vlayout->addWidget(path); - registerFieldWithName(kPath, path, "path", SIGNAL(pathChanged(QString))); - connect(path, &PathChooser::pathChanged, this, &SourcePage::updateWarnings); - - m_info = new InfoLabel; - m_info->setType(InfoLabel::Error); - m_info->setVisible(false); - vlayout->addWidget(m_info); - } - - void updateWarnings() - { - m_info->setVisible(!isComplete()); - emit completeChanged(); - } - - bool isComplete() const - { - const auto path = FilePath::fromVariant(field(kPath)); - if (!QFile::exists(path.toString())) { - m_info->setText(PluginDialog::tr("File does not exist.")); - return false; - } - if (hasLibSuffix(path)) - return true; - - QString error; - if (!Archive::supportsFile(path, &error)) { - m_info->setText(error); - return false; - } - return true; - } - - InfoLabel *m_info = nullptr; -}; - -class InstallLocationPage : public WizardPage -{ -public: - InstallLocationPage(QWidget *parent) - : WizardPage(parent) - { - setTitle(PluginDialog::tr("Install Location")); - auto vlayout = new QVBoxLayout; - setLayout(vlayout); - - auto label = new QLabel("<p>" + PluginDialog::tr("Choose install location.") + "</p>"); - label->setWordWrap(true); - vlayout->addWidget(label); - vlayout->addSpacing(10); - - auto localInstall = new QRadioButton(PluginDialog::tr("User plugins")); - localInstall->setChecked(true); - auto localLabel = new QLabel( - PluginDialog::tr("The plugin will be available to all compatible %1 " - "installations, but only for the current user.") - .arg(Constants::IDE_DISPLAY_NAME)); - localLabel->setWordWrap(true); - localLabel->setAttribute(Qt::WA_MacSmallSize, true); - - vlayout->addWidget(localInstall); - vlayout->addWidget(localLabel); - vlayout->addSpacing(10); - - auto appInstall = new QRadioButton( - PluginDialog::tr("%1 installation").arg(Constants::IDE_DISPLAY_NAME)); - auto appLabel = new QLabel( - PluginDialog::tr("The plugin will be available only to this %1 " - "installation, but for all users that can access it.") - .arg(Constants::IDE_DISPLAY_NAME)); - appLabel->setWordWrap(true); - appLabel->setAttribute(Qt::WA_MacSmallSize, true); - vlayout->addWidget(appInstall); - vlayout->addWidget(appLabel); - - auto group = new QButtonGroup(this); - group->addButton(localInstall); - group->addButton(appInstall); - - registerFieldWithName(kApplicationInstall, this); - setField(kApplicationInstall, false); - connect(appInstall, &QRadioButton::toggled, this, [this](bool toggled) { - setField(kApplicationInstall, toggled); - }); - } -}; - -static FilePath pluginInstallPath(QWizard *wizard) -{ - return FilePath::fromString(wizard->field(kApplicationInstall).toBool() - ? ICore::pluginPath() - : ICore::userPluginPath()); -} - -static FilePath pluginFilePath(QWizard *wizard) -{ - return FilePath::fromVariant(wizard->field(kPath)); -} - -class SummaryPage : public WizardPage -{ -public: - SummaryPage(QWidget *parent) - : WizardPage(parent) - { - setTitle(PluginDialog::tr("Summary")); - - auto vlayout = new QVBoxLayout; - setLayout(vlayout); - - m_summaryLabel = new QLabel(this); - m_summaryLabel->setWordWrap(true); - vlayout->addWidget(m_summaryLabel); - } - - void initializePage() - { - m_summaryLabel->setText(PluginDialog::tr("\"%1\" will be installed into \"%2\".") - .arg(pluginFilePath(wizard()).toUserOutput(), - pluginInstallPath(wizard()).toUserOutput())); - } - -private: - QLabel *m_summaryLabel; -}; - PluginDialog::PluginDialog(QWidget *parent) : QDialog(parent), m_view(new ExtensionSystem::PluginView(this)) @@ -298,59 +133,10 @@ void PluginDialog::closeDialog() accept(); } -static bool copyPluginFile(const FilePath &src, const FilePath &dest) -{ - const FilePath destFile = dest.pathAppended(src.fileName()); - if (QFile::exists(destFile.toString())) { - QMessageBox box(QMessageBox::Question, - PluginDialog::tr("Overwrite File"), - PluginDialog::tr("The file \"%1\" exists. Overwrite?") - .arg(destFile.toUserOutput()), - QMessageBox::Cancel, - ICore::dialogParent()); - QPushButton *acceptButton = box.addButton(PluginDialog::tr("Overwrite"), QMessageBox::AcceptRole); - box.setDefaultButton(acceptButton); - box.exec(); - if (box.clickedButton() != acceptButton) - return false; - QFile::remove(destFile.toString()); - } - QDir(dest.toString()).mkpath("."); - if (!QFile::copy(src.toString(), destFile.toString())) { - QMessageBox::warning(ICore::dialogParent(), - PluginDialog::tr("Failed to Write File"), - PluginDialog::tr("Failed to write file \"%1\".") - .arg(destFile.toUserOutput())); - return false; - } - return true; -} - void PluginDialog::showInstallWizard() { - Wizard wizard(ICore::dialogParent()); - wizard.setWindowTitle(tr("Install Plugin")); - - auto filePage = new SourcePage(&wizard); - wizard.addPage(filePage); - - auto installLocationPage = new InstallLocationPage(&wizard); - wizard.addPage(installLocationPage); - - auto summaryPage = new SummaryPage(&wizard); - wizard.addPage(summaryPage); - - if (wizard.exec()) { - const FilePath path = pluginFilePath(&wizard); - const FilePath installPath = pluginInstallPath(&wizard); - if (hasLibSuffix(path)) { - if (copyPluginFile(path, installPath)) - updateRestartRequired(); - } else if (Archive::supportsFile(path)) { - if (Archive::unarchive(path, installPath, ICore::dialogParent())) - updateRestartRequired(); - } - } + if (PluginInstallWizard::exec()) + updateRestartRequired(); } void PluginDialog::updateRestartRequired() |