blob: 99bf0dbfaacc0ef742e6327824cc611ef14315c6 [file] [log] [blame]
Dees_Troya13d74f2013-03-24 08:54:55 -05001/*
2 Copyright 2013 bigbiff/Dees_Troy TeamWin
3 This file is part of TWRP/TeamWin Recovery Project.
4
5 TWRP 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, either version 3 of the License, or
8 (at your option) any later version.
9
10 TWRP is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with TWRP. If not, see <http://www.gnu.org/licenses/>.
17*/
Dees Troy3be70a82013-10-22 14:25:12 +000018
19// objects.hpp - Base classes for object manager of GUI
Dees_Troy51a0e822012-09-05 15:24:24 -040020
21#ifndef _OBJECTS_HEADER
22#define _OBJECTS_HEADER
23
24#include "rapidxml.hpp"
25#include <vector>
26#include <string>
27#include <map>
Vojtech Bocek0b7fe502014-03-13 17:36:52 +010028#include <set>
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +000029#include <time.h>
Dees_Troy51a0e822012-09-05 15:24:24 -040030
Dees_Troy51a0e822012-09-05 15:24:24 -040031using namespace rapidxml;
32
33#include "../data.hpp"
34#include "resources.hpp"
35#include "pages.hpp"
Dees_Troya13d74f2013-03-24 08:54:55 -050036#include "../partitions.hpp"
Dees_Troy51a0e822012-09-05 15:24:24 -040037
Ethan Yonker751a85e2014-12-12 16:59:10 -060038#ifndef TW_X_OFFSET
39#define TW_X_OFFSET 0
40#endif
41#ifndef TW_Y_OFFSET
42#define TW_Y_OFFSET 0
43#endif
44
Dees_Troy51a0e822012-09-05 15:24:24 -040045class RenderObject
46{
47public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020048 enum Placement {
49 TOP_LEFT = 0,
50 TOP_RIGHT = 1,
51 BOTTOM_LEFT = 2,
52 BOTTOM_RIGHT = 3,
53 CENTER = 4,
Dees_Troy51a0e822012-09-05 15:24:24 -040054 CENTER_X_ONLY = 5,
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020055 };
Dees_Troy51a0e822012-09-05 15:24:24 -040056
57public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020058 RenderObject() { mRenderX = 0; mRenderY = 0; mRenderW = 0; mRenderH = 0; mPlacement = TOP_LEFT; }
59 virtual ~RenderObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -040060
61public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020062 // Render - Render the full object to the GL surface
63 // Return 0 on success, <0 on error
64 virtual int Render(void) = 0;
Dees_Troy51a0e822012-09-05 15:24:24 -040065
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020066 // Update - Update any UI component animations (called <= 30 FPS)
67 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
68 virtual int Update(void) { return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040069
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020070 // GetRenderPos - Returns the current position of the object
71 virtual int GetRenderPos(int& x, int& y, int& w, int& h) { x = mRenderX; y = mRenderY; w = mRenderW; h = mRenderH; return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040072
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020073 // SetRenderPos - Update the position of the object
74 // Return 0 on success, <0 on error
75 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0) { mRenderX = x; mRenderY = y; if (w || h) { mRenderW = w; mRenderH = h; } return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040076
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020077 // GetPlacement - Returns the current placement
78 virtual int GetPlacement(Placement& placement) { placement = mPlacement; return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040079
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020080 // SetPlacement - Update the current placement
81 virtual int SetPlacement(Placement placement) { mPlacement = placement; return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040082
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020083 // SetPageFocus - Notify when a page gains or loses focus
84 virtual void SetPageFocus(int inFocus) { return; }
Dees_Troy51a0e822012-09-05 15:24:24 -040085
86protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020087 int mRenderX, mRenderY, mRenderW, mRenderH;
88 Placement mPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -040089};
90
91class ActionObject
92{
93public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020094 ActionObject() { mActionX = 0; mActionY = 0; mActionW = 0; mActionH = 0; }
95 virtual ~ActionObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -040096
97public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020098 // NotifyTouch - Notify of a touch event
99 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
100 virtual int NotifyTouch(TOUCH_STATE state, int x, int y) { return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400101
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200102 // NotifyKey - Notify of a key press
103 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100104 virtual int NotifyKey(int key, bool down) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400105
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200106 // GetRenderPos - Returns the current position of the object
107 virtual int GetActionPos(int& x, int& y, int& w, int& h) { x = mActionX; y = mActionY; w = mActionW; h = mActionH; return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400108
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200109 // SetRenderPos - Update the position of the object
110 // Return 0 on success, <0 on error
111 virtual int SetActionPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400112
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200113 // IsInRegion - Checks if the request is handled by this object
thatf8194e22015-01-29 01:05:01 +0100114 // Return 1 if this object handles the request, 0 if not
115 virtual int IsInRegion(int x, int y) { return ((x < mActionX || x >= mActionX + mActionW || y < mActionY || y >= mActionY + mActionH) ? 0 : 1); }
Dees_Troy51a0e822012-09-05 15:24:24 -0400116
Dees_Troy51a0e822012-09-05 15:24:24 -0400117protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200118 int mActionX, mActionY, mActionW, mActionH;
Dees_Troy51a0e822012-09-05 15:24:24 -0400119};
120
Vojtech Bocekede51c52014-02-07 23:58:09 +0100121class GUIObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400122{
123public:
Vojtech Bocekede51c52014-02-07 23:58:09 +0100124 GUIObject(xml_node<>* node);
125 virtual ~GUIObject();
Dees_Troy51a0e822012-09-05 15:24:24 -0400126
127public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200128 bool IsConditionVariable(std::string var);
129 bool isConditionTrue();
130 bool isConditionValid();
Vojtech Bocek07220562014-02-08 02:05:33 +0100131
132 // NotifyVarChange - Notify of a variable change
133 // Returns 0 on success, <0 on error
134 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400135
136protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200137 class Condition
138 {
139 public:
Vojtech Bocek07220562014-02-08 02:05:33 +0100140 Condition() {
141 mLastResult = true;
142 }
143
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200144 std::string mVar1;
145 std::string mVar2;
146 std::string mCompareOp;
147 std::string mLastVal;
Vojtech Bocek07220562014-02-08 02:05:33 +0100148 bool mLastResult;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200149 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400150
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200151 std::vector<Condition> mConditions;
Dees_Troy51a0e822012-09-05 15:24:24 -0400152
153protected:
that20fb95d2015-09-12 11:27:47 +0200154 static void LoadConditions(xml_node<>* node, std::vector<Condition>& conditions);
155 static bool isMounted(std::string vol);
156 static bool isConditionTrue(Condition* condition);
157 static bool UpdateConditions(std::vector<Condition>& conditions, const std::string& varName);
Vojtech Bocek07220562014-02-08 02:05:33 +0100158
159 bool mConditionsResult;
Dees_Troy51a0e822012-09-05 15:24:24 -0400160};
161
162class InputObject
163{
164public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200165 InputObject() { HasInputFocus = 0; }
166 virtual ~InputObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -0400167
168public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200169 // NotifyKeyboard - Notify of keyboard input
170 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
171 virtual int NotifyKeyboard(int key) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400172
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200173 virtual int SetInputFocus(int focus) { HasInputFocus = focus; return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400174
175protected:
176 int HasInputFocus;
177};
178
179// Derived Objects
180// GUIText - Used for static text
Vojtech Bocekede51c52014-02-07 23:58:09 +0100181class GUIText : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400182{
183public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200184 // w and h may be ignored, in which case, no bounding box is applied
185 GUIText(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400186
187public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200188 // Render - Render the full object to the GL surface
189 // Return 0 on success, <0 on error
190 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400191
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200192 // Update - Update any UI component animations (called <= 30 FPS)
193 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
194 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400195
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200196 // Retrieve the size of the current string (dynamic strings may change per call)
197 virtual int GetCurrentBounds(int& w, int& h);
Dees_Troy51a0e822012-09-05 15:24:24 -0400198
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200199 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100200 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400201
202 // Set maximum width in pixels
203 virtual int SetMaxWidth(unsigned width);
204
205 // Set number of characters to skip (for scrolling)
206 virtual int SkipCharCount(unsigned skip);
207
Dees_Troy4d12f962012-10-19 13:13:15 -0400208public:
209 bool isHighlighted;
210
Dees_Troy51a0e822012-09-05 15:24:24 -0400211protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200212 std::string mText;
213 std::string mLastValue;
214 COLOR mColor;
Dees_Troy4d12f962012-10-19 13:13:15 -0400215 COLOR mHighlightColor;
thatf6ed8fc2015-02-14 20:23:16 +0100216 FontResource* mFont;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200217 int mIsStatic;
218 int mVarChanged;
219 int mFontHeight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400220 unsigned maxWidth;
221 unsigned charSkip;
Dees_Troy51a0e822012-09-05 15:24:24 -0400222};
223
224// GUIImage - Used for static image
Vojtech Bocekede51c52014-02-07 23:58:09 +0100225class GUIImage : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400226{
227public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200228 GUIImage(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400229
230public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200231 // Render - Render the full object to the GL surface
232 // Return 0 on success, <0 on error
233 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400234
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200235 // SetRenderPos - Update the position of the object
236 // Return 0 on success, <0 on error
237 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400238
Dees_Troy4d12f962012-10-19 13:13:15 -0400239public:
240 bool isHighlighted;
241
Dees_Troy51a0e822012-09-05 15:24:24 -0400242protected:
thatf6ed8fc2015-02-14 20:23:16 +0100243 ImageResource* mImage;
244 ImageResource* mHighlightImage;
Dees_Troy51a0e822012-09-05 15:24:24 -0400245};
246
247// GUIFill - Used for fill colors
Vojtech Bocekede51c52014-02-07 23:58:09 +0100248class GUIFill : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400249{
250public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200251 GUIFill(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400252
253public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200254 // Render - Render the full object to the GL surface
255 // Return 0 on success, <0 on error
256 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400257
258protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200259 COLOR mColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400260};
261
262// GUIAction - Used for standard actions
Vojtech Bocekede51c52014-02-07 23:58:09 +0100263class GUIAction : public GUIObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400264{
thatc6085482015-01-09 22:12:43 +0100265 friend class ActionThread;
266
Dees_Troy51a0e822012-09-05 15:24:24 -0400267public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200268 GUIAction(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400269
270public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200271 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100272 virtual int NotifyKey(int key, bool down);
Vojtech Bocek07220562014-02-08 02:05:33 +0100273 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
that3f7b1ac2014-12-30 11:30:13 +0100274
275 int doActions();
Dees_Troy51a0e822012-09-05 15:24:24 -0400276
277protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200278 class Action
279 {
280 public:
281 std::string mFunction;
282 std::string mArg;
283 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400284
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200285 std::vector<Action> mActions;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100286 std::map<int, bool> mKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400287
288protected:
that73a52952015-01-28 23:07:34 +0100289 enum ThreadType { THREAD_NONE, THREAD_ACTION, THREAD_CANCEL };
290
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200291 int getKeyByName(std::string key);
that3f7b1ac2014-12-30 11:30:13 +0100292 int doAction(Action action);
that73a52952015-01-28 23:07:34 +0100293 ThreadType getThreadType(const Action& action);
Dees_Troy51a0e822012-09-05 15:24:24 -0400294 void simulate_progress_bar(void);
Ethan Yonker0d47eb52015-01-09 11:23:19 -0600295 int flash_zip(std::string filename, int* wipe_cache);
thatcc8ddca2015-01-03 01:59:36 +0100296 void reinject_after_flash();
Dees_Troy51a0e822012-09-05 15:24:24 -0400297 void operation_start(const string operation_name);
that3f7b1ac2014-12-30 11:30:13 +0100298 void operation_end(const int operation_status);
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +0000299 time_t Start;
that3f7b1ac2014-12-30 11:30:13 +0100300
301 // map action name to function pointer
302 typedef int (GUIAction::*execFunction)(std::string);
303 typedef std::map<std::string, execFunction> mapFunc;
304 static mapFunc mf;
thatc6085482015-01-09 22:12:43 +0100305 static std::set<std::string> setActionsRunningInCallerThread;
that3f7b1ac2014-12-30 11:30:13 +0100306
307 // GUI actions
308 int reboot(std::string arg);
309 int home(std::string arg);
310 int key(std::string arg);
311 int page(std::string arg);
312 int reload(std::string arg);
313 int readBackup(std::string arg);
314 int set(std::string arg);
315 int clear(std::string arg);
316 int mount(std::string arg);
317 int unmount(std::string arg);
318 int restoredefaultsettings(std::string arg);
319 int copylog(std::string arg);
320 int compute(std::string arg);
321 int setguitimezone(std::string arg);
322 int overlay(std::string arg);
323 int queuezip(std::string arg);
324 int cancelzip(std::string arg);
325 int queueclear(std::string arg);
326 int sleep(std::string arg);
327 int appenddatetobackupname(std::string arg);
328 int generatebackupname(std::string arg);
329 int checkpartitionlist(std::string arg);
330 int getpartitiondetails(std::string arg);
331 int screenshot(std::string arg);
332 int setbrightness(std::string arg);
333
thatc6085482015-01-09 22:12:43 +0100334 // (originally) threaded actions
that3f7b1ac2014-12-30 11:30:13 +0100335 int fileexists(std::string arg);
336 int flash(std::string arg);
337 int wipe(std::string arg);
338 int refreshsizes(std::string arg);
339 int nandroid(std::string arg);
340 int fixpermissions(std::string arg);
341 int dd(std::string arg);
342 int partitionsd(std::string arg);
343 int installhtcdumlock(std::string arg);
344 int htcdumlockrestoreboot(std::string arg);
345 int htcdumlockreflashrecovery(std::string arg);
346 int cmd(std::string arg);
347 int terminalcommand(std::string arg);
348 int killterminal(std::string arg);
349 int reinjecttwrp(std::string arg);
350 int checkbackupname(std::string arg);
351 int decrypt(std::string arg);
352 int adbsideload(std::string arg);
353 int adbsideloadcancel(std::string arg);
354 int openrecoveryscript(std::string arg);
355 int installsu(std::string arg);
356 int fixsu(std::string arg);
357 int decrypt_backup(std::string arg);
358 int repair(std::string arg);
Ethan Yonkera2719152015-05-28 09:44:41 -0500359 int resize(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100360 int changefilesystem(std::string arg);
361 int startmtp(std::string arg);
362 int stopmtp(std::string arg);
Ethan Yonker96af84a2015-01-05 14:58:36 -0600363 int flashimage(std::string arg);
bigbiff7abc5fe2015-01-17 16:53:12 -0500364 int cancelbackup(std::string arg);
Ethan Yonkereb32b1f2015-05-18 10:23:03 -0500365 int checkpartitionlifetimewrites(std::string arg);
366 int mountsystemtoggle(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100367
368 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400369};
370
Vojtech Bocekede51c52014-02-07 23:58:09 +0100371class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400372{
373public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200374 GUIButton(xml_node<>* node);
375 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400376
377public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200378 // Render - Render the full object to the GL surface
379 // Return 0 on success, <0 on error
380 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400381
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200382 // Update - Update any UI component animations (called <= 30 FPS)
383 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
384 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400385
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200386 // SetPos - Update the position of the render object
387 // Return 0 on success, <0 on error
388 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400389
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200390 // NotifyTouch - Notify of a touch event
391 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
392 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400393
394protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200395 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100396 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200397 GUIText* mButtonLabel;
398 GUIAction* mAction;
399 int mTextX, mTextY, mTextW, mTextH;
400 int mIconX, mIconY, mIconW, mIconH;
401 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600402 bool hasHighlightColor;
403 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500404 bool hasFill;
405 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600406 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000407 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400408};
409
Vojtech Bocekede51c52014-02-07 23:58:09 +0100410class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400411{
412public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200413 GUICheckbox(xml_node<>* node);
414 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400415
416public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200417 // Render - Render the full object to the GL surface
418 // Return 0 on success, <0 on error
419 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400420
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200421 // Update - Update any UI component animations (called <= 30 FPS)
422 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
423 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400424
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200425 // SetPos - Update the position of the render object
426 // Return 0 on success, <0 on error
427 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400428
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200429 // NotifyTouch - Notify of a touch event
430 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
431 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400432
433protected:
thatf6ed8fc2015-02-14 20:23:16 +0100434 ImageResource* mChecked;
435 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200436 GUIText* mLabel;
437 int mTextX, mTextY;
438 int mCheckX, mCheckY, mCheckW, mCheckH;
439 int mLastState;
440 bool mRendered;
441 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400442};
443
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100444class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400445{
446public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100447 GUIScrollList(xml_node<>* node);
448 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400449
450public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200451 // Render - Render the full object to the GL surface
452 // Return 0 on success, <0 on error
453 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400454
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200455 // Update - Update any UI component animations (called <= 30 FPS)
456 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
457 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400458
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200459 // NotifyTouch - Notify of a touch event
460 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
461 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400462
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200463 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100464 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400465
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200466 // SetPos - Update the position of the render object
467 // Return 0 on success, <0 on error
468 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400469
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200470 // SetPageFocus - Notify when a page gains or loses focus
471 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400472
473protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100474 // derived classes need to implement these
475 // get number of items
476 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100477 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
478 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100479 // an item was selected
480 virtual void NotifySelect(size_t item_selected) {}
481
that0af77952015-02-25 08:52:19 +0100482 // render a standard-layout list item with optional icon and text
483 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
484
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100485 enum { NO_ITEM = (size_t)-1 };
486 // returns item index at coordinates or NO_ITEM if there is no item there
487 size_t HitTestItem(int x, int y);
488
489 // Called by the derived class to set the max icon size so we can calculate the proper actualItemHeight and center smaller icons if the icon size varies
490 void SetMaxIconSize(int w, int h);
491
492 // This will make sure that the item indicated by list_index is visible on the screen
493 void SetVisibleListLocation(size_t list_index);
494
495 // Handle scrolling changes for drags and kinetic scrolling
496 void HandleScrolling();
497
that9876ac32015-02-15 21:40:59 +0100498 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100499 int GetDisplayItemCount();
500
501 // Returns the size in pixels of a partial item or row size
502 int GetDisplayRemainder();
503
504protected:
505 // Background
506 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100507 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100508
509 // Header
510 COLOR mHeaderBackgroundColor;
511 COLOR mHeaderFontColor;
512 std::string mHeaderText; // Original header text without parsing any variables
513 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100514 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100515 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100516 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100517 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
518 int mHeaderSeparatorH; // Height of the separator between header and list items
519 COLOR mHeaderSeparatorColor; // color of the header separator
520
521 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100522 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100523 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100524 bool hasHighlightColor; // indicates if a highlight color was set
525 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100526 COLOR mFontHighlightColor;
527 int mFontHeight;
528 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
529 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
530 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
531 int mSeparatorH; // Height of the separator between items
532 COLOR mSeparatorColor; // color of the separator that is between items
533
thata9998212015-02-19 22:51:24 +0100534 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100535 int mFastScrollW; // width of the fastscroll area
536 int mFastScrollLineW; // width of the line for fastscroll rendering
537 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100538 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100539 COLOR mFastScrollLineColor;
540 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100541
542 // Scrolling and dynamic state
543 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
544 int mFastScrollRectCurrentH; // current height of fastscroll rect
545 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100546 bool hasScroll; // indicates that we have enough items in the list to scroll
547 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
548 int scrollingSpeed; // on a touch release, this is set based on the difference in the y-axis between the last 2 touches and indicates how fast the kinetic scrolling will go
549 int y_offset; // this is how many pixels offset in the y axis for per pixel scrolling, is always <= 0 and should never be < -actualItemHeight
that8d46c092015-02-26 01:30:04 +0100550 bool allowSelection; // true if touched item can be selected, false for pure read-only lists and the console
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100551 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
552 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
553 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
554 int fastScroll; // indicates that the inital touch was inside the fastscroll region - makes for easier fast scrolling as the touches don't have to stay within the fast scroll region and you drag your finger
555 int mUpdate; // indicates that a change took place and we need to re-render
556};
557
558class GUIFileSelector : public GUIScrollList
559{
560public:
561 GUIFileSelector(xml_node<>* node);
562 virtual ~GUIFileSelector();
563
564public:
565 // Update - Update any UI component animations (called <= 30 FPS)
566 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
567 virtual int Update(void);
568
569 // NotifyVarChange - Notify of a variable change
570 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
571
572 // SetPageFocus - Notify when a page gains or loses focus
573 virtual void SetPageFocus(int inFocus);
574
575 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100576 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100577 virtual void NotifySelect(size_t item_selected);
578
579protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200580 struct FileData {
581 std::string fileName;
582 unsigned char fileType; // Uses d_type format from struct dirent
583 mode_t protection; // Uses mode_t format from stat
584 uid_t userId;
585 gid_t groupId;
586 off_t fileSize;
587 time_t lastAccess; // Uses time_t format from stat
588 time_t lastModified; // Uses time_t format from stat
589 time_t lastStatChange; // Uses time_t format from stat
590 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400591
592protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200593 virtual int GetFileList(const std::string folder);
594 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400595
596protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200597 std::vector<FileData> mFolderList;
598 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100599 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600600 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100601 std::string mExtn; // used for filtering the file list, for example, *.zip
602 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
603 std::string mSortVariable; // data manager variable used to change the sorting of files
604 std::string mSelection; // set when the user selects an item without the full path like selecting /path/to/foo would just be set to foo
605 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
606 int mShowNavFolders; // indicates if the list should include the "up a level" item and allow you to traverse folders (nav folders are disabled for the restore list, for instance)
607 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100608 ImageResource* mFolderIcon;
609 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600610 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400611};
612
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100613class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400614{
615public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200616 GUIListBox(xml_node<>* node);
617 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400618
619public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200620 // Update - Update any UI component animations (called <= 30 FPS)
621 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
622 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400623
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200624 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100625 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400626
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200627 // SetPageFocus - Notify when a page gains or loses focus
628 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400629
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100630 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100631 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100632 virtual void NotifySelect(size_t item_selected);
633
Dees_Troy51a0e822012-09-05 15:24:24 -0400634protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200635 struct ListData {
636 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500637 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400638 std::string variableValue;
639 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200640 GUIAction* action;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200641 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400642
643protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200644 std::vector<ListData> mList;
645 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400646 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100647 ImageResource* mIconSelected;
648 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500649 bool isCheckList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400650};
651
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100652class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500653{
654public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200655 GUIPartitionList(xml_node<>* node);
656 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500657
658public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200659 // Update - Update any UI component animations (called <= 30 FPS)
660 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100661 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500662
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200663 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100664 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500665
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200666 // SetPageFocus - Notify when a page gains or loses focus
667 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500668
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100669 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100670 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100671 virtual void NotifySelect(size_t item_selected);
672
Dees_Troya13d74f2013-03-24 08:54:55 -0500673protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100674 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600675 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500676
677protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200678 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500679 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200680 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500681 std::string selectedList;
682 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500683 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100684 ImageResource* mIconSelected;
685 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500686 bool updateList;
687};
688
that8d46c092015-02-26 01:30:04 +0100689class GUIConsole : public GUIScrollList
690{
691public:
692 GUIConsole(xml_node<>* node);
693
694public:
695 // Render - Render the full object to the GL surface
696 // Return 0 on success, <0 on error
697 virtual int Render(void);
698
699 // Update - Update any UI component animations (called <= 30 FPS)
700 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
701 virtual int Update(void);
702
703 // IsInRegion - Checks if the request is handled by this object
704 // Return 1 if this object handles the request, 0 if not
705 virtual int IsInRegion(int x, int y);
706
707 // NotifyTouch - Notify of a touch event
708 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
709 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
710
711 // ScrollList interface
712 virtual size_t GetItemCount();
713 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
714 virtual void NotifySelect(size_t item_selected);
715protected:
716 enum SlideoutState
717 {
718 hidden = 0,
719 visible,
720 request_hide,
721 request_show
722 };
723
724 ImageResource* mSlideoutImage;
725 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
726 bool scrollToEnd; // true if we want to keep tracking the last line
727 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
728 int mSlideout;
729 SlideoutState mSlideoutState;
730 std::vector<std::string> rConsole;
731 std::vector<std::string> rConsoleColor;
732
733protected:
734 bool AddLines();
735 int RenderSlideout(void);
736 int RenderConsole(void);
737};
738
Dees_Troy51a0e822012-09-05 15:24:24 -0400739// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100740class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400741{
742public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200743 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400744
745public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200746 // Render - Render the full object to the GL surface
747 // Return 0 on success, <0 on error
748 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400749
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200750 // Update - Update any UI component animations (called <= 30 FPS)
751 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
752 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400753
754protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200755 AnimationResource* mAnimation;
756 int mFrame;
757 int mFPS;
758 int mLoop;
759 int mRender;
760 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400761};
762
Vojtech Bocekede51c52014-02-07 23:58:09 +0100763class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400764{
765public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200766 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400767
768public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200769 // Render - Render the full object to the GL surface
770 // Return 0 on success, <0 on error
771 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400772
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200773 // Update - Update any UI component animations (called <= 30 FPS)
774 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
775 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400776
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200777 // NotifyVarChange - Notify of a variable change
778 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100779 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400780
781protected:
thatf6ed8fc2015-02-14 20:23:16 +0100782 ImageResource* mEmptyBar;
783 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200784 std::string mMinValVar;
785 std::string mMaxValVar;
786 std::string mCurValVar;
787 float mSlide;
788 float mSlideInc;
789 int mSlideFrames;
790 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400791
792protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200793 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400794};
795
Vojtech Bocekede51c52014-02-07 23:58:09 +0100796class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400797{
798public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200799 GUISlider(xml_node<>* node);
800 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400801
802public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200803 // Render - Render the full object to the GL surface
804 // Return 0 on success, <0 on error
805 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400806
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200807 // Update - Update any UI component animations (called <= 30 FPS)
808 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
809 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400810
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200811 // NotifyTouch - Notify of a touch event
812 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
813 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400814
815protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200816 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600817 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100818 ImageResource* sSlider;
819 ImageResource* sSliderUsed;
820 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200821 int sTouchW, sTouchH;
822 int sCurTouchX;
823 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400824};
825
Dees_Troy51a0e822012-09-05 15:24:24 -0400826#define KEYBOARD_ACTION 253
827#define KEYBOARD_LAYOUT 254
828#define KEYBOARD_SWIPE_LEFT 252
829#define KEYBOARD_SWIPE_RIGHT 251
830#define KEYBOARD_ARROW_LEFT 250
831#define KEYBOARD_ARROW_RIGHT 249
832#define KEYBOARD_HOME 248
833#define KEYBOARD_END 247
834#define KEYBOARD_ARROW_UP 246
835#define KEYBOARD_ARROW_DOWN 245
836#define KEYBOARD_SPECIAL_KEYS 245
837#define KEYBOARD_BACKSPACE 8
838
Vojtech Bocekede51c52014-02-07 23:58:09 +0100839class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400840{
841public:
842 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200843 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400844
845public:
846 virtual int Render(void);
847 virtual int Update(void);
848 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
849 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
850
851protected:
thate79878b2015-03-14 23:07:23 +0100852 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200853 {
thate79878b2015-03-14 23:07:23 +0100854 unsigned char key; // ASCII code or one of the special KEYBOARD_* codes above
Dees_Troy51a0e822012-09-05 15:24:24 -0400855 unsigned char longpresskey;
that1a7ba972015-02-01 19:48:19 +0100856 int end_x;
857 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200858 };
thate79878b2015-03-14 23:07:23 +0100859 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200860 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200861 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
thatd86f49d2015-03-15 00:56:57 +0100862
863 enum {
864 MAX_KEYBOARD_LAYOUTS = 5,
865 MAX_KEYBOARD_ROWS = 9,
866 MAX_KEYBOARD_KEYS = 20
867 };
868 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600869 {
thatd86f49d2015-03-15 00:56:57 +0100870 ImageResource* keyboardImg;
871 struct Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
872 int row_end_y[MAX_KEYBOARD_ROWS];
873 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600874 int revert_layout;
875 };
thatd86f49d2015-03-15 00:56:57 +0100876 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400877
thatf256b722015-05-23 20:44:12 +0200878 struct KeyLabel
879 {
880 unsigned char key; // same as in struct Key
881 int layout_from; // 1-based; 0 for labels that apply to all layouts
882 int layout_to; // same as Key.layout
883 string text; // key label text
884 ImageResource* image; // image (overrides text if defined)
885 };
886 std::vector<KeyLabel> mKeyLabels;
887
thate79878b2015-03-14 23:07:23 +0100888 // Find key at screen coordinates
889 Key* HitTestKey(int x, int y);
890
Dees_Troy51a0e822012-09-05 15:24:24 -0400891 bool mRendered;
892 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100893 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100894 bool CapsLockOn;
thatf6b20662015-06-25 21:51:37 +0200895 int highlightRenderCount;
896 Key* currentKey;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600897 bool hasHighlight, hasCapsHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400898 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600899 COLOR mCapsHighlightColor;
thatf256b722015-05-23 20:44:12 +0200900 COLOR mFontColor; // for centered key labels
901 COLOR mFontColorSmall; // for centered key labels
902 FontResource* mFont; // for main key labels
903 FontResource* mSmallFont; // for key labels like "?123"
904 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200905 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200906 COLOR mLongpressFontColor;
907 COLOR mBackgroundColor; // keyboard background color
908 COLOR mKeyColorAlphanumeric; // key background color
909 COLOR mKeyColorOther; // key background color
910 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400911};
912
913// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100914class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400915{
916public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200917 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400918 virtual ~GUIInput();
919
920public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200921 // Render - Render the full object to the GL surface
922 // Return 0 on success, <0 on error
923 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400924
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200925 // Update - Update any UI component animations (called <= 30 FPS)
926 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
927 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400928
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200929 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100930 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400931
932 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200933 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
934 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400935
936 virtual int NotifyKeyboard(int key);
937
938protected:
939 virtual int GetSelection(int x, int y);
940
941 // Handles displaying the text properly when chars are added, deleted, or for scrolling
942 virtual int HandleTextLocation(int x);
943
944protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200945 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -0400946 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +0100947 ImageResource* mBackground;
948 ImageResource* mCursor;
949 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -0400950 std::string mText;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200951 std::string mLastValue;
Dees_Troy51a0e822012-09-05 15:24:24 -0400952 std::string mVariable;
953 std::string mMask;
954 std::string mMaskVariable;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200955 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400956 COLOR mCursorColor;
957 int scrollingX;
958 int lastX;
959 int mCursorLocation;
960 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
961 int mFontY;
962 unsigned skipChars;
963 unsigned mFontHeight;
964 unsigned CursorWidth;
965 bool mRendered;
966 bool HasMask;
967 bool DrawCursor;
968 bool isLocalChange;
969 bool HasAllowed;
970 bool HasDisabled;
971 std::string AllowedList;
972 std::string DisabledList;
973 unsigned MinLen;
974 unsigned MaxLen;
975};
976
977class HardwareKeyboard
978{
979public:
thatf37aec22015-02-01 13:38:35 +0100980 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400981 virtual ~HardwareKeyboard();
982
983public:
thatf37aec22015-02-01 13:38:35 +0100984 // called by the input handler for key events
985 int KeyDown(int key_code);
986 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100987
thatf37aec22015-02-01 13:38:35 +0100988 // called by the input handler when holding a key down
989 int KeyRepeat();
990
991 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100992 void ConsumeKeyRelease(int key);
993
994private:
thatf37aec22015-02-01 13:38:35 +0100995 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100996 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400997};
998
Vojtech Bocekede51c52014-02-07 23:58:09 +0100999class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001000{
1001public:
1002 GUISliderValue(xml_node<>* node);
1003 virtual ~GUISliderValue();
1004
1005public:
1006 // Render - Render the full object to the GL surface
1007 // Return 0 on success, <0 on error
1008 virtual int Render(void);
1009
1010 // Update - Update any UI component animations (called <= 30 FPS)
1011 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1012 virtual int Update(void);
1013
1014 // SetPos - Update the position of the render object
1015 // Return 0 on success, <0 on error
1016 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1017
1018 // NotifyTouch - Notify of a touch event
1019 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1020 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1021
1022 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001023 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001024
1025 // SetPageFocus - Notify when a page gains or loses focus
1026 virtual void SetPageFocus(int inFocus);
1027
1028protected:
1029 int measureText(const std::string& str);
1030 int valueFromPct(float pct);
1031 float pctFromValue(int value);
1032 void loadValue(bool force = false);
1033
1034 std::string mVariable;
1035 int mMax;
1036 int mMin;
1037 int mValue;
1038 char *mValueStr;
1039 float mValuePct;
1040 std::string mMaxStr;
1041 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001042 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001043 GUIText* mLabel;
1044 int mLabelW;
1045 COLOR mTextColor;
1046 COLOR mLineColor;
1047 COLOR mSliderColor;
1048 bool mShowRange;
1049 bool mShowCurr;
1050 int mLineX;
1051 int mLineY;
1052 int mLineH;
1053 int mLinePadding;
1054 int mPadding;
1055 int mSliderY;
1056 int mSliderW;
1057 int mSliderH;
1058 bool mRendered;
1059 int mFontHeight;
1060 GUIAction *mAction;
1061 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001062 int mLineW;
1063 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001064 ImageResource *mBackgroundImage;
1065 ImageResource *mHandleImage;
1066 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001067};
1068
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001069class MouseCursor : public RenderObject
1070{
1071public:
1072 MouseCursor(int posX, int posY);
1073 virtual ~MouseCursor();
1074
1075 virtual int Render(void);
1076 virtual int Update(void);
1077 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1078
1079 void Move(int deltaX, int deltaY);
1080 void GetPos(int& x, int& y);
1081 void LoadData(xml_node<>* node);
1082 void ResetData(int resX, int resY);
1083
1084private:
1085 int m_resX;
1086 int m_resY;
1087 bool m_moved;
1088 float m_speedMultiplier;
1089 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001090 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001091 bool m_present;
1092};
1093
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001094class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1095{
1096public:
1097 GUIPatternPassword(xml_node<>* node);
1098 virtual ~GUIPatternPassword();
1099
1100public:
1101 virtual int Render(void);
1102 virtual int Update(void);
1103 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1104 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1105
1106protected:
1107 void CalculateDotPositions();
1108 void ResetActiveDots();
1109 void ConnectDot(int dot_idx);
1110 void ConnectIntermediateDots(int dot_idx);
1111 int InDot(int x, int y);
1112 bool DotUsed(int dot_idx);
1113 static bool IsInRect(int x, int y, int rx, int ry, int rw, int rh);
1114 void PatternDrawn();
1115
1116 struct Dot {
1117 int x;
1118 int y;
1119 bool active;
1120 };
1121
1122 Dot mDots[9];
1123 int mConnectedDots[9];
1124 size_t mConnectedDotsLen;
1125 int mCurLineX;
1126 int mCurLineY;
1127 bool mTrackingTouch;
1128 bool mNeedRender;
1129
1130 COLOR mDotColor;
1131 COLOR mActiveDotColor;
1132 COLOR mLineColor;
1133 ImageResource *mDotImage;
1134 ImageResource *mActiveDotImage;
1135 gr_surface mDotCircle;
1136 gr_surface mActiveDotCircle;
1137 int mDotRadius;
1138 int mLineWidth;
1139
1140 std::string mPassVar;
1141 GUIAction *mAction;
1142 int mUpdate;
1143};
1144
1145
Dees_Troy51a0e822012-09-05 15:24:24 -04001146// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001147xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001148std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1149int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1150int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1151int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001152COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001153COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1154FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1155ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1156AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
1157
Dees_Troy51a0e822012-09-05 15:24:24 -04001158bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, RenderObject::Placement* placement = NULL);
1159
1160#endif // _OBJECTS_HEADER
1161