blob: d5c3b2738f5ece2731ff796ae225011fbe5ac62f [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:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200154 bool isMounted(std::string vol);
155 bool isConditionTrue(Condition* condition);
Vojtech Bocek07220562014-02-08 02:05:33 +0100156
157 bool mConditionsResult;
Dees_Troy51a0e822012-09-05 15:24:24 -0400158};
159
160class InputObject
161{
162public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200163 InputObject() { HasInputFocus = 0; }
164 virtual ~InputObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -0400165
166public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200167 // NotifyKeyboard - Notify of keyboard input
168 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
169 virtual int NotifyKeyboard(int key) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400170
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200171 virtual int SetInputFocus(int focus) { HasInputFocus = focus; return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400172
173protected:
174 int HasInputFocus;
175};
176
177// Derived Objects
178// GUIText - Used for static text
Vojtech Bocekede51c52014-02-07 23:58:09 +0100179class GUIText : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400180{
181public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200182 // w and h may be ignored, in which case, no bounding box is applied
183 GUIText(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400184
185public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200186 // Render - Render the full object to the GL surface
187 // Return 0 on success, <0 on error
188 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400189
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200190 // Update - Update any UI component animations (called <= 30 FPS)
191 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
192 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400193
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200194 // Retrieve the size of the current string (dynamic strings may change per call)
195 virtual int GetCurrentBounds(int& w, int& h);
Dees_Troy51a0e822012-09-05 15:24:24 -0400196
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200197 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100198 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400199
200 // Set maximum width in pixels
201 virtual int SetMaxWidth(unsigned width);
202
203 // Set number of characters to skip (for scrolling)
204 virtual int SkipCharCount(unsigned skip);
205
Dees_Troy4d12f962012-10-19 13:13:15 -0400206public:
207 bool isHighlighted;
208
Dees_Troy51a0e822012-09-05 15:24:24 -0400209protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200210 std::string mText;
211 std::string mLastValue;
212 COLOR mColor;
Dees_Troy4d12f962012-10-19 13:13:15 -0400213 COLOR mHighlightColor;
thatf6ed8fc2015-02-14 20:23:16 +0100214 FontResource* mFont;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200215 int mIsStatic;
216 int mVarChanged;
217 int mFontHeight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400218 unsigned maxWidth;
219 unsigned charSkip;
220
221protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200222 std::string parseText(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400223};
224
225// GUIImage - Used for static image
Vojtech Bocekede51c52014-02-07 23:58:09 +0100226class GUIImage : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400227{
228public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200229 GUIImage(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400230
231public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200232 // Render - Render the full object to the GL surface
233 // Return 0 on success, <0 on error
234 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400235
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200236 // SetRenderPos - Update the position of the object
237 // Return 0 on success, <0 on error
238 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400239
Dees_Troy4d12f962012-10-19 13:13:15 -0400240public:
241 bool isHighlighted;
242
Dees_Troy51a0e822012-09-05 15:24:24 -0400243protected:
thatf6ed8fc2015-02-14 20:23:16 +0100244 ImageResource* mImage;
245 ImageResource* mHighlightImage;
Dees_Troy51a0e822012-09-05 15:24:24 -0400246};
247
248// GUIFill - Used for fill colors
Vojtech Bocekede51c52014-02-07 23:58:09 +0100249class GUIFill : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400250{
251public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200252 GUIFill(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400253
254public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200255 // Render - Render the full object to the GL surface
256 // Return 0 on success, <0 on error
257 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400258
259protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200260 COLOR mColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400261};
262
263// GUIAction - Used for standard actions
Vojtech Bocekede51c52014-02-07 23:58:09 +0100264class GUIAction : public GUIObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400265{
thatc6085482015-01-09 22:12:43 +0100266 friend class ActionThread;
267
Dees_Troy51a0e822012-09-05 15:24:24 -0400268public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200269 GUIAction(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400270
271public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200272 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100273 virtual int NotifyKey(int key, bool down);
Vojtech Bocek07220562014-02-08 02:05:33 +0100274 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
that3f7b1ac2014-12-30 11:30:13 +0100275
276 int doActions();
Dees_Troy51a0e822012-09-05 15:24:24 -0400277
278protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200279 class Action
280 {
281 public:
282 std::string mFunction;
283 std::string mArg;
284 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400285
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200286 std::vector<Action> mActions;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100287 std::map<int, bool> mKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400288
289protected:
that73a52952015-01-28 23:07:34 +0100290 enum ThreadType { THREAD_NONE, THREAD_ACTION, THREAD_CANCEL };
291
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200292 int getKeyByName(std::string key);
that3f7b1ac2014-12-30 11:30:13 +0100293 int doAction(Action action);
that73a52952015-01-28 23:07:34 +0100294 ThreadType getThreadType(const Action& action);
Dees_Troy51a0e822012-09-05 15:24:24 -0400295 void simulate_progress_bar(void);
Ethan Yonker0d47eb52015-01-09 11:23:19 -0600296 int flash_zip(std::string filename, int* wipe_cache);
thatcc8ddca2015-01-03 01:59:36 +0100297 void reinject_after_flash();
Dees_Troy51a0e822012-09-05 15:24:24 -0400298 void operation_start(const string operation_name);
that3f7b1ac2014-12-30 11:30:13 +0100299 void operation_end(const int operation_status);
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +0000300 time_t Start;
that3f7b1ac2014-12-30 11:30:13 +0100301
302 // map action name to function pointer
303 typedef int (GUIAction::*execFunction)(std::string);
304 typedef std::map<std::string, execFunction> mapFunc;
305 static mapFunc mf;
thatc6085482015-01-09 22:12:43 +0100306 static std::set<std::string> setActionsRunningInCallerThread;
that3f7b1ac2014-12-30 11:30:13 +0100307
308 // GUI actions
309 int reboot(std::string arg);
310 int home(std::string arg);
311 int key(std::string arg);
312 int page(std::string arg);
313 int reload(std::string arg);
314 int readBackup(std::string arg);
315 int set(std::string arg);
316 int clear(std::string arg);
317 int mount(std::string arg);
318 int unmount(std::string arg);
319 int restoredefaultsettings(std::string arg);
320 int copylog(std::string arg);
321 int compute(std::string arg);
322 int setguitimezone(std::string arg);
323 int overlay(std::string arg);
324 int queuezip(std::string arg);
325 int cancelzip(std::string arg);
326 int queueclear(std::string arg);
327 int sleep(std::string arg);
328 int appenddatetobackupname(std::string arg);
329 int generatebackupname(std::string arg);
330 int checkpartitionlist(std::string arg);
331 int getpartitiondetails(std::string arg);
332 int screenshot(std::string arg);
333 int setbrightness(std::string arg);
334
thatc6085482015-01-09 22:12:43 +0100335 // (originally) threaded actions
that3f7b1ac2014-12-30 11:30:13 +0100336 int fileexists(std::string arg);
337 int flash(std::string arg);
338 int wipe(std::string arg);
339 int refreshsizes(std::string arg);
340 int nandroid(std::string arg);
341 int fixpermissions(std::string arg);
342 int dd(std::string arg);
343 int partitionsd(std::string arg);
344 int installhtcdumlock(std::string arg);
345 int htcdumlockrestoreboot(std::string arg);
346 int htcdumlockreflashrecovery(std::string arg);
347 int cmd(std::string arg);
348 int terminalcommand(std::string arg);
349 int killterminal(std::string arg);
350 int reinjecttwrp(std::string arg);
351 int checkbackupname(std::string arg);
352 int decrypt(std::string arg);
353 int adbsideload(std::string arg);
354 int adbsideloadcancel(std::string arg);
355 int openrecoveryscript(std::string arg);
356 int installsu(std::string arg);
357 int fixsu(std::string arg);
358 int decrypt_backup(std::string arg);
359 int repair(std::string arg);
360 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);
that3f7b1ac2014-12-30 11:30:13 +0100365
366 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400367};
368
Vojtech Bocekede51c52014-02-07 23:58:09 +0100369class GUIConsole : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400370{
371public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200372 GUIConsole(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400373
374public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200375 // Render - Render the full object to the GL surface
376 // Return 0 on success, <0 on error
377 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400378
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200379 // Update - Update any UI component animations (called <= 30 FPS)
380 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
381 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400382
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200383 // SetRenderPos - Update the position of the object
384 // Return 0 on success, <0 on error
385 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400386
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200387 // IsInRegion - Checks if the request is handled by this object
thatf8194e22015-01-29 01:05:01 +0100388 // Return 1 if this object handles the request, 0 if not
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200389 virtual int IsInRegion(int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400390
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200391 // NotifyTouch - Notify of a touch event
392 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
393 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400394
395protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200396 enum SlideoutState
397 {
398 hidden = 0,
399 visible,
400 request_hide,
401 request_show
402 };
403
thatf6ed8fc2015-02-14 20:23:16 +0100404 FontResource* mFont;
405 ImageResource* mSlideoutImage;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200406 COLOR mForegroundColor;
407 COLOR mBackgroundColor;
408 COLOR mScrollColor;
that05360ba2015-02-06 00:58:16 +0100409 int mFontHeight;
410 int mCurrentLine; // index of last line to show; -1 to keep tracking last line
411 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
412 size_t RenderCount; // total number of lines after wrapping
413 int mMaxRows; // height of console in text rows
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200414 int mStartY;
415 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
416 int mSlideinX, mSlideinY, mSlideinW, mSlideinH;
417 int mConsoleX, mConsoleY, mConsoleW, mConsoleH;
418 int mLastTouchX, mLastTouchY;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200419 int mSlideout;
420 SlideoutState mSlideoutState;
Dees Troy31218ec2014-02-25 20:35:56 +0000421 std::vector<std::string> rConsole;
Ethan Yonkerbf2cb1c2014-07-02 10:15:54 -0500422 std::vector<std::string> rConsoleColor;
Dees Troy31218ec2014-02-25 20:35:56 +0000423 bool mRender;
Dees_Troy51a0e822012-09-05 15:24:24 -0400424
425protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200426 virtual int RenderSlideout(void);
427 virtual int RenderConsole(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400428};
429
Vojtech Bocekede51c52014-02-07 23:58:09 +0100430class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400431{
432public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200433 GUIButton(xml_node<>* node);
434 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400435
436public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200437 // Render - Render the full object to the GL surface
438 // Return 0 on success, <0 on error
439 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400440
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200441 // Update - Update any UI component animations (called <= 30 FPS)
442 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
443 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400444
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200445 // SetPos - Update the position of the render object
446 // Return 0 on success, <0 on error
447 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400448
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200449 // NotifyTouch - Notify of a touch event
450 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
451 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400452
453protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200454 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100455 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200456 GUIText* mButtonLabel;
457 GUIAction* mAction;
458 int mTextX, mTextY, mTextW, mTextH;
459 int mIconX, mIconY, mIconW, mIconH;
460 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600461 bool hasHighlightColor;
462 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500463 bool hasFill;
464 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600465 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000466 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400467};
468
Vojtech Bocekede51c52014-02-07 23:58:09 +0100469class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400470{
471public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200472 GUICheckbox(xml_node<>* node);
473 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400474
475public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200476 // Render - Render the full object to the GL surface
477 // Return 0 on success, <0 on error
478 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400479
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200480 // Update - Update any UI component animations (called <= 30 FPS)
481 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
482 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400483
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200484 // SetPos - Update the position of the render object
485 // Return 0 on success, <0 on error
486 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400487
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200488 // NotifyTouch - Notify of a touch event
489 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
490 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400491
492protected:
thatf6ed8fc2015-02-14 20:23:16 +0100493 ImageResource* mChecked;
494 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200495 GUIText* mLabel;
496 int mTextX, mTextY;
497 int mCheckX, mCheckY, mCheckW, mCheckH;
498 int mLastState;
499 bool mRendered;
500 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400501};
502
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100503class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400504{
505public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100506 GUIScrollList(xml_node<>* node);
507 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400508
509public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200510 // Render - Render the full object to the GL surface
511 // Return 0 on success, <0 on error
512 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400513
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200514 // Update - Update any UI component animations (called <= 30 FPS)
515 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
516 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400517
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200518 // NotifyTouch - Notify of a touch event
519 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
520 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400521
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200522 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100523 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400524
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200525 // SetPos - Update the position of the render object
526 // Return 0 on success, <0 on error
527 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400528
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200529 // SetPageFocus - Notify when a page gains or loses focus
530 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400531
532protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100533 // derived classes need to implement these
534 // get number of items
535 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100536 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
537 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100538 // an item was selected
539 virtual void NotifySelect(size_t item_selected) {}
540
that0af77952015-02-25 08:52:19 +0100541 // render a standard-layout list item with optional icon and text
542 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
543
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100544 enum { NO_ITEM = (size_t)-1 };
545 // returns item index at coordinates or NO_ITEM if there is no item there
546 size_t HitTestItem(int x, int y);
547
548 // 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
549 void SetMaxIconSize(int w, int h);
550
551 // This will make sure that the item indicated by list_index is visible on the screen
552 void SetVisibleListLocation(size_t list_index);
553
554 // Handle scrolling changes for drags and kinetic scrolling
555 void HandleScrolling();
556
that9876ac32015-02-15 21:40:59 +0100557 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100558 int GetDisplayItemCount();
559
560 // Returns the size in pixels of a partial item or row size
561 int GetDisplayRemainder();
562
563protected:
564 // Background
565 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100566 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100567
568 // Header
569 COLOR mHeaderBackgroundColor;
570 COLOR mHeaderFontColor;
571 std::string mHeaderText; // Original header text without parsing any variables
572 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100573 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100574 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100575 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100576 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
577 int mHeaderSeparatorH; // Height of the separator between header and list items
578 COLOR mHeaderSeparatorColor; // color of the header separator
579
580 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100581 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100582 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100583 bool hasHighlightColor; // indicates if a highlight color was set
584 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100585 COLOR mFontHighlightColor;
586 int mFontHeight;
587 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
588 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
589 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
590 int mSeparatorH; // Height of the separator between items
591 COLOR mSeparatorColor; // color of the separator that is between items
592
thata9998212015-02-19 22:51:24 +0100593 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100594 int mFastScrollW; // width of the fastscroll area
595 int mFastScrollLineW; // width of the line for fastscroll rendering
596 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100597 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100598 COLOR mFastScrollLineColor;
599 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100600
601 // Scrolling and dynamic state
602 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
603 int mFastScrollRectCurrentH; // current height of fastscroll rect
604 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100605 bool hasScroll; // indicates that we have enough items in the list to scroll
606 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
607 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
608 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
609 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
610 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
611 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
612 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
613 int mUpdate; // indicates that a change took place and we need to re-render
614};
615
616class GUIFileSelector : public GUIScrollList
617{
618public:
619 GUIFileSelector(xml_node<>* node);
620 virtual ~GUIFileSelector();
621
622public:
623 // Update - Update any UI component animations (called <= 30 FPS)
624 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
625 virtual int Update(void);
626
627 // NotifyVarChange - Notify of a variable change
628 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
629
630 // SetPageFocus - Notify when a page gains or loses focus
631 virtual void SetPageFocus(int inFocus);
632
633 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100634 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100635 virtual void NotifySelect(size_t item_selected);
636
637protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200638 struct FileData {
639 std::string fileName;
640 unsigned char fileType; // Uses d_type format from struct dirent
641 mode_t protection; // Uses mode_t format from stat
642 uid_t userId;
643 gid_t groupId;
644 off_t fileSize;
645 time_t lastAccess; // Uses time_t format from stat
646 time_t lastModified; // Uses time_t format from stat
647 time_t lastStatChange; // Uses time_t format from stat
648 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400649
650protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200651 virtual int GetFileList(const std::string folder);
652 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400653
654protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200655 std::vector<FileData> mFolderList;
656 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100657 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600658 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100659 std::string mExtn; // used for filtering the file list, for example, *.zip
660 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
661 std::string mSortVariable; // data manager variable used to change the sorting of files
662 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
663 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
664 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)
665 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100666 ImageResource* mFolderIcon;
667 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600668 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400669};
670
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100671class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400672{
673public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200674 GUIListBox(xml_node<>* node);
675 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400676
677public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200678 // Update - Update any UI component animations (called <= 30 FPS)
679 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
680 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400681
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200682 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100683 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400684
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200685 // SetPageFocus - Notify when a page gains or loses focus
686 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400687
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100688 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100689 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100690 virtual void NotifySelect(size_t item_selected);
691
Dees_Troy51a0e822012-09-05 15:24:24 -0400692protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200693 struct ListData {
694 std::string displayName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400695 std::string variableValue;
696 unsigned int selected;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200697 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400698
699protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200700 std::vector<ListData> mList;
701 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400702 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100703 ImageResource* mIconSelected;
704 ImageResource* mIconUnselected;
Dees_Troy51a0e822012-09-05 15:24:24 -0400705};
706
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100707class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500708{
709public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200710 GUIPartitionList(xml_node<>* node);
711 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500712
713public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200714 // Update - Update any UI component animations (called <= 30 FPS)
715 // 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 +0100716 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500717
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200718 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100719 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500720
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200721 // SetPageFocus - Notify when a page gains or loses focus
722 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500723
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100724 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100725 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100726 virtual void NotifySelect(size_t item_selected);
727
Dees_Troya13d74f2013-03-24 08:54:55 -0500728protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100729 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600730 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500731
732protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200733 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500734 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200735 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500736 std::string selectedList;
737 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500738 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100739 ImageResource* mIconSelected;
740 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500741 bool updateList;
742};
743
Dees_Troy51a0e822012-09-05 15:24:24 -0400744// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100745class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400746{
747public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200748 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400749
750public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200751 // Render - Render the full object to the GL surface
752 // Return 0 on success, <0 on error
753 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400754
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200755 // Update - Update any UI component animations (called <= 30 FPS)
756 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
757 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400758
759protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200760 AnimationResource* mAnimation;
761 int mFrame;
762 int mFPS;
763 int mLoop;
764 int mRender;
765 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400766};
767
Vojtech Bocekede51c52014-02-07 23:58:09 +0100768class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400769{
770public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200771 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400772
773public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200774 // Render - Render the full object to the GL surface
775 // Return 0 on success, <0 on error
776 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400777
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200778 // Update - Update any UI component animations (called <= 30 FPS)
779 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
780 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400781
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200782 // NotifyVarChange - Notify of a variable change
783 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100784 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400785
786protected:
thatf6ed8fc2015-02-14 20:23:16 +0100787 ImageResource* mEmptyBar;
788 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200789 std::string mMinValVar;
790 std::string mMaxValVar;
791 std::string mCurValVar;
792 float mSlide;
793 float mSlideInc;
794 int mSlideFrames;
795 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400796
797protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200798 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400799};
800
Vojtech Bocekede51c52014-02-07 23:58:09 +0100801class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400802{
803public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200804 GUISlider(xml_node<>* node);
805 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400806
807public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200808 // Render - Render the full object to the GL surface
809 // Return 0 on success, <0 on error
810 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400811
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200812 // Update - Update any UI component animations (called <= 30 FPS)
813 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
814 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400815
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200816 // NotifyTouch - Notify of a touch event
817 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
818 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400819
820protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200821 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600822 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100823 ImageResource* sSlider;
824 ImageResource* sSliderUsed;
825 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200826 int sTouchW, sTouchH;
827 int sCurTouchX;
828 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400829};
830
831#define MAX_KEYBOARD_LAYOUTS 5
832#define MAX_KEYBOARD_ROWS 9
833#define MAX_KEYBOARD_KEYS 20
834#define KEYBOARD_ACTION 253
835#define KEYBOARD_LAYOUT 254
836#define KEYBOARD_SWIPE_LEFT 252
837#define KEYBOARD_SWIPE_RIGHT 251
838#define KEYBOARD_ARROW_LEFT 250
839#define KEYBOARD_ARROW_RIGHT 249
840#define KEYBOARD_HOME 248
841#define KEYBOARD_END 247
842#define KEYBOARD_ARROW_UP 246
843#define KEYBOARD_ARROW_DOWN 245
844#define KEYBOARD_SPECIAL_KEYS 245
845#define KEYBOARD_BACKSPACE 8
846
Vojtech Bocekede51c52014-02-07 23:58:09 +0100847class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400848{
849public:
850 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200851 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400852
853public:
854 virtual int Render(void);
855 virtual int Update(void);
856 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
857 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
858
859protected:
860 virtual int GetSelection(int x, int y);
861
862protected:
863 struct keyboard_key_class
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200864 {
865 unsigned char key;
Dees_Troy51a0e822012-09-05 15:24:24 -0400866 unsigned char longpresskey;
that1a7ba972015-02-01 19:48:19 +0100867 int end_x;
868 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200869 };
that1a7ba972015-02-01 19:48:19 +0100870 int ParseKey(const char* keyinfo, keyboard_key_class& key, int& Xindex, int keyWidth, bool longpress);
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600871 struct capslock_tracking_struct
872 {
873 int capslock;
874 int set_capslock;
875 int revert_layout;
876 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400877
thatf6ed8fc2015-02-14 20:23:16 +0100878 ImageResource* keyboardImg[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400879 struct keyboard_key_class keyboard_keys[MAX_KEYBOARD_LAYOUTS][MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600880 struct capslock_tracking_struct caps_tracking[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400881 bool mRendered;
882 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100883 int currentLayout;
884 int row_heights[MAX_KEYBOARD_LAYOUTS][MAX_KEYBOARD_ROWS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400885 unsigned int KeyboardWidth, KeyboardHeight;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600886 int rowY, colX, highlightRenderCount;
887 bool hasHighlight, hasCapsHighlight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400888 GUIAction* mAction;
Dees_Troy30b962e2012-10-19 20:48:59 -0400889 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600890 COLOR mCapsHighlightColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400891};
892
893// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100894class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400895{
896public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200897 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400898 virtual ~GUIInput();
899
900public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200901 // Render - Render the full object to the GL surface
902 // Return 0 on success, <0 on error
903 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400904
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200905 // Update - Update any UI component animations (called <= 30 FPS)
906 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
907 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400908
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200909 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100910 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400911
912 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200913 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
914 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400915
916 virtual int NotifyKeyboard(int key);
917
918protected:
919 virtual int GetSelection(int x, int y);
920
921 // Handles displaying the text properly when chars are added, deleted, or for scrolling
922 virtual int HandleTextLocation(int x);
923
924protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200925 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -0400926 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +0100927 ImageResource* mBackground;
928 ImageResource* mCursor;
929 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -0400930 std::string mText;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200931 std::string mLastValue;
Dees_Troy51a0e822012-09-05 15:24:24 -0400932 std::string mVariable;
933 std::string mMask;
934 std::string mMaskVariable;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200935 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400936 COLOR mCursorColor;
937 int scrollingX;
938 int lastX;
939 int mCursorLocation;
940 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
941 int mFontY;
942 unsigned skipChars;
943 unsigned mFontHeight;
944 unsigned CursorWidth;
945 bool mRendered;
946 bool HasMask;
947 bool DrawCursor;
948 bool isLocalChange;
949 bool HasAllowed;
950 bool HasDisabled;
951 std::string AllowedList;
952 std::string DisabledList;
953 unsigned MinLen;
954 unsigned MaxLen;
955};
956
957class HardwareKeyboard
958{
959public:
thatf37aec22015-02-01 13:38:35 +0100960 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400961 virtual ~HardwareKeyboard();
962
963public:
thatf37aec22015-02-01 13:38:35 +0100964 // called by the input handler for key events
965 int KeyDown(int key_code);
966 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100967
thatf37aec22015-02-01 13:38:35 +0100968 // called by the input handler when holding a key down
969 int KeyRepeat();
970
971 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100972 void ConsumeKeyRelease(int key);
973
974private:
thatf37aec22015-02-01 13:38:35 +0100975 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100976 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400977};
978
Vojtech Bocekede51c52014-02-07 23:58:09 +0100979class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +0200980{
981public:
982 GUISliderValue(xml_node<>* node);
983 virtual ~GUISliderValue();
984
985public:
986 // Render - Render the full object to the GL surface
987 // Return 0 on success, <0 on error
988 virtual int Render(void);
989
990 // Update - Update any UI component animations (called <= 30 FPS)
991 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
992 virtual int Update(void);
993
994 // SetPos - Update the position of the render object
995 // Return 0 on success, <0 on error
996 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
997
998 // NotifyTouch - Notify of a touch event
999 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1000 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1001
1002 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001003 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001004
1005 // SetPageFocus - Notify when a page gains or loses focus
1006 virtual void SetPageFocus(int inFocus);
1007
1008protected:
1009 int measureText(const std::string& str);
1010 int valueFromPct(float pct);
1011 float pctFromValue(int value);
1012 void loadValue(bool force = false);
1013
1014 std::string mVariable;
1015 int mMax;
1016 int mMin;
1017 int mValue;
1018 char *mValueStr;
1019 float mValuePct;
1020 std::string mMaxStr;
1021 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001022 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001023 GUIText* mLabel;
1024 int mLabelW;
1025 COLOR mTextColor;
1026 COLOR mLineColor;
1027 COLOR mSliderColor;
1028 bool mShowRange;
1029 bool mShowCurr;
1030 int mLineX;
1031 int mLineY;
1032 int mLineH;
1033 int mLinePadding;
1034 int mPadding;
1035 int mSliderY;
1036 int mSliderW;
1037 int mSliderH;
1038 bool mRendered;
1039 int mFontHeight;
1040 GUIAction *mAction;
1041 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001042 int mLineW;
1043 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001044 ImageResource *mBackgroundImage;
1045 ImageResource *mHandleImage;
1046 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001047};
1048
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001049class MouseCursor : public RenderObject
1050{
1051public:
1052 MouseCursor(int posX, int posY);
1053 virtual ~MouseCursor();
1054
1055 virtual int Render(void);
1056 virtual int Update(void);
1057 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1058
1059 void Move(int deltaX, int deltaY);
1060 void GetPos(int& x, int& y);
1061 void LoadData(xml_node<>* node);
1062 void ResetData(int resX, int resY);
1063
1064private:
1065 int m_resX;
1066 int m_resY;
1067 bool m_moved;
1068 float m_speedMultiplier;
1069 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001070 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001071 bool m_present;
1072};
1073
Dees_Troy51a0e822012-09-05 15:24:24 -04001074// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001075xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001076std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1077int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1078int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1079int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001080COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001081COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1082FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1083ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1084AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
1085
Dees_Troy51a0e822012-09-05 15:24:24 -04001086bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, RenderObject::Placement* placement = NULL);
1087
1088#endif // _OBJECTS_HEADER
1089