diff options
| author | Dusan Durech <dusan@debian.debian> | 2009-04-23 19:17:56 +0200 |
|---|---|---|
| committer | Dusan Durech <dusan@debian.debian> | 2009-04-23 19:22:10 +0200 |
| commit | 9866f48c8716996cd67ccb008471f73f8fc1baa6 (patch) | |
| tree | 5e4a11273ab1c82b06090d97c94a6a18e8fcfe3f /src/widget | |
| parent | 112e8071a8d96f9251ef265e31bd11a4662a893d (diff) | |
support statusbar (need write label)| fix kiks with keycontrol.conf| fix memory leak in font.c
Diffstat (limited to 'src/widget')
| -rw-r--r-- | src/widget/widget.h | 1 | ||||
| -rw-r--r-- | src/widget/widget_statusbar.c | 153 | ||||
| -rw-r--r-- | src/widget/widget_statusbar.h | 25 |
3 files changed, 179 insertions, 0 deletions
diff --git a/src/widget/widget.h b/src/widget/widget.h index ad0f9a6..c21ace4 100644 --- a/src/widget/widget.h +++ b/src/widget/widget.h @@ -14,6 +14,7 @@ # define WIDGET_TYPE_CHOICE 6 # define WIDGET_TYPE_IMAGE 7 # define WIDGET_TYPE_SELECT 8 +# define WIDGET_TYPE_STATUSBAR 9 typedef struct widget_struct { int type; 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); +} diff --git a/src/widget/widget_statusbar.h b/src/widget/widget_statusbar.h new file mode 100644 index 0000000..6b81cf3 --- /dev/null +++ b/src/widget/widget_statusbar.h @@ -0,0 +1,25 @@ + +#ifndef WIDGET_STATUSBAR_H + +# define WIDGET_STATUSBAR_H + +# include "main.h" +# include "widget.h" +# include "list.h" + +typedef struct widget_statusbar { + list_t *listElement; + int selectElement; +} widget_statusbar_t; + +# define WIDGET_STATUSBAR_NONE_SELECT_ELEMENT -1 +# define WIDGET_STATUSBAR_WIDTH 250 +# define WIDGET_STATUSBAR_HEIGHT 65 + +extern widget_t *statusbar_new(int x, int y); +extern void statusbar_add(widget_t *widget, widget_t * widget_catch, char *text); +extern void statusbar_draw(widget_t * widget); +extern void statusbar_event(widget_t * widget); +extern void statusbar_destroy(widget_t * widget); + +#endif |