#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 ); // TODO: const for now, caller has to preserve the text // maybe with memory manager in place we can do this with a strdup widget->s = 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 - 9 ) { h += 16; w = 0; } } } void text_widget_set_text( void *obj, const char *s ) { text_widget_t *widget = obj; // TODO: see above widget->s = s; }