List updates and add list demo - still work in progress

ugfx_release_2.6
inmarket 2013-07-27 22:26:16 +10:00
parent 1fbbc4d52b
commit 984e14efb7
3 changed files with 259 additions and 44 deletions

View File

@ -0,0 +1,150 @@
/**
* This file has a different license to the rest of the GFX system.
* You can copy, modify and distribute this file as you see fit.
* You do not need to publish your source modifications to this file.
* The only thing you are not permitted to do is to relicense it
* under a different license.
*/
/**
* Copy this file into your project directory and rename it as gfxconf.h
* Edit your copy to turn on the GFX features you want to use.
*/
#ifndef _GFXCONF_H
#define _GFXCONF_H
/* The operating system to use - one of these must be defined */
//#define GFX_USE_OS_CHIBIOS FALSE
//#define GFX_USE_OS_WIN32 FALSE
//#define GFX_USE_OS_LINUX TRUE
//#define GFX_USE_OS_OSX FALSE
/* GFX subsystems to turn on */
#define GFX_USE_GDISP TRUE
#define GFX_USE_TDISP FALSE
#define GFX_USE_GWIN TRUE
#define GFX_USE_GEVENT TRUE
#define GFX_USE_GTIMER TRUE
#define GFX_USE_GQUEUE TRUE
#define GFX_USE_GINPUT TRUE
#define GFX_USE_GADC FALSE
#define GFX_USE_GAUDIN FALSE
#define GFX_USE_GAUDOUT FALSE
#define GFX_USE_GMISC FALSE
/* Features for the GDISP subsystem */
#define GDISP_NEED_VALIDATION TRUE
#define GDISP_NEED_CLIP TRUE
#define GDISP_NEED_TEXT TRUE
#define GDISP_NEED_CIRCLE TRUE
#define GDISP_NEED_ELLIPSE TRUE
#define GDISP_NEED_ARC FALSE
#define GDISP_NEED_CONVEX_POLYGON FALSE
#define GDISP_NEED_SCROLL FALSE
#define GDISP_NEED_PIXELREAD FALSE
#define GDISP_NEED_CONTROL FALSE
#define GDISP_NEED_QUERY FALSE
#define GDISP_NEED_IMAGE FALSE
#define GDISP_NEED_MULTITHREAD FALSE
#define GDISP_NEED_ASYNC FALSE
#define GDISP_NEED_MSGAPI FALSE
/* GDISP - builtin fonts */
#define GDISP_INCLUDE_FONT_SMALL FALSE
#define GDISP_INCLUDE_FONT_LARGER FALSE
#define GDISP_INCLUDE_FONT_UI1 FALSE
#define GDISP_INCLUDE_FONT_UI2 TRUE
#define GDISP_INCLUDE_FONT_LARGENUMBERS FALSE
/* GDISP image decoders */
#define GDISP_NEED_IMAGE_NATIVE FALSE
#define GDISP_NEED_IMAGE_GIF FALSE
#define GDISP_NEED_IMAGE_BMP FALSE
#define GDISP_NEED_IMAGE_JPG FALSE
#define GDISP_NEED_IMAGE_PNG FALSE
#define GDISP_NEED_IMAGE_ACCOUNTING FALSE
/* Optional image support that can be turned off */
/*
#define GDISP_NEED_IMAGE_BMP_1 TRUE
#define GDISP_NEED_IMAGE_BMP_4 TRUE
#define GDISP_NEED_IMAGE_BMP_4_RLE TRUE
#define GDISP_NEED_IMAGE_BMP_8 TRUE
#define GDISP_NEED_IMAGE_BMP_8_RLE TRUE
#define GDISP_NEED_IMAGE_BMP_16 TRUE
#define GDISP_NEED_IMAGE_BMP_24 TRUE
#define GDISP_NEED_IMAGE_BMP_32 TRUE
*/
/* Features for the TDISP subsystem. */
#define TDISP_NEED_MULTITHREAD FALSE
/* Features for the GWIN subsystem. */
#define GWIN_NEED_WINDOWMANAGER TRUE
#define GWIN_NEED_CONSOLE FALSE
#define GWIN_NEED_GRAPH FALSE
#define GWIN_NEED_WIDGET TRUE
#define GWIN_NEED_BUTTON FALSE
#define GWIN_NEED_SLIDER FALSE
#define GWIN_NEED_CHECKBOX FALSE
#define GWIN_NEED_IMAGE FALSE
#define GWIN_NEED_RADIO FALSE
#define GWIN_NEED_LIST TRUE
/* Features for the GEVENT subsystem. */
#define GEVENT_ASSERT_NO_RESOURCE FALSE
/* Features for the GTIMER subsystem. */
/* NONE */
/* Features for the GQUEUE subsystem. */
#define GQUEUE_NEED_ASYNC TRUE
#define GQUEUE_NEED_GSYNC FALSE
#define GQUEUE_NEED_FSYNC FALSE
/* Features for the GINPUT subsystem. */
#define GINPUT_NEED_MOUSE TRUE
#define GINPUT_NEED_KEYBOARD FALSE
#define GINPUT_NEED_TOGGLE FALSE
#define GINPUT_NEED_DIAL FALSE
/* Features for the GADC subsystem. */
/* NONE */
/* Features for the GAUDIN subsystem. */
/* NONE */
/* Features for the GAUDOUT subsystem. */
/* NONE */
/* Features for the GMISC subsystem. */
#define GMISC_NEED_ARRAYOPS FALSE
#define GMISC_NEED_FASTTRIG FALSE
#define GMISC_NEED_FIXEDTRIG FALSE
/* Optional Parameters for various subsystems */
/*
#define GDISP_MAX_FONT_HEIGHT 16
#define GEVENT_MAXIMUM_SIZE 32
#define GEVENT_MAX_SOURCE_LISTENERS 32
#define GTIMER_THREAD_WORKAREA_SIZE 512
#define GADC_MAX_LOWSPEED_DEVICES 4
#define GWIN_BUTTON_LAZY_RELEASE FALSE
#define GWIN_CONSOLE_USE_BASESTREAM FALSE
#define GWIN_CONSOLE_USE_FLOAT FALSE
#define GWIN_NEED_IMAGE_ANIMATION FALSE
*/
/* Optional Low Level Driver Definitions */
/*
#define GDISP_USE_CUSTOM_BOARD FALSE
#define GDISP_SCREEN_WIDTH 320
#define GDISP_SCREEN_HEIGHT 240
#define GDISP_USE_FSMC
#define GDISP_USE_GPIO
#define TDISP_COLUMNS 16
#define TDISP_ROWS 2
*/
#endif /* _GFXCONF_H */

