From 7dbba0a46ac9896328fb7fd3ffbe5fe34553699d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=89=E5=AE=87=E6=B8=85=E9=9F=B3?= <2422523675@qq.com> Date: Wed, 27 Dec 2023 19:59:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=BD=93=E5=89=8D=E5=BC=80?= =?UTF-8?q?=E5=8F=91=E8=BF=9B=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WordsIDE/viewsession.cpp | 4 +- WordsIDE/viewsession.h | 2 +- libSplitView/baseview.cpp | 2 +- libSplitView/splitpanel.h | 141 +++++++++++++++++++++---------------- libSplitView/splitview.cpp | 2 +- libSplitView/splitview.h | 2 +- 6 files changed, 88 insertions(+), 65 deletions(-) diff --git a/WordsIDE/viewsession.cpp b/WordsIDE/viewsession.cpp index b11b2a4..8b5c1d7 100644 --- a/WordsIDE/viewsession.cpp +++ b/WordsIDE/viewsession.cpp @@ -37,7 +37,7 @@ void views_state_store(Config::Configration *port, const QList &base_pa auto keys_path = base_path; keys_path << QString("rect_%1").arg(child.indexOf(it)); - auto conv = dynamic_cast(it); + auto conv = dynamic_cast(it); if (conv) { // split QHash values; values["rect-type"] = "split"; @@ -105,7 +105,7 @@ RectCom *ViewSession::views_state_restore(const QHash(root); + auto xinst = dynamic_cast(root); if (!xinst) return; diff --git a/WordsIDE/viewsession.h b/WordsIDE/viewsession.h index e3e45fd..b1b9e90 100644 --- a/WordsIDE/viewsession.h +++ b/WordsIDE/viewsession.h @@ -32,7 +32,7 @@ namespace Core { typedef float split_pos; typedef float split_width; - std::map> split_infos; + std::map> split_infos; SplitFrame::RectCom *views_state_restore(const QHash &cache, const QList &target_path, Config::Configration *port, SplitFrame::ViewPresent *host); diff --git a/libSplitView/baseview.cpp b/libSplitView/baseview.cpp index e57a842..456f461 100644 --- a/libSplitView/baseview.cpp +++ b/libSplitView/baseview.cpp @@ -146,7 +146,7 @@ void BaseView::pRelease() { auto parent = parentRes(); if (parent) { auto host_ptr = viewPanel(); - dynamic_cast(parent)->removeComp(this); + dynamic_cast(parent)->removeComp(this); host_ptr->markFreedom(this); } } diff --git a/libSplitView/splitpanel.h b/libSplitView/splitpanel.h index a99274a..5374a9a 100644 --- a/libSplitView/splitpanel.h +++ b/libSplitView/splitpanel.h @@ -7,8 +7,7 @@ #include namespace SplitFrame { - class ViewPresent; - class AttachPanel; + class SplitView; /** * @brief 面板分割方向 @@ -17,7 +16,7 @@ namespace SplitFrame { /** * @brief 临时视图贴附方位 */ - enum class DockType { LEFT = 0, RIGHT, TOP, BOTTOM }; + enum class DockType { LEFT = 0, RIGHT = 1, TOP = 2, BOTTOM = 3 }; /** * @brief 视图资源基类 @@ -25,86 +24,110 @@ namespace SplitFrame { class ViewRes { public: virtual ~ViewRes() = default; - - virtual void registElement(QWidget *child) = 0; - - virtual QWidget *bind() const = 0; - virtual QString title() const = 0; - virtual ViewPresent *viewPanel() const = 0; + /** + * @brief viewPanel + * @return + */ + virtual SplitView *splitRoot() const = 0; /** - * @brief 关闭视图显示,转换视图为自由(闲置)状态 + * @brief 回收视图显示,转换视图为自由(闲置)状态 */ - virtual void pRelease() = 0; + virtual void doRetrieve() = 0; + /** + * @brief 可以被回收 + */ + virtual void canRetrieve() const = 0; + /** * @brief 回收视图,清除内存实例 */ - virtual void pClose() = 0; + virtual void doClose() = 0; + /** + * @brief 可以被关闭 + */ + virtual void canClose() const = 0; - virtual void setParentRes(ViewRes *inst) = 0; - virtual ViewRes *parentRes() const = 0; - }; - - /** - * @brief 资源管理接口 - */ - class ResManager { - public: - virtual ~ResManager() = default; - - virtual ViewPresent *viewPanel() const = 0; - virtual void objsRelateRebuild() = 0; - virtual void markFreedom(ViewRes *view, bool add = true) = 0; - virtual void purge(ViewRes *target) = 0; + /** + * @brief canReplace + * @return + */ + virtual bool canReplace() const = 0; }; /** * @brief 视图展示接口 */ - class RectCom : public ViewRes { + class ViewBase : public QWidget, public ViewRes { public: - virtual ~RectCom() = default; + virtual ~ViewBase() = default; - virtual bool canReplace() const = 0; - virtual bool contains(QWidget *ptr) const = 0; + /** + * @brief 视图图标 + * @return + */ + virtual QIcon icon() const = 0; + /** + * @brief 视图标题 + * @return + */ + virtual QString title() const = 0; + /** + * @brief 获取外形尺寸 + * @return + */ virtual QRectF outline() const = 0; + /** + * @brief 重新设置外形尺寸 + * @param outline + */ virtual void relayout(const QRectF &outline) = 0; - virtual void paintEvent(QPaintEvent *ev) = 0; }; - /** - * @brief 功能视图基板 - */ - template class FnWrap : public QWidget { - private: - static bool type_blank_blank; - ViewPresent *const host_store; - - public: - explicit FnWrap(ViewPresent *bind) : QWidget(), host_store(bind) {} - virtual ~FnWrap() { this->closeProcess(); } - - ViewPresent *bindHost() const { return host_store; } - - virtual void closeProcess(){}; - }; /** * @brief 分裂视图规划和约束组件 */ - class SplitRect : public RectCom { + class SplitView : public ViewBase { public: - virtual ~SplitRect() = default; + virtual ~SplitView() = default; - virtual std::pair child() const = 0; - virtual void removeComp(RectCom *child) = 0; - virtual void replaceComp(RectCom *view, RectCom *old) = 0; + /** + * @brief 获取子视图列表和分割方式 + * @return + */ + virtual std::tuple child() const = 0; + /** + * @brief 移除子视图 + * @param child + */ + virtual void removeComp(ViewBase *child) = 0; + /** + * @brief 替换子视图 + * @param view + * @param old + */ + virtual void replaceComp(ViewBase *view, ViewBase *old) = 0; + /** + * @brief 分隔符的宽度 + * @return + */ virtual float splitterWidth() const = 0; + /** + * @brief 获取分隔符位置:百分比表示 + * @return + */ virtual float splitterPos() const = 0; - virtual SplitType splitType() const = 0; - virtual void setSplitInfo(SplitType type, float pos, float width, bool relayout = true) = 0; + + /** + * @brief 设置分割信息 + * @param type + * @param pos + * @param width + */ + virtual void setSplitInfo(SplitType type, float pos, float width) = 0; }; class FreedomViewsListener { @@ -114,18 +137,18 @@ namespace SplitFrame { * @brief 闲置视图增加 * @param ins */ - virtual void freedomAppended(RectCom *ins, const QIcon &icon, const QString &title) = 0; + virtual void freedomAppended(ViewBase *ins) = 0; /** * @brief 闲置视图减少 * @param ins */ - virtual void freedomRemoved(RectCom *ins) = 0; + virtual void freedomRemoved(ViewBase *ins) = 0; }; /** * @brief 分裂视图呈现组件 */ - class SPLITVIEW_EXPORT ViewPresent : private QWidget, public SplitRect, public ResManager { + class SPLITVIEW_EXPORT ViewPresent : public SplitView { public: ViewPresent(QWidget *parent = nullptr); virtual ~ViewPresent(); @@ -148,7 +171,7 @@ namespace SplitFrame { bool adjustState() const; RectCom *adjustView() const; - SplitRect *createSplit(RectCom *first, RectCom *next); + SplitView *createSplit(RectCom *first, RectCom *next); template RectCom *appendView(FnWrap *view_inst, const QIcon &icon, const QString &title) { if (view_inst->bindHost() != this) diff --git a/libSplitView/splitview.cpp b/libSplitView/splitview.cpp index ce43993..f69e4a9 100644 --- a/libSplitView/splitview.cpp +++ b/libSplitView/splitview.cpp @@ -95,7 +95,7 @@ void SplitView::removeComp(RectCom *child_inst) { if (child_inst == sib) sib = prev_childs.second; - static_cast(pinst)->replaceComp(sib, this); + static_cast(pinst)->replaceComp(sib, this); delete this; } diff --git a/libSplitView/splitview.h b/libSplitView/splitview.h index c00f8ee..fa725e0 100644 --- a/libSplitView/splitview.h +++ b/libSplitView/splitview.h @@ -8,7 +8,7 @@ namespace SplitFrame { /** * @brief 分割视图 */ - class SPLITVIEW_EXPORT SplitView : private QWidget, public SplitRect { + class SPLITVIEW_EXPORT SplitView : private QWidget, public SplitView { public: SplitView(RectCom *first, RectCom *next, QWidget *parent = nullptr);