blob: ae1eeff9ee361076afcbf1c2f5766653e545d135 [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);
nebrassyac29e692021-05-20 13:03:30 +0200375 int reflashtwrp(std::string arg);
Ethan Yonker53796e72019-01-11 22:49:52 -0600376 int fixabrecoverybootloop(std::string arg);
bigbiffdf8436b2020-08-30 16:22:34 -0400377 int enableadb(std::string arg);
378 int enablefastboot(std::string arg);
Mohd Faraz77bbeb02020-08-12 12:29:42 +0000379 int changeterminal(std::string arg);
epicXa721f952021-01-04 13:01:31 +0530380 int applycustomtwrpfolder(std::string arg);
bigbiffd21252f2021-09-18 15:56:32 -0400381 int mergesnapshots(std::string arg);
Captain Throwback16dd81b2021-02-12 19:32:36 -0500382#ifndef TW_EXCLUDE_NANO
383 int editfile(std::string arg);
384#endif
epicXa721f952021-01-04 13:01:31 +0530385
that3f7b1ac2014-12-30 11:30:13 +0100386 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400387};
388
Vojtech Bocekede51c52014-02-07 23:58:09 +0100389class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400390{
391public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200392 GUIButton(xml_node<>* node);
393 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400394
395public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200396 // Render - Render the full object to the GL surface
397 // Return 0 on success, <0 on error
398 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400399
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200400 // Update - Update any UI component animations (called <= 30 FPS)
401 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
402 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400403
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200404 // SetPos - Update the position of the render object
405 // Return 0 on success, <0 on error
406 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400407
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200408 // NotifyTouch - Notify of a touch event
409 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
410 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400411
412protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200413 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100414 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200415 GUIText* mButtonLabel;
416 GUIAction* mAction;
417 int mTextX, mTextY, mTextW, mTextH;
418 int mIconX, mIconY, mIconW, mIconH;
419 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600420 bool hasHighlightColor;
421 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500422 bool hasFill;
423 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600424 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000425 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400426};
427
Vojtech Bocekede51c52014-02-07 23:58:09 +0100428class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400429{
430public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200431 GUICheckbox(xml_node<>* node);
432 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400433
434public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200435 // Render - Render the full object to the GL surface
436 // Return 0 on success, <0 on error
437 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400438
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200439 // Update - Update any UI component animations (called <= 30 FPS)
440 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
441 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400442
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200443 // SetPos - Update the position of the render object
444 // Return 0 on success, <0 on error
445 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400446
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200447 // NotifyTouch - Notify of a touch event
448 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
449 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400450
451protected:
thatf6ed8fc2015-02-14 20:23:16 +0100452 ImageResource* mChecked;
453 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200454 GUIText* mLabel;
455 int mTextX, mTextY;
456 int mCheckX, mCheckY, mCheckW, mCheckH;
457 int mLastState;
458 bool mRendered;
459 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400460};
461
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100462class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400463{
464public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100465 GUIScrollList(xml_node<>* node);
466 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400467
468public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200469 // Render - Render the full object to the GL surface
470 // Return 0 on success, <0 on error
471 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400472
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200473 // Update - Update any UI component animations (called <= 30 FPS)
474 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
475 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400476
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200477 // NotifyTouch - Notify of a touch event
478 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
479 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400480
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200481 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100482 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400483
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200484 // SetPos - Update the position of the render object
485 // Return 0 on success, <0 on error
486 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400487
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200488 // SetPageFocus - Notify when a page gains or loses focus
489 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400490
491protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100492 // derived classes need to implement these
493 // get number of items
494 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100495 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
496 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100497 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500498 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100499
that0af77952015-02-25 08:52:19 +0100500 // render a standard-layout list item with optional icon and text
501 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
502
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100503 enum { NO_ITEM = (size_t)-1 };
504 // returns item index at coordinates or NO_ITEM if there is no item there
505 size_t HitTestItem(int x, int y);
506
507 // 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
508 void SetMaxIconSize(int w, int h);
509
510 // This will make sure that the item indicated by list_index is visible on the screen
511 void SetVisibleListLocation(size_t list_index);
512
513 // Handle scrolling changes for drags and kinetic scrolling
514 void HandleScrolling();
515
that9876ac32015-02-15 21:40:59 +0100516 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100517 int GetDisplayItemCount();
518
519 // Returns the size in pixels of a partial item or row size
520 int GetDisplayRemainder();
521
522protected:
523 // Background
524 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100525 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100526
527 // Header
528 COLOR mHeaderBackgroundColor;
529 COLOR mHeaderFontColor;
530 std::string mHeaderText; // Original header text without parsing any variables
531 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100532 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100533 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100534 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100535 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
536 int mHeaderSeparatorH; // Height of the separator between header and list items
537 COLOR mHeaderSeparatorColor; // color of the header separator
538
539 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100540 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100541 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100542 bool hasHighlightColor; // indicates if a highlight color was set
543 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100544 COLOR mFontHighlightColor;
545 int mFontHeight;
546 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
547 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
548 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
549 int mSeparatorH; // Height of the separator between items
550 COLOR mSeparatorColor; // color of the separator that is between items
551
thata9998212015-02-19 22:51:24 +0100552 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100553 int mFastScrollW; // width of the fastscroll area
554 int mFastScrollLineW; // width of the line for fastscroll rendering
555 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100556 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100557 COLOR mFastScrollLineColor;
558 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100559
560 // Scrolling and dynamic state
561 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
562 int mFastScrollRectCurrentH; // current height of fastscroll rect
563 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100564 bool hasScroll; // indicates that we have enough items in the list to scroll
565 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
566 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
567 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 +0100568 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 +0100569 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
570 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
571 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
572 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
573 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500574 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 +0100575};
576
577class GUIFileSelector : public GUIScrollList
578{
579public:
580 GUIFileSelector(xml_node<>* node);
581 virtual ~GUIFileSelector();
582
583public:
584 // Update - Update any UI component animations (called <= 30 FPS)
585 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
586 virtual int Update(void);
587
588 // NotifyVarChange - Notify of a variable change
589 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
590
591 // SetPageFocus - Notify when a page gains or loses focus
592 virtual void SetPageFocus(int inFocus);
593
594 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100595 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100596 virtual void NotifySelect(size_t item_selected);
597
598protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200599 struct FileData {
600 std::string fileName;
601 unsigned char fileType; // Uses d_type format from struct dirent
602 mode_t protection; // Uses mode_t format from stat
603 uid_t userId;
604 gid_t groupId;
605 off_t fileSize;
606 time_t lastAccess; // Uses time_t format from stat
607 time_t lastModified; // Uses time_t format from stat
608 time_t lastStatChange; // Uses time_t format from stat
609 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400610
611protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200612 virtual int GetFileList(const std::string folder);
613 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400614
615protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200616 std::vector<FileData> mFolderList;
617 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100618 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600619 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100620 std::string mExtn; // used for filtering the file list, for example, *.zip
Ian Macdonalde7c34e52021-01-23 18:52:28 +0100621 std::string mPrfx; // used for filtering the file list, for example, Magisk-
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100622 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
623 std::string mSortVariable; // data manager variable used to change the sorting of files
624 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
625 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
626 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)
627 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100628 ImageResource* mFolderIcon;
629 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600630 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400631};
632
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100633class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400634{
635public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200636 GUIListBox(xml_node<>* node);
637 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400638
639public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200640 // Update - Update any UI component animations (called <= 30 FPS)
641 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
642 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400643
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200644 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100645 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400646
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200647 // SetPageFocus - Notify when a page gains or loses focus
648 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400649
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100650 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100651 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100652 virtual void NotifySelect(size_t item_selected);
653
Dees_Troy51a0e822012-09-05 15:24:24 -0400654protected:
that8ab5c132015-09-13 23:00:54 +0200655 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200656 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500657 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400658 std::string variableValue;
659 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200660 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200661 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200662 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400663
664protected:
that8ab5c132015-09-13 23:00:54 +0200665 std::vector<ListItem> mListItems;
666 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200667 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400668 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100669 ImageResource* mIconSelected;
670 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500671 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600672 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400673};
674
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100675class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500676{
677public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200678 GUIPartitionList(xml_node<>* node);
679 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500680
681public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200682 // Update - Update any UI component animations (called <= 30 FPS)
683 // 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 +0100684 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500685
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200686 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100687 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500688
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200689 // SetPageFocus - Notify when a page gains or loses focus
690 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500691
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100692 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100693 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100694 virtual void NotifySelect(size_t item_selected);
695
Dees_Troya13d74f2013-03-24 08:54:55 -0500696protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100697 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600698 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500699
700protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200701 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500702 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200703 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500704 std::string selectedList;
705 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500706 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100707 ImageResource* mIconSelected;
708 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500709 bool updateList;
710};
711
Ethan Yonker44925ad2015-07-22 12:33:59 -0500712class GUITextBox : public GUIScrollList
713{
714public:
715 GUITextBox(xml_node<>* node);
716
717public:
718 // Update - Update any UI component animations (called <= 30 FPS)
719 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
720 virtual int Update(void);
721
722 // NotifyVarChange - Notify of a variable change
723 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
724
725 // ScrollList interface
726 virtual size_t GetItemCount();
727 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
728 virtual void NotifySelect(size_t item_selected);
729protected:
730
731 size_t mLastCount;
732 bool mIsStatic;
733 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
734 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
735 std::vector<std::string> rText; // Rendered text - what we actually see
736
737};
738
that8d46c092015-02-26 01:30:04 +0100739class GUIConsole : public GUIScrollList
740{
741public:
742 GUIConsole(xml_node<>* node);
743
744public:
745 // Render - Render the full object to the GL surface
746 // Return 0 on success, <0 on error
747 virtual int Render(void);
748
749 // Update - Update any UI component animations (called <= 30 FPS)
750 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
751 virtual int Update(void);
752
753 // IsInRegion - Checks if the request is handled by this object
754 // Return 1 if this object handles the request, 0 if not
755 virtual int IsInRegion(int x, int y);
756
757 // NotifyTouch - Notify of a touch event
758 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
759 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
760
761 // ScrollList interface
762 virtual size_t GetItemCount();
763 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
764 virtual void NotifySelect(size_t item_selected);
thata9dd9f02017-02-23 23:08:56 +0100765
Ethan Yonker74db1572015-10-28 12:44:49 -0500766 static void Translate_Now();
thata9dd9f02017-02-23 23:08:56 +0100767 static void Clear_For_Retranslation();
that8d46c092015-02-26 01:30:04 +0100768protected:
769 enum SlideoutState
770 {
771 hidden = 0,
772 visible,
773 request_hide,
774 request_show
775 };
776
777 ImageResource* mSlideoutImage;
778 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
779 bool scrollToEnd; // true if we want to keep tracking the last line
780 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
781 int mSlideout;
782 SlideoutState mSlideoutState;
783 std::vector<std::string> rConsole;
784 std::vector<std::string> rConsoleColor;
785
786protected:
that8d46c092015-02-26 01:30:04 +0100787 int RenderSlideout(void);
788 int RenderConsole(void);
789};
790
that1964d192016-01-07 00:41:03 +0100791class TerminalEngine;
792class GUITerminal : public GUIScrollList, public InputObject
793{
794public:
795 GUITerminal(xml_node<>* node);
796
797public:
798 // Update - Update any UI component animations (called <= 30 FPS)
799 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
800 virtual int Update(void);
801
802 // NotifyTouch - Notify of a touch event
803 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
804 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
805
806 // NotifyKey - Notify of a key press
807 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
808 virtual int NotifyKey(int key, bool down);
809
810 // character input
811 virtual int NotifyCharInput(int ch);
812
813 // SetPageFocus - Notify when a page gains or loses focus
814 virtual void SetPageFocus(int inFocus);
815
816 // ScrollList interface
817 virtual size_t GetItemCount();
818 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
819 virtual void NotifySelect(size_t item_selected);
Mohd Faraz77bbeb02020-08-12 12:29:42 +0000820 bool status();
821 void stop();
that1964d192016-01-07 00:41:03 +0100822protected:
823 void InitAndResize();
824
825 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
826 int updateCounter; // to track if anything changed in the back-end
827 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
828};
829
Dees_Troy51a0e822012-09-05 15:24:24 -0400830// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100831class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400832{
833public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200834 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400835
836public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200837 // Render - Render the full object to the GL surface
838 // Return 0 on success, <0 on error
839 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400840
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200841 // Update - Update any UI component animations (called <= 30 FPS)
842 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
843 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400844
845protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200846 AnimationResource* mAnimation;
847 int mFrame;
848 int mFPS;
849 int mLoop;
850 int mRender;
851 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400852};
853
Vojtech Bocekede51c52014-02-07 23:58:09 +0100854class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400855{
856public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200857 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400858
859public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200860 // Render - Render the full object to the GL surface
861 // Return 0 on success, <0 on error
862 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400863
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200864 // Update - Update any UI component animations (called <= 30 FPS)
865 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
866 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400867
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200868 // NotifyVarChange - Notify of a variable change
869 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100870 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400871
872protected:
thatf6ed8fc2015-02-14 20:23:16 +0100873 ImageResource* mEmptyBar;
874 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200875 std::string mMinValVar;
876 std::string mMaxValVar;
877 std::string mCurValVar;
878 float mSlide;
879 float mSlideInc;
880 int mSlideFrames;
881 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400882
883protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200884 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400885};
886
Vojtech Bocekede51c52014-02-07 23:58:09 +0100887class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400888{
889public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200890 GUISlider(xml_node<>* node);
891 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400892
893public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200894 // Render - Render the full object to the GL surface
895 // Return 0 on success, <0 on error
896 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400897
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200898 // Update - Update any UI component animations (called <= 30 FPS)
899 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
900 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400901
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200902 // NotifyTouch - Notify of a touch event
903 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
904 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400905
906protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200907 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600908 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100909 ImageResource* sSlider;
910 ImageResource* sSliderUsed;
911 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200912 int sTouchW, sTouchH;
913 int sCurTouchX;
914 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400915};
916
that8834a0f2016-01-05 23:29:30 +0100917// these are ASCII codes reported via NotifyCharInput
918// other special keys (arrows etc.) are reported via NotifyKey
919#define KEYBOARD_ACTION 13 // CR
920#define KEYBOARD_BACKSPACE 8 // Backspace
921#define KEYBOARD_TAB 9 // Tab
922#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
923#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400924
Vojtech Bocekede51c52014-02-07 23:58:09 +0100925class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400926{
927public:
928 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200929 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400930
931public:
932 virtual int Render(void);
933 virtual int Update(void);
934 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
935 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100936 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400937
938protected:
thate79878b2015-03-14 23:07:23 +0100939 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200940 {
that8834a0f2016-01-05 23:29:30 +0100941 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
942 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100943 int end_x;
944 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200945 };
thate79878b2015-03-14 23:07:23 +0100946 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200947 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200948 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100949 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100950
951 enum {
952 MAX_KEYBOARD_LAYOUTS = 5,
953 MAX_KEYBOARD_ROWS = 9,
954 MAX_KEYBOARD_KEYS = 20
955 };
956 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600957 {
thatd86f49d2015-03-15 00:56:57 +0100958 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100959 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100960 int row_end_y[MAX_KEYBOARD_ROWS];
961 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600962 int revert_layout;
963 };
thatd86f49d2015-03-15 00:56:57 +0100964 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400965
thatf256b722015-05-23 20:44:12 +0200966 struct KeyLabel
967 {
that8834a0f2016-01-05 23:29:30 +0100968 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200969 int layout_from; // 1-based; 0 for labels that apply to all layouts
970 int layout_to; // same as Key.layout
971 string text; // key label text
972 ImageResource* image; // image (overrides text if defined)
973 };
974 std::vector<KeyLabel> mKeyLabels;
975
thate79878b2015-03-14 23:07:23 +0100976 // Find key at screen coordinates
977 Key* HitTestKey(int x, int y);
978
Dees_Troy51a0e822012-09-05 15:24:24 -0400979 bool mRendered;
980 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100981 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100982 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100983 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 +0200984 int highlightRenderCount;
985 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100986 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400987 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600988 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100989 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200990 COLOR mFontColor; // for centered key labels
991 COLOR mFontColorSmall; // for centered key labels
992 FontResource* mFont; // for main key labels
993 FontResource* mSmallFont; // for key labels like "?123"
994 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200995 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200996 COLOR mLongpressFontColor;
997 COLOR mBackgroundColor; // keyboard background color
998 COLOR mKeyColorAlphanumeric; // key background color
999 COLOR mKeyColorOther; // key background color
1000 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -04001001};
1002
1003// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +01001004class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -04001005{
1006public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001007 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -04001008 virtual ~GUIInput();
1009
1010public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001011 // Render - Render the full object to the GL surface
1012 // Return 0 on success, <0 on error
1013 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001014
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001015 // Update - Update any UI component animations (called <= 30 FPS)
1016 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1017 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001018
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001019 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001020 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001021
1022 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001023 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1024 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001025
that8834a0f2016-01-05 23:29:30 +01001026 virtual int NotifyKey(int key, bool down);
1027 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001028
1029protected:
1030 virtual int GetSelection(int x, int y);
1031
1032 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001033 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001034 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001035 void HandleCursorByTouch(int x);
1036 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001037
1038protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001039 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001040 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001041 ImageResource* mBackground;
1042 ImageResource* mCursor;
1043 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001044 std::string mVariable;
1045 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001046 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001047 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001048 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001049 COLOR mCursorColor;
1050 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001051 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001052 int lastX;
1053 int mCursorLocation;
1054 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1055 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001056 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001057 unsigned mFontHeight;
1058 unsigned CursorWidth;
1059 bool mRendered;
1060 bool HasMask;
1061 bool DrawCursor;
1062 bool isLocalChange;
1063 bool HasAllowed;
1064 bool HasDisabled;
1065 std::string AllowedList;
1066 std::string DisabledList;
1067 unsigned MinLen;
1068 unsigned MaxLen;
1069};
1070
1071class HardwareKeyboard
1072{
1073public:
thatf37aec22015-02-01 13:38:35 +01001074 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001075 virtual ~HardwareKeyboard();
1076
1077public:
thatf37aec22015-02-01 13:38:35 +01001078 // called by the input handler for key events
1079 int KeyDown(int key_code);
1080 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001081
thatf37aec22015-02-01 13:38:35 +01001082 // called by the input handler when holding a key down
1083 int KeyRepeat();
1084
1085 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001086 void ConsumeKeyRelease(int key);
1087
that8834a0f2016-01-05 23:29:30 +01001088 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001089private:
that8834a0f2016-01-05 23:29:30 +01001090 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001091 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001092 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001093};
1094
Vojtech Bocekede51c52014-02-07 23:58:09 +01001095class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001096{
1097public:
1098 GUISliderValue(xml_node<>* node);
1099 virtual ~GUISliderValue();
1100
1101public:
1102 // Render - Render the full object to the GL surface
1103 // Return 0 on success, <0 on error
1104 virtual int Render(void);
1105
1106 // Update - Update any UI component animations (called <= 30 FPS)
1107 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1108 virtual int Update(void);
1109
1110 // SetPos - Update the position of the render object
1111 // Return 0 on success, <0 on error
1112 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1113
1114 // NotifyTouch - Notify of a touch event
1115 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1116 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1117
1118 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001119 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001120
1121 // SetPageFocus - Notify when a page gains or loses focus
1122 virtual void SetPageFocus(int inFocus);
1123
1124protected:
1125 int measureText(const std::string& str);
1126 int valueFromPct(float pct);
1127 float pctFromValue(int value);
1128 void loadValue(bool force = false);
1129
1130 std::string mVariable;
1131 int mMax;
1132 int mMin;
1133 int mValue;
1134 char *mValueStr;
1135 float mValuePct;
1136 std::string mMaxStr;
1137 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001138 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001139 GUIText* mLabel;
1140 int mLabelW;
1141 COLOR mTextColor;
1142 COLOR mLineColor;
1143 COLOR mSliderColor;
1144 bool mShowRange;
1145 bool mShowCurr;
1146 int mLineX;
1147 int mLineY;
1148 int mLineH;
1149 int mLinePadding;
1150 int mPadding;
1151 int mSliderY;
1152 int mSliderW;
1153 int mSliderH;
1154 bool mRendered;
1155 int mFontHeight;
1156 GUIAction *mAction;
1157 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001158 int mLineW;
1159 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001160 ImageResource *mBackgroundImage;
1161 ImageResource *mHandleImage;
1162 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001163};
1164
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001165class MouseCursor : public RenderObject
1166{
1167public:
1168 MouseCursor(int posX, int posY);
1169 virtual ~MouseCursor();
1170
1171 virtual int Render(void);
1172 virtual int Update(void);
1173 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1174
1175 void Move(int deltaX, int deltaY);
1176 void GetPos(int& x, int& y);
1177 void LoadData(xml_node<>* node);
1178 void ResetData(int resX, int resY);
1179
1180private:
1181 int m_resX;
1182 int m_resY;
1183 bool m_moved;
1184 float m_speedMultiplier;
1185 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001186 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001187 bool m_present;
1188};
1189
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001190class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1191{
1192public:
1193 GUIPatternPassword(xml_node<>* node);
1194 virtual ~GUIPatternPassword();
1195
1196public:
1197 virtual int Render(void);
1198 virtual int Update(void);
1199 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001200 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001201 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1202
1203protected:
1204 void CalculateDotPositions();
1205 void ResetActiveDots();
1206 void ConnectDot(int dot_idx);
1207 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001208 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001209 int InDot(int x, int y);
1210 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001211 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001212 void PatternDrawn();
1213
1214 struct Dot {
1215 int x;
1216 int y;
1217 bool active;
1218 };
1219
Aleksa Saraib25a1832015-12-31 17:36:00 +01001220 std::string mSizeVar;
1221 size_t mGridSize;
1222
1223 Dot* mDots;
1224 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001225 size_t mConnectedDotsLen;
1226 int mCurLineX;
1227 int mCurLineY;
1228 bool mTrackingTouch;
1229 bool mNeedRender;
1230
1231 COLOR mDotColor;
1232 COLOR mActiveDotColor;
1233 COLOR mLineColor;
1234 ImageResource *mDotImage;
1235 ImageResource *mActiveDotImage;
1236 gr_surface mDotCircle;
1237 gr_surface mActiveDotCircle;
1238 int mDotRadius;
1239 int mLineWidth;
1240
1241 std::string mPassVar;
1242 GUIAction *mAction;
1243 int mUpdate;
1244};
1245
1246
Dees_Troy51a0e822012-09-05 15:24:24 -04001247// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001248xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001249std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1250int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1251int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1252int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001253COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001254COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1255FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1256ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1257AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001258bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001259
1260#endif // _OBJECTS_HEADER