| @@ -161,6 +161,19 @@ TParamWidget* createLightParamCentered(math::Vec pos, engine::Module* module, in | |||
| } | |||
| template <class TMenu = ui::Menu> | |||
| TMenu* createMenu() { | |||
| TMenu* o = new TMenu; | |||
| o->box.pos = APP->scene->mousePos; | |||
| ui::MenuOverlay* menuOverlay = new ui::MenuOverlay; | |||
| menuOverlay->addChild(o); | |||
| APP->scene->addChild(menuOverlay); | |||
| return o; | |||
| } | |||
| template <class TMenuLabel = ui::MenuLabel> | |||
| TMenuLabel* createMenuLabel(std::string text) { | |||
| TMenuLabel* o = new TMenuLabel; | |||
| @@ -178,22 +191,41 @@ TMenuItem* createMenuItem(std::string text, std::string rightText = "") { | |||
| } | |||
| template <class TMenu = ui::Menu> | |||
| TMenu* createMenu() { | |||
| TMenu* o = new TMenu; | |||
| o->box.pos = APP->scene->mousePos; | |||
| template <class TMenuItem = ui::MenuItem> | |||
| TMenuItem* createMenuItem(std::string text, std::string rightText, std::function<void()> action) { | |||
| struct Item : TMenuItem { | |||
| std::function<void()> action; | |||
| void onAction(const event::Action& e) override { | |||
| action(); | |||
| } | |||
| }; | |||
| ui::MenuOverlay* menuOverlay = new ui::MenuOverlay; | |||
| menuOverlay->addChild(o); | |||
| Item* item = createMenuItem<Item>(text, rightText); | |||
| item->action = action; | |||
| return item; | |||
| } | |||
| APP->scene->addChild(menuOverlay); | |||
| return o; | |||
| /** Creates a MenuItem with a check mark set by a lambda function. | |||
| */ | |||
| inline ui::MenuItem* createCheckMenuItem(std::string text, std::function<bool()> checked, std::function<void()> action) { | |||
| struct Item : ui::MenuItem { | |||
| std::function<void()> action; | |||
| void onAction(const event::Action& e) override { | |||
| action(); | |||
| } | |||
| }; | |||
| Item* item = createMenuItem<Item>(text, CHECKMARK(checked())); | |||
| item->action = action; | |||
| return item; | |||
| } | |||
| /** Creates a MenuItem that controls a boolean value with a check mark. | |||
| */ | |||
| inline ui::MenuItem* createBoolMenuItem(std::string name, std::function<bool()> getter, std::function<void(bool)> setter) { | |||
| inline ui::MenuItem* createBoolMenuItem(std::string text, std::function<bool()> getter, std::function<void(bool)> setter) { | |||
| struct Item : ui::MenuItem { | |||
| std::function<void(size_t)> setter; | |||
| bool val; | |||
| @@ -204,7 +236,7 @@ inline ui::MenuItem* createBoolMenuItem(std::string name, std::function<bool()> | |||
| }; | |||
| bool currVal = getter(); | |||
| Item* item = createMenuItem<Item>(name, CHECKMARK(currVal)); | |||
| Item* item = createMenuItem<Item>(text, CHECKMARK(currVal)); | |||
| item->setter = setter; | |||
| item->val = !currVal; | |||
| return item; | |||
| @@ -214,8 +246,8 @@ inline ui::MenuItem* createBoolMenuItem(std::string name, std::function<bool()> | |||
| /** Easy wrapper for createBoolMenuItem() to modify a bool pointer. | |||
| */ | |||
| template <typename T> | |||
| ui::MenuItem* createBoolPtrMenuItem(std::string name, T* ptr) { | |||
| return createBoolMenuItem(name, | |||
| ui::MenuItem* createBoolPtrMenuItem(std::string text, T* ptr) { | |||
| return createBoolMenuItem(text, | |||
| [=]() {return *ptr;}, | |||
| [=](T val) {*ptr = val;} | |||
| ); | |||
| @@ -224,7 +256,7 @@ ui::MenuItem* createBoolPtrMenuItem(std::string name, T* ptr) { | |||
| /** Creates a MenuItem that when hovered, opens a submenu with several MenuItems indexed by an integer. | |||
| */ | |||
| inline ui::MenuItem* createIndexSubmenuItem(std::string name, std::vector<std::string> labels, std::function<size_t()> getter, std::function<void(size_t)> setter) { | |||
| inline ui::MenuItem* createIndexSubmenuItem(std::string text, std::vector<std::string> labels, std::function<size_t()> getter, std::function<void(size_t)> setter) { | |||
| struct IndexItem : ui::MenuItem { | |||
| std::function<void(size_t)> setter; | |||
| size_t index; | |||
| @@ -254,7 +286,7 @@ inline ui::MenuItem* createIndexSubmenuItem(std::string name, std::vector<std::s | |||
| size_t currIndex = getter(); | |||
| std::string label = (currIndex < labels.size()) ? labels[currIndex] : ""; | |||
| Item* item = createMenuItem<Item>(name, label + " " + RIGHT_ARROW); | |||
| Item* item = createMenuItem<Item>(text, label + " " + RIGHT_ARROW); | |||
| item->getter = getter; | |||
| item->setter = setter; | |||
| item->labels = labels; | |||
| @@ -265,8 +297,8 @@ inline ui::MenuItem* createIndexSubmenuItem(std::string name, std::vector<std::s | |||
| /** Easy wrapper for createIndexSubmenuItem() that controls an integer index at a pointer address. | |||
| */ | |||
| template <typename T> | |||
| ui::MenuItem* createIndexPtrSubmenuItem(std::string name, std::vector<std::string> labels, T* ptr) { | |||
| return createIndexSubmenuItem(name, labels, | |||
| ui::MenuItem* createIndexPtrSubmenuItem(std::string text, std::vector<std::string> labels, T* ptr) { | |||
| return createIndexSubmenuItem(text, labels, | |||
| [=]() {return *ptr;}, | |||
| [=](T index) {*ptr = index;} | |||
| ); | |||