4 #include "sdl_buttons.hpp"
6 static const Uint32 hpadding = 10;
8 SdlButtonList::~SdlButtonList() =
default;
10 bool SdlButtonList::populate(SDL_Renderer* renderer,
const std::vector<std::string>& labels,
11 const std::vector<int>& ids, Sint32 total_width, Sint32 offsetY,
12 Sint32 width, Sint32 height)
17 assert(labels.size() == ids.size());
20 size_t button_width = ids.size() * (width + hpadding) + hpadding;
21 size_t offsetX = total_width - std::min<size_t>(total_width, button_width);
22 for (
size_t x = 0; x < ids.size(); x++)
24 const size_t curOffsetX = offsetX + x * (
static_cast<size_t>(width) + hpadding);
25 const SDL_FRect rect = {
static_cast<float>(curOffsetX),
static_cast<float>(offsetY),
26 static_cast<float>(width),
static_cast<float>(height) };
27 _list.emplace_back(renderer, labels[x], ids[x], rect);
32 SdlButton* SdlButtonList::get_selected(
const SDL_MouseButtonEvent& button)
34 const auto x = button.x;
35 const auto y = button.y;
37 return get_selected(x, y);
40 SdlButton* SdlButtonList::get_selected(
float x,
float y)
42 for (
auto& btn : _list)
45 if ((x >= r.x) && (x <= r.x + r.w) && (y >= r.y) && (y <= r.y + r.h))
51 bool SdlButtonList::set_highlight_next(
bool reset)
54 _highlighted =
nullptr;
57 auto next = _highlight_index++;
58 _highlight_index %= _list.size();
59 auto& element = _list[next];
60 _highlighted = &element;
65 bool SdlButtonList::set_highlight(
size_t index)
67 if (index >= _list.size())
69 _highlighted =
nullptr;
72 auto& element = _list[index];
73 _highlighted = &element;
74 _highlight_index = ++index % _list.size();
78 bool SdlButtonList::set_mouseover(
float x,
float y)
80 _mouseover = get_selected(x, y);
81 return _mouseover !=
nullptr;
84 void SdlButtonList::clear()
88 _highlighted =
nullptr;
92 bool SdlButtonList::update(SDL_Renderer* renderer)
96 for (
auto& btn : _list)
98 if (!btn.update(renderer))
103 _highlighted->highlight(renderer);
106 _mouseover->mouseover(renderer);