##// END OF EJS Templates
Generates clone identifier in controller
Generates clone identifier in controller

File last commit:

r371:40749dfba67d
r655:dbb889077463
Show More
MenuBuilder.h
61 lines | 1.7 KiB | text/x-c | CLexer
#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 and returns it
* @param name the name of the menu
* @param icon the icon of the menu (can be null)
* @returns the created menu, nullptr if it couldn't be created
*/
QMenu *addMenu(const QString &name, const QIcon &icon = {});
/// 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