instAdmin/Cpp/GisDes/SaRibbon/SARibbonBar/SARibbonPannelLayout.h

114 lines
4.8 KiB
C
Raw Normal View History

2024-10-29 22:24:50 +08:00
#ifndef SARIBBONPANNELLAYOUT_H
#define SARIBBONPANNELLAYOUT_H
#include "SARibbonGlobal.h"
#include <QLayout>
#include "SARibbonPannelItem.h"
class QToolButton;
class SARibbonPannel;
class SARibbonPannelLabel;
/**
* @brief SARibbonPannel的布局
*
* SARibbonPannelLayout实际是一个列布局2~3
*
* @ref SARibbonPannelLayout::createItem
*
* @note QLayout::contentsMargins ,contentsMargins使@sa setPannelContentsMargins
*/
class SA_RIBBON_EXPORT SARibbonPannelLayout : public QLayout
{
Q_OBJECT
friend class SARibbonPannel;
public:
SARibbonPannelLayout(QWidget* p = 0);
~SARibbonPannelLayout();
// SARibbonPannelLayout additem 无效
void addItem(QLayoutItem* item) Q_DECL_OVERRIDE;
// QLayout 所必须的重载函数
QLayoutItem* itemAt(int index) const Q_DECL_OVERRIDE;
QLayoutItem* takeAt(int index) Q_DECL_OVERRIDE;
int count() const Q_DECL_OVERRIDE;
bool isEmpty() const Q_DECL_OVERRIDE;
void invalidate() Q_DECL_OVERRIDE;
Qt::Orientations expandingDirections() const Q_DECL_OVERRIDE;
void setGeometry(const QRect& rect) Q_DECL_OVERRIDE;
QSize minimumSize() const Q_DECL_OVERRIDE;
QSize sizeHint() const Q_DECL_OVERRIDE;
// 获取ribbonpannel
SARibbonPannel* ribbonPannel() const;
// SARibbonPannel主要通过此函数来添加action
void insertAction(int index, QAction* act, SARibbonPannelItem::RowProportion rp = SARibbonPannelItem::None);
// 设置OptionAction如果要去除传入nullptr指针即可
void setOptionAction(QAction* action);
bool isHaveOptionAction() const;
// 通过action获取SARibbonPannelItem
SARibbonPannelItem* pannelItem(QAction* action) const;
// 获取最后一个添加的item
SARibbonPannelItem* lastItem() const;
// 获取最后生成的窗口
QWidget* lastWidget() const;
// 移动两个item
void move(int from, int to);
// 判断是否需要重新布局
bool isDirty() const;
// 更新尺寸
void updateGeomArray();
// 通过action获取SARibbonPannelItem的索引
int indexByAction(QAction* action) const;
// 标题高度
int pannelTitleHeight() const;
void setPannelTitleHeight(int newTitleHeight);
// 判断是否存在标题
bool isEnableShowPannelTitle() const;
void setEnableShowPannelTitle(bool on);
// 返回大按钮的高度
int largeButtonHeight() const;
// 标题区域和按钮的间隔
int pannelTitleSpace() const;
void setPannelTitleSpace(int newTitleSpace);
// pannel 标题的label
SARibbonPannelLabel* pannelTitleLabel() const;
// 设置按钮的icon尺寸large action不受此尺寸影响
void setToolButtonIconSize(const QSize& s);
QSize toolButtonIconSize() const;
protected:
// 获取optionAction 按钮尺寸
QSize optionActionButtonSize() const;
// 布局action
void doLayout();
// 把action转换为item对于纯Action此函数会创建SARibbonToolButton,
// rp用于告诉Layout生成什么样的窗口详细见SARibbonPannelItem::RowProportion
SARibbonPannelItem* createItem(QAction* action, SARibbonPannelItem::RowProportion rp = SARibbonPannelItem::None);
void updateGeomArray(const QRect& setrect);
// 重新计算扩展条码此函数必须在updateGeomArray函数之后调用
void recalcExpandGeomArray(const QRect& setrect);
// 返回optionActionButton的尺寸
private:
// 根据列数,计算窗口的宽度,以及最大宽度
void columnWidthInfo(int colindex, int& width, int& maximum) const;
// 设置titlelabel
void setPannelTitleLabel(SARibbonPannelLabel* newTitleLabel);
private:
QList< SARibbonPannelItem* > mItems;
int mColumnCount { 0 }; ///< 记录有多少列
bool mExpandFlag { false }; ///< 标记是否是会扩展的
QSize mSizeHint; ///< sizeHint返回的尺寸
QSize mDefaultToolButtonIconSize { 22, 22 }; ///< 记录默认的按钮图标尺寸
bool mDirty { true }; ///< 用于标记是否需要刷新元素参考QToolBarLayout源码
int mLargeHeight { 0 }; ///< 记录大图标的高度
int mTitleHeight { 15 }; ///< 标题区域高度
int mTitleSpace { 2 }; ///< 标题区域和按钮的间隔
bool mEnableShowTitle { true }; ///< 是否运行显示pannel标题
SARibbonPannelLabel* mTitleLabel { nullptr }; ///< titlelabel指针
QRect mTitleLabelGeometry; ///< titlelabel的位置
QToolButton* mOptionActionBtn { nullptr }; ///< optionAction对应的button
QRect mOptionActionBtnGeometry; ///< optionAction的位置
};
#endif // SARIBBONPANNELLAYOUT_H