View File

@ -0,0 +1,63 @@
#include "gfx.h"
static GListener gl;
static GHandle ghList1;
static void createWidgets(void) {
GWidgetInit wi;
// Apply some default values for GWIN
wi.customDraw = 0;
wi.customParam = 0;
wi.customStyle = 0;
wi.g.show = TRUE;
// Apply the list parameters
wi.g.width = 300;
wi.g.height = 200;
wi.g.y = 10;
wi.g.x = 10;
wi.text = "List Name";
// Create the actual list
ghList1 = gwinListCreate(NULL, &wi);
}
int main(void) {
GEvent* pe;
// Initialize the display
gfxInit();
// Set the widget defaults
gwinSetDefaultFont(gdispOpenFont("UI2"));
gwinSetDefaultStyle(&WhiteWidgetStyle, FALSE);
gdispClear(White);
// Attach the mouse input
gwinAttachMouse(0);
// create the widget
createWidgets();
// We want to listen for widget events
geventListenerInit(&gl);
gwinAttachListener(&gl);
// Add some items to the list widget
gwinListAddItem(ghList1, "Item 0", TRUE);
gwinListAddItem(ghList1, "Item 1", TRUE);
gwinListAddItem(ghList1, "Item 2", TRUE);
gwinListAddItem(ghList1, "Item 3", TRUE);
gwinListAddItem(ghList1, "Item 4", TRUE);
gwinRedraw(ghList1);
while(1) {
// Get an Event
pe = geventEventWait(&gl, TIME_INFINITE);
}
return 0;
}

View File

