#ifndef SARIBBONACTIONSMANAGER_H #define SARIBBONACTIONSMANAGER_H #include "SARibbonGlobal.h" #include #include #include #include #include #include class SARibbonBar; class SARibbonCategory; /** * @brief 用于管理SARibbon的所有Action * * SARibbonActionsManager维护着两个表,一个是tag(标签)对应的Action list, * 一个是所有接受SARibbonActionsManager管理的action list。 * * SARibbonActionsManager的标签对应一组actions,每个标签对应的action可以重复出现, * 但SARibbonActionsManager维护的action list里只有一份action,不会重复出现。 * * tag用于对action list分组,每个tag的实体名字通过@ref setTagName 进行设置,在语言变化时需要及时调用 * setTagName设置新的标签对应的文本。 * * SARibbonActionsManager默认预设了6个常用标签见@ref SARibbonActionsManager::ActionTag ,用户自定义标签需要在 * SARibbonActionsManager::UserDefineActionTag值的基础上进行累加。 * * @ref filter (等同@ref actions )函数用于提取标签管理的action list,@ref allActions 函数返回SARibbonActionsManager * 管理的所有标签。 * * 通过@ref autoRegisteActions 函数可以快速的建立action的管理,此函数会遍历@ref SARibbonBar下所有@ref SARibbonPannel 添加的action,并给予Category建立tag,正常使用用户仅需关注此autoRegisteActions函数即可 * * */ class SA_RIBBON_EXPORT SARibbonActionsManager : public QObject { Q_OBJECT SA_RIBBON_DECLARE_PRIVATE(SARibbonActionsManager) friend class SARibbonActionsManagerModel; public: /** * @brief 定义action的标签 */ enum ActionTag { UnknowActionTag = 0, ///< 未知的tag CommonlyUsedActionTag = 0x01, ///< 预设tag-常用命令 NotInFunctionalAreaActionTag = 0x02, ///< 预设tag-不在功能区命令 AutoCategoryDistinguishBeginTag = 0x1000, ///< 自动按Category划分的标签起始,在@ref autoRegisteActions 函数会用到 AutoCategoryDistinguishEndTag = 0x2000, ///< 自动按Category划分的标签结束,在@ref autoRegisteActions 函数会用到 NotInRibbonCategoryTag = 0x2001, ///< 不在功能区的标签@ref autoRegisteActions 函数会遍历所有category的action UserDefineActionTag = 0x8000 ///< 自定义标签,所有用户自定义tag要大于此tag }; SARibbonActionsManager(SARibbonBar* bar); ~SARibbonActionsManager(); //设置tag对应的名字 void setTagName(int tag, const QString& name); //获取tag对应的名字 QString tagName(int tag) const; //移除tag,注意,这个函数非常耗时 void removeTag(int tag); //注册action bool registeAction(QAction* act, int tag, const QString& key = QString(), bool enableEmit = true); //取消action的注册 void unregisteAction(QAction* act, bool enableEmit = true); //过滤得到actions对应的引用,实际是一个迭代器 QList< QAction* >& filter(int tag); //通过tag筛选出系列action QList< QAction* >& actions(int tag); const QList< QAction* > actions(int tag) const; //获取所有的标签 QList< int > actionTags() const; //通过key获取action QAction* action(const QString& key) const; //通过action找到key QString key(QAction* act) const; //返回所有管理的action数 int count() const; //返回所有管理的actions QList< QAction* > allActions() const; //自动加载action,返回tag对应的Category指针 QMap< int, SARibbonCategory* > autoRegisteActions(SARibbonBar* bar); //自动加载widget下的actions函数返回的action,返回加载的数量,这些 QSet< QAction* > autoRegisteWidgetActions(QWidget* w, int tag, bool enableEmit = false); //根据标题查找action QList< QAction* > search(const QString& text); //清除 void clear(); signals: /** * @brief 标签变化触发的信号,变化包括新增和删除 */ void actionTagChanged(int tag, bool isdelete); private slots: void onActionDestroyed(QObject* o); void onCategoryTitleChanged(const QString& title); private: void removeAction(QAction* act, bool enableEmit = true); }; /** * @brief SARibbonActionsManager 对应的model */ class SA_RIBBON_EXPORT SARibbonActionsManagerModel : public QAbstractListModel { Q_OBJECT SA_RIBBON_DECLARE_PRIVATE(SARibbonActionsManagerModel) public: explicit SARibbonActionsManagerModel(QObject* p = nullptr); explicit SARibbonActionsManagerModel(SARibbonActionsManager* m, QObject* p = nullptr); ~SARibbonActionsManagerModel(); virtual int rowCount(const QModelIndex& parent) const override; virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; virtual Qt::ItemFlags flags(const QModelIndex& index) const override; virtual QVariant data(const QModelIndex& index, int role) const override; void setFilter(int tag); void update(); void setupActionsManager(SARibbonActionsManager* m); void uninstallActionsManager(); QAction* indexToAction(QModelIndex index) const; void search(const QString& text); private slots: void onActionTagChanged(int tag, bool isdelete); }; #endif // SARIBBONACTIONSMANAGER_H