blob: 7028956ad37e9e5cde8d340dc373750bbe10737b [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:
that8ab5c132015-09-13 23:00:54 +0200635 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200636 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;
that8ab5c132015-09-13 23:00:54 +0200641 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200642 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400643
644protected:
that8ab5c132015-09-13 23:00:54 +0200645 std::vector<ListItem> mListItems;
646 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200647 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400648 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100649 ImageResource* mIconSelected;
650 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500651 bool isCheckList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400652};
653
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100654class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500655{
656public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200657 GUIPartitionList(xml_node<>* node);
658 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500659
660public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200661 // Update - Update any UI component animations (called <= 30 FPS)
662 // 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 +0100663 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500664
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200665 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100666 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500667
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200668 // SetPageFocus - Notify when a page gains or loses focus
669 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500670
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100671 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100672 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100673 virtual void NotifySelect(size_t item_selected);
674
Dees_Troya13d74f2013-03-24 08:54:55 -0500675protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100676 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600677 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500678
679protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200680 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500681 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200682 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500683 std::string selectedList;
684 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500685 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100686 ImageResource* mIconSelected;
687 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500688 bool updateList;
689};
690
that8d46c092015-02-26 01:30:04 +0100691class GUIConsole : public GUIScrollList
692{
693public:
694 GUIConsole(xml_node<>* node);
695
696public:
697 // Render - Render the full object to the GL surface
698 // Return 0 on success, <0 on error
699 virtual int Render(void);
700
701 // Update - Update any UI component animations (called <= 30 FPS)
702 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
703 virtual int Update(void);
704
705 // IsInRegion - Checks if the request is handled by this object
706 // Return 1 if this object handles the request, 0 if not
707 virtual int IsInRegion(int x, int y);
708
709 // NotifyTouch - Notify of a touch event
710 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
711 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
712
713 // ScrollList interface
714 virtual size_t GetItemCount();
715 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
716 virtual void NotifySelect(size_t item_selected);
717protected:
718 enum SlideoutState
719 {
720 hidden = 0,
721 visible,
722 request_hide,
723 request_show
724 };
725
726 ImageResource* mSlideoutImage;
727 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
728 bool scrollToEnd; // true if we want to keep tracking the last line
729 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
730 int mSlideout;
731 SlideoutState mSlideoutState;
732 std::vector<std::string> rConsole;
733 std::vector<std::string> rConsoleColor;
734
735protected:
736 bool AddLines();
737 int RenderSlideout(void);
738 int RenderConsole(void);
739};
740
Dees_Troy51a0e822012-09-05 15:24:24 -0400741// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100742class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400743{
744public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200745 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400746
747public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200748 // Render - Render the full object to the GL surface
749 // Return 0 on success, <0 on error
750 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400751
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200752 // Update - Update any UI component animations (called <= 30 FPS)
753 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
754 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400755
756protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200757 AnimationResource* mAnimation;
758 int mFrame;
759 int mFPS;
760 int mLoop;
761 int mRender;
762 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400763};
764
Vojtech Bocekede51c52014-02-07 23:58:09 +0100765class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400766{
767public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200768 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400769
770public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200771 // Render - Render the full object to the GL surface
772 // Return 0 on success, <0 on error
773 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400774
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200775 // Update - Update any UI component animations (called <= 30 FPS)
776 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
777 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400778
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200779 // NotifyVarChange - Notify of a variable change
780 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100781 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400782
783protected:
thatf6ed8fc2015-02-14 20:23:16 +0100784 ImageResource* mEmptyBar;
785 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200786 std::string mMinValVar;
787 std::string mMaxValVar;
788 std::string mCurValVar;
789 float mSlide;
790 float mSlideInc;
791 int mSlideFrames;
792 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400793
794protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200795 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400796};
797
Vojtech Bocekede51c52014-02-07 23:58:09 +0100798class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400799{
800public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200801 GUISlider(xml_node<>* node);
802 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400803
804public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200805 // Render - Render the full object to the GL surface
806 // Return 0 on success, <0 on error
807 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400808
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200809 // Update - Update any UI component animations (called <= 30 FPS)
810 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
811 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400812
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200813 // NotifyTouch - Notify of a touch event
814 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
815 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400816
817protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200818 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600819 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100820 ImageResource* sSlider;
821 ImageResource* sSliderUsed;
822 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200823 int sTouchW, sTouchH;
824 int sCurTouchX;
825 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400826};
827
Dees_Troy51a0e822012-09-05 15:24:24 -0400828#define KEYBOARD_ACTION 253
829#define KEYBOARD_LAYOUT 254
830#define KEYBOARD_SWIPE_LEFT 252
831#define KEYBOARD_SWIPE_RIGHT 251
832#define KEYBOARD_ARROW_LEFT 250
833#define KEYBOARD_ARROW_RIGHT 249
834#define KEYBOARD_HOME 248
835#define KEYBOARD_END 247
836#define KEYBOARD_ARROW_UP 246
837#define KEYBOARD_ARROW_DOWN 245
838#define KEYBOARD_SPECIAL_KEYS 245
839#define KEYBOARD_BACKSPACE 8
840
Vojtech Bocekede51c52014-02-07 23:58:09 +0100841class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400842{
843public:
844 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200845 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400846
847public:
848 virtual int Render(void);
849 virtual int Update(void);
850 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
851 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
852
853protected:
thate79878b2015-03-14 23:07:23 +0100854 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200855 {
thate79878b2015-03-14 23:07:23 +0100856 unsigned char key; // ASCII code or one of the special KEYBOARD_* codes above
Dees_Troy51a0e822012-09-05 15:24:24 -0400857 unsigned char longpresskey;
that1a7ba972015-02-01 19:48:19 +0100858 int end_x;
859 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200860 };
thate79878b2015-03-14 23:07:23 +0100861 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200862 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200863 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
thatd86f49d2015-03-15 00:56:57 +0100864
865 enum {
866 MAX_KEYBOARD_LAYOUTS = 5,
867 MAX_KEYBOARD_ROWS = 9,
868 MAX_KEYBOARD_KEYS = 20
869 };
870 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600871 {
thatd86f49d2015-03-15 00:56:57 +0100872 ImageResource* keyboardImg;
873 struct Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
874 int row_end_y[MAX_KEYBOARD_ROWS];
875 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600876 int revert_layout;
877 };
thatd86f49d2015-03-15 00:56:57 +0100878 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400879
thatf256b722015-05-23 20:44:12 +0200880 struct KeyLabel
881 {
882 unsigned char key; // same as in struct Key
883 int layout_from; // 1-based; 0 for labels that apply to all layouts
884 int layout_to; // same as Key.layout
885 string text; // key label text
886 ImageResource* image; // image (overrides text if defined)
887 };
888 std::vector<KeyLabel> mKeyLabels;
889
thate79878b2015-03-14 23:07:23 +0100890 // Find key at screen coordinates
891 Key* HitTestKey(int x, int y);
892
Dees_Troy51a0e822012-09-05 15:24:24 -0400893 bool mRendered;
894 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100895 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100896 bool CapsLockOn;
thatf6b20662015-06-25 21:51:37 +0200897 int highlightRenderCount;
898 Key* currentKey;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600899 bool hasHighlight, hasCapsHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400900 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600901 COLOR mCapsHighlightColor;
thatf256b722015-05-23 20:44:12 +0200902 COLOR mFontColor; // for centered key labels
903 COLOR mFontColorSmall; // for centered key labels
904 FontResource* mFont; // for main key labels
905 FontResource* mSmallFont; // for key labels like "?123"
906 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200907 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200908 COLOR mLongpressFontColor;
909 COLOR mBackgroundColor; // keyboard background color
910 COLOR mKeyColorAlphanumeric; // key background color
911 COLOR mKeyColorOther; // key background color
912 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400913};
914
915// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100916class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400917{
918public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200919 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400920 virtual ~GUIInput();
921
922public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200923 // Render - Render the full object to the GL surface
924 // Return 0 on success, <0 on error
925 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400926
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200927 // Update - Update any UI component animations (called <= 30 FPS)
928 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
929 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400930
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200931 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100932 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400933
934 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200935 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
936 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400937
938 virtual int NotifyKeyboard(int key);
939
940protected:
941 virtual int GetSelection(int x, int y);
942
943 // Handles displaying the text properly when chars are added, deleted, or for scrolling
944 virtual int HandleTextLocation(int x);
945
946protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200947 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -0400948 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +0100949 ImageResource* mBackground;
950 ImageResource* mCursor;
951 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -0400952 std::string mText;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200953 std::string mLastValue;
Dees_Troy51a0e822012-09-05 15:24:24 -0400954 std::string mVariable;
955 std::string mMask;
956 std::string mMaskVariable;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200957 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400958 COLOR mCursorColor;
959 int scrollingX;
960 int lastX;
961 int mCursorLocation;
962 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
963 int mFontY;
964 unsigned skipChars;
965 unsigned mFontHeight;
966 unsigned CursorWidth;
967 bool mRendered;
968 bool HasMask;
969 bool DrawCursor;
970 bool isLocalChange;
971 bool HasAllowed;
972 bool HasDisabled;
973 std::string AllowedList;
974 std::string DisabledList;
975 unsigned MinLen;
976 unsigned MaxLen;
977};
978
979class HardwareKeyboard
980{
981public:
thatf37aec22015-02-01 13:38:35 +0100982 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400983 virtual ~HardwareKeyboard();
984
985public:
thatf37aec22015-02-01 13:38:35 +0100986 // called by the input handler for key events
987 int KeyDown(int key_code);
988 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100989
thatf37aec22015-02-01 13:38:35 +0100990 // called by the input handler when holding a key down
991 int KeyRepeat();
992
993 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100994 void ConsumeKeyRelease(int key);
995
996private:
thatf37aec22015-02-01 13:38:35 +0100997 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100998 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400999};
1000
Vojtech Bocekede51c52014-02-07 23:58:09 +01001001class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001002{
1003public:
1004 GUISliderValue(xml_node<>* node);
1005 virtual ~GUISliderValue();
1006
1007public:
1008 // Render - Render the full object to the GL surface
1009 // Return 0 on success, <0 on error
1010 virtual int Render(void);
1011
1012 // Update - Update any UI component animations (called <= 30 FPS)
1013 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1014 virtual int Update(void);
1015
1016 // SetPos - Update the position of the render object
1017 // Return 0 on success, <0 on error
1018 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1019
1020 // NotifyTouch - Notify of a touch event
1021 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1022 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1023
1024 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001025 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001026
1027 // SetPageFocus - Notify when a page gains or loses focus
1028 virtual void SetPageFocus(int inFocus);
1029
1030protected:
1031 int measureText(const std::string& str);
1032 int valueFromPct(float pct);
1033 float pctFromValue(int value);
1034 void loadValue(bool force = false);
1035
1036 std::string mVariable;
1037 int mMax;
1038 int mMin;
1039 int mValue;
1040 char *mValueStr;
1041 float mValuePct;
1042 std::string mMaxStr;
1043 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001044 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001045 GUIText* mLabel;
1046 int mLabelW;
1047 COLOR mTextColor;
1048 COLOR mLineColor;
1049 COLOR mSliderColor;
1050 bool mShowRange;
1051 bool mShowCurr;
1052 int mLineX;
1053 int mLineY;
1054 int mLineH;
1055 int mLinePadding;
1056 int mPadding;
1057 int mSliderY;
1058 int mSliderW;
1059 int mSliderH;
1060 bool mRendered;
1061 int mFontHeight;
1062 GUIAction *mAction;
1063 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001064 int mLineW;
1065 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001066 ImageResource *mBackgroundImage;
1067 ImageResource *mHandleImage;
1068 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001069};
1070
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001071class MouseCursor : public RenderObject
1072{
1073public:
1074 MouseCursor(int posX, int posY);
1075 virtual ~MouseCursor();
1076
1077 virtual int Render(void);
1078 virtual int Update(void);
1079 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1080
1081 void Move(int deltaX, int deltaY);
1082 void GetPos(int& x, int& y);
1083 void LoadData(xml_node<>* node);
1084 void ResetData(int resX, int resY);
1085
1086private:
1087 int m_resX;
1088 int m_resY;
1089 bool m_moved;
1090 float m_speedMultiplier;
1091 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001092 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001093 bool m_present;
1094};
1095
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001096class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1097{
1098public:
1099 GUIPatternPassword(xml_node<>* node);
1100 virtual ~GUIPatternPassword();
1101
1102public:
1103 virtual int Render(void);
1104 virtual int Update(void);
1105 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1106 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1107
1108protected:
1109 void CalculateDotPositions();
1110 void ResetActiveDots();
1111 void ConnectDot(int dot_idx);
1112 void ConnectIntermediateDots(int dot_idx);
1113 int InDot(int x, int y);
1114 bool DotUsed(int dot_idx);
1115 static bool IsInRect(int x, int y, int rx, int ry, int rw, int rh);
1116 void PatternDrawn();
1117
1118 struct Dot {
1119 int x;
1120 int y;
1121 bool active;
1122 };
1123
1124 Dot mDots[9];
1125 int mConnectedDots[9];
1126 size_t mConnectedDotsLen;
1127 int mCurLineX;
1128 int mCurLineY;
1129 bool mTrackingTouch;
1130 bool mNeedRender;
1131
1132 COLOR mDotColor;
1133 COLOR mActiveDotColor;
1134 COLOR mLineColor;
1135 ImageResource *mDotImage;
1136 ImageResource *mActiveDotImage;
1137 gr_surface mDotCircle;
1138 gr_surface mActiveDotCircle;
1139 int mDotRadius;
1140 int mLineWidth;
1141
1142 std::string mPassVar;
1143 GUIAction *mAction;
1144 int mUpdate;
1145};
1146
1147
Dees_Troy51a0e822012-09-05 15:24:24 -04001148// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001149xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001150std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1151int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1152int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1153int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001154COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001155COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1156FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1157ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1158AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
1159
Dees_Troy51a0e822012-09-05 15:24:24 -04001160bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, RenderObject::Placement* placement = NULL);
1161
1162#endif // _OBJECTS_HEADER
1163