MenuBuilder.h
60 lines
| 1.6 KiB
| text/x-c
|
CLexer
|
r207 | #ifndef SCIQLOP_MENUBUILDER_H | ||
#define SCIQLOP_MENUBUILDER_H | ||||
#include <QLoggingCategory> | ||||
#include <QMenu> | ||||
#include <QStack> | ||||
Q_DECLARE_LOGGING_CATEGORY(LOG_MenuBuilder) | ||||
/// Helper assigned to build a hierarchical menu | ||||
class MenuBuilder { | ||||
public: | ||||
/** | ||||
* Ctor | ||||
* @param menu the parent menu | ||||
*/ | ||||
explicit MenuBuilder(QMenu *menu); | ||||
/** | ||||
* Adds action to the current menu | ||||
* @param actionName the name of the action | ||||
* @param actionFunction the function that will be executed when the action is triggered | ||||
*/ | ||||
template <typename ActionFun> | ||||
void addAction(const QString &actionName, ActionFun actionFunction); | ||||
/** | ||||
* Adds a new menu to the current menu | ||||
* @param name the name of the menu | ||||
|
r296 | * @param icon the icon of the menu (can be null) | ||
|
r207 | */ | ||
|
r296 | void addMenu(const QString &name, const QIcon &icon = {}); | ||
|
r207 | |||
/// Adds a separator to the current menu. The separator is added only if the menu already | ||||
/// contains entries | ||||
void addSeparator(); | ||||
/// Closes the current menu | ||||
void closeMenu(); | ||||
private: | ||||
/// @return the current menu (i.e. the top menu of the stack), nullptr if there is no menu | ||||
QMenu *currentMenu() const; | ||||
/// Stack of all menus currently opened | ||||
QStack<QMenu *> m_Menus{}; | ||||
}; | ||||
template <typename ActionFun> | ||||
void MenuBuilder::addAction(const QString &actionName, ActionFun actionFunction) | ||||
{ | ||||
if (auto currMenu = currentMenu()) { | ||||
currMenu->addAction(actionName, actionFunction); | ||||
} | ||||
else { | ||||
qCCritical(LOG_MenuBuilder()) << QObject::tr("No current menu to attach the action"); | ||||
} | ||||
} | ||||
#endif // SCIQLOP_MENUBUILDER_H | ||||