B15F Board 15 Famulus Edition

view_promt.cpp
1 #include "view_promt.h"
2
3 void ViewPromt::draw()
4 {
5 curs_set(1); // show cursor
6
7 int li = text_offset_y;
8 int ci = 0;
9 for(std::string line : str_split(message + input, "\n"))
10 {
11 mvwprintw(win, ++li, text_offset_x, "%s", line.c_str());
12 ci = line.length() + text_offset_x;
13 }
14
15 button_offset_x = (width - label_cancel.length() - sep.length() - label_confirm.length()) / 2;
16 button_offset_y = height - text_offset_y;
17
18 if(selection == 0)
19 {
20 wattron(win, A_REVERSE);
21 mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
22 wattroff(win, A_REVERSE);
23 mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
24 mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
25 }
26 else
27 {
28 mvwprintw(win, button_offset_y, button_offset_x, "%s", label_cancel.c_str());
29 mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length(), "%s", sep.c_str());
30 wattron(win, A_REVERSE);
31 mvwprintw(win, button_offset_y, button_offset_x + label_cancel.length() + sep.length(), "%s", label_confirm.c_str());
32 wattroff(win, A_REVERSE);
33 }
34 wmove(win, li, ci);
35 }
36
37 void ViewPromt::setMessage(std::string message)
38 {
39 this->message = message;
40 }
41
42 void ViewPromt::setConfirm(std::string name, std::function<void(int)> call)
43 {
44 label_confirm = name;
45 call_confirm = call;
46 }
47
48 void ViewPromt::setCancel(std::string name, bool cancelable)
49 {
50 label_cancel = name;
51 this->cancelable = cancelable;
52 }
53
54 std::string ViewPromt::getInput()
55 {
56 return input;
57 }
58
59 std::function<void(int)> ViewPromt::keypress(int& key)
60 {
61 std::function<void(int)> ret = nullptr;
62 switch(key)
63 {
64 case KEY_BACKSPACE:
65 if(input.length())
66 input.pop_back();
67 break;
68 case '\t':
69 case KEY_LEFT:
70 case KEY_RIGHT:
71 selection = (selection + 1 ) % 2;
72 break;
73 case KEY_MOUSE:
74 {
75 // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml
76 MEVENT event;
77 bool hit = false;
78 if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED))
79 {
80 size_t column_start = start_x + button_offset_x;
81 size_t row_start = start_y + button_offset_y;
82 size_t mouse_x = event.x, mouse_y = event.y;
83 if(mouse_y == row_start)
84 {
85 if(cancelable && mouse_x >= column_start && mouse_x < column_start + label_cancel.length())
86 {
87 if(selection == 0 || event.bstate & BUTTON1_DOUBLE_CLICKED)
88 hit = true;
89 selection = 0;
90 }
91 if(mouse_x >= column_start + label_cancel.length() + sep.length() && mouse_x < column_start + label_cancel.length() + sep.length() + label_confirm.length())
92 {
93 if(selection == 1 || event.bstate & BUTTON1_DOUBLE_CLICKED)
94 hit = true;
95 selection = 1;
96 }
97 }
98 }
99 if(!hit)
100 break;
101
102 // fall through to next case
103 [[fallthrough]];
104 }
105 case KEY_ENT:
106 if(selection == 0) // exit
107 key = -1; // do return from view
108 else
109 ret = call_confirm;
110 break;
111 default:
112 break;
113 }
114
115 if(key >= ' ' && key <= '~')
116 input += (char) key;
117
118 if(key != KEY_ENT)
119 repaint();
120 return ret;
121 }