TextEditor: Modernize SnippetsCollection

More FilePath use, foreach, less .h exposure.

Change-Id: Ie24324b33333733736f0cd12c7637798fc88aa34
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
hjk
2021-08-13 17:05:12 +02:00
parent 026b4ddcda
commit 285ec1476e
3 changed files with 37 additions and 48 deletions

View File

@@ -109,7 +109,7 @@ public:
bool createDir() const; bool createDir() const;
QList<FilePath> dirEntries(const QStringList &nameFilters, QList<FilePath> dirEntries(const QStringList &nameFilters,
QDir::Filters filters, QDir::Filters filters = QDir::NoFilter,
QDir::SortFlags sort = QDir::NoSort) const; QDir::SortFlags sort = QDir::NoSort) const;
QList<FilePath> dirEntries(QDir::Filters filters) const; QList<FilePath> dirEntries(QDir::Filters filters) const;
QByteArray fileContents(qint64 maxSize = -1, qint64 offset = 0) const; QByteArray fileContents(qint64 maxSize = -1, qint64 offset = 0) const;

View File

@@ -41,8 +41,10 @@
#include <iterator> #include <iterator>
#include <algorithm> #include <algorithm>
using namespace TextEditor; using namespace Utils;
using namespace Internal;
namespace TextEditor {
namespace Internal {
/* TRANSLATOR TextEditor::Internal::Snippets /* TRANSLATOR TextEditor::Internal::Snippets
@@ -51,8 +53,6 @@ using namespace Internal;
disambiguate between snippets with the same trigger. disambiguate between snippets with the same trigger.
*/ */
namespace {
static bool snippetComp(const Snippet &a, const Snippet &b) static bool snippetComp(const Snippet &a, const Snippet &b)
{ {
const int comp = a.trigger().toLower().localeAwareCompare(b.trigger().toLower()); const int comp = a.trigger().toLower().localeAwareCompare(b.trigger().toLower());
@@ -64,16 +64,14 @@ static bool snippetComp(const Snippet &a, const Snippet &b)
return false; return false;
} }
} // Anonymous const QLatin1String kSnippet("snippet");
const QLatin1String kSnippets("snippets");
const QLatin1String SnippetsCollection::kSnippet("snippet"); const QLatin1String kTrigger("trigger");
const QLatin1String SnippetsCollection::kSnippets("snippets"); const QLatin1String kId("id");
const QLatin1String SnippetsCollection::kTrigger("trigger"); const QLatin1String kComplement("complement");
const QLatin1String SnippetsCollection::kId("id"); const QLatin1String kGroup("group");
const QLatin1String SnippetsCollection::kComplement("complement"); const QLatin1String kRemoved("removed");
const QLatin1String SnippetsCollection::kGroup("group"); const QLatin1String kModified("modified");
const QLatin1String SnippetsCollection::kRemoved("removed");
const QLatin1String SnippetsCollection::kModified("modified");
// Hint // Hint
SnippetsCollection::Hint::Hint(int index) : m_index(index) SnippetsCollection::Hint::Hint(int index) : m_index(index)
@@ -95,13 +93,9 @@ SnippetsCollection *SnippetsCollection::instance()
// SnippetsCollection // SnippetsCollection
SnippetsCollection::SnippetsCollection() SnippetsCollection::SnippetsCollection()
: m_userSnippetsPath(Core::ICore::userResourcePath().pathAppended("snippets/").toString()) : m_userSnippetsFile(Core::ICore::userResourcePath("snippets/snippets.xml")),
, m_userSnippetsFile(QLatin1String("snippets.xml")) m_builtInSnippetsFiles(Core::ICore::resourcePath("snippets").dirEntries({"*.xml"}))
{ {
QDir dir = Core::ICore::resourcePath("snippets").toDir();
dir.setNameFilters(QStringList(QLatin1String("*.xml")));
foreach (const QFileInfo &fi, dir.entryInfoList())
m_builtInSnippetsFiles.append(fi.absoluteFilePath());
connect(Core::ICore::instance(), &Core::ICore::coreOpened, connect(Core::ICore::instance(), &Core::ICore::coreOpened,
this, &SnippetsCollection::identifyGroups); this, &SnippetsCollection::identifyGroups);
@@ -249,7 +243,7 @@ void SnippetsCollection::restoreRemovedSnippets(const QString &groupId)
QVector<Snippet> toRestore(std::distance(m_activeSnippetsEnd[group], m_snippets[group].end())); QVector<Snippet> toRestore(std::distance(m_activeSnippetsEnd[group], m_snippets[group].end()));
std::copy(m_activeSnippetsEnd[group], m_snippets[group].end(), toRestore.begin()); std::copy(m_activeSnippetsEnd[group], m_snippets[group].end(), toRestore.begin());
m_snippets[group].erase(m_activeSnippetsEnd[group], m_snippets[group].end()); m_snippets[group].erase(m_activeSnippetsEnd[group], m_snippets[group].end());
foreach (Snippet snippet, toRestore) { for (Snippet snippet : qAsConst(toRestore)) {
snippet.setIsRemoved(false); snippet.setIsRemoved(false);
insertSnippet(snippet); insertSnippet(snippet);
} }
@@ -260,7 +254,7 @@ Snippet SnippetsCollection::revertedSnippet(int index, const QString &groupId) c
const Snippet &candidate = snippet(index, groupId); const Snippet &candidate = snippet(index, groupId);
Q_ASSERT(candidate.isBuiltIn()); Q_ASSERT(candidate.isBuiltIn());
foreach (const QString &fileName, m_builtInSnippetsFiles) { for (const FilePath &fileName : m_builtInSnippetsFiles) {
const QList<Snippet> &builtIn = readXML(fileName, candidate.id()); const QList<Snippet> &builtIn = readXML(fileName, candidate.id());
if (builtIn.size() == 1) if (builtIn.size() == 1)
return builtIn.at(0); return builtIn.at(0);
@@ -273,7 +267,7 @@ void SnippetsCollection::reset(const QString &groupId)
clearSnippets(groupIndex(groupId)); clearSnippets(groupIndex(groupId));
const QList<Snippet> &builtInSnippets = allBuiltInSnippets(); const QList<Snippet> &builtInSnippets = allBuiltInSnippets();
foreach (const Snippet &snippet, builtInSnippets) for (const Snippet &snippet : builtInSnippets)
if (groupId == snippet.groupId()) if (groupId == snippet.groupId())
insertSnippet(snippet); insertSnippet(snippet);
} }
@@ -284,29 +278,29 @@ void SnippetsCollection::reload()
const QList<Snippet> &builtInSnippets = allBuiltInSnippets(); const QList<Snippet> &builtInSnippets = allBuiltInSnippets();
QHash<QString, Snippet> activeBuiltInSnippets; QHash<QString, Snippet> activeBuiltInSnippets;
foreach (const Snippet &snippet, builtInSnippets) for (const Snippet &snippet : builtInSnippets)
activeBuiltInSnippets.insert(snippet.id(), snippet); activeBuiltInSnippets.insert(snippet.id(), snippet);
const QList<Snippet> &userSnippets = readXML(m_userSnippetsPath + m_userSnippetsFile); const QList<Snippet> &userSnippets = readXML(m_userSnippetsFile);
foreach (const Snippet &snippet, userSnippets) { for (const Snippet &snippet : userSnippets) {
if (snippet.isBuiltIn()) if (snippet.isBuiltIn())
// This user snippet overrides the corresponding built-in snippet. // This user snippet overrides the corresponding built-in snippet.
activeBuiltInSnippets.remove(snippet.id()); activeBuiltInSnippets.remove(snippet.id());
insertSnippet(snippet); insertSnippet(snippet);
} }
foreach (const Snippet &snippet, activeBuiltInSnippets) for (const Snippet &snippet : qAsConst(activeBuiltInSnippets))
insertSnippet(snippet); insertSnippet(snippet);
} }
bool SnippetsCollection::synchronize(QString *errorString) bool SnippetsCollection::synchronize(QString *errorString)
{ {
if (!QFile::exists(m_userSnippetsPath) && !QDir().mkpath(m_userSnippetsPath)) { if (!m_userSnippetsFile.parentDir().ensureWritableDir()) {
*errorString = tr("Cannot create user snippet directory %1").arg( *errorString = tr("Cannot create user snippet directory %1")
QDir::toNativeSeparators(m_userSnippetsPath)); .arg(m_userSnippetsFile.parentDir().toUserOutput());
return false; return false;
} }
Utils::FileSaver saver(Utils::FilePath::fromString(m_userSnippetsPath + m_userSnippetsFile)); FileSaver saver(m_userSnippetsFile);
if (!saver.hasError()) { if (!saver.hasError()) {
using GroupIndexByIdConstIt = QHash<QString, int>::ConstIterator; using GroupIndexByIdConstIt = QHash<QString, int>::ConstIterator;
@@ -349,10 +343,10 @@ void SnippetsCollection::writeSnippetXML(const Snippet &snippet, QXmlStreamWrite
writer->writeEndElement(); writer->writeEndElement();
} }
QList<Snippet> SnippetsCollection::readXML(const QString &fileName, const QString &snippetId) const QList<Snippet> SnippetsCollection::readXML(const FilePath &fileName, const QString &snippetId) const
{ {
QList<Snippet> snippets; QList<Snippet> snippets;
QFile file(fileName); QFile file(fileName.toString());
if (file.exists() && file.open(QIODevice::ReadOnly)) { if (file.exists() && file.open(QIODevice::ReadOnly)) {
QXmlStreamReader xml(&file); QXmlStreamReader xml(&file);
if (xml.readNextStartElement()) { if (xml.readNextStartElement()) {
@@ -415,7 +409,7 @@ QList<Snippet> SnippetsCollection::readXML(const QString &fileName, const QStrin
QList<Snippet> SnippetsCollection::allBuiltInSnippets() const QList<Snippet> SnippetsCollection::allBuiltInSnippets() const
{ {
QList<Snippet> builtInSnippets; QList<Snippet> builtInSnippets;
foreach (const QString &fileName, m_builtInSnippetsFiles) for (const FilePath &fileName : m_builtInSnippetsFiles)
builtInSnippets.append(readXML(fileName)); builtInSnippets.append(readXML(fileName));
return builtInSnippets; return builtInSnippets;
} }
@@ -442,3 +436,6 @@ bool SnippetsCollection::isGroupKnown(const QString &groupId) const
{ {
return m_groupIndexById.value(groupId, -1) != -1; return m_groupIndexById.value(groupId, -1) != -1;
} }
} // Internal
} // TextEditor

View File

@@ -27,6 +27,8 @@
#include "snippet.h" #include "snippet.h"
#include <utils/filepath.h>
#include <QVector> #include <QVector>
#include <QStringList> #include <QStringList>
#include <QHash> #include <QHash>
@@ -104,26 +106,16 @@ private:
void updateActiveSnippetsEnd(int groupIndex); void updateActiveSnippetsEnd(int groupIndex);
QList<Snippet> readXML(const QString &fileName, const QString &snippetId = QString()) const; QList<Snippet> readXML(const Utils::FilePath &fileName, const QString &snippetId = {}) const;
void writeSnippetXML(const Snippet &snippet, QXmlStreamWriter *writer) const; void writeSnippetXML(const Snippet &snippet, QXmlStreamWriter *writer) const;
QList<Snippet> allBuiltInSnippets() const; QList<Snippet> allBuiltInSnippets() const;
static const QLatin1String kSnippet;
static const QLatin1String kSnippets;
static const QLatin1String kTrigger;
static const QLatin1String kId;
static const QLatin1String kComplement;
static const QLatin1String kGroup;
static const QLatin1String kRemoved;
static const QLatin1String kModified;
// Built-in snippets are specified in XMLs distributed in a system's folder. Snippets // Built-in snippets are specified in XMLs distributed in a system's folder. Snippets
// created or modified/removed (if they are built-ins) by the user are stored in user's // created or modified/removed (if they are built-ins) by the user are stored in user's
// folder. // folder.
QString m_userSnippetsPath; const Utils::FilePath m_userSnippetsFile;
QString m_userSnippetsFile; const Utils::FilePaths m_builtInSnippetsFiles;
QStringList m_builtInSnippetsFiles;
// Snippets for each group are kept in a list. However, not all of them are necessarily // Snippets for each group are kept in a list. However, not all of them are necessarily
// active. Specifically, removed built-in snippets are kept as the last ones (for each // active. Specifically, removed built-in snippets are kept as the last ones (for each