From e74065e71667d8df1529f8ca32e14f3e54119ea1 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 24 Jun 2017 21:16:44 +0200 Subject: started to implement a widget showing text, the problem currently is the inheritance method in draw is not working correctly --- src/gui/composite_widget.h | 1 - src/gui/text_widget.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++ src/gui/text_widget.h | 22 ++++++++++++++++ 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 src/gui/text_widget.c create mode 100644 src/gui/text_widget.h (limited to 'src/gui') diff --git a/src/gui/composite_widget.h b/src/gui/composite_widget.h index 2b27e32..28e1e02 100644 --- a/src/gui/composite_widget.h +++ b/src/gui/composite_widget.h @@ -16,7 +16,6 @@ typedef struct { widget_t *children[MAX_NOF_WIDGET_CHILDREN]; int nof_children; widget_t *focused_child; - vga_color_t background_color; } composite_widget_t; void composite_widget_init( composite_widget_t *widget, widget_t *parent, const int x, const int y, const int w, const int h, const vga_color_t background_color ); diff --git a/src/gui/text_widget.c b/src/gui/text_widget.c new file mode 100644 index 0000000..fbb3754 --- /dev/null +++ b/src/gui/text_widget.c @@ -0,0 +1,64 @@ +#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->vtable = &text_widget_vtable; +} + +void text_widget_draw( void *obj, graphics_context_t *context ) +{ + text_widget_t *widget = obj; + + widget->base.vtable->draw( obj, context ); + + int x = 0; + int y = 0; + + widget->base.vtable->model_to_screen( widget, &x, &y ); + + for( char c = widget->s[0]; c != '\0'; c++ ) { + vga_draw_char( context, c, x, y, widget->base.background_color, + VGA_COLOR_WHITE ); + x += 9; + if( x >= widget->base.w - 9 ) { + y += 16; + x = 0; + } + } + +} + +void text_widget_set_text( void *obj, const char *s ) +{ + text_widget_t *widget = obj; + + // TODO: see above + widget->s = s; +} + diff --git a/src/gui/text_widget.h b/src/gui/text_widget.h new file mode 100644 index 0000000..4b00b4f --- /dev/null +++ b/src/gui/text_widget.h @@ -0,0 +1,22 @@ +#ifndef TEXT_WIDGET_H +#define TEXT_WIDGET_H + +#include "widget.h" + +typedef struct { + widget_vtable_t base; + void (*set_text)( void *obj, const char *s ); +} text_widget_vtable_t; + +typedef struct { + widget_t base; + text_widget_vtable_t *vtable; + const char *s; +} text_widget_t; + +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 ); + +void text_widget_draw( void *obj, graphics_context_t *context ); +void text_widget_set_text( void *obj, const char *s ); + +#endif // TEXT_WIDGET_H -- cgit v1.2.3-54-g00ecf