You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
4.5 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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;
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* > m_items;
int m_columnCount { 0 }; ///< 记录有多少列
bool m_expandFlag { false }; ///< 标记是否是会扩展的
QSize m_sizeHint; ///< sizeHint返回的尺寸
bool m_dirty { true }; ///< 用于标记是否需要刷新元素参考QToolBarLayout源码
int m_largeHeight { 0 }; ///< 记录大图标的高度
int m_titleHeight { 15 }; ///< 标题区域高度
int m_titleSpace { 2 }; ///< 标题区域和按钮的间隔
bool m_enableShowTitle { true }; ///< 是否运行显示pannel标题
SARibbonPannelLabel* m_titleLabel { nullptr }; ///< titlelabel指针
QRect m_titleLabelGeometry; ///< titlelabel的位置
QToolButton* m_optionActionBtn { nullptr }; ///< optionAction对应的button
QRect m_optionActionBtnGeometry; ///< optionAction的位置
};
#endif // SARIBBONPANNELLAYOUT_H