}
struct pmenu_item *pmenu_item_setup(struct pmenu *menu, struct pmenu_item *i,
- unsigned int index, const char *name,
- const char *description)
+ unsigned int index, const char *name)
{
assert(i);
+ assert(name);
if (!i)
return NULL;
i->i_sig = pb_item_sig;
i->pmenu = menu;
- i->nci = new_item(name, description);
+ i->nci = new_item(name, NULL);
if (!i->nci) {
talloc_free(i);
return i;
}
+static int pmenu_item_get_index(const struct pmenu_item *item)
+{
+ unsigned int i;
+
+ for (i = 0; i < item->pmenu->item_count; i++)
+ if (item->pmenu->items[i] == item->nci)
+ return i;
+
+ pb_log("%s: not found: %p %s\n", __func__, item,
+ (item ? item->nci->name.str : "(null)"));
+ return -1;
+}
+
+/**
+ * pmenu_item_replace - Replace the menu item with a new one.
+ *
+ * Use this routine to change a menu item's text.
+ */
+
+int pmenu_item_replace(struct pmenu_item *i, const char *name)
+{
+ struct pmenu *menu;
+ ITEM *nci;
+ int index;
+
+ assert(name);
+ assert(i->nci);
+
+ menu = i->pmenu;
+ index = pmenu_item_get_index(i);
+
+ if (index < 0) {
+ assert(0 && "get_index failed");
+ return -1;
+ }
+
+ nci = new_item(name, NULL);
+
+ if (!nci) {
+ assert(0 && "new_item failed");
+ return -1;
+ }
+
+ set_item_userptr(nci, i);
+
+ menu->scr.unpost(&menu->scr);
+ set_menu_items(menu->ncm, NULL);
+
+ // FIXME: need to assure item name is a talloc string.
+ /* talloc_free((char *)item_name(i->nci)); */
+
+ free_item(i->nci);
+ menu->items[index] = nci;
+ i->nci = nci;
+
+ set_menu_items(menu->ncm, menu->items);
+ menu->scr.post(&menu->scr);
+
+ return 0;
+}
+
/**
* pmenu_move_cursor - Move the cursor.
* @req: An ncurses request or char to send to menu_driver().
if (c == ERR)
return;
- /* DBGS("%d (%o)\n", c, c); */
+ if (1) DBGS("%d (%o)\n", c, c);
if (menu->hot_key)
c = menu->hot_key(menu, item, c);
pmenu_move_cursor(menu, REQ_UP_ITEM);
break;
case KEY_DOWN:
- case '\t':
pmenu_move_cursor(menu, REQ_DOWN_ITEM);
break;
-
- case KEY_LEFT:
- case 'E':
case 'e':
if (item->on_edit)
item->on_edit(item);
break;
+ case 'o':
+ DBGS("on_open: %p\n", menu->on_open);
+ if (menu->on_open)
+ menu->on_open(menu);
+ break;
case '\n':
case '\r':
if (item->on_execute)
return tmp;
}
-static int pmenu_item_get_index(const struct pmenu_item *item)
-{
- unsigned int i;
-
- for (i = 0; i < item->pmenu->item_count; i++)
- if (item->pmenu->items[i] == item->nci)
- return i;
-
- pb_log("%s: not found: %p %s\n", __func__, item,
- (item ? item->nci->name.str : "(null)"));
- return -1;
-}
-
/**
* pmenu_remove - Remove an item from the item array.
*
if (index < 0)
return -1;
+ free_item(item->nci);
+ talloc_free(item);
+
/* Note that items array has a null terminator. */
menu->insert_pt--;
menu->scr.sig = pb_removed_sig;
for (i = item_count(menu->ncm); i; i--)
- free_item(menu->items[i]);
+ free_item(menu->items[i - 1]);
free_menu(menu->ncm);
delwin(menu->scr.sub_ncw);