diff --git a/src/NotepadNext/ApplicationSettings.cpp b/src/NotepadNext/ApplicationSettings.cpp index f655b6a16..35ef1480e 100644 --- a/src/NotepadNext/ApplicationSettings.cpp +++ b/src/NotepadNext/ApplicationSettings.cpp @@ -68,3 +68,6 @@ CREATE_SETTING(Editor, AdditionalWordChars, additionalWordChars, QString, QStrin CREATE_SETTING(Editor, DefaultEOLMode, defaultEOLMode, QString, QStringLiteral("")) CREATE_SETTING(Editor, URLHighlighting, urlHighlighting, bool, true) CREATE_SETTING(Editor, ShowLineNumbers, showLineNumbers, bool, true) +CREATE_SETTING(Editor, IndentSize, indentSize, int, 4) +CREATE_SETTING(Editor, TabChar, tabChar, bool, true) +CREATE_SETTING(Editor, TabCharSpaces, tabCharSpaces, bool, false) diff --git a/src/NotepadNext/ApplicationSettings.h b/src/NotepadNext/ApplicationSettings.h index 666aed92b..c2b8282ec 100644 --- a/src/NotepadNext/ApplicationSettings.h +++ b/src/NotepadNext/ApplicationSettings.h @@ -110,4 +110,7 @@ class ApplicationSettings : public QSettings DEFINE_SETTING(DefaultEOLMode, defaultEOLMode, QString) DEFINE_SETTING(URLHighlighting, urlHighlighting, bool) DEFINE_SETTING(ShowLineNumbers, showLineNumbers, bool) + DEFINE_SETTING(IndentSize, indentSize, int); + DEFINE_SETTING(TabChar, tabChar, bool); + DEFINE_SETTING(TabCharSpaces, tabCharSpaces, bool); }; diff --git a/src/NotepadNext/EditorManager.cpp b/src/NotepadNext/EditorManager.cpp index e60f2911f..aa0860984 100644 --- a/src/NotepadNext/EditorManager.cpp +++ b/src/NotepadNext/EditorManager.cpp @@ -128,6 +128,19 @@ EditorManager::EditorManager(ApplicationSettings *settings, QObject *parent) } } }); + + connect(settings, &ApplicationSettings::indentSizeChanged, this, [=](int indentSize){ + for (auto &editor : getEditors()) { + editor->setTabWidth(indentSize); + editor->setIndent(indentSize); + } + }); + + connect(settings, &ApplicationSettings::tabCharChanged, this, [=](bool useTabs){ + for (auto &editor : getEditors()) { + editor->setUseTabs(useTabs); + } + }); } ScintillaNext *EditorManager::createEditor(const QString &name) @@ -216,7 +229,9 @@ void EditorManager::setupEditor(ScintillaNext *editor) editor->setScrollWidth(1); editor->setTabDrawMode(SCTD_STRIKEOUT); - editor->setTabWidth(4); + editor->setTabWidth(settings->indentSize()); + editor->setIndent(settings->indentSize()); + editor->setUseTabs(settings->tabChar()); editor->setBackSpaceUnIndents(true); editor->setCaretLineVisible(true); diff --git a/src/NotepadNext/dialogs/PreferencesDialog.cpp b/src/NotepadNext/dialogs/PreferencesDialog.cpp index 7fdcbc887..082cc8b45 100644 --- a/src/NotepadNext/dialogs/PreferencesDialog.cpp +++ b/src/NotepadNext/dialogs/PreferencesDialog.cpp @@ -99,6 +99,13 @@ PreferencesDialog::PreferencesDialog(ApplicationSettings *settings, QWidget *par MapSettingToCheckBox(ui->checkBoxHighlightURLs, &ApplicationSettings::urlHighlighting, &ApplicationSettings::setURLHighlighting, &ApplicationSettings::urlHighlightingChanged); MapSettingToCheckBox(ui->checkBoxShowLineNumbers, &ApplicationSettings::showLineNumbers, &ApplicationSettings::setShowLineNumbers, &ApplicationSettings::showLineNumbersChanged); + + ui->sbpIndentSize->setValue(settings->indentSize()); + connect(ui->sbpIndentSize, QOverload::of(&QSpinBox::valueChanged), settings, &ApplicationSettings::setIndentSize); + connect(settings, &::ApplicationSettings::fontSizeChanged, ui->sbpIndentSize, &QSpinBox::setValue); + + MapSettingToRadioButton(ui->rbTabChar, &ApplicationSettings::tabChar, &ApplicationSettings::setTabChar, &ApplicationSettings::tabCharChanged); + MapSettingToRadioButton(ui->rbSpaceChar, &ApplicationSettings::tabCharSpaces, &ApplicationSettings::setTabCharSpaces, &ApplicationSettings::tabCharSpacesChanged); } PreferencesDialog::~PreferencesDialog() @@ -134,6 +141,17 @@ void PreferencesDialog::MapSettingToGroupBox(QGroupBox *groupBox, Func1 getter, connect(groupBox, &QGroupBox::toggled, settings, setter); } +template +void PreferencesDialog::MapSettingToRadioButton(QRadioButton *radioButton, Func1 getter, Func2 setter, Func3 notifier) const +{ + // Get the value and set the radiobutton state + radioButton->setChecked(std::bind(getter, settings)()); + + // Set up two way connection + connect(settings, notifier, radioButton, &QRadioButton::setChecked); + connect(radioButton, &QRadioButton::toggled, settings, setter); +} + void PreferencesDialog::populateTranslationComboBox() { NotepadNextApplication *app = qobject_cast(qApp); diff --git a/src/NotepadNext/dialogs/PreferencesDialog.h b/src/NotepadNext/dialogs/PreferencesDialog.h index 985a9b8b4..d90f777fa 100644 --- a/src/NotepadNext/dialogs/PreferencesDialog.h +++ b/src/NotepadNext/dialogs/PreferencesDialog.h @@ -25,6 +25,7 @@ #include #include #include +#include namespace Ui { class PreferencesDialog; @@ -52,6 +53,9 @@ class PreferencesDialog : public QDialog template void MapSettingToGroupBox(QGroupBox *groupBox, Func1 getter, Func2 setter, Func3 notifier) const; + template + void MapSettingToRadioButton(QRadioButton *radioButton, Func1 getter, Func2 setter, Func3 notifier) const; + void populateTranslationComboBox(); }; diff --git a/src/NotepadNext/dialogs/PreferencesDialog.ui b/src/NotepadNext/dialogs/PreferencesDialog.ui index f78aa9e3e..d094ad234 100644 --- a/src/NotepadNext/dialogs/PreferencesDialog.ui +++ b/src/NotepadNext/dialogs/PreferencesDialog.ui @@ -23,9 +23,9 @@ 0 - 0 - 783 - 545 + -281 + 762 + 816 @@ -194,6 +194,9 @@ + + + @@ -208,6 +211,68 @@ + + + + Indentation + + + + + + + + + Indent size: + + + + + + + + 40 + 16777215 + + + + Qt::AlignCenter + + + 1 + + + 4 + + + + + + + + + + Indent using: + + + + + + + Tab character + + + + + + + Space character(s) + + + + + +