#include "text_widget.h" #include "string.h" #include "stddef.h" static text_widget_vtable_t text_widget_vtable = { { text_widget_draw, widget_get_focus, widget_model_to_screen, widget_contains_coordinate, widget_on_mouse_down, widget_on_mouse_up, widget_on_mouse_move, widget_on_key_down, widget_on_key_up }, text_widget_set_text }; void text_widget_init( text_widget_t *widget, widget_t *parent, const int x, const int y, const int w, const int h, const vga_color_t background_color, const char *s ) { memset( widget, 0, sizeof( text_widget_t ) ); widget_init( &widget->base, parent, x, y, w, h, background_color ); text_widget_set_text( widget, s ); widget->base.vtable = (widget_vtable_t *)&text_widget_vtable; widget->vtable = &text_widget_vtable; } void text_widget_draw( void *obj, graphics_context_t *context ) { text_widget_t *widget = obj; widget_draw( obj, context ); int x = 0; int y = 0; int w = 0; int h = 0; widget->base.vtable->model_to_screen( widget, &x, &y ); for( const char *p = widget->s; *p != '\0'; p++ ) { vga_draw_char( context, *p, x + w, y + h, widget->base.background_color, VGA_COLOR_WHITE ); w += 9; if( w >= widget->base.w - 10 ) { h += 16; w = 0; } } } void text_widget_set_text( void *obj, const char *s ) { text_widget_t *widget = obj; strlcpy( widget->s, s, TEXT_WIDGET_MAX_TEXT_SIZE ); }