BayTemplate/include/document.h

240 lines
7.6 KiB
C
Raw Permalink Normal View History

#ifndef DOCUMENT_H
#define DOCUMENT_H
#include <QString>
#include <QDateTime>
#include <QMap>
#include <QVariant>
#include <QObject>
#include <QByteArray>
/**
* @brief BayTemplate
*
* Document Model
* 1. / DesignerScene JSON/XML
* 2.
* 3. DesignerScene CMainWindow
*
*
* - Document DesignerScene Scene
* - Document DesignerScene CMainWindow
* -
*/
class DesignerScene;
class GraphicsBaseItem;
class GraphicsItemGroup;
class QGraphicsScene;
class QGraphicsItem;
class QJsonObject;
class Document : public QObject
{
Q_OBJECT
public:
explicit Document(QObject *parent = nullptr);
~Document();
// =================================================================
// 场景关联(组合关系)
// =================================================================
/**
* @brief DesignerScene
* @param scene Document
*
*
* Document Scene 使 scene
*/
void setScene(DesignerScene* scene);
/**
* @brief
*/
DesignerScene* scene() const;
// =================================================================
// 文件操作
// =================================================================
/**
* @brief
* @param filename 使 filename()
* @return true
*
*
* 1. filename m_filename 使 m_filename
* 2. JSON
* 3.
* 4. lastSavedTime setModified(false)
* 5. saveStatusChanged
*
* m_filename
*/
bool saveToFile(const QString& filename = QString());
/**
* @brief Save As
* @param filename
* @return true
*
*
* 1. JSON
* 2.
* 3. m_filename
* 4. lastSavedTime setModified(false)
* 5. filenameChanged modifiedChanged
*
* saveToFile()
* - saveAsToFile() m_filename
* - saveAsToFile() "另存为"
*/
bool saveAsToFile(const QString& filename);
/**
* @brief
* @param filename
* @return true
*
*
* 1. JSON
* 2. scene
* 3.
* 4. m_filename m_modified
*/
bool loadFromFile(const QString& filename);
// =================================================================
// 序列化接口(二进制格式)
// =================================================================
/**
* @brief QByteArray
* @return JSON
*/
QByteArray serialize() const;
/**
* @brief QByteArray
* @param data JSON
* @return true
*/
bool deserialize(const QByteArray& data);
// =================================================================
// 状态管理
// =================================================================
/**
* @brief
*/
QString filename() const { return m_filename; }
void setFilename(const QString& filename) { m_filename = filename; }
/**
* @brief
*/
bool isModified() const { return m_modified; }
void setModified(bool modified) {
if (m_modified != modified) {
m_modified = modified;
emit modifiedChanged(m_modified);
}
}
/**
* @brief /
*/
QString version() const { return m_version; }
/**
* @brief
*/
QDateTime created() const { return m_created; }
/**
* @brief
*/
QDateTime modifiedTime() const { return m_modifiedTime; }
/**
* @brief
*/
QDateTime lastSavedTime() const { return m_lastSavedTime; }
// =================================================================
// 元数据(可扩展)
// =================================================================
/**
* @brief
* @param key
* @param value
*/
void setMetaData(const QString& key, const QVariant& value);
/**
* @brief
*/
QVariant metaData(const QString& key) const;
signals:
/**
* @brief
* @param modified
*
* CMainWindow *
*/
void modifiedChanged(bool modified);
/**
* @brief
* @param filename
*
* CMainWindow
*/
void filenameChanged(const QString& filename);
/**
* @brief /
* @param success
* @param message
*/
void saveStatusChanged(bool success, const QString& message);
private:
// 内部实现
bool saveInternal(const QString& filename);
bool loadInternal(const QString& filename);
// 图元序列化/反序列化
QJsonObject serializeItem(GraphicsBaseItem* item) const;
void deserializeItem(const QJsonObject& obj, QGraphicsScene* scene, QGraphicsItem* parent);
QString getTypeString(GraphicsBaseItem* item) const;
QJsonObject serializeItemProperties(GraphicsBaseItem* item) const;
// QVariant <-> QJsonValue 转换
QJsonValue toJsonValue(const QVariant& value) const;
QVariant fromJsonValue(const QJsonValue& value) const;
GraphicsBaseItem* deserializeRectItem(const QJsonObject& obj);
GraphicsBaseItem* deserializeBusSectionItem(const QJsonObject& obj);
GraphicsBaseItem* deserializePolygonItem(const QJsonObject& obj);
GraphicsItemGroup* deserializeItemGroup(const QJsonObject& obj, QGraphicsScene* scene, QGraphicsItem* parent);
QString m_filename; // 文档文件名
bool m_modified; // 是否被修改
QString m_version; // 文件格式版本
QDateTime m_created; // 创建时间
QDateTime m_modifiedTime; // 最后修改时间
QDateTime m_lastSavedTime; // 最后保存时间
QMap<QString, QVariant> m_metaData; // 自定义元数据
DesignerScene* m_pScene; // 关联的场景(组合关系,非拥有所有权)
};
#endif // DOCUMENT_H