QtNovelUI/libTextEdit/entitydata.h

242 lines
7.2 KiB
C
Raw Normal View History

#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