forked from JohnAnthony/TROG
-
Notifications
You must be signed in to change notification settings - Fork 0
/
scrollable_menu.cpp
126 lines (100 loc) · 2.67 KB
/
scrollable_menu.cpp
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
116
117
118
119
120
121
122
123
124
125
126
#include "scrollable_menu.hpp"
#include "gui.hpp"
#include <sstream>
#include <cstring>
#define DEFAULT_HEIGHT 6
ScrollableMenu::ScrollableMenu(std::string inTitle) {
this->sz.x = this->title.length() + 8;
this->sz.y = DEFAULT_HEIGHT;
this->window = GUI::NewCentredWindow(sz.x, sz.y);
this->SetTitle(inTitle);
this->max_size = 0;
}
void
ScrollableMenu::Reset(void) {
this->pointer = 0;
this->scroll_offset = 0;
this->Options.clear();
this->Resize(this->title.length() + 8, DEFAULT_HEIGHT);
}
void
ScrollableMenu::Resize(int x, int y) {
this->sz.x = x;
this->sz.y = y;
delwin(this->window);
this->window = GUI::NewCentredWindow(this->sz.x, this->sz.y);
}
void
ScrollableMenu::AddItem(std::string str) {
this->Options.push_back(str);
if (this->sz.x < (int) str.length() + 10)
sz.x = str.length() + 10;
if (this->sz.y < LINES && this->max_size == 0)
this->sz.y++;
else if (this->sz.y < this->max_size)
this->sz.y++;
this->Resize(this->sz.x, this->sz.y);
}
void
ScrollableMenu::Show(void) {
int i;
std::string str;
std::stringstream ss;
static char const * const empty_string = "* E M P T Y *";
box(this->window, 0, 0);
ss << ":: " << this->title << " ::";
str = ss.str();
mvwprintw(this->window, 0, (this->sz.x - str.length()) / 2, str.c_str());
if (this->Options.size() == 0) {
mvwprintw(this->window, 2, (this->sz.x - strlen(empty_string)) / 2, empty_string);
}
else {
i = 0;
for (std::list<std::string>::iterator it = this->Options.begin();
it != this->Options.end(); ++it, ++i) {
str = *it;
if (i == this->pointer - this->scroll_offset)
mvwprintw(this->window, 3+i, 2, "--> ");
else
mvwprintw(this->window, 3+i, 2, " ");
wprintw(this->window, str.c_str());
for (int e = str.length(); e < this->sz.x - 9; ++e)
waddch(this->window, ' ');
}
}
wrefresh(this->window);
refresh();
}
void
ScrollableMenu::PtrUp(void) {
this->pointer--;
if (pointer < 0)
pointer = 0;
this->Show();
}
void
ScrollableMenu::PtrDown(void) {
this->pointer++;
if (pointer >= (int) this->Options.size())
pointer = this->Options.size() - 1;
this->Show();
}
void
ScrollableMenu::PageUp(void) {
}
void
ScrollableMenu::PageDown(void) {
}
void
ScrollableMenu::SetTitle(std::string str) {
this->title = str;
}
int
ScrollableMenu::Selection(void) {
if (this->Options.size() == 0)
return -1;
return pointer;
}
ScrollableMenu::~ScrollableMenu(void) {
delwin(this->window);
}