@ -50,19 +50,7 @@ typedef struct ListItem {
#endif #endif
} ListItem; } ListItem;
static int _getSelected(GWidgetObject *gw) { static void sendListEvent(GWidgetObject *gw, int item) {
gfxQueueASyncItem* qi;
uint16_t i;
for(qi = gfxQueueASyncPeek(&((GListObject*)gw)->list_head), i = 0; qi; qi = gfxQueueASyncNext(qi), i++) {
if (((ListItem*)qi)->flags & GLIST_FLG_SELECTED)
return i;
}
return -1;
}
static void sendListEvent(GWidgetObject *gw) {
GSourceListener* psl; GSourceListener* psl;
GEvent* pe; GEvent* pe;
#define pse ((GEventGWinList *)pe) #define pse ((GEventGWinList *)pe)
@ -72,11 +60,11 @@ static void sendListEvent(GWidgetObject *gw) {
while ((psl = geventGetSourceListener(GWIDGET_SOURCE, psl))) { while ((psl = geventGetSourceListener(GWIDGET_SOURCE, psl))) {
if (!(pe = geventGetEventBuffer(psl))) if (!(pe = geventGetEventBuffer(psl)))
continue continue;
pse->type = GEVENT_GWIN_SLIDER; pse->type = GEVENT_GWIN_LIST;
pse->list = (GHandle)gw; pse->list = (GHandle)gw;
pse->item = _getSelected(gw); pse->item = item;
geventSendEvent(psl); geventSendEvent(psl);
} }
@ -89,7 +77,7 @@ static void gwinListDefaultDraw(GWidgetObject* gw, void* param) {
(void)param; (void)param;
uint16_t i, fheight; uint16_t i, fheight;
gfxQueueASyncItem* qi; const gfxQueueASyncItem* qi;
fheight = gdispGetFontMetric(gwinGetDefaultFont(), fontHeight); fheight = gdispGetFontMetric(gwinGetDefaultFont(), fontHeight);
@ -109,9 +97,11 @@ static void gwinListDefaultDraw(GWidgetObject* gw, void* param) {
// A mouse down has occured over the list area // A mouse down has occured over the list area
static void MouseDown(GWidgetObject* gw, coord_t x, coord_t y) { static void MouseDown(GWidgetObject* gw, coord_t x, coord_t y) {
#define gcw ((GListObject *)gw) #define gcw ((GListObject *)gw)
#define li ((ListItem *)qi)
(void) x;
uint16_t i, item_id, item_height; uint16_t i, item_id, item_height;
gfxQueueASyncItem* qi; const gfxQueueASyncItem* qi;
item_height = gdispGetFontMetric(gwinGetDefaultFont(), fontHeight) + 2; item_height = gdispGetFontMetric(gwinGetDefaultFont(), fontHeight) + 2;
@ -119,23 +109,32 @@ static void gwinListDefaultDraw(GWidgetObject* gw, void* param) {
for(qi = gfxQueueASyncPeek(&gcw->list_head), i = 0; qi; qi = gfxQueueASyncNext(qi), i++) { for(qi = gfxQueueASyncPeek(&gcw->list_head), i = 0; qi; qi = gfxQueueASyncNext(qi), i++) {
if (item_id == i) if (item_id == i)
((ListItem*)qi)->flags |= GLIST_FLG_SELECTED; li->flags |= GLIST_FLG_SELECTED;
else else
((ListItem*)qi)->flags &=~ GLIST_FLG_SELECTED; li->flags &=~ GLIST_FLG_SELECTED;
} }
_gwidgetRedraw((GHandle)gw); _gwidgetRedraw((GHandle)gw);
sendListEvent(gw); sendListEvent(gw, item_id);
#undef gcw #undef gcw
#undef li
} }
#endif #endif
static void _destroy(GHandle gh) {
const gfxQueueASyncItem* qi;
while((qi = gfxQueueASyncGet(&((GListObject *)gh)->list_head)))
gfxFree((void *)qi);
_gwidgetDestroy(gh);
}
static const gwidgetVMT listVMT = { static const gwidgetVMT listVMT = {
{ {
"List", // The class name "List", // The class name
sizeof(GListObject), // The object size sizeof(GListObject), // The object size
_gwidgetDestroy, // 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
}, },
@ -180,43 +179,46 @@ GHandle gwinListCreate(GListObject* widget, GWidgetInit* pInit) {
} }
int gwinListAddItem(GHandle gh, const char* item_name, bool_t useAlloc) { int gwinListAddItem(GHandle gh, const char* item_name, bool_t useAlloc) {
ListItem* newItem; size_t sz;
ListItem *newItem;
sz = useAlloc ? sizeof(ListItem)+strlen(item_name)+1 : sizeof(ListItem);
if (!(newItem = (ListItem *)gfxAlloc(sz)))
return -1;
if (useAlloc) { if (useAlloc) {
newItem = gfxAlloc(sizeof(newItem) + strlen(item_name) + 1); strcpy((char *)(newItem+1), item_name);
item_name = (const char *)(newItem+1);
// allocate string
newItem->text = gfxAlloc(strlen(item_name) + 1);
if (newItem->text == NULL)
return -1;
// assign text
newItem->text = item_name;
} else {
newItem = gfxAlloc(sizeof(newItem));
if (newItem == NULL)
return -1;
} }
// the item is not selected when added // the item is not selected when added
newItem->flags &=~ GLIST_FLG_SELECTED; newItem->flags = 0;
newItem->param = 0;
newItem->text = item_name;
// add the new item to the list // add the new item to the list
gfxQueueASyncPut(&(widget(gh)->list_head), &newItem->q_item); gfxQueueASyncPut(&widget(gh)->list_head, &newItem->q_item);
// 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 widget(gh)->cnt-1;
} }
int gwinListGetSelected(GHandle gh) { int gwinListGetSelected(GHandle gh) {
gfxQueueASyncItem* qi; const gfxQueueASyncItem *qi;
uint16_t i; int i;
//for(qi = gfxQueueASyncPeek(&gcw->list_head), i = 0; qi; qi = gfxQueueASyncNext(qi), i++) { if (gh->vmt != (gwinVMT *)&listVMT)
return -1;
for(qi = gfxQueueASyncPeek(&widget(gh)->list_head), i = 0; qi; qi = gfxQueueASyncNext(qi), i++) {
if (((ListItem*)qi)->flags & GLIST_FLG_SELECTED)
return i;
}
return -1;
} }
#endif // GFX_USE_GWIN && GWIN_NEED_LIST #endif // GFX_USE_GWIN && GWIN_NEED_LIST