TextEditor: Simplify SnippetProvider handling

The group identifier is as good as the actual object, so use that
on the generator and the consumer side.

Change-Id: I6ccd54a2362631af0b50583f12563b8e41a5dd78
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
hjk
2018-02-06 15:59:05 +01:00
parent 0c3aed2549
commit 91c19c2734
13 changed files with 28 additions and 64 deletions

View File

@@ -31,9 +31,6 @@
#include "cppqtstyleindenter.h" #include "cppqtstyleindenter.h"
#include <cppeditor/cppeditorconstants.h> #include <cppeditor/cppeditorconstants.h>
#include <texteditor/snippets/snippetprovider.h>
#include <extensionsystem/pluginmanager.h>
#include <QLayout> #include <QLayout>
@@ -121,9 +118,9 @@ TextEditor::Indenter *CppCodeStylePreferencesFactory::createIndenter() const
return new CppQtStyleIndenter(); return new CppQtStyleIndenter();
} }
TextEditor::SnippetProvider *CppCodeStylePreferencesFactory::snippetProvider() const QString CppCodeStylePreferencesFactory::snippetProviderGroupId() const
{ {
return TextEditor::SnippetProvider::snippetProviderForGroupId(CppEditor::Constants::CPP_SNIPPETS_GROUP_ID); return CppEditor::Constants::CPP_SNIPPETS_GROUP_ID;
} }
QString CppCodeStylePreferencesFactory::previewText() const QString CppCodeStylePreferencesFactory::previewText() const

View File

@@ -40,7 +40,7 @@ public:
QWidget *createEditor(TextEditor::ICodeStylePreferences *settings, QWidget *createEditor(TextEditor::ICodeStylePreferences *settings,
QWidget *parent) const; QWidget *parent) const;
TextEditor::Indenter *createIndenter() const; TextEditor::Indenter *createIndenter() const;
TextEditor::SnippetProvider *snippetProvider() const; QString snippetProviderGroupId() const;
QString previewText() const; QString previewText() const;
}; };

View File

@@ -493,13 +493,9 @@ void CppCodeStylePreferencesWidget::updatePreview()
void CppCodeStylePreferencesWidget::decorateEditors(const FontSettings &fontSettings) void CppCodeStylePreferencesWidget::decorateEditors(const FontSettings &fontSettings)
{ {
const SnippetProvider *provider =
SnippetProvider::snippetProviderForGroupId(CppEditor::Constants::CPP_SNIPPETS_GROUP_ID);
foreach (SnippetEditorWidget *editor, m_previews) { foreach (SnippetEditorWidget *editor, m_previews) {
editor->textDocument()->setFontSettings(fontSettings); editor->textDocument()->setFontSettings(fontSettings);
if (provider) SnippetProvider::decorateEditor(editor, CppEditor::Constants::CPP_SNIPPETS_GROUP_ID);
provider->decorateEditor(editor);
} }
} }

View File

@@ -32,7 +32,6 @@
#include <coreplugin/id.h> #include <coreplugin/id.h>
#include <texteditor/simplecodestylepreferences.h> #include <texteditor/simplecodestylepreferences.h>
#include <texteditor/snippets/snippetprovider.h>
#include <QWidget> #include <QWidget>
#include <QLayout> #include <QLayout>
@@ -73,9 +72,9 @@ TextEditor::Indenter *NimCodeStylePreferencesFactory::createIndenter() const
return new NimIndenter(); return new NimIndenter();
} }
SnippetProvider *NimCodeStylePreferencesFactory::snippetProvider() const QString NimCodeStylePreferencesFactory::snippetProviderGroupId() const
{ {
return SnippetProvider::snippetProviderForGroupId(Nim::Constants::C_NIMSNIPPETSGROUP_ID); return Nim::Constants::C_NIMSNIPPETSGROUP_ID;
} }
QString NimCodeStylePreferencesFactory::previewText() const QString NimCodeStylePreferencesFactory::previewText() const

View File

@@ -42,7 +42,7 @@ public:
QWidget *createEditor(TextEditor::ICodeStylePreferences *settings, QWidget *createEditor(TextEditor::ICodeStylePreferences *settings,
QWidget *parent) const; QWidget *parent) const;
TextEditor::Indenter *createIndenter() const; TextEditor::Indenter *createIndenter() const;
TextEditor::SnippetProvider *snippetProvider() const; QString snippetProviderGroupId() const;
QString previewText() const; QString previewText() const;
}; };

View File

