CPP-TOOLBOX
Loading...
Searching...
No Matches
ui.hpp
Go to the documentation of this file.
1#ifndef UI_HPP
2#define UI_HPP
3
4#include <functional>
5#include <glm/fwd.hpp>
6#include <optional>
8
9struct FileBrowser {
10 float fsb_width;
13
21
22 // Constructor to initialize the struct with the necessary parameters
23 FileBrowser(float width, float height)
24 : fsb_width(width), fsb_height(height), fsb_to_top_edge_dist(height / 2.0),
25 background_rect(vertex_geometry::create_rectangle(0, 0, width, height)),
27 vertex_geometry::create_rectangle(0, 0.8 * fsb_to_top_edge_dist, 0.8 * width, 0.1 * height)),
28 main_file_view_rect(vertex_geometry::create_rectangle(0, 0 * height, 0.7 * width, 0.7 * height)),
29 file_selection_bar(vertex_geometry::create_rectangle(0, -0.4 * height, 0.8 * width, 0.1 * height)),
30 open_button(vertex_geometry::create_rectangle(0.4 * width, -0.4 * height, 0.1 * width, 0.1 * height)),
31 close_button(vertex_geometry::create_rectangle(0.4 * width, 0.4 * height, 0.05 * width, 0.05 * height)),
32 up_a_dir_button(vertex_geometry::create_rectangle(-0.4 * width, 0.4 * height, 0.05 * width, 0.05 * height)) {}
33};
34
45
61
80
82
85 std::function<void(const std::string)> on_click, std::function<void(const std::string)> on_hover)
88 on_click(std::move(on_click)), on_hover(std::move(on_hover)) {}
89
90 std::string option;
91
92 glm::vec3 color;
93 glm::vec3 hover_color;
94
97
99
101
102 bool mouse_inside = false;
103 std::function<void(const std::string)> on_click;
104 std::function<void(const std::string)> on_hover;
105};
106
108 int id;
109
110 std::string selected_option;
111
112 glm::vec3 regular_color;
113 glm::vec3 hover_color;
114
115 std::function<void()> on_click;
116 std::function<void()> on_hover;
117
121
122 // a vector because we have one for each dropdown elt
123
124 std::vector<UIDropdownOption> ui_dropdown_options;
125 bool mouse_inside = false;
126 bool dropdown_open = false;
128
129 UIDropdown(std::function<void()> on_click, std::function<void()> on_hover, draw_info::IVPColor dropdown_background,
130 draw_info::IVPColor dropdown_text_data, glm::vec3 regular_color, glm::vec3 hover_color,
131 vertex_geometry::Rectangle dropdown_rect, std::vector<UIDropdownOption> ui_dropdown_options,
136 // NOTE: we're running under the assumption that every dropdown will have at least one option
138 }
139};
140
162
163// we work in ndc space, and so z layer refers to what z layer we're on, by default we have 20 z layers of the form
164// -1, -0.9, -0.8, ..., -0.1, 0, 0.1, 0.2, 0.3, ... 0.9, 1
165// each UI owns the space from its z layer to the next z layer, so for example if you create a UI with z layer 0, then
166// it owns the space from 0 to 0.1 and thus all the numbers like 0.01, 0.02, 0.03, 0.04, ... 0.09 are all bandwiths you
167// can do stuff on safely and not hit the next z layer.
168class UI {
169 public:
174
176
178
180
181 // TODO: I don't like that these are here, but I don't really have a choice right now correct?
183
184 void process_mouse_position(const glm::vec2 &mouse_pos_ndc);
185
186 void process_mouse_just_clicked(const glm::vec2 &mouse_pos_ndc);
187 bool process_mouse_just_clicked_on_clickable_textboxes(const glm::vec2 &mouse_pos_ndc);
188 bool process_mouse_just_clicked_on_input_boxes(const glm::vec2 &mouse_pos_ndc);
189 bool process_mouse_just_clicked_on_dropdown_options(const glm::vec2 &mouse_pos_ndc);
190 bool process_mouse_just_clicked_on_dropdowns(const glm::vec2 &mouse_pos_ndc);
191
193 void unfocus_input_box(int input_box_eid);
194
195 void focus_input_box(UIInputBox &ib);
196 void focus_input_box(int input_box_eid);
197
198 void update_dropdown_option(UIDropdown &dropdown, const std::string &option_name);
199
200 void process_key_press(const std::string &character_pressed);
203
204 void add_colored_rectangle(vertex_geometry::Rectangle ndc_rectangle, const glm::vec3 &normalized_rgb);
205 void add_colored_rectangle(float x_pos_ndc, float y_pos_ndc, float width, float height,
206 const glm::vec3 &normalized_rgb);
207
208 /*void add_clickable_colored_rectangle(std::function<void()> on_click, float x_pos_ndc, float y_pos_ndc, float
209 * width,*/
210 /* float height, const glm::vec3 &regular_color, const glm::vec3
211 * &hover_color);*/
212
213 int add_textbox(const std::string &text, vertex_geometry::Rectangle ndc_text_rectangle,
214 const glm::vec3 &normalized_rgb);
215 int add_textbox(const std::string &text, float center_x_pos_ndc, float center_y_pos_ndc, float width, float height,
216 const glm::vec3 &normalized_rgb);
217
218 void hide_textbox(int doid);
219 void unhide_textbox(int doid);
220 void modify_text_of_a_textbox(int doid, std::string new_text);
221 void modify_colored_rectangle(int doid, vertex_geometry::Rectangle ndc_rectangle);
222
223 UITextBox *get_textbox(int doid);
224 UIInputBox *get_inputbox(int doid);
225 UIRect *get_colored_rectangle(int doid);
226
227 /* why we pass our fucntions by reference:
228 * Capturing State in Lambdas:
229 * If the on_click function uses any external state or variables (like curr_state or other context-dependent
230 * variables), ensure that you capture them correctly. In the provided code, on_click is passed by value,
231 * which means it will capture the current values of any external variables when the function is defined.
232 * If those variables change later, the on_click function will still hold the old values unless you capture by
233 reference
234 * (e.g., by using [&] in a lambda). This is particularly relevant if curr_state needs to be updated when a text box
235 is clicked.
236 */
237
238 /*
239 * we pass by copy here because if the functions go out of scope and we captured by reference, then the references
240 * would no longer exist, that actually happens when you were to create a ui in a function and define the
241 * onclick/onhover functions in there.
242 */
243 int add_clickable_textbox(std::function<void()> on_click, std::function<void()> on_hover, const std::string &text,
244 float x_pos_ndc, float y_pos_ndc, float width, float height,
245 const glm::vec3 &regular_color, const glm::vec3 &hover_color);
246
247 // in the future these probably don't have to be nodiscard so long as a I have a method for geting ids back out.
248 int add_clickable_textbox(std::function<void()> on_click, std::function<void()> on_hover, const std::string &text,
249 vertex_geometry::Rectangle &rect, const glm::vec3 &regular_color,
250 const glm::vec3 &hover_color);
251
285 int add_dropdown(std::function<void()> on_click, std::function<void()> on_hover, int dropdown_option_idx,
286 const vertex_geometry::Rectangle &rect, const glm::vec3 &regular_color,
287 const glm::vec3 &hover_color, const std::vector<std::string> &options,
288 std::function<void(std::string)> option_on_click, std::function<void(std::string)> option_on_hover,
289 const glm::vec3 &option_color = glm::vec3(0), const glm::vec3 &option_hover_color = glm::vec3(0));
290
291 bool remove_clickable_textbox(int do_id);
292 bool remove_textbox(int do_id);
294
295 int add_input_box(std::function<void(std::string)> on_confirm, const std::string &placeholder_text,
296 const vertex_geometry::Rectangle &ndc_rect, const glm::vec3 &regular_color,
297 const glm::vec3 &focused_color);
298
299 int add_input_box(std::function<void(std::string)> on_confirm, const std::string &placeholder_text, float x_pos_ndc,
300 float y_pos_ndc, float width, float height, const glm::vec3 &regular_color,
301 const glm::vec3 &focused_color);
302
303 /*const std::vector<UIRect> &get_rectangles() const;*/
304 /*const std::vector<UIClickableTextBox> &get_clickable_text_boxes() const;*/
305 /*const std::vector<IVPTextured> &get_text_boxes() const;*/
306
307 const std::vector<UIClickableTextBox> &get_clickable_text_boxes() const;
308 const std::vector<UIDropdown> &get_dropdowns() const;
309 const std::vector<UIInputBox> &get_input_boxes() const;
310 const std::vector<UITextBox> &get_text_boxes() const;
311 const std::vector<UIRect> &get_colored_boxes() const;
312
313 private:
314 void disable_focus_on_all_input_boxes();
315
316 std::vector<draw_info::IVPTextured> drawable_text_information;
317
318 std::vector<UIRect> rectangles;
319 std::vector<UIDropdown> dropdowns;
320 std::vector<UIClickableTextBox> clickable_text_boxes;
321 std::vector<UITextBox> text_boxes;
322 std::vector<UIInputBox> input_boxes;
323};
324
330 public:
331 virtual ~IUIRenderSuite() = default;
332
337 virtual void render_colored_box(const UIRect &cb) = 0;
338
343 virtual void render_text_box(const UITextBox &tb) = 0;
344
350
355 virtual void render_input_box(const UIInputBox &ib) = 0;
356
361 virtual void render_dropdown(const UIDropdown &dd) = 0;
362
363 virtual void render_dropdown_option(const UIDropdownOption &udo) = 0;
364};
365
366void process_and_queue_render_ui(glm::vec2 ndc_mouse_pos, UI &curr_ui, IUIRenderSuite &ui_render_suite,
367 const std::vector<std::string> &key_strings_just_pressed,
368 bool delete_action_just_pressed, bool confirm_action_just_pressed,
369 bool mouse_just_clicked);
370
371#endif // UI_HPP
static int get_id()
Retrieves the next unique ID.
Definition unique_id_generator.cpp:6
Interface for UI rendering operations.
Definition ui.hpp:329
virtual void render_text_box(const UITextBox &tb)=0
Render a text box.
virtual ~IUIRenderSuite()=default
virtual void render_colored_box(const UIRect &cb)=0
Render a colored box.
virtual void render_input_box(const UIInputBox &ib)=0
Render an input box.
virtual void render_dropdown_option(const UIDropdownOption &udo)=0
virtual void render_dropdown(const UIDropdown &dd)=0
Render a dropdown menu.
virtual void render_clickable_text_box(const UIClickableTextBox &cr)=0
Render a clickable text box.
Definition logger.hpp:22
Definition temporal_binary_signal.hpp:12
Definition ui.hpp:168
void process_delete_action()
Definition ui.cpp:296
bool process_mouse_just_clicked_on_dropdowns(const glm::vec2 &mouse_pos_ndc)
Definition ui.cpp:198
const std::vector< UIDropdown > & get_dropdowns() const
Definition ui.cpp:706
Logger logger
Definition ui.hpp:175
const std::vector< UITextBox > & get_text_boxes() const
Definition ui.cpp:708
int add_input_box(std::function< void(std::string)> on_confirm, const std::string &placeholder_text, const vertex_geometry::Rectangle &ndc_rect, const glm::vec3 &regular_color, const glm::vec3 &focused_color)
Definition ui.cpp:667
bool process_mouse_just_clicked_on_input_boxes(const glm::vec2 &mouse_pos_ndc)
Definition ui.cpp:133
void process_mouse_just_clicked(const glm::vec2 &mouse_pos_ndc)
Definition ui.cpp:250
float background_layer
Definition ui.hpp:177
bool process_mouse_just_clicked_on_clickable_textboxes(const glm::vec2 &mouse_pos_ndc)
Definition ui.cpp:86
UIRect * get_colored_rectangle(int doid)
Definition ui.cpp:471
float z_layer
Definition ui.hpp:177
UI(float z_layer, UniqueIDGenerator &abs_pos_object_id_generator)
Definition ui.hpp:170
UIInputBox * get_inputbox(int doid)
Definition ui.cpp:461
int add_dropdown(std::function< void()> on_click, std::function< void()> on_hover, int dropdown_option_idx, const vertex_geometry::Rectangle &rect, const glm::vec3 &regular_color, const glm::vec3 &hover_color, const std::vector< std::string > &options, std::function< void(std::string)> option_on_click, std::function< void(std::string)> option_on_hover, const glm::vec3 &option_color=glm::vec3(0), const glm::vec3 &option_hover_color=glm::vec3(0))
Adds a dropdown UI element with a main button and multiple selectable options.
Definition ui.cpp:480
int add_clickable_textbox(std::function< void()> on_click, std::function< void()> on_hover, const std::string &text, float x_pos_ndc, float y_pos_ndc, float width, float height, const glm::vec3 &regular_color, const glm::vec3 &hover_color)
Definition ui.cpp:636
UniqueIDGenerator & abs_pos_object_id_generator
Definition ui.hpp:182
void unhide_textbox(int doid)
Definition ui.cpp:413
int add_textbox(const std::string &text, vertex_geometry::Rectangle ndc_text_rectangle, const glm::vec3 &normalized_rgb)
Definition ui.cpp:340
float dropdown_background_layer
Definition ui.hpp:177
void focus_input_box(UIInputBox &ib)
Definition ui.cpp:117
bool remove_textbox(int do_id)
Definition ui.cpp:611
void hide_textbox(int doid)
Definition ui.cpp:407
void process_mouse_position(const glm::vec2 &mouse_pos_ndc)
Definition ui.cpp:16
float dropdown_text_layer
Definition ui.hpp:177
bool process_mouse_just_clicked_on_dropdown_options(const glm::vec2 &mouse_pos_ndc)
Definition ui.cpp:168
const std::vector< UIClickableTextBox > & get_clickable_text_boxes() const
Definition ui.cpp:705
void modify_text_of_a_textbox(int doid, std::string new_text)
Definition ui.cpp:419
float text_layer
Definition ui.hpp:177
const std::vector< UIInputBox > & get_input_boxes() const
Definition ui.cpp:707
void modify_colored_rectangle(int doid, vertex_geometry::Rectangle ndc_rectangle)
Definition ui.cpp:438
void process_key_press(const std::string &character_pressed)
Definition ui.cpp:261
const std::vector< UIRect > & get_colored_boxes() const
Definition ui.cpp:709
UniqueIDGenerator ui_id_generator
Definition ui.hpp:179
UITextBox * get_textbox(int doid)
Definition ui.cpp:451
void process_confirm_action()
Definition ui.cpp:279
void unfocus_input_box(UIInputBox &ib)
Definition ui.cpp:99
bool remove_clickable_textbox(int do_id)
Definition ui.cpp:600
void add_colored_rectangle(vertex_geometry::Rectangle ndc_rectangle, const glm::vec3 &normalized_rgb)
Definition ui.cpp:319
UIClickableTextBox * get_clickable_textbox(int do_id)
Definition ui.cpp:590
void update_dropdown_option(UIDropdown &dropdown, const std::string &option_name)
Definition ui.cpp:152
Definition unique_id_generator.hpp:17
Definition draw_info.hpp:120
Definition vertex_geometry.hpp:126
Definition hashing.hpp:8
Definition vertex_geometry.cpp:19
vertex_geometry::Rectangle current_directory_rect
Definition ui.hpp:15
vertex_geometry::Rectangle close_button
Definition ui.hpp:19
FileBrowser(float width, float height)
Definition ui.hpp:23
float fsb_width
Definition ui.hpp:10
vertex_geometry::Rectangle open_button
Definition ui.hpp:18
float fsb_height
Definition ui.hpp:11
float fsb_to_top_edge_dist
Definition ui.hpp:12
vertex_geometry::Rectangle background_rect
Definition ui.hpp:14
vertex_geometry::Rectangle main_file_view_rect
Definition ui.hpp:16
vertex_geometry::Rectangle up_a_dir_button
Definition ui.hpp:20
vertex_geometry::Rectangle file_selection_bar
Definition ui.hpp:17
Definition ui.hpp:62
bool mouse_inside
Definition ui.hpp:71
std::function< void()> on_hover
Definition ui.hpp:65
draw_info::IVPColor text_drawing_ivpsc
Definition ui.hpp:67
glm::vec3 hover_color
Definition ui.hpp:69
TemporalBinarySignal modified_signal
Definition ui.hpp:72
vertex_geometry::Rectangle rect
Definition ui.hpp:70
glm::vec3 regular_color
Definition ui.hpp:68
std::function< void()> on_click
Definition ui.hpp:64
int id
Definition ui.hpp:63
draw_info::IVPColor ivpsc
Definition ui.hpp:66
UIClickableTextBox(std::function< void()> on_click, std::function< void()> on_hover, draw_info::IVPColor ivpsc, draw_info::IVPColor text_drawing_data, glm::vec3 regular_color, glm::vec3 hover_color, vertex_geometry::Rectangle rect, int id=GlobalUIDGenerator::get_id())
Definition ui.hpp:74
Definition ui.hpp:81
glm::vec3 color
Definition ui.hpp:92
draw_info::IVPColor background_ivpsc
Definition ui.hpp:95
vertex_geometry::Rectangle rect
Definition ui.hpp:100
std::function< void(const std::string)> on_hover
Definition ui.hpp:104
TemporalBinarySignal modified_signal
Definition ui.hpp:98
draw_info::IVPColor text_ivpsc
Definition ui.hpp:96
UIDropdownOption(std::string option, glm::vec3 color, glm::vec3 hover_color, draw_info::IVPColor background_ivpsc, draw_info::IVPColor text_ivpsc, vertex_geometry::Rectangle rect, std::function< void(const std::string)> on_click, std::function< void(const std::string)> on_hover)
Definition ui.hpp:83
glm::vec3 hover_color
Definition ui.hpp:93
std::function< void(const std::string)> on_click
Definition ui.hpp:103
std::string option
Definition ui.hpp:90
bool mouse_inside
Definition ui.hpp:102
Definition ui.hpp:107
draw_info::IVPColor dropdown_text_ivpsc
Definition ui.hpp:119
std::function< void()> on_click
Definition ui.hpp:115
glm::vec3 regular_color
Definition ui.hpp:112
std::string selected_option
Definition ui.hpp:110
bool mouse_inside
Definition ui.hpp:125
std::function< void()> on_hover
Definition ui.hpp:116
int id
Definition ui.hpp:108
draw_info::IVPColor dropdown_background
Definition ui.hpp:118
vertex_geometry::Rectangle dropdown_rect
Definition ui.hpp:120
bool dropdown_open
Definition ui.hpp:126
UIDropdown(std::function< void()> on_click, std::function< void()> on_hover, draw_info::IVPColor dropdown_background, draw_info::IVPColor dropdown_text_data, glm::vec3 regular_color, glm::vec3 hover_color, vertex_geometry::Rectangle dropdown_rect, std::vector< UIDropdownOption > ui_dropdown_options, int id=GlobalUIDGenerator::get_id())
Definition ui.hpp:129
std::vector< UIDropdownOption > ui_dropdown_options
Definition ui.hpp:124
TemporalBinarySignal modified_signal
Definition ui.hpp:127
glm::vec3 hover_color
Definition ui.hpp:113
Definition ui.hpp:141
TemporalBinarySignal modified_signal
Definition ui.hpp:152
std::function< void(std::string)> on_confirm
Definition ui.hpp:143
std::string contents
Definition ui.hpp:147
bool focused
Definition ui.hpp:151
draw_info::IVPColor background_ivpsc
Definition ui.hpp:144
glm::vec3 regular_color
Definition ui.hpp:148
UIInputBox(std::function< void(std::string)> on_confirm, draw_info::IVPColor background_ivpsc, draw_info::IVPColor text_drawing_data, std::string placeholder_text, std::string contents, glm::vec3 regular_color, glm::vec3 focused_color, vertex_geometry::Rectangle rect, int id=GlobalUIDGenerator::get_id())
Definition ui.hpp:154
draw_info::IVPColor text_drawing_ivpsc
Definition ui.hpp:145
glm::vec3 focused_color
Definition ui.hpp:149
std::string placeholder_text
Definition ui.hpp:146
vertex_geometry::Rectangle rect
Definition ui.hpp:150
int id
Definition ui.hpp:142
Definition ui.hpp:35
bool mouse_above
Definition ui.hpp:38
int parent_ui_id
Definition ui.hpp:36
draw_info::IVPColor ivpsc
Definition ui.hpp:37
UIRect(draw_info::IVPColor ivpsc, int id=GlobalUIDGenerator::get_id())
Definition ui.hpp:43
bool hidden
Definition ui.hpp:41
TemporalBinarySignal modified_signal
Definition ui.hpp:39
Definition ui.hpp:46
int parent_ui_id
Definition ui.hpp:47
draw_info::IVPColor text_drawing_ivpsc
Definition ui.hpp:49
UITextBox(draw_info::IVPColor background_ivpsc, draw_info::IVPColor text_drawing_data, vertex_geometry::Rectangle bounding_rect, int id=GlobalUIDGenerator::get_id())
Definition ui.hpp:56
bool mouse_above
Definition ui.hpp:51
TemporalBinarySignal modified_signal
Definition ui.hpp:52
draw_info::IVPColor background_ivpsc
Definition ui.hpp:48
bool hidden
Definition ui.hpp:54
vertex_geometry::Rectangle bounding_rect
Definition ui.hpp:50
void process_and_queue_render_ui(glm::vec2 ndc_mouse_pos, UI &curr_ui, IUIRenderSuite &ui_render_suite, const std::vector< std::string > &key_strings_just_pressed, bool delete_action_just_pressed, bool confirm_action_just_pressed, bool mouse_just_clicked)
Definition ui.cpp:711