252 lines
8.6 KiB
C++
252 lines
8.6 KiB
C++
#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 承接堆放操作及设定摆放位置
|
||
*/
|
||
class SPLITVIEW_EXPORT AttachPanel : public QWidget {
|
||
enum class ActiveArea { LEFT, RIGHT, TOP, BOTTOM, CENTER, NONE };
|
||
|
||
public:
|
||
AttachPanel(ViewPresent *host);
|
||
|
||
void bind(BaseView *widget);
|
||
BaseView *attachTarget() const;
|
||
|
||
virtual void paintEvent(QPaintEvent *event) override;
|
||
virtual void mouseMoveEvent(QMouseEvent *event) override;
|
||
virtual void dragMoveEvent(QDragMoveEvent *event) override;
|
||
virtual void dragEnterEvent(QDragEnterEvent *event) override;
|
||
virtual void dropEvent(QDropEvent *event) override;
|
||
|
||
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;
|
||
virtual ViewPresent *viewPanel() const = 0;
|
||
|
||
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;
|
||
virtual void remove(SplitRect *child) = 0;
|
||
|
||
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;
|
||
virtual ViewPresent *viewPanel() const override;
|
||
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;
|
||
virtual void remove(SplitRect *child_inst) override;
|
||
|
||
// 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 {
|
||
friend class ViewPresent;
|
||
|
||
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();
|
||
virtual bool contains(QWidget *ptr) const;
|
||
|
||
// SplitRect interface
|
||
public:
|
||
virtual QWidget *bind() const override;
|
||
virtual ViewPresent *viewPanel() const override;
|
||
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;
|
||
virtual void remove(SplitRect *child_inst) override;
|
||
|
||
private:
|
||
DragHeader *title_header;
|
||
SplitRect *parent_store;
|
||
QList<QWidget *> comps_list;
|
||
|
||
protected:
|
||
virtual void installPerceptionHandle(ViewPresent *obj);
|
||
virtual void registComp(QWidget *child);
|
||
};
|
||
|
||
/**
|
||
* @brief 分裂视图呈现组件
|
||
*/
|
||
class SPLITVIEW_EXPORT ViewPresent : public QWidget, public SplitRect {
|
||
public:
|
||
ViewPresent(SplitRect *initial_view, QWidget *parent = nullptr);
|
||
virtual ~ViewPresent();
|
||
|
||
void registViewComp(BaseView *it);
|
||
|
||
/**
|
||
* @brief 切换视图调整状态
|
||
* @param state 状态开关
|
||
*/
|
||
void setViewAdjust(bool state, BaseView *one = nullptr);
|
||
bool adjustState() const;
|
||
BaseView *adjustView() const;
|
||
|
||
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;
|
||
virtual ViewPresent *viewPanel() const override;
|
||
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 remove(SplitRect *child_inst) override;
|
||
|
||
// 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:
|
||
AttachPanel *const accept_panel;
|
||
BaseView *adjust_view_store;
|
||
bool press_flags = false;
|
||
bool adjust_state = false;
|
||
QList<SplitRect *> view_anchors;
|
||
// 方向,splitter位置,splitter宽度,extend索引
|
||
std::tuple<SplitType, float, float, uint> split_info_store;
|
||
QList<BaseView *> all_sep_views;
|
||
|
||
virtual void relayout();
|
||
std::pair<QRectF, QRectF> viewRects();
|
||
QRectF handleRect() const;
|
||
};
|
||
|
||
} // namespace SplitFrame
|
||
|
||
#endif // SPLITVIEW_H
|