aboutsummaryrefslogtreecommitdiffstats
path: root/src/gwin/gwin_list.c
diff options
context:
space:
mode:
authorinmarket <andrewh@inmarket.com.au>2015-04-30 11:32:10 +1000
committerinmarket <andrewh@inmarket.com.au>2015-04-30 11:32:10 +1000
commit0501f24f47adcd6439b469a6dc5244961b291f9c (patch)
tree12f41ca892b428b0c8871cb73b51cd51407475e0 /src/gwin/gwin_list.c
parent83c0eb35261704499bad756049c158133f7486eb (diff)
downloaduGFX-0501f24f47adcd6439b469a6dc5244961b291f9c.tar.gz
uGFX-0501f24f47adcd6439b469a6dc5244961b291f9c.tar.bz2
uGFX-0501f24f47adcd6439b469a6dc5244961b291f9c.zip
Add the ability to change a gwin list selection via the api
Add the ability to scroll a particular item into the current view.
Diffstat (limited to 'src/gwin/gwin_list.c')
-rw-r--r--src/gwin/gwin_list.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/gwin/gwin_list.c b/src/gwin/gwin_list.c
index b5bb531d..2e3cb8e5 100644
--- a/src/gwin/gwin_list.c
+++ b/src/gwin/gwin_list.c
@@ -569,6 +569,65 @@ const char* gwinListGetSelectedText(GHandle gh) {
return gwinListItemGetText(gh, gwinListGetSelected(gh));
}
+void gwinListSetSelected(GHandle gh, int item, bool_t doSelect) {
+ const gfxQueueASyncItem * qi;
+ int i;
+
+ // is it a valid handle?
+ if (gh->vmt != (gwinVMT *)&listVMT)
+ return;
+
+ // watch out for an invalid item
+ if (item < 0 || item >= gh2obj->cnt)
+ return;
+
+ // If not a multiselect mode - clear previous selected item
+ if (doSelect && !(gh->flags & GLIST_FLG_MULTISELECT)) {
+ for(qi = gfxQueueASyncPeek(&gh2obj->list_head); qi; qi = gfxQueueASyncNext(qi)) {
+ if (qi2li->flags & GLIST_FLG_SELECTED) {
+ qi2li->flags &= ~GLIST_FLG_SELECTED;
+ break;
+ }
+ }
+ }
+
+ // Find item and set selected or not
+ for(qi = gfxQueueASyncPeek(&gh2obj->list_head), i = 0; qi; qi = gfxQueueASyncNext(qi), i++) {
+ if (i == item) {
+ if (doSelect)
+ qi2li->flags |= GLIST_FLG_SELECTED;
+ else
+ qi2li->flags &= ~GLIST_FLG_SELECTED;
+ break;
+ }
+ }
+ _gwinUpdate(gh);
+}
+
+void gwinListViewItem(GHandle gh, int item) {
+ coord_t iheight;
+
+ // is it a valid handle?
+ if (gh->vmt != (gwinVMT *)&listVMT)
+ return;
+
+ // watch out for an invalid item
+ if (item < 0 || item >= gh2obj->cnt)
+ return;
+
+ // Work out a possible new top for the list
+ iheight = gdispGetFontMetric(gh->font, fontHeight) + VERTICAL_PADDING;
+ gh2obj->top = iheight * item;
+
+ // Adjust the list
+ if (gh2obj->top > gh2obj->cnt * iheight - gh->height-2)
+ gh2obj->top = gh2obj->cnt * iheight - gh->height-2;
+ if (gh2obj->top < 0)
+ gh2obj->top = 0;
+
+ _gwinUpdate(gh);
+}
+
#if GWIN_NEED_LIST_IMAGES
void gwinListItemSetImage(GHandle gh, int item, gdispImage *pimg) {
const gfxQueueASyncItem * qi;