diff --git a/src/plugins/studiowelcome/examplecheckout.cpp b/src/plugins/studiowelcome/examplecheckout.cpp index 377d0f4cb7f..7bfcc1902ac 100644 --- a/src/plugins/studiowelcome/examplecheckout.cpp +++ b/src/plugins/studiowelcome/examplecheckout.cpp @@ -28,11 +28,19 @@ #include #include +#include #include #include #include +#include +#include + +#include + +#include + #include #include #include @@ -229,12 +237,9 @@ FileExtractor::FileExtractor(QObject *parent) : QObject(parent) { m_targetPath = Utils::FilePath::fromString( - QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)); - - if (!m_targetPath.isEmpty()) - m_targetPath = m_targetPath.pathAppended("QtDesignStudio"); - else - m_targetPath = "/temp/"; + Core::ICore::settings() + ->value(StudioWelcome::Internal::EXAMPLES_DOWNLOAD_PATH) + .toString()); m_timer.setInterval(100); m_timer.setSingleShot(false); @@ -247,6 +252,32 @@ FileExtractor::FileExtractor(QObject *parent) emit birthTimeChanged(); }); + + const ExtensionSystem::PluginSpec *pluginSpec + = Utils::findOrDefault(ExtensionSystem::PluginManager::plugins(), + Utils::equal(&ExtensionSystem::PluginSpec::name, + QString("StudioWelcome"))); + + if (!pluginSpec) + return; + + ExtensionSystem::IPlugin *plugin = pluginSpec->plugin(); + + if (!plugin) + return; + + auto studioWelcomePlugin = qobject_cast(plugin); + + if (studioWelcomePlugin) { + QObject::connect(studioWelcomePlugin, + &StudioWelcome::Internal::StudioWelcomePlugin::examplesDownloadPathChanged, + this, + [this](const QString &path) { + m_targetPath = Utils::FilePath::fromString(path); + emit targetPathChanged(); + emit targetFolderExistsChanged(); + }); + } } FileExtractor::~FileExtractor() {} diff --git a/src/plugins/studiowelcome/studiowelcomeplugin.cpp b/src/plugins/studiowelcome/studiowelcomeplugin.cpp index 9b20e013162..e89bc5fa1d1 100644 --- a/src/plugins/studiowelcome/studiowelcomeplugin.cpp +++ b/src/plugins/studiowelcome/studiowelcomeplugin.cpp @@ -66,6 +66,7 @@ #include #include #include +#include #include #include #include @@ -777,6 +778,18 @@ void setSettingIfDifferent(const QString &key, bool value, bool &dirty) } } +const Utils::FilePath defaultExamplesPath = Utils::FilePath::fromString( + QStandardPaths::writableLocation( + QStandardPaths::DocumentsLocation)) + .pathAppended("QtDesignStudio"); + +static QString examplesPathSetting() +{ + return Core::ICore::settings() + ->value(EXAMPLES_DOWNLOAD_PATH, defaultExamplesPath.toString()) + .toString(); +} + WelcomeMode::~WelcomeMode() { delete m_modeWidget; @@ -786,19 +799,18 @@ StudioSettingsPage::StudioSettingsPage() : m_buildCheckBox(new QCheckBox(tr("Build"))) , m_debugCheckBox(new QCheckBox(tr("Debug"))) , m_analyzeCheckBox(new QCheckBox(tr("Analyze"))) + , m_pathChooser(new Utils::PathChooser()) { const QString toolTip = tr( "Hide top-level menus with advanced functionality to simplify the UI. Build is " "generally not required in the context of Qt Design Studio.Debug and Analyze" "are only required for debugging and profiling."); - QVBoxLayout *boxLayout = new QVBoxLayout(this); + QVBoxLayout *boxLayout = new QVBoxLayout(); setLayout(boxLayout); auto groupBox = new QGroupBox(tr("Hide Menu")); groupBox->setToolTip(toolTip); boxLayout->addWidget(groupBox); - boxLayout->addSpacerItem( - new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Expanding)); auto verticalLayout = new QVBoxLayout(); groupBox->setLayout(verticalLayout); @@ -816,6 +828,28 @@ StudioSettingsPage::StudioSettingsPage() m_buildCheckBox->setChecked(hideBuildMenuSetting()); m_debugCheckBox->setChecked(hideDebugMenuSetting()); m_analyzeCheckBox->setChecked(hideAnalyzeMenuSetting()); + + auto examplesGroupBox = new QGroupBox(tr("Examples")); + boxLayout->addWidget(examplesGroupBox); + + auto horizontalLayout = new QHBoxLayout(); + examplesGroupBox->setLayout(horizontalLayout); + + auto label = new QLabel(tr("Examples path:")); + m_pathChooser->setFilePath(Utils::FilePath::fromString(examplesPathSetting())); + auto resetButton = new QPushButton(tr("Reset Path")); + + connect(resetButton, &QPushButton::clicked, this, [this]() { + m_pathChooser->setFilePath(defaultExamplesPath); + }); + + horizontalLayout->addWidget(label); + horizontalLayout->addWidget(m_pathChooser); + horizontalLayout->addWidget(resetButton); + + + boxLayout->addSpacerItem( + new QSpacerItem(10, 10, QSizePolicy::Expanding, QSizePolicy::Expanding)); } void StudioSettingsPage::apply() @@ -840,6 +874,14 @@ void StudioSettingsPage::apply() Core::RestartDialog restartDialog(Core::ICore::dialogParent(), restartText); restartDialog.exec(); } + + QSettings *s = Core::ICore::settings(); + const QString value = m_pathChooser->filePath().toString(); + + if (s->value(EXAMPLES_DOWNLOAD_PATH, false).toString() != value) { + s->setValue(EXAMPLES_DOWNLOAD_PATH, value); + emit s_pluginInstance->examplesDownloadPathChanged(value); + } } StudioWelcomeSettingsPage::StudioWelcomeSettingsPage() diff --git a/src/plugins/studiowelcome/studiowelcomeplugin.h b/src/plugins/studiowelcome/studiowelcomeplugin.h index 519f86dd863..11274b68a6b 100644 --- a/src/plugins/studiowelcome/studiowelcomeplugin.h +++ b/src/plugins/studiowelcome/studiowelcomeplugin.h @@ -27,6 +27,7 @@ #include #include +#include #include @@ -35,6 +36,8 @@ QT_FORWARD_DECLARE_CLASS(QCheckBox) namespace StudioWelcome { namespace Internal { +const char EXAMPLES_DOWNLOAD_PATH[] = "StudioWelcome/ExamplesDownloadPath"; + class StudioSettingsPage : public Core::IOptionsPageWidget { public: @@ -46,6 +49,7 @@ private: QCheckBox *m_buildCheckBox; QCheckBox *m_debugCheckBox; QCheckBox *m_analyzeCheckBox; + Utils::PathChooser *m_pathChooser; }; class StudioWelcomeSettingsPage : public Core::IOptionsPage @@ -76,6 +80,9 @@ public: void pauseRemoveSplashTimer(); void resumeRemoveSplashTimer(); +signals: + void examplesDownloadPathChanged(const QString &path); + private: class WelcomeMode *m_welcomeMode = nullptr; QTimer m_removeSplashTimer;