1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
#ifndef MENU_CXX
#define MENU_CXX
#include "menu.h"
#include "s_sock.h"
using namespace std;
menu::menu( int i_startx, int i_starty, int i_width, int i_height, char *c_header, char **choices, int i_numchoices, const chtype ch )
{
this->i_startx = i_startx;
this->i_starty = i_starty;
this->i_height = i_height;
this->i_width = i_width;
this->c_header = c_header;
this->choices = choices;
this->i_numchoices = i_numchoices;
initialize( ch );
}
menu::~menu()
{
/*
wborder(win, ' ', ' ', ' ',' ',' ',' ',' ',' ');
wrefresh(win);
delwin(win);
*/
}
void
menu::initialize( const chtype ch )
{
this->i_highlight = 1;
this->i_choice = 0;
win = newwin( i_height, i_width, i_starty, i_startx );
wbkgd(win, ch);
keypad(win, TRUE);
}
void
menu::display()
{
int x, y, i;
x = 2;
y = 2;
box( win, 0, 0 );
mvwprintw( win, y++, x, "%s", c_header );
for( i=0; i<i_numchoices; i++ )
{
y++;
if( i_highlight == i + 1 ) /* High light the present choice */
{
wattron( win, A_REVERSE);
mvwprintw( win, y, x, "%d. %s", i, choices[i]);
wattroff( win, A_REVERSE);
}
else
{
mvwprintw( win, y, x, "%d. %s", i, choices[i]);
}
}
wrefresh( win );
}
void
menu::start( void (*swich_case_menu_action)(int) )
{
refresh();
bool b_flag = 1;
while( b_flag )
{
display();
c = wgetch( win );
switch(c)
{
case KEY_UP:
if( i_highlight == 1 )
i_highlight = i_numchoices;
else
--i_highlight;
break;
case KEY_DOWN:
if( i_highlight == i_numchoices )
i_highlight = 1;
else
++i_highlight;
break;
case 10:
i_choice = i_highlight;
break;
default:
mvprintw( 1, 70, "%3d %c", c, c);
refresh();
break;
}
// Menu action.
( *swich_case_menu_action ) ( i_choice );
}
}
#endif
|