@@ -27,10 +27,11 @@
#include "qmljscodestylesettingspage.h" #include "qmljscodestylesettingspage.h"
#include "qmljstoolsconstants.h" #include "qmljstoolsconstants.h"
#include "qmljsindenter.h" #include "qmljsindenter.h"
#include <texteditor/simplecodestylepreferences.h> #include <texteditor/simplecodestylepreferences.h>
#include <texteditor/snippets/snippetprovider.h>
#include <extensionsystem/pluginmanager.h>
#include <qmljseditor/qmljseditorconstants.h> #include <qmljseditor/qmljseditorconstants.h>
#include <QLayout> #include <QLayout>
using namespace QmlJSTools; using namespace QmlJSTools;
@@ -86,10 +87,9 @@ TextEditor::Indenter *QmlJSCodeStylePreferencesFactory::createIndenter() const
return new QmlJSEditor::Internal::Indenter(); return new QmlJSEditor::Internal::Indenter();
} }
TextEditor::SnippetProvider *QmlJSCodeStylePreferencesFactory::snippetProvider() const QString QmlJSCodeStylePreferencesFactory::snippetProviderGroupId() const
{ {
return TextEditor::SnippetProvider::snippetProviderForGroupId return QmlJSEditor::Constants::QML_SNIPPETS_GROUP_ID;
(QmlJSEditor::Constants::QML_SNIPPETS_GROUP_ID);
} }
QString QmlJSCodeStylePreferencesFactory::previewText() const QString QmlJSCodeStylePreferencesFactory::previewText() const

View File

@@ -40,7 +40,7 @@ public:
QWidget *createEditor(TextEditor::ICodeStylePreferences *settings, QWidget *createEditor(TextEditor::ICodeStylePreferences *settings,
QWidget *parent) const; QWidget *parent) const;
TextEditor::Indenter *createIndenter() const; TextEditor::Indenter *createIndenter() const;
TextEditor::SnippetProvider *snippetProvider() const; QString snippetProviderGroupId() const;
QString previewText() const; QString previewText() const;
}; };

View File

