#ifndef SPLITVIEW_INTERFACE_H #define SPLITVIEW_INTERFACE_H #include #if defined(SPLITVIEW_LIBRARY) # define SPLITVIEW_EXPORT Q_DECL_EXPORT #else # define SPLITVIEW_EXPORT Q_DECL_IMPORT #endif #include namespace split_frame { class SplitView; class ResManager; /** * @brief 面板分割方向 */ enum class SplitType { SPLIT_H_LFIRST = 0, SPLIT_H_RFIRST = 1, SPLIT_V_TFIRST = 2, SPLIT_V_BFIRST = 3 }; /** * @brief 临时视图贴附方位 */ enum class DockType { LEFT = 0, RIGHT = 1, TOP = 2, BOTTOM = 3 }; /** * @brief 视图资源基类 */ class ViewRes { public: virtual ~ViewRes() = default; /** * @brief 资源管理实例 * @return */ virtual ResManager *splitManager() const = 0; /** * @brief 父资源实例 * @return */ virtual SplitView *parentRes() const = 0; /** * @brief 设置父资源实例 * @param inst */ virtual void setParentRes(SplitView *inst) = 0; /** * @brief 视图组件 * @return */ virtual QWidget *widget() const = 0; /** * @brief 不可压缩的最小尺寸 * @return */ virtual QSizeF stiffSize() const = 0; /** * @brief 获取外形尺寸 * @return */ virtual QRectF outlineRect() const = 0; /** * @brief 重新设置外形尺寸 * @param outline */ virtual void setOutline(const QRectF &rect) = 0; /** * @brief 设置可见性 * @param state */ virtual void setVisible(bool state) = 0; virtual bool isVisible() const = 0; /** * @brief 资源唯一标号 * @return */ virtual qulonglong hashCode() const = 0; }; /** * @brief 视图展示接口 */ class ViewBase : public ViewRes { public: virtual ~ViewBase() = default; /** * @brief 视图图标 * @return */ virtual QIcon icon() const = 0; /** * @brief 视图标题 * @return */ virtual QString title() const = 0; /** * @brief 可以被回收 */ virtual bool canRetrieve() const = 0; /** * @brief 可以被关闭 */ virtual bool canClose() const = 0; /** * @brief canReplace * @return */ virtual bool canReplace() const = 0; }; /** * @brief 分裂视图规划和约束组件 */ class SplitView : public ViewRes { public: virtual ~SplitView() = default; /** * @brief 载入视图成员,构建父子引用关系 * @param a 成员视图a * @param b 成员视图b */ virtual void initViews(ViewRes *a, ViewRes *b) = 0; /** * @brief 使用新视图替换指定视图,重构呈现树 * @param view 实例需要属于闲置视图,调用完成被重建父子引用 * @param pos 实例属于呈现树,调用完成将被解除父子引用 */ virtual void replaceView(ViewRes *_new, ViewRes *_old) = 0; /** * @brief 设置分割信息 * @param type * @param pos * @param width */ virtual void setSplitInfo(float pos, float width) = 0; /** * @brief 获取本视图中的其他视图 * @return std::pair */ virtual std::pair except(ViewRes *inst) const = 0; /** * @brief 测试是否包含指定视图 * @param inst * @return */ virtual bool contains(ViewRes *inst) const = 0; /** * @brief 分隔符的宽度 * @return */ virtual float splitterWidth() const = 0; /** * @brief 获取分隔符位置:百分比表示 * @return */ virtual float splitterPos() const = 0; /** * @brief 分割方向 * @return 分割类型 */ virtual SplitType splitType() const = 0; }; /** * @brief 视图自由状态监听器 */ class FreedomViewsListener { public: virtual ~FreedomViewsListener() = default; /** * @brief 闲置视图增加 * @param ins */ virtual void freedomAppend(ViewBase *ins) = 0; /** * @brief 闲置视图减少 * @param ins */ virtual void freedomRemove(ViewBase *ins) = 0; /** * @brief 视图关闭 * @param inst */ virtual void aboutToBeDelete(ViewBase *inst) = 0; /** * @brief 视图增加 * @param inst */ virtual void hasBeenAppend(ViewBase *inst) = 0; }; /** * @brief 资源管理器接口 */ class ResManager { public: virtual ~ResManager() = default; virtual void addListener(FreedomViewsListener *lsn) = 0; virtual void removeListener(FreedomViewsListener *lsn) = 0; virtual ViewBase* adjustView() const = 0; virtual void setAdjustView(ViewBase *target = nullptr) = 0; /** * @brief 在系统中移除指定视图 * @param inst */ virtual void removePresentView(ViewBase *inst) = 0; /** * @brief 在系统中添加指定视图 * @param inst */ virtual void appendPresentView(ViewBase *inst) = 0; /** * @brief 测试指定视图是否处于呈现状态 * @param inst 指定视图 */ virtual bool isPresented(ViewBase *inst) const = 0; /** * @brief 回收视图显示,转换视图为自由(闲置)状态 * @param inst 视图实例需要确实处于可视状态(临时显示或位于呈现树内) */ virtual void doRetrieve(ViewBase *inst) = 0; /** * @brief 回收视图,清除内存实例 * @param inst 视图实例需要处于闲置状态 */ virtual void doClose(ViewBase *inst) = 0; /** * @brief 使用指定视图合并显示 * @param view 需要合并的闲置视图 * @param pos 指定合并目标位置 */ virtual void siblingAttach(ViewBase *view, ViewBase *pos, SplitType ori) = 0; }; } // namespace SplitFrame #endif // SPLITVIEW_INTERFACE_H