QtNovelUI/libTextEdit/entitydata.h

232 lines
6.6 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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