List updates and add list demo - still work in progress

This commit is contained in:
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
} ListItem;
static int _getSelected(GWidgetObject *gw) {
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) {
static void sendListEvent(GWidgetObject *gw, int item) {
GSourceListener* psl;
GEvent* pe;
#define pse ((GEventGWinList *)pe)
@ -72,11 +60,11 @@ static void sendListEvent(GWidgetObject *gw) {
while ((psl = geventGetSourceListener(GWIDGET_SOURCE, psl))) {
if (!(pe = geventGetEventBuffer(psl)))
continue
continue;
pse->type = GEVENT_GWIN_SLIDER;
pse->type = GEVENT_GWIN_LIST;
pse->list = (GHandle)gw;
pse->item = _getSelected(gw);
pse->item = item;
geventSendEvent(psl);
}
@ -89,7 +77,7 @@ static void gwinListDefaultDraw(GWidgetObject* gw, void* param) {
(void)param;
uint16_t i, fheight;
gfxQueueASyncItem* qi;
const gfxQueueASyncItem* qi;
fheight = gdispGetFontMetric(gwinGetDefaultFont(), fontHeight);
@ -109,9 +97,11 @@ static void gwinListDefaultDraw(GWidgetObject* gw, void* param) {
// A mouse down has occured over the list area
static void MouseDown(GWidgetObject* gw, coord_t x, coord_t y) {
#define gcw ((GListObject *)gw)
#define li ((ListItem *)qi)
(void) x;
uint16_t i, item_id, item_height;
gfxQueueASyncItem* qi;
const gfxQueueASyncItem* qi;
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++) {
if (item_id == i)
((ListItem*)qi)->flags |= GLIST_FLG_SELECTED;
li->flags |= GLIST_FLG_SELECTED;
else
((ListItem*)qi)->flags &=~ GLIST_FLG_SELECTED;
li->flags &=~ GLIST_FLG_SELECTED;
}
_gwidgetRedraw((GHandle)gw);
sendListEvent(gw);
sendListEvent(gw, item_id);
#undef gcw
#undef li
}
#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 = {
{
"List", // The class name
sizeof(GListObject), // The object size
_gwidgetDestroy, // The destroy routine
_destroy, // The destroy routine
_gwidgetRedraw, // The redraw 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) {
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) {
newItem = gfxAlloc(sizeof(newItem) + strlen(item_name) + 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;
strcpy((char *)(newItem+1), item_name);
item_name = (const char *)(newItem+1);
}
// 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
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
widget(gh)->cnt++;
return widget(gh)->cnt-1;
}
int gwinListGetSelected(GHandle gh) {
gfxQueueASyncItem* qi;
uint16_t i;
const gfxQueueASyncItem *qi;
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