diff options
Diffstat (limited to 'src/widget/widget_statusbar.c')
| -rw-r--r-- | src/widget/widget_statusbar.c | 153 |
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); +} |