blob: 73d8717d5464f7b3dd82f16045b8af1487a6a7c3 [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"
Ethan Yonkerb7a54a32015-10-05 10:16:27 -050037#include "placement.h"
Dees_Troy51a0e822012-09-05 15:24:24 -040038
Ethan Yonker751a85e2014-12-12 16:59:10 -060039#ifndef TW_X_OFFSET
40#define TW_X_OFFSET 0
41#endif
42#ifndef TW_Y_OFFSET
43#define TW_Y_OFFSET 0
44#endif
45
Dees_Troy51a0e822012-09-05 15:24:24 -040046class RenderObject
47{
48public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020049 RenderObject() { mRenderX = 0; mRenderY = 0; mRenderW = 0; mRenderH = 0; mPlacement = TOP_LEFT; }
50 virtual ~RenderObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -040051
52public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020053 // Render - Render the full object to the GL surface
54 // Return 0 on success, <0 on error
55 virtual int Render(void) = 0;
Dees_Troy51a0e822012-09-05 15:24:24 -040056
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020057 // Update - Update any UI component animations (called <= 30 FPS)
58 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
59 virtual int Update(void) { return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040060
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020061 // GetRenderPos - Returns the current position of the object
62 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 -040063
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020064 // SetRenderPos - Update the position of the object
65 // Return 0 on success, <0 on error
66 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 -040067
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020068 // GetPlacement - Returns the current placement
69 virtual int GetPlacement(Placement& placement) { placement = mPlacement; return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040070
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020071 // SetPlacement - Update the current placement
72 virtual int SetPlacement(Placement placement) { mPlacement = placement; return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040073
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020074 // SetPageFocus - Notify when a page gains or loses focus
Ethan Yonkerd0514ba2015-10-22 14:17:47 -050075 virtual void SetPageFocus(int inFocus __unused) { return; }
Dees_Troy51a0e822012-09-05 15:24:24 -040076
77protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020078 int mRenderX, mRenderY, mRenderW, mRenderH;
79 Placement mPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -040080};
81
82class ActionObject
83{
84public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020085 ActionObject() { mActionX = 0; mActionY = 0; mActionW = 0; mActionH = 0; }
86 virtual ~ActionObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -040087
88public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020089 // NotifyTouch - Notify of a touch event
90 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
Ethan Yonkerd0514ba2015-10-22 14:17:47 -050091 virtual int NotifyTouch(TOUCH_STATE state __unused, int x __unused, int y __unused) { return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040092
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020093 // NotifyKey - Notify of a key press
94 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
Ethan Yonkerd0514ba2015-10-22 14:17:47 -050095 virtual int NotifyKey(int key __unused, bool down __unused) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -040096
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020097 // GetRenderPos - Returns the current position of the object
98 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 -040099
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200100 // SetRenderPos - Update the position of the object
101 // Return 0 on success, <0 on error
102 virtual int SetActionPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400103
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200104 // IsInRegion - Checks if the request is handled by this object
thatf8194e22015-01-29 01:05:01 +0100105 // Return 1 if this object handles the request, 0 if not
106 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 -0400107
Dees_Troy51a0e822012-09-05 15:24:24 -0400108protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200109 int mActionX, mActionY, mActionW, mActionH;
Dees_Troy51a0e822012-09-05 15:24:24 -0400110};
111
Vojtech Bocekede51c52014-02-07 23:58:09 +0100112class GUIObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400113{
114public:
Vojtech Bocekede51c52014-02-07 23:58:09 +0100115 GUIObject(xml_node<>* node);
116 virtual ~GUIObject();
Dees_Troy51a0e822012-09-05 15:24:24 -0400117
118public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200119 bool IsConditionVariable(std::string var);
120 bool isConditionTrue();
121 bool isConditionValid();
Vojtech Bocek07220562014-02-08 02:05:33 +0100122
123 // NotifyVarChange - Notify of a variable change
124 // Returns 0 on success, <0 on error
125 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400126
127protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200128 class Condition
129 {
130 public:
Vojtech Bocek07220562014-02-08 02:05:33 +0100131 Condition() {
132 mLastResult = true;
133 }
134
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200135 std::string mVar1;
136 std::string mVar2;
137 std::string mCompareOp;
138 std::string mLastVal;
Vojtech Bocek07220562014-02-08 02:05:33 +0100139 bool mLastResult;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200140 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400141
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200142 std::vector<Condition> mConditions;
Dees_Troy51a0e822012-09-05 15:24:24 -0400143
144protected:
that20fb95d2015-09-12 11:27:47 +0200145 static void LoadConditions(xml_node<>* node, std::vector<Condition>& conditions);
146 static bool isMounted(std::string vol);
147 static bool isConditionTrue(Condition* condition);
148 static bool UpdateConditions(std::vector<Condition>& conditions, const std::string& varName);
Vojtech Bocek07220562014-02-08 02:05:33 +0100149
150 bool mConditionsResult;
Dees_Troy51a0e822012-09-05 15:24:24 -0400151};
152
153class InputObject
154{
155public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200156 InputObject() { HasInputFocus = 0; }
157 virtual ~InputObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -0400158
159public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200160 // NotifyKeyboard - Notify of keyboard input
161 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500162 virtual int NotifyKeyboard(int key __unused) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400163
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200164 virtual int SetInputFocus(int focus) { HasInputFocus = focus; return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400165
166protected:
167 int HasInputFocus;
168};
169
170// Derived Objects
171// GUIText - Used for static text
Vojtech Bocekede51c52014-02-07 23:58:09 +0100172class GUIText : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400173{
174public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200175 // w and h may be ignored, in which case, no bounding box is applied
176 GUIText(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400177
178public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200179 // Render - Render the full object to the GL surface
180 // Return 0 on success, <0 on error
181 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400182
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200183 // Update - Update any UI component animations (called <= 30 FPS)
184 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
185 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400186
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200187 // Retrieve the size of the current string (dynamic strings may change per call)
188 virtual int GetCurrentBounds(int& w, int& h);
Dees_Troy51a0e822012-09-05 15:24:24 -0400189
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200190 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100191 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400192
193 // Set maximum width in pixels
194 virtual int SetMaxWidth(unsigned width);
195
196 // Set number of characters to skip (for scrolling)
197 virtual int SkipCharCount(unsigned skip);
198
Dees_Troy4d12f962012-10-19 13:13:15 -0400199public:
200 bool isHighlighted;
Ethan Yonkerb7a54a32015-10-05 10:16:27 -0500201 bool scaleWidth;
202 unsigned maxWidth;
Dees_Troy4d12f962012-10-19 13:13:15 -0400203
Dees_Troy51a0e822012-09-05 15:24:24 -0400204protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200205 std::string mText;
206 std::string mLastValue;
207 COLOR mColor;
Dees_Troy4d12f962012-10-19 13:13:15 -0400208 COLOR mHighlightColor;
thatf6ed8fc2015-02-14 20:23:16 +0100209 FontResource* mFont;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200210 int mIsStatic;
211 int mVarChanged;
212 int mFontHeight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400213 unsigned charSkip;
Dees_Troy51a0e822012-09-05 15:24:24 -0400214};
215
216// GUIImage - Used for static image
Vojtech Bocekede51c52014-02-07 23:58:09 +0100217class GUIImage : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400218{
219public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200220 GUIImage(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400221
222public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200223 // Render - Render the full object to the GL surface
224 // Return 0 on success, <0 on error
225 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400226
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200227 // SetRenderPos - Update the position of the object
228 // Return 0 on success, <0 on error
229 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400230
Dees_Troy4d12f962012-10-19 13:13:15 -0400231public:
232 bool isHighlighted;
233
Dees_Troy51a0e822012-09-05 15:24:24 -0400234protected:
thatf6ed8fc2015-02-14 20:23:16 +0100235 ImageResource* mImage;
236 ImageResource* mHighlightImage;
Dees_Troy51a0e822012-09-05 15:24:24 -0400237};
238
239// GUIFill - Used for fill colors
Vojtech Bocekede51c52014-02-07 23:58:09 +0100240class GUIFill : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400241{
242public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200243 GUIFill(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400244
245public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200246 // Render - Render the full object to the GL surface
247 // Return 0 on success, <0 on error
248 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400249
250protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200251 COLOR mColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400252};
253
254// GUIAction - Used for standard actions
Vojtech Bocekede51c52014-02-07 23:58:09 +0100255class GUIAction : public GUIObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400256{
thatc6085482015-01-09 22:12:43 +0100257 friend class ActionThread;
258
Dees_Troy51a0e822012-09-05 15:24:24 -0400259public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200260 GUIAction(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400261
262public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200263 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100264 virtual int NotifyKey(int key, bool down);
Vojtech Bocek07220562014-02-08 02:05:33 +0100265 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
that3f7b1ac2014-12-30 11:30:13 +0100266
267 int doActions();
Dees_Troy51a0e822012-09-05 15:24:24 -0400268
269protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200270 class Action
271 {
272 public:
273 std::string mFunction;
274 std::string mArg;
275 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400276
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200277 std::vector<Action> mActions;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100278 std::map<int, bool> mKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400279
280protected:
that73a52952015-01-28 23:07:34 +0100281 enum ThreadType { THREAD_NONE, THREAD_ACTION, THREAD_CANCEL };
282
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200283 int getKeyByName(std::string key);
that3f7b1ac2014-12-30 11:30:13 +0100284 int doAction(Action action);
that73a52952015-01-28 23:07:34 +0100285 ThreadType getThreadType(const Action& action);
Dees_Troy51a0e822012-09-05 15:24:24 -0400286 void simulate_progress_bar(void);
Ethan Yonker0d47eb52015-01-09 11:23:19 -0600287 int flash_zip(std::string filename, int* wipe_cache);
thatcc8ddca2015-01-03 01:59:36 +0100288 void reinject_after_flash();
Dees_Troy51a0e822012-09-05 15:24:24 -0400289 void operation_start(const string operation_name);
that3f7b1ac2014-12-30 11:30:13 +0100290 void operation_end(const int operation_status);
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +0000291 time_t Start;
that3f7b1ac2014-12-30 11:30:13 +0100292
293 // map action name to function pointer
294 typedef int (GUIAction::*execFunction)(std::string);
295 typedef std::map<std::string, execFunction> mapFunc;
296 static mapFunc mf;
thatc6085482015-01-09 22:12:43 +0100297 static std::set<std::string> setActionsRunningInCallerThread;
that3f7b1ac2014-12-30 11:30:13 +0100298
299 // GUI actions
300 int reboot(std::string arg);
301 int home(std::string arg);
302 int key(std::string arg);
303 int page(std::string arg);
304 int reload(std::string arg);
305 int readBackup(std::string arg);
306 int set(std::string arg);
307 int clear(std::string arg);
308 int mount(std::string arg);
309 int unmount(std::string arg);
310 int restoredefaultsettings(std::string arg);
311 int copylog(std::string arg);
312 int compute(std::string arg);
313 int setguitimezone(std::string arg);
314 int overlay(std::string arg);
315 int queuezip(std::string arg);
316 int cancelzip(std::string arg);
317 int queueclear(std::string arg);
318 int sleep(std::string arg);
319 int appenddatetobackupname(std::string arg);
320 int generatebackupname(std::string arg);
321 int checkpartitionlist(std::string arg);
322 int getpartitiondetails(std::string arg);
323 int screenshot(std::string arg);
324 int setbrightness(std::string arg);
325
thatc6085482015-01-09 22:12:43 +0100326 // (originally) threaded actions
that3f7b1ac2014-12-30 11:30:13 +0100327 int fileexists(std::string arg);
328 int flash(std::string arg);
329 int wipe(std::string arg);
330 int refreshsizes(std::string arg);
331 int nandroid(std::string arg);
332 int fixpermissions(std::string arg);
333 int dd(std::string arg);
334 int partitionsd(std::string arg);
335 int installhtcdumlock(std::string arg);
336 int htcdumlockrestoreboot(std::string arg);
337 int htcdumlockreflashrecovery(std::string arg);
338 int cmd(std::string arg);
339 int terminalcommand(std::string arg);
340 int killterminal(std::string arg);
341 int reinjecttwrp(std::string arg);
342 int checkbackupname(std::string arg);
343 int decrypt(std::string arg);
344 int adbsideload(std::string arg);
345 int adbsideloadcancel(std::string arg);
346 int openrecoveryscript(std::string arg);
347 int installsu(std::string arg);
348 int fixsu(std::string arg);
349 int decrypt_backup(std::string arg);
350 int repair(std::string arg);
Ethan Yonkera2719152015-05-28 09:44:41 -0500351 int resize(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100352 int changefilesystem(std::string arg);
353 int startmtp(std::string arg);
354 int stopmtp(std::string arg);
Ethan Yonker96af84a2015-01-05 14:58:36 -0600355 int flashimage(std::string arg);
bigbiff7abc5fe2015-01-17 16:53:12 -0500356 int cancelbackup(std::string arg);
Ethan Yonkereb32b1f2015-05-18 10:23:03 -0500357 int checkpartitionlifetimewrites(std::string arg);
358 int mountsystemtoggle(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100359
360 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400361};
362
Vojtech Bocekede51c52014-02-07 23:58:09 +0100363class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400364{
365public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200366 GUIButton(xml_node<>* node);
367 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400368
369public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200370 // Render - Render the full object to the GL surface
371 // Return 0 on success, <0 on error
372 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400373
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200374 // Update - Update any UI component animations (called <= 30 FPS)
375 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
376 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400377
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200378 // SetPos - Update the position of the render object
379 // Return 0 on success, <0 on error
380 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400381
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200382 // NotifyTouch - Notify of a touch event
383 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
384 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400385
386protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200387 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100388 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200389 GUIText* mButtonLabel;
390 GUIAction* mAction;
391 int mTextX, mTextY, mTextW, mTextH;
392 int mIconX, mIconY, mIconW, mIconH;
393 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600394 bool hasHighlightColor;
395 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500396 bool hasFill;
397 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600398 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000399 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400400};
401
Vojtech Bocekede51c52014-02-07 23:58:09 +0100402class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400403{
404public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200405 GUICheckbox(xml_node<>* node);
406 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400407
408public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200409 // Render - Render the full object to the GL surface
410 // Return 0 on success, <0 on error
411 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400412
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200413 // Update - Update any UI component animations (called <= 30 FPS)
414 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
415 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400416
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200417 // SetPos - Update the position of the render object
418 // Return 0 on success, <0 on error
419 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400420
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200421 // NotifyTouch - Notify of a touch event
422 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
423 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400424
425protected:
thatf6ed8fc2015-02-14 20:23:16 +0100426 ImageResource* mChecked;
427 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200428 GUIText* mLabel;
429 int mTextX, mTextY;
430 int mCheckX, mCheckY, mCheckW, mCheckH;
431 int mLastState;
432 bool mRendered;
433 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400434};
435
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100436class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400437{
438public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100439 GUIScrollList(xml_node<>* node);
440 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400441
442public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200443 // Render - Render the full object to the GL surface
444 // Return 0 on success, <0 on error
445 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400446
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200447 // Update - Update any UI component animations (called <= 30 FPS)
448 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
449 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400450
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200451 // NotifyTouch - Notify of a touch event
452 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
453 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400454
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200455 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100456 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400457
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200458 // SetPos - Update the position of the render object
459 // Return 0 on success, <0 on error
460 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400461
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200462 // SetPageFocus - Notify when a page gains or loses focus
463 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400464
465protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100466 // derived classes need to implement these
467 // get number of items
468 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100469 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
470 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100471 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500472 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100473
that0af77952015-02-25 08:52:19 +0100474 // render a standard-layout list item with optional icon and text
475 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
476
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100477 enum { NO_ITEM = (size_t)-1 };
478 // returns item index at coordinates or NO_ITEM if there is no item there
479 size_t HitTestItem(int x, int y);
480
481 // 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
482 void SetMaxIconSize(int w, int h);
483
484 // This will make sure that the item indicated by list_index is visible on the screen
485 void SetVisibleListLocation(size_t list_index);
486
487 // Handle scrolling changes for drags and kinetic scrolling
488 void HandleScrolling();
489
that9876ac32015-02-15 21:40:59 +0100490 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100491 int GetDisplayItemCount();
492
493 // Returns the size in pixels of a partial item or row size
494 int GetDisplayRemainder();
495
496protected:
497 // Background
498 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100499 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100500
501 // Header
502 COLOR mHeaderBackgroundColor;
503 COLOR mHeaderFontColor;
504 std::string mHeaderText; // Original header text without parsing any variables
505 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100506 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100507 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100508 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100509 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
510 int mHeaderSeparatorH; // Height of the separator between header and list items
511 COLOR mHeaderSeparatorColor; // color of the header separator
512
513 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100514 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100515 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100516 bool hasHighlightColor; // indicates if a highlight color was set
517 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100518 COLOR mFontHighlightColor;
519 int mFontHeight;
520 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
521 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
522 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
523 int mSeparatorH; // Height of the separator between items
524 COLOR mSeparatorColor; // color of the separator that is between items
525
thata9998212015-02-19 22:51:24 +0100526 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100527 int mFastScrollW; // width of the fastscroll area
528 int mFastScrollLineW; // width of the line for fastscroll rendering
529 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100530 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100531 COLOR mFastScrollLineColor;
532 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100533
534 // Scrolling and dynamic state
535 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
536 int mFastScrollRectCurrentH; // current height of fastscroll rect
537 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100538 bool hasScroll; // indicates that we have enough items in the list to scroll
539 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
540 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
541 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 +0100542 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 +0100543 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
544 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
545 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
546 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
547 int mUpdate; // indicates that a change took place and we need to re-render
548};
549
550class GUIFileSelector : public GUIScrollList
551{
552public:
553 GUIFileSelector(xml_node<>* node);
554 virtual ~GUIFileSelector();
555
556public:
557 // Update - Update any UI component animations (called <= 30 FPS)
558 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
559 virtual int Update(void);
560
561 // NotifyVarChange - Notify of a variable change
562 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
563
564 // SetPageFocus - Notify when a page gains or loses focus
565 virtual void SetPageFocus(int inFocus);
566
567 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100568 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100569 virtual void NotifySelect(size_t item_selected);
570
571protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200572 struct FileData {
573 std::string fileName;
574 unsigned char fileType; // Uses d_type format from struct dirent
575 mode_t protection; // Uses mode_t format from stat
576 uid_t userId;
577 gid_t groupId;
578 off_t fileSize;
579 time_t lastAccess; // Uses time_t format from stat
580 time_t lastModified; // Uses time_t format from stat
581 time_t lastStatChange; // Uses time_t format from stat
582 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400583
584protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200585 virtual int GetFileList(const std::string folder);
586 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400587
588protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200589 std::vector<FileData> mFolderList;
590 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100591 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600592 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100593 std::string mExtn; // used for filtering the file list, for example, *.zip
594 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
595 std::string mSortVariable; // data manager variable used to change the sorting of files
596 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
597 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
598 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)
599 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100600 ImageResource* mFolderIcon;
601 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600602 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400603};
604
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100605class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400606{
607public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200608 GUIListBox(xml_node<>* node);
609 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400610
611public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200612 // Update - Update any UI component animations (called <= 30 FPS)
613 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
614 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400615
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200616 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100617 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400618
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200619 // SetPageFocus - Notify when a page gains or loses focus
620 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400621
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100622 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100623 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100624 virtual void NotifySelect(size_t item_selected);
625
Dees_Troy51a0e822012-09-05 15:24:24 -0400626protected:
that8ab5c132015-09-13 23:00:54 +0200627 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200628 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500629 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400630 std::string variableValue;
631 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200632 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200633 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200634 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400635
636protected:
that8ab5c132015-09-13 23:00:54 +0200637 std::vector<ListItem> mListItems;
638 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200639 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400640 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100641 ImageResource* mIconSelected;
642 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500643 bool isCheckList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400644};
645
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100646class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500647{
648public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200649 GUIPartitionList(xml_node<>* node);
650 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500651
652public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200653 // Update - Update any UI component animations (called <= 30 FPS)
654 // 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 +0100655 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500656
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200657 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100658 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500659
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200660 // SetPageFocus - Notify when a page gains or loses focus
661 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500662
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100663 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100664 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100665 virtual void NotifySelect(size_t item_selected);
666
Dees_Troya13d74f2013-03-24 08:54:55 -0500667protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100668 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600669 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500670
671protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200672 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500673 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200674 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500675 std::string selectedList;
676 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500677 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100678 ImageResource* mIconSelected;
679 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500680 bool updateList;
681};
682
that8d46c092015-02-26 01:30:04 +0100683class GUIConsole : public GUIScrollList
684{
685public:
686 GUIConsole(xml_node<>* node);
687
688public:
689 // Render - Render the full object to the GL surface
690 // Return 0 on success, <0 on error
691 virtual int Render(void);
692
693 // Update - Update any UI component animations (called <= 30 FPS)
694 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
695 virtual int Update(void);
696
697 // IsInRegion - Checks if the request is handled by this object
698 // Return 1 if this object handles the request, 0 if not
699 virtual int IsInRegion(int x, int y);
700
701 // NotifyTouch - Notify of a touch event
702 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
703 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
704
705 // ScrollList interface
706 virtual size_t GetItemCount();
707 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
708 virtual void NotifySelect(size_t item_selected);
709protected:
710 enum SlideoutState
711 {
712 hidden = 0,
713 visible,
714 request_hide,
715 request_show
716 };
717
718 ImageResource* mSlideoutImage;
719 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
720 bool scrollToEnd; // true if we want to keep tracking the last line
721 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
722 int mSlideout;
723 SlideoutState mSlideoutState;
724 std::vector<std::string> rConsole;
725 std::vector<std::string> rConsoleColor;
726
727protected:
728 bool AddLines();
729 int RenderSlideout(void);
730 int RenderConsole(void);
731};
732
Dees_Troy51a0e822012-09-05 15:24:24 -0400733// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100734class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400735{
736public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200737 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400738
739public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200740 // Render - Render the full object to the GL surface
741 // Return 0 on success, <0 on error
742 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400743
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200744 // Update - Update any UI component animations (called <= 30 FPS)
745 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
746 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400747
748protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200749 AnimationResource* mAnimation;
750 int mFrame;
751 int mFPS;
752 int mLoop;
753 int mRender;
754 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400755};
756
Vojtech Bocekede51c52014-02-07 23:58:09 +0100757class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400758{
759public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200760 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400761
762public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200763 // Render - Render the full object to the GL surface
764 // Return 0 on success, <0 on error
765 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400766
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200767 // Update - Update any UI component animations (called <= 30 FPS)
768 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
769 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400770
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200771 // NotifyVarChange - Notify of a variable change
772 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100773 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400774
775protected:
thatf6ed8fc2015-02-14 20:23:16 +0100776 ImageResource* mEmptyBar;
777 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200778 std::string mMinValVar;
779 std::string mMaxValVar;
780 std::string mCurValVar;
781 float mSlide;
782 float mSlideInc;
783 int mSlideFrames;
784 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400785
786protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200787 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400788};
789
Vojtech Bocekede51c52014-02-07 23:58:09 +0100790class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400791{
792public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200793 GUISlider(xml_node<>* node);
794 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400795
796public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200797 // Render - Render the full object to the GL surface
798 // Return 0 on success, <0 on error
799 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400800
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200801 // Update - Update any UI component animations (called <= 30 FPS)
802 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
803 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400804
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200805 // NotifyTouch - Notify of a touch event
806 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
807 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400808
809protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200810 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600811 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100812 ImageResource* sSlider;
813 ImageResource* sSliderUsed;
814 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200815 int sTouchW, sTouchH;
816 int sCurTouchX;
817 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400818};
819
Dees_Troy51a0e822012-09-05 15:24:24 -0400820#define KEYBOARD_ACTION 253
821#define KEYBOARD_LAYOUT 254
822#define KEYBOARD_SWIPE_LEFT 252
823#define KEYBOARD_SWIPE_RIGHT 251
824#define KEYBOARD_ARROW_LEFT 250
825#define KEYBOARD_ARROW_RIGHT 249
826#define KEYBOARD_HOME 248
827#define KEYBOARD_END 247
828#define KEYBOARD_ARROW_UP 246
829#define KEYBOARD_ARROW_DOWN 245
830#define KEYBOARD_SPECIAL_KEYS 245
831#define KEYBOARD_BACKSPACE 8
832
Vojtech Bocekede51c52014-02-07 23:58:09 +0100833class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400834{
835public:
836 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200837 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400838
839public:
840 virtual int Render(void);
841 virtual int Update(void);
842 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
843 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
844
845protected:
thate79878b2015-03-14 23:07:23 +0100846 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200847 {
thate79878b2015-03-14 23:07:23 +0100848 unsigned char key; // ASCII code or one of the special KEYBOARD_* codes above
Dees_Troy51a0e822012-09-05 15:24:24 -0400849 unsigned char longpresskey;
that1a7ba972015-02-01 19:48:19 +0100850 int end_x;
851 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200852 };
thate79878b2015-03-14 23:07:23 +0100853 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200854 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200855 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
thatd86f49d2015-03-15 00:56:57 +0100856
857 enum {
858 MAX_KEYBOARD_LAYOUTS = 5,
859 MAX_KEYBOARD_ROWS = 9,
860 MAX_KEYBOARD_KEYS = 20
861 };
862 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600863 {
thatd86f49d2015-03-15 00:56:57 +0100864 ImageResource* keyboardImg;
865 struct Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
866 int row_end_y[MAX_KEYBOARD_ROWS];
867 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600868 int revert_layout;
869 };
thatd86f49d2015-03-15 00:56:57 +0100870 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400871
thatf256b722015-05-23 20:44:12 +0200872 struct KeyLabel
873 {
874 unsigned char key; // same as in struct Key
875 int layout_from; // 1-based; 0 for labels that apply to all layouts
876 int layout_to; // same as Key.layout
877 string text; // key label text
878 ImageResource* image; // image (overrides text if defined)
879 };
880 std::vector<KeyLabel> mKeyLabels;
881
thate79878b2015-03-14 23:07:23 +0100882 // Find key at screen coordinates
883 Key* HitTestKey(int x, int y);
884
Dees_Troy51a0e822012-09-05 15:24:24 -0400885 bool mRendered;
886 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100887 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100888 bool CapsLockOn;
thatf6b20662015-06-25 21:51:37 +0200889 int highlightRenderCount;
890 Key* currentKey;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600891 bool hasHighlight, hasCapsHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400892 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600893 COLOR mCapsHighlightColor;
thatf256b722015-05-23 20:44:12 +0200894 COLOR mFontColor; // for centered key labels
895 COLOR mFontColorSmall; // for centered key labels
896 FontResource* mFont; // for main key labels
897 FontResource* mSmallFont; // for key labels like "?123"
898 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200899 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200900 COLOR mLongpressFontColor;
901 COLOR mBackgroundColor; // keyboard background color
902 COLOR mKeyColorAlphanumeric; // key background color
903 COLOR mKeyColorOther; // key background color
904 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400905};
906
907// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100908class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400909{
910public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200911 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400912 virtual ~GUIInput();
913
914public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200915 // Render - Render the full object to the GL surface
916 // Return 0 on success, <0 on error
917 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400918
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200919 // Update - Update any UI component animations (called <= 30 FPS)
920 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
921 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400922
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200923 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100924 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400925
926 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200927 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
928 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400929
930 virtual int NotifyKeyboard(int key);
931
932protected:
933 virtual int GetSelection(int x, int y);
934
935 // Handles displaying the text properly when chars are added, deleted, or for scrolling
936 virtual int HandleTextLocation(int x);
937
938protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200939 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -0400940 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +0100941 ImageResource* mBackground;
942 ImageResource* mCursor;
943 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -0400944 std::string mText;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200945 std::string mLastValue;
Dees_Troy51a0e822012-09-05 15:24:24 -0400946 std::string mVariable;
947 std::string mMask;
948 std::string mMaskVariable;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200949 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400950 COLOR mCursorColor;
951 int scrollingX;
952 int lastX;
953 int mCursorLocation;
954 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
955 int mFontY;
956 unsigned skipChars;
957 unsigned mFontHeight;
958 unsigned CursorWidth;
959 bool mRendered;
960 bool HasMask;
961 bool DrawCursor;
962 bool isLocalChange;
963 bool HasAllowed;
964 bool HasDisabled;
965 std::string AllowedList;
966 std::string DisabledList;
967 unsigned MinLen;
968 unsigned MaxLen;
969};
970
971class HardwareKeyboard
972{
973public:
thatf37aec22015-02-01 13:38:35 +0100974 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400975 virtual ~HardwareKeyboard();
976
977public:
thatf37aec22015-02-01 13:38:35 +0100978 // called by the input handler for key events
979 int KeyDown(int key_code);
980 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100981
thatf37aec22015-02-01 13:38:35 +0100982 // called by the input handler when holding a key down
983 int KeyRepeat();
984
985 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100986 void ConsumeKeyRelease(int key);
987
988private:
thatf37aec22015-02-01 13:38:35 +0100989 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100990 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400991};
992
Vojtech Bocekede51c52014-02-07 23:58:09 +0100993class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +0200994{
995public:
996 GUISliderValue(xml_node<>* node);
997 virtual ~GUISliderValue();
998
999public:
1000 // Render - Render the full object to the GL surface
1001 // Return 0 on success, <0 on error
1002 virtual int Render(void);
1003
1004 // Update - Update any UI component animations (called <= 30 FPS)
1005 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1006 virtual int Update(void);
1007
1008 // SetPos - Update the position of the render object
1009 // Return 0 on success, <0 on error
1010 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1011
1012 // NotifyTouch - Notify of a touch event
1013 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1014 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1015
1016 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001017 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001018
1019 // SetPageFocus - Notify when a page gains or loses focus
1020 virtual void SetPageFocus(int inFocus);
1021
1022protected:
1023 int measureText(const std::string& str);
1024 int valueFromPct(float pct);
1025 float pctFromValue(int value);
1026 void loadValue(bool force = false);
1027
1028 std::string mVariable;
1029 int mMax;
1030 int mMin;
1031 int mValue;
1032 char *mValueStr;
1033 float mValuePct;
1034 std::string mMaxStr;
1035 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001036 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001037 GUIText* mLabel;
1038 int mLabelW;
1039 COLOR mTextColor;
1040 COLOR mLineColor;
1041 COLOR mSliderColor;
1042 bool mShowRange;
1043 bool mShowCurr;
1044 int mLineX;
1045 int mLineY;
1046 int mLineH;
1047 int mLinePadding;
1048 int mPadding;
1049 int mSliderY;
1050 int mSliderW;
1051 int mSliderH;
1052 bool mRendered;
1053 int mFontHeight;
1054 GUIAction *mAction;
1055 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001056 int mLineW;
1057 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001058 ImageResource *mBackgroundImage;
1059 ImageResource *mHandleImage;
1060 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001061};
1062
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001063class MouseCursor : public RenderObject
1064{
1065public:
1066 MouseCursor(int posX, int posY);
1067 virtual ~MouseCursor();
1068
1069 virtual int Render(void);
1070 virtual int Update(void);
1071 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1072
1073 void Move(int deltaX, int deltaY);
1074 void GetPos(int& x, int& y);
1075 void LoadData(xml_node<>* node);
1076 void ResetData(int resX, int resY);
1077
1078private:
1079 int m_resX;
1080 int m_resY;
1081 bool m_moved;
1082 float m_speedMultiplier;
1083 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001084 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001085 bool m_present;
1086};
1087
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001088class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1089{
1090public:
1091 GUIPatternPassword(xml_node<>* node);
1092 virtual ~GUIPatternPassword();
1093
1094public:
1095 virtual int Render(void);
1096 virtual int Update(void);
1097 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1098 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1099
1100protected:
1101 void CalculateDotPositions();
1102 void ResetActiveDots();
1103 void ConnectDot(int dot_idx);
1104 void ConnectIntermediateDots(int dot_idx);
1105 int InDot(int x, int y);
1106 bool DotUsed(int dot_idx);
1107 static bool IsInRect(int x, int y, int rx, int ry, int rw, int rh);
1108 void PatternDrawn();
1109
1110 struct Dot {
1111 int x;
1112 int y;
1113 bool active;
1114 };
1115
1116 Dot mDots[9];
1117 int mConnectedDots[9];
1118 size_t mConnectedDotsLen;
1119 int mCurLineX;
1120 int mCurLineY;
1121 bool mTrackingTouch;
1122 bool mNeedRender;
1123
1124 COLOR mDotColor;
1125 COLOR mActiveDotColor;
1126 COLOR mLineColor;
1127 ImageResource *mDotImage;
1128 ImageResource *mActiveDotImage;
1129 gr_surface mDotCircle;
1130 gr_surface mActiveDotCircle;
1131 int mDotRadius;
1132 int mLineWidth;
1133
1134 std::string mPassVar;
1135 GUIAction *mAction;
1136 int mUpdate;
1137};
1138
1139
Dees_Troy51a0e822012-09-05 15:24:24 -04001140// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001141xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001142std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1143int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1144int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1145int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001146COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001147COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1148FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1149ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1150AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
1151
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001152bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001153
1154#endif // _OBJECTS_HEADER
1155