FreeRDP
Loading...
Searching...
No Matches
SDL3/dialogs/sdl_buttons.cpp
1#include <cassert>
2#include <algorithm>
3
4#include "sdl_buttons.hpp"
5
6static const Uint32 hpadding = 10;
7
8SdlButtonList::~SdlButtonList() = default;
9
10bool 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)
13{
14 assert(renderer);
15 assert(width >= 0);
16 assert(height >= 0);
17 assert(labels.size() == ids.size());
18
19 _list.clear();
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++)
24 {
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 _list.emplace_back(renderer, labels[x], ids[x], rect);
29 }
30 return true;
31}
32
33SdlButton* SdlButtonList::get_selected(const SDL_MouseButtonEvent& button)
34{
35 const auto x = button.x;
36 const auto y = button.y;
37
38 return get_selected(x, y);
39}
40
41SdlButton* SdlButtonList::get_selected(float x, float y)
42{
43 for (auto& btn : _list)
44 {
45 auto r = btn.rect();
46 if ((x >= r.x) && (x <= r.x + r.w) && (y >= r.y) && (y <= r.y + r.h))
47 return &btn;
48 }
49 return nullptr;
50}
51
52bool SdlButtonList::set_highlight_next(bool reset)
53{
54 if (reset)
55 _highlighted = nullptr;
56 else
57 {
58 auto next = _highlight_index++;
59 _highlight_index %= _list.size();
60 auto& element = _list[next];
61 _highlighted = &element;
62 }
63 return true;
64}
65
66bool SdlButtonList::set_highlight(size_t index)
67{
68 if (index >= _list.size())
69 {
70 _highlighted = nullptr;
71 return false;
72 }
73 auto& element = _list[index];
74 _highlighted = &element;
75 _highlight_index = ++index % _list.size();
76 return true;
77}
78
79bool SdlButtonList::set_mouseover(float x, float y)
80{
81 _mouseover = get_selected(x, y);
82 return _mouseover != nullptr;
83}
84
85void SdlButtonList::clear()
86{
87 _list.clear();
88 _mouseover = nullptr;
89 _highlighted = nullptr;
90 _highlight_index = 0;
91}
92
93bool SdlButtonList::update(SDL_Renderer* renderer)
94{
95 assert(renderer);
96
97 for (auto& btn : _list)
98 {
99 if (!btn.update(renderer))
100 return false;
101 }
102
103 if (_highlighted)
104 _highlighted->highlight(renderer);
105
106 if (_mouseover)
107 _mouseover->mouseover(renderer);
108 return true;
109}