summaryrefslogtreecommitdiff
path: root/src/widget/widget_statusbar.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/widget/widget_statusbar.c')
-rw-r--r--src/widget/widget_statusbar.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/src/widget/widget_statusbar.c b/src/widget/widget_statusbar.c
new file mode 100644
index 0000000..0c20c7f
--- /dev/null
+++ b/src/widget/widget_statusbar.c
@@ -0,0 +1,153 @@
+
+#include <stdlib.h>
+#include <assert.h>
+
+#include "main.h"
+#include "interface.h"
+#include "image.h"
+#include "font.h"
+#include "widget_statusbar.h"
+#include "widget.h"
+
+typedef struct item_struct {
+ widget_t *widget;
+ list_t *text;
+} item_t;
+
+static item_t* item_new(widget_t *widget, char *text)
+{
+ item_t *item;
+ char *copy;
+ char *s;
+
+ assert( widget != NULL );
+ assert( text != NULL );
+
+ item = malloc(sizeof(item_t));
+ item->widget = widget;
+ item->text = list_new();
+
+ copy = strdup(text);
+
+ s = strtok(copy, "\n");
+
+ while( s != NULL )
+ {
+ list_add(item->text, strdup(s));
+ s = strtok(NULL, "\n");
+ }
+
+ free(copy);
+
+ return item;
+}
+
+static void item_destroy(item_t *item)
+{
+ assert( item != NULL );
+
+ list_destroy_item(item->text, free);
+ free(item);
+}
+
+widget_t *statusbar_new(int x, int y)
+{
+ widget_statusbar_t *new;
+
+ new = malloc(sizeof(widget_statusbar_t));
+ new->selectElement = WIDGET_STATUSBAR_NONE_SELECT_ELEMENT;
+ new->listElement = list_new();
+
+ return widget_new(WIDGET_TYPE_STATUSBAR, x, y, WIDGET_STATUSBAR_WIDTH, WIDGET_STATUSBAR_HEIGHT, new);
+}
+
+void statusbar_add(widget_t *widget, widget_t * widget_catch, char *text)
+{
+ widget_statusbar_t *p;
+
+ assert(widget != NULL);
+ assert(widget_catch != NULL);
+ assert(text != NULL);
+ assert(widget->type == WIDGET_TYPE_STATUSBAR);
+
+ p = (widget_statusbar_t *) widget->private_data;
+
+ list_add(p->listElement, item_new(widget_catch, text) );
+}
+
+void statusbar_draw(widget_t * widget)
+{
+ static image_t *g_image = NULL;
+ widget_statusbar_t *p;
+
+ assert(widget != NULL);
+ assert(widget->type == WIDGET_TYPE_STATUSBAR);
+
+ p = (widget_statusbar_t *) widget->private_data;
+
+ if (g_image == NULL) {
+ g_image = image_add("frame.png", IMAGE_ALPHA, "frame", IMAGE_GROUP_BASE);
+ }
+
+ image_draw(g_image, widget->x, widget->y, 0, 0, g_image->w, g_image->h);
+
+ if( p->selectElement != WIDGET_STATUSBAR_NONE_SELECT_ELEMENT )
+ {
+ item_t *item;
+ int i;
+
+ item = (item_t *)p->listElement->list[p->selectElement];
+
+ for( i = 0 ; i < item->text->count ; i++ )
+ {
+ char *s;
+
+ s = (char *) item->text->list[i];
+ font_draw(s, widget->x, widget->y+i*(font_get_size()+5), COLOR_WHITE);
+ }
+ }
+}
+
+void statusbar_event(widget_t * widget)
+{
+ widget_statusbar_t *p;
+ int x, y;
+ int i;
+
+ assert(widget != NULL);
+ assert(widget->type == WIDGET_TYPE_STATUSBAR);
+
+ p = (widget_statusbar_t *) widget->private_data;
+
+ interface_get_mouse_position(&x, &y);
+
+ p->selectElement = WIDGET_STATUSBAR_NONE_SELECT_ELEMENT;
+
+ for( i = 0 ; i < p->listElement->count ; i++ )
+ {
+ item_t *item;
+
+ item = (item_t *)p->listElement->list[i];
+
+ if( x >= item->widget->x && x <= item->widget->x+item->widget->w &&
+ y >= item->widget->y && y <= item->widget->y+item->widget->h )
+ {
+ p->selectElement = i;
+ }
+ }
+}
+
+void statusbar_destroy(widget_t * widget)
+{
+ widget_statusbar_t *p;
+
+ assert(widget != NULL);
+ assert(widget->type == WIDGET_TYPE_STATUSBAR);
+
+ p = (widget_statusbar_t *) widget->private_data;
+
+ list_destroy_item(p->listElement, item_destroy);
+ free(p);
+
+ widget_destroy(widget);
+}