TextEditor: Use IOptionPage::setWidgetCreator() for snippets settings

Change-Id: I9aa91edef20f325f1a2fc93388aecb5776b970d6
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
hjk
2023-04-20 10:57:15 +02:00
parent 498bad56b2
commit 4acffc7cce
3 changed files with 83 additions and 137 deletions

View File

@@ -78,9 +78,7 @@ SnippetsCollection::SnippetsCollection()
m_builtInSnippetsFiles(Core::ICore::resourcePath("snippets") m_builtInSnippetsFiles(Core::ICore::resourcePath("snippets")
.dirEntries(FileFilter({"*.xml"}))) .dirEntries(FileFilter({"*.xml"})))
{ {
identifyGroups();
connect(Core::ICore::instance(), &Core::ICore::coreOpened,
this, &SnippetsCollection::identifyGroups);
} }
SnippetsCollection::~SnippetsCollection() = default; SnippetsCollection::~SnippetsCollection() = default;

View File

@@ -35,15 +35,14 @@
#include <QStackedWidget> #include <QStackedWidget>
#include <QTextStream> #include <QTextStream>
namespace TextEditor { namespace TextEditor::Internal {
namespace Internal {
// SnippetsTableModel // SnippetsTableModel
class SnippetsTableModel : public QAbstractTableModel class SnippetsTableModel : public QAbstractTableModel
{ {
Q_OBJECT
public: public:
SnippetsTableModel(QObject *parent); SnippetsTableModel();
~SnippetsTableModel() override = default; ~SnippetsTableModel() override = default;
int rowCount(const QModelIndex &parent = QModelIndex()) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override;
@@ -74,9 +73,8 @@ private:
QString m_activeGroupId; QString m_activeGroupId;
}; };
SnippetsTableModel::SnippetsTableModel(QObject *parent) : SnippetsTableModel::SnippetsTableModel()
QAbstractTableModel(parent), : m_collection(SnippetsCollection::instance())
m_collection(SnippetsCollection::instance())
{} {}
int SnippetsTableModel::rowCount(const QModelIndex &) const int SnippetsTableModel::rowCount(const QModelIndex &) const
@@ -244,19 +242,15 @@ void SnippetsTableModel::replaceSnippet(const Snippet &snippet, const QModelInde
} }
} }
// SnippetsSettingsPagePrivate // SnippetsSettingsWidget
class SnippetsSettingsPagePrivate : public QObject
class SnippetsSettingsWidget : public Core::IOptionsPageWidget
{ {
public: public:
SnippetsSettingsPagePrivate(); SnippetsSettingsWidget();
~SnippetsSettingsPagePrivate() override { delete m_model; }
void configureUi(QWidget *parent); void apply() final;
void finish() final;
void apply();
void finish();
QPointer<QWidget> m_widget;
private: private:
void loadSnippetGroup(int index); void loadSnippetGroup(int index);
@@ -279,9 +273,9 @@ private:
bool settingsChanged() const; bool settingsChanged() const;
void writeSettings(); void writeSettings();
const QString m_settingsPrefix; const QString m_settingsPrefix{QLatin1String("Text")};
SnippetsTableModel *m_model; SnippetsTableModel m_model;
bool m_snippetsCollectionChanged; bool m_snippetsCollectionChanged = false;
SnippetsSettings m_settings; SnippetsSettings m_settings;
QStackedWidget *m_snippetsEditorStack; QStackedWidget *m_snippetsEditorStack;
@@ -290,38 +284,22 @@ private:
QPushButton *m_revertButton; QPushButton *m_revertButton;
}; };
SnippetsSettingsPagePrivate::SnippetsSettingsPagePrivate() : SnippetsSettingsWidget::SnippetsSettingsWidget()
m_settingsPrefix(QLatin1String("Text")),
m_model(new SnippetsTableModel(nullptr)),
m_snippetsCollectionChanged(false)
{}
SnippetEditorWidget *SnippetsSettingsPagePrivate::currentEditor() const
{
return editorAt(m_snippetsEditorStack->currentIndex());
}
SnippetEditorWidget *SnippetsSettingsPagePrivate::editorAt(int i) const
{
return static_cast<SnippetEditorWidget *>(m_snippetsEditorStack->widget(i));
}
void SnippetsSettingsPagePrivate::configureUi(QWidget *w)
{ {
m_groupCombo = new QComboBox; m_groupCombo = new QComboBox;
m_snippetsEditorStack = new QStackedWidget; m_snippetsEditorStack = new QStackedWidget;
for (const SnippetProvider &provider : SnippetProvider::snippetProviders()) { for (const SnippetProvider &provider : SnippetProvider::snippetProviders()) {
m_groupCombo->addItem(provider.displayName(), provider.groupId()); m_groupCombo->addItem(provider.displayName(), provider.groupId());
auto snippetEditor = new SnippetEditorWidget(w); auto snippetEditor = new SnippetEditorWidget(this);
SnippetProvider::decorateEditor(snippetEditor, provider.groupId()); SnippetProvider::decorateEditor(snippetEditor, provider.groupId());
m_snippetsEditorStack->insertWidget(m_groupCombo->count() - 1, snippetEditor); m_snippetsEditorStack->insertWidget(m_groupCombo->count() - 1, snippetEditor);
connect(snippetEditor, &SnippetEditorWidget::snippetContentChanged, connect(snippetEditor, &SnippetEditorWidget::snippetContentChanged,
this, &SnippetsSettingsPagePrivate::setSnippetContent); this, &SnippetsSettingsWidget::setSnippetContent);
} }
m_snippetsTable = new Utils::TreeView; m_snippetsTable = new Utils::TreeView;
m_snippetsTable->setRootIsDecorated(false); m_snippetsTable->setRootIsDecorated(false);
m_snippetsTable->setModel(m_model); m_snippetsTable->setModel(&m_model);
m_revertButton = new QPushButton(Tr::tr("Revert Built-in")); m_revertButton = new QPushButton(Tr::tr("Revert Built-in"));
m_revertButton->setEnabled(false); m_revertButton->setEnabled(false);
@@ -350,40 +328,50 @@ void SnippetsSettingsPagePrivate::configureUi(QWidget *w)
st, st,
} }
} }
}.attachTo(w); }.attachTo(this);
loadSettings(); loadSettings();
loadSnippetGroup(m_groupCombo->currentIndex()); loadSnippetGroup(m_groupCombo->currentIndex());
connect(m_model, &QAbstractItemModel::rowsInserted, connect(&m_model, &QAbstractItemModel::rowsInserted,
this, &SnippetsSettingsPagePrivate::selectSnippet); this, &SnippetsSettingsWidget::selectSnippet);
connect(m_model, &QAbstractItemModel::rowsInserted, connect(&m_model, &QAbstractItemModel::rowsInserted,
this, &SnippetsSettingsPagePrivate::markSnippetsCollection); this, &SnippetsSettingsWidget::markSnippetsCollection);
connect(m_model, &QAbstractItemModel::rowsRemoved, connect(&m_model, &QAbstractItemModel::rowsRemoved,
this, &SnippetsSettingsPagePrivate::markSnippetsCollection); this, &SnippetsSettingsWidget::markSnippetsCollection);
connect(m_model, &QAbstractItemModel::rowsMoved, connect(&m_model, &QAbstractItemModel::rowsMoved,
this, &SnippetsSettingsPagePrivate::selectMovedSnippet); this, &SnippetsSettingsWidget::selectMovedSnippet);
connect(m_model, &QAbstractItemModel::rowsMoved, connect(&m_model, &QAbstractItemModel::rowsMoved,
this, &SnippetsSettingsPagePrivate::markSnippetsCollection); this, &SnippetsSettingsWidget::markSnippetsCollection);
connect(m_model, &QAbstractItemModel::dataChanged, connect(&m_model, &QAbstractItemModel::dataChanged,
this, &SnippetsSettingsPagePrivate::markSnippetsCollection); this, &SnippetsSettingsWidget::markSnippetsCollection);
connect(m_model, &QAbstractItemModel::modelReset, connect(&m_model, &QAbstractItemModel::modelReset,
this, [this] { this->updateCurrentSnippetDependent(); }); this, [this] { this->updateCurrentSnippetDependent(); });
connect(m_model, &QAbstractItemModel::modelReset, connect(&m_model, &QAbstractItemModel::modelReset,
this, &SnippetsSettingsPagePrivate::markSnippetsCollection); this, &SnippetsSettingsWidget::markSnippetsCollection);
connect(m_groupCombo, &QComboBox::currentIndexChanged, connect(m_groupCombo, &QComboBox::currentIndexChanged,
this, &SnippetsSettingsPagePrivate::loadSnippetGroup); this, &SnippetsSettingsWidget::loadSnippetGroup);
connect(m_revertButton, &QAbstractButton::clicked, connect(m_revertButton, &QAbstractButton::clicked,
this, &SnippetsSettingsPagePrivate::revertBuiltInSnippet); this, &SnippetsSettingsWidget::revertBuiltInSnippet);
connect(m_snippetsTable->selectionModel(), &QItemSelectionModel::currentChanged, connect(m_snippetsTable->selectionModel(), &QItemSelectionModel::currentChanged,
this, &SnippetsSettingsPagePrivate::updateCurrentSnippetDependent); this, &SnippetsSettingsWidget::updateCurrentSnippetDependent);
connect(TextEditorSettings::instance(), &TextEditorSettings::fontSettingsChanged, connect(TextEditorSettings::instance(), &TextEditorSettings::fontSettingsChanged,
this, &SnippetsSettingsPagePrivate::decorateEditors); this, &SnippetsSettingsWidget::decorateEditors);
} }
void SnippetsSettingsPagePrivate::apply() SnippetEditorWidget *SnippetsSettingsWidget::currentEditor() const
{
return editorAt(m_snippetsEditorStack->currentIndex());
}
SnippetEditorWidget *SnippetsSettingsWidget::editorAt(int i) const
{
return static_cast<SnippetEditorWidget *>(m_snippetsEditorStack->widget(i));
}
void SnippetsSettingsWidget::apply()
{ {
if (settingsChanged()) if (settingsChanged())
writeSettings(); writeSettings();
@@ -402,7 +390,7 @@ void SnippetsSettingsPagePrivate::apply()
} }
} }
void SnippetsSettingsPagePrivate::finish() void SnippetsSettingsWidget::finish()
{ {
if (m_snippetsCollectionChanged) { if (m_snippetsCollectionChanged) {
SnippetsCollection::instance()->reload(); SnippetsCollection::instance()->reload();
@@ -412,7 +400,7 @@ void SnippetsSettingsPagePrivate::finish()
disconnect(TextEditorSettings::instance(), nullptr, this, nullptr); disconnect(TextEditorSettings::instance(), nullptr, this, nullptr);
} }
void SnippetsSettingsPagePrivate::loadSettings() void SnippetsSettingsWidget::loadSettings()
{ {
if (m_groupCombo->count() == 0) if (m_groupCombo->count() == 0)
return; return;
@@ -426,7 +414,7 @@ void SnippetsSettingsPagePrivate::loadSettings()
m_groupCombo->setCurrentIndex(0); m_groupCombo->setCurrentIndex(0);
} }
void SnippetsSettingsPagePrivate::writeSettings() void SnippetsSettingsWidget::writeSettings()
{ {
if (m_groupCombo->count() == 0) if (m_groupCombo->count() == 0)
return; return;
@@ -435,72 +423,72 @@ void SnippetsSettingsPagePrivate::writeSettings()
m_settings.toSettings(m_settingsPrefix, Core::ICore::settings()); m_settings.toSettings(m_settingsPrefix, Core::ICore::settings());
} }
bool SnippetsSettingsPagePrivate::settingsChanged() const bool SnippetsSettingsWidget::settingsChanged() const
{ {
if (m_settings.lastUsedSnippetGroup() != m_groupCombo->currentText()) if (m_settings.lastUsedSnippetGroup() != m_groupCombo->currentText())
return true; return true;
return false; return false;
} }
void SnippetsSettingsPagePrivate::loadSnippetGroup(int index) void SnippetsSettingsWidget::loadSnippetGroup(int index)
{ {
if (index == -1) if (index == -1)
return; return;
m_snippetsEditorStack->setCurrentIndex(index); m_snippetsEditorStack->setCurrentIndex(index);
currentEditor()->clear(); currentEditor()->clear();
m_model->load(m_groupCombo->itemData(index).toString()); m_model.load(m_groupCombo->itemData(index).toString());
} }
void SnippetsSettingsPagePrivate::markSnippetsCollection() void SnippetsSettingsWidget::markSnippetsCollection()
{ {
if (!m_snippetsCollectionChanged) if (!m_snippetsCollectionChanged)
m_snippetsCollectionChanged = true; m_snippetsCollectionChanged = true;
} }
void SnippetsSettingsPagePrivate::addSnippet() void SnippetsSettingsWidget::addSnippet()
{ {
const QModelIndex &modelIndex = m_model->createSnippet(); const QModelIndex &modelIndex = m_model.createSnippet();
selectSnippet(QModelIndex(), modelIndex.row()); selectSnippet(QModelIndex(), modelIndex.row());
m_snippetsTable->edit(modelIndex); m_snippetsTable->edit(modelIndex);
} }
void SnippetsSettingsPagePrivate::removeSnippet() void SnippetsSettingsWidget::removeSnippet()
{ {
const QModelIndex &modelIndex = m_snippetsTable->selectionModel()->currentIndex(); const QModelIndex &modelIndex = m_snippetsTable->selectionModel()->currentIndex();
if (!modelIndex.isValid()) { if (!modelIndex.isValid()) {
QMessageBox::critical(Core::ICore::dialogParent(), Tr::tr("Error"), Tr::tr("No snippet selected.")); QMessageBox::critical(Core::ICore::dialogParent(), Tr::tr("Error"), Tr::tr("No snippet selected."));
return; return;
} }
m_model->removeSnippet(modelIndex); m_model.removeSnippet(modelIndex);
} }
void SnippetsSettingsPagePrivate::restoreRemovedBuiltInSnippets() void SnippetsSettingsWidget::restoreRemovedBuiltInSnippets()
{ {
m_model->restoreRemovedBuiltInSnippets(); m_model.restoreRemovedBuiltInSnippets();
} }
void SnippetsSettingsPagePrivate::revertBuiltInSnippet() void SnippetsSettingsWidget::revertBuiltInSnippet()
{ {
m_model->revertBuitInSnippet(m_snippetsTable->selectionModel()->currentIndex()); m_model.revertBuitInSnippet(m_snippetsTable->selectionModel()->currentIndex());
} }
void SnippetsSettingsPagePrivate::resetAllSnippets() void SnippetsSettingsWidget::resetAllSnippets()
{ {
m_model->resetSnippets(); m_model.resetSnippets();
} }
void SnippetsSettingsPagePrivate::selectSnippet(const QModelIndex &parent, int row) void SnippetsSettingsWidget::selectSnippet(const QModelIndex &parent, int row)
{ {
QModelIndex topLeft = m_model->index(row, 0, parent); QModelIndex topLeft = m_model.index(row, 0, parent);
QModelIndex bottomRight = m_model->index(row, 1, parent); QModelIndex bottomRight = m_model.index(row, 1, parent);
QItemSelection selection(topLeft, bottomRight); QItemSelection selection(topLeft, bottomRight);
m_snippetsTable->selectionModel()->select(selection, QItemSelectionModel::SelectCurrent); m_snippetsTable->selectionModel()->select(selection, QItemSelectionModel::SelectCurrent);
m_snippetsTable->setCurrentIndex(topLeft); m_snippetsTable->setCurrentIndex(topLeft);
m_snippetsTable->scrollTo(topLeft); m_snippetsTable->scrollTo(topLeft);
} }
void SnippetsSettingsPagePrivate::selectMovedSnippet(const QModelIndex &, void SnippetsSettingsWidget::selectMovedSnippet(const QModelIndex &,
int sourceRow, int sourceRow,
int, int,
const QModelIndex &destinationParent, const QModelIndex &destinationParent,
@@ -508,17 +496,17 @@ void SnippetsSettingsPagePrivate::selectMovedSnippet(const QModelIndex &,
{ {
QModelIndex modelIndex; QModelIndex modelIndex;
if (sourceRow < destinationRow) if (sourceRow < destinationRow)
modelIndex = m_model->index(destinationRow - 1, 0, destinationParent); modelIndex = m_model.index(destinationRow - 1, 0, destinationParent);
else else
modelIndex = m_model->index(destinationRow, 0, destinationParent); modelIndex = m_model.index(destinationRow, 0, destinationParent);
m_snippetsTable->scrollTo(modelIndex); m_snippetsTable->scrollTo(modelIndex);
currentEditor()->setPlainText(m_model->snippetAt(modelIndex).content()); currentEditor()->setPlainText(m_model.snippetAt(modelIndex).content());
} }
void SnippetsSettingsPagePrivate::updateCurrentSnippetDependent(const QModelIndex &modelIndex) void SnippetsSettingsWidget::updateCurrentSnippetDependent(const QModelIndex &modelIndex)
{ {
if (modelIndex.isValid()) { if (modelIndex.isValid()) {
const Snippet &snippet = m_model->snippetAt(modelIndex); const Snippet &snippet = m_model.snippetAt(modelIndex);
currentEditor()->setPlainText(snippet.content()); currentEditor()->setPlainText(snippet.content());
m_revertButton->setEnabled(snippet.isBuiltIn()); m_revertButton->setEnabled(snippet.isBuiltIn());
} else { } else {
@@ -527,16 +515,16 @@ void SnippetsSettingsPagePrivate::updateCurrentSnippetDependent(const QModelInde
} }
} }
void SnippetsSettingsPagePrivate::setSnippetContent() void SnippetsSettingsWidget::setSnippetContent()
{ {
const QModelIndex &modelIndex = m_snippetsTable->selectionModel()->currentIndex(); const QModelIndex &modelIndex = m_snippetsTable->selectionModel()->currentIndex();
if (modelIndex.isValid()) { if (modelIndex.isValid()) {
m_model->setSnippetContent(modelIndex, currentEditor()->toPlainText()); m_model.setSnippetContent(modelIndex, currentEditor()->toPlainText());
markSnippetsCollection(); markSnippetsCollection();
} }
} }
void SnippetsSettingsPagePrivate::decorateEditors(const TextEditor::FontSettings &fontSettings) void SnippetsSettingsWidget::decorateEditors(const TextEditor::FontSettings &fontSettings)
{ {
for (int i = 0; i < m_groupCombo->count(); ++i) { for (int i = 0; i < m_groupCombo->count(); ++i) {
SnippetEditorWidget *snippetEditor = editorAt(i); SnippetEditorWidget *snippetEditor = editorAt(i);
@@ -550,41 +538,13 @@ void SnippetsSettingsPagePrivate::decorateEditors(const TextEditor::FontSettings
// SnippetsSettingsPage // SnippetsSettingsPage
SnippetsSettingsPage::SnippetsSettingsPage() SnippetsSettingsPage::SnippetsSettingsPage()
: d(new SnippetsSettingsPagePrivate)
{ {
setId(Constants::TEXT_EDITOR_SNIPPETS_SETTINGS); setId(Constants::TEXT_EDITOR_SNIPPETS_SETTINGS);
setDisplayName(Tr::tr("Snippets")); setDisplayName(Tr::tr("Snippets"));
setCategory(TextEditor::Constants::TEXT_EDITOR_SETTINGS_CATEGORY); setCategory(TextEditor::Constants::TEXT_EDITOR_SETTINGS_CATEGORY);
setDisplayCategory(Tr::tr("Text Editor")); setDisplayCategory(Tr::tr("Text Editor"));
setCategoryIconPath(TextEditor::Constants::TEXT_EDITOR_SETTINGS_CATEGORY_ICON_PATH); setCategoryIconPath(TextEditor::Constants::TEXT_EDITOR_SETTINGS_CATEGORY_ICON_PATH);
setWidgetCreator([] { return new SnippetsSettingsWidget; });
} }
SnippetsSettingsPage::~SnippetsSettingsPage() } // TextEditor::Internal
{
delete d;
}
QWidget *SnippetsSettingsPage::widget()
{
if (!d->m_widget) {
d->m_widget = new QWidget;
d->configureUi(d->m_widget);
}
return d->m_widget;
}
void SnippetsSettingsPage::apply()
{
d->apply();
}
void SnippetsSettingsPage::finish()
{
d->finish();
delete d->m_widget;
}
} // Internal
} // TextEditor
#include "snippetssettingspage.moc"

View File

@@ -5,24 +5,12 @@
#include <coreplugin/dialogs/ioptionspage.h> #include <coreplugin/dialogs/ioptionspage.h>
namespace TextEditor { namespace TextEditor::Internal {
namespace Internal {
class SnippetsSettingsPagePrivate;
class SnippetsSettingsPage final : public Core::IOptionsPage class SnippetsSettingsPage final : public Core::IOptionsPage
{ {
public: public:
SnippetsSettingsPage(); SnippetsSettingsPage();
~SnippetsSettingsPage() override;
QWidget *widget() override;
void apply() override;
void finish() override;
private:
SnippetsSettingsPagePrivate *d;
}; };
} // Internal } // TextEditor::Internal
} // TextEditor