238 lines
9.2 KiB
C++
238 lines
9.2 KiB
C++
#ifndef SARIBBONPANNEL_H
|
||
#define SARIBBONPANNEL_H
|
||
#include "SARibbonGlobal.h"
|
||
#include "SARibbonPannelItem.h"
|
||
#include "SARibbonPannelLayout.h"
|
||
#include "SARibbonToolButton.h"
|
||
#include <QLayout>
|
||
#include <QWidget>
|
||
#include <QLabel>
|
||
class SARibbonMenu;
|
||
class SARibbonGallery;
|
||
class QGridLayout;
|
||
class SARibbonPannelOptionButton;
|
||
class SARibbonPannelLayout;
|
||
class SARibbonCategory;
|
||
class SARibbonBar;
|
||
|
||
/**
|
||
* @brief SARibbonPannel的标题label,此类用于qss
|
||
*/
|
||
class SA_RIBBON_EXPORT SARibbonPannelLabel : public QLabel
|
||
{
|
||
Q_OBJECT
|
||
public:
|
||
SARibbonPannelLabel(QWidget* parent = nullptr);
|
||
};
|
||
|
||
/**
|
||
* @brief pannel页窗口,pannel是ribbon的面板用于承放控件
|
||
*
|
||
* ribbon的pannel分为两行模式和三行模式,以office为代表的ribbon为3行模式,以WPS为代表的“紧凑派”就是2行模式,
|
||
* SARibbon可通过SARibbonBar的@ref SARibbonBar::RibbonStyle 来指定模式(通过函数@ref SARibbonBar::setRibbonStyle )
|
||
*
|
||
* 在pannel中,可以通过@ref setExpanding 函数指定pannel水平扩展,如果pannel里面没有能水平扩展的控件,将会留白,因此,
|
||
* 建议在pannel里面有水平扩展的控件如(@ref SARibbonGallery )才指定这个函数
|
||
*
|
||
* pannel的布局通过@ref SARibbonPannelLayout 来实现,如果有其他布局,可以通过继承@ref
|
||
* SARibbonElementCreateDelegate::createRibbonPannel 函数返回带有自己布局的pannel,但你必须继承对应的虚函数
|
||
*/
|
||
class SA_RIBBON_EXPORT SARibbonPannel : public QFrame
|
||
{
|
||
Q_OBJECT
|
||
SA_RIBBON_DECLARE_PRIVATE(SARibbonPannel)
|
||
friend class SARibbonCategory;
|
||
friend class SARibbonCategoryPrivate;
|
||
friend class SARibbonCustomizeWidgetPrivate;
|
||
friend class SARibbonPannelLayout;
|
||
Q_PROPERTY(bool isCanCustomize READ isCanCustomize WRITE setCanCustomize)
|
||
Q_PROPERTY(bool isExpanding READ isExpanding WRITE setExpanding)
|
||
Q_PROPERTY(QString pannelName READ pannelName WRITE setPannelName)
|
||
public:
|
||
enum PannelLayoutMode
|
||
{
|
||
ThreeRowMode, ///< 三行布局模式,office就是三行布局模式,pannel能布置3行小toolbutton,默认模式
|
||
TwoRowMode ///< 两行布局模式,wps的后续布局模式就是两行布局模式,pannel能布置2行小toolbutton
|
||
};
|
||
Q_ENUM(PannelLayoutMode)
|
||
public:
|
||
using FpRibbonToolButtonIterate = std::function< bool(SARibbonToolButton*) >;
|
||
|
||
public:
|
||
SARibbonPannel(QWidget* parent = nullptr);
|
||
SARibbonPannel(const QString& name, QWidget* parent = nullptr);
|
||
~SARibbonPannel() Q_DECL_OVERRIDE;
|
||
using QWidget::addAction;
|
||
|
||
// 把action加入到pannel
|
||
void addAction(QAction* action, SARibbonPannelItem::RowProportion rp);
|
||
// 生成并添加一个action
|
||
void addAction(QAction* act,
|
||
QToolButton::ToolButtonPopupMode popMode,
|
||
SARibbonPannelItem::RowProportion rp = SARibbonPannelItem::Large);
|
||
// 把action加入到pannel,并以大图标显示
|
||
void addLargeAction(QAction* action);
|
||
// 把action加入到pannel,在三行模式下会以中图标显示
|
||
void addMediumAction(QAction* action);
|
||
// 把action加入到pannel,并以小图标显示
|
||
void addSmallAction(QAction* action);
|
||
|
||
// 把action加入到pannel,并以小图标显示
|
||
void addSmallAction(QAction* action, QToolButton::ToolButtonPopupMode popMode);
|
||
// 把action加入到pannel,并以大图标显示
|
||
void addLargeAction(QAction* action, QToolButton::ToolButtonPopupMode popMode);
|
||
// 把action加入到pannel,在三行模式下会以中图标显示
|
||
void addMediumAction(QAction* action, QToolButton::ToolButtonPopupMode popMode);
|
||
|
||
QAction* addAction(const QString& text,
|
||
const QIcon& icon,
|
||
QToolButton::ToolButtonPopupMode popMode,
|
||
SARibbonPannelItem::RowProportion rp = SARibbonPannelItem::Large);
|
||
|
||
// 添加menu
|
||
void addMenu(QMenu* menu,
|
||
SARibbonPannelItem::RowProportion rp,
|
||
QToolButton::ToolButtonPopupMode popMode = QToolButton::InstantPopup);
|
||
|
||
// 添加普通大菜单
|
||
void addLargeMenu(QMenu* menu, QToolButton::ToolButtonPopupMode popMode = QToolButton::InstantPopup);
|
||
|
||
// 添加普通小按钮菜单
|
||
void addSmallMenu(QMenu* menu, QToolButton::ToolButtonPopupMode popMode = QToolButton::InstantPopup);
|
||
|
||
// 添加窗口
|
||
QAction* addWidget(QWidget* w, SARibbonPannelItem::RowProportion rp);
|
||
|
||
// 添加窗口,占用ribbon的一行
|
||
QAction* addSmallWidget(QWidget* w);
|
||
|
||
// 添加窗口,占用ribbon的一行
|
||
QAction* addMediumWidget(QWidget* w);
|
||
|
||
// 添加窗口,占用所有行
|
||
QAction* addLargeWidget(QWidget* w);
|
||
|
||
// 添加一个Gallery
|
||
SARibbonGallery* addGallery(bool expanding = true);
|
||
|
||
// 添加分割线
|
||
QAction* addSeparator();
|
||
|
||
// 从pannel中把action对应的button提取出来,如果action没有对应的button,就返回nullptr
|
||
SARibbonToolButton* actionToRibbonToolButton(QAction* action);
|
||
|
||
// 设置操作action,如果要去除,传入nullptr指针即可,SARibbonPannel不会对QAction的所有权进行管理
|
||
// OptionAction也会触发actionTriggered信号
|
||
void setOptionAction(QAction* action);
|
||
|
||
// 判断是否存在OptionAction
|
||
bool isHaveOptionAction() const;
|
||
|
||
// 获取所有的buttons
|
||
QList< SARibbonToolButton* > ribbonToolButtons() const;
|
||
|
||
// 获取PannelLayoutMode
|
||
PannelLayoutMode pannelLayoutMode() const;
|
||
void setPannelLayoutMode(PannelLayoutMode mode);
|
||
// 更新按钮的尺寸,这个函数在pannel的布局状态变换后需要调用刷新
|
||
void resetToolButtonSize();
|
||
|
||
// 判断是否为2行模式
|
||
bool isTwoRow() const
|
||
{
|
||
return (TwoRowMode == pannelLayoutMode());
|
||
}
|
||
|
||
// 把pannel设置为扩展模式,此时会撑大水平区域
|
||
void setExpanding(bool isExpanding = true);
|
||
|
||
// 是否是扩展模式
|
||
bool isExpanding() const;
|
||
|
||
// 标题栏高度
|
||
void setTitleHeight(int h);
|
||
int titleHeight() const;
|
||
|
||
// 是否显示标题,显示标题后,标题的高度需要设置,默认高度为15
|
||
bool isEnableShowTitle() const;
|
||
void setEnableShowTitle(bool on);
|
||
|
||
// action对应的布局index,此操作一般用于移动moveAction,其他意义不大
|
||
int actionIndex(QAction* act) const;
|
||
|
||
// 移动action
|
||
void moveAction(int from, int to);
|
||
|
||
// 判断是否可以自定义
|
||
bool isCanCustomize() const;
|
||
void setCanCustomize(bool b);
|
||
|
||
// 标题
|
||
QString pannelName() const;
|
||
void setPannelName(const QString& title);
|
||
|
||
// 大图标的高度
|
||
int largeButtonHeight() const;
|
||
// 获取布局对应的item,此函数目前仅仅在自定义过程中用到
|
||
const QList< SARibbonPannelItem* >& ribbonPannelItem() const;
|
||
// 获取pannel layout
|
||
SARibbonPannelLayout* pannelLayout() const;
|
||
// 更新布局
|
||
void updateItemGeometry();
|
||
// 获取category指针,如果没有parent,或者不在category管理,返回nullptr
|
||
SARibbonCategory* category() const;
|
||
// 获取ribbonBar指针,如果没有返回nullptr
|
||
SARibbonBar* ribbonBar() const;
|
||
// 设置按钮之间的间隔
|
||
void setSpacing(int n);
|
||
int spacing() const;
|
||
//
|
||
virtual QSize sizeHint() const Q_DECL_OVERRIDE;
|
||
virtual QSize minimumSizeHint() const Q_DECL_OVERRIDE;
|
||
// 设置按钮的icon尺寸,large action不受此尺寸影响
|
||
void setToolButtonIconSize(const QSize& s);
|
||
QSize toolButtonIconSize() const;
|
||
// 此函数会遍历SARibbonPannel下的所有RibbonToolButton,执行函数指针(bool(SARibbonRibbonToolButton*)),函数指针返回false则停止迭代
|
||
bool iterate(FpRibbonToolButtonIterate fp);
|
||
|
||
// 获取最近添加的按钮
|
||
SARibbonToolButton* lastAddActionButton();
|
||
|
||
Q_SIGNALS:
|
||
|
||
/**
|
||
* @brief 等同于QToolBar::actionTriggered
|
||
* @param action
|
||
*/
|
||
void actionTriggered(QAction* action);
|
||
|
||
/**
|
||
* @brief pannel的标题发生了改变
|
||
* @param n
|
||
*/
|
||
void pannelNameChanged(const QString& n);
|
||
|
||
public:
|
||
// pannel高度推荐
|
||
static int pannelHeightHint(const QFontMetrics& fm, PannelLayoutMode layMode, int pannelTitleHeight);
|
||
// 把action的行属性设置进action中,action自身携带了行属性
|
||
static void setActionRowProportionProperty(QAction* action, SARibbonPannelItem::RowProportion rp);
|
||
// 获取action的行属性
|
||
static SARibbonPannelItem::RowProportion getActionRowProportionProperty(QAction* action);
|
||
// 把action的PopupMode属性设置进action中,action自身携带了PopupMode属性
|
||
static void setActionToolButtonPopupModeProperty(QAction* action, QToolButton::ToolButtonPopupMode popMode);
|
||
// 获取action的PopupMode属性
|
||
static QToolButton::ToolButtonPopupMode getActionToolButtonPopupModeProperty(QAction* action);
|
||
// 把action的ToolButtonStyle属性设置进action中,action自身携带了ToolButtonStyle属性
|
||
static void setActionToolButtonStyleProperty(QAction* action, Qt::ToolButtonStyle buttonStyle);
|
||
// 获取action的ToolButtonStyle属性
|
||
static Qt::ToolButtonStyle getActionToolButtonStyleProperty(QAction* action);
|
||
|
||
protected:
|
||
virtual bool event(QEvent* e) Q_DECL_OVERRIDE;
|
||
virtual void actionEvent(QActionEvent* e) Q_DECL_OVERRIDE;
|
||
virtual void changeEvent(QEvent* e) Q_DECL_OVERRIDE;
|
||
};
|
||
|
||
#endif // SARIBBONPANNEL_H
|