some more list work
This commit is contained in:
parent
984e14efb7
commit
40611e264d
2 changed files with 185 additions and 10 deletions
|
@ -57,6 +57,24 @@ GHandle gwinListCreate(GListObject *widget, GWidgetInit *pInit);
|
||||||
|
|
||||||
int gwinListAddItem(GHandle gh, const char* item, bool_t useAlloc);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
177
src/gwin/list.c
177
src/gwin/list.c
|
@ -22,6 +22,8 @@
|
||||||
#include "gwin/class_gwin.h"
|
#include "gwin/class_gwin.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#define BORDER 3
|
||||||
|
|
||||||
#define widget(gh) ((GListObject *)gh)
|
#define widget(gh) ((GListObject *)gh)
|
||||||
|
|
||||||
#define GLIST_FLG_MULTISELECT (GWIN_FIRST_CONTROL_FLAG << 0)
|
#define GLIST_FLG_MULTISELECT (GWIN_FIRST_CONTROL_FLAG << 0)
|
||||||
|
@ -42,7 +44,6 @@ typedef struct ListItem {
|
||||||
|
|
||||||
uint16_t flags;
|
uint16_t flags;
|
||||||
#define LISTITEM_ALLOCEDTEXT 0x0001
|
#define LISTITEM_ALLOCEDTEXT 0x0001
|
||||||
#define LISTITEM_SELECTED 0x0002
|
|
||||||
uint16_t param; // A parameter the user can specify himself
|
uint16_t param; // A parameter the user can specify himself
|
||||||
const char* text;
|
const char* text;
|
||||||
#if GWIN_LIST_IMAGES
|
#if GWIN_LIST_IMAGES
|
||||||
|
@ -77,17 +78,18 @@ static void gwinListDefaultDraw(GWidgetObject* gw, void* param) {
|
||||||
(void)param;
|
(void)param;
|
||||||
|
|
||||||
uint16_t i, fheight;
|
uint16_t i, fheight;
|
||||||
const gfxQueueASyncItem* qi;
|
gfxQueueASyncItem* qi;
|
||||||
|
const GColorSet* pcol;
|
||||||
|
|
||||||
fheight = gdispGetFontMetric(gwinGetDefaultFont(), fontHeight);
|
fheight = gdispGetFontMetric(gwinGetDefaultFont(), fontHeight);
|
||||||
|
|
||||||
gdispDrawBox(gw->g.x, gw->g.y, gw->g.width, gw->g.height, Black);
|
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)
|
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
|
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
|
#undef gcw
|
||||||
|
@ -101,9 +103,9 @@ static void gwinListDefaultDraw(GWidgetObject* gw, void* param) {
|
||||||
(void) x;
|
(void) x;
|
||||||
|
|
||||||
uint16_t i, item_id, item_height;
|
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;
|
item_id = (y - gw->g.y) / item_height;
|
||||||
|
|
||||||
|
@ -115,6 +117,11 @@ static void gwinListDefaultDraw(GWidgetObject* gw, void* param) {
|
||||||
}
|
}
|
||||||
|
|
||||||
_gwidgetRedraw((GHandle)gw);
|
_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);
|
sendListEvent(gw, item_id);
|
||||||
|
|
||||||
#undef gcw
|
#undef gcw
|
||||||
|
@ -123,10 +130,11 @@ static void gwinListDefaultDraw(GWidgetObject* gw, void* param) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void _destroy(GHandle gh) {
|
static void _destroy(GHandle gh) {
|
||||||
const gfxQueueASyncItem* qi;
|
gfxQueueASyncItem* qi;
|
||||||
|
|
||||||
while((qi = gfxQueueASyncGet(&((GListObject *)gh)->list_head)))
|
while((qi = gfxQueueASyncGet(&((GListObject *)gh)->list_head)))
|
||||||
gfxFree((void *)qi);
|
gfxFree((void *)qi);
|
||||||
|
|
||||||
_gwidgetDestroy(gh);
|
_gwidgetDestroy(gh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,7 +142,7 @@ static const gwidgetVMT listVMT = {
|
||||||
{
|
{
|
||||||
"List", // The class name
|
"List", // The class name
|
||||||
sizeof(GListObject), // The object size
|
sizeof(GListObject), // The object size
|
||||||
_destroy, // The destroy routine
|
_destroy, // The destroy routine
|
||||||
_gwidgetRedraw, // The redraw routine
|
_gwidgetRedraw, // The redraw routine
|
||||||
0, // The after-clear 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
|
// increment the total amount of entries in the list widget
|
||||||
widget(gh)->cnt++;
|
widget(gh)->cnt++;
|
||||||
|
|
||||||
|
// return the position in the list (-1 because we start with index 0)
|
||||||
return widget(gh)->cnt-1;
|
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) {
|
int gwinListGetSelected(GHandle gh) {
|
||||||
const gfxQueueASyncItem *qi;
|
gfxQueueASyncItem *qi;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
// is it a valid handle?
|
||||||
if (gh->vmt != (gwinVMT *)&listVMT)
|
if (gh->vmt != (gwinVMT *)&listVMT)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -221,6 +274,110 @@ int gwinListGetSelected(GHandle gh) {
|
||||||
return -1;
|
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
|
#endif // GFX_USE_GWIN && GWIN_NEED_LIST
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue