Dawn/src/dawn/scene/components/ui/menu/UIMenuController.cpp

68 lines
1.6 KiB
C++

// Copyright (c) 2023 Dominic Masters
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT
#include "UIMenuController.hpp"
#include "game/DawnGame.hpp"
using namespace Dawn;
UIMenuController::UIMenuController(SceneItem *item) :
SceneItemComponent(item),
active(true),
menuX(0),
menuY(0),
columns(4),
rows(4)
{
}
void UIMenuController::onStart() {
useEffectWithTeardown([&]{
if(!active) return activeTeardown = [&]{ };
useEffect([&]{
eventItemChange.invoke(menuX, menuY);
}, menuX);
useEffect([&]{
eventItemChange.invoke(menuX, menuY);
}, menuY);
useEffect([&]{
menuX = mathClamp<int32_t>(menuX, 0, rows);
}, columns);
useEffect([&]{
menuY = mathClamp<int32_t>(menuY, 0, rows);
}, rows);
return activeTeardown = useEvent([&](inputbind_t bind) {
switch(bind) {
case INPUT_BIND_POSITIVE_X:
menuX = mathClamp<int32_t>(menuX+1, 0, columns);
break;
case INPUT_BIND_POSITIVE_Y:
menuY = mathClamp<int32_t>(menuY+1, 0, rows);
break;
case INPUT_BIND_NEGATIVE_X:
menuX = mathClamp<int32_t>(menuX-1, 0, columns);
break;
case INPUT_BIND_NEGATIVE_Y:
menuY = mathClamp<int32_t>(menuY-1, 0, rows);
break;
case INPUT_BIND_ACCEPT:
case INPUT_BIND_MOUSE_CLICK:
eventItemSelected.invoke(menuX, menuY);
break;
case INPUT_BIND_CANCEL:
eventMenuCancel.invoke();
break;
default:
return;
}
}, this->getGame()->inputManager.eventBindPressed);
}, active)();
}