QtNovelUI/libTextEdit/entitydata.h

242 lines
7.2 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 <QList>
#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;
virtual QSizeF minSizeHint() const = 0;
virtual QSizeF maxSizeHint() const = 0;
virtual std::pair<float, float> sizeStretchHint() 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 state
*/
virtual void setVisible(bool state);
/**
* @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);
virtual void setMinSizeHint(const QSizeF &hint);
virtual void setMaxSizeHint(const QSizeF &hint);
virtual void setStretchHint(const std::pair<float, float> &hint);
virtual void setStyledText(const QString &content) = 0;
virtual void setPlainText(const QString &content) = 0;
// EntityData ====================================================
virtual QString uID() const override;
virtual EntityType type() const override;
virtual MemberOri oritation() const override;
virtual MemberType displayType() const override;
virtual std::pair<AnchorTarget, EntityData *> anchorTarget() const override;
virtual std::tuple<AnchorPos, EntityData::offset_h, EntityData::offset_v> anchorPos() const override;
virtual QList<EntityData *> children() const override;
virtual bool isVisible() const override;
virtual QSizeF minSizeHint() const override;
virtual QSizeF maxSizeHint() const override;
virtual std::pair<float, float> sizeStretchHint() const override;
private:
bool visible_bool;
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;
QList<EntityData *> children_store;
QSizeF size_min, size_max;
std::pair<float, float> stretch_pair;
protected:
float appoint_layout_minvalue() const;
};
/**
* @brief 文档数据模型
*/
class Document : public SpecificEntityData {
public:
Document(const QString &name);
// EntityData interface
public:
virtual QString styledText() const override;
virtual QString plainText() const override;
// SpecificEntityData interface
public:
virtual void resetContentLayout(MemberOri oritation, MemberType) override;
};
} // namespace PresentDatas
#endif // ENTITYDATA_H