2023-08-20 17:22:48 +00:00
|
|
|
|
#ifndef SPLITVIEW_H
|
|
|
|
|
#define SPLITVIEW_H
|
|
|
|
|
|
|
|
|
|
#include "SplitView_global.h"
|
|
|
|
|
#include <QHash>
|
|
|
|
|
#include <QIcon>
|
|
|
|
|
#include <QLabel>
|
|
|
|
|
#include <QWidget>
|
|
|
|
|
|
|
|
|
|
namespace SplitFrame {
|
|
|
|
|
class SplitRect;
|
|
|
|
|
class ViewPresent;
|
|
|
|
|
class BaseView;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 承接堆放操作及设定摆放位置
|
|
|
|
|
*/
|
2023-08-21 14:04:20 +00:00
|
|
|
|
class SPLITVIEW_EXPORT AttachPanel : public QWidget {
|
2023-08-20 17:22:48 +00:00
|
|
|
|
enum class ActiveArea { LEFT, RIGHT, TOP, BOTTOM, CENTER, NONE };
|
|
|
|
|
|
|
|
|
|
public:
|
2023-08-21 14:04:20 +00:00
|
|
|
|
AttachPanel(ViewPresent *host);
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
2023-08-24 15:00:31 +00:00
|
|
|
|
void bindAttachment(BaseView *widget);
|
|
|
|
|
BaseView *attachmentTarget() const;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
|
|
|
|
virtual void paintEvent(QPaintEvent *event) override;
|
2023-08-21 14:04:20 +00:00
|
|
|
|
virtual void dragMoveEvent(QDragMoveEvent *event) override;
|
|
|
|
|
virtual void dragEnterEvent(QDragEnterEvent *event) override;
|
|
|
|
|
virtual void dropEvent(QDropEvent *event) override;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
|
|
|
|
private:
|
2023-08-24 15:00:31 +00:00
|
|
|
|
ViewPresent *const adjust_host;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
BaseView *current_target;
|
|
|
|
|
ActiveArea active_comp;
|
|
|
|
|
|
|
|
|
|
std::tuple<QRectF, QRectF, QRectF, QRectF, QRectF> view_rects() const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum class SplitType { SPLIT_H = 0, SPLIT_V = 1 };
|
|
|
|
|
|
2023-08-24 15:00:31 +00:00
|
|
|
|
class RectCom {
|
2023-08-20 17:22:48 +00:00
|
|
|
|
public:
|
2023-08-24 15:00:31 +00:00
|
|
|
|
virtual ~RectCom() = default;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
2023-08-21 03:28:03 +00:00
|
|
|
|
virtual ViewPresent *viewPanel() const = 0;
|
2023-08-24 15:00:31 +00:00
|
|
|
|
virtual QWidget *bind() const = 0;
|
|
|
|
|
virtual bool contains(QWidget *ptr) const = 0;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
2023-08-24 15:00:31 +00:00
|
|
|
|
virtual QRectF outline() const = 0;
|
|
|
|
|
virtual void relayout(const QRectF &outline) = 0;
|
|
|
|
|
|
|
|
|
|
virtual void setParentRect(SplitRect *inst) = 0;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
virtual SplitRect *parentRect() const = 0;
|
|
|
|
|
|
2023-08-24 15:00:31 +00:00
|
|
|
|
virtual void paintEvent(QPaintEvent *ev) = 0;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class ResManager {
|
|
|
|
|
public:
|
|
|
|
|
virtual ~ResManager() = default;
|
|
|
|
|
|
|
|
|
|
virtual void objsRelateRebuild() = 0;
|
|
|
|
|
|
|
|
|
|
virtual void markFreedom(BaseView *view) = 0;
|
|
|
|
|
virtual void markUnused(SplitRect *item) = 0;
|
|
|
|
|
virtual void unusedResRelease() = 0;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 分裂视图规划和约束组件
|
|
|
|
|
*/
|
|
|
|
|
class SplitRect : public RectCom {
|
|
|
|
|
public:
|
|
|
|
|
virtual ~SplitRect() = default;
|
|
|
|
|
|
|
|
|
|
virtual std::pair<RectCom *, RectCom *> child() const = 0;
|
|
|
|
|
virtual void removeComp(BaseView *child) = 0;
|
|
|
|
|
virtual void replaceComp(RectCom *view, RectCom *old) = 0;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
virtual float splitterWidth() const = 0;
|
|
|
|
|
virtual float splitterPos() const = 0;
|
|
|
|
|
virtual SplitType splitType() const = 0;
|
|
|
|
|
virtual void setSplitInfo(SplitType type, float pos, float width, bool relayout = true) = 0;
|
|
|
|
|
};
|
|
|
|
|
|
2023-08-24 15:00:31 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief 分割视图
|
|
|
|
|
*/
|
2023-08-20 17:22:48 +00:00
|
|
|
|
class SPLITVIEW_EXPORT SplitView : public QWidget, public SplitRect {
|
|
|
|
|
|
|
|
|
|
public:
|
2023-08-24 15:00:31 +00:00
|
|
|
|
SplitView(RectCom *first, RectCom *next, QWidget *parent = nullptr);
|
|
|
|
|
virtual ~SplitView();
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
2023-08-24 15:00:31 +00:00
|
|
|
|
// RectCom interface
|
2023-08-20 17:22:48 +00:00
|
|
|
|
public:
|
|
|
|
|
virtual QWidget *bind() const override;
|
2023-08-21 03:28:03 +00:00
|
|
|
|
virtual ViewPresent *viewPanel() const override;
|
2023-08-24 15:00:31 +00:00
|
|
|
|
virtual QRectF outline() const override;
|
|
|
|
|
virtual void relayout(const QRectF &outline) override;
|
|
|
|
|
virtual void setParentRect(SplitRect *inst) override;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
virtual SplitRect *parentRect() const override;
|
2023-08-24 15:00:31 +00:00
|
|
|
|
virtual void paintEvent(QPaintEvent *ev) override;
|
|
|
|
|
virtual bool contains(QWidget *ptr) const override;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
2023-08-24 15:00:31 +00:00
|
|
|
|
// SplitRect interface
|
|
|
|
|
public:
|
|
|
|
|
virtual std::pair<RectCom *, RectCom *> child() const override;
|
|
|
|
|
virtual void removeComp(BaseView *child) override;
|
|
|
|
|
virtual void replaceComp(RectCom *view, RectCom *old) override;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
virtual float splitterWidth() const override;
|
|
|
|
|
virtual float splitterPos() const override;
|
|
|
|
|
virtual SplitType splitType() const override;
|
|
|
|
|
virtual void setSplitInfo(SplitType type, float pos, float width, bool relayout) override;
|
|
|
|
|
|
2023-08-24 15:00:31 +00:00
|
|
|
|
// QObject interface
|
|
|
|
|
public:
|
|
|
|
|
virtual bool eventFilter(QObject *watched, QEvent *event) override;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
|
|
|
|
// QWidget interface
|
|
|
|
|
protected:
|
|
|
|
|
virtual void mousePressEvent(QMouseEvent *event) override;
|
|
|
|
|
virtual void mouseReleaseEvent(QMouseEvent *event) override;
|
|
|
|
|
virtual void mouseMoveEvent(QMouseEvent *event) override;
|
2023-08-24 15:00:31 +00:00
|
|
|
|
virtual void resizeEvent(QResizeEvent *event) override;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
SplitRect *parent_inst;
|
2023-08-24 15:00:31 +00:00
|
|
|
|
QList<RectCom *> child_store;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
// type, pos, width
|
|
|
|
|
std::tuple<SplitType, float, float> split_info_value;
|
|
|
|
|
bool press_flags = false, drags_flag = false;
|
|
|
|
|
|
|
|
|
|
virtual void relayout();
|
|
|
|
|
std::pair<QRectF, QRectF> viewRects();
|
|
|
|
|
QRectF handleRect() const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class DragHeader : public QFrame {
|
|
|
|
|
public:
|
|
|
|
|
DragHeader(BaseView *bind);
|
|
|
|
|
|
|
|
|
|
void setIcon(const QIcon &icon);
|
|
|
|
|
QIcon icon() const;
|
|
|
|
|
void setText(const QString &title);
|
|
|
|
|
QString text() const;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
QIcon icon_inst;
|
|
|
|
|
QLabel *const icon_store, *const title_store;
|
|
|
|
|
BaseView *const view_core;
|
|
|
|
|
std::tuple<bool, QPointF> press_flag = std::make_tuple(false, QPointF());
|
|
|
|
|
|
|
|
|
|
// QWidget interface
|
|
|
|
|
protected:
|
|
|
|
|
virtual void mousePressEvent(QMouseEvent *event) override;
|
|
|
|
|
virtual void mouseReleaseEvent(QMouseEvent *event) override;
|
|
|
|
|
virtual void mouseMoveEvent(QMouseEvent *event) override;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 基础内容视图组件
|
|
|
|
|
*/
|
2023-08-24 15:00:31 +00:00
|
|
|
|
class SPLITVIEW_EXPORT BaseView : public QWidget, public RectCom {
|
2023-08-21 03:28:03 +00:00
|
|
|
|
friend class ViewPresent;
|
|
|
|
|
|
2023-08-20 17:22:48 +00:00
|
|
|
|
public:
|
|
|
|
|
BaseView(const QString &title, QWidget *view, bool empty = false, QWidget *parent = nullptr);
|
|
|
|
|
|
|
|
|
|
virtual void setTitle(const QString &title);
|
|
|
|
|
virtual QString title() const;
|
|
|
|
|
|
|
|
|
|
virtual void setIcon(const QIcon &icon);
|
|
|
|
|
virtual QIcon viewIcon() const;
|
|
|
|
|
|
|
|
|
|
virtual void closeView();
|
2023-08-24 15:00:31 +00:00
|
|
|
|
virtual bool contains(QWidget *inst) const override;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
2023-08-24 15:00:31 +00:00
|
|
|
|
// RectCom interface
|
2023-08-20 17:22:48 +00:00
|
|
|
|
public:
|
|
|
|
|
virtual QWidget *bind() const override;
|
2023-08-21 03:28:03 +00:00
|
|
|
|
virtual ViewPresent *viewPanel() const override;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
virtual QRectF outline() const override;
|
|
|
|
|
virtual void relayout(const QRectF &outline) override;
|
2023-08-24 15:00:31 +00:00
|
|
|
|
virtual void setParentRect(SplitRect *inst) override;
|
|
|
|
|
virtual SplitRect *parentRect() const override;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
virtual void paintEvent(QPaintEvent *ev) override;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
DragHeader *title_header;
|
|
|
|
|
SplitRect *parent_store;
|
|
|
|
|
QList<QWidget *> comps_list;
|
|
|
|
|
|
|
|
|
|
protected:
|
2023-08-21 03:28:03 +00:00
|
|
|
|
virtual void installPerceptionHandle(ViewPresent *obj);
|
2023-08-20 17:22:48 +00:00
|
|
|
|
virtual void registComp(QWidget *child);
|
|
|
|
|
};
|
|
|
|
|
|
2023-08-24 15:00:31 +00:00
|
|
|
|
class FreedomViewsListener {
|
|
|
|
|
public:
|
|
|
|
|
virtual ~FreedomViewsListener() = default;
|
|
|
|
|
/**
|
|
|
|
|
* @brief 闲置视图增加
|
|
|
|
|
* @param ins
|
|
|
|
|
*/
|
|
|
|
|
virtual void freedomAppended(RectCom *ins) = 0;
|
|
|
|
|
/**
|
|
|
|
|
* @brief 闲置视图减少
|
|
|
|
|
* @param ins
|
|
|
|
|
*/
|
|
|
|
|
virtual void freedomRemoved(RectCom *ins) = 0;
|
|
|
|
|
};
|
|
|
|
|
|
2023-08-20 17:22:48 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief 分裂视图呈现组件
|
|
|
|
|
*/
|
2023-08-24 15:00:31 +00:00
|
|
|
|
class SPLITVIEW_EXPORT ViewPresent : public QWidget, public SplitRect, public ResManager {
|
2023-08-20 17:22:48 +00:00
|
|
|
|
public:
|
2023-08-24 15:00:31 +00:00
|
|
|
|
ViewPresent(QWidget *parent = nullptr);
|
2023-08-21 14:04:20 +00:00
|
|
|
|
virtual ~ViewPresent();
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
2023-08-24 15:00:31 +00:00
|
|
|
|
void addListener(FreedomViewsListener *lsn);
|
|
|
|
|
void removeListener(FreedomViewsListener *lsn);
|
|
|
|
|
//======================================================
|
2023-08-21 03:28:03 +00:00
|
|
|
|
void registViewComp(BaseView *it);
|
2023-08-24 15:00:31 +00:00
|
|
|
|
//======================================================
|
|
|
|
|
virtual void markFreedom(BaseView *view) override;
|
|
|
|
|
void setTempVisible(BaseView *target = nullptr);
|
2023-08-21 03:28:03 +00:00
|
|
|
|
|
2023-08-20 17:22:48 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief 切换视图调整状态
|
|
|
|
|
* @param state 状态开关
|
|
|
|
|
*/
|
2023-08-24 15:00:31 +00:00
|
|
|
|
void setViewAdjust(BaseView *one = nullptr);
|
2023-08-20 17:22:48 +00:00
|
|
|
|
bool adjustState() const;
|
2023-08-21 03:28:03 +00:00
|
|
|
|
BaseView *adjustView() const;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
2023-08-24 15:00:31 +00:00
|
|
|
|
void resetViews(RectCom *center, RectCom *extend = nullptr);
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
2023-08-24 15:00:31 +00:00
|
|
|
|
// RectCom interface
|
2023-08-20 17:22:48 +00:00
|
|
|
|
public:
|
2023-08-21 03:28:03 +00:00
|
|
|
|
virtual ViewPresent *viewPanel() const override;
|
2023-08-24 15:00:31 +00:00
|
|
|
|
virtual QWidget *bind() const override;
|
|
|
|
|
virtual bool contains(QWidget *ptr) const override;
|
|
|
|
|
virtual QRectF outline() const override;
|
|
|
|
|
virtual void relayout(const QRectF &outline) override;
|
|
|
|
|
virtual void setParentRect(SplitRect *) override;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
virtual SplitRect *parentRect() const override;
|
|
|
|
|
|
2023-08-24 15:00:31 +00:00
|
|
|
|
// ResManager interface
|
|
|
|
|
public:
|
|
|
|
|
virtual void objsRelateRebuild() override;
|
|
|
|
|
virtual void markUnused(SplitRect *item) override;
|
|
|
|
|
virtual void unusedResRelease() override;
|
|
|
|
|
|
|
|
|
|
// SplitRect interface
|
|
|
|
|
public:
|
|
|
|
|
virtual std::pair<RectCom *, RectCom *> child() const override;
|
|
|
|
|
virtual void removeComp(BaseView *child) override;
|
|
|
|
|
virtual void replaceComp(RectCom *view, RectCom *old) override;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
virtual float splitterWidth() const override;
|
|
|
|
|
virtual float splitterPos() const override;
|
|
|
|
|
virtual SplitType splitType() const override;
|
|
|
|
|
virtual void setSplitInfo(SplitType type, float pos, float width, bool relayout) override;
|
2023-08-24 15:00:31 +00:00
|
|
|
|
|
|
|
|
|
// QObject interface
|
|
|
|
|
public:
|
|
|
|
|
virtual bool eventFilter(QObject *watched, QEvent *event) override;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
|
|
|
|
// QWidget interface
|
|
|
|
|
protected:
|
|
|
|
|
virtual void paintEvent(QPaintEvent *ev) override;
|
|
|
|
|
virtual void resizeEvent(QResizeEvent *ev) override;
|
|
|
|
|
virtual void mousePressEvent(QMouseEvent *event) override;
|
|
|
|
|
virtual void mouseReleaseEvent(QMouseEvent *event) override;
|
|
|
|
|
virtual void mouseMoveEvent(QMouseEvent *event) override;
|
|
|
|
|
|
|
|
|
|
private:
|
2023-08-21 14:04:20 +00:00
|
|
|
|
AttachPanel *const accept_panel;
|
2023-08-24 15:00:31 +00:00
|
|
|
|
QList<SplitRect *> unused_splits;
|
|
|
|
|
|
|
|
|
|
BaseView *adjust_view_temp; // 拖拽中转
|
|
|
|
|
bool press_flags = false; // 空间调整标志
|
|
|
|
|
// 方向,splitter位置,splitter宽度
|
|
|
|
|
std::tuple<SplitType, float, float> split_info_store = std::make_tuple(SplitType::SPLIT_H, 200, 8);
|
|
|
|
|
|
|
|
|
|
QList<RectCom *> view_anchors;
|
2023-08-21 03:28:03 +00:00
|
|
|
|
QList<BaseView *> all_sep_views;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
2023-08-24 15:00:31 +00:00
|
|
|
|
QList<FreedomViewsListener *> lsn_list;
|
|
|
|
|
QList<RectCom *> freedom_views;
|
|
|
|
|
RectCom *temp_visible_view = nullptr;
|
|
|
|
|
|
2023-08-20 17:22:48 +00:00
|
|
|
|
virtual void relayout();
|
|
|
|
|
std::pair<QRectF, QRectF> viewRects();
|
|
|
|
|
QRectF handleRect() const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace SplitFrame
|
|
|
|
|
|
|
|
|
|
#endif // SPLITVIEW_H
|