forked from qt-creator/qt-creator
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:
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user