TextEditor: Partially apply SettingsPage pattern to completion settings

Change-Id: Ieb8547bab74c6a2d6489a6bf53b7f224003e0401
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2020-01-17 16:44:30 +01:00
parent f2351b06e0
commit 11b7074170
3 changed files with 129 additions and 159 deletions

View File

@@ -35,41 +35,43 @@
#include <QTextStream> #include <QTextStream>
using namespace TextEditor;
using namespace TextEditor::Internal;
using namespace CppTools; using namespace CppTools;
CompletionSettingsPage::CompletionSettingsPage(QObject *parent) namespace TextEditor {
: Core::IOptionsPage(parent) namespace Internal {
class CompletionSettingsPageWidget final : public Core::IOptionsPageWidget
{ {
setId("P.Completion"); Q_DECLARE_TR_FUNCTIONS(TextEditor::Internal::CompletionSettingsPage)
setDisplayName(tr("Completion"));
setCategory(TextEditor::Constants::TEXT_EDITOR_SETTINGS_CATEGORY);
setDisplayCategory(QCoreApplication::translate("TextEditor", "Text Editor"));
setCategoryIconPath(TextEditor::Constants::TEXT_EDITOR_SETTINGS_CATEGORY_ICON_PATH);
QSettings *s = Core::ICore::settings(); public:
m_completionSettings.fromSettings(s); explicit CompletionSettingsPageWidget(CompletionSettingsPage *owner);
m_commentsSettings.fromSettings(s);
}
CompletionSettingsPage::~CompletionSettingsPage() private:
void apply() final;
CaseSensitivity caseSensitivity() const;
CompletionTrigger completionTrigger() const;
void settingsFromUi(CompletionSettings &completion, CommentsSettings &comment) const;
CompletionSettingsPage *m_owner = nullptr;
Ui::CompletionSettingsPage m_ui;
};
CompletionSettingsPageWidget::CompletionSettingsPageWidget(CompletionSettingsPage *owner)
: m_owner(owner)
{ {
delete m_page; m_ui.setupUi(this);
}
QWidget *CompletionSettingsPage::widget() connect(m_ui.completionTrigger, QOverload<int>::of(&QComboBox::currentIndexChanged),
{ this, [this] {
if (!m_widget) { const bool enableTimeoutWidgets = completionTrigger() == AutomaticCompletion;
m_widget = new QWidget; m_ui.automaticProposalTimeoutLabel->setEnabled(enableTimeoutWidgets);
m_page = new Ui::CompletionSettingsPage; m_ui.automaticProposalTimeoutSpinBox->setEnabled(enableTimeoutWidgets);
m_page->setupUi(m_widget); });
connect(m_page->completionTrigger, QOverload<int>::of(&QComboBox::currentIndexChanged),
this, &CompletionSettingsPage::onCompletionTriggerChanged);
int caseSensitivityIndex = 0; int caseSensitivityIndex = 0;
switch (m_completionSettings.m_caseSensitivity) { switch (m_owner->m_completionSettings.m_caseSensitivity) {
case TextEditor::CaseSensitive: case TextEditor::CaseSensitive:
caseSensitivityIndex = 0; caseSensitivityIndex = 0;
break; break;
@@ -82,7 +84,7 @@ QWidget *CompletionSettingsPage::widget()
} }
int completionTriggerIndex = 0; int completionTriggerIndex = 0;
switch (m_completionSettings.m_completionTrigger) { switch (m_owner->m_completionSettings.m_completionTrigger) {
case TextEditor::ManualCompletion: case TextEditor::ManualCompletion:
completionTriggerIndex = 0; completionTriggerIndex = 0;
break; break;
@@ -94,60 +96,55 @@ QWidget *CompletionSettingsPage::widget()
break; break;
} }
m_page->caseSensitivity->setCurrentIndex(caseSensitivityIndex); m_ui.caseSensitivity->setCurrentIndex(caseSensitivityIndex);
m_page->completionTrigger->setCurrentIndex(completionTriggerIndex); m_ui.completionTrigger->setCurrentIndex(completionTriggerIndex);
m_page->automaticProposalTimeoutSpinBox m_ui.automaticProposalTimeoutSpinBox
->setValue(m_completionSettings.m_automaticProposalTimeoutInMs); ->setValue(m_owner->m_completionSettings.m_automaticProposalTimeoutInMs);
m_page->insertBrackets->setChecked(m_completionSettings.m_autoInsertBrackets); m_ui.insertBrackets->setChecked(m_owner->m_completionSettings.m_autoInsertBrackets);
m_page->surroundBrackets->setChecked(m_completionSettings.m_surroundingAutoBrackets); m_ui.surroundBrackets->setChecked(m_owner->m_completionSettings.m_surroundingAutoBrackets);
m_page->insertQuotes->setChecked(m_completionSettings.m_autoInsertQuotes); m_ui.insertQuotes->setChecked(m_owner->m_completionSettings.m_autoInsertQuotes);
m_page->surroundQuotes->setChecked(m_completionSettings.m_surroundingAutoQuotes); m_ui.surroundQuotes->setChecked(m_owner->m_completionSettings.m_surroundingAutoQuotes);
m_page->partiallyComplete->setChecked(m_completionSettings.m_partiallyComplete); m_ui.partiallyComplete->setChecked(m_owner->m_completionSettings.m_partiallyComplete);
m_page->spaceAfterFunctionName->setChecked(m_completionSettings.m_spaceAfterFunctionName); m_ui.spaceAfterFunctionName->setChecked(m_owner->m_completionSettings.m_spaceAfterFunctionName);
m_page->autoSplitStrings->setChecked(m_completionSettings.m_autoSplitStrings); m_ui.autoSplitStrings->setChecked(m_owner->m_completionSettings.m_autoSplitStrings);
m_page->animateAutoComplete->setChecked(m_completionSettings.m_animateAutoComplete); m_ui.animateAutoComplete->setChecked(m_owner->m_completionSettings.m_animateAutoComplete);
m_page->overwriteClosingChars->setChecked(m_completionSettings.m_overwriteClosingChars); m_ui.overwriteClosingChars->setChecked(m_owner->m_completionSettings.m_overwriteClosingChars);
m_page->highlightAutoComplete->setChecked(m_completionSettings.m_highlightAutoComplete); m_ui.highlightAutoComplete->setChecked(m_owner->m_completionSettings.m_highlightAutoComplete);
m_page->skipAutoComplete->setChecked(m_completionSettings.m_skipAutoCompletedText); m_ui.skipAutoComplete->setChecked(m_owner->m_completionSettings.m_skipAutoCompletedText);
m_page->removeAutoComplete->setChecked(m_completionSettings.m_autoRemove); m_ui.removeAutoComplete->setChecked(m_owner->m_completionSettings.m_autoRemove);
m_page->enableDoxygenCheckBox->setChecked(m_commentsSettings.m_enableDoxygen); m_ui.enableDoxygenCheckBox->setChecked(m_owner->m_commentsSettings.m_enableDoxygen);
m_page->generateBriefCheckBox->setChecked(m_commentsSettings.m_generateBrief); m_ui.generateBriefCheckBox->setChecked(m_owner->m_commentsSettings.m_generateBrief);
m_page->leadingAsterisksCheckBox->setChecked(m_commentsSettings.m_leadingAsterisks); m_ui.leadingAsterisksCheckBox->setChecked(m_owner->m_commentsSettings.m_leadingAsterisks);
m_page->generateBriefCheckBox->setEnabled(m_page->enableDoxygenCheckBox->isChecked()); m_ui.generateBriefCheckBox->setEnabled(m_ui.enableDoxygenCheckBox->isChecked());
m_page->skipAutoComplete->setEnabled(m_page->highlightAutoComplete->isChecked()); m_ui.skipAutoComplete->setEnabled(m_ui.highlightAutoComplete->isChecked());
m_page->removeAutoComplete->setEnabled(m_page->highlightAutoComplete->isChecked()); m_ui.removeAutoComplete->setEnabled(m_ui.highlightAutoComplete->isChecked());
}
return m_widget;
} }
void CompletionSettingsPage::apply() void CompletionSettingsPageWidget::apply()
{ {
if (!m_page) // page was never shown
return;
CompletionSettings completionSettings; CompletionSettings completionSettings;
CommentsSettings commentsSettings; CommentsSettings commentsSettings;
settingsFromUi(completionSettings, commentsSettings); settingsFromUi(completionSettings, commentsSettings);
if (m_completionSettings != completionSettings) { if (m_owner->m_completionSettings != completionSettings) {
m_completionSettings = completionSettings; m_owner->m_completionSettings = completionSettings;
m_completionSettings.toSettings(Core::ICore::settings()); m_owner->m_completionSettings.toSettings(Core::ICore::settings());
emit completionSettingsChanged(completionSettings); emit TextEditorSettings::instance()->completionSettingsChanged(completionSettings);
} }
if (m_commentsSettings != commentsSettings) { if (m_owner->m_commentsSettings != commentsSettings) {
m_commentsSettings = commentsSettings; m_owner->m_commentsSettings = commentsSettings;
m_commentsSettings.toSettings(Core::ICore::settings()); m_owner->m_commentsSettings.toSettings(Core::ICore::settings());
emit commentsSettingsChanged(commentsSettings); emit TextEditorSettings::instance()->commentsSettingsChanged(commentsSettings);
} }
} }
TextEditor::CaseSensitivity CompletionSettingsPage::caseSensitivity() const CaseSensitivity CompletionSettingsPageWidget::caseSensitivity() const
{ {
switch (m_page->caseSensitivity->currentIndex()) { switch (m_ui.caseSensitivity->currentIndex()) {
case 0: // Full case 0: // Full
return TextEditor::CaseSensitive; return TextEditor::CaseSensitive;
case 1: // None case 1: // None
@@ -157,9 +154,9 @@ TextEditor::CaseSensitivity CompletionSettingsPage::caseSensitivity() const
} }
} }
TextEditor::CompletionTrigger CompletionSettingsPage::completionTrigger() const CompletionTrigger CompletionSettingsPageWidget::completionTrigger() const
{ {
switch (m_page->completionTrigger->currentIndex()) { switch (m_ui.completionTrigger->currentIndex()) {
case 0: case 0:
return TextEditor::ManualCompletion; return TextEditor::ManualCompletion;
case 1: case 1:
@@ -169,47 +166,29 @@ TextEditor::CompletionTrigger CompletionSettingsPage::completionTrigger() const
} }
} }
void CompletionSettingsPage::settingsFromUi(CompletionSettings &completion, CommentsSettings &comment) const void CompletionSettingsPageWidget::settingsFromUi(CompletionSettings &completion,
CommentsSettings &comment) const
{ {
if (!m_page)
return;
completion.m_caseSensitivity = caseSensitivity(); completion.m_caseSensitivity = caseSensitivity();
completion.m_completionTrigger = completionTrigger(); completion.m_completionTrigger = completionTrigger();
completion.m_automaticProposalTimeoutInMs completion.m_automaticProposalTimeoutInMs
= m_page->automaticProposalTimeoutSpinBox->value(); = m_ui.automaticProposalTimeoutSpinBox->value();
completion.m_autoInsertBrackets = m_page->insertBrackets->isChecked(); completion.m_autoInsertBrackets = m_ui.insertBrackets->isChecked();
completion.m_surroundingAutoBrackets = m_page->surroundBrackets->isChecked(); completion.m_surroundingAutoBrackets = m_ui.surroundBrackets->isChecked();
completion.m_autoInsertQuotes = m_page->insertQuotes->isChecked(); completion.m_autoInsertQuotes = m_ui.insertQuotes->isChecked();
completion.m_surroundingAutoQuotes = m_page->surroundQuotes->isChecked(); completion.m_surroundingAutoQuotes = m_ui.surroundQuotes->isChecked();
completion.m_partiallyComplete = m_page->partiallyComplete->isChecked(); completion.m_partiallyComplete = m_ui.partiallyComplete->isChecked();
completion.m_spaceAfterFunctionName = m_page->spaceAfterFunctionName->isChecked(); completion.m_spaceAfterFunctionName = m_ui.spaceAfterFunctionName->isChecked();
completion.m_autoSplitStrings = m_page->autoSplitStrings->isChecked(); completion.m_autoSplitStrings = m_ui.autoSplitStrings->isChecked();
completion.m_animateAutoComplete = m_page->animateAutoComplete->isChecked(); completion.m_animateAutoComplete = m_ui.animateAutoComplete->isChecked();
completion.m_overwriteClosingChars = m_page->overwriteClosingChars->isChecked(); completion.m_overwriteClosingChars = m_ui.overwriteClosingChars->isChecked();
completion.m_highlightAutoComplete = m_page->highlightAutoComplete->isChecked(); completion.m_highlightAutoComplete = m_ui.highlightAutoComplete->isChecked();
completion.m_skipAutoCompletedText = m_page->skipAutoComplete->isChecked(); completion.m_skipAutoCompletedText = m_ui.skipAutoComplete->isChecked();
completion.m_autoRemove = m_page->removeAutoComplete->isChecked(); completion.m_autoRemove = m_ui.removeAutoComplete->isChecked();
comment.m_enableDoxygen = m_page->enableDoxygenCheckBox->isChecked(); comment.m_enableDoxygen = m_ui.enableDoxygenCheckBox->isChecked();
comment.m_generateBrief = m_page->generateBriefCheckBox->isChecked(); comment.m_generateBrief = m_ui.generateBriefCheckBox->isChecked();
comment.m_leadingAsterisks = m_page->leadingAsterisksCheckBox->isChecked(); comment.m_leadingAsterisks = m_ui.leadingAsterisksCheckBox->isChecked();
}
void CompletionSettingsPage::onCompletionTriggerChanged()
{
const bool enableTimeoutWidgets = completionTrigger() == TextEditor::AutomaticCompletion;
m_page->automaticProposalTimeoutLabel->setEnabled(enableTimeoutWidgets);
m_page->automaticProposalTimeoutSpinBox->setEnabled(enableTimeoutWidgets);
}
void CompletionSettingsPage::finish()
{
delete m_widget;
if (!m_page) // page was never shown
return;
delete m_page;
m_page = nullptr;
} }
const CompletionSettings &CompletionSettingsPage::completionSettings() const CompletionSettings &CompletionSettingsPage::completionSettings()
@@ -221,3 +200,20 @@ const CommentsSettings &CompletionSettingsPage::commentsSettings()
{ {
return m_commentsSettings; return m_commentsSettings;
} }
CompletionSettingsPage::CompletionSettingsPage()
{
setId("P.Completion");
setDisplayName(CompletionSettingsPageWidget::tr("Completion"));
setCategory(TextEditor::Constants::TEXT_EDITOR_SETTINGS_CATEGORY);
setDisplayCategory(QCoreApplication::translate("TextEditor", "Text Editor"));
setCategoryIconPath(TextEditor::Constants::TEXT_EDITOR_SETTINGS_CATEGORY_ICON_PATH);
setWidgetCreator([this] { return new CompletionSettingsPageWidget(this); });
QSettings *s = Core::ICore::settings();
m_completionSettings.fromSettings(s);
m_commentsSettings.fromSettings(s);
}
} // Internal
} // TextEditor

