Update item text on edit
[petitboot] / ui / ncurses / nc-menu.h
1 /*
2  *  Copyright (C) 2009 Sony Computer Entertainment Inc.
3  *  Copyright 2009 Sony Corp.
4  *
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; version 2 of the License.
8  *
9  *  This program is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU General Public License for more details.
13  *
14  *  You should have received a copy of the GNU General Public License
15  *  along with this program; if not, write to the Free Software
16  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 #if !defined(_PB_NC_MENU_H)
20 #define _PB_NC_MENU_H
21
22 #include <assert.h>
23 #include <menu.h>
24
25 #include "log/log.h"
26 #include "pb-protocol/pb-protocol.h"
27 #include "nc-scr.h"
28
29 struct pmenu;
30
31 /**
32  * struct pmenu_item - Hold the state of a single menu item.
33  * @i_sig: Signature for callback type checking, should be pmenu_item_sig.
34  * @nci: The ncurses menu item instance for this item.
35  */
36
37 struct pmenu_item {
38         enum pb_nc_sig i_sig;
39         ITEM *nci;
40         struct pmenu *pmenu;
41         void *data;
42         int (*on_edit)(struct pmenu_item *item);
43         int (*on_execute)(struct pmenu_item *item);
44 };
45
46 struct pmenu_item *pmenu_item_alloc(struct pmenu *menu);
47 struct pmenu_item *pmenu_item_setup(struct pmenu *menu, struct pmenu_item *i,
48         unsigned int index, const char *name);
49 int pmenu_item_replace(struct pmenu_item *i, const char *name);
50 void pmenu_item_delete(struct pmenu_item *item);
51
52 static inline struct pmenu_item *pmenu_item_from_arg(void *arg)
53 {
54         struct pmenu_item *item = (struct pmenu_item *)arg;
55
56         assert(item->i_sig == pb_item_sig);
57         return item;
58 }
59
60 static inline struct pmenu_item *pmenu_item_init(struct pmenu *menu,
61         unsigned int index, const char *name)
62 {
63         return pmenu_item_setup(menu, pmenu_item_alloc(menu), index, name);
64 }
65
66 /**
67  * struct pmenu - Data structure defining complete menu.
68  * @insert_pt: Index in nc item array.
69  * @ncm: The ncurses menu instance for this menu.
70  */
71
72 struct pmenu {
73         struct nc_scr scr;
74         MENU *ncm;
75         ITEM **items;
76         unsigned int item_count;
77         unsigned int insert_pt;
78         int (*hot_key)(struct pmenu *menu, struct pmenu_item *item, int c);
79         void (*on_exit)(struct pmenu *menu);
80         void (*on_open)(struct pmenu *menu);
81 };
82
83 struct pmenu *pmenu_init(void *ui_ctx, unsigned int item_count,
84         void (*on_exit)(struct pmenu *));
85 int pmenu_setup(struct pmenu *menu);
86 void pmenu_delete(struct pmenu *menu);
87 unsigned int pmenu_grow(struct pmenu *menu, unsigned int count);
88 int pmenu_remove(struct pmenu *menu, struct pmenu_item *item);
89 struct pmenu_item *pmenu_find_selected(struct pmenu *menu);
90
91 /* convenience routines */
92
93 int pmenu_exit_cb(struct pmenu_item *item);
94
95 static inline struct pmenu *pmenu_from_scr(struct nc_scr *scr)
96 {
97         struct pmenu *pmenu;
98
99         assert(scr->sig == pb_pmenu_sig);
100         pmenu = (struct pmenu *)((char *)scr
101                 - (size_t)&((struct pmenu *)0)->scr);
102         assert(pmenu->scr.sig == pb_pmenu_sig);
103
104         return pmenu;
105 }
106
107 /* debug routines */
108
109 #if defined(DEBUG)
110 enum {do_debug = 1};
111 #else
112 enum {do_debug = 0};
113 #endif
114
115 static inline void pmenu_dump_item(const ITEM *item)
116 {
117         if (do_debug)
118                 pb_log("%p %s\n", item, (item ? item->name.str : "(null)"));
119 }
120
121 static inline void pmenu_dump_items(ITEM *const *items, unsigned int count)
122 {
123         unsigned int i;
124
125         if (do_debug)
126                 for (i = 0; i < count; i++)
127                         pb_log("%u: %p %s\n", i, items[i],
128                                 (items[i] ? items[i]->name.str : "(null)"));
129 }
130
131 #endif