diff --git a/src/plugins/beautifier/CMakeLists.txt b/src/plugins/beautifier/CMakeLists.txt index cdfacccce1a..4e921342b7a 100644 --- a/src/plugins/beautifier/CMakeLists.txt +++ b/src/plugins/beautifier/CMakeLists.txt @@ -5,7 +5,6 @@ add_qtc_plugin(Beautifier abstractsettings.cpp abstractsettings.h artisticstyle/artisticstyle.cpp artisticstyle/artisticstyle.h artisticstyle/artisticstyleconstants.h - artisticstyle/artisticstyleoptionspage.cpp artisticstyle/artisticstyleoptionspage.h artisticstyle/artisticstylesettings.cpp artisticstyle/artisticstylesettings.h beautifier.qrc beautifierabstracttool.h @@ -14,7 +13,6 @@ add_qtc_plugin(Beautifier beautifiertr.h clangformat/clangformat.cpp clangformat/clangformat.h clangformat/clangformatconstants.h - clangformat/clangformatoptionspage.cpp clangformat/clangformatoptionspage.h clangformat/clangformatsettings.cpp clangformat/clangformatsettings.h configurationdialog.cpp configurationdialog.h configurationeditor.cpp configurationeditor.h @@ -22,6 +20,5 @@ add_qtc_plugin(Beautifier generalsettings.cpp generalsettings.h uncrustify/uncrustify.cpp uncrustify/uncrustify.h uncrustify/uncrustifyconstants.h - uncrustify/uncrustifyoptionspage.cpp uncrustify/uncrustifyoptionspage.h uncrustify/uncrustifysettings.cpp uncrustify/uncrustifysettings.h ) diff --git a/src/plugins/beautifier/abstractsettings.cpp b/src/plugins/beautifier/abstractsettings.cpp index fa621fdebcb..c80d4f6ac7b 100644 --- a/src/plugins/beautifier/abstractsettings.cpp +++ b/src/plugins/beautifier/abstractsettings.cpp @@ -26,9 +26,6 @@ using namespace Utils; namespace Beautifier::Internal { -const char COMMAND[] = "command"; -const char SUPPORTED_MIME[] = "supportedMime"; - class VersionUpdater { public: @@ -86,9 +83,40 @@ AbstractSettings::AbstractSettings(const QString &name, const QString &ending) , m_styleDir(Core::ICore::userResourcePath(Beautifier::Constants::SETTINGS_DIRNAME) .pathAppended(name) .toString()) - , m_name(name) , m_versionUpdater(new VersionUpdater) { + setSettingsGroups(Utils::Constants::BEAUTIFIER_SETTINGS_GROUP, name); + + registerAspect(&command); + command.setSettingsKey("command"); + command.setExpectedKind(Utils::PathChooser::ExistingCommand); + command.setCommandVersionArguments({"--version"}); + command.setPromptDialogTitle(BeautifierPlugin::msgCommandPromptDialogTitle("Clang Format")); + + registerAspect(&supportedMimeTypes); + supportedMimeTypes.setDisplayStyle(StringAspect::LineEditDisplay); + supportedMimeTypes.setSettingsKey("supportedMime"); + supportedMimeTypes.setLabelText(Tr::tr("Restrict to MIME types:")); + supportedMimeTypes.setDefaultValue("text/x-c++src; text/x-c++hdr; text/x-csrc;text/x-chdr; " + "text/x-objcsrc; text/x-objc++src"); + + supportedMimeTypes.setValueAcceptor([](const QString &, const QString &value) -> std::optional { + const QStringList stringTypes = value.split(';'); + QStringList types; + for (const QString &type : stringTypes) { + const MimeType mime = mimeTypeForName(type.trimmed()); + if (!mime.isValid()) + continue; + const QString canonicalName = mime.name(); + if (!types.contains(canonicalName)) + types << canonicalName; + } + return types.join("; "); + }); + + connect(&command, &BaseAspect::changed, this, [this] { + m_versionUpdater->update(command()); + }); } AbstractSettings::~AbstractSettings() = default; @@ -157,20 +185,6 @@ QString AbstractSettings::styleFileName(const QString &key) const return m_styleDir.absoluteFilePath(key + m_ending); } -FilePath AbstractSettings::command() const -{ - return m_command; -} - -void AbstractSettings::setCommand(const FilePath &cmd) -{ - if (cmd == m_command) - return; - - m_command = cmd; - m_versionUpdater->update(command()); -} - QVersionNumber AbstractSettings::version() const { return m_versionUpdater->version(); @@ -181,30 +195,6 @@ void AbstractSettings::setVersionRegExp(const QRegularExpression &versionRegExp) m_versionUpdater->setVersionRegExp(versionRegExp); } -QString AbstractSettings::supportedMimeTypesAsString() const -{ - return m_supportedMimeTypes.join("; "); -} - -void AbstractSettings::setSupportedMimeTypes(const QString &mimes) -{ - const QStringList stringTypes = mimes.split(';'); - QStringList types; - for (const QString &type : stringTypes) { - const MimeType mime = mimeTypeForName(type.trimmed()); - if (!mime.isValid()) - continue; - const QString canonicalName = mime.name(); - if (!types.contains(canonicalName)) - types << canonicalName; - } - - if (m_supportedMimeTypes != types) { - m_supportedMimeTypes = types; - emit supportedMimeTypesChanged(); - } -} - bool AbstractSettings::isApplicable(const Core::IDocument *document) const { if (!document) @@ -240,17 +230,8 @@ void AbstractSettings::save() { // Save settings, except styles QSettings *s = Core::ICore::settings(); - s->beginGroup(Utils::Constants::BEAUTIFIER_SETTINGS_GROUP); - s->beginGroup(m_name); - QMap::const_iterator iSettings = m_settings.constBegin(); - while (iSettings != m_settings.constEnd()) { - s->setValue(iSettings.key(), iSettings.value()); - ++iSettings; - } - s->setValue(COMMAND, m_command.toSettings()); - s->setValue(SUPPORTED_MIME, supportedMimeTypesAsString()); - s->endGroup(); - s->endGroup(); + + AspectContainer::writeSettings(s); // Save styles if (m_stylesToRemove.isEmpty() && m_styles.isEmpty()) @@ -306,27 +287,9 @@ void AbstractSettings::createDocumentationFile() const void AbstractSettings::read() { - // Set default values - setSupportedMimeTypes("text/x-c++src;text/x-c++hdr;text/x-csrc;text/x-chdr;text/x-objcsrc;" - "text/x-objc++src"); - // Read settings, except styles QSettings *s = Core::ICore::settings(); - s->beginGroup(Utils::Constants::BEAUTIFIER_SETTINGS_GROUP); - s->beginGroup(m_name); - const QStringList keys = s->allKeys(); - for (const QString &key : keys) { - if (key == COMMAND) - setCommand(FilePath::fromSettings(s->value(key))); - else if (key == SUPPORTED_MIME) - setSupportedMimeTypes(s->value(key).toString()); - else if (m_settings.contains(key)) - m_settings[key] = s->value(key); - else - s->remove(key); - } - s->endGroup(); - s->endGroup(); + AspectContainer::readSettings(s); m_styles.clear(); m_changedStyles.clear(); @@ -336,18 +299,19 @@ void AbstractSettings::read() void AbstractSettings::readDocumentation() { - const QString filename = documentationFilePath(); + const FilePath filename = documentationFilePath(); if (filename.isEmpty()) { BeautifierPlugin::showError(Tr::tr("No documentation file specified.")); return; } - QFile file(filename); + QFile file(filename.toFSPathString()); if (!file.exists()) createDocumentationFile(); if (!file.open(QIODevice::ReadOnly)) { - BeautifierPlugin::showError(Tr::tr("Cannot open documentation file \"%1\".").arg(filename)); + BeautifierPlugin::showError(Tr::tr("Cannot open documentation file \"%1\".") + .arg(filename.toUserOutput())); return; } @@ -356,7 +320,7 @@ void AbstractSettings::readDocumentation() return; if (xml.name() != QLatin1String(Constants::DOCUMENTATION_XMLROOT)) { BeautifierPlugin::showError(Tr::tr("The file \"%1\" is not a valid documentation file.") - .arg(filename)); + .arg(filename.toUserOutput())); return; } @@ -387,7 +351,7 @@ void AbstractSettings::readDocumentation() if (xml.hasError()) { BeautifierPlugin::showError(Tr::tr("Cannot read documentation file \"%1\": %2.") - .arg(filename).arg(xml.errorString())); + .arg(filename.toUserOutput()).arg(xml.errorString())); } } diff --git a/src/plugins/beautifier/abstractsettings.h b/src/plugins/beautifier/abstractsettings.h index 25baa838858..5eb930396ee 100644 --- a/src/plugins/beautifier/abstractsettings.h +++ b/src/plugins/beautifier/abstractsettings.h @@ -3,6 +3,8 @@ #pragma once +#include + #include #include @@ -40,7 +42,6 @@ public: void read(); void save(); - virtual QString documentationFilePath() const = 0; virtual void createDocumentationFile() const; virtual QStringList completerWords(); @@ -53,25 +54,21 @@ public: void replaceStyle(const QString &oldKey, const QString &newKey, const QString &value); virtual QString styleFileName(const QString &key) const; - Utils::FilePath command() const; - void setCommand(const Utils::FilePath &cmd); + Utils::FilePathAspect command; + Utils::StringAspect supportedMimeTypes; + Utils::FilePathAspect documentationFilePath; + QVersionNumber version() const; - QString supportedMimeTypesAsString() const; - void setSupportedMimeTypes(const QString &mimes); bool isApplicable(const Core::IDocument *document) const; QStringList options(); QString documentation(const QString &option) const; -signals: - void supportedMimeTypesChanged(); - protected: void setVersionRegExp(const QRegularExpression &versionRegExp); QMap m_styles; - QMap m_settings; QString m_ending; QDir m_styleDir; @@ -79,11 +76,9 @@ protected: virtual void readStyles(); private: - QString m_name; std::unique_ptr m_versionUpdater; QStringList m_stylesToRemove; QSet m_changedStyles; - Utils::FilePath m_command; QHash m_options; QStringList m_docu; QStringList m_supportedMimeTypes; diff --git a/src/plugins/beautifier/artisticstyle/artisticstyle.cpp b/src/plugins/beautifier/artisticstyle/artisticstyle.cpp index 610f636d743..1f063829944 100644 --- a/src/plugins/beautifier/artisticstyle/artisticstyle.cpp +++ b/src/plugins/beautifier/artisticstyle/artisticstyle.cpp @@ -48,7 +48,7 @@ ArtisticStyle::ArtisticStyle() Core::ActionManager::actionContainer(Constants::MENU_ID)->addMenu(menu); - connect(&m_settings, &ArtisticStyleSettings::supportedMimeTypesChanged, + connect(&m_settings.supportedMimeTypes, &Utils::BaseAspect::changed, this, [this] { updateActions(Core::EditorManager::currentEditor()); }); } diff --git a/src/plugins/beautifier/artisticstyle/artisticstyle.h b/src/plugins/beautifier/artisticstyle/artisticstyle.h index ef394d068aa..3f3f15946af 100644 --- a/src/plugins/beautifier/artisticstyle/artisticstyle.h +++ b/src/plugins/beautifier/artisticstyle/artisticstyle.h @@ -5,7 +5,6 @@ #include "../beautifierabstracttool.h" -#include "artisticstyleoptionspage.h" #include "artisticstylesettings.h" namespace Beautifier::Internal { diff --git a/src/plugins/beautifier/artisticstyle/artisticstyleoptionspage.cpp b/src/plugins/beautifier/artisticstyle/artisticstyleoptionspage.cpp deleted file mode 100644 index e34fe18349d..00000000000 --- a/src/plugins/beautifier/artisticstyle/artisticstyleoptionspage.cpp +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright (C) 2016 Lorenz Haas -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "artisticstyleoptionspage.h" - -#include "artisticstyleconstants.h" -#include "artisticstylesettings.h" - -#include "../beautifierconstants.h" -#include "../beautifierplugin.h" -#include "../beautifiertr.h" -#include "../configurationpanel.h" - -#include -#include - -#include -#include -#include -#include -#include - -namespace Beautifier::Internal { - -class ArtisticStyleOptionsPageWidget : public Core::IOptionsPageWidget -{ -public: - explicit ArtisticStyleOptionsPageWidget(ArtisticStyleSettings *settings); - - void apply() final; - -private: - ArtisticStyleSettings *m_settings; - - Utils::PathChooser *m_command; - QLineEdit *m_mime; - QCheckBox *m_useOtherFiles; - QCheckBox *m_useSpecificConfigFile; - Utils::PathChooser *m_specificConfigFile; - QCheckBox *m_useHomeFile; - QCheckBox *m_useCustomStyle; - Beautifier::Internal::ConfigurationPanel *m_configurations; -}; - -ArtisticStyleOptionsPageWidget::ArtisticStyleOptionsPageWidget(ArtisticStyleSettings *settings) - : m_settings(settings) -{ - m_command = new Utils::PathChooser; - - m_mime = new QLineEdit(m_settings->supportedMimeTypesAsString()); - - auto options = new QGroupBox(Tr::tr("Options")); - - m_useOtherFiles = new QCheckBox(Tr::tr("Use file *.astylerc defined in project files")); - m_useOtherFiles->setChecked(m_settings->useOtherFiles()); - - m_useSpecificConfigFile = new QCheckBox(Tr::tr("Use specific config file:")); - m_useSpecificConfigFile->setChecked(m_settings->useSpecificConfigFile()); - - m_specificConfigFile = new Utils::PathChooser; - m_specificConfigFile->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - m_specificConfigFile->setExpectedKind(Utils::PathChooser::File); - m_specificConfigFile->setPromptDialogFilter(Tr::tr("AStyle (*.astylerc)")); - m_specificConfigFile->setFilePath(m_settings->specificConfigFile()); - - m_useHomeFile = new QCheckBox( - Tr::tr("Use file .astylerc or astylerc in HOME"). - replace("HOME", QDir::toNativeSeparators(QDir::home().absolutePath()))); - m_useHomeFile->setChecked(m_settings->useHomeFile()); - - m_useCustomStyle = new QCheckBox(Tr::tr("Use customized style:")); - m_useCustomStyle->setChecked(m_settings->useCustomStyle()); - - m_configurations = new ConfigurationPanel(options); - m_configurations->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - m_configurations->setSettings(m_settings); - m_configurations->setCurrentConfiguration(m_settings->customStyle()); - - m_command->setExpectedKind(Utils::PathChooser::ExistingCommand); - m_command->setCommandVersionArguments({"--version"}); - m_command->setPromptDialogTitle(BeautifierPlugin::msgCommandPromptDialogTitle( - Tr::tr(Constants::ARTISTICSTYLE_DISPLAY_NAME))); - m_command->setFilePath(m_settings->command()); - - using namespace Layouting; - - Column { - m_useOtherFiles, - Row { m_useSpecificConfigFile, m_specificConfigFile }, - m_useHomeFile, - Row { m_useCustomStyle, m_configurations }, - noMargin, - }.attachTo(options); - - Column { - Group { - title(Tr::tr("Configuration")), - Form { - Tr::tr("Artistic Style command:"), m_command, br, - Tr::tr("Restrict to MIME types:"), m_mime - } - }, - options, - st - }.attachTo(this); - - connect(m_command, &Utils::PathChooser::validChanged, options, &QWidget::setEnabled); -} - -void ArtisticStyleOptionsPageWidget::apply() -{ - m_settings->setCommand(m_command->filePath()); - m_settings->setSupportedMimeTypes(m_mime->text()); - m_settings->setUseOtherFiles(m_useOtherFiles->isChecked()); - m_settings->setUseSpecificConfigFile(m_useSpecificConfigFile->isChecked()); - m_settings->setSpecificConfigFile(m_specificConfigFile->filePath()); - m_settings->setUseHomeFile(m_useHomeFile->isChecked()); - m_settings->setUseCustomStyle(m_useCustomStyle->isChecked()); - m_settings->setCustomStyle(m_configurations->currentConfiguration()); - m_settings->save(); - - // update since not all MIME types are accepted (invalids or duplicates) - m_mime->setText(m_settings->supportedMimeTypesAsString()); -} - -ArtisticStyleOptionsPage::ArtisticStyleOptionsPage(ArtisticStyleSettings *settings) -{ - setId("ArtisticStyle"); - setDisplayName(Tr::tr("Artistic Style")); - setCategory(Constants::OPTION_CATEGORY); - setWidgetCreator([settings] { return new ArtisticStyleOptionsPageWidget(settings); }); -} - -} // Beautifier::Internal diff --git a/src/plugins/beautifier/artisticstyle/artisticstyleoptionspage.h b/src/plugins/beautifier/artisticstyle/artisticstyleoptionspage.h deleted file mode 100644 index 161e20f7067..00000000000 --- a/src/plugins/beautifier/artisticstyle/artisticstyleoptionspage.h +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (C) 2016 Lorenz Haas -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include - -namespace Beautifier::Internal { - -class ArtisticStyleSettings; - -class ArtisticStyleOptionsPage final : public Core::IOptionsPage -{ -public: - explicit ArtisticStyleOptionsPage(ArtisticStyleSettings *settings); -}; - -} // Beautifier::Internal diff --git a/src/plugins/beautifier/artisticstyle/artisticstylesettings.cpp b/src/plugins/beautifier/artisticstyle/artisticstylesettings.cpp index 42b91a785fe..78537df1970 100644 --- a/src/plugins/beautifier/artisticstyle/artisticstylesettings.cpp +++ b/src/plugins/beautifier/artisticstyle/artisticstylesettings.cpp @@ -3,16 +3,24 @@ #include "artisticstylesettings.h" +#include "artisticstyleconstants.h" #include "../beautifierconstants.h" +#include "../beautifierplugin.h" +#include "../beautifiertr.h" +#include "../configurationpanel.h" #include +#include +#include #include #include +#include #include #include #include +#include #include #include @@ -20,96 +28,52 @@ using namespace Utils; namespace Beautifier::Internal { -const char USE_OTHER_FILES[] = "useOtherFiles"; -const char USE_SPECIFIC_CONFIG_FILE[] = "useSpecificConfigFile"; -const char SPECIFIC_CONFIG_FILE[] = "specificConfigFile"; -const char USE_HOME_FILE[] = "useHomeFile"; -const char USE_CUSTOM_STYLE[] = "useCustomStyle"; -const char CUSTOM_STYLE[] = "customStyle"; const char SETTINGS_NAME[] = "artisticstyle"; -ArtisticStyleSettings::ArtisticStyleSettings() : - AbstractSettings(SETTINGS_NAME, ".astyle") +ArtisticStyleSettings::ArtisticStyleSettings() + : AbstractSettings(SETTINGS_NAME, ".astyle") { setVersionRegExp(QRegularExpression("([2-9]{1})\\.([0-9]{1,2})(\\.[1-9]{1})?$")); - setCommand("astyle"); - m_settings.insert(USE_OTHER_FILES, QVariant(true)); - m_settings.insert(USE_SPECIFIC_CONFIG_FILE, QVariant(false)); - m_settings.insert(SPECIFIC_CONFIG_FILE, QVariant()); - m_settings.insert(USE_HOME_FILE, QVariant(false)); - m_settings.insert(USE_CUSTOM_STYLE, QVariant(false)); - m_settings.insert(CUSTOM_STYLE, QVariant()); + command.setLabelText(Tr::tr("Artistic Style command:")); + command.setDefaultValue("astyle"); + command.setPromptDialogTitle(BeautifierPlugin::msgCommandPromptDialogTitle( + Tr::tr(Constants::ARTISTICSTYLE_DISPLAY_NAME))); + + registerAspect(&useOtherFiles); + useOtherFiles.setSettingsKey("useOtherFiles"); + useOtherFiles.setLabelText(Tr::tr("Use file *.astylerc defined in project files")); + useOtherFiles.setDefaultValue(true); + + registerAspect(&useSpecificConfigFile); + useSpecificConfigFile.setSettingsKey("useSpecificConfigFile"); + useSpecificConfigFile.setLabelText(Tr::tr("Use specific config file:")); + + registerAspect(&specificConfigFile); + specificConfigFile.setSettingsKey("specificConfigFile"); + specificConfigFile.setExpectedKind(PathChooser::File); + specificConfigFile.setPromptDialogFilter(Tr::tr("AStyle (*.astylerc)")); + + registerAspect(&useHomeFile); + useHomeFile.setSettingsKey("useHomeFile"); + useHomeFile.setLabelText(Tr::tr("Use file .astylerc or astylerc in HOME"). + replace("HOME", QDir::toNativeSeparators(QDir::home().absolutePath()))); + + registerAspect(&useCustomStyle); + useCustomStyle.setSettingsKey("useCustomStyle"); + useCustomStyle.setLabelText(Tr::tr("Use customized style:")); + + registerAspect(&customStyle); + customStyle.setSettingsKey("customStyle"); + + documentationFilePath.setFilePath( + Core::ICore::userResourcePath(Beautifier::Constants::SETTINGS_DIRNAME) + .pathAppended(Beautifier::Constants::DOCUMENTATION_DIRNAME) + .pathAppended(SETTINGS_NAME) + .stringAppended(".xml")); + read(); } -bool ArtisticStyleSettings::useOtherFiles() const -{ - return m_settings.value(USE_OTHER_FILES).toBool(); -} - -void ArtisticStyleSettings::setUseOtherFiles(bool useOtherFiles) -{ - m_settings.insert(USE_OTHER_FILES, QVariant(useOtherFiles)); -} - -bool ArtisticStyleSettings::useSpecificConfigFile() const -{ - return m_settings.value(USE_SPECIFIC_CONFIG_FILE).toBool(); -} - -void ArtisticStyleSettings::setUseSpecificConfigFile(bool useSpecificConfigFile) -{ - m_settings.insert(USE_SPECIFIC_CONFIG_FILE, QVariant(useSpecificConfigFile)); -} - -FilePath ArtisticStyleSettings::specificConfigFile() const -{ - return FilePath::fromString(m_settings.value(SPECIFIC_CONFIG_FILE).toString()); -} - -void ArtisticStyleSettings::setSpecificConfigFile(const FilePath &specificConfigFile) -{ - m_settings.insert(SPECIFIC_CONFIG_FILE, QVariant(specificConfigFile.toString())); -} - -bool ArtisticStyleSettings::useHomeFile() const -{ - return m_settings.value(USE_HOME_FILE).toBool(); -} - -void ArtisticStyleSettings::setUseHomeFile(bool useHomeFile) -{ - m_settings.insert(USE_HOME_FILE, QVariant(useHomeFile)); -} - -bool ArtisticStyleSettings::useCustomStyle() const -{ - return m_settings.value(USE_CUSTOM_STYLE).toBool(); -} - -void ArtisticStyleSettings::setUseCustomStyle(bool useCustomStyle) -{ - m_settings.insert(USE_CUSTOM_STYLE, QVariant(useCustomStyle)); -} - -QString ArtisticStyleSettings::customStyle() const -{ - return m_settings.value(CUSTOM_STYLE).toString(); -} - -void ArtisticStyleSettings::setCustomStyle(const QString &customStyle) -{ - m_settings.insert(CUSTOM_STYLE, QVariant(customStyle)); -} - -QString ArtisticStyleSettings::documentationFilePath() const -{ - return (Core::ICore::userResourcePath(Beautifier::Constants::SETTINGS_DIRNAME) - / Beautifier::Constants::DOCUMENTATION_DIRNAME / SETTINGS_NAME) - .stringAppended(".xml") - .toString(); -} - void ArtisticStyleSettings::createDocumentationFile() const { Process process; @@ -119,7 +83,7 @@ void ArtisticStyleSettings::createDocumentationFile() const if (process.result() != ProcessResult::FinishedWithSuccess) return; - QFile file(documentationFilePath()); + QFile file(documentationFilePath().toFSPathString()); const QFileInfo fi(file); if (!fi.exists()) fi.dir().mkpath(fi.absolutePath()); @@ -183,4 +147,61 @@ void ArtisticStyleSettings::createDocumentationFile() const } } +class ArtisticStyleOptionsPageWidget : public Core::IOptionsPageWidget +{ +public: + explicit ArtisticStyleOptionsPageWidget(ArtisticStyleSettings *settings) + { + QGroupBox *options = nullptr; + + auto configurations = new ConfigurationPanel(this); + configurations->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + configurations->setSettings(settings); + configurations->setCurrentConfiguration(settings->customStyle()); + + using namespace Layouting; + + ArtisticStyleSettings &s = *settings; + + Column { + Group { + title(Tr::tr("Configuration")), + Form { + s.command, br, + s.supportedMimeTypes + } + }, + Group { + title(Tr::tr("Options")), + bindTo(&options), + Column { + s.useOtherFiles, + Row { s.useSpecificConfigFile, s.specificConfigFile }, + s.useHomeFile, + Row { s.useCustomStyle, configurations }, + } + }, + st + }.attachTo(this); + + setOnApply([&s, configurations] { + s.customStyle.setValue(configurations->currentConfiguration()); + s.save(); + }); + + s.read(); + + connect(s.command.pathChooser(), &PathChooser::validChanged, options, &QWidget::setEnabled); + options->setEnabled(s.command.pathChooser()->isValid()); + } +}; + +ArtisticStyleOptionsPage::ArtisticStyleOptionsPage(ArtisticStyleSettings *settings) +{ + setId("ArtisticStyle"); + setDisplayName(Tr::tr("Artistic Style")); + setCategory(Constants::OPTION_CATEGORY); + setWidgetCreator([settings] { return new ArtisticStyleOptionsPageWidget(settings); }); +} + } // Beautifier::Internal diff --git a/src/plugins/beautifier/artisticstyle/artisticstylesettings.h b/src/plugins/beautifier/artisticstyle/artisticstylesettings.h index de5402a8ee5..5b74f8d1a03 100644 --- a/src/plugins/beautifier/artisticstyle/artisticstylesettings.h +++ b/src/plugins/beautifier/artisticstyle/artisticstylesettings.h @@ -5,8 +5,6 @@ #include "../abstractsettings.h" -#include - namespace Beautifier::Internal { class ArtisticStyleSettings : public AbstractSettings @@ -14,26 +12,20 @@ class ArtisticStyleSettings : public AbstractSettings public: ArtisticStyleSettings(); - bool useOtherFiles() const; - void setUseOtherFiles(bool useOtherFiles); + Utils::BoolAspect useOtherFiles; + Utils::BoolAspect useSpecificConfigFile; + Utils::FilePathAspect specificConfigFile; + Utils::BoolAspect useHomeFile; + Utils::BoolAspect useCustomStyle; + Utils::StringAspect customStyle; - bool useSpecificConfigFile() const; - void setUseSpecificConfigFile(bool useSpecificConfigFile); - - Utils::FilePath specificConfigFile() const; - void setSpecificConfigFile(const Utils::FilePath &specificConfigFile); - - bool useHomeFile() const; - void setUseHomeFile(bool useHomeFile); - - bool useCustomStyle() const; - void setUseCustomStyle(bool useCustomStyle); - - QString customStyle() const; - void setCustomStyle(const QString &customStyle); - - QString documentationFilePath() const override; void createDocumentationFile() const override; }; +class ArtisticStyleOptionsPage final : public Core::IOptionsPage +{ +public: + explicit ArtisticStyleOptionsPage(ArtisticStyleSettings *settings); +}; + } // Beautifier::Internal diff --git a/src/plugins/beautifier/beautifier.qbs b/src/plugins/beautifier/beautifier.qbs index 0f85ca29b57..24fecd671f1 100644 --- a/src/plugins/beautifier/beautifier.qbs +++ b/src/plugins/beautifier/beautifier.qbs @@ -36,8 +36,6 @@ QtcPlugin { "artisticstyle.cpp", "artisticstyle.h", "artisticstyleconstants.h", - "artisticstyleoptionspage.cpp", - "artisticstyleoptionspage.h", "artisticstylesettings.cpp", "artisticstylesettings.h" ] @@ -50,8 +48,6 @@ QtcPlugin { "clangformat.cpp", "clangformat.h", "clangformatconstants.h", - "clangformatoptionspage.cpp", - "clangformatoptionspage.h", "clangformatsettings.cpp", "clangformatsettings.h" ] @@ -64,8 +60,6 @@ QtcPlugin { "uncrustify.cpp", "uncrustify.h", "uncrustifyconstants.h", - "uncrustifyoptionspage.cpp", - "uncrustifyoptionspage.h", "uncrustifysettings.cpp", "uncrustifysettings.h" ] diff --git a/src/plugins/beautifier/clangformat/clangformat.cpp b/src/plugins/beautifier/clangformat/clangformat.cpp index c1833a77f11..92c8c7f454d 100644 --- a/src/plugins/beautifier/clangformat/clangformat.cpp +++ b/src/plugins/beautifier/clangformat/clangformat.cpp @@ -64,7 +64,7 @@ ClangFormat::ClangFormat() Core::ActionManager::actionContainer(Constants::MENU_ID)->addMenu(menu); - connect(&m_settings, &ClangFormatSettings::supportedMimeTypesChanged, + connect(&m_settings.supportedMimeTypes, &Utils::BaseAspect::changed, this, [this] { updateActions(Core::EditorManager::currentEditor()); }); } @@ -191,10 +191,10 @@ Command ClangFormat::command() const command.setProcessing(Command::PipeProcessing); if (m_settings.usePredefinedStyle()) { - const QString predefinedStyle = m_settings.predefinedStyle(); + const QString predefinedStyle = m_settings.predefinedStyle.stringValue(); command.addOption("-style=" + predefinedStyle); if (predefinedStyle == "File") { - const QString fallbackStyle = m_settings.fallbackStyle(); + const QString fallbackStyle = m_settings.fallbackStyle.stringValue(); if (fallbackStyle != "Default") command.addOption("-fallback-style=" + fallbackStyle); } diff --git a/src/plugins/beautifier/clangformat/clangformat.h b/src/plugins/beautifier/clangformat/clangformat.h index 8563a782efc..65fd23a43f1 100644 --- a/src/plugins/beautifier/clangformat/clangformat.h +++ b/src/plugins/beautifier/clangformat/clangformat.h @@ -5,7 +5,6 @@ #include "../beautifierabstracttool.h" -#include "clangformatoptionspage.h" #include "clangformatsettings.h" namespace Beautifier::Internal { diff --git a/src/plugins/beautifier/clangformat/clangformatoptionspage.cpp b/src/plugins/beautifier/clangformat/clangformatoptionspage.cpp deleted file mode 100644 index fd79826846a..00000000000 --- a/src/plugins/beautifier/clangformat/clangformatoptionspage.cpp +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (C) 2016 Lorenz Haas -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "clangformatoptionspage.h" - -#include "clangformatsettings.h" - -#include "../beautifierconstants.h" -#include "../beautifierplugin.h" -#include "../beautifiertr.h" -#include "../configurationpanel.h" - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -namespace Beautifier::Internal { - -class ClangFormatOptionsPageWidget : public Core::IOptionsPageWidget -{ -public: - explicit ClangFormatOptionsPageWidget(ClangFormatSettings *settings); - - void apply() final; - -private: - ClangFormatSettings *m_settings; - ConfigurationPanel *m_configurations; - QRadioButton *m_usePredefinedStyle; - QComboBox *m_predefinedStyle; - QComboBox *m_fallbackStyle; - Utils::PathChooser *m_command; - QLineEdit *m_mime; -}; - -ClangFormatOptionsPageWidget::ClangFormatOptionsPageWidget(ClangFormatSettings *settings) - : m_settings(settings) -{ - auto options = new QGroupBox(Tr::tr("Options")); - options->setEnabled(false); - - auto styleButtonGroup = new QButtonGroup(this); - - auto useCustomizedStyle = new QRadioButton(Tr::tr("Use customized style:")); - styleButtonGroup->addButton(useCustomizedStyle); - - m_configurations = new ConfigurationPanel; - m_configurations->setSettings(m_settings); - m_configurations->setCurrentConfiguration(m_settings->customStyle()); - - m_usePredefinedStyle = new QRadioButton(Tr::tr("Use predefined style:")); - - m_usePredefinedStyle->setChecked(true); - styleButtonGroup->addButton(m_usePredefinedStyle); - - m_predefinedStyle = new QComboBox; - m_predefinedStyle->addItems(m_settings->predefinedStyles()); - const int predefinedStyleIndex = m_predefinedStyle->findText(m_settings->predefinedStyle()); - if (predefinedStyleIndex != -1) - m_predefinedStyle->setCurrentIndex(predefinedStyleIndex); - - m_fallbackStyle = new QComboBox; - m_fallbackStyle->addItems(m_settings->fallbackStyles()); - m_fallbackStyle->setEnabled(false); - const int fallbackStyleIndex = m_fallbackStyle->findText(m_settings->fallbackStyle()); - if (fallbackStyleIndex != -1) - m_fallbackStyle->setCurrentIndex(fallbackStyleIndex); - - m_mime = new QLineEdit(m_settings->supportedMimeTypesAsString()); - - m_command = new Utils::PathChooser; - m_command->setExpectedKind(Utils::PathChooser::ExistingCommand); - m_command->setCommandVersionArguments({"--version"}); - m_command->setPromptDialogTitle( - BeautifierPlugin::msgCommandPromptDialogTitle("Clang Format")); - - if (m_settings->usePredefinedStyle()) - m_usePredefinedStyle->setChecked(true); - else - useCustomizedStyle->setChecked(true); - - using namespace Layouting; - - Form { - m_usePredefinedStyle, m_predefinedStyle, br, - empty, Row { Tr::tr("Fallback style:"), m_fallbackStyle }, br, - useCustomizedStyle, m_configurations, br, - }.attachTo(options); - - Column { - Group { - title(Tr::tr("Configuration")), - Form { - Tr::tr("Clang Format command:"), m_command, br, - Tr::tr("Restrict to MIME types:"), m_mime - } - }, - options, - st - }.attachTo(this); - - connect(m_command, &Utils::PathChooser::validChanged, options, &QWidget::setEnabled); - connect(m_predefinedStyle, &QComboBox::currentTextChanged, this, [this](const QString &item) { - m_fallbackStyle->setEnabled(item == "File"); - }); - connect(m_usePredefinedStyle, &QRadioButton::toggled, this, [this](bool checked) { - m_fallbackStyle->setEnabled(checked && m_predefinedStyle->currentText() == "File"); - m_predefinedStyle->setEnabled(checked); - }); - - // might trigger PathChooser::validChanged, so so after the connect above - m_command->setFilePath(m_settings->command()); -} - -void ClangFormatOptionsPageWidget::apply() -{ - m_settings->setCommand(m_command->filePath()); - m_settings->setSupportedMimeTypes(m_mime->text()); - m_settings->setUsePredefinedStyle(m_usePredefinedStyle->isChecked()); - m_settings->setPredefinedStyle(m_predefinedStyle->currentText()); - m_settings->setFallbackStyle(m_fallbackStyle->currentText()); - m_settings->setCustomStyle(m_configurations->currentConfiguration()); - m_settings->save(); - - // update since not all MIME types are accepted (invalids or duplicates) - m_mime->setText(m_settings->supportedMimeTypesAsString()); -} - -ClangFormatOptionsPage::ClangFormatOptionsPage(ClangFormatSettings *settings) -{ - setId("ClangFormat"); - setDisplayName(Tr::tr("Clang Format")); - setCategory(Constants::OPTION_CATEGORY); - setWidgetCreator([settings] { return new ClangFormatOptionsPageWidget(settings); }); -} - -} // Beautifier::Internal diff --git a/src/plugins/beautifier/clangformat/clangformatoptionspage.h b/src/plugins/beautifier/clangformat/clangformatoptionspage.h deleted file mode 100644 index e9a845af267..00000000000 --- a/src/plugins/beautifier/clangformat/clangformatoptionspage.h +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (C) 2016 Lorenz Haas -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include - -namespace Beautifier::Internal { - -class ClangFormatSettings; - -class ClangFormatOptionsPage final : public Core::IOptionsPage -{ -public: - explicit ClangFormatOptionsPage(ClangFormatSettings *settings); -}; - -} // Beautifier::Internal diff --git a/src/plugins/beautifier/clangformat/clangformatsettings.cpp b/src/plugins/beautifier/clangformat/clangformatsettings.cpp index 16a2225cd97..dc061ed9658 100644 --- a/src/plugins/beautifier/clangformat/clangformatsettings.cpp +++ b/src/plugins/beautifier/clangformat/clangformatsettings.cpp @@ -4,43 +4,80 @@ #include "clangformatsettings.h" #include "../beautifierconstants.h" +#include "../beautifierplugin.h" #include "../beautifiertr.h" - -#include -#include +#include "../configurationpanel.h" #include +#include +#include + +#include +#include +#include +#include +#include +#include + +using namespace Utils; + namespace Beautifier::Internal { -const char USE_PREDEFINED_STYLE[] = "usePredefinedStyle"; -const char PREDEFINED_STYLE[] = "predefinedStyle"; -const char FALLBACK_STYLE[] = "fallbackStyle"; -const char CUSTOM_STYLE[] = "customStyle"; const char SETTINGS_NAME[] = "clangformat"; -ClangFormatSettings::ClangFormatSettings() : - AbstractSettings(SETTINGS_NAME, ".clang-format") +ClangFormatSettings::ClangFormatSettings() + : AbstractSettings(SETTINGS_NAME, ".clang-format") { - setCommand("clang-format"); - m_settings.insert(USE_PREDEFINED_STYLE, QVariant(true)); - m_settings.insert(PREDEFINED_STYLE, "LLVM"); - m_settings.insert(FALLBACK_STYLE, "Default"); - m_settings.insert(CUSTOM_STYLE, QVariant()); - read(); -} + command.setDefaultValue("clang-format"); + command.setPromptDialogTitle(BeautifierPlugin::msgCommandPromptDialogTitle("Clang Format")); + command.setLabelText(Tr::tr("Clang Format command:")); -QString ClangFormatSettings::documentationFilePath() const -{ - return (Core::ICore::userResourcePath() / Beautifier::Constants::SETTINGS_DIRNAME - / Beautifier::Constants::DOCUMENTATION_DIRNAME / SETTINGS_NAME) - .stringAppended(".xml") - .toString(); + registerAspect(&usePredefinedStyle); + usePredefinedStyle.setSettingsKey("usePredefinedStyle"); + usePredefinedStyle.setLabelText(Tr::tr("Use predefined style:")); + usePredefinedStyle.setDefaultValue(true); + + registerAspect(&predefinedStyle); + predefinedStyle.setSettingsKey("predefinedStyle"); + predefinedStyle.setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox); + predefinedStyle.addOption("LLVM"); + predefinedStyle.addOption("Google"); + predefinedStyle.addOption("Chromium"); + predefinedStyle.addOption("Mozilla"); + predefinedStyle.addOption("WebKit"); + predefinedStyle.addOption("File"); + predefinedStyle.setDefaultValue("LLVM"); + + registerAspect(&fallbackStyle); + fallbackStyle.setSettingsKey("fallbackStyle"); + fallbackStyle.setDisplayStyle(SelectionAspect::DisplayStyle::ComboBox); + fallbackStyle.addOption("Default"); + fallbackStyle.addOption("None"); + fallbackStyle.addOption("LLVM"); + fallbackStyle.addOption("Google"); + fallbackStyle.addOption("Chromium"); + fallbackStyle.addOption("Mozilla"); + fallbackStyle.addOption("WebKit"); + fallbackStyle.setDefaultValue("Default"); + + registerAspect(&predefinedStyle); + predefinedStyle.setSettingsKey("predefinedStyle"); + predefinedStyle.setDefaultValue("LLVM"); + + registerAspect(&customStyle); + customStyle.setSettingsKey("customStyle"); + + documentationFilePath.setFilePath(Core::ICore::userResourcePath(Constants::SETTINGS_DIRNAME) + .pathAppended(Constants::DOCUMENTATION_DIRNAME) + .pathAppended(SETTINGS_NAME).stringAppended(".xml")); + + read(); } void ClangFormatSettings::createDocumentationFile() const { - QFile file(documentationFilePath()); + QFile file(documentationFilePath().toFSPathString()); const QFileInfo fi(file); if (!fi.exists()) fi.dir().mkpath(fi.absolutePath()); @@ -144,60 +181,6 @@ QStringList ClangFormatSettings::completerWords() }; } -bool ClangFormatSettings::usePredefinedStyle() const -{ - return m_settings.value(USE_PREDEFINED_STYLE).toBool(); -} - -void ClangFormatSettings::setUsePredefinedStyle(bool usePredefinedStyle) -{ - m_settings.insert(USE_PREDEFINED_STYLE, QVariant(usePredefinedStyle)); -} - -QString ClangFormatSettings::predefinedStyle() const -{ - return m_settings.value(PREDEFINED_STYLE).toString(); -} - -void ClangFormatSettings::setPredefinedStyle(const QString &predefinedStyle) -{ - const QStringList test = predefinedStyles(); - if (test.contains(predefinedStyle)) - m_settings.insert(PREDEFINED_STYLE, QVariant(predefinedStyle)); -} - -QString ClangFormatSettings::fallbackStyle() const -{ - return m_settings.value(FALLBACK_STYLE).toString(); -} - -void ClangFormatSettings::setFallbackStyle(const QString &fallbackStyle) -{ - const QStringList test = fallbackStyles(); - if (test.contains(fallbackStyle)) - m_settings.insert(FALLBACK_STYLE, QVariant(fallbackStyle)); -} - -QString ClangFormatSettings::customStyle() const -{ - return m_settings.value(CUSTOM_STYLE).toString(); -} - -void ClangFormatSettings::setCustomStyle(const QString &customStyle) -{ - m_settings.insert(CUSTOM_STYLE, QVariant(customStyle)); -} - -QStringList ClangFormatSettings::predefinedStyles() const -{ - return {"LLVM", "Google", "Chromium", "Mozilla", "WebKit", "File"}; -} - -QStringList ClangFormatSettings::fallbackStyles() const -{ - return {"Default", "None", "LLVM", "Google", "Chromium", "Mozilla", "WebKit"}; -} - QString ClangFormatSettings::styleFileName(const QString &key) const { return m_styleDir.absolutePath() + '/' + key + '/' + m_ending; @@ -213,4 +196,86 @@ void ClangFormatSettings::readStyles() } } +class ClangFormatOptionsPageWidget : public Core::IOptionsPageWidget +{ +public: + explicit ClangFormatOptionsPageWidget(ClangFormatSettings *settings) + { + ClangFormatSettings &s = *settings; + QGroupBox *options = nullptr; + + auto predefinedStyleButton = new QRadioButton; + s.usePredefinedStyle.adoptButton(predefinedStyleButton); + + auto customizedStyleButton = new QRadioButton(Tr::tr("Use customized style:")); + + auto styleButtonGroup = new QButtonGroup; + styleButtonGroup->addButton(predefinedStyleButton); + styleButtonGroup->addButton(customizedStyleButton); + + auto configurations = new ConfigurationPanel(this); + configurations->setSettings(&s); + configurations->setCurrentConfiguration(s.customStyle()); + + using namespace Layouting; + + auto fallbackBlob = Row { noMargin, Tr::tr("Fallback style:"), s.fallbackStyle }.emerge(); + + auto predefinedBlob = Column { noMargin, s.predefinedStyle, fallbackBlob }.emerge(); + + Column { + Group { + title(Tr::tr("Configuration")), + Form { + s.command, br, + s.supportedMimeTypes + } + }, + Group { + title(Tr::tr("Options")), + bindTo(&options), + Form { + s.usePredefinedStyle, predefinedBlob, br, + customizedStyleButton, configurations, + }, + }, + st + }.attachTo(this); + + if (s.usePredefinedStyle.value()) + predefinedStyleButton->click(); + else + customizedStyleButton->click(); + + const auto updateEnabled = [&s, styleButtonGroup, predefinedBlob, fallbackBlob, + configurations, predefinedStyleButton] { + const bool predefSelected = styleButtonGroup->checkedButton() == predefinedStyleButton; + predefinedBlob->setEnabled(predefSelected); + fallbackBlob->setEnabled(predefSelected && s.predefinedStyle.volatileValue().toInt() == 5); // File + configurations->setEnabled(!predefSelected); + }; + updateEnabled(); + connect(styleButtonGroup, &QButtonGroup::buttonClicked, this, updateEnabled); + connect(&s.predefinedStyle, &SelectionAspect::volatileValueChanged, this, updateEnabled); + + setOnApply([settings, configurations] { + settings->customStyle.setValue(configurations->currentConfiguration()); + settings->save(); + }); + + s.read(); + + connect(s.command.pathChooser(), &PathChooser::validChanged, options, &QWidget::setEnabled); + options->setEnabled(s.command.pathChooser()->isValid()); + } +}; + +ClangFormatOptionsPage::ClangFormatOptionsPage(ClangFormatSettings *settings) +{ + setId("ClangFormat"); + setDisplayName(Tr::tr("Clang Format")); + setCategory(Constants::OPTION_CATEGORY); + setWidgetCreator([settings] { return new ClangFormatOptionsPageWidget(settings); }); +} + } // Beautifier::Internal diff --git a/src/plugins/beautifier/clangformat/clangformatsettings.h b/src/plugins/beautifier/clangformat/clangformatsettings.h index 310eeaf8926..22c16eafc3d 100644 --- a/src/plugins/beautifier/clangformat/clangformatsettings.h +++ b/src/plugins/beautifier/clangformat/clangformatsettings.h @@ -12,24 +12,14 @@ class ClangFormatSettings : public AbstractSettings public: explicit ClangFormatSettings(); - QString documentationFilePath() const override; void createDocumentationFile() const override; + QStringList completerWords() override; - bool usePredefinedStyle() const; - void setUsePredefinedStyle(bool usePredefinedStyle); - - QString predefinedStyle() const; - void setPredefinedStyle(const QString &predefinedStyle); - - QString fallbackStyle() const; - void setFallbackStyle(const QString &fallbackStyle); - - QString customStyle() const; - void setCustomStyle(const QString &customStyle); - - QStringList predefinedStyles() const; - QStringList fallbackStyles() const; + Utils::BoolAspect usePredefinedStyle; + Utils::SelectionAspect predefinedStyle; + Utils::SelectionAspect fallbackStyle; + Utils::StringAspect customStyle; QString styleFileName(const QString &key) const override; @@ -37,4 +27,10 @@ private: void readStyles() override; }; +class ClangFormatOptionsPage final : public Core::IOptionsPage +{ +public: + explicit ClangFormatOptionsPage(ClangFormatSettings *settings); +}; + } // Beautifier::Internal diff --git a/src/plugins/beautifier/uncrustify/uncrustify.cpp b/src/plugins/beautifier/uncrustify/uncrustify.cpp index 2e6f6d67d59..1439dc315f2 100644 --- a/src/plugins/beautifier/uncrustify/uncrustify.cpp +++ b/src/plugins/beautifier/uncrustify/uncrustify.cpp @@ -54,7 +54,7 @@ Uncrustify::Uncrustify() Core::ActionManager::actionContainer(Constants::MENU_ID)->addMenu(menu); - connect(&m_settings, &UncrustifySettings::supportedMimeTypesChanged, + connect(&m_settings.supportedMimeTypes, &Utils::BaseAspect::changed, this, [this] { updateActions(Core::EditorManager::currentEditor()); }); } diff --git a/src/plugins/beautifier/uncrustify/uncrustify.h b/src/plugins/beautifier/uncrustify/uncrustify.h index 1261576274c..685a29c25a1 100644 --- a/src/plugins/beautifier/uncrustify/uncrustify.h +++ b/src/plugins/beautifier/uncrustify/uncrustify.h @@ -5,7 +5,6 @@ #include "../beautifierabstracttool.h" -#include "uncrustifyoptionspage.h" #include "uncrustifysettings.h" namespace Beautifier::Internal { diff --git a/src/plugins/beautifier/uncrustify/uncrustifyoptionspage.cpp b/src/plugins/beautifier/uncrustify/uncrustifyoptionspage.cpp deleted file mode 100644 index 8da74a71973..00000000000 --- a/src/plugins/beautifier/uncrustify/uncrustifyoptionspage.cpp +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright (C) 2016 Lorenz Haas -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#include "uncrustifyoptionspage.h" - -#include "uncrustifyconstants.h" -#include "uncrustifysettings.h" - -#include "../beautifierconstants.h" -#include "../beautifierplugin.h" -#include "../beautifiertr.h" -#include "../configurationpanel.h" - -#include -#include - -#include -#include -#include -#include - -namespace Beautifier::Internal { - -class UncrustifyOptionsPageWidget : public Core::IOptionsPageWidget -{ -public: - explicit UncrustifyOptionsPageWidget(UncrustifySettings *settings); - - void apply() final; - -private: - UncrustifySettings *m_settings; - - Utils::PathChooser *m_command; - QLineEdit *m_mime; - QCheckBox *m_useOtherFiles; - QCheckBox *m_useSpecificFile; - Utils::PathChooser *m_uncrusifyFilePath; - QCheckBox *m_useHomeFile; - QCheckBox *m_useCustomStyle; - ConfigurationPanel *m_configurations; - QCheckBox *m_formatEntireFileFallback; -}; - -UncrustifyOptionsPageWidget::UncrustifyOptionsPageWidget(UncrustifySettings *settings) - : m_settings(settings) -{ - m_command = new Utils::PathChooser; - - m_mime = new QLineEdit(m_settings->supportedMimeTypesAsString()); - - m_useOtherFiles = new QCheckBox(Tr::tr("Use file uncrustify.cfg defined in project files")); - m_useOtherFiles->setChecked(m_settings->useOtherFiles()); - - m_useSpecificFile = new QCheckBox(Tr::tr("Use file specific uncrustify.cfg")); - m_useSpecificFile->setChecked(m_settings->useSpecificConfigFile()); - - m_uncrusifyFilePath = new Utils::PathChooser; - m_uncrusifyFilePath->setExpectedKind(Utils::PathChooser::File); - m_uncrusifyFilePath->setPromptDialogFilter(Tr::tr("Uncrustify file (*.cfg)")); - m_uncrusifyFilePath->setFilePath(m_settings->specificConfigFile()); - - m_useHomeFile = new QCheckBox(Tr::tr("Use file uncrustify.cfg in HOME") - .replace( "HOME", QDir::toNativeSeparators(QDir::home().absolutePath()))); - m_useHomeFile->setChecked(m_settings->useHomeFile()); - - m_useCustomStyle = new QCheckBox(Tr::tr("Use customized style:")); - m_useCustomStyle->setChecked(m_settings->useCustomStyle()); - - m_configurations = new ConfigurationPanel; - m_configurations->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - m_configurations->setSettings(m_settings); - m_configurations->setCurrentConfiguration(m_settings->customStyle()); - - m_formatEntireFileFallback = new QCheckBox(Tr::tr("Format entire file if no text was selected")); - m_formatEntireFileFallback->setToolTip(Tr::tr("For action Format Selected Text")); - m_formatEntireFileFallback->setChecked(m_settings->formatEntireFileFallback()); - - m_command->setExpectedKind(Utils::PathChooser::ExistingCommand); - m_command->setCommandVersionArguments({"--version"}); - m_command->setPromptDialogTitle(BeautifierPlugin::msgCommandPromptDialogTitle( - Tr::tr(Constants::UNCRUSTIFY_DISPLAY_NAME))); - m_command->setFilePath(m_settings->command()); - - auto options = new QGroupBox(Tr::tr("Options")); - - using namespace Layouting; - - Column { - m_useOtherFiles, - Row { m_useSpecificFile, m_uncrusifyFilePath }, - m_useHomeFile, - Row { m_useCustomStyle, m_configurations }, - m_formatEntireFileFallback - }.attachTo(options); - - Column { - Group { - title(Tr::tr("Configuration")), - Form { - Tr::tr("Uncrustify command:"), m_command, br, - Tr::tr("Restrict to MIME types:"), m_mime - } - }, - options, - st - }.attachTo(this); - - connect(m_command, &Utils::PathChooser::validChanged, options, &QWidget::setEnabled); -} - -void UncrustifyOptionsPageWidget::apply() -{ - m_settings->setCommand(m_command->filePath()); - m_settings->setSupportedMimeTypes(m_mime->text()); - m_settings->setUseOtherFiles(m_useOtherFiles->isChecked()); - m_settings->setUseHomeFile(m_useHomeFile->isChecked()); - m_settings->setUseSpecificConfigFile(m_useSpecificFile->isChecked()); - m_settings->setSpecificConfigFile(m_uncrusifyFilePath->filePath()); - m_settings->setUseCustomStyle(m_useCustomStyle->isChecked()); - m_settings->setCustomStyle(m_configurations->currentConfiguration()); - m_settings->setFormatEntireFileFallback(m_formatEntireFileFallback->isChecked()); - m_settings->save(); - - // update since not all MIME types are accepted (invalids or duplicates) - m_mime->setText(m_settings->supportedMimeTypesAsString()); -} - -UncrustifyOptionsPage::UncrustifyOptionsPage(UncrustifySettings *settings) -{ - setId("Uncrustify"); - setDisplayName(Tr::tr("Uncrustify")); - setCategory(Constants::OPTION_CATEGORY); - setWidgetCreator([settings] { return new UncrustifyOptionsPageWidget(settings); }); -} - -} // Beautifier::Internal diff --git a/src/plugins/beautifier/uncrustify/uncrustifyoptionspage.h b/src/plugins/beautifier/uncrustify/uncrustifyoptionspage.h deleted file mode 100644 index a8512d0da62..00000000000 --- a/src/plugins/beautifier/uncrustify/uncrustifyoptionspage.h +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (C) 2016 Lorenz Haas -// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 - -#pragma once - -#include - -namespace Beautifier::Internal { - -class UncrustifySettings; - -class UncrustifyOptionsPage final : public Core::IOptionsPage -{ -public: - explicit UncrustifyOptionsPage(UncrustifySettings *settings); -}; - -} // Beautifier::Internal diff --git a/src/plugins/beautifier/uncrustify/uncrustifysettings.cpp b/src/plugins/beautifier/uncrustify/uncrustifysettings.cpp index a284d780b6c..8fefa851d0c 100644 --- a/src/plugins/beautifier/uncrustify/uncrustifysettings.cpp +++ b/src/plugins/beautifier/uncrustify/uncrustifysettings.cpp @@ -3,14 +3,25 @@ #include "uncrustifysettings.h" +#include "uncrustifyconstants.h" #include "../beautifierconstants.h" +#include "../beautifierplugin.h" +#include "../beautifiertr.h" +#include "../configurationpanel.h" #include + +#include +#include #include +#include #include #include #include +#include +#include +#include #include #include @@ -18,110 +29,57 @@ using namespace Utils; namespace Beautifier::Internal { -const char USE_OTHER_FILES[] = "useOtherFiles"; -const char USE_HOME_FILE[] = "useHomeFile"; -const char USE_SPECIFIC_CONFIG_FILE_PATH[] = "useSpecificConfigFile"; -const char SPECIFIC_CONFIG_FILE_PATH[] = "specificConfigFile"; -const char USE_CUSTOM_STYLE[] = "useCustomStyle"; -const char CUSTOM_STYLE[] = "customStyle"; -const char FORMAT_ENTIRE_FILE_FALLBACK[] = "formatEntireFileFallback"; -const char SETTINGS_NAME[] = "uncrustify"; +const char SETTINGS_NAME[] = "uncrustify"; -UncrustifySettings::UncrustifySettings() : - AbstractSettings(SETTINGS_NAME, ".cfg") +UncrustifySettings::UncrustifySettings() + : AbstractSettings(SETTINGS_NAME, ".cfg") { setVersionRegExp(QRegularExpression("([0-9]{1})\\.([0-9]{2})")); - setCommand("uncrustify"); - m_settings.insert(USE_OTHER_FILES, QVariant(true)); - m_settings.insert(USE_HOME_FILE, QVariant(false)); - m_settings.insert(USE_CUSTOM_STYLE, QVariant(false)); - m_settings.insert(USE_SPECIFIC_CONFIG_FILE_PATH, QVariant(false)); - m_settings.insert(CUSTOM_STYLE, QVariant()); - m_settings.insert(FORMAT_ENTIRE_FILE_FALLBACK, QVariant(true)); - m_settings.insert(SPECIFIC_CONFIG_FILE_PATH, QVariant()); + + command.setDefaultValue("uncrustify"); + command.setLabelText(Tr::tr("Uncrustify command:")); + command.setPromptDialogTitle(BeautifierPlugin::msgCommandPromptDialogTitle( + Tr::tr(Constants::UNCRUSTIFY_DISPLAY_NAME))); + + registerAspect(&useOtherFiles); + useOtherFiles.setSettingsKey("useOtherFiles"); + useOtherFiles.setDefaultValue(true); + useOtherFiles.setLabelText(Tr::tr("Use file uncrustify.cfg defined in project files")); + + registerAspect(&useHomeFile); + useHomeFile.setSettingsKey("useHomeFile"); + useHomeFile.setLabelText(Tr::tr("Use file uncrustify.cfg in HOME") + .replace( "HOME", QDir::toNativeSeparators(QDir::home().absolutePath()))); + + registerAspect(&useCustomStyle); + useCustomStyle.setSettingsKey("useCustomStyle"); + useCustomStyle.setLabelText(Tr::tr("Use customized style:")); + + registerAspect(&useSpecificConfigFile); + useSpecificConfigFile.setSettingsKey("useSpecificConfigFile"); + useSpecificConfigFile.setLabelText(Tr::tr("Use file specific uncrustify.cfg")); + + registerAspect(&customStyle); + customStyle.setSettingsKey("customStyle"); + + registerAspect(&formatEntireFileFallback); + formatEntireFileFallback.setSettingsKey("formatEntireFileFallback"); + formatEntireFileFallback.setDefaultValue(true); + formatEntireFileFallback.setLabelText(Tr::tr("Format entire file if no text was selected")); + formatEntireFileFallback.setToolTip(Tr::tr("For action Format Selected Text")); + + registerAspect(&specificConfigFile); + specificConfigFile.setSettingsKey("specificConfigFile"); + specificConfigFile.setExpectedKind(Utils::PathChooser::File); + specificConfigFile.setPromptDialogFilter(Tr::tr("Uncrustify file (*.cfg)")); + + documentationFilePath.setFilePath(Core::ICore::userResourcePath(Constants::SETTINGS_DIRNAME) + .pathAppended(Constants::DOCUMENTATION_DIRNAME) + .pathAppended(SETTINGS_NAME).stringAppended(".xml")); + read(); } -UncrustifySettings::~UncrustifySettings() = default; - -bool UncrustifySettings::useOtherFiles() const -{ - return m_settings.value(USE_OTHER_FILES).toBool(); -} - -void UncrustifySettings::setUseOtherFiles(bool useOtherFiles) -{ - m_settings.insert(USE_OTHER_FILES, QVariant(useOtherFiles)); -} - -bool UncrustifySettings::useHomeFile() const -{ - return m_settings.value(USE_HOME_FILE).toBool(); -} - -void UncrustifySettings::setUseHomeFile(bool useHomeFile) -{ - m_settings.insert(USE_HOME_FILE, QVariant(useHomeFile)); -} - -FilePath UncrustifySettings::specificConfigFile() const -{ - return FilePath::fromString(m_settings.value(SPECIFIC_CONFIG_FILE_PATH).toString()); -} - -void UncrustifySettings::setSpecificConfigFile(const FilePath &filePath) -{ - m_settings.insert(SPECIFIC_CONFIG_FILE_PATH, QVariant(filePath.toString())); -} - -bool UncrustifySettings::useSpecificConfigFile() const -{ - return m_settings.value(USE_SPECIFIC_CONFIG_FILE_PATH).toBool(); -} - -void UncrustifySettings::setUseSpecificConfigFile(bool useConfigFile) -{ - m_settings.insert(USE_SPECIFIC_CONFIG_FILE_PATH, QVariant(useConfigFile)); -} - -bool UncrustifySettings::useCustomStyle() const -{ - return m_settings.value(USE_CUSTOM_STYLE).toBool(); -} - -void UncrustifySettings::setUseCustomStyle(bool useCustomStyle) -{ - m_settings.insert(USE_CUSTOM_STYLE, QVariant(useCustomStyle)); -} - -QString UncrustifySettings::customStyle() const -{ - return m_settings.value(CUSTOM_STYLE).toString(); -} - -void UncrustifySettings::setCustomStyle(const QString &customStyle) -{ - m_settings.insert(CUSTOM_STYLE, QVariant(customStyle)); -} - -bool UncrustifySettings::formatEntireFileFallback() const -{ - return m_settings.value(FORMAT_ENTIRE_FILE_FALLBACK).toBool(); -} - -void UncrustifySettings::setFormatEntireFileFallback(bool formatEntireFileFallback) -{ - m_settings.insert(FORMAT_ENTIRE_FILE_FALLBACK, QVariant(formatEntireFileFallback)); -} - -QString UncrustifySettings::documentationFilePath() const -{ - return (Core::ICore::userResourcePath() / Beautifier::Constants::SETTINGS_DIRNAME - / Beautifier::Constants::DOCUMENTATION_DIRNAME / SETTINGS_NAME) - .stringAppended(".xml") - .toString(); -} - void UncrustifySettings::createDocumentationFile() const { Process process; @@ -131,7 +89,7 @@ void UncrustifySettings::createDocumentationFile() const if (process.result() != ProcessResult::FinishedWithSuccess) return; - QFile file(documentationFilePath()); + QFile file(documentationFilePath().toFSPathString()); const QFileInfo fi(file); if (!fi.exists()) fi.dir().mkpath(fi.absolutePath()); @@ -185,4 +143,62 @@ void UncrustifySettings::createDocumentationFile() const } } +class UncrustifyOptionsPageWidget : public Core::IOptionsPageWidget +{ +public: + explicit UncrustifyOptionsPageWidget(UncrustifySettings *settings) + { + UncrustifySettings &s = *settings; + + auto configurations = new ConfigurationPanel(this); + configurations->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + configurations->setSettings(settings); + configurations->setCurrentConfiguration(settings->customStyle()); + + QGroupBox *options = nullptr; + + using namespace Layouting; + + Column { + Group { + title(Tr::tr("Configuration")), + Form { + s.command, br, + s.supportedMimeTypes, + } + }, + Group { + title(Tr::tr("Options")), + bindTo(&options), + Column { + s.useOtherFiles, + Row { s.useSpecificConfigFile, s.specificConfigFile }, + s.useHomeFile, + Row { s.useCustomStyle, configurations }, + s.formatEntireFileFallback + }, + }, + st + }.attachTo(this); + + s.read(); + + connect(s.command.pathChooser(), &PathChooser::validChanged, options, &QWidget::setEnabled); + options->setEnabled(s.command.pathChooser()->isValid()); + + setOnApply([&s, configurations] { + s.customStyle.setValue(configurations->currentConfiguration()); + s.save(); + }); + } +}; + +UncrustifyOptionsPage::UncrustifyOptionsPage(UncrustifySettings *settings) +{ + setId("Uncrustify"); + setDisplayName(Tr::tr("Uncrustify")); + setCategory(Constants::OPTION_CATEGORY); + setWidgetCreator([settings] { return new UncrustifyOptionsPageWidget(settings); }); +} + } // Beautifier::Internal diff --git a/src/plugins/beautifier/uncrustify/uncrustifysettings.h b/src/plugins/beautifier/uncrustify/uncrustifysettings.h index d57bfe6d39e..c0de1b891b2 100644 --- a/src/plugins/beautifier/uncrustify/uncrustifysettings.h +++ b/src/plugins/beautifier/uncrustify/uncrustifysettings.h @@ -5,41 +5,30 @@ #include "../abstractsettings.h" -namespace Beautifier { -namespace Internal { +namespace Beautifier::Internal { class UncrustifySettings : public AbstractSettings { - Q_OBJECT - public: UncrustifySettings(); - ~UncrustifySettings() override; - bool useOtherFiles() const; - void setUseOtherFiles(bool useOtherFiles); - - bool useHomeFile() const; - void setUseHomeFile(bool useHomeFile); - - bool useCustomStyle() const; - void setUseCustomStyle(bool useCustomStyle); - - QString customStyle() const; - void setCustomStyle(const QString &customStyle); - - bool formatEntireFileFallback() const; - void setFormatEntireFileFallback(bool formatEntireFileFallback); - - QString documentationFilePath() const override; void createDocumentationFile() const override; - Utils::FilePath specificConfigFile() const; - void setSpecificConfigFile(const Utils::FilePath &filePath); + Utils::BoolAspect useOtherFiles; + Utils::BoolAspect useHomeFile; + Utils::BoolAspect useCustomStyle; - bool useSpecificConfigFile() const; - void setUseSpecificConfigFile(bool useConfigFile); + Utils::StringAspect customStyle; + Utils::BoolAspect formatEntireFileFallback; + + Utils::FilePathAspect specificConfigFile; + Utils::BoolAspect useSpecificConfigFile; }; -} // namespace Internal -} // namespace Beautifier +class UncrustifyOptionsPage final : public Core::IOptionsPage +{ +public: + explicit UncrustifyOptionsPage(UncrustifySettings *settings); +}; + +} // Beautifier::Internal