QtNovelUI/SplitView/splitview.h

302 lines
9.9 KiB
C
Raw Normal View History

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