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
|
|
|
|
|
|
|
|
|
void bind(BaseView *widget);
|
2023-08-21 14:04:20 +00:00
|
|
|
|
BaseView *attachTarget() const;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
|
|
|
|
virtual void paintEvent(QPaintEvent *event) override;
|
|
|
|
|
virtual void mouseMoveEvent(QMouseEvent *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:
|
|
|
|
|
ViewPresent *const size_host;
|
|
|
|
|
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 };
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 分裂视图规划和约束组件
|
|
|
|
|
*/
|
|
|
|
|
class SplitRect {
|
|
|
|
|
public:
|
|
|
|
|
virtual ~SplitRect() = default;
|
|
|
|
|
|
|
|
|
|
virtual QWidget *bind() const = 0;
|
2023-08-21 03:28:03 +00:00
|
|
|
|
virtual ViewPresent *viewPanel() const = 0;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
|
|
|
|
virtual SplitRect *parentRect() const = 0;
|
|
|
|
|
virtual void setParentRect(SplitRect *pinst) = 0;
|
|
|
|
|
|
|
|
|
|
virtual std::pair<SplitRect *, SplitRect *> child() const = 0;
|
|
|
|
|
virtual void replace(SplitRect *view, SplitRect *old) = 0;
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
virtual QRectF outline() const = 0;
|
|
|
|
|
virtual void relayout(const QRectF &outline) = 0;
|
2023-08-21 14:04:20 +00:00
|
|
|
|
virtual void remove(SplitRect *child) = 0;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
|
|
|
|
virtual void paintEvent(QPaintEvent *ev) = 0;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class SPLITVIEW_EXPORT SplitView : public QWidget, public SplitRect {
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
SplitView(SplitRect *first, SplitRect *next, QWidget *parent = nullptr);
|
|
|
|
|
|
|
|
|
|
// SplitRect interface
|
|
|
|
|
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 SplitRect *parentRect() const override;
|
|
|
|
|
virtual void setParentRect(SplitRect *pinst) override;
|
|
|
|
|
|
|
|
|
|
virtual std::pair<SplitRect *, SplitRect *> child() const override;
|
|
|
|
|
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;
|
|
|
|
|
virtual void replace(SplitRect *view, SplitRect *old) override;
|
|
|
|
|
|
|
|
|
|
virtual QRectF outline() const override;
|
|
|
|
|
virtual void relayout(const QRectF &outline) override;
|
2023-08-21 14:04:20 +00:00
|
|
|
|
virtual void remove(SplitRect *child_inst) 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;
|
|
|
|
|
|
|
|
|
|
// QObject interface
|
|
|
|
|
public:
|
|
|
|
|
virtual bool eventFilter(QObject *watched, QEvent *event) override;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
SplitRect *parent_inst;
|
|
|
|
|
QList<SplitRect *> child_store;
|
|
|
|
|
// 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 基础内容视图组件
|
|
|
|
|
*/
|
|
|
|
|
class SPLITVIEW_EXPORT BaseView : public QWidget, public SplitRect {
|
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-21 03:28:03 +00:00
|
|
|
|
virtual bool contains(QWidget *ptr) const;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
|
|
|
|
// SplitRect interface
|
|
|
|
|
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 SplitRect *parentRect() const override;
|
|
|
|
|
virtual void setParentRect(SplitRect *pinst) override;
|
|
|
|
|
virtual std::pair<SplitRect *, SplitRect *> child() const override;
|
|
|
|
|
virtual void replace(SplitRect *view, SplitRect *old) override;
|
|
|
|
|
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;
|
|
|
|
|
virtual QRectF outline() const override;
|
|
|
|
|
virtual void relayout(const QRectF &outline) override;
|
|
|
|
|
|
|
|
|
|
virtual void paintEvent(QPaintEvent *ev) override;
|
2023-08-21 14:04:20 +00:00
|
|
|
|
virtual void remove(SplitRect *child_inst) override;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 分裂视图呈现组件
|
|
|
|
|
*/
|
|
|
|
|
class SPLITVIEW_EXPORT ViewPresent : public QWidget, public SplitRect {
|
|
|
|
|
public:
|
|
|
|
|
ViewPresent(SplitRect *initial_view, QWidget *parent = nullptr);
|
2023-08-21 14:04:20 +00:00
|
|
|
|
virtual ~ViewPresent();
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
2023-08-21 03:28:03 +00:00
|
|
|
|
void registViewComp(BaseView *it);
|
|
|
|
|
|
2023-08-20 17:22:48 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief 切换视图调整状态
|
|
|
|
|
* @param state 状态开关
|
|
|
|
|
*/
|
2023-08-21 03:28:03 +00:00
|
|
|
|
void setViewAdjust(bool state, 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
|
|
|
|
|
|
|
|
|
void append(SplitRect *inst, uint index);
|
|
|
|
|
|
|
|
|
|
// QObject interface
|
|
|
|
|
public:
|
|
|
|
|
virtual bool eventFilter(QObject *watched, QEvent *event) override;
|
|
|
|
|
|
|
|
|
|
// SplitRect interface
|
|
|
|
|
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 SplitRect *parentRect() const override;
|
|
|
|
|
virtual void setParentRect(SplitRect *pinst) override;
|
|
|
|
|
|
|
|
|
|
virtual std::pair<SplitRect *, SplitRect *> child() const override;
|
|
|
|
|
virtual void replace(SplitRect *view, SplitRect *old) override;
|
|
|
|
|
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;
|
|
|
|
|
virtual QRectF outline() const override;
|
|
|
|
|
virtual void relayout(const QRectF &outline) override;
|
2023-08-21 14:04:20 +00:00
|
|
|
|
virtual void remove(SplitRect *child_inst) 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-21 03:28:03 +00:00
|
|
|
|
BaseView *adjust_view_store;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
bool press_flags = false;
|
2023-08-21 03:28:03 +00:00
|
|
|
|
bool adjust_state = false;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
QList<SplitRect *> view_anchors;
|
|
|
|
|
// 方向,splitter位置,splitter宽度,extend索引
|
|
|
|
|
std::tuple<SplitType, float, float, uint> split_info_store;
|
2023-08-21 03:28:03 +00:00
|
|
|
|
QList<BaseView *> all_sep_views;
|
2023-08-20 17:22:48 +00:00
|
|
|
|
|
|
|
|
|
virtual void relayout();
|
|
|
|
|
std::pair<QRectF, QRectF> viewRects();
|
|
|
|
|
QRectF handleRect() const;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace SplitFrame
|
|
|
|
|
|
|
|
|
|
#endif // SPLITVIEW_H
|