4#include "sdl_buttons.hpp"
6static const Uint32 hpadding = 10;
8SdlButtonList::~SdlButtonList() =
default;
10bool SdlButtonList::populate(std::shared_ptr<SDL_Renderer>& renderer,
11 const std::vector<std::string>& labels,
const std::vector<int>& ids,
12 Sint32 total_width, Sint32 offsetY, Sint32 width, Sint32 height)
17 assert(labels.size() == ids.size());
20 size_t button_width = ids.size() * (
static_cast<size_t>(width) + hpadding) + hpadding;
21 size_t offsetX =
static_cast<size_t>(total_width) -
22 std::min<size_t>(
static_cast<size_t>(total_width), button_width);
23 for (
size_t x = 0; x < ids.size(); x++)
25 const size_t curOffsetX = offsetX + x * (
static_cast<size_t>(width) + hpadding);
26 const SDL_FRect rect = {
static_cast<float>(curOffsetX),
static_cast<float>(offsetY),
27 static_cast<float>(width),
static_cast<float>(height) };
28 std::shared_ptr<SdlButton> button(
new SdlButton(renderer, labels[x], ids[x], rect));
29 _list.emplace_back(button);
34std::shared_ptr<SdlButton> SdlButtonList::get_selected(
const SDL_MouseButtonEvent& button)
36 const auto x = button.x;
37 const auto y = button.y;
39 return get_selected(x, y);
42std::shared_ptr<SdlButton> SdlButtonList::get_selected(
float x,
float y)
44 for (
auto& btn : _list)
47 if ((x >= r.x) && (x <= r.x + r.w) && (y >= r.y) && (y <= r.y + r.h))
53bool SdlButtonList::set_highlight_next(
bool reset)
56 _highlighted =
nullptr;
59 auto next = _highlight_index++;
60 _highlight_index %= _list.size();
61 auto& element = _list[next];
62 _highlighted = element;
67bool SdlButtonList::set_highlight(
size_t index)
69 if (index >= _list.size())
71 _highlighted =
nullptr;
74 auto& element = _list[index];
75 _highlighted = element;
76 _highlight_index = ++index % _list.size();
80bool SdlButtonList::set_mouseover(
float x,
float y)
82 _mouseover = get_selected(x, y);
83 return _mouseover !=
nullptr;
86void SdlButtonList::clear()
90 _highlighted =
nullptr;
94bool SdlButtonList::update()
96 for (
auto& btn : _list)
98 btn->highlight(btn == _highlighted);
99 btn->mouseover(btn == _mouseover);