#ifndef ENTITYDATA_H #define ENTITYDATA_H #include #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; virtual QSizeF minSizeHint() const = 0; virtual QSizeF maxSizeHint() const = 0; virtual std::pair sizeStretchHint() 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 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 &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() const override; virtual std::tuple anchorPos() const override; virtual QList children() const override; virtual bool isVisible() const override; virtual QSizeF minSizeHint() const override; virtual QSizeF maxSizeHint() const override; virtual std::pair sizeStretchHint() const override; private: bool visible_bool; EntityType type_store; QString document_id; MemberOri oritation_store; MemberType layout_type; std::tuple anchor_info; QList children_store; QSizeF size_min, size_max; std::pair 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