diff options
Diffstat (limited to 'src/plugins/beautifier/clangformat/clangformatsettings.cpp')
-rw-r--r-- | src/plugins/beautifier/clangformat/clangformatsettings.cpp | 202 |
1 files changed, 131 insertions, 71 deletions
diff --git a/src/plugins/beautifier/clangformat/clangformatsettings.cpp b/src/plugins/beautifier/clangformat/clangformatsettings.cpp index 16a2225cd97..6a31667edb7 100644 --- a/src/plugins/beautifier/clangformat/clangformatsettings.cpp +++ b/src/plugins/beautifier/clangformat/clangformatsettings.cpp @@ -4,43 +4,75 @@ #include "clangformatsettings.h" #include "../beautifierconstants.h" +#include "../beautifierplugin.h" #include "../beautifiertr.h" +#include "../configurationpanel.h" + +#include <coreplugin/icore.h> + +#include <utils/layoutbuilder.h> +#include <utils/pathchooser.h> #include <QDateTime> #include <QXmlStreamWriter> +#include <QButtonGroup> +#include <QComboBox> +#include <QGroupBox> +#include <QRadioButton> -#include <coreplugin/icore.h> +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(); + usePredefinedStyle.setSettingsKey("usePredefinedStyle"); + usePredefinedStyle.setLabelText(Tr::tr("Use predefined style:")); + usePredefinedStyle.setDefaultValue(true); + + 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"); + + 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"); + + predefinedStyle.setSettingsKey("predefinedStyle"); + predefinedStyle.setDefaultValue("LLVM"); + + customStyle.setSettingsKey("customStyle"); + + documentationFilePath = 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,73 +176,101 @@ QStringList ClangFormatSettings::completerWords() }; } -bool ClangFormatSettings::usePredefinedStyle() const +QString ClangFormatSettings::styleFileName(const QString &key) const { - return m_settings.value(USE_PREDEFINED_STYLE).toBool(); + return m_styleDir.absolutePath() + '/' + key + '/' + m_ending; } -void ClangFormatSettings::setUsePredefinedStyle(bool usePredefinedStyle) +void ClangFormatSettings::readStyles() { - m_settings.insert(USE_PREDEFINED_STYLE, QVariant(usePredefinedStyle)); + const QStringList dirs = m_styleDir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); + for (const QString &dir : dirs) { + QFile file(m_styleDir.absoluteFilePath(dir + '/' + m_ending)); + if (file.open(QIODevice::ReadOnly)) + m_styles.insert(dir, QString::fromLocal8Bit(file.readAll())); + } } -QString ClangFormatSettings::predefinedStyle() const +class ClangFormatOptionsPageWidget : public Core::IOptionsPageWidget { - return m_settings.value(PREDEFINED_STYLE).toString(); -} +public: + explicit ClangFormatOptionsPageWidget(ClangFormatSettings *settings) + { + ClangFormatSettings &s = *settings; + QGroupBox *options = nullptr; -void ClangFormatSettings::setPredefinedStyle(const QString &predefinedStyle) -{ - const QStringList test = predefinedStyles(); - if (test.contains(predefinedStyle)) - m_settings.insert(PREDEFINED_STYLE, QVariant(predefinedStyle)); -} + auto predefinedStyleButton = new QRadioButton; + s.usePredefinedStyle.adoptButton(predefinedStyleButton); -QString ClangFormatSettings::fallbackStyle() const -{ - return m_settings.value(FALLBACK_STYLE).toString(); -} + auto customizedStyleButton = new QRadioButton(Tr::tr("Use customized style:")); -void ClangFormatSettings::setFallbackStyle(const QString &fallbackStyle) -{ - const QStringList test = fallbackStyles(); - if (test.contains(fallbackStyle)) - m_settings.insert(FALLBACK_STYLE, QVariant(fallbackStyle)); -} + auto styleButtonGroup = new QButtonGroup; + styleButtonGroup->addButton(predefinedStyleButton); + styleButtonGroup->addButton(customizedStyleButton); -QString ClangFormatSettings::customStyle() const -{ - return m_settings.value(CUSTOM_STYLE).toString(); -} + auto configurations = new ConfigurationPanel(this); + configurations->setSettings(&s); + configurations->setCurrentConfiguration(s.customStyle()); -void ClangFormatSettings::setCustomStyle(const QString &customStyle) -{ - m_settings.insert(CUSTOM_STYLE, QVariant(customStyle)); -} + using namespace Layouting; -QStringList ClangFormatSettings::predefinedStyles() const -{ - return {"LLVM", "Google", "Chromium", "Mozilla", "WebKit", "File"}; -} + auto fallbackBlob = Row { noMargin, Tr::tr("Fallback style:"), s.fallbackStyle }.emerge(); -QStringList ClangFormatSettings::fallbackStyles() const -{ - return {"Default", "None", "LLVM", "Google", "Chromium", "Mozilla", "WebKit"}; -} + auto predefinedBlob = Column { noMargin, s.predefinedStyle, fallbackBlob }.emerge(); -QString ClangFormatSettings::styleFileName(const QString &key) const -{ - return m_styleDir.absolutePath() + '/' + key + '/' + m_ending; -} + 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); -void ClangFormatSettings::readStyles() -{ - const QStringList dirs = m_styleDir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot); - for (const QString &dir : dirs) { - QFile file(m_styleDir.absoluteFilePath(dir + '/' + m_ending)); - if (file.open(QIODevice::ReadOnly)) - m_styles.insert(dir, QString::fromLocal8Bit(file.readAll())); + 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 |