@@ -82,12 +82,9 @@ void QmlJSCodeStylePreferencesWidget::setPreferences(ICodeStylePreferences *pref
void QmlJSCodeStylePreferencesWidget::decorateEditor(const FontSettings &fontSettings) void QmlJSCodeStylePreferencesWidget::decorateEditor(const FontSettings &fontSettings)
{ {
const SnippetProvider *provider =
SnippetProvider::snippetProviderForGroupId(QmlJSEditor::Constants::QML_SNIPPETS_GROUP_ID);
m_ui->previewTextEdit->textDocument()->setFontSettings(fontSettings); m_ui->previewTextEdit->textDocument()->setFontSettings(fontSettings);
if (provider) SnippetProvider::decorateEditor(m_ui->previewTextEdit,
provider->decorateEditor(m_ui->previewTextEdit); QmlJSEditor::Constants::QML_SNIPPETS_GROUP_ID);
} }
void QmlJSCodeStylePreferencesWidget::setVisualizeWhitespace(bool on) void QmlJSCodeStylePreferencesWidget::setVisualizeWhitespace(bool on)

View File

@@ -54,9 +54,8 @@ CodeStyleEditor::CodeStyleEditor(ICodeStylePreferencesFactory *factory,
DisplaySettings displaySettings = m_preview->displaySettings(); DisplaySettings displaySettings = m_preview->displaySettings();
displaySettings.m_visualizeWhitespace = true; displaySettings.m_visualizeWhitespace = true;
m_preview->setDisplaySettings(displaySettings); m_preview->setDisplaySettings(displaySettings);
SnippetProvider *provider = factory->snippetProvider(); QString groupId = factory->snippetProviderGroupId();
if (provider) SnippetProvider::decorateEditor(m_preview, groupId);
provider->decorateEditor(m_preview);
QLabel *label = new QLabel( QLabel *label = new QLabel(
tr("Edit preview contents to see how the current settings " tr("Edit preview contents to see how the current settings "
"are applied to custom code snippets. Changes in the preview " "are applied to custom code snippets. Changes in the preview "

View File

@@ -47,7 +47,7 @@ public:
virtual ICodeStylePreferences *createCodeStyle() const = 0; virtual ICodeStylePreferences *createCodeStyle() const = 0;
virtual QWidget *createEditor(ICodeStylePreferences *preferences, QWidget *parent) const = 0; virtual QWidget *createEditor(ICodeStylePreferences *preferences, QWidget *parent) const = 0;
virtual TextEditor::Indenter *createIndenter() const = 0; virtual TextEditor::Indenter *createIndenter() const = 0;
virtual SnippetProvider *snippetProvider() const = 0; virtual QString snippetProviderGroupId() const = 0;
virtual QString previewText() const = 0; virtual QString previewText() const = 0;
}; };

View File

@@ -38,14 +38,6 @@ const QList<SnippetProvider> &SnippetProvider::snippetProviders()
return g_snippetProviders; return g_snippetProviders;
} }
SnippetProvider *SnippetProvider::snippetProviderForGroupId(const QString &groupId)
{
auto end = std::end(g_snippetProviders);
auto it = std::find_if(std::begin(g_snippetProviders), end,
Utils::equal(&SnippetProvider::groupId, groupId));
return (it == end) ? nullptr : &*it;
}
/*! /*!
\group Snippets \group Snippets
\title Snippets for Editors \title Snippets for Editors
@@ -104,25 +96,17 @@ QString SnippetProvider::displayName() const
return m_displayName; return m_displayName;
} }
/*!
EditorDecorator is a hook which allows you to apply customizations such as highlighting or
indentation to the snippet editor.
*/
SnippetProvider::EditorDecorator SnippetProvider::editorDecorator() const
{
return m_editorDecorator;
}
/*! /*!
Applies customizations such as highlighting or indentation to the snippet editor. Applies customizations such as highlighting or indentation to the snippet editor.
*/ */
void SnippetProvider::decorateEditor(TextEditorWidget *editor) const void SnippetProvider::decorateEditor(TextEditorWidget *editor, const QString &groupId)
{ {
editorDecorator()(editor); for (const SnippetProvider &provider : g_snippetProviders) {
if (provider.m_groupId == groupId && provider.m_editorDecorator)
provider.m_editorDecorator(editor);
}
} }
static void doNotDecorate(TextEditorWidget *) { }
/*! /*!
Registers a snippet group with \a groupId, \a displayName and \a editorDecorator. Registers a snippet group with \a groupId, \a displayName and \a editorDecorator.
*/ */
@@ -132,6 +116,6 @@ void SnippetProvider::registerGroup(const QString &groupId, const QString &displ
SnippetProvider provider; SnippetProvider provider;
provider.m_groupId = groupId; provider.m_groupId = groupId;
provider.m_displayName = displayName; provider.m_displayName = displayName;
provider.m_editorDecorator = editorDecorator ? editorDecorator : EditorDecorator(doNotDecorate); provider.m_editorDecorator = editorDecorator;
g_snippetProviders.append(provider); g_snippetProviders.append(provider);
} }

View File

@@ -43,16 +43,13 @@ public:
using EditorDecorator = std::function<void(TextEditorWidget *)>; using EditorDecorator = std::function<void(TextEditorWidget *)>;
static const QList<SnippetProvider> &snippetProviders(); static const QList<SnippetProvider> &snippetProviders();
static SnippetProvider *snippetProviderForGroupId(const QString &groupId);
static void registerGroup(const QString &groupId, const QString &displayName, static void registerGroup(const QString &groupId, const QString &displayName,
EditorDecorator editorDecorator = EditorDecorator()); EditorDecorator editorDecorator = EditorDecorator());
QString groupId() const; QString groupId() const;
QString displayName() const; QString displayName() const;
EditorDecorator editorDecorator() const;
void decorateEditor(TextEditorWidget *editor) const; static void decorateEditor(TextEditorWidget *editor, const QString &groupId);
private: private:
QString m_groupId; QString m_groupId;

View File

@@ -328,11 +328,10 @@ void SnippetsSettingsPagePrivate::configureUi(QWidget *w)
{ {
m_ui.setupUi(w); m_ui.setupUi(w);
const QList<SnippetProvider> &providers = SnippetProvider::snippetProviders(); for (const SnippetProvider &provider : SnippetProvider::snippetProviders()) {
for (const SnippetProvider &provider : providers) {
m_ui.groupCombo->addItem(provider.displayName(), provider.groupId()); m_ui.groupCombo->addItem(provider.displayName(), provider.groupId());
SnippetEditorWidget *snippetEditor = new SnippetEditorWidget(w); SnippetEditorWidget *snippetEditor = new SnippetEditorWidget(w);
provider.decorateEditor(snippetEditor); SnippetProvider::decorateEditor(snippetEditor, provider.groupId());
m_ui.snippetsEditorStack->insertWidget(m_ui.groupCombo->count() - 1, snippetEditor); m_ui.snippetsEditorStack->insertWidget(m_ui.groupCombo->count() - 1, snippetEditor);
connect(snippetEditor, &SnippetEditorWidget::snippetContentChanged, connect(snippetEditor, &SnippetEditorWidget::snippetContentChanged,
this, &SnippetsSettingsPagePrivate::setSnippetContent); this, &SnippetsSettingsPagePrivate::setSnippetContent);
@@ -536,16 +535,12 @@ void SnippetsSettingsPagePrivate::setSnippetContent()
void SnippetsSettingsPagePrivate::decorateEditors(const TextEditor::FontSettings &fontSettings) void SnippetsSettingsPagePrivate::decorateEditors(const TextEditor::FontSettings &fontSettings)
{ {
const QList<SnippetProvider> &providers = SnippetProvider::snippetProviders();
for (int i = 0; i < m_ui.groupCombo->count(); ++i) { for (int i = 0; i < m_ui.groupCombo->count(); ++i) {
SnippetEditorWidget *snippetEditor = editorAt(i); SnippetEditorWidget *snippetEditor = editorAt(i);
snippetEditor->textDocument()->setFontSettings(fontSettings); snippetEditor->textDocument()->setFontSettings(fontSettings);
const QString &id = m_ui.groupCombo->itemData(i).toString(); const QString &id = m_ui.groupCombo->itemData(i).toString();
// This list should be quite short... Re-iterating over it is ok. // This list should be quite short... Re-iterating over it is ok.
foreach (const SnippetProvider &provider, providers) { SnippetProvider::decorateEditor(snippetEditor, id);
if (provider.groupId() == id)
provider.decorateEditor(snippetEditor);
}
} }
} }