Files
sphaira/sphaira/source/ui/widget.cpp
ITotalJustice f824187248 initial work on touch support
list of things not done:
- no scrolling
- only some menus
- no widgets
- no buttons
2025-01-01 17:32:58 +00:00

62 lines
1.7 KiB
C++

#include "ui/widget.hpp"
#include "ui/nvg_util.hpp"
#include "app.hpp"
namespace sphaira::ui {
void Widget::Update(Controller* controller, TouchInfo* touch) {
for (const auto& [button, action] : m_actions) {
if ((action.m_type & ActionType::DOWN) && controller->GotDown(button)) {
if (static_cast<u64>(button) & static_cast<u64>(Button::ANY_BUTTON)) {
App::PlaySoundEffect(SoundEffect_Focus);
}
action.Invoke(true);
}
else if ((action.m_type & ActionType::UP) && controller->GotUp(button)) {
action.Invoke(false);
}
else if ((action.m_type & ActionType::HELD) && controller->GotHeld(button)) {
action.Invoke(true);
}
}
}
void Widget::Draw(NVGcontext* vg, Theme* theme) {
Actions draw_actions;
for (const auto& [button, action] : m_actions) {
if (!action.IsHidden()) {
draw_actions.emplace(button, action);
}
}
gfx::drawButtons(vg, draw_actions, theme->elements[ThemeEntryID_TEXT].colour);
}
auto Widget::HasAction(Button button) const -> bool {
return m_actions.contains(button);
}
void Widget::SetAction(Button button, Action action) {
m_actions.insert_or_assign(button, action);
}
void Widget::RemoveAction(Button button) {
if (auto it = m_actions.find(button); it != m_actions.end()) {
m_actions.erase(it);
}
}
auto Widget::FireAction(Button b, u8 type) -> bool {
for (const auto& [button, action] : m_actions) {
if (button == b && (action.m_type & type)) {
App::PlaySoundEffect(SoundEffect_Focus);
action.Invoke(true);
return true;
}
}
return false;
}
} // namespace sphaira::ui