summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-06-24 21:16:44 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-06-24 21:16:44 +0200
commite74065e71667d8df1529f8ca32e14f3e54119ea1 (patch)
treed5daa165dd618eda0bf6b8760472a95eefaa80ad /src/gui
parentfd0782099cab0988311aa80d4a6b0871a6403084 (diff)
downloadabaos-e74065e71667d8df1529f8ca32e14f3e54119ea1.tar.gz
abaos-e74065e71667d8df1529f8ca32e14f3e54119ea1.tar.bz2
started to implement a widget showing text, the problem currently
is the inheritance method in draw is not working correctly
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/composite_widget.h1
-rw-r--r--src/gui/text_widget.c64
-rw-r--r--src/gui/text_widget.h22
3 files changed, 86 insertions, 1 deletions
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