blob: 89cb742c4f910af94ada6ddf7f463ee410a8132d [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);
that3f7b1ac2014-12-30 11:30:13 +0100344 int cmd(std::string arg);
345 int terminalcommand(std::string arg);
346 int killterminal(std::string arg);
347 int reinjecttwrp(std::string arg);
348 int checkbackupname(std::string arg);
349 int decrypt(std::string arg);
350 int adbsideload(std::string arg);
351 int adbsideloadcancel(std::string arg);
352 int openrecoveryscript(std::string arg);
353 int installsu(std::string arg);
354 int fixsu(std::string arg);
355 int decrypt_backup(std::string arg);
356 int repair(std::string arg);
Ethan Yonkera2719152015-05-28 09:44:41 -0500357 int resize(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100358 int changefilesystem(std::string arg);
359 int startmtp(std::string arg);
360 int stopmtp(std::string arg);
Ethan Yonker96af84a2015-01-05 14:58:36 -0600361 int flashimage(std::string arg);
bigbiff7abc5fe2015-01-17 16:53:12 -0500362 int cancelbackup(std::string arg);
Ethan Yonkereb32b1f2015-05-18 10:23:03 -0500363 int checkpartitionlifetimewrites(std::string arg);
364 int mountsystemtoggle(std::string arg);
Ethan Yonker74db1572015-10-28 12:44:49 -0500365 int setlanguage(std::string arg);
Matt Mower9472ba12016-01-20 18:12:47 -0600366 int togglebacklight(std::string arg);
that10ae24f2015-12-26 20:53:51 +0100367 int twcmd(std::string arg);
Ethan Yonker1b190162016-12-05 15:25:19 -0600368 int setbootslot(std::string arg);
Ethan Yonkerb4bff5e2016-12-16 07:47:58 -0600369 int installapp(std::string arg);
Ethan Yonker76bbd3a2019-05-10 10:50:04 -0500370 int uninstalltwrpsystemapp(std::string arg);
Ethan Yonker53796e72019-01-11 22:49:52 -0600371 int repackimage(std::string arg);
nebrassyac29e692021-05-20 13:03:30 +0200372 int reflashtwrp(std::string arg);
Ethan Yonker53796e72019-01-11 22:49:52 -0600373 int fixabrecoverybootloop(std::string arg);
bigbiffdf8436b2020-08-30 16:22:34 -0400374 int enableadb(std::string arg);
375 int enablefastboot(std::string arg);
Mohd Faraz77bbeb02020-08-12 12:29:42 +0000376 int changeterminal(std::string arg);
epicXa721f952021-01-04 13:01:31 +0530377 int applycustomtwrpfolder(std::string arg);
bigbiffd21252f2021-09-18 15:56:32 -0400378 int mergesnapshots(std::string arg);
Captain Throwback16dd81b2021-02-12 19:32:36 -0500379#ifndef TW_EXCLUDE_NANO
380 int editfile(std::string arg);
381#endif
epicXa721f952021-01-04 13:01:31 +0530382
that3f7b1ac2014-12-30 11:30:13 +0100383 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400384};
385
Vojtech Bocekede51c52014-02-07 23:58:09 +0100386class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400387{
388public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200389 GUIButton(xml_node<>* node);
390 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400391
392public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200393 // Render - Render the full object to the GL surface
394 // Return 0 on success, <0 on error
395 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400396
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200397 // Update - Update any UI component animations (called <= 30 FPS)
398 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
399 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400400
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200401 // SetPos - Update the position of the render object
402 // Return 0 on success, <0 on error
403 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400404
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200405 // NotifyTouch - Notify of a touch event
406 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
407 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400408
409protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200410 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100411 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200412 GUIText* mButtonLabel;
413 GUIAction* mAction;
414 int mTextX, mTextY, mTextW, mTextH;
415 int mIconX, mIconY, mIconW, mIconH;
416 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600417 bool hasHighlightColor;
418 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500419 bool hasFill;
420 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600421 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000422 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400423};
424
Vojtech Bocekede51c52014-02-07 23:58:09 +0100425class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400426{
427public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200428 GUICheckbox(xml_node<>* node);
429 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400430
431public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200432 // Render - Render the full object to the GL surface
433 // Return 0 on success, <0 on error
434 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400435
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200436 // Update - Update any UI component animations (called <= 30 FPS)
437 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
438 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400439
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200440 // SetPos - Update the position of the render object
441 // Return 0 on success, <0 on error
442 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400443
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200444 // NotifyTouch - Notify of a touch event
445 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
446 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400447
448protected:
thatf6ed8fc2015-02-14 20:23:16 +0100449 ImageResource* mChecked;
450 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200451 GUIText* mLabel;
452 int mTextX, mTextY;
453 int mCheckX, mCheckY, mCheckW, mCheckH;
454 int mLastState;
455 bool mRendered;
456 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400457};
458
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100459class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400460{
461public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100462 GUIScrollList(xml_node<>* node);
463 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400464
465public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200466 // Render - Render the full object to the GL surface
467 // Return 0 on success, <0 on error
468 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400469
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200470 // Update - Update any UI component animations (called <= 30 FPS)
471 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
472 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400473
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200474 // NotifyTouch - Notify of a touch event
475 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
476 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400477
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200478 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100479 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400480
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200481 // SetPos - Update the position of the render object
482 // Return 0 on success, <0 on error
483 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400484
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200485 // SetPageFocus - Notify when a page gains or loses focus
486 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400487
488protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100489 // derived classes need to implement these
490 // get number of items
491 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100492 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
493 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100494 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500495 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100496
that0af77952015-02-25 08:52:19 +0100497 // render a standard-layout list item with optional icon and text
498 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
499
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100500 enum { NO_ITEM = (size_t)-1 };
501 // returns item index at coordinates or NO_ITEM if there is no item there
502 size_t HitTestItem(int x, int y);
503
504 // 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
505 void SetMaxIconSize(int w, int h);
506
507 // This will make sure that the item indicated by list_index is visible on the screen
508 void SetVisibleListLocation(size_t list_index);
509
510 // Handle scrolling changes for drags and kinetic scrolling
511 void HandleScrolling();
512
that9876ac32015-02-15 21:40:59 +0100513 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100514 int GetDisplayItemCount();
515
516 // Returns the size in pixels of a partial item or row size
517 int GetDisplayRemainder();
518
519protected:
520 // Background
521 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100522 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100523
524 // Header
525 COLOR mHeaderBackgroundColor;
526 COLOR mHeaderFontColor;
527 std::string mHeaderText; // Original header text without parsing any variables
528 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100529 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100530 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100531 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100532 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
533 int mHeaderSeparatorH; // Height of the separator between header and list items
534 COLOR mHeaderSeparatorColor; // color of the header separator
535
536 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100537 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100538 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100539 bool hasHighlightColor; // indicates if a highlight color was set
540 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100541 COLOR mFontHighlightColor;
542 int mFontHeight;
543 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
544 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
545 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
546 int mSeparatorH; // Height of the separator between items
547 COLOR mSeparatorColor; // color of the separator that is between items
548
thata9998212015-02-19 22:51:24 +0100549 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100550 int mFastScrollW; // width of the fastscroll area
551 int mFastScrollLineW; // width of the line for fastscroll rendering
552 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100553 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100554 COLOR mFastScrollLineColor;
555 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100556
557 // Scrolling and dynamic state
558 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
559 int mFastScrollRectCurrentH; // current height of fastscroll rect
560 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100561 bool hasScroll; // indicates that we have enough items in the list to scroll
562 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
563 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
564 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 +0100565 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 +0100566 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
567 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
568 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
569 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
570 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500571 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 +0100572};
573
574class GUIFileSelector : public GUIScrollList
575{
576public:
577 GUIFileSelector(xml_node<>* node);
578 virtual ~GUIFileSelector();
579
580public:
581 // Update - Update any UI component animations (called <= 30 FPS)
582 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
583 virtual int Update(void);
584
585 // NotifyVarChange - Notify of a variable change
586 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
587
588 // SetPageFocus - Notify when a page gains or loses focus
589 virtual void SetPageFocus(int inFocus);
590
591 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100592 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100593 virtual void NotifySelect(size_t item_selected);
594
595protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200596 struct FileData {
597 std::string fileName;
598 unsigned char fileType; // Uses d_type format from struct dirent
599 mode_t protection; // Uses mode_t format from stat
600 uid_t userId;
601 gid_t groupId;
602 off_t fileSize;
603 time_t lastAccess; // Uses time_t format from stat
604 time_t lastModified; // Uses time_t format from stat
605 time_t lastStatChange; // Uses time_t format from stat
606 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400607
608protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200609 virtual int GetFileList(const std::string folder);
610 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400611
612protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200613 std::vector<FileData> mFolderList;
614 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100615 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600616 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100617 std::string mExtn; // used for filtering the file list, for example, *.zip
Ian Macdonalde7c34e52021-01-23 18:52:28 +0100618 std::string mPrfx; // used for filtering the file list, for example, Magisk-
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100619 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
620 std::string mSortVariable; // data manager variable used to change the sorting of files
621 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
622 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
623 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)
624 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100625 ImageResource* mFolderIcon;
626 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600627 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400628};
629
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100630class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400631{
632public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200633 GUIListBox(xml_node<>* node);
634 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400635
636public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200637 // Update - Update any UI component animations (called <= 30 FPS)
638 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
639 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400640
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200641 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100642 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400643
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200644 // SetPageFocus - Notify when a page gains or loses focus
645 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400646
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100647 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100648 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100649 virtual void NotifySelect(size_t item_selected);
650
Dees_Troy51a0e822012-09-05 15:24:24 -0400651protected:
that8ab5c132015-09-13 23:00:54 +0200652 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200653 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500654 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400655 std::string variableValue;
656 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200657 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200658 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200659 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400660
661protected:
that8ab5c132015-09-13 23:00:54 +0200662 std::vector<ListItem> mListItems;
663 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200664 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400665 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100666 ImageResource* mIconSelected;
667 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500668 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600669 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400670};
671
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100672class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500673{
674public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200675 GUIPartitionList(xml_node<>* node);
676 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500677
678public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200679 // Update - Update any UI component animations (called <= 30 FPS)
680 // 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 +0100681 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500682
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200683 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100684 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500685
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200686 // SetPageFocus - Notify when a page gains or loses focus
687 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500688
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100689 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100690 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100691 virtual void NotifySelect(size_t item_selected);
692
Dees_Troya13d74f2013-03-24 08:54:55 -0500693protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100694 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600695 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500696
697protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200698 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500699 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200700 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500701 std::string selectedList;
702 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500703 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100704 ImageResource* mIconSelected;
705 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500706 bool updateList;
707};
708
Ethan Yonker44925ad2015-07-22 12:33:59 -0500709class GUITextBox : public GUIScrollList
710{
711public:
712 GUITextBox(xml_node<>* node);
713
714public:
715 // Update - Update any UI component animations (called <= 30 FPS)
716 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
717 virtual int Update(void);
718
719 // NotifyVarChange - Notify of a variable change
720 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
721
722 // ScrollList interface
723 virtual size_t GetItemCount();
724 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
725 virtual void NotifySelect(size_t item_selected);
726protected:
727
728 size_t mLastCount;
729 bool mIsStatic;
730 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
731 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
732 std::vector<std::string> rText; // Rendered text - what we actually see
733
734};
735
that8d46c092015-02-26 01:30:04 +0100736class GUIConsole : public GUIScrollList
737{
738public:
739 GUIConsole(xml_node<>* node);
740
741public:
742 // Render - Render the full object to the GL surface
743 // Return 0 on success, <0 on error
744 virtual int Render(void);
745
746 // Update - Update any UI component animations (called <= 30 FPS)
747 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
748 virtual int Update(void);
749
750 // IsInRegion - Checks if the request is handled by this object
751 // Return 1 if this object handles the request, 0 if not
752 virtual int IsInRegion(int x, int y);
753
754 // NotifyTouch - Notify of a touch event
755 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
756 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
757
758 // ScrollList interface
759 virtual size_t GetItemCount();
760 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
761 virtual void NotifySelect(size_t item_selected);
thata9dd9f02017-02-23 23:08:56 +0100762
Ethan Yonker74db1572015-10-28 12:44:49 -0500763 static void Translate_Now();
thata9dd9f02017-02-23 23:08:56 +0100764 static void Clear_For_Retranslation();
that8d46c092015-02-26 01:30:04 +0100765protected:
766 enum SlideoutState
767 {
768 hidden = 0,
769 visible,
770 request_hide,
771 request_show
772 };
773
774 ImageResource* mSlideoutImage;
775 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
776 bool scrollToEnd; // true if we want to keep tracking the last line
777 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
778 int mSlideout;
779 SlideoutState mSlideoutState;
780 std::vector<std::string> rConsole;
781 std::vector<std::string> rConsoleColor;
782
783protected:
that8d46c092015-02-26 01:30:04 +0100784 int RenderSlideout(void);
785 int RenderConsole(void);
786};
787
that1964d192016-01-07 00:41:03 +0100788class TerminalEngine;
789class GUITerminal : public GUIScrollList, public InputObject
790{
791public:
792 GUITerminal(xml_node<>* node);
793
794public:
795 // Update - Update any UI component animations (called <= 30 FPS)
796 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
797 virtual int Update(void);
798
799 // NotifyTouch - Notify of a touch event
800 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
801 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
802
803 // NotifyKey - Notify of a key press
804 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
805 virtual int NotifyKey(int key, bool down);
806
807 // character input
808 virtual int NotifyCharInput(int ch);
809
810 // SetPageFocus - Notify when a page gains or loses focus
811 virtual void SetPageFocus(int inFocus);
812
813 // ScrollList interface
814 virtual size_t GetItemCount();
815 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
816 virtual void NotifySelect(size_t item_selected);
Mohd Faraz77bbeb02020-08-12 12:29:42 +0000817 bool status();
818 void stop();
that1964d192016-01-07 00:41:03 +0100819protected:
820 void InitAndResize();
821
822 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
823 int updateCounter; // to track if anything changed in the back-end
824 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
825};
826
Dees_Troy51a0e822012-09-05 15:24:24 -0400827// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100828class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400829{
830public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200831 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400832
833public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200834 // Render - Render the full object to the GL surface
835 // Return 0 on success, <0 on error
836 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400837
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200838 // Update - Update any UI component animations (called <= 30 FPS)
839 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
840 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400841
842protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200843 AnimationResource* mAnimation;
844 int mFrame;
845 int mFPS;
846 int mLoop;
847 int mRender;
848 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400849};
850
Vojtech Bocekede51c52014-02-07 23:58:09 +0100851class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400852{
853public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200854 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400855
856public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200857 // Render - Render the full object to the GL surface
858 // Return 0 on success, <0 on error
859 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400860
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200861 // Update - Update any UI component animations (called <= 30 FPS)
862 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
863 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400864
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200865 // NotifyVarChange - Notify of a variable change
866 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100867 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400868
869protected:
thatf6ed8fc2015-02-14 20:23:16 +0100870 ImageResource* mEmptyBar;
871 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200872 std::string mMinValVar;
873 std::string mMaxValVar;
874 std::string mCurValVar;
875 float mSlide;
876 float mSlideInc;
877 int mSlideFrames;
878 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400879
880protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200881 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400882};
883
Vojtech Bocekede51c52014-02-07 23:58:09 +0100884class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400885{
886public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200887 GUISlider(xml_node<>* node);
888 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400889
890public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200891 // Render - Render the full object to the GL surface
892 // Return 0 on success, <0 on error
893 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400894
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200895 // Update - Update any UI component animations (called <= 30 FPS)
896 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
897 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400898
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200899 // NotifyTouch - Notify of a touch event
900 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
901 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400902
903protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200904 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600905 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100906 ImageResource* sSlider;
907 ImageResource* sSliderUsed;
908 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200909 int sTouchW, sTouchH;
910 int sCurTouchX;
911 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400912};
913
that8834a0f2016-01-05 23:29:30 +0100914// these are ASCII codes reported via NotifyCharInput
915// other special keys (arrows etc.) are reported via NotifyKey
916#define KEYBOARD_ACTION 13 // CR
917#define KEYBOARD_BACKSPACE 8 // Backspace
918#define KEYBOARD_TAB 9 // Tab
919#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
920#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400921
Vojtech Bocekede51c52014-02-07 23:58:09 +0100922class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400923{
924public:
925 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200926 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400927
928public:
929 virtual int Render(void);
930 virtual int Update(void);
931 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
932 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100933 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400934
935protected:
thate79878b2015-03-14 23:07:23 +0100936 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200937 {
that8834a0f2016-01-05 23:29:30 +0100938 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
939 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100940 int end_x;
941 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200942 };
thate79878b2015-03-14 23:07:23 +0100943 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200944 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200945 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100946 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100947
948 enum {
949 MAX_KEYBOARD_LAYOUTS = 5,
950 MAX_KEYBOARD_ROWS = 9,
951 MAX_KEYBOARD_KEYS = 20
952 };
953 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600954 {
thatd86f49d2015-03-15 00:56:57 +0100955 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100956 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100957 int row_end_y[MAX_KEYBOARD_ROWS];
958 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600959 int revert_layout;
960 };
thatd86f49d2015-03-15 00:56:57 +0100961 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400962
thatf256b722015-05-23 20:44:12 +0200963 struct KeyLabel
964 {
that8834a0f2016-01-05 23:29:30 +0100965 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200966 int layout_from; // 1-based; 0 for labels that apply to all layouts
967 int layout_to; // same as Key.layout
968 string text; // key label text
969 ImageResource* image; // image (overrides text if defined)
970 };
971 std::vector<KeyLabel> mKeyLabels;
972
thate79878b2015-03-14 23:07:23 +0100973 // Find key at screen coordinates
974 Key* HitTestKey(int x, int y);
975
Dees_Troy51a0e822012-09-05 15:24:24 -0400976 bool mRendered;
977 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100978 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100979 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100980 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 +0200981 int highlightRenderCount;
982 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100983 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400984 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600985 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100986 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200987 COLOR mFontColor; // for centered key labels
988 COLOR mFontColorSmall; // for centered key labels
989 FontResource* mFont; // for main key labels
990 FontResource* mSmallFont; // for key labels like "?123"
991 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200992 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200993 COLOR mLongpressFontColor;
994 COLOR mBackgroundColor; // keyboard background color
995 COLOR mKeyColorAlphanumeric; // key background color
996 COLOR mKeyColorOther; // key background color
997 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400998};
999
1000// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +01001001class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -04001002{
1003public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001004 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -04001005 virtual ~GUIInput();
1006
1007public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001008 // Render - Render the full object to the GL surface
1009 // Return 0 on success, <0 on error
1010 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001011
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001012 // Update - Update any UI component animations (called <= 30 FPS)
1013 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1014 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001015
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001016 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001017 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001018
1019 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001020 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1021 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001022
that8834a0f2016-01-05 23:29:30 +01001023 virtual int NotifyKey(int key, bool down);
1024 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001025
1026protected:
1027 virtual int GetSelection(int x, int y);
1028
1029 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001030 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001031 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001032 void HandleCursorByTouch(int x);
1033 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001034
1035protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001036 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001037 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001038 ImageResource* mBackground;
1039 ImageResource* mCursor;
1040 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001041 std::string mVariable;
1042 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001043 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001044 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001045 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001046 COLOR mCursorColor;
1047 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001048 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001049 int lastX;
1050 int mCursorLocation;
1051 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1052 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001053 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001054 unsigned mFontHeight;
1055 unsigned CursorWidth;
1056 bool mRendered;
1057 bool HasMask;
1058 bool DrawCursor;
1059 bool isLocalChange;
1060 bool HasAllowed;
1061 bool HasDisabled;
1062 std::string AllowedList;
1063 std::string DisabledList;
1064 unsigned MinLen;
1065 unsigned MaxLen;
1066};
1067
1068class HardwareKeyboard
1069{
1070public:
thatf37aec22015-02-01 13:38:35 +01001071 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001072 virtual ~HardwareKeyboard();
1073
1074public:
thatf37aec22015-02-01 13:38:35 +01001075 // called by the input handler for key events
1076 int KeyDown(int key_code);
1077 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001078
thatf37aec22015-02-01 13:38:35 +01001079 // called by the input handler when holding a key down
1080 int KeyRepeat();
1081
1082 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001083 void ConsumeKeyRelease(int key);
1084
that8834a0f2016-01-05 23:29:30 +01001085 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001086private:
that8834a0f2016-01-05 23:29:30 +01001087 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001088 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001089 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001090};
1091
Vojtech Bocekede51c52014-02-07 23:58:09 +01001092class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001093{
1094public:
1095 GUISliderValue(xml_node<>* node);
1096 virtual ~GUISliderValue();
1097
1098public:
1099 // Render - Render the full object to the GL surface
1100 // Return 0 on success, <0 on error
1101 virtual int Render(void);
1102
1103 // Update - Update any UI component animations (called <= 30 FPS)
1104 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1105 virtual int Update(void);
1106
1107 // SetPos - Update the position of the render object
1108 // Return 0 on success, <0 on error
1109 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1110
1111 // NotifyTouch - Notify of a touch event
1112 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1113 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1114
1115 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001116 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001117
1118 // SetPageFocus - Notify when a page gains or loses focus
1119 virtual void SetPageFocus(int inFocus);
1120
1121protected:
1122 int measureText(const std::string& str);
1123 int valueFromPct(float pct);
1124 float pctFromValue(int value);
1125 void loadValue(bool force = false);
1126
1127 std::string mVariable;
1128 int mMax;
1129 int mMin;
1130 int mValue;
1131 char *mValueStr;
1132 float mValuePct;
1133 std::string mMaxStr;
1134 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001135 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001136 GUIText* mLabel;
1137 int mLabelW;
1138 COLOR mTextColor;
1139 COLOR mLineColor;
1140 COLOR mSliderColor;
1141 bool mShowRange;
1142 bool mShowCurr;
1143 int mLineX;
1144 int mLineY;
1145 int mLineH;
1146 int mLinePadding;
1147 int mPadding;
1148 int mSliderY;
1149 int mSliderW;
1150 int mSliderH;
1151 bool mRendered;
1152 int mFontHeight;
1153 GUIAction *mAction;
1154 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001155 int mLineW;
1156 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001157 ImageResource *mBackgroundImage;
1158 ImageResource *mHandleImage;
1159 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001160};
1161
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001162class MouseCursor : public RenderObject
1163{
1164public:
1165 MouseCursor(int posX, int posY);
1166 virtual ~MouseCursor();
1167
1168 virtual int Render(void);
1169 virtual int Update(void);
1170 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1171
1172 void Move(int deltaX, int deltaY);
1173 void GetPos(int& x, int& y);
1174 void LoadData(xml_node<>* node);
1175 void ResetData(int resX, int resY);
1176
1177private:
1178 int m_resX;
1179 int m_resY;
1180 bool m_moved;
1181 float m_speedMultiplier;
1182 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001183 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001184 bool m_present;
1185};
1186
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001187class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1188{
1189public:
1190 GUIPatternPassword(xml_node<>* node);
1191 virtual ~GUIPatternPassword();
1192
1193public:
1194 virtual int Render(void);
1195 virtual int Update(void);
1196 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001197 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001198 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1199
1200protected:
1201 void CalculateDotPositions();
1202 void ResetActiveDots();
1203 void ConnectDot(int dot_idx);
1204 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001205 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001206 int InDot(int x, int y);
1207 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001208 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001209 void PatternDrawn();
1210
1211 struct Dot {
1212 int x;
1213 int y;
1214 bool active;
1215 };
1216
Aleksa Saraib25a1832015-12-31 17:36:00 +01001217 std::string mSizeVar;
1218 size_t mGridSize;
1219
1220 Dot* mDots;
1221 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001222 size_t mConnectedDotsLen;
1223 int mCurLineX;
1224 int mCurLineY;
1225 bool mTrackingTouch;
1226 bool mNeedRender;
1227
1228 COLOR mDotColor;
1229 COLOR mActiveDotColor;
1230 COLOR mLineColor;
1231 ImageResource *mDotImage;
1232 ImageResource *mActiveDotImage;
1233 gr_surface mDotCircle;
1234 gr_surface mActiveDotCircle;
1235 int mDotRadius;
1236 int mLineWidth;
1237
1238 std::string mPassVar;
1239 GUIAction *mAction;
1240 int mUpdate;
1241};
1242
1243
Dees_Troy51a0e822012-09-05 15:24:24 -04001244// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001245xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001246std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1247int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1248int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1249int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001250COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001251COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1252FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1253ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1254AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001255bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001256
1257#endif // _OBJECTS_HEADER