Упрощение git/превью: copyCodeBlock, parseBlocks на splitMdBlocks, кэш diff, пагинация

- MdParser.copyCodeBlock(id): один вызов вместо get+copy в 3 QML-местах
- parseBlocks переписан на splitMdBlocks (убит regex только для ```, заодно чинит ~~~); renderInner без побочек, save/restore удалены
- Кэш diff-блоков (хеши+пути, 8 шт, >1МБ не кэшируем); регистрация кодов всегда в главном потоке
- История: пагинация limit+Показать ещё с сохранением выбора; willDelete; busy только на время async
- GitManager: commitFile точечно (общий commitFromIndex), fileExistedAt, workdirContent через DocumentManager.readTextFile, fileGitStatus через relativePath; удалены fileDiffText/Html и 2-arg fileHistory
- MarkdownView: дебаунс async-ветки 80мс + гашение протухших ответов
This commit is contained in:
2026-09-06 22:17:13 +03:00
parent 0846605c2b
commit 1f140d3433
9 changed files with 160 additions and 139 deletions
+6
View File
@@ -1,5 +1,6 @@
#pragma once
#include <QCache>
#include <QObject>
#include <QString>
#include <QVariantList>
@@ -46,6 +47,8 @@ public:
Q_INVOKABLE QString getCodeBlock(const QString &id) const;
Q_INVOKABLE void copyToClipboard(const QString &text) const;
// Скопировать кодовый блок по id (get + copy одним вызовом). false — нечего копировать.
Q_INVOKABLE bool copyCodeBlock(const QString &id) const;
Q_INVOKABLE QString highlightedCode(const QString &code, const QString &language) const;
signals:
@@ -62,4 +65,7 @@ private:
Impl *m = nullptr;
int m_asyncId = 0;
// Кэш diff-блоков на время открытого диалога (ключ — хеши содержимого+пути).
// Хранятся БЕЗ регистрации кодов; регистрация — при каждой выдаче.
QCache<QString, QVariantList> m_diffCache;
};