#ifndef SARIBBONPANNELLAYOUT_H #define SARIBBONPANNELLAYOUT_H #include "SARibbonGlobal.h" #include #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