Files
Flora/src/core/DocumentManager.h
T

104 lines
4.3 KiB
C++
Raw Normal View History

#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;
};