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;