Инкрементальный индекс, пресеты автосейва, диалог Настройки
- VaultIndex: updateFile/removeFile/syncIncremental (mtime+size), полный рескан только на старте/смене/внешних изменениях; relink висячих [[ссылок]] при создании файла; FileStore.externalChanged для внешних правок - QML: сейвы и правки идут точечно, дерево — через syncIncremental - Настройки: пресеты safe/balanced/eco/manual (диск 2/5/10с/выкл, коммит после паузы 5/15/60с/вручную), диалог с +/-, шкалами и подсказкой; коммит только в простое, в manual — по Ctrl+S - Удалены highlightedCode, словный merge, fileDiffText/Html, 2-arg fileHistory; renderInner без побочек - Тесты: инкремент индекса, пресеты, autosaveEnabled, ~~~-блоки
This commit is contained in:
+34
-3
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <QDateTime>
|
||||
#include <QObject>
|
||||
#include <QVariantList>
|
||||
#include <QHash>
|
||||
@@ -21,12 +22,22 @@ public:
|
||||
|
||||
QVariantList nodes() const { return m_nodes; }
|
||||
QVariantList edges() const { return m_edges; }
|
||||
int fileCount() const { return m_fileCount; }
|
||||
int fileCount() const { return m_fileMeta.size(); }
|
||||
bool busy() const { return m_busy; }
|
||||
|
||||
// Полное пересканирование хранилища.
|
||||
// Полное пересканирование хранилища (старт, смена хранилища, вручную, внешние изменения).
|
||||
Q_INVOKABLE void rebuild(const QString &vault);
|
||||
|
||||
// Точечно перечитать один файл (создание/сохранение/переименование-в). Дёшево.
|
||||
Q_INVOKABLE void updateFile(const QString &path);
|
||||
|
||||
// Убрать один файл из индекса (удаление/переименование-из).
|
||||
Q_INVOKABLE void removeFile(const QString &path);
|
||||
|
||||
// Сверить список файлов с диском по mtime/size и дочитать только изменённые.
|
||||
// Для внешних изменений (синхронизация, другие программы).
|
||||
Q_INVOKABLE void syncIncremental();
|
||||
|
||||
// Теги файла / ссылки файла (список {text,path} для открытия).
|
||||
Q_INVOKABLE QStringList tagsOfFile(const QString &path) const;
|
||||
Q_INVOKABLE QVariantList linksOfFile(const QString &path) const;
|
||||
@@ -41,13 +52,32 @@ signals:
|
||||
void busyChanged();
|
||||
|
||||
private:
|
||||
struct FileMeta {
|
||||
QDateTime mtime;
|
||||
qint64 size = -1;
|
||||
bool operator==(const FileMeta &o) const { return mtime == o.mtime && size == o.size; }
|
||||
bool operator!=(const FileMeta &o) const { return !(*this == o); }
|
||||
};
|
||||
|
||||
QString nodeKeyFor(const QString &path, bool isFile) const;
|
||||
void collectFiles(const QString &dir, int depth, QStringList &out) const;
|
||||
void parseFile(const QString &path);
|
||||
QString resolveLink(const QString &fileDir, const QString &target) const;
|
||||
int ensureNode(const QString &key, const QString &name, const QString &type);
|
||||
void addEdge(const QString &from, const QString &to);
|
||||
void deduplicateEdges();
|
||||
// Файл попадает в индекс?
|
||||
bool shouldIndex(const QString &cleanPath) const;
|
||||
// Снять собственные данные файла (теги/исходящие рёбра/ссылки), узел и входящие — нет.
|
||||
void purgeOutgoing(const QString &cleanPath);
|
||||
// Полностью выкинуть файл: + входящие рёбра/ссылки, узел, bybase, мета.
|
||||
void dropFile(const QString &cleanPath);
|
||||
void dropNode(const QString &key);
|
||||
// Перепарсить файлы, чьи неразрешённые ссылки могли починиться новым файлом.
|
||||
bool relinkForNewFile(const QString &newPath);
|
||||
static FileMeta metaOf(const QString &cleanPath);
|
||||
|
||||
QString m_vault;
|
||||
QVariantList m_nodes;
|
||||
QVariantList m_edges;
|
||||
QHash<QString, int> m_nodeById;
|
||||
@@ -55,6 +85,7 @@ private:
|
||||
QHash<QString, QVariantList> m_linksOfFile;
|
||||
QHash<QString, QStringList> m_filesWithTag;
|
||||
QHash<QString, QString> m_fileByBase; // имя без расширения → путь
|
||||
int m_fileCount = 0;
|
||||
QHash<QString, QStringList> m_unresolvedByFile; // файл → неразрешённые цели ссылок
|
||||
QHash<QString, FileMeta> m_fileMeta; // проиндексированные .md
|
||||
bool m_busy = false;
|
||||
};
|
||||
Reference in New Issue
Block a user