some more list work

This commit is contained in:
Joel Bodenmann 2013-07-27 22:55:32 +02:00
parent 984e14efb7
commit 40611e264d
2 changed files with 185 additions and 10 deletions

View File

@ -57,6 +57,24 @@ GHandle gwinListCreate(GListObject *widget, GWidgetInit *pInit);
int gwinListAddItem(GHandle gh, const char* item, bool_t useAlloc);
char* gwinListItemGetText(GHandle gh, int item);
int gwinListFindText(GHandle gh, const char* text);
void gwinListItemSetParam(GHandle gh, int item, uint16_t param);
uint16_t gwinListItemGetParam(GHandle gh, int item);
void nListDeleteAll(GHandle gh);
void gwinListItemDelete(GHandle gh, int item);
int gwinListItemCount(GHandle gh);
bool_t gwinListItemIsSelected(GHandle gh, int item);
int gwinListGetSelected(GHandle gh);
#ifdef __cplusplus
}
#endif

View File

@ -22,6 +22,8 @@
#include "gwin/class_gwin.h"
#include <string.h>
#define BORDER 3
#define widget(gh) ((GListObject *)gh)
#define GLIST_FLG_MULTISELECT (GWIN_FIRST_CONTROL_FLAG << 0)
@ -42,7 +44,6 @@ typedef struct ListItem {
uint16_t flags;
#define LISTITEM_ALLOCEDTEXT 0x0001
#define LISTITEM_SELECTED 0x0002
uint16_t param; // A parameter the user can specify himself
const char* text;
#if GWIN_LIST_IMAGES
@ -77,17 +78,18 @@ static void gwinListDefaultDraw(GWidgetObject* gw, void* param) {
(void)param;
uint16_t i, fheight;
const gfxQueueASyncItem* qi;
gfxQueueASyncItem* qi;
const GColorSet* pcol;
fheight = gdispGetFontMetric(gwinGetDefaultFont(), fontHeight);
gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, Black);
for (qi = gfxQueueASyncPeek(&gcw->list_head), i = 0; qi; qi = gfxQueueASyncNext(qi), i += fheight + 4) {
for (qi = gfxQueueASyncPeek(&gcw->list_head), i = 0; qi; qi = gfxQueueASyncNext(qi), i += fheight + 2*BORDER) {
if (((ListItem*)qi)->flags & GLIST_FLG_SELECTED)
gdispFillStringBox(gw->g.x + 3, gw->g.y + 3 + i, gw->g.width - 6, fheight, ((ListItem*)qi)->text, gwinGetDefaultFont(), White, Black, justifyLeft);
gdispFillStringBox(gw->g.x + BORDER, gw->g.y + BORDER + i, gw->g.width - 2*BORDER, fheight, ((ListItem*)qi)->text, gwinGetDefaultFont(), White, Black, justifyLeft);
else
gdispFillStringBox(gw->g.x + 3, gw->g.y + 3 + i, gw->g.width - 6, fheight, ((ListItem*)qi)->text, gwinGetDefaultFont(), Black, White, justifyLeft);
gdispFillStringBox(gw->g.x + BORDER, gw->g.y + BORDER + i, gw->g.width - 2*BORDER, fheight, ((ListItem*)qi)->text, gwinGetDefaultFont(), Black, White, justifyLeft);
}
#undef gcw
@ -101,9 +103,9 @@ static void gwinListDefaultDraw(GWidgetObject* gw, void* param) {
(void) x;
uint16_t i, item_id, item_height;
const gfxQueueASyncItem* qi;
gfxQueueASyncItem* qi;
item_height = gdispGetFontMetric(gwinGetDefaultFont(), fontHeight) + 2;
item_height = gdispGetFontMetric(gwinGetDefaultFont(), fontHeight) + 2*BORDER;
item_id = (y - gw->g.y) / item_height;
@ -115,6 +117,11 @@ static void gwinListDefaultDraw(GWidgetObject* gw, void* param) {
}
_gwidgetRedraw((GHandle)gw);
// Do not generate an event if an empty section of the list has has been selected
if (item_id < 0 || item_id > gcw->cnt - 1)
return;
sendListEvent(gw, item_id);
#undef gcw
@ -123,10 +130,11 @@ static void gwinListDefaultDraw(GWidgetObject* gw, void* param) {
#endif
static void _destroy(GHandle gh) {
const gfxQueueASyncItem* qi;
gfxQueueASyncItem* qi;
while((qi = gfxQueueASyncGet(&((GListObject *)gh)->list_head)))
gfxFree((void *)qi);
_gwidgetDestroy(gh);
}
@ -134,7 +142,7 @@ static const gwidgetVMT listVMT = {
{
"List", // The class name
sizeof(GListObject), // The object size
_destroy, // The destroy routine
_destroy, // The destroy routine
_gwidgetRedraw, // The redraw routine
0, // The after-clear routine
},
@ -203,13 +211,58 @@ int gwinListAddItem(GHandle gh, const char* item_name, bool_t useAlloc) {
// increment the total amount of entries in the list widget
widget(gh)->cnt++;
// return the position in the list (-1 because we start with index 0)
return widget(gh)->cnt-1;
}
char* gwinListItemGetText(GHandle gh, int item) {
gfxQueueASyncItem* qi;
uint16_t i;
// is it a valid handle?
if (gh->vmt != (gwinVMT *)&listVMT)
return 0;
// watch out for an invalid item
if (item < 0 || item > (widget(gh)->cnt) - 1)
return 0;
qi = gfxQueueASyncPeek(&widget(gh)->list_head);
for (i = 0; i < item; i++) {
qi = gfxQueueASyncNext(qi);
}
return ((ListItem*)qi)->text;
}
int gwinListFindText(GHandle gh, const char* text) {
gfxQueueASyncItem* qi;
uint16_t i;
// is it a valid handle?
if (gh->vmt != (gwinVMT *)&listVMT)
return -1;
// watch out for NULL pointers
if (!text)
return -1;
qi = gfxQueueASyncPeek(&widget(gh)->list_head);
for(qi = gfxQueueASyncPeek(&widget(gh)->list_head), i = 0; qi; qi = gfxQueueASyncNext(qi), i++) {
if (strcmp(((ListItem *)qi)->text, text) == 0)
return i;
}
return -1;
}
int gwinListGetSelected(GHandle gh) {
const gfxQueueASyncItem *qi;
gfxQueueASyncItem *qi;
int i;
// is it a valid handle?
if (gh->vmt != (gwinVMT *)&listVMT)
return -1;
@ -221,6 +274,110 @@ int gwinListGetSelected(GHandle gh) {
return -1;
}
void gwinListItemSetParam(GHandle gh, int item, uint16_t param) {
gfxQueueASyncItem* qi;
uint16_t i;
// is it a valid handle?
if (gh->vmt != (gwinVMT *)&listVMT)
return;
// watch out for an invalid item
if (item < 0 || item > (widget(gh)->cnt) - 1)
return;
qi = gfxQueueASyncPeek(&widget(gh)->list_head);
for (i = 0; i < item; i++) {
((ListItem*)qi)->param = param;
}
return;
}
void gwinListDeleteAll(GHandle gh) {
gfxQueueASyncItem* qi;
while((qi = gfxQueueASyncGet(&((GListObject *)gh)->list_head)))
gfxFree((void *)qi);
}
void gwinListItemDelete(GHandle gh, int item) {
gfxQueueASyncItem* qi;
uint16_t i;
// is it a valid handle?
if (gh->vmt != (gwinVMT *)&listVMT)
return;
// watch out for an invalid item
if (item < 0 || item > (widget(gh)->cnt) - 1)
return;
qi = gfxQueueASyncPeek(&widget(gh)->list_head);
// get our item pointer
for (i = 0; i < item; i++) {
qi = gfxQueueASyncNext(qi);
}
gfxQueueASyncRemove(&widget(gh)->list_head, qi);
gfxFree((void*)qi);
}
uint16_t gwinListItemGetParam(GHandle gh, int item) {
gfxQueueASyncItem* qi;
uint16_t i;
// is it a valid handle?
if (gh->vmt != (gwinVMT *)&listVMT)
return 0;
// watch out for an invalid item
if (item < 0 || item > (widget(gh)->cnt) - 1)
return 0;
qi = gfxQueueASyncPeek(&widget(gh)->list_head);
for (i = 0; i < item; i++) {
qi = gfxQueueASyncNext(qi);
}
return ((ListItem*)qi)->param;
}
bool_t gwinListItemIsSelected(GHandle gh, int item) {
gfxQueueASyncItem* qi;
uint16_t i;
// is it a valid handle?
if (gh->vmt != (gwinVMT *)&listVMT)
return FALSE;
// watch out for an invalid item
if (item < 0 || item > (widget(gh)->cnt) - 1)
return FALSE;
qi = gfxQueueASyncPeek(&widget(gh)->list_head);
for (i = 0; i < item; i++) {
qi = gfxQueueASyncNext(qi);
}
if (((ListItem*)qi)->flags & GLIST_FLG_SELECTED)
return TRUE;
else
return FALSE;
}
int gwinListItemCount(GHandle gh) {
// is it a valid handle?
if (gh->vmt != (gwinVMT *)&listVMT)
return 0;
return widget(gh)->cnt;
}
#endif // GFX_USE_GWIN && GWIN_NEED_LIST
/** @} */