Max OS 0.3
Loading...
Searching...
No Matches
inputbox.cpp
Go to the documentation of this file.
1
10#include <gui/font/amiga_font.h>
11
12using namespace MaxOS;
13using namespace MaxOS::common;
14using namespace MaxOS::gui;
15using namespace MaxOS::gui::widgets;
16using namespace MaxOS::drivers::peripherals;
17
18InputBoxEventHandler::InputBoxEventHandler() = default;
19
20InputBoxEventHandler::~InputBoxEventHandler() = default;
21
29
30 switch (event->type) {
31 case InputBoxEvents::TEXT_CHANGED:
33 break;
34 }
35
36 return event;
37}
38
45
46}
47
57: Widget(left, top, width, height),
58 background_colour(Colour(0xFF, 0xFF, 0xFF)),
59 foreground_colour(Colour(0x00, 0x00, 0x00)),
60 border_colour(Colour(0x57, 0x57, 0x57)),
61 font((uint8_t*) AMIGA_FONT)
62{
63
64}
65
75InputBox::InputBox(int32_t left, int32_t top, uint32_t width, uint32_t height, const string& text)
76: Widget(left, top, width, height),
77 background_colour(Colour(0xFF, 0xFF, 0xFF)),
78 foreground_colour(Colour(0x00, 0x00, 0x00)),
79 border_colour(Colour(0x57, 0x57, 0x57)),
80 font((uint8_t*) AMIGA_FONT)
81{
82
83 // Update the text
85
86}
87
88InputBox::~InputBox() = default;
89
97
98 // Default Draw
100
101 // Get the absolute m_position of the input box
104
105 // Get the x and y m_position of the input box
108
109 // Draw the background for the input box
110 gc->fill_rectangle(x + area.left, y + area.top, x + area.left + area.width,
112
113 // Draw the border
114
115 // Top Border
117
118 // Start in the top left corner of the button and end in the top right corner
119 gc->draw_line(x + area.left, y, x + area.left + area.width - 1, y,
121 }
122
123 // Left Border
125
126 // Start in the top left corner and end in the bottom left corner
127 gc->draw_line(x, y + area.top, x, y + area.top + area.height - 1,
129 }
130
131 // Right Border
133
134 // Start in the top right corner and end in the bottom right corner
135 gc->draw_line(x + area.left, y + input_box_position.height - 1,
136 x + area.left + area.width - 1,
138 }
139
140 // Bottom Border
142
143 // Start in the bottom left corner and end in the bottom right corner
144 gc->draw_line(x + input_box_position.width - 1, y + area.top,
146 y + area.top + area.height - 1, border_colour);
147 }
148
149 // Draw the text
152}
153
158
159 // Make the border black on focus
160 border_colour = Colour(0x00, 0x00, 0x00);
161 invalidate();
162}
163
168
169 // Reset the border colour
170 border_colour = Colour(0x57, 0x57, 0x57);
171 invalidate();
172}
173
181
182 // Handle the key press
183 switch (key_down_code) {
184 case KeyCode::backspace: {
185 if (cursor_position == 0)
186 break;
187
189 // no break - we move the cursor to the left and use the <Delete> code
190 [[fallthrough]];
191 }
192 case KeyCode::deleteKey: {
193 // Move the text to the left
194 for (size_t i = cursor_position; i < m_widget_text.length(); ++i)
195 m_widget_text[i] = m_widget_text[i + 1];
196
197 // Put a null character at the end of the string
198 m_widget_text[m_widget_text.length() - 1] = '\0';
199
200 break;
201 }
202 case KeyCode::leftArrow: {
203 // If the cursor is not at the beginning of the text, move it to the left
204 if (cursor_position > 0)
206 break;
207 }
208 case KeyCode::rightArrow: {
209
210 // If the cursor is not at the end of the text, move it to the right
211 if (m_widget_text[cursor_position] != '\0')
213 break;
214 }
215 default: {
216
217 // If the key is a printable character, add it to the text
218 if (31 < (int) key_down_code && (int) key_down_code < 127) {
219 uint32_t length = cursor_position;
220
221 // Find the length of the text buffer
222 while (m_widget_text[length] != '\0') {
223 ++length;
224 }
225
226 // Check if we need to make space for the new character
227 if (length >= (uint32_t) m_widget_text.length()) {
228 m_widget_text += " ";
229 }
230
231 // Shift elements to the right
232 while (length > cursor_position) {
233 m_widget_text[length + 1] = m_widget_text[length];
234 --length;
235 }
236
237 // Insert the new character
241 } else {
242
243 // Don't want to redraw the widget if nothing has changed
244 return;
245 }
246 break;
247 }
248 }
249
250 // Redraw the widget
251 invalidate();
252
253 // Fire the text changed event
254 if (key_down_code != KeyCode::leftArrow && key_down_code != KeyCode::rightArrow)
256
257}
258
264void InputBox::update_text(const string& new_text) {
265
266 m_widget_text.copy(new_text);
268
269 // Redraw the widget
270 invalidate();
271
272 // Fire the text changed event
274}
275
282
283 return m_widget_text;
284}
285
292: Event(InputBoxEvents::TEXT_CHANGED),
293 new_text(new_text)
294{
295
296}
297
298InputBoxTextChangedEvent::~InputBoxTextChangedEvent() = default;
Defines the Amiga system font used in the GUI.
Stores the red, green, blue and alpha values of a colour. Can be parsed from a hex string,...
Definition colour.h:91
Vector< Event< InputBoxEvents > * > raise_event(Event< InputBoxEvents > *event)
Calls the on_event function of all the event m_handlers connected to the event manager and returns a ...
Used to store information about an event, has a type and a return value.
Draws pixels to the screen, and handles drawing lines, rectangles and circles.
A pair of two objects.
Definition pair.h:22
Stores the left, top, width and height of a rectangle.
Definition rectangle.h:22
Type height
The height of the rectangle.
Definition rectangle.h:27
Type top
The top coordinate of the rectangle.
Definition rectangle.h:25
bool intersects(const Rectangle< Type > &)
Definition rectangle.h:88
Type left
The left coordinate of the rectangle.
Definition rectangle.h:24
Type width
The width of the rectangle.
Definition rectangle.h:26
Holds the state of the keyboard.
Definition keyboard.h:216
virtual void draw_text(int32_t x, int32_t y, common::Colour foreground_colour, common::Colour background_colour, common::GraphicsContext *context, string text)
write the entire text to the screen
Definition font.cpp:41
A graphical object that can be drawn on the screen.
Definition widget.h:29
void invalidate()
Invalidates the entire widget. This forces the widget to be redrawn on the next screen update.
Definition widget.cpp:55
virtual void draw(common::GraphicsContext *gc, common::Rectangle< int32_t > &area)
Draw the widget on the screen.
Definition widget.cpp:48
common::Rectangle< int32_t > position()
Get the position of the widget.
Definition widget.cpp:127
virtual common::Coordinates absolute_coordinates(common::Coordinates coordinates)
Get the absolute coordinates of the widget (relative to the screen)
Definition widget.cpp:98
virtual void on_input_box_text_changed(const string &text)
Event triggered when the text in the input box is changed.
Definition inputbox.cpp:44
common::Event< InputBoxEvents > * on_event(common::Event< InputBoxEvents > *event) override
Delegates an event to the event handler for that event type.
Definition inputbox.cpp:28
Event that is triggered when the text in an input box is changed.
Definition inputbox.h:32
InputBoxTextChangedEvent(const string &)
Construct a new Input Box Text Changed Event object.
Definition inputbox.cpp:291
void draw(common::GraphicsContext *gc, common::Rectangle< int32_t > &area) override
Draw an area of the input box onto a graphics context.
Definition inputbox.cpp:96
void update_text(const string &)
Update the text in the input box.
Definition inputbox.cpp:264
common::Colour background_colour
The background colour of the input box.
Definition inputbox.h:80
void on_focus() override
Update the border when the input box is focussed.
Definition inputbox.cpp:157
common::Colour foreground_colour
The colour of the text in the input box.
Definition inputbox.h:81
void on_key_down(drivers::peripherals::KeyCode key_down_code, const drivers::peripherals::KeyboardState &key_down_state) override
Handles a keypress event by updating the rendered text in the input box.
Definition inputbox.cpp:180
string text()
Get the text currently in the input box.
Definition inputbox.cpp:281
void on_focus_lost() override
Reset to the original input box style when it is no longer focussed.
Definition inputbox.cpp:167
common::Colour border_colour
The colour of the bar around the input box.
Definition inputbox.h:82
InputBox(int32_t left, int32_t top, uint32_t width, uint32_t height)
Construct a new Input Box object at a specific position and size.
Definition inputbox.cpp:56
gui::Font font
The font to use for the input box text.
Definition inputbox.h:83
uint32_t cursor_position
How many characters into the text the cursor is.
Definition inputbox.h:84
string m_widget_text
The text in the input box.
Definition inputbox.h:62
Defines an InputBox widget for text input in a GUI application.
InputBoxEvents
The events that an input box can trigger.
Definition inputbox.h:24
KeyCode
A mapping of key codes to their values.
Definition keyboard.h:40