View File

@@ -30,41 +30,20 @@
#include <coreplugin/dialogs/ioptionspage.h> #include <coreplugin/dialogs/ioptionspage.h>
#include <QPointer>
namespace TextEditor { namespace TextEditor {
namespace Internal { namespace Internal {
namespace Ui { class CompletionSettingsPage; }
class CompletionSettingsPage : public Core::IOptionsPage class CompletionSettingsPage : public Core::IOptionsPage
{ {
Q_OBJECT
public: public:
CompletionSettingsPage(QObject *parent); CompletionSettingsPage();
~CompletionSettingsPage() override;
QWidget *widget() override;
void apply() override;
void finish() override;
const CompletionSettings & completionSettings(); const CompletionSettings & completionSettings();
const CommentsSettings & commentsSettings(); const CommentsSettings & commentsSettings();
signals:
void completionSettingsChanged(const CompletionSettings &);
void commentsSettingsChanged(const CommentsSettings &);
private: private:
CaseSensitivity caseSensitivity() const; friend class CompletionSettingsPageWidget;
CompletionTrigger completionTrigger() const;
void settingsFromUi(CompletionSettings &completion, CommentsSettings &comment) const;
void onCompletionTriggerChanged();
Ui::CompletionSettingsPage *m_page = nullptr;
QPointer<QWidget> m_widget;
CommentsSettings m_commentsSettings; CommentsSettings m_commentsSettings;
CompletionSettings m_completionSettings; CompletionSettings m_completionSettings;
}; };

View File

@@ -68,7 +68,7 @@ public:
DisplaySettingsPage *m_displaySettingsPage; DisplaySettingsPage *m_displaySettingsPage;
HighlighterSettingsPage *m_highlighterSettingsPage; HighlighterSettingsPage *m_highlighterSettingsPage;
SnippetsSettingsPage *m_snippetsSettingsPage; SnippetsSettingsPage *m_snippetsSettingsPage;
CompletionSettingsPage *m_completionSettingsPage; CompletionSettingsPage m_completionSettingsPage;
QMap<Core::Id, ICodeStylePreferencesFactory *> m_languageToFactory; QMap<Core::Id, ICodeStylePreferencesFactory *> m_languageToFactory;
@@ -367,7 +367,6 @@ TextEditorSettings::TextEditorSettings()
new HighlighterSettingsPage(Constants::TEXT_EDITOR_HIGHLIGHTER_SETTINGS, this); new HighlighterSettingsPage(Constants::TEXT_EDITOR_HIGHLIGHTER_SETTINGS, this);
d->m_snippetsSettingsPage = d->m_snippetsSettingsPage =
new SnippetsSettingsPage(Constants::TEXT_EDITOR_SNIPPETS_SETTINGS, this); new SnippetsSettingsPage(Constants::TEXT_EDITOR_SNIPPETS_SETTINGS, this);
d->m_completionSettingsPage = new CompletionSettingsPage(this);
auto updateGeneralMessagesFontSettings = []() { auto updateGeneralMessagesFontSettings = []() {
Core::MessageManager::setFont(d->m_fontSettingsPage->fontSettings().font()); Core::MessageManager::setFont(d->m_fontSettingsPage->fontSettings().font());
@@ -396,10 +395,6 @@ TextEditorSettings::TextEditorSettings()
this, &TextEditorSettings::marginSettingsChanged); this, &TextEditorSettings::marginSettingsChanged);
connect(d->m_displaySettingsPage, &DisplaySettingsPage::displaySettingsChanged, connect(d->m_displaySettingsPage, &DisplaySettingsPage::displaySettingsChanged,
this, &TextEditorSettings::displaySettingsChanged); this, &TextEditorSettings::displaySettingsChanged);
connect(d->m_completionSettingsPage, &CompletionSettingsPage::completionSettingsChanged,
this, &TextEditorSettings::completionSettingsChanged);
connect(d->m_completionSettingsPage, &CompletionSettingsPage::commentsSettingsChanged,
this, &TextEditorSettings::commentsSettingsChanged);
auto updateCamelCaseNavigation = [] { auto updateCamelCaseNavigation = [] {
Utils::FancyLineEdit::setCamelCaseNavigationEnabled(behaviorSettings().m_camelCaseNavigation); Utils::FancyLineEdit::setCamelCaseNavigationEnabled(behaviorSettings().m_camelCaseNavigation);
@@ -453,7 +448,7 @@ const DisplaySettings &TextEditorSettings::displaySettings()
const CompletionSettings &TextEditorSettings::completionSettings() const CompletionSettings &TextEditorSettings::completionSettings()
{ {
return d->m_completionSettingsPage->completionSettings(); return d->m_completionSettingsPage.completionSettings();
} }
const HighlighterSettings &TextEditorSettings::highlighterSettings() const HighlighterSettings &TextEditorSettings::highlighterSettings()
@@ -468,7 +463,7 @@ const ExtraEncodingSettings &TextEditorSettings::extraEncodingSettings()
const CommentsSettings &TextEditorSettings::commentsSettings() const CommentsSettings &TextEditorSettings::commentsSettings()
{ {
return d->m_completionSettingsPage->commentsSettings(); return d->m_completionSettingsPage.commentsSettings();
} }
void TextEditorSettings::registerCodeStyleFactory(ICodeStylePreferencesFactory *factory) void TextEditorSettings::registerCodeStyleFactory(ICodeStylePreferencesFactory *factory)