From 8d327c1cf73b9ca9207b14fed793f04a76a982e5 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 21 Jan 2022 20:08:28 +0100 Subject: [PATCH] QmlProject: Add option to always open ui.qml files in qds This patch adds an option to always open ui.qml files in Qt Design Studio. If that option is enabled an info bar is used to propose the option. Change-Id: Ia80ecd87de7fcf4c5824e7a8bb806c3d4d77b935 Reviewed-by: Alessandro Portale --- .../qmljseditor/qmljseditingsettingspage.cpp | 29 +++++++-- .../qmljseditor/qmljseditingsettingspage.h | 4 ++ .../qmljseditor/qmljseditingsettingspage.ui | 7 +++ .../qmlprojectmanager/qmlprojectplugin.cpp | 62 ++++++++++++------- .../qmlprojectmanager/qmlprojectplugin.h | 2 + 5 files changed, 77 insertions(+), 27 deletions(-) diff --git a/src/plugins/qmljseditor/qmljseditingsettingspage.cpp b/src/plugins/qmljseditor/qmljseditingsettingspage.cpp index 9f3befc471e..6c960ba60a8 100644 --- a/src/plugins/qmljseditor/qmljseditingsettingspage.cpp +++ b/src/plugins/qmljseditor/qmljseditingsettingspage.cpp @@ -38,6 +38,7 @@ const char AUTO_FORMAT_ONLY_CURRENT_PROJECT[] = "QmlJSEditor.AutoFormatOnlyCurre const char QML_CONTEXTPANE_KEY[] = "QmlJSEditor.ContextPaneEnabled"; const char QML_CONTEXTPANEPIN_KEY[] = "QmlJSEditor.ContextPanePinned"; const char FOLD_AUX_DATA[] = "QmlJSEditor.FoldAuxData"; +const char OPEN_UIQML_FILES_IN_QDS[] = "QmlJSEditor.openUiQmlFilesInQDS"; using namespace QmlJSEditor; using namespace QmlJSEditor::Internal; @@ -47,7 +48,8 @@ QmlJsEditingSettings::QmlJsEditingSettings() m_pinContextPane(false), m_autoFormatOnSave(false), m_autoFormatOnlyCurrentProject(false), - m_foldAuxData(false) + m_foldAuxData(false), + m_openUiQmlFilesInQDS(false) {} void QmlJsEditingSettings::set() @@ -65,6 +67,7 @@ void QmlJsEditingSettings::fromSettings(QSettings *settings) m_autoFormatOnlyCurrentProject = settings->value(AUTO_FORMAT_ONLY_CURRENT_PROJECT, QVariant(false)).toBool(); m_foldAuxData = settings->value(FOLD_AUX_DATA, QVariant(true)).toBool(); + m_openUiQmlFilesInQDS = settings->value(OPEN_UIQML_FILES_IN_QDS, QVariant(false)).toBool(); settings->endGroup(); } @@ -76,16 +79,18 @@ void QmlJsEditingSettings::toSettings(QSettings *settings) const settings->setValue(AUTO_FORMAT_ON_SAVE, m_autoFormatOnSave); settings->setValue(AUTO_FORMAT_ONLY_CURRENT_PROJECT, m_autoFormatOnlyCurrentProject); settings->setValue(FOLD_AUX_DATA, m_foldAuxData); + settings->setValue(OPEN_UIQML_FILES_IN_QDS, m_openUiQmlFilesInQDS); settings->endGroup(); } bool QmlJsEditingSettings::equals(const QmlJsEditingSettings &other) const { - return m_enableContextPane == other.m_enableContextPane - && m_pinContextPane == other.m_pinContextPane - && m_autoFormatOnSave == other.m_autoFormatOnSave - && m_autoFormatOnlyCurrentProject == other.m_autoFormatOnlyCurrentProject - && m_foldAuxData == other.m_foldAuxData; + return m_enableContextPane == other.m_enableContextPane + && m_pinContextPane == other.m_pinContextPane + && m_autoFormatOnSave == other.m_autoFormatOnSave + && m_autoFormatOnlyCurrentProject == other.m_autoFormatOnlyCurrentProject + && m_foldAuxData == other.m_foldAuxData + && m_openUiQmlFilesInQDS == other.m_openUiQmlFilesInQDS; } bool QmlJsEditingSettings::enableContextPane() const @@ -138,6 +143,16 @@ void QmlJsEditingSettings::setFoldAuxData(const bool foldAuxData) m_foldAuxData = foldAuxData; } +void QmlJsEditingSettings::setOpenUiQmlFilesInQDS(const bool openUiQmlFilesInQDS) +{ + m_openUiQmlFilesInQDS = openUiQmlFilesInQDS; +} + +bool QmlJsEditingSettings::openUiQmlFilesInQDS() const +{ + return m_openUiQmlFilesInQDS; +} + class QmlJsEditingSettingsPageWidget final : public Core::IOptionsPageWidget { Q_DECLARE_TR_FUNCTIONS(QmlDesigner::Internal::QmlJsEditingSettingsPage) @@ -153,6 +168,7 @@ public: m_ui.autoFormatOnSave->setChecked(s.autoFormatOnSave()); m_ui.autoFormatOnlyCurrentProject->setChecked(s.autoFormatOnlyCurrentProject()); m_ui.foldAuxDataCheckBox->setChecked(s.foldAuxData()); + m_ui.openUiQmlFilesInQDS->setChecked(s.openUiQmlFilesInQDS()); } void apply() final @@ -163,6 +179,7 @@ public: s.setAutoFormatOnSave(m_ui.autoFormatOnSave->isChecked()); s.setAutoFormatOnlyCurrentProject(m_ui.autoFormatOnlyCurrentProject->isChecked()); s.setFoldAuxData(m_ui.foldAuxDataCheckBox->isChecked()); + s.setOpenUiQmlFilesInQDS(m_ui.openUiQmlFilesInQDS->isChecked()); s.set(); } diff --git a/src/plugins/qmljseditor/qmljseditingsettingspage.h b/src/plugins/qmljseditor/qmljseditingsettingspage.h index 296bc64b416..8a5957b0199 100644 --- a/src/plugins/qmljseditor/qmljseditingsettingspage.h +++ b/src/plugins/qmljseditor/qmljseditingsettingspage.h @@ -64,6 +64,9 @@ public: bool foldAuxData() const; void setFoldAuxData(const bool foldAuxData); + bool openUiQmlFilesInQDS() const; + void setOpenUiQmlFilesInQDS(const bool foldAuxData); + friend bool operator==(const QmlJsEditingSettings &s1, const QmlJsEditingSettings &s2) { return s1.equals(s2); } friend bool operator!=(const QmlJsEditingSettings &s1, const QmlJsEditingSettings &s2) @@ -75,6 +78,7 @@ private: bool m_autoFormatOnSave; bool m_autoFormatOnlyCurrentProject; bool m_foldAuxData; + bool m_openUiQmlFilesInQDS; }; namespace Internal { diff --git a/src/plugins/qmljseditor/qmljseditingsettingspage.ui b/src/plugins/qmljseditor/qmljseditingsettingspage.ui index 875a1ad0733..ddd4ee98ba1 100644 --- a/src/plugins/qmljseditor/qmljseditingsettingspage.ui +++ b/src/plugins/qmljseditor/qmljseditingsettingspage.ui @@ -92,6 +92,13 @@ + + + + Open .ui.qml files in Qt Design Studio + + + diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp index ddc9462603b..2922c55aea7 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp @@ -56,7 +56,8 @@ using namespace ProjectExplorer; namespace QmlProjectManager { namespace Internal { -const char openInQDSAppSetting[] = "OpenInQDSAppUiQml"; +const char openInQDSAppInfoBar[] = "OpenInQDSAppUiQml"; +const char alwaysOpenUiQmlInQDS[] = "J.QtQuick/QmlJSEditor.openUiQmlFilesInQDS"; static bool isQmlDesigner(const ExtensionSystem::PluginSpec *spec) { @@ -73,6 +74,16 @@ static bool qmlDesignerEnabled() return it != plugins.end() && (*it)->plugin(); } +static bool alwaysOpenUiQmlfileInQds() +{ + return Core::ICore::settings()->value(alwaysOpenUiQmlInQDS, false).toBool(); +} + +static void enableAlwaysOpenUiQmlfileInQds() +{ + return Core::ICore::settings()->setValue(alwaysOpenUiQmlInQDS, true); +} + class QmlProjectPluginPrivate { public: @@ -169,6 +180,21 @@ static bool findAndOpenProject(const Utils::FilePath &filePath) return false; } +void QmlProjectPlugin::openInQDSWithProject(const Utils::FilePath &filePath) +{ + if (findAndOpenProject(filePath)) { + openQDS(filePath); + //The first one might be ignored when QDS is starting up + QTimer::singleShot(4000, [filePath] { openQDS(filePath); }); + } else { + Core::AsynchronousMessageBox::warning( + tr("Qt Design Studio"), + tr("No project file (*.qmlproject) found for Qt Design " + "Studio.\n Qt Design Studio requires a .qmlproject " + "based project to open the .ui.qml file.")); + } +} + bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage) { Q_UNUSED(errorMessage) @@ -196,9 +222,9 @@ bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage) const QString description = tr("Files of the type ui.qml are intended for Qt Design Studio."); if (!qdsInstallationExists()) { - if (Core::ICore::infoBar()->canInfoBeAdded(openInQDSAppSetting)) { + if (Core::ICore::infoBar()->canInfoBeAdded(openInQDSAppInfoBar)) { Utils::InfoBarEntry - info(openInQDSAppSetting, + info(openInQDSAppInfoBar, description + tr(" Learn more about Qt Design Studio here: ") + "Qt Design Studio", Utils::InfoBarEntry::GlobalSuppression::Disabled); @@ -207,25 +233,19 @@ bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage) return; } - if (Core::ICore::infoBar()->canInfoBeAdded(openInQDSAppSetting)) { - Utils::InfoBarEntry - info(openInQDSAppSetting, - description + "\n" + tr("Do you want to open this file in Qt Design Studio?"), - Utils::InfoBarEntry::GlobalSuppression::Disabled); - info.addCustomButton(tr("Open in Qt Design Studio"), [filePath] { - Core::ICore::infoBar()->removeInfo(openInQDSAppSetting); - if (findAndOpenProject(filePath)) { - openQDS(filePath); - //The first one might be ignored when QDS is starting up - QTimer::singleShot(4000, [filePath] { openQDS(filePath); }); - } else { - Core::AsynchronousMessageBox::warning( - tr("Qt Design Studio"), - tr("No project file (*.qmlproject) found for Qt Design" - "Studio.\n Qt Design Studio requires a .qmlproject " - "based project to open the ui.qml file.")); - } + if (alwaysOpenUiQmlfileInQds()) { + openInQDSWithProject(filePath); + } else if (Core::ICore::infoBar()->canInfoBeAdded(openInQDSAppInfoBar)) { + Utils::InfoBarEntry + info(openInQDSAppInfoBar, + description + "\n" + tr("Do you want to open this file always in Qt Design Studio?"), + Utils::InfoBarEntry::GlobalSuppression::Disabled); + info.addCustomButton(tr("Always open in Qt Design Studio"), [filePath] { + Core::ICore::infoBar()->removeInfo(openInQDSAppInfoBar); + + enableAlwaysOpenUiQmlfileInQds(); + openInQDSWithProject(filePath); }); Core::ICore::infoBar()->addInfo(info); } diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.h b/src/plugins/qmlprojectmanager/qmlprojectplugin.h index 92df42532cb..e793cee74b8 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectplugin.h +++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.h @@ -45,6 +45,8 @@ public: static bool qdsInstallationExists(); private: + static void openInQDSWithProject(const Utils::FilePath &filePath); + bool initialize(const QStringList &arguments, QString *errorString) final; class QmlProjectPluginPrivate *d = nullptr;