#ifndef ENTITYDATA_H #define ENTITYDATA_H #include #include #include 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 文档二维平面排版 * // pair 浮动排版,文档元素定位 * // pair 浮动排版,窗口偏移定位 * // pair 浮动排版,文档偏移定位 * @return */ virtual std::pair anchorTarget() const = 0; typedef float offset_h; typedef float offset_v; /** * @brief 锚定偏移位置 * @return */ virtual std::tuple 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 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() const; virtual std::tuple anchorPos() const; virtual QList children() const; private: EntityType type_store; QString document_id; MemberOri oritation_store; MemberType layout_type; std::tuple 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