QtNovelUI/SplitView/splitview.h

252 lines
8.6 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
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