From 3ad3f3ec161252145c62dbd381e57823230c70e9 Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Tue, 9 Mar 2021 17:53:36 +0100 Subject: [PATCH] Improve Qt Design Studio visibility in Qt Creator Fixes: QDS-3765 Change-Id: I877da7c0caf153a48c17dbc9ced87ef54c1a082c Reviewed-by: Knud Dollereder Reviewed-by: Leena Miettinen Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/designersettings.cpp | 1 + src/plugins/qmldesigner/designersettings.h | 1 + src/plugins/qmldesigner/settingspage.cpp | 5 ++ src/plugins/qmldesigner/settingspage.ui | 17 ++++-- src/plugins/qmlprojectmanager/qmlproject.cpp | 63 +++++++++++++++++++- 5 files changed, 81 insertions(+), 6 deletions(-) diff --git a/src/plugins/qmldesigner/designersettings.cpp b/src/plugins/qmldesigner/designersettings.cpp index ed12230ff93..ec471405847 100644 --- a/src/plugins/qmldesigner/designersettings.cpp +++ b/src/plugins/qmldesigner/designersettings.cpp @@ -86,6 +86,7 @@ void DesignerSettings::fromSettings(QSettings *settings) restoreValue(settings, DesignerSettingsKey::SIMPLE_COLOR_PALETTE_CONTENT, QStringList()); restoreValue(settings, DesignerSettingsKey::ALWAYS_DESIGN_MODE, true); restoreValue(settings, DesignerSettingsKey::DISABLE_ITEM_LIBRARY_UPDATE_TIMER, true); + restoreValue(settings, DesignerSettingsKey::OPEN_QMLPROJECT_IN_QDS, false); settings->endGroup(); settings->endGroup(); diff --git a/src/plugins/qmldesigner/designersettings.h b/src/plugins/qmldesigner/designersettings.h index 7667b784824..719beed6669 100644 --- a/src/plugins/qmldesigner/designersettings.h +++ b/src/plugins/qmldesigner/designersettings.h @@ -70,6 +70,7 @@ const char ENABLE_TIMELINEVIEW[] = "EnableTimelineView"; const char SIMPLE_COLOR_PALETTE_CONTENT[] = "SimpleColorPaletteContent"; const char ALWAYS_DESIGN_MODE[] = "AlwaysDesignMode"; const char DISABLE_ITEM_LIBRARY_UPDATE_TIMER[] = "DisableItemLibraryUpdateTimer"; +const char OPEN_QMLPROJECT_IN_QDS[] = "OpenQmlprojectInQDS"; /* This key value is used in QmlProjectManager */ } class QMLDESIGNERCORE_EXPORT DesignerSettings : public QHash diff --git a/src/plugins/qmldesigner/settingspage.cpp b/src/plugins/qmldesigner/settingspage.cpp index 569cdb74d72..e3a041e388d 100644 --- a/src/plugins/qmldesigner/settingspage.cpp +++ b/src/plugins/qmldesigner/settingspage.cpp @@ -178,6 +178,8 @@ DesignerSettings SettingsPageWidget::settings() const m_ui.featureTimelineEditorCheckBox->isChecked()); settings.insert(DesignerSettingsKey::ALWAYS_DESIGN_MODE, m_ui.designerAlwaysDesignModeCheckBox->isChecked()); + settings.insert(DesignerSettingsKey::OPEN_QMLPROJECT_IN_QDS, + m_ui.openQmlprojectInQDSCheckBox->isChecked()); return settings; } @@ -247,10 +249,13 @@ void SettingsPageWidget::setSettings(const DesignerSettings &settings) DesignerSettingsKey::ALWAYS_DESIGN_MODE).toBool()); m_ui.featureTimelineEditorCheckBox->setChecked(settings.value( DesignerSettingsKey::ENABLE_TIMELINEVIEW).toBool()); + m_ui.openQmlprojectInQDSCheckBox->setChecked(settings.value( + DesignerSettingsKey::OPEN_QMLPROJECT_IN_QDS).toBool()); if (settings.value(DesignerSettingsKey::STANDALONE_MODE).toBool()) { m_ui.debugGroupBox->hide(); m_ui.featureTimelineEditorCheckBox->hide(); + m_ui.openQmlprojectInQDSCheckBox->hide(); } } diff --git a/src/plugins/qmldesigner/settingspage.ui b/src/plugins/qmldesigner/settingspage.ui index 69d238ae4b0..08316754474 100644 --- a/src/plugins/qmldesigner/settingspage.ui +++ b/src/plugins/qmldesigner/settingspage.ui @@ -6,8 +6,8 @@ 0 0 - 960 - 840 + 973 + 862 @@ -416,6 +416,13 @@ Features + + + + Always open ui.qml files in Design mode + + + @@ -423,10 +430,10 @@ - - + + - Always open ui.qml files in Design mode + Open "Qt Quick Prototype" projects (.qmlproject) in Qt Design Studio diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index ab94bab829d..541cc837a68 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -53,11 +53,14 @@ #include #include +#include #include +#include +#include #include #include -#include +#include using namespace Core; using namespace ProjectExplorer; @@ -79,6 +82,64 @@ QmlProject::QmlProject(const Utils::FilePath &fileName) setNeedsBuildConfigurations(false); setBuildSystemCreator([](Target *t) { return new QmlBuildSystem(t); }); + + QSettings *settings = Core::ICore::settings(); + const QString qdsStandaloneEntry = "QML/Designer/StandAloneMode"; //entry from qml settings + const QString qdsInstallationEntry = "QML/Designer/DesignStudioInstallation"; //set in installer + + const bool isDesigner = settings->value(qdsStandaloneEntry, false).toBool(); + + if (!isDesigner) { + const QString qdsPath = settings->value(qdsInstallationEntry).toString(); + const bool foundQDS = Utils::FilePath::fromString(qdsPath).exists(); + + if (foundQDS) { + auto lambda = [fileName, qdsPath]() { + const QString projectName = fileName.fileName(); + const QString doNotShowAgainKey = "OpenInQDSApp"; //entry that is used only here + const QString openInQDSKey = "QML/Designer/OpenQmlprojectInQDS"; //entry from qml settings + QSettings *settings = Core::ICore::settings(); + const bool shouldAskAgain = Utils::CheckableMessageBox::shouldAskAgain(settings, + doNotShowAgainKey); + bool openInQDS = false; + + if (shouldAskAgain) { + bool dontShow = false; + const auto dialogResult = + Utils::CheckableMessageBox::question(Core::ICore::dialogParent(), + projectName, + tr("Would you like to open the project in Qt Design Studio?"), + tr("Do not show this dialog anymore."), + &dontShow); + openInQDS = (dialogResult == QDialogButtonBox::Yes); + + if (dontShow) { + Utils::CheckableMessageBox::doNotAskAgain(settings, doNotShowAgainKey); + settings->setValue(openInQDSKey, openInQDS); + } + } else { + openInQDS = settings->value(openInQDSKey, false).toBool(); + } + + if (openInQDS) { + bool qdsStarted = false; + //-a and -client arguments help to append project to open design studio application + if (Utils::HostOsInfo::isMacHost()) + qdsStarted = QProcess::startDetached("/usr/bin/open", {"-a", qdsPath, fileName.toString()}); + else + qdsStarted = QProcess::startDetached(qdsPath, {"-client", fileName.toString()}); + + if (!qdsStarted) { + QMessageBox::warning(Core::ICore::dialogParent(), + projectName, + tr("Failed to start Qt Design Studio.")); + } + } + }; + + QTimer::singleShot(0, this, lambda); + } + } } QmlBuildSystem::QmlBuildSystem(Target *target)