232 lines
6.6 KiB
C++
232 lines
6.6 KiB
C++
#ifndef ENTITYDATA_H
|
||
#define ENTITYDATA_H
|
||
|
||
#include <QRectF>
|
||
#include <QString>
|
||
#include <tuple>
|
||
|
||
namespace PresentDatas {
|
||
|
||
enum class EntityType {
|
||
TEXT_RANGE, // 字符集合,包含段落和句子
|
||
IMAGE_CUBE, // 图片展示块
|
||
HREF_FRAGS, // 超链接
|
||
TABLE_VIEW, // 表格视图
|
||
LIST_VIEW, // 列表视图
|
||
INTERACTIVE_EXTENSION, // 交互式拓展插件视图
|
||
DISPLAY_GROUP, // 元素混合组织成包
|
||
DOCUMENT_ENTITY
|
||
};
|
||
|
||
enum class MemberOri {
|
||
H_LEFT_TO_RIGHT, // 从左到右横向排版
|
||
H_RIGHT_TO_LEFT, // 从右到左横向排版
|
||
H_CENTER_IN, // 中央对准横向排布
|
||
V_LEFT_TO_RIGHT, // 从左到右纵向排布
|
||
V_RIGHT_TO_LEFT, // 从右到左纵向排布
|
||
V_CENTER_IN // 中央对准纵向排布
|
||
};
|
||
|
||
enum class MemberType {
|
||
BLOCKS, // 成员被视为块元素
|
||
INLINES // 成员被视图行内元素
|
||
};
|
||
|
||
enum class AnchorTarget {
|
||
NONE, // 文档二维平面排版
|
||
WINDOW, // 窗口相对偏移定位
|
||
DOCUMENT, // 文档相对偏移定位
|
||
ELEMENT //元素相对偏移定位
|
||
};
|
||
|
||
enum class AnchorPos {
|
||
NONE,
|
||
|
||
POINT_LEFT_TOP,
|
||
POINT_LEFT_CENTER,
|
||
POINT_LEFT_BOTTOM,
|
||
|
||
POINT_CENTER_TOP,
|
||
POINT_CENTER_BOTH,
|
||
POINT_CENTER_BOTTOM,
|
||
|
||
POINT_RIGHT_TOP,
|
||
POINT_RIGHT_CENTER,
|
||
POINT_RIGHT_BOTTOM
|
||
};
|
||
|
||
/**
|
||
* @brief 基础实体数据
|
||
*/
|
||
class EntityData {
|
||
public:
|
||
virtual ~EntityData() = default;
|
||
|
||
// 标定相关 =================================================================
|
||
/**
|
||
* @brief 获取实体的ID
|
||
* @return
|
||
*/
|
||
virtual QString uID() const = 0;
|
||
|
||
/**
|
||
* @brief 内容文本
|
||
* @return
|
||
*/
|
||
virtual QString styledText() const = 0;
|
||
|
||
/**
|
||
* @brief 不带格式的普通文本
|
||
* @return
|
||
*/
|
||
virtual QString plainText() const = 0;
|
||
// 实体属性 ===================================================================
|
||
/**
|
||
* @brief 获取元素可视性
|
||
* @return
|
||
*/
|
||
virtual bool isVisible() const = 0;
|
||
|
||
/**
|
||
* @brief 本实体的种类
|
||
* @return
|
||
*/
|
||
virtual EntityType type() const = 0;
|
||
|
||
// 排版相关 ===================================================================
|
||
/**
|
||
* @brief 成员排布朝向
|
||
* @return
|
||
*/
|
||
virtual MemberOri oritation() const = 0;
|
||
|
||
/**
|
||
* @brief 成员排版类型
|
||
* @return
|
||
*/
|
||
virtual MemberType displayType() const = 0;
|
||
|
||
/**
|
||
* @brief 获取元素锚定位置
|
||
* // pair<NONE, nullptr> 文档二维平面排版
|
||
* // pair<ELEMENT, inst_ptr> 浮动排版,文档元素定位
|
||
* // pair<WINDOW, nullptr> 浮动排版,窗口偏移定位
|
||
* // pair<DOCUMENT, nullptr> 浮动排版,文档偏移定位
|
||
* @return
|
||
*/
|
||
virtual std::pair<AnchorTarget, EntityData *> anchorTarget() const = 0;
|
||
|
||
typedef float offset_h;
|
||
typedef float offset_v;
|
||
/**
|
||
* @brief 锚定偏移位置
|
||
* @return
|
||
*/
|
||
virtual std::tuple<AnchorPos, offset_h, offset_v> anchorPos() const = 0;
|
||
|
||
/**
|
||
* @brief 计算最小尺寸
|
||
* @param outline
|
||
* @return
|
||
*/
|
||
virtual QSizeF minSizeHint(const QRectF &outline) const = 0;
|
||
|
||
/**
|
||
* @brief 计算当前尺寸
|
||
* @param outline
|
||
* @return
|
||
*/
|
||
virtual QSizeF sizeHint(const QRectF &outline) const = 0;
|
||
|
||
/**
|
||
* @brief 子元素数据,安装元素书序
|
||
* @return
|
||
*/
|
||
virtual QList<EntityData *> children() const = 0;
|
||
};
|
||
|
||
/**
|
||
* 具体化的实体数据类型,实现共同的接口逻辑
|
||
*/
|
||
class SpecificEntityData : public EntityData {
|
||
public:
|
||
SpecificEntityData(EntityType type, const QString &uid);
|
||
virtual ~SpecificEntityData() = default;
|
||
|
||
/**
|
||
* @brief 设置内容排版约束信息
|
||
* @param oritation
|
||
* @param child_type
|
||
*/
|
||
virtual void resetContentLayout(MemberOri oritation, MemberType child_type);
|
||
|
||
/**
|
||
* @brief 设置相对布局元素
|
||
* @param type
|
||
* @param tptr
|
||
*/
|
||
virtual void setAnchorTo(AnchorTarget type, EntityData *tptr = nullptr);
|
||
|
||
/**
|
||
* @brief 设置相对布局偏移量
|
||
* @param point
|
||
* @param hoffset
|
||
* @param v_offset
|
||
*/
|
||
virtual void setAnchorPos(AnchorPos point, EntityData::offset_h hoffset, EntityData::offset_v v_offset);
|
||
|
||
/**
|
||
* @brief 在指定位置插入子元素
|
||
* @param inst
|
||
* @param index -1:尾缀位置
|
||
*/
|
||
virtual void insertChild(EntityData *inst, int index = -1);
|
||
/**
|
||
* @brief 移除指定子元素
|
||
* @param inst
|
||
*/
|
||
virtual void removeChild(EntityData *inst);
|
||
|
||
// EntityData ====================================================
|
||
virtual QString uID() const;
|
||
virtual EntityType type() const;
|
||
virtual MemberOri oritation() const;
|
||
virtual MemberType displayType() const;
|
||
virtual std::pair<AnchorTarget, EntityData *> anchorTarget() const;
|
||
virtual std::tuple<AnchorPos, EntityData::offset_h, EntityData::offset_v> anchorPos() const;
|
||
virtual QList<EntityData *> children() const;
|
||
|
||
private:
|
||
EntityType type_store;
|
||
QString document_id;
|
||
MemberOri oritation_store;
|
||
MemberType layout_type;
|
||
std::tuple<AnchorTarget, EntityData *, AnchorPos, EntityData::offset_h, EntityData::offset_v> anchor_info;
|
||
};
|
||
|
||
/**
|
||
* @brief 文档数据模型
|
||
*/
|
||
class DocumentData : public SpecificEntityData {
|
||
public:
|
||
DocumentData(const QString &name);
|
||
|
||
// EntityData interface
|
||
public:
|
||
virtual QString styledText() const override;
|
||
virtual QString plainText() const override;
|
||
virtual bool isVisible() const override;
|
||
virtual QSizeF minSizeHint(const QRectF &outline) const override;
|
||
virtual QSizeF sizeHint(const QRectF &outline) const override;
|
||
|
||
// SpecificEntityData interface
|
||
public:
|
||
virtual void resetContentLayout(MemberOri oritation, MemberType) override;
|
||
|
||
private:
|
||
};
|
||
|
||
} // namespace PresentDatas
|
||
|
||
#endif // ENTITYDATA_H
|