List updates and add list demo - still work in progress
This commit is contained in:
parent
1fbbc4d52b
commit
984e14efb7
150
demos/modules/gwin/list/gfxconf.h
Normal file
150
demos/modules/gwin/list/gfxconf.h
Normal 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 */
|
63
demos/modules/gwin/list/main.c
Normal file
63
demos/modules/gwin/list/main.c
Normal 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;
|
||||
}
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user