|
@@ -5,73 +5,12 @@
|
5
|
5
|
* \author xythobuz
|
6
|
6
|
*/
|
7
|
7
|
|
8
|
|
-#include <cctype>
|
9
|
|
-#include <cstring>
|
10
|
|
-
|
11
|
8
|
#include "global.h"
|
12
|
9
|
#include "Console.h"
|
13
|
10
|
#include "Font.h"
|
14
|
|
-#include "OpenRaider.h"
|
15
|
|
-#include "utils/strings.h"
|
16
|
|
-#include "TombRaider.h"
|
17
|
11
|
#include "Window.h"
|
18
|
12
|
#include "Menu.h"
|
19
|
13
|
|
20
|
|
-Menu::Menu() {
|
21
|
|
- mVisible = false;
|
22
|
|
- mCursor = 0;
|
23
|
|
- mMin = 0;
|
24
|
|
- mapFolder = nullptr;
|
25
|
|
- hiddenState = false;
|
26
|
|
- dialogState = false;
|
27
|
|
-}
|
28
|
|
-
|
29
|
|
-Menu::~Menu() {
|
30
|
|
- delete mapFolder;
|
31
|
|
- mapFolder = nullptr;
|
32
|
|
-}
|
33
|
|
-
|
34
|
|
-int Menu::initialize() {
|
35
|
|
- return initialize(getOpenRaider().mPakDir);
|
36
|
|
-}
|
37
|
|
-
|
38
|
|
-int Menu::initialize(std::string folder) {
|
39
|
|
- return initialize(new Folder(folder, hiddenState));
|
40
|
|
-}
|
41
|
|
-
|
42
|
|
-int Menu::initialize(Folder *folder) {
|
43
|
|
- if (mapFolder != nullptr)
|
44
|
|
- delete mapFolder;
|
45
|
|
- mapFolder = folder;
|
46
|
|
- mMin = mCursor = 0;
|
47
|
|
-
|
48
|
|
- mapFolder->executeRemoveFiles([](File &f) {
|
49
|
|
- // Filter files based on file name
|
50
|
|
- if ((f.getName().length() > 4)
|
51
|
|
- && (f.getName().compare(f.getName().length() - 4, 4, ".phd") != 0)
|
52
|
|
- && (f.getName().compare(f.getName().length() - 4, 4, ".tr2") != 0)
|
53
|
|
- && (f.getName().compare(f.getName().length() - 4, 4, ".tr4") != 0)
|
54
|
|
- && (f.getName().compare(f.getName().length() - 4, 4, ".trc") != 0)) {
|
55
|
|
- return true; // delete file from list
|
56
|
|
- }
|
57
|
|
-
|
58
|
|
- // Check maps for validity
|
59
|
|
- int error = TombRaider::checkMime(f.getPath().c_str());
|
60
|
|
- if (error != 0) {
|
61
|
|
- getConsole() << "Error: pak file '" << f.getName().c_str()
|
62
|
|
- << "' " << ((error == -1) ? "not found" : "invalid") << Console::endl;
|
63
|
|
- return true; // delete file from list
|
64
|
|
- }
|
65
|
|
-
|
66
|
|
- return false; // keep file on list
|
67
|
|
- });
|
68
|
|
-
|
69
|
|
- if ((mapFolder->fileCount() + mapFolder->folderCount()) > 0)
|
70
|
|
- mCursor = 1; // Don't select ".." by default
|
71
|
|
-
|
72
|
|
- return 0;
|
73
|
|
-}
|
74
|
|
-
|
75
|
14
|
void Menu::setVisible(bool visible) {
|
76
|
15
|
mVisible = visible;
|
77
|
16
|
}
|
|
@@ -80,62 +19,43 @@ bool Menu::isVisible() {
|
80
|
19
|
return mVisible;
|
81
|
20
|
}
|
82
|
21
|
|
83
|
|
-void Menu::display() {
|
84
|
|
- if (!mVisible)
|
85
|
|
- return;
|
86
|
|
-
|
87
|
|
- // Draw half-transparent overlay
|
88
|
|
- glColor4f(0.0f, 0.0f, 0.0f, 0.75f);
|
89
|
|
- glDisable(GL_TEXTURE_2D);
|
90
|
|
- glRecti(0, 0, (GLint)getWindow().getWidth(), (GLint)getWindow().getHeight());
|
91
|
|
- glEnable(GL_TEXTURE_2D);
|
92
|
|
-
|
93
|
|
- // Draw heading
|
94
|
|
- getFont().drawTextCentered(0, 10, 1.2f, BLUE, getWindow().getWidth(), VERSION);
|
|
22
|
+void Menu::showDialog(std::string msg, std::string btn1, std::string btn2,
|
|
23
|
+ std::function<int (bool state)> callback) {
|
|
24
|
+ // Only show one dialog at a time
|
|
25
|
+ assert(dialogText.length() == 0);
|
|
26
|
+ assert(dialogButton1.length() == 0);
|
|
27
|
+ assert(dialogButton2.length() == 0);
|
95
|
28
|
|
96
|
|
- // Estimate displayable number of items
|
97
|
|
- int items = (getWindow().getHeight() - 60) / 25;
|
|
29
|
+ assert(msg.length() > 0);
|
|
30
|
+ assert(btn1.length() > 0);
|
98
|
31
|
|
99
|
|
- // Print list of "..", folders, files
|
100
|
|
- for (long i = mMin; (i < (mMin + items))
|
101
|
|
- && (i < (mapFolder->folderCount() + mapFolder->fileCount() + 1)); i++) {
|
102
|
|
- if (i == 0) {
|
103
|
|
- getFont().drawText(25, 50, 0.75f, (mCursor == i) ? RED : BLUE, "..");
|
104
|
|
- } else {
|
105
|
|
- getFont().drawText(25, (unsigned int)(50 + (25 * (i - mMin))), 0.75f,
|
106
|
|
- (mCursor == i) ? RED : BLUE,
|
107
|
|
- ((i - 1) < mapFolder->folderCount()) ?
|
108
|
|
- (mapFolder->getFolder(i - 1).getName() + "/")
|
109
|
|
- : mapFolder->getFile(i - 1 - mapFolder->folderCount()).getName());
|
110
|
|
- }
|
111
|
|
- }
|
|
32
|
+ dialogText = msg;
|
|
33
|
+ dialogButton1 = btn1;
|
|
34
|
+ dialogButton2 = btn2;
|
|
35
|
+ dialogState = false;
|
|
36
|
+ dialogFunction = callback;
|
112
|
37
|
|
113
|
|
- displayDialog();
|
|
38
|
+ getConsole() << dialogText << Console::endl;
|
114
|
39
|
}
|
115
|
40
|
|
116
|
|
-void Menu::loadOrOpen() {
|
117
|
|
- if (mCursor == 0) {
|
118
|
|
- if (initialize(mapFolder->getParent().getPath()) != 0) {
|
119
|
|
- showDialog("Error reading parent folder!", "OK", "");
|
120
|
|
- }
|
121
|
|
- } else if ((mCursor - 1) < mapFolder->folderCount()) {
|
122
|
|
- if (initialize(mapFolder->getFolder(mCursor - 1).getPath()) != 0) {
|
123
|
|
- showDialog("Error reading subfolder!", "OK", "");
|
124
|
|
- }
|
125
|
|
- } else {
|
126
|
|
- std::string tmp = "load ";
|
127
|
|
- tmp += mapFolder->getFile((unsigned long)mCursor - 1 - mapFolder->folderCount()).getPath();
|
128
|
|
- if (getOpenRaider().command(tmp.c_str()) == 0) {
|
129
|
|
- setVisible(false);
|
130
|
|
- } else {
|
131
|
|
- showDialog("Error loading map!", "OK", "");
|
|
41
|
+void Menu::ackDialog() {
|
|
42
|
+ dialogText = "";
|
|
43
|
+ dialogButton1 = "";
|
|
44
|
+ dialogButton2 = "";
|
|
45
|
+
|
|
46
|
+ if (dialogFunction) {
|
|
47
|
+ int error = dialogFunction(dialogState);
|
|
48
|
+ if (error != 0) {
|
|
49
|
+ showDialog("Error processing dialog callback!", "OK", "");
|
132
|
50
|
}
|
133
|
51
|
}
|
|
52
|
+
|
|
53
|
+ dialogState = false;
|
134
|
54
|
}
|
135
|
55
|
|
136
|
|
-void Menu::handleKeyboard(KeyboardButton key, bool pressed) {
|
|
56
|
+bool Menu::handleKeyboardDialog(KeyboardButton key, bool pressed) {
|
137
|
57
|
if (!pressed)
|
138
|
|
- return;
|
|
58
|
+ return (dialogText.length() > 0);
|
139
|
59
|
|
140
|
60
|
if (dialogText.length() > 0) {
|
141
|
61
|
if (dialogButton2.length() == 0) {
|
|
@@ -155,114 +75,21 @@ void Menu::handleKeyboard(KeyboardButton key, bool pressed) {
|
155
|
75
|
dialogState = !dialogState;
|
156
|
76
|
}
|
157
|
77
|
}
|
158
|
|
- return;
|
159
|
|
- }
|
160
|
|
-
|
161
|
|
- assert(mapFolder != nullptr);
|
162
|
|
- int items = (getWindow().getHeight() - 60) / 25;
|
163
|
|
-
|
164
|
|
- if (key == upKey) {
|
165
|
|
- if (mCursor > 0)
|
166
|
|
- mCursor--;
|
167
|
|
- else
|
168
|
|
- mCursor = (long)(mapFolder->folderCount() + mapFolder->fileCount());
|
169
|
|
- } else if (key == downKey) {
|
170
|
|
- if (mCursor < (long)(mapFolder->folderCount() + mapFolder->fileCount()))
|
171
|
|
- mCursor++;
|
172
|
|
- else
|
173
|
|
- mCursor = 0;
|
174
|
|
- } else if (key == enterKey) {
|
175
|
|
- loadOrOpen();
|
176
|
|
- } else if (key == dotKey) {
|
177
|
|
- hiddenState = !hiddenState;
|
178
|
|
- initialize(mapFolder->getPath());
|
|
78
|
+ return true;
|
179
|
79
|
}
|
180
|
80
|
|
181
|
|
- if (mCursor > (mMin + items - 1)) {
|
182
|
|
- mMin = mCursor - items + 1;
|
183
|
|
- } else if (mCursor < mMin) {
|
184
|
|
- mMin = mCursor;
|
185
|
|
- }
|
186
|
|
-}
|
187
|
|
-
|
188
|
|
-void Menu::handleMouseClick(unsigned int x, unsigned int y, KeyboardButton button, bool released) {
|
189
|
|
- int items = (getWindow().getHeight() - 60) / 25;
|
190
|
|
-
|
191
|
|
- if (released || (button != leftmouseKey))
|
192
|
|
- return;
|
193
|
|
-
|
194
|
|
- if (dialogText.length() > 0) {
|
195
|
|
- //!< \todo Allow mouse usage of Menu dialogs!
|
196
|
|
- return;
|
197
|
|
- }
|
198
|
|
-
|
199
|
|
- if ((y >= 50) && (y <= (unsigned int)(50 + (25 * items)))
|
200
|
|
- && ((mMin + (y / 25)) <= (mapFolder->folderCount() + mapFolder->fileCount() + 2))) {
|
201
|
|
- y -= 50;
|
202
|
|
- if (mCursor == (mMin + (y / 25)))
|
203
|
|
- loadOrOpen();
|
204
|
|
- else
|
205
|
|
- mCursor = mMin + (y / 25);
|
206
|
|
- }
|
|
81
|
+ return false;
|
207
|
82
|
}
|
208
|
83
|
|
209
|
|
-void Menu::handleMouseScroll(int xrel, int yrel) {
|
210
|
|
- if (dialogText.length() > 0)
|
211
|
|
- return;
|
212
|
|
-
|
213
|
|
- assert((xrel != 0) || (yrel != 0));
|
214
|
|
- assert(mapFolder != nullptr);
|
215
|
|
- int items = (getWindow().getHeight() - 60) / 25;
|
216
|
|
-
|
217
|
|
- if ((mapFolder->folderCount() + mapFolder->fileCount() + 1) > items) {
|
218
|
|
- if (yrel < 0) {
|
219
|
|
- if (mMin < (mapFolder->folderCount() + mapFolder->fileCount() + 1 - items))
|
220
|
|
- mMin++;
|
221
|
|
- } else if (yrel > 0) {
|
222
|
|
- if (mMin > 0)
|
223
|
|
- mMin--;
|
224
|
|
- }
|
225
|
|
-
|
226
|
|
- if (mCursor < mMin) {
|
227
|
|
- mCursor = mMin;
|
228
|
|
- } else if (mCursor > (mMin + items - 1)) {
|
229
|
|
- mCursor = mMin + items - 1;
|
230
|
|
- }
|
231
|
|
- }
|
|
84
|
+bool Menu::handleMouseClickDialog(unsigned int x, unsigned int y,
|
|
85
|
+ KeyboardButton button, bool released) {
|
|
86
|
+ //! \todo Allow mouse usage of Menu dialogs!
|
|
87
|
+ return (dialogText.length() > 0);
|
232
|
88
|
}
|
233
|
89
|
|
234
|
|
-void Menu::showDialog(std::string msg, std::string btn1, std::string btn2,
|
235
|
|
- std::function<int (bool state)> callback) {
|
236
|
|
- // Only show one dialog at a time
|
237
|
|
- assert(dialogText.length() == 0);
|
238
|
|
- assert(dialogButton1.length() == 0);
|
239
|
|
- assert(dialogButton2.length() == 0);
|
240
|
|
-
|
241
|
|
- assert(msg.length() > 0);
|
242
|
|
- assert(btn1.length() > 0);
|
243
|
|
-
|
244
|
|
- dialogText = msg;
|
245
|
|
- dialogButton1 = btn1;
|
246
|
|
- dialogButton2 = btn2;
|
247
|
|
- dialogState = false;
|
248
|
|
- dialogFunction = callback;
|
249
|
|
-
|
250
|
|
- getConsole() << dialogText << Console::endl;
|
251
|
|
-}
|
252
|
|
-
|
253
|
|
-void Menu::ackDialog() {
|
254
|
|
- dialogText = "";
|
255
|
|
- dialogButton1 = "";
|
256
|
|
- dialogButton2 = "";
|
257
|
|
-
|
258
|
|
- if (dialogFunction) {
|
259
|
|
- int error = dialogFunction(dialogState);
|
260
|
|
- if (error != 0) {
|
261
|
|
- showDialog("Error processing dialog callback!", "OK", "");
|
262
|
|
- }
|
263
|
|
- }
|
264
|
|
-
|
265
|
|
- dialogState = false;
|
|
90
|
+bool Menu::handleMouseScrollDialog(int xrel, int yrel) {
|
|
91
|
+ //! \todo Allow mouse usage of Menu dialogs!
|
|
92
|
+ return (dialogText.length() > 0);
|
266
|
93
|
}
|
267
|
94
|
|
268
|
95
|
void Menu::displayDialog() {
|