aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorinmarket <andrewh@inmarket.com.au>2013-07-27 22:26:16 +1000
committerinmarket <andrewh@inmarket.com.au>2013-07-27 22:26:16 +1000
commit984e14efb7ad257577db85fcdbed6c60618c1175 (patch)
tree0176a5b0466f265e8aba21a8bcd2d45a3981bc68
parent1fbbc4d52bed0b8e4f3289bc008b3f0928a6b24f (diff)
downloaduGFX-984e14efb7ad257577db85fcdbed6c60618c1175.tar.gz
uGFX-984e14efb7ad257577db85fcdbed6c60618c1175.tar.bz2
uGFX-984e14efb7ad257577db85fcdbed6c60618c1175.zip
List updates and add list demo - still work in progress
-rw-r--r--demos/modules/gwin/list/gfxconf.h150
-rw-r--r--demos/modules/gwin/list/main.c63
-rw-r--r--src/gwin/list.c88
3 files changed, 258 insertions, 43 deletions
diff --git a/demos/modules/gwin/list/gfxconf.h b/demos/modules/gwin/list/gfxconf.h
new file mode 100644
index 00000000..895d7c49
--- /dev/null
+++ b/demos/modules/gwin/list/gfxconf.h
@@ -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 */
diff --git a/demos/modules/gwin/list/main.c b/demos/modules/gwin/list/main.c
new file mode 100644
index 00000000..35847be0
--- /dev/null
+++ b/demos/modules/gwin/list/main.c
@@ -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;
+}
diff --git a/src/gwin/list.c b/src/gwin/list.c
index cc7c40f4..11fd01cb 100644
--- a/src/gwin/list.c
+++ b/src/gwin/list.c
@@ -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;
- 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;
+ sz = useAlloc ? sizeof(ListItem)+strlen(item_name)+1 : sizeof(ListItem);
- } else {
- newItem = gfxAlloc(sizeof(newItem));
+ if (!(newItem = (ListItem *)gfxAlloc(sz)))
+ return -1;
- if (newItem == NULL)
- return -1;
+ if (useAlloc) {
+ 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