blob: ec550bb390b4dca9acb1442db6871fc8f21346f9 [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"
bigbiffd81833a2021-01-17 11:06:57 -050037#include "gui/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
James Christopher Adduonodcd1e442016-11-06 13:17:34 -050045#ifndef TW_W_OFFSET
46#define TW_W_OFFSET 0
47#endif
48#ifndef TW_H_OFFSET
49#define TW_H_OFFSET 0
50#endif
Ethan Yonker751a85e2014-12-12 16:59:10 -060051
Dees_Troy51a0e822012-09-05 15:24:24 -040052class RenderObject
53{
54public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020055 RenderObject() { mRenderX = 0; mRenderY = 0; mRenderW = 0; mRenderH = 0; mPlacement = TOP_LEFT; }
56 virtual ~RenderObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -040057
58public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020059 // Render - Render the full object to the GL surface
60 // Return 0 on success, <0 on error
61 virtual int Render(void) = 0;
Dees_Troy51a0e822012-09-05 15:24:24 -040062
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020063 // Update - Update any UI component animations (called <= 30 FPS)
64 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
65 virtual int Update(void) { return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040066
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020067 // GetRenderPos - Returns the current position of the object
68 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 -040069
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020070 // SetRenderPos - Update the position of the object
71 // Return 0 on success, <0 on error
72 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 -040073
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020074 // GetPlacement - Returns the current placement
75 virtual int GetPlacement(Placement& placement) { placement = mPlacement; return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040076
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020077 // SetPlacement - Update the current placement
78 virtual int SetPlacement(Placement placement) { mPlacement = placement; return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040079
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020080 // SetPageFocus - Notify when a page gains or loses focus
that1964d192016-01-07 00:41:03 +010081 // TODO: This should be named NotifyPageFocus for consistency
Ethan Yonkerd0514ba2015-10-22 14:17:47 -050082 virtual void SetPageFocus(int inFocus __unused) { return; }
Dees_Troy51a0e822012-09-05 15:24:24 -040083
84protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020085 int mRenderX, mRenderY, mRenderW, mRenderH;
86 Placement mPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -040087};
88
89class ActionObject
90{
91public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020092 ActionObject() { mActionX = 0; mActionY = 0; mActionW = 0; mActionH = 0; }
93 virtual ~ActionObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -040094
95public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020096 // NotifyTouch - Notify of a touch event
97 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
Ethan Yonkerd0514ba2015-10-22 14:17:47 -050098 virtual int NotifyTouch(TOUCH_STATE state __unused, int x __unused, int y __unused) { return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040099
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200100 // NotifyKey - Notify of a key press
101 // 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 -0500102 virtual int NotifyKey(int key __unused, bool down __unused) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400103
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200104 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 -0400105
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200106 // Return 0 on success, <0 on error
107 virtual int SetActionPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400108
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200109 // IsInRegion - Checks if the request is handled by this object
thatf8194e22015-01-29 01:05:01 +0100110 // Return 1 if this object handles the request, 0 if not
111 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 -0400112
Dees_Troy51a0e822012-09-05 15:24:24 -0400113protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200114 int mActionX, mActionY, mActionW, mActionH;
Dees_Troy51a0e822012-09-05 15:24:24 -0400115};
116
Vojtech Bocekede51c52014-02-07 23:58:09 +0100117class GUIObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400118{
119public:
Vojtech Bocekede51c52014-02-07 23:58:09 +0100120 GUIObject(xml_node<>* node);
121 virtual ~GUIObject();
Dees_Troy51a0e822012-09-05 15:24:24 -0400122
123public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200124 bool IsConditionVariable(std::string var);
125 bool isConditionTrue();
126 bool isConditionValid();
Vojtech Bocek07220562014-02-08 02:05:33 +0100127
128 // NotifyVarChange - Notify of a variable change
129 // Returns 0 on success, <0 on error
130 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400131
132protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200133 class Condition
134 {
135 public:
Vojtech Bocek07220562014-02-08 02:05:33 +0100136 Condition() {
137 mLastResult = true;
138 }
139
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200140 std::string mVar1;
141 std::string mVar2;
142 std::string mCompareOp;
143 std::string mLastVal;
Vojtech Bocek07220562014-02-08 02:05:33 +0100144 bool mLastResult;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200145 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400146
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200147 std::vector<Condition> mConditions;
Dees_Troy51a0e822012-09-05 15:24:24 -0400148
149protected:
that20fb95d2015-09-12 11:27:47 +0200150 static void LoadConditions(xml_node<>* node, std::vector<Condition>& conditions);
151 static bool isMounted(std::string vol);
152 static bool isConditionTrue(Condition* condition);
153 static bool UpdateConditions(std::vector<Condition>& conditions, const std::string& varName);
Vojtech Bocek07220562014-02-08 02:05:33 +0100154
155 bool mConditionsResult;
Dees_Troy51a0e822012-09-05 15:24:24 -0400156};
157
158class InputObject
159{
160public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200161 InputObject() { HasInputFocus = 0; }
162 virtual ~InputObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -0400163
164public:
that8834a0f2016-01-05 23:29:30 +0100165 // NotifyCharInput - Notify of character input (usually from the onscreen or hardware keyboard)
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200166 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
that8834a0f2016-01-05 23:29:30 +0100167 virtual int NotifyCharInput(int ch __unused) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400168
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200169 virtual int SetInputFocus(int focus) { HasInputFocus = focus; return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400170
171protected:
172 int HasInputFocus;
173};
174
175// Derived Objects
176// GUIText - Used for static text
Vojtech Bocekede51c52014-02-07 23:58:09 +0100177class GUIText : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400178{
179public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200180 // w and h may be ignored, in which case, no bounding box is applied
181 GUIText(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400182
183public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200184 // Render - Render the full object to the GL surface
185 // Return 0 on success, <0 on error
186 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400187
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200188 // Update - Update any UI component animations (called <= 30 FPS)
189 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
190 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400191
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200192 // Retrieve the size of the current string (dynamic strings may change per call)
193 virtual int GetCurrentBounds(int& w, int& h);
Dees_Troy51a0e822012-09-05 15:24:24 -0400194
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200195 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100196 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400197
198 // Set maximum width in pixels
199 virtual int SetMaxWidth(unsigned width);
200
Ethan Yonkera5db7122016-03-14 15:47:09 -0500201 void SetText(string newtext);
Dees_Troy51a0e822012-09-05 15:24:24 -0400202
Dees_Troy4d12f962012-10-19 13:13:15 -0400203public:
204 bool isHighlighted;
Ethan Yonkerb7a54a32015-10-05 10:16:27 -0500205 bool scaleWidth;
206 unsigned maxWidth;
Dees_Troy4d12f962012-10-19 13:13:15 -0400207
Dees_Troy51a0e822012-09-05 15:24:24 -0400208protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200209 std::string mText;
210 std::string mLastValue;
211 COLOR mColor;
Dees_Troy4d12f962012-10-19 13:13:15 -0400212 COLOR mHighlightColor;
thatf6ed8fc2015-02-14 20:23:16 +0100213 FontResource* mFont;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200214 int mIsStatic;
215 int mVarChanged;
216 int mFontHeight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400217};
218
219// GUIImage - Used for static image
Vojtech Bocekede51c52014-02-07 23:58:09 +0100220class GUIImage : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400221{
222public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200223 GUIImage(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400224
225public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200226 // Render - Render the full object to the GL surface
227 // Return 0 on success, <0 on error
228 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400229
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200230 // SetRenderPos - Update the position of the object
231 // Return 0 on success, <0 on error
232 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400233
Dees_Troy4d12f962012-10-19 13:13:15 -0400234public:
235 bool isHighlighted;
236
Dees_Troy51a0e822012-09-05 15:24:24 -0400237protected:
thatf6ed8fc2015-02-14 20:23:16 +0100238 ImageResource* mImage;
239 ImageResource* mHighlightImage;
Dees_Troy51a0e822012-09-05 15:24:24 -0400240};
241
242// GUIFill - Used for fill colors
Vojtech Bocekede51c52014-02-07 23:58:09 +0100243class GUIFill : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400244{
245public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200246 GUIFill(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400247
248public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200249 // Render - Render the full object to the GL surface
250 // Return 0 on success, <0 on error
251 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400252
253protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200254 COLOR mColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400255};
256
257// GUIAction - Used for standard actions
Vojtech Bocekede51c52014-02-07 23:58:09 +0100258class GUIAction : public GUIObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400259{
thatc6085482015-01-09 22:12:43 +0100260 friend class ActionThread;
261
Dees_Troy51a0e822012-09-05 15:24:24 -0400262public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200263 GUIAction(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400264
265public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200266 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100267 virtual int NotifyKey(int key, bool down);
Vojtech Bocek07220562014-02-08 02:05:33 +0100268 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
that3f7b1ac2014-12-30 11:30:13 +0100269
270 int doActions();
Dees_Troy51a0e822012-09-05 15:24:24 -0400271
272protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200273 class Action
274 {
275 public:
276 std::string mFunction;
277 std::string mArg;
278 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400279
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200280 std::vector<Action> mActions;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100281 std::map<int, bool> mKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400282
283protected:
that73a52952015-01-28 23:07:34 +0100284 enum ThreadType { THREAD_NONE, THREAD_ACTION, THREAD_CANCEL };
285
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200286 int getKeyByName(std::string key);
that3f7b1ac2014-12-30 11:30:13 +0100287 int doAction(Action action);
that73a52952015-01-28 23:07:34 +0100288 ThreadType getThreadType(const Action& action);
Dees_Troy51a0e822012-09-05 15:24:24 -0400289 void simulate_progress_bar(void);
Ethan Yonker0d47eb52015-01-09 11:23:19 -0600290 int flash_zip(std::string filename, int* wipe_cache);
mauronofrio6d3bf892019-10-26 19:47:55 +0200291 int ozip_decrypt(std::string zip_path);
thatcc8ddca2015-01-03 01:59:36 +0100292 void reinject_after_flash();
Dees_Troy51a0e822012-09-05 15:24:24 -0400293 void operation_start(const string operation_name);
that3f7b1ac2014-12-30 11:30:13 +0100294 void operation_end(const int operation_status);
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +0000295 time_t Start;
that3f7b1ac2014-12-30 11:30:13 +0100296
297 // map action name to function pointer
298 typedef int (GUIAction::*execFunction)(std::string);
299 typedef std::map<std::string, execFunction> mapFunc;
300 static mapFunc mf;
thatc6085482015-01-09 22:12:43 +0100301 static std::set<std::string> setActionsRunningInCallerThread;
that3f7b1ac2014-12-30 11:30:13 +0100302
303 // GUI actions
304 int reboot(std::string arg);
305 int home(std::string arg);
306 int key(std::string arg);
307 int page(std::string arg);
308 int reload(std::string arg);
309 int readBackup(std::string arg);
310 int set(std::string arg);
311 int clear(std::string arg);
312 int mount(std::string arg);
313 int unmount(std::string arg);
314 int restoredefaultsettings(std::string arg);
315 int copylog(std::string arg);
316 int compute(std::string arg);
317 int setguitimezone(std::string arg);
318 int overlay(std::string arg);
319 int queuezip(std::string arg);
320 int cancelzip(std::string arg);
321 int queueclear(std::string arg);
322 int sleep(std::string arg);
Matt Mower9a2a2052016-05-31 21:31:22 -0500323 int sleepcounter(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100324 int appenddatetobackupname(std::string arg);
325 int generatebackupname(std::string arg);
326 int checkpartitionlist(std::string arg);
327 int getpartitiondetails(std::string arg);
328 int screenshot(std::string arg);
329 int setbrightness(std::string arg);
Ethan Yonkerb4bff5e2016-12-16 07:47:58 -0600330 int checkforapp(std::string arg);
bigbiffcfa875c2021-06-20 16:20:27 -0400331 int unmapsuperdevices(std::string arg);
332 int removedynamicgroups(std:: string arg);
that3f7b1ac2014-12-30 11:30:13 +0100333
thatc6085482015-01-09 22:12:43 +0100334 // (originally) threaded actions
that3f7b1ac2014-12-30 11:30:13 +0100335 int fileexists(std::string arg);
336 int flash(std::string arg);
337 int wipe(std::string arg);
338 int refreshsizes(std::string arg);
339 int nandroid(std::string arg);
Ethan Yonkerb5fab762016-01-28 14:03:33 -0600340 int fixcontexts(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100341 int fixpermissions(std::string arg);
342 int dd(std::string arg);
343 int partitionsd(std::string arg);
344 int installhtcdumlock(std::string arg);
345 int htcdumlockrestoreboot(std::string arg);
346 int htcdumlockreflashrecovery(std::string arg);
347 int cmd(std::string arg);
348 int terminalcommand(std::string arg);
349 int killterminal(std::string arg);
350 int reinjecttwrp(std::string arg);
351 int checkbackupname(std::string arg);
352 int decrypt(std::string arg);
353 int adbsideload(std::string arg);
354 int adbsideloadcancel(std::string arg);
355 int openrecoveryscript(std::string arg);
356 int installsu(std::string arg);
357 int fixsu(std::string arg);
358 int decrypt_backup(std::string arg);
359 int repair(std::string arg);
Ethan Yonkera2719152015-05-28 09:44:41 -0500360 int resize(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100361 int changefilesystem(std::string arg);
362 int startmtp(std::string arg);
363 int stopmtp(std::string arg);
Ethan Yonker96af84a2015-01-05 14:58:36 -0600364 int flashimage(std::string arg);
bigbiff7abc5fe2015-01-17 16:53:12 -0500365 int cancelbackup(std::string arg);
Ethan Yonkereb32b1f2015-05-18 10:23:03 -0500366 int checkpartitionlifetimewrites(std::string arg);
367 int mountsystemtoggle(std::string arg);
Ethan Yonker74db1572015-10-28 12:44:49 -0500368 int setlanguage(std::string arg);
Matt Mower9472ba12016-01-20 18:12:47 -0600369 int togglebacklight(std::string arg);
that10ae24f2015-12-26 20:53:51 +0100370 int twcmd(std::string arg);
Ethan Yonker1b190162016-12-05 15:25:19 -0600371 int setbootslot(std::string arg);
Ethan Yonkerb4bff5e2016-12-16 07:47:58 -0600372 int installapp(std::string arg);
Ethan Yonker76bbd3a2019-05-10 10:50:04 -0500373 int uninstalltwrpsystemapp(std::string arg);
Ethan Yonker53796e72019-01-11 22:49:52 -0600374 int repackimage(std::string arg);
375 int fixabrecoverybootloop(std::string arg);
bigbiffdf8436b2020-08-30 16:22:34 -0400376 int enableadb(std::string arg);
377 int enablefastboot(std::string arg);
Mohd Faraz77bbeb02020-08-12 12:29:42 +0000378 int changeterminal(std::string arg);
epicXa721f952021-01-04 13:01:31 +0530379 int applycustomtwrpfolder(std::string arg);
Captain Throwback16dd81b2021-02-12 19:32:36 -0500380#ifndef TW_EXCLUDE_NANO
381 int editfile(std::string arg);
382#endif
epicXa721f952021-01-04 13:01:31 +0530383
that3f7b1ac2014-12-30 11:30:13 +0100384 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400385};
386
Vojtech Bocekede51c52014-02-07 23:58:09 +0100387class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400388{
389public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200390 GUIButton(xml_node<>* node);
391 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400392
393public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200394 // Render - Render the full object to the GL surface
395 // Return 0 on success, <0 on error
396 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400397
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200398 // Update - Update any UI component animations (called <= 30 FPS)
399 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
400 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400401
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200402 // SetPos - Update the position of the render object
403 // Return 0 on success, <0 on error
404 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400405
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200406 // NotifyTouch - Notify of a touch event
407 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
408 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400409
410protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200411 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100412 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200413 GUIText* mButtonLabel;
414 GUIAction* mAction;
415 int mTextX, mTextY, mTextW, mTextH;
416 int mIconX, mIconY, mIconW, mIconH;
417 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600418 bool hasHighlightColor;
419 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500420 bool hasFill;
421 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600422 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000423 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400424};
425
Vojtech Bocekede51c52014-02-07 23:58:09 +0100426class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400427{
428public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200429 GUICheckbox(xml_node<>* node);
430 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400431
432public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200433 // Render - Render the full object to the GL surface
434 // Return 0 on success, <0 on error
435 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400436
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200437 // Update - Update any UI component animations (called <= 30 FPS)
438 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
439 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400440
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200441 // SetPos - Update the position of the render object
442 // Return 0 on success, <0 on error
443 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400444
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200445 // NotifyTouch - Notify of a touch event
446 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
447 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400448
449protected:
thatf6ed8fc2015-02-14 20:23:16 +0100450 ImageResource* mChecked;
451 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200452 GUIText* mLabel;
453 int mTextX, mTextY;
454 int mCheckX, mCheckY, mCheckW, mCheckH;
455 int mLastState;
456 bool mRendered;
457 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400458};
459
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100460class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400461{
462public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100463 GUIScrollList(xml_node<>* node);
464 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400465
466public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200467 // Render - Render the full object to the GL surface
468 // Return 0 on success, <0 on error
469 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400470
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200471 // Update - Update any UI component animations (called <= 30 FPS)
472 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
473 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400474
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200475 // NotifyTouch - Notify of a touch event
476 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
477 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400478
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200479 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100480 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400481
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200482 // SetPos - Update the position of the render object
483 // Return 0 on success, <0 on error
484 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400485
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200486 // SetPageFocus - Notify when a page gains or loses focus
487 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400488
489protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100490 // derived classes need to implement these
491 // get number of items
492 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100493 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
494 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100495 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500496 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100497
that0af77952015-02-25 08:52:19 +0100498 // render a standard-layout list item with optional icon and text
499 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
500
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100501 enum { NO_ITEM = (size_t)-1 };
502 // returns item index at coordinates or NO_ITEM if there is no item there
503 size_t HitTestItem(int x, int y);
504
505 // 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
506 void SetMaxIconSize(int w, int h);
507
508 // This will make sure that the item indicated by list_index is visible on the screen
509 void SetVisibleListLocation(size_t list_index);
510
511 // Handle scrolling changes for drags and kinetic scrolling
512 void HandleScrolling();
513
that9876ac32015-02-15 21:40:59 +0100514 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100515 int GetDisplayItemCount();
516
517 // Returns the size in pixels of a partial item or row size
518 int GetDisplayRemainder();
519
520protected:
521 // Background
522 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100523 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100524
525 // Header
526 COLOR mHeaderBackgroundColor;
527 COLOR mHeaderFontColor;
528 std::string mHeaderText; // Original header text without parsing any variables
529 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100530 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100531 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100532 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100533 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
534 int mHeaderSeparatorH; // Height of the separator between header and list items
535 COLOR mHeaderSeparatorColor; // color of the header separator
536
537 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100538 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100539 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100540 bool hasHighlightColor; // indicates if a highlight color was set
541 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100542 COLOR mFontHighlightColor;
543 int mFontHeight;
544 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
545 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
546 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
547 int mSeparatorH; // Height of the separator between items
548 COLOR mSeparatorColor; // color of the separator that is between items
549
thata9998212015-02-19 22:51:24 +0100550 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100551 int mFastScrollW; // width of the fastscroll area
552 int mFastScrollLineW; // width of the line for fastscroll rendering
553 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100554 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100555 COLOR mFastScrollLineColor;
556 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100557
558 // Scrolling and dynamic state
559 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
560 int mFastScrollRectCurrentH; // current height of fastscroll rect
561 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100562 bool hasScroll; // indicates that we have enough items in the list to scroll
563 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
564 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
565 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 +0100566 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 +0100567 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
568 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
569 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
570 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
571 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500572 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 +0100573};
574
575class GUIFileSelector : public GUIScrollList
576{
577public:
578 GUIFileSelector(xml_node<>* node);
579 virtual ~GUIFileSelector();
580
581public:
582 // Update - Update any UI component animations (called <= 30 FPS)
583 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
584 virtual int Update(void);
585
586 // NotifyVarChange - Notify of a variable change
587 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
588
589 // SetPageFocus - Notify when a page gains or loses focus
590 virtual void SetPageFocus(int inFocus);
591
592 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100593 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100594 virtual void NotifySelect(size_t item_selected);
595
596protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200597 struct FileData {
598 std::string fileName;
599 unsigned char fileType; // Uses d_type format from struct dirent
600 mode_t protection; // Uses mode_t format from stat
601 uid_t userId;
602 gid_t groupId;
603 off_t fileSize;
604 time_t lastAccess; // Uses time_t format from stat
605 time_t lastModified; // Uses time_t format from stat
606 time_t lastStatChange; // Uses time_t format from stat
607 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400608
609protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200610 virtual int GetFileList(const std::string folder);
611 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400612
613protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200614 std::vector<FileData> mFolderList;
615 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100616 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600617 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100618 std::string mExtn; // used for filtering the file list, for example, *.zip
Ian Macdonalde7c34e52021-01-23 18:52:28 +0100619 std::string mPrfx; // used for filtering the file list, for example, Magisk-
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100620 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
621 std::string mSortVariable; // data manager variable used to change the sorting of files
622 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
623 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
624 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)
625 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100626 ImageResource* mFolderIcon;
627 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600628 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400629};
630
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100631class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400632{
633public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200634 GUIListBox(xml_node<>* node);
635 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400636
637public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200638 // Update - Update any UI component animations (called <= 30 FPS)
639 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
640 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400641
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200642 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100643 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400644
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200645 // SetPageFocus - Notify when a page gains or loses focus
646 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400647
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100648 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100649 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100650 virtual void NotifySelect(size_t item_selected);
651
Dees_Troy51a0e822012-09-05 15:24:24 -0400652protected:
that8ab5c132015-09-13 23:00:54 +0200653 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200654 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500655 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400656 std::string variableValue;
657 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200658 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200659 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200660 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400661
662protected:
that8ab5c132015-09-13 23:00:54 +0200663 std::vector<ListItem> mListItems;
664 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200665 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400666 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100667 ImageResource* mIconSelected;
668 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500669 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600670 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400671};
672
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100673class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500674{
675public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200676 GUIPartitionList(xml_node<>* node);
677 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500678
679public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200680 // Update - Update any UI component animations (called <= 30 FPS)
681 // 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 +0100682 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500683
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200684 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100685 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500686
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200687 // SetPageFocus - Notify when a page gains or loses focus
688 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500689
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100690 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100691 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100692 virtual void NotifySelect(size_t item_selected);
693
Dees_Troya13d74f2013-03-24 08:54:55 -0500694protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100695 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600696 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500697
698protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200699 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500700 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200701 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500702 std::string selectedList;
703 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500704 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100705 ImageResource* mIconSelected;
706 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500707 bool updateList;
708};
709
Ethan Yonker44925ad2015-07-22 12:33:59 -0500710class GUITextBox : public GUIScrollList
711{
712public:
713 GUITextBox(xml_node<>* node);
714
715public:
716 // Update - Update any UI component animations (called <= 30 FPS)
717 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
718 virtual int Update(void);
719
720 // NotifyVarChange - Notify of a variable change
721 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
722
723 // ScrollList interface
724 virtual size_t GetItemCount();
725 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
726 virtual void NotifySelect(size_t item_selected);
727protected:
728
729 size_t mLastCount;
730 bool mIsStatic;
731 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
732 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
733 std::vector<std::string> rText; // Rendered text - what we actually see
734
735};
736
that8d46c092015-02-26 01:30:04 +0100737class GUIConsole : public GUIScrollList
738{
739public:
740 GUIConsole(xml_node<>* node);
741
742public:
743 // Render - Render the full object to the GL surface
744 // Return 0 on success, <0 on error
745 virtual int Render(void);
746
747 // Update - Update any UI component animations (called <= 30 FPS)
748 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
749 virtual int Update(void);
750
751 // IsInRegion - Checks if the request is handled by this object
752 // Return 1 if this object handles the request, 0 if not
753 virtual int IsInRegion(int x, int y);
754
755 // NotifyTouch - Notify of a touch event
756 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
757 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
758
759 // ScrollList interface
760 virtual size_t GetItemCount();
761 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
762 virtual void NotifySelect(size_t item_selected);
thata9dd9f02017-02-23 23:08:56 +0100763
Ethan Yonker74db1572015-10-28 12:44:49 -0500764 static void Translate_Now();
thata9dd9f02017-02-23 23:08:56 +0100765 static void Clear_For_Retranslation();
that8d46c092015-02-26 01:30:04 +0100766protected:
767 enum SlideoutState
768 {
769 hidden = 0,
770 visible,
771 request_hide,
772 request_show
773 };
774
775 ImageResource* mSlideoutImage;
776 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
777 bool scrollToEnd; // true if we want to keep tracking the last line
778 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
779 int mSlideout;
780 SlideoutState mSlideoutState;
781 std::vector<std::string> rConsole;
782 std::vector<std::string> rConsoleColor;
783
784protected:
that8d46c092015-02-26 01:30:04 +0100785 int RenderSlideout(void);
786 int RenderConsole(void);
787};
788
that1964d192016-01-07 00:41:03 +0100789class TerminalEngine;
790class GUITerminal : public GUIScrollList, public InputObject
791{
792public:
793 GUITerminal(xml_node<>* node);
794
795public:
796 // Update - Update any UI component animations (called <= 30 FPS)
797 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
798 virtual int Update(void);
799
800 // NotifyTouch - Notify of a touch event
801 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
802 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
803
804 // NotifyKey - Notify of a key press
805 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
806 virtual int NotifyKey(int key, bool down);
807
808 // character input
809 virtual int NotifyCharInput(int ch);
810
811 // SetPageFocus - Notify when a page gains or loses focus
812 virtual void SetPageFocus(int inFocus);
813
814 // ScrollList interface
815 virtual size_t GetItemCount();
816 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
817 virtual void NotifySelect(size_t item_selected);
Mohd Faraz77bbeb02020-08-12 12:29:42 +0000818 bool status();
819 void stop();
that1964d192016-01-07 00:41:03 +0100820protected:
821 void InitAndResize();
822
823 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
824 int updateCounter; // to track if anything changed in the back-end
825 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
826};
827
Dees_Troy51a0e822012-09-05 15:24:24 -0400828// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100829class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400830{
831public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200832 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400833
834public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200835 // Render - Render the full object to the GL surface
836 // Return 0 on success, <0 on error
837 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400838
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200839 // Update - Update any UI component animations (called <= 30 FPS)
840 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
841 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400842
843protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200844 AnimationResource* mAnimation;
845 int mFrame;
846 int mFPS;
847 int mLoop;
848 int mRender;
849 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400850};
851
Vojtech Bocekede51c52014-02-07 23:58:09 +0100852class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400853{
854public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200855 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400856
857public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200858 // Render - Render the full object to the GL surface
859 // Return 0 on success, <0 on error
860 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400861
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200862 // Update - Update any UI component animations (called <= 30 FPS)
863 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
864 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400865
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200866 // NotifyVarChange - Notify of a variable change
867 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100868 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400869
870protected:
thatf6ed8fc2015-02-14 20:23:16 +0100871 ImageResource* mEmptyBar;
872 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200873 std::string mMinValVar;
874 std::string mMaxValVar;
875 std::string mCurValVar;
876 float mSlide;
877 float mSlideInc;
878 int mSlideFrames;
879 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400880
881protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200882 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400883};
884
Vojtech Bocekede51c52014-02-07 23:58:09 +0100885class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400886{
887public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200888 GUISlider(xml_node<>* node);
889 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400890
891public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200892 // Render - Render the full object to the GL surface
893 // Return 0 on success, <0 on error
894 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400895
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200896 // Update - Update any UI component animations (called <= 30 FPS)
897 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
898 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400899
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200900 // NotifyTouch - Notify of a touch event
901 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
902 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400903
904protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200905 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600906 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100907 ImageResource* sSlider;
908 ImageResource* sSliderUsed;
909 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200910 int sTouchW, sTouchH;
911 int sCurTouchX;
912 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400913};
914
that8834a0f2016-01-05 23:29:30 +0100915// these are ASCII codes reported via NotifyCharInput
916// other special keys (arrows etc.) are reported via NotifyKey
917#define KEYBOARD_ACTION 13 // CR
918#define KEYBOARD_BACKSPACE 8 // Backspace
919#define KEYBOARD_TAB 9 // Tab
920#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
921#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400922
Vojtech Bocekede51c52014-02-07 23:58:09 +0100923class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400924{
925public:
926 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200927 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400928
929public:
930 virtual int Render(void);
931 virtual int Update(void);
932 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
933 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100934 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400935
936protected:
thate79878b2015-03-14 23:07:23 +0100937 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200938 {
that8834a0f2016-01-05 23:29:30 +0100939 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
940 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100941 int end_x;
942 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200943 };
thate79878b2015-03-14 23:07:23 +0100944 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200945 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200946 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100947 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100948
949 enum {
950 MAX_KEYBOARD_LAYOUTS = 5,
951 MAX_KEYBOARD_ROWS = 9,
952 MAX_KEYBOARD_KEYS = 20
953 };
954 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600955 {
thatd86f49d2015-03-15 00:56:57 +0100956 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100957 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100958 int row_end_y[MAX_KEYBOARD_ROWS];
959 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600960 int revert_layout;
961 };
thatd86f49d2015-03-15 00:56:57 +0100962 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400963
thatf256b722015-05-23 20:44:12 +0200964 struct KeyLabel
965 {
that8834a0f2016-01-05 23:29:30 +0100966 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200967 int layout_from; // 1-based; 0 for labels that apply to all layouts
968 int layout_to; // same as Key.layout
969 string text; // key label text
970 ImageResource* image; // image (overrides text if defined)
971 };
972 std::vector<KeyLabel> mKeyLabels;
973
thate79878b2015-03-14 23:07:23 +0100974 // Find key at screen coordinates
975 Key* HitTestKey(int x, int y);
976
Dees_Troy51a0e822012-09-05 15:24:24 -0400977 bool mRendered;
978 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100979 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100980 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100981 static bool CtrlActive; // all keyboards share a common Control key state so that the Control key can be on a separate keyboard instance
thatf6b20662015-06-25 21:51:37 +0200982 int highlightRenderCount;
983 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100984 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400985 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600986 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100987 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200988 COLOR mFontColor; // for centered key labels
989 COLOR mFontColorSmall; // for centered key labels
990 FontResource* mFont; // for main key labels
991 FontResource* mSmallFont; // for key labels like "?123"
992 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200993 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200994 COLOR mLongpressFontColor;
995 COLOR mBackgroundColor; // keyboard background color
996 COLOR mKeyColorAlphanumeric; // key background color
997 COLOR mKeyColorOther; // key background color
998 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400999};
1000
1001// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +01001002class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -04001003{
1004public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001005 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -04001006 virtual ~GUIInput();
1007
1008public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001009 // Render - Render the full object to the GL surface
1010 // Return 0 on success, <0 on error
1011 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001012
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001013 // Update - Update any UI component animations (called <= 30 FPS)
1014 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1015 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001016
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001017 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001018 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001019
1020 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001021 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1022 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001023
that8834a0f2016-01-05 23:29:30 +01001024 virtual int NotifyKey(int key, bool down);
1025 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001026
1027protected:
1028 virtual int GetSelection(int x, int y);
1029
1030 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001031 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001032 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001033 void HandleCursorByTouch(int x);
1034 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001035
1036protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001037 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001038 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001039 ImageResource* mBackground;
1040 ImageResource* mCursor;
1041 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001042 std::string mVariable;
1043 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001044 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001045 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001046 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001047 COLOR mCursorColor;
1048 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001049 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001050 int lastX;
1051 int mCursorLocation;
1052 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1053 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001054 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001055 unsigned mFontHeight;
1056 unsigned CursorWidth;
1057 bool mRendered;
1058 bool HasMask;
1059 bool DrawCursor;
1060 bool isLocalChange;
1061 bool HasAllowed;
1062 bool HasDisabled;
1063 std::string AllowedList;
1064 std::string DisabledList;
1065 unsigned MinLen;
1066 unsigned MaxLen;
1067};
1068
1069class HardwareKeyboard
1070{
1071public:
thatf37aec22015-02-01 13:38:35 +01001072 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001073 virtual ~HardwareKeyboard();
1074
1075public:
thatf37aec22015-02-01 13:38:35 +01001076 // called by the input handler for key events
1077 int KeyDown(int key_code);
1078 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001079
thatf37aec22015-02-01 13:38:35 +01001080 // called by the input handler when holding a key down
1081 int KeyRepeat();
1082
1083 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001084 void ConsumeKeyRelease(int key);
1085
that8834a0f2016-01-05 23:29:30 +01001086 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001087private:
that8834a0f2016-01-05 23:29:30 +01001088 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001089 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001090 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001091};
1092
Vojtech Bocekede51c52014-02-07 23:58:09 +01001093class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001094{
1095public:
1096 GUISliderValue(xml_node<>* node);
1097 virtual ~GUISliderValue();
1098
1099public:
1100 // Render - Render the full object to the GL surface
1101 // Return 0 on success, <0 on error
1102 virtual int Render(void);
1103
1104 // Update - Update any UI component animations (called <= 30 FPS)
1105 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1106 virtual int Update(void);
1107
1108 // SetPos - Update the position of the render object
1109 // Return 0 on success, <0 on error
1110 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1111
1112 // NotifyTouch - Notify of a touch event
1113 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1114 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1115
1116 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001117 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001118
1119 // SetPageFocus - Notify when a page gains or loses focus
1120 virtual void SetPageFocus(int inFocus);
1121
1122protected:
1123 int measureText(const std::string& str);
1124 int valueFromPct(float pct);
1125 float pctFromValue(int value);
1126 void loadValue(bool force = false);
1127
1128 std::string mVariable;
1129 int mMax;
1130 int mMin;
1131 int mValue;
1132 char *mValueStr;
1133 float mValuePct;
1134 std::string mMaxStr;
1135 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001136 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001137 GUIText* mLabel;
1138 int mLabelW;
1139 COLOR mTextColor;
1140 COLOR mLineColor;
1141 COLOR mSliderColor;
1142 bool mShowRange;
1143 bool mShowCurr;
1144 int mLineX;
1145 int mLineY;
1146 int mLineH;
1147 int mLinePadding;
1148 int mPadding;
1149 int mSliderY;
1150 int mSliderW;
1151 int mSliderH;
1152 bool mRendered;
1153 int mFontHeight;
1154 GUIAction *mAction;
1155 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001156 int mLineW;
1157 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001158 ImageResource *mBackgroundImage;
1159 ImageResource *mHandleImage;
1160 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001161};
1162
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001163class MouseCursor : public RenderObject
1164{
1165public:
1166 MouseCursor(int posX, int posY);
1167 virtual ~MouseCursor();
1168
1169 virtual int Render(void);
1170 virtual int Update(void);
1171 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1172
1173 void Move(int deltaX, int deltaY);
1174 void GetPos(int& x, int& y);
1175 void LoadData(xml_node<>* node);
1176 void ResetData(int resX, int resY);
1177
1178private:
1179 int m_resX;
1180 int m_resY;
1181 bool m_moved;
1182 float m_speedMultiplier;
1183 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001184 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001185 bool m_present;
1186};
1187
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001188class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1189{
1190public:
1191 GUIPatternPassword(xml_node<>* node);
1192 virtual ~GUIPatternPassword();
1193
1194public:
1195 virtual int Render(void);
1196 virtual int Update(void);
1197 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001198 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001199 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1200
1201protected:
1202 void CalculateDotPositions();
1203 void ResetActiveDots();
1204 void ConnectDot(int dot_idx);
1205 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001206 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001207 int InDot(int x, int y);
1208 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001209 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001210 void PatternDrawn();
1211
1212 struct Dot {
1213 int x;
1214 int y;
1215 bool active;
1216 };
1217
Aleksa Saraib25a1832015-12-31 17:36:00 +01001218 std::string mSizeVar;
1219 size_t mGridSize;
1220
1221 Dot* mDots;
1222 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001223 size_t mConnectedDotsLen;
1224 int mCurLineX;
1225 int mCurLineY;
1226 bool mTrackingTouch;
1227 bool mNeedRender;
1228
1229 COLOR mDotColor;
1230 COLOR mActiveDotColor;
1231 COLOR mLineColor;
1232 ImageResource *mDotImage;
1233 ImageResource *mActiveDotImage;
1234 gr_surface mDotCircle;
1235 gr_surface mActiveDotCircle;
1236 int mDotRadius;
1237 int mLineWidth;
1238
1239 std::string mPassVar;
1240 GUIAction *mAction;
1241 int mUpdate;
1242};
1243
1244
Dees_Troy51a0e822012-09-05 15:24:24 -04001245// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001246xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001247std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1248int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1249int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1250int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001251COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001252COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1253FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1254ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1255AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001256bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001257
1258#endif // _OBJECTS_HEADER