Add gwinListItemSetText()

release/v2.9
inmarket 2017-01-09 11:40:48 +10:00
parent a3241b9f39
commit 0e00642bfc
3 changed files with 68 additions and 7 deletions

View File

@ -8,6 +8,7 @@ FIX: Fixed recursion bug in console history
FIX: Multithreading issue with slow window redraws and large images
FIX: Ensure valid thread stack sizes on platforms where it matters
FEATURE: Add support for a GFILE user provided file system
FEATURE: Add gwinListItemSetText() to replace text in a GWIN list item
*** Release 2.7 ***

View File

@ -348,7 +348,7 @@ void gwinListSetScroll(GHandle gh, scroll_t flag) {
}
}
int gwinListAddItem(GHandle gh, const char* item_name, bool_t useAlloc) {
int gwinListAddItem(GHandle gh, const char* text, bool_t useAlloc) {
ListItem *newItem;
// is it a valid handle?
@ -356,12 +356,12 @@ int gwinListAddItem(GHandle gh, const char* item_name, bool_t useAlloc) {
return -1;
if (useAlloc) {
size_t len = strlen(item_name)+1;
size_t len = strlen(text)+1;
if (!(newItem = gfxAlloc(sizeof(ListItem) + len)))
return -1;
memcpy((char *)(newItem+1), item_name, len);
item_name = (const char *)(newItem+1);
memcpy((char *)(newItem+1), text, len);
text = (const char *)(newItem+1);
} else {
if (!(newItem = gfxAlloc(sizeof(ListItem))))
return -1;
@ -370,7 +370,7 @@ int gwinListAddItem(GHandle gh, const char* item_name, bool_t useAlloc) {
// the item is not selected when added
newItem->flags = 0;
newItem->param = 0;
newItem->text = item_name;
newItem->text = text;
#if GWIN_NEED_LIST_IMAGES
newItem->pimg = 0;
#endif
@ -391,6 +391,54 @@ int gwinListAddItem(GHandle gh, const char* item_name, bool_t useAlloc) {
return gh2obj->cnt-1;
}
void gwinListItemSetText(GHandle gh, int item, const char* text, bool_t useAlloc) {
const gfxQueueASyncItem *qi;
int i;
ListItem *newItem;
// is it a valid handle?
if (gh->vmt != (gwinVMT *)&listVMT)
return;
// watch out for an invalid item
if (item < 0 || item > (gh2obj->cnt) - 1)
return;
for(qi = gfxQueueASyncPeek(&gh2obj->list_head), i = 0; qi; qi = gfxQueueASyncNext(qi), i++) {
if (i == item) {
// create the new object
if (useAlloc) {
size_t len = strlen(text)+1;
if (!(newItem = gfxAlloc(sizeof(ListItem) + len)))
return;
memcpy((char *)(newItem+1), text, len);
text = (const char *)(newItem+1);
} else {
if (!(newItem = gfxAlloc(sizeof(ListItem))))
return;
}
// copy the info from the existing object
newItem->flags = qi2li->flags;
newItem->param = qi2li->param;
newItem->text = text;
#if GWIN_NEED_LIST_IMAGES
newItem->pimg = qi2li->pimg;
#endif
// add the new item to the list and remove the old item
gfxQueueASyncInsert(&gh2obj->list_head, &newItem->q_item, &qi2li->q_item);
gfxQueueASyncRemove(&gh2obj->list_head, &qi2li->q_item);
gfxFree(qi2li);
_gwinUpdate(gh);
break;
}
}
}
const char* gwinListItemGetText(GHandle gh, int item) {
const gfxQueueASyncItem* qi;
int i;

View File

@ -169,14 +169,26 @@ void gwinListSetScroll(GHandle gh, scroll_t flag);
* reordered.
*
* @param[in] gh The widget handle (must be a list handle)
* @param[in] item The string which shall be displayed in the list afterwards
* @param[in] text The string which shall be displayed in the list afterwards
* @param[in] useAlloc If set to TRUE, the string will be dynamically allocated. A static buffer must be passed otherwise
*
* @return The current ID of the item. The ID might change if you remove items from the middle of the list
*
* @api
*/
int gwinListAddItem(GHandle gh, const char* item, bool_t useAlloc);
int gwinListAddItem(GHandle gh, const char* text, bool_t useAlloc);
/**
* @brief Set the custom parameter of an item with a given ID
*
* @param[in] gh The widget handle (must be a list handle)
* @param[in] item The item ID
* @param[in] text The text to replace the existing text
* @param[in] useAlloc If set to TRUE, the string will be dynamically allocated. A static buffer must be passed otherwise
*
* @api
*/
void gwinListItemSetText(GHandle gh, int item, const char* text, bool_t useAlloc);
/**
* @brief Get the name behind an item with a given ID