blob: 3d217c45f4ae1994a45b4ee2940d06f5964caca5 [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
Ethan Yonker44925ad2015-07-22 12:33:59 -0500548 bool AddLines(std::vector<std::string>* origText, std::vector<std::string>* origColor, size_t* lastCount, std::vector<std::string>* rText, std::vector<std::string>* rColor);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100549};
550
551class GUIFileSelector : public GUIScrollList
552{
553public:
554 GUIFileSelector(xml_node<>* node);
555 virtual ~GUIFileSelector();
556
557public:
558 // Update - Update any UI component animations (called <= 30 FPS)
559 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
560 virtual int Update(void);
561
562 // NotifyVarChange - Notify of a variable change
563 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
564
565 // SetPageFocus - Notify when a page gains or loses focus
566 virtual void SetPageFocus(int inFocus);
567
568 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100569 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100570 virtual void NotifySelect(size_t item_selected);
571
572protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200573 struct FileData {
574 std::string fileName;
575 unsigned char fileType; // Uses d_type format from struct dirent
576 mode_t protection; // Uses mode_t format from stat
577 uid_t userId;
578 gid_t groupId;
579 off_t fileSize;
580 time_t lastAccess; // Uses time_t format from stat
581 time_t lastModified; // Uses time_t format from stat
582 time_t lastStatChange; // Uses time_t format from stat
583 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400584
585protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200586 virtual int GetFileList(const std::string folder);
587 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400588
589protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200590 std::vector<FileData> mFolderList;
591 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100592 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600593 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100594 std::string mExtn; // used for filtering the file list, for example, *.zip
595 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
596 std::string mSortVariable; // data manager variable used to change the sorting of files
597 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
598 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
599 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)
600 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100601 ImageResource* mFolderIcon;
602 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600603 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400604};
605
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100606class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400607{
608public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200609 GUIListBox(xml_node<>* node);
610 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400611
612public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200613 // Update - Update any UI component animations (called <= 30 FPS)
614 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
615 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400616
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200617 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100618 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400619
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200620 // SetPageFocus - Notify when a page gains or loses focus
621 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400622
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100623 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100624 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100625 virtual void NotifySelect(size_t item_selected);
626
Dees_Troy51a0e822012-09-05 15:24:24 -0400627protected:
that8ab5c132015-09-13 23:00:54 +0200628 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200629 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500630 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400631 std::string variableValue;
632 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200633 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200634 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200635 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400636
637protected:
that8ab5c132015-09-13 23:00:54 +0200638 std::vector<ListItem> mListItems;
639 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200640 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400641 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100642 ImageResource* mIconSelected;
643 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500644 bool isCheckList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400645};
646
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100647class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500648{
649public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200650 GUIPartitionList(xml_node<>* node);
651 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500652
653public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200654 // Update - Update any UI component animations (called <= 30 FPS)
655 // 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 +0100656 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500657
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200658 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100659 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500660
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200661 // SetPageFocus - Notify when a page gains or loses focus
662 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500663
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100664 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100665 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100666 virtual void NotifySelect(size_t item_selected);
667
Dees_Troya13d74f2013-03-24 08:54:55 -0500668protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100669 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600670 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500671
672protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200673 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500674 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200675 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500676 std::string selectedList;
677 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500678 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100679 ImageResource* mIconSelected;
680 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500681 bool updateList;
682};
683
Ethan Yonker44925ad2015-07-22 12:33:59 -0500684class GUITextBox : public GUIScrollList
685{
686public:
687 GUITextBox(xml_node<>* node);
688
689public:
690 // Update - Update any UI component animations (called <= 30 FPS)
691 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
692 virtual int Update(void);
693
694 // NotifyVarChange - Notify of a variable change
695 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
696
697 // ScrollList interface
698 virtual size_t GetItemCount();
699 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
700 virtual void NotifySelect(size_t item_selected);
701protected:
702
703 size_t mLastCount;
704 bool mIsStatic;
705 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
706 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
707 std::vector<std::string> rText; // Rendered text - what we actually see
708
709};
710
that8d46c092015-02-26 01:30:04 +0100711class GUIConsole : public GUIScrollList
712{
713public:
714 GUIConsole(xml_node<>* node);
715
716public:
717 // Render - Render the full object to the GL surface
718 // Return 0 on success, <0 on error
719 virtual int Render(void);
720
721 // Update - Update any UI component animations (called <= 30 FPS)
722 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
723 virtual int Update(void);
724
725 // IsInRegion - Checks if the request is handled by this object
726 // Return 1 if this object handles the request, 0 if not
727 virtual int IsInRegion(int x, int y);
728
729 // NotifyTouch - Notify of a touch event
730 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
731 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
732
733 // ScrollList interface
734 virtual size_t GetItemCount();
735 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
736 virtual void NotifySelect(size_t item_selected);
737protected:
738 enum SlideoutState
739 {
740 hidden = 0,
741 visible,
742 request_hide,
743 request_show
744 };
745
746 ImageResource* mSlideoutImage;
747 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
748 bool scrollToEnd; // true if we want to keep tracking the last line
749 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
750 int mSlideout;
751 SlideoutState mSlideoutState;
752 std::vector<std::string> rConsole;
753 std::vector<std::string> rConsoleColor;
754
755protected:
that8d46c092015-02-26 01:30:04 +0100756 int RenderSlideout(void);
757 int RenderConsole(void);
758};
759
Dees_Troy51a0e822012-09-05 15:24:24 -0400760// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100761class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400762{
763public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200764 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400765
766public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200767 // Render - Render the full object to the GL surface
768 // Return 0 on success, <0 on error
769 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400770
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200771 // Update - Update any UI component animations (called <= 30 FPS)
772 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
773 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400774
775protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200776 AnimationResource* mAnimation;
777 int mFrame;
778 int mFPS;
779 int mLoop;
780 int mRender;
781 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400782};
783
Vojtech Bocekede51c52014-02-07 23:58:09 +0100784class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400785{
786public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200787 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400788
789public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200790 // Render - Render the full object to the GL surface
791 // Return 0 on success, <0 on error
792 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400793
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200794 // Update - Update any UI component animations (called <= 30 FPS)
795 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
796 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400797
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200798 // NotifyVarChange - Notify of a variable change
799 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100800 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400801
802protected:
thatf6ed8fc2015-02-14 20:23:16 +0100803 ImageResource* mEmptyBar;
804 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200805 std::string mMinValVar;
806 std::string mMaxValVar;
807 std::string mCurValVar;
808 float mSlide;
809 float mSlideInc;
810 int mSlideFrames;
811 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400812
813protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200814 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400815};
816
Vojtech Bocekede51c52014-02-07 23:58:09 +0100817class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400818{
819public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200820 GUISlider(xml_node<>* node);
821 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400822
823public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200824 // Render - Render the full object to the GL surface
825 // Return 0 on success, <0 on error
826 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400827
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200828 // Update - Update any UI component animations (called <= 30 FPS)
829 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
830 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400831
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200832 // NotifyTouch - Notify of a touch event
833 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
834 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400835
836protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200837 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600838 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100839 ImageResource* sSlider;
840 ImageResource* sSliderUsed;
841 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200842 int sTouchW, sTouchH;
843 int sCurTouchX;
844 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400845};
846
Dees_Troy51a0e822012-09-05 15:24:24 -0400847#define KEYBOARD_ACTION 253
848#define KEYBOARD_LAYOUT 254
849#define KEYBOARD_SWIPE_LEFT 252
850#define KEYBOARD_SWIPE_RIGHT 251
851#define KEYBOARD_ARROW_LEFT 250
852#define KEYBOARD_ARROW_RIGHT 249
853#define KEYBOARD_HOME 248
854#define KEYBOARD_END 247
855#define KEYBOARD_ARROW_UP 246
856#define KEYBOARD_ARROW_DOWN 245
857#define KEYBOARD_SPECIAL_KEYS 245
858#define KEYBOARD_BACKSPACE 8
859
Vojtech Bocekede51c52014-02-07 23:58:09 +0100860class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400861{
862public:
863 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200864 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400865
866public:
867 virtual int Render(void);
868 virtual int Update(void);
869 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
870 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
871
872protected:
thate79878b2015-03-14 23:07:23 +0100873 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200874 {
thate79878b2015-03-14 23:07:23 +0100875 unsigned char key; // ASCII code or one of the special KEYBOARD_* codes above
Dees_Troy51a0e822012-09-05 15:24:24 -0400876 unsigned char longpresskey;
that1a7ba972015-02-01 19:48:19 +0100877 int end_x;
878 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200879 };
thate79878b2015-03-14 23:07:23 +0100880 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200881 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200882 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
thatd86f49d2015-03-15 00:56:57 +0100883
884 enum {
885 MAX_KEYBOARD_LAYOUTS = 5,
886 MAX_KEYBOARD_ROWS = 9,
887 MAX_KEYBOARD_KEYS = 20
888 };
889 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600890 {
thatd86f49d2015-03-15 00:56:57 +0100891 ImageResource* keyboardImg;
892 struct Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
893 int row_end_y[MAX_KEYBOARD_ROWS];
894 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600895 int revert_layout;
896 };
thatd86f49d2015-03-15 00:56:57 +0100897 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400898
thatf256b722015-05-23 20:44:12 +0200899 struct KeyLabel
900 {
901 unsigned char key; // same as in struct Key
902 int layout_from; // 1-based; 0 for labels that apply to all layouts
903 int layout_to; // same as Key.layout
904 string text; // key label text
905 ImageResource* image; // image (overrides text if defined)
906 };
907 std::vector<KeyLabel> mKeyLabels;
908
thate79878b2015-03-14 23:07:23 +0100909 // Find key at screen coordinates
910 Key* HitTestKey(int x, int y);
911
Dees_Troy51a0e822012-09-05 15:24:24 -0400912 bool mRendered;
913 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100914 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100915 bool CapsLockOn;
thatf6b20662015-06-25 21:51:37 +0200916 int highlightRenderCount;
917 Key* currentKey;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600918 bool hasHighlight, hasCapsHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400919 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600920 COLOR mCapsHighlightColor;
thatf256b722015-05-23 20:44:12 +0200921 COLOR mFontColor; // for centered key labels
922 COLOR mFontColorSmall; // for centered key labels
923 FontResource* mFont; // for main key labels
924 FontResource* mSmallFont; // for key labels like "?123"
925 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200926 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200927 COLOR mLongpressFontColor;
928 COLOR mBackgroundColor; // keyboard background color
929 COLOR mKeyColorAlphanumeric; // key background color
930 COLOR mKeyColorOther; // key background color
931 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400932};
933
934// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100935class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400936{
937public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200938 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400939 virtual ~GUIInput();
940
941public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200942 // Render - Render the full object to the GL surface
943 // Return 0 on success, <0 on error
944 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400945
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200946 // Update - Update any UI component animations (called <= 30 FPS)
947 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
948 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400949
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200950 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100951 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400952
953 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200954 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
955 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400956
957 virtual int NotifyKeyboard(int key);
958
959protected:
960 virtual int GetSelection(int x, int y);
961
962 // Handles displaying the text properly when chars are added, deleted, or for scrolling
963 virtual int HandleTextLocation(int x);
964
965protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200966 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -0400967 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +0100968 ImageResource* mBackground;
969 ImageResource* mCursor;
970 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -0400971 std::string mText;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200972 std::string mLastValue;
Dees_Troy51a0e822012-09-05 15:24:24 -0400973 std::string mVariable;
974 std::string mMask;
975 std::string mMaskVariable;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200976 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400977 COLOR mCursorColor;
978 int scrollingX;
979 int lastX;
980 int mCursorLocation;
981 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
982 int mFontY;
983 unsigned skipChars;
984 unsigned mFontHeight;
985 unsigned CursorWidth;
986 bool mRendered;
987 bool HasMask;
988 bool DrawCursor;
989 bool isLocalChange;
990 bool HasAllowed;
991 bool HasDisabled;
992 std::string AllowedList;
993 std::string DisabledList;
994 unsigned MinLen;
995 unsigned MaxLen;
996};
997
998class HardwareKeyboard
999{
1000public:
thatf37aec22015-02-01 13:38:35 +01001001 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001002 virtual ~HardwareKeyboard();
1003
1004public:
thatf37aec22015-02-01 13:38:35 +01001005 // called by the input handler for key events
1006 int KeyDown(int key_code);
1007 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001008
thatf37aec22015-02-01 13:38:35 +01001009 // called by the input handler when holding a key down
1010 int KeyRepeat();
1011
1012 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001013 void ConsumeKeyRelease(int key);
1014
1015private:
thatf37aec22015-02-01 13:38:35 +01001016 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001017 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001018};
1019
Vojtech Bocekede51c52014-02-07 23:58:09 +01001020class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001021{
1022public:
1023 GUISliderValue(xml_node<>* node);
1024 virtual ~GUISliderValue();
1025
1026public:
1027 // Render - Render the full object to the GL surface
1028 // Return 0 on success, <0 on error
1029 virtual int Render(void);
1030
1031 // Update - Update any UI component animations (called <= 30 FPS)
1032 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1033 virtual int Update(void);
1034
1035 // SetPos - Update the position of the render object
1036 // Return 0 on success, <0 on error
1037 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1038
1039 // NotifyTouch - Notify of a touch event
1040 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1041 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1042
1043 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001044 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001045
1046 // SetPageFocus - Notify when a page gains or loses focus
1047 virtual void SetPageFocus(int inFocus);
1048
1049protected:
1050 int measureText(const std::string& str);
1051 int valueFromPct(float pct);
1052 float pctFromValue(int value);
1053 void loadValue(bool force = false);
1054
1055 std::string mVariable;
1056 int mMax;
1057 int mMin;
1058 int mValue;
1059 char *mValueStr;
1060 float mValuePct;
1061 std::string mMaxStr;
1062 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001063 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001064 GUIText* mLabel;
1065 int mLabelW;
1066 COLOR mTextColor;
1067 COLOR mLineColor;
1068 COLOR mSliderColor;
1069 bool mShowRange;
1070 bool mShowCurr;
1071 int mLineX;
1072 int mLineY;
1073 int mLineH;
1074 int mLinePadding;
1075 int mPadding;
1076 int mSliderY;
1077 int mSliderW;
1078 int mSliderH;
1079 bool mRendered;
1080 int mFontHeight;
1081 GUIAction *mAction;
1082 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001083 int mLineW;
1084 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001085 ImageResource *mBackgroundImage;
1086 ImageResource *mHandleImage;
1087 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001088};
1089
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001090class MouseCursor : public RenderObject
1091{
1092public:
1093 MouseCursor(int posX, int posY);
1094 virtual ~MouseCursor();
1095
1096 virtual int Render(void);
1097 virtual int Update(void);
1098 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1099
1100 void Move(int deltaX, int deltaY);
1101 void GetPos(int& x, int& y);
1102 void LoadData(xml_node<>* node);
1103 void ResetData(int resX, int resY);
1104
1105private:
1106 int m_resX;
1107 int m_resY;
1108 bool m_moved;
1109 float m_speedMultiplier;
1110 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001111 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001112 bool m_present;
1113};
1114
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001115class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1116{
1117public:
1118 GUIPatternPassword(xml_node<>* node);
1119 virtual ~GUIPatternPassword();
1120
1121public:
1122 virtual int Render(void);
1123 virtual int Update(void);
1124 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1125 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1126
1127protected:
1128 void CalculateDotPositions();
1129 void ResetActiveDots();
1130 void ConnectDot(int dot_idx);
1131 void ConnectIntermediateDots(int dot_idx);
1132 int InDot(int x, int y);
1133 bool DotUsed(int dot_idx);
1134 static bool IsInRect(int x, int y, int rx, int ry, int rw, int rh);
1135 void PatternDrawn();
1136
1137 struct Dot {
1138 int x;
1139 int y;
1140 bool active;
1141 };
1142
1143 Dot mDots[9];
1144 int mConnectedDots[9];
1145 size_t mConnectedDotsLen;
1146 int mCurLineX;
1147 int mCurLineY;
1148 bool mTrackingTouch;
1149 bool mNeedRender;
1150
1151 COLOR mDotColor;
1152 COLOR mActiveDotColor;
1153 COLOR mLineColor;
1154 ImageResource *mDotImage;
1155 ImageResource *mActiveDotImage;
1156 gr_surface mDotCircle;
1157 gr_surface mActiveDotCircle;
1158 int mDotRadius;
1159 int mLineWidth;
1160
1161 std::string mPassVar;
1162 GUIAction *mAction;
1163 int mUpdate;
1164};
1165
1166
Dees_Troy51a0e822012-09-05 15:24:24 -04001167// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001168xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001169std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1170int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1171int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1172int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001173COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001174COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1175FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1176ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1177AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
1178
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001179bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001180
1181#endif // _OBJECTS_HEADER
1182