QtNovelUI/libSplitView/DockPanel.h

121 lines
3.6 KiB
C++

#ifndef BASEVIEW_H
#define BASEVIEW_H
#include "libSplitView.h"
#include <QFrame>
#include <QIcon>
#include <QLabel>
#include <QPushButton>
#include <QString>
namespace dock_panel {
class DockableView;
/**
* @brief 视图拖拽标题栏
*/
class SPLITVIEW_EXPORT DragHeader : public QFrame {
Q_OBJECT
private:
DockableView *const bind_core;
QLabel *const title_holder;
QPushButton *const close_btn, *const minimal_btn;
std::tuple<bool, QPointF> press_flag = std::make_tuple(false, QPointF());
signals:
/**
* @brief 关闭请求
*/
void closeRequest();
/**
* @brief 回收请求
*/
void retrieveRequest();
/**
* @brief 排版调整请求
* @param pos 信号源上的位置
*/
void adjustRequest(const QPoint &pos);
public:
DragHeader(const QString &title, DockableView *bind_core);
DragHeader(const QString &title, const QIcon &icon, DockableView *bind_core);
void setTitle(const QString &title);
void setTitle(const QString &title, const QIcon &icon);
void optConfig(bool retrieve, bool close);
// 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 DockableView : public QWidget, public split_frame::ViewBase {
public:
/**
* @brief 构建新的呈现视图实例
* @param present 内容视图实例
* @param custom_header 是否添加标题栏
*/
DockableView(split_frame::ResManager*mgr, QWidget *present);
virtual ~DockableView();
/**
* @brief 配置视图基本特性
* @param replace 可以被隐藏和替换
* @param close 可以被关闭
* @param retrieve 可以被隐藏
*/
void viewConfig(bool replace, bool close, bool retrieve);
/**
* @brief 设置标题栏内容
* @param title
*/
void setTitle(const QString &title);
void setTitle(const QIcon &icon, const QString &title);
void adjustAccept(const QPoint &pos);
void closeAccept();
void retrieveAccept();
private:
DragHeader *const title_header;
QWidget *const present_cube;
split_frame::ResManager *const manager_inst;
QIcon icon_store;
split_frame::SplitView *parent_res = nullptr;
bool m_replace = false, m_retrieve = false, m_close = false;
// ViewRes interface
public:
virtual split_frame::ResManager *splitManager() const override;
virtual split_frame::SplitView *parentRes() const override;
virtual void setParentRes(split_frame::SplitView *inst) override;
virtual QWidget *widget() const override;
virtual QSizeF stiffSize() const override;
virtual QRectF outlineRect() const override;
virtual void setOutline(const QRectF &rect) override;
virtual qulonglong hashCode() const override;
virtual void setVisible(bool state) override;
virtual bool isVisible() const override;
// ViewBase interface
public:
virtual QIcon icon() const override;
virtual QString title() const override;
virtual bool canRetrieve() const override;
virtual bool canClose() const override;
virtual bool canReplace() const override;
};
}
#endif // BASEVIEW_H