fdf59f5b39
- Frontmatter: шапка --- ключ: значение (источник правды свойств) - VaultSettings: .flora/settings.json (журнал, sqlEnabled, sqlMaxRows) - Database: files/tags/file_tags/links/properties, только SELECT/WITH на read-only соединении (mode=ro + query_only + зонд), лимит строк - MdParser: ~sql-блоки таблицей (parseBlocks + Renderer), шапка скрыта в просмотре - Окно: per-window Database/VaultSettings, sync при сохранении, дебаунс reindex - QML: VaultSettingsDialog, FilePropertiesDialog, меню, автообновление ~sql - FileStore.journalDir, DocumentManager.reloadDocument - Тест flora_db_test (23/23 зелёных)
104 lines
4.3 KiB
C++
104 lines
4.3 KiB
C++
#pragma once
|
|
|
|
#include <QObject>
|
|
#include <QTimer>
|
|
#include <QList>
|
|
|
|
// Управление открытыми документами: вкладки, содержимое, признак «изменён»,
|
|
// автосохранение каждые 5 секунд (защита от потери текста).
|
|
// Режимы редактирование/просмотр — на стороне QML (на документ).
|
|
class DocumentManager : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
Q_PROPERTY(QStringList openTabs READ openTabs NOTIFY openTabsChanged)
|
|
Q_PROPERTY(int activeIndex READ activeIndex WRITE setActiveIndex NOTIFY activeIndexChanged)
|
|
Q_PROPERTY(int secondaryIndex READ secondaryIndex WRITE setSecondaryIndex NOTIFY secondaryIndexChanged)
|
|
Q_PROPERTY(bool sideBySide READ sideBySide WRITE setSideBySide NOTIFY sideBySideChanged)
|
|
Q_PROPERTY(int autosaveIntervalMs READ autosaveIntervalMs WRITE setAutosaveIntervalMs
|
|
NOTIFY autosaveIntervalChanged)
|
|
Q_PROPERTY(bool autosaveEnabled READ autosaveEnabled WRITE setAutosaveEnabled
|
|
NOTIFY autosaveEnabledChanged)
|
|
Q_PROPERTY(QString lastStatus READ lastStatus NOTIFY lastStatusChanged)
|
|
|
|
public:
|
|
explicit DocumentManager(QObject *parent = nullptr);
|
|
|
|
QStringList openTabs() const;
|
|
int activeIndex() const;
|
|
Q_INVOKABLE void setActiveIndex(int index);
|
|
int secondaryIndex() const;
|
|
Q_INVOKABLE void setSecondaryIndex(int index);
|
|
bool sideBySide() const;
|
|
Q_INVOKABLE void setSideBySide(bool on);
|
|
int autosaveIntervalMs() const;
|
|
Q_INVOKABLE void setAutosaveIntervalMs(int ms);
|
|
bool autosaveEnabled() const;
|
|
Q_INVOKABLE void setAutosaveEnabled(bool on);
|
|
QString lastStatus() const;
|
|
|
|
// Открывает документ (при необходимости создаётся вкладка). Возвращает индекс.
|
|
Q_INVOKABLE int openDocument(const QString &path);
|
|
|
|
// Содержимое/заголовок/признак по индексу вкладки.
|
|
Q_INVOKABLE QString contentAt(int index) const;
|
|
Q_INVOKABLE QString titleAt(int index) const;
|
|
Q_INVOKABLE QString pathAt(int index) const;
|
|
Q_INVOKABLE bool isDirty(int index) const;
|
|
|
|
// Редактирование: пользователь изменил текст вкладки.
|
|
Q_INVOKABLE void updateContent(int index, const QString &text);
|
|
|
|
// Можно ли открыть файл в текстовом редакторе (md и прочие текстовые).
|
|
Q_INVOKABLE bool isTextForEditor(const QString &path) const;
|
|
|
|
Q_INVOKABLE void saveDocument(int index);
|
|
Q_INVOKABLE void saveAll();
|
|
|
|
// Перечитать файл с диска в чистую вкладку (после правки свойств извне
|
|
// редактора). Грязную вкладку не трогает. Возвращает "" или текст ошибки.
|
|
Q_INVOKABLE QString reloadDocument(int index);
|
|
|
|
Q_INVOKABLE bool closeTab(int index);
|
|
Q_INVOKABLE void moveTab(int from, int to);
|
|
|
|
signals:
|
|
void openTabsChanged();
|
|
void activeIndexChanged();
|
|
void secondaryIndexChanged();
|
|
void sideBySideChanged();
|
|
void autosaveIntervalChanged();
|
|
void autosaveEnabledChanged();
|
|
void lastStatusChanged();
|
|
|
|
// Уведомляет вкладку о смене признака «изменено».
|
|
void dirtyFlagChanged(int index);
|
|
// Содержимое документа изменилось (вкладка index).
|
|
void contentChanged(int index);
|
|
// Файл фактически записан на диск.
|
|
void documentSaved(int index, const QString &path);
|
|
|
|
private:
|
|
struct Doc {
|
|
QString path;
|
|
QString content;
|
|
bool dirty = false;
|
|
};
|
|
|
|
void ensureAutosave();
|
|
QString readFile(const QString &path, bool *ok) const;
|
|
|
|
public:
|
|
// Общее чтение текстового файла с лимитом (защита от OOM). Используется и GitManager.
|
|
static QString readTextFile(const QString &path, qint64 maxBytes = 10LL * 1024 * 1024,
|
|
bool *ok = nullptr);
|
|
|
|
QList<Doc> m_docs;
|
|
int m_active = -1;
|
|
int m_secondary = -1;
|
|
bool m_sideBySide = false;
|
|
int m_autosaveMs = 5000;
|
|
bool m_autosaveEnabled = true;
|
|
QString m_lastStatus;
|
|
QTimer *m_autosave = nullptr;
|
|
}; |