blob: 2b6ec1cd738708ea5515fd4a254043087662883a [file] [log] [blame]
Dees_Troya13d74f2013-03-24 08:54:55 -05001/*
2 Copyright 2013 bigbiff/Dees_Troy TeamWin
3 This file is part of TWRP/TeamWin Recovery Project.
4
5 TWRP is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 TWRP is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with TWRP. If not, see <http://www.gnu.org/licenses/>.
17*/
Dees Troy3be70a82013-10-22 14:25:12 +000018
19// objects.hpp - Base classes for object manager of GUI
Dees_Troy51a0e822012-09-05 15:24:24 -040020
21#ifndef _OBJECTS_HEADER
22#define _OBJECTS_HEADER
23
24#include "rapidxml.hpp"
25#include <vector>
26#include <string>
27#include <map>
Vojtech Bocek0b7fe502014-03-13 17:36:52 +010028#include <set>
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +000029#include <time.h>
Dees_Troy51a0e822012-09-05 15:24:24 -040030
Dees_Troy51a0e822012-09-05 15:24:24 -040031using namespace rapidxml;
32
33#include "../data.hpp"
34#include "resources.hpp"
35#include "pages.hpp"
Dees_Troya13d74f2013-03-24 08:54:55 -050036#include "../partitions.hpp"
Ethan Yonkerb7a54a32015-10-05 10:16:27 -050037#include "placement.h"
Dees_Troy51a0e822012-09-05 15:24:24 -040038
Ethan Yonker751a85e2014-12-12 16:59:10 -060039#ifndef TW_X_OFFSET
40#define TW_X_OFFSET 0
41#endif
42#ifndef TW_Y_OFFSET
43#define TW_Y_OFFSET 0
44#endif
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);
mauronofrio0ff59842019-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);
that3f7b1ac2014-12-30 11:30:13 +0100331
thatc6085482015-01-09 22:12:43 +0100332 // (originally) threaded actions
that3f7b1ac2014-12-30 11:30:13 +0100333 int fileexists(std::string arg);
334 int flash(std::string arg);
335 int wipe(std::string arg);
336 int refreshsizes(std::string arg);
337 int nandroid(std::string arg);
Ethan Yonkerb5fab762016-01-28 14:03:33 -0600338 int fixcontexts(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100339 int fixpermissions(std::string arg);
340 int dd(std::string arg);
341 int partitionsd(std::string arg);
342 int installhtcdumlock(std::string arg);
343 int htcdumlockrestoreboot(std::string arg);
344 int htcdumlockreflashrecovery(std::string arg);
345 int cmd(std::string arg);
346 int terminalcommand(std::string arg);
347 int killterminal(std::string arg);
348 int reinjecttwrp(std::string arg);
349 int checkbackupname(std::string arg);
350 int decrypt(std::string arg);
351 int adbsideload(std::string arg);
352 int adbsideloadcancel(std::string arg);
353 int openrecoveryscript(std::string arg);
354 int installsu(std::string arg);
355 int fixsu(std::string arg);
356 int decrypt_backup(std::string arg);
357 int repair(std::string arg);
Ethan Yonkera2719152015-05-28 09:44:41 -0500358 int resize(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100359 int changefilesystem(std::string arg);
360 int startmtp(std::string arg);
361 int stopmtp(std::string arg);
Ethan Yonker96af84a2015-01-05 14:58:36 -0600362 int flashimage(std::string arg);
bigbiff7abc5fe2015-01-17 16:53:12 -0500363 int cancelbackup(std::string arg);
Ethan Yonkereb32b1f2015-05-18 10:23:03 -0500364 int checkpartitionlifetimewrites(std::string arg);
365 int mountsystemtoggle(std::string arg);
Ethan Yonker74db1572015-10-28 12:44:49 -0500366 int setlanguage(std::string arg);
Matt Mower9472ba12016-01-20 18:12:47 -0600367 int togglebacklight(std::string arg);
that10ae24f2015-12-26 20:53:51 +0100368 int twcmd(std::string arg);
Ethan Yonker1b190162016-12-05 15:25:19 -0600369 int setbootslot(std::string arg);
Ethan Yonkerb4bff5e2016-12-16 07:47:58 -0600370 int installapp(std::string arg);
Ethan Yonker76bbd3a2019-05-10 10:50:04 -0500371 int uninstalltwrpsystemapp(std::string arg);
Ethan Yonker53796e72019-01-11 22:49:52 -0600372 int repackimage(std::string arg);
nebrassyfe1c2372021-05-20 13:03:30 +0200373 int reflashtwrp(std::string arg);
Ethan Yonker53796e72019-01-11 22:49:52 -0600374 int fixabrecoverybootloop(std::string arg);
Mohd Faraz3c25ab32020-08-12 12:29:42 +0000375 int changeterminal(std::string arg);
Captain Throwback3b556102021-02-12 19:32:36 -0500376#ifndef TW_EXCLUDE_NANO
377 int editfile(std::string arg);
378#endif
epicX98053c32021-01-04 13:01:31 +0530379 int applycustomtwrpfolder(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100380
381 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400382};
383
Vojtech Bocekede51c52014-02-07 23:58:09 +0100384class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400385{
386public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200387 GUIButton(xml_node<>* node);
388 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400389
390public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200391 // Render - Render the full object to the GL surface
392 // Return 0 on success, <0 on error
393 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400394
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200395 // Update - Update any UI component animations (called <= 30 FPS)
396 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
397 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400398
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200399 // SetPos - Update the position of the render object
400 // Return 0 on success, <0 on error
401 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400402
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200403 // NotifyTouch - Notify of a touch event
404 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
405 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400406
407protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200408 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100409 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200410 GUIText* mButtonLabel;
411 GUIAction* mAction;
412 int mTextX, mTextY, mTextW, mTextH;
413 int mIconX, mIconY, mIconW, mIconH;
414 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600415 bool hasHighlightColor;
416 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500417 bool hasFill;
418 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600419 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000420 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400421};
422
Vojtech Bocekede51c52014-02-07 23:58:09 +0100423class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400424{
425public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200426 GUICheckbox(xml_node<>* node);
427 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400428
429public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200430 // Render - Render the full object to the GL surface
431 // Return 0 on success, <0 on error
432 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400433
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200434 // Update - Update any UI component animations (called <= 30 FPS)
435 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
436 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400437
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200438 // SetPos - Update the position of the render object
439 // Return 0 on success, <0 on error
440 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400441
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200442 // NotifyTouch - Notify of a touch event
443 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
444 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400445
446protected:
thatf6ed8fc2015-02-14 20:23:16 +0100447 ImageResource* mChecked;
448 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200449 GUIText* mLabel;
450 int mTextX, mTextY;
451 int mCheckX, mCheckY, mCheckW, mCheckH;
452 int mLastState;
453 bool mRendered;
454 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400455};
456
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100457class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400458{
459public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100460 GUIScrollList(xml_node<>* node);
461 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400462
463public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200464 // Render - Render the full object to the GL surface
465 // Return 0 on success, <0 on error
466 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400467
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200468 // Update - Update any UI component animations (called <= 30 FPS)
469 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
470 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400471
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200472 // NotifyTouch - Notify of a touch event
473 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
474 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400475
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200476 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100477 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400478
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200479 // SetPos - Update the position of the render object
480 // Return 0 on success, <0 on error
481 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400482
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200483 // SetPageFocus - Notify when a page gains or loses focus
484 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400485
486protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100487 // derived classes need to implement these
488 // get number of items
489 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100490 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
491 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100492 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500493 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100494
that0af77952015-02-25 08:52:19 +0100495 // render a standard-layout list item with optional icon and text
496 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
497
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100498 enum { NO_ITEM = (size_t)-1 };
499 // returns item index at coordinates or NO_ITEM if there is no item there
500 size_t HitTestItem(int x, int y);
501
502 // 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
503 void SetMaxIconSize(int w, int h);
504
505 // This will make sure that the item indicated by list_index is visible on the screen
506 void SetVisibleListLocation(size_t list_index);
507
508 // Handle scrolling changes for drags and kinetic scrolling
509 void HandleScrolling();
510
that9876ac32015-02-15 21:40:59 +0100511 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100512 int GetDisplayItemCount();
513
514 // Returns the size in pixels of a partial item or row size
515 int GetDisplayRemainder();
516
517protected:
518 // Background
519 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100520 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100521
522 // Header
523 COLOR mHeaderBackgroundColor;
524 COLOR mHeaderFontColor;
525 std::string mHeaderText; // Original header text without parsing any variables
526 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100527 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100528 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100529 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100530 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
531 int mHeaderSeparatorH; // Height of the separator between header and list items
532 COLOR mHeaderSeparatorColor; // color of the header separator
533
534 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100535 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100536 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100537 bool hasHighlightColor; // indicates if a highlight color was set
538 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100539 COLOR mFontHighlightColor;
540 int mFontHeight;
541 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
542 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
543 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
544 int mSeparatorH; // Height of the separator between items
545 COLOR mSeparatorColor; // color of the separator that is between items
546
thata9998212015-02-19 22:51:24 +0100547 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100548 int mFastScrollW; // width of the fastscroll area
549 int mFastScrollLineW; // width of the line for fastscroll rendering
550 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100551 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100552 COLOR mFastScrollLineColor;
553 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100554
555 // Scrolling and dynamic state
556 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
557 int mFastScrollRectCurrentH; // current height of fastscroll rect
558 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100559 bool hasScroll; // indicates that we have enough items in the list to scroll
560 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
561 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
562 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 +0100563 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 +0100564 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
565 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
566 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
567 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
568 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500569 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 +0100570};
571
572class GUIFileSelector : public GUIScrollList
573{
574public:
575 GUIFileSelector(xml_node<>* node);
576 virtual ~GUIFileSelector();
577
578public:
579 // Update - Update any UI component animations (called <= 30 FPS)
580 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
581 virtual int Update(void);
582
583 // NotifyVarChange - Notify of a variable change
584 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
585
586 // SetPageFocus - Notify when a page gains or loses focus
587 virtual void SetPageFocus(int inFocus);
588
589 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100590 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100591 virtual void NotifySelect(size_t item_selected);
592
593protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200594 struct FileData {
595 std::string fileName;
596 unsigned char fileType; // Uses d_type format from struct dirent
597 mode_t protection; // Uses mode_t format from stat
598 uid_t userId;
599 gid_t groupId;
600 off_t fileSize;
601 time_t lastAccess; // Uses time_t format from stat
602 time_t lastModified; // Uses time_t format from stat
603 time_t lastStatChange; // Uses time_t format from stat
604 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400605
606protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200607 virtual int GetFileList(const std::string folder);
608 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400609
610protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200611 std::vector<FileData> mFolderList;
612 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100613 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600614 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100615 std::string mExtn; // used for filtering the file list, for example, *.zip
Ian Macdonald15430b62021-01-23 18:52:28 +0100616 std::string mPrfx; // used for filtering the file list, for example, Magisk-
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100617 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
618 std::string mSortVariable; // data manager variable used to change the sorting of files
619 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
620 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
621 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)
622 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100623 ImageResource* mFolderIcon;
624 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600625 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400626};
627
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100628class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400629{
630public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200631 GUIListBox(xml_node<>* node);
632 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400633
634public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200635 // Update - Update any UI component animations (called <= 30 FPS)
636 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
637 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400638
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200639 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100640 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400641
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200642 // SetPageFocus - Notify when a page gains or loses focus
643 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400644
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100645 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100646 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100647 virtual void NotifySelect(size_t item_selected);
648
Dees_Troy51a0e822012-09-05 15:24:24 -0400649protected:
that8ab5c132015-09-13 23:00:54 +0200650 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200651 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500652 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400653 std::string variableValue;
654 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200655 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200656 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200657 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400658
659protected:
that8ab5c132015-09-13 23:00:54 +0200660 std::vector<ListItem> mListItems;
661 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200662 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400663 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100664 ImageResource* mIconSelected;
665 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500666 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600667 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400668};
669
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100670class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500671{
672public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200673 GUIPartitionList(xml_node<>* node);
674 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500675
676public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200677 // Update - Update any UI component animations (called <= 30 FPS)
678 // 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 +0100679 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500680
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200681 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100682 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500683
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200684 // SetPageFocus - Notify when a page gains or loses focus
685 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500686
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100687 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100688 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100689 virtual void NotifySelect(size_t item_selected);
690
Dees_Troya13d74f2013-03-24 08:54:55 -0500691protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100692 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600693 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500694
695protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200696 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500697 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200698 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500699 std::string selectedList;
700 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500701 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100702 ImageResource* mIconSelected;
703 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500704 bool updateList;
705};
706
Ethan Yonker44925ad2015-07-22 12:33:59 -0500707class GUITextBox : public GUIScrollList
708{
709public:
710 GUITextBox(xml_node<>* node);
711
712public:
713 // Update - Update any UI component animations (called <= 30 FPS)
714 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
715 virtual int Update(void);
716
717 // NotifyVarChange - Notify of a variable change
718 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
719
720 // ScrollList interface
721 virtual size_t GetItemCount();
722 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
723 virtual void NotifySelect(size_t item_selected);
724protected:
725
726 size_t mLastCount;
727 bool mIsStatic;
728 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
729 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
730 std::vector<std::string> rText; // Rendered text - what we actually see
731
732};
733
that8d46c092015-02-26 01:30:04 +0100734class GUIConsole : public GUIScrollList
735{
736public:
737 GUIConsole(xml_node<>* node);
738
739public:
740 // Render - Render the full object to the GL surface
741 // Return 0 on success, <0 on error
742 virtual int Render(void);
743
744 // Update - Update any UI component animations (called <= 30 FPS)
745 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
746 virtual int Update(void);
747
748 // IsInRegion - Checks if the request is handled by this object
749 // Return 1 if this object handles the request, 0 if not
750 virtual int IsInRegion(int x, int y);
751
752 // NotifyTouch - Notify of a touch event
753 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
754 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
755
756 // ScrollList interface
757 virtual size_t GetItemCount();
758 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
759 virtual void NotifySelect(size_t item_selected);
thata9dd9f02017-02-23 23:08:56 +0100760
Ethan Yonker74db1572015-10-28 12:44:49 -0500761 static void Translate_Now();
thata9dd9f02017-02-23 23:08:56 +0100762 static void Clear_For_Retranslation();
that8d46c092015-02-26 01:30:04 +0100763protected:
764 enum SlideoutState
765 {
766 hidden = 0,
767 visible,
768 request_hide,
769 request_show
770 };
771
772 ImageResource* mSlideoutImage;
773 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
774 bool scrollToEnd; // true if we want to keep tracking the last line
775 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
776 int mSlideout;
777 SlideoutState mSlideoutState;
778 std::vector<std::string> rConsole;
779 std::vector<std::string> rConsoleColor;
780
781protected:
that8d46c092015-02-26 01:30:04 +0100782 int RenderSlideout(void);
783 int RenderConsole(void);
784};
785
that1964d192016-01-07 00:41:03 +0100786class TerminalEngine;
787class GUITerminal : public GUIScrollList, public InputObject
788{
789public:
790 GUITerminal(xml_node<>* node);
791
792public:
793 // Update - Update any UI component animations (called <= 30 FPS)
794 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
795 virtual int Update(void);
796
797 // NotifyTouch - Notify of a touch event
798 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
799 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
800
801 // NotifyKey - Notify of a key press
802 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
803 virtual int NotifyKey(int key, bool down);
804
805 // character input
806 virtual int NotifyCharInput(int ch);
807
808 // SetPageFocus - Notify when a page gains or loses focus
809 virtual void SetPageFocus(int inFocus);
810
811 // ScrollList interface
812 virtual size_t GetItemCount();
813 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
814 virtual void NotifySelect(size_t item_selected);
Mohd Faraz3c25ab32020-08-12 12:29:42 +0000815 bool status();
816 void stop();
that1964d192016-01-07 00:41:03 +0100817protected:
818 void InitAndResize();
819
820 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
821 int updateCounter; // to track if anything changed in the back-end
822 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
823};
824
Dees_Troy51a0e822012-09-05 15:24:24 -0400825// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100826class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400827{
828public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200829 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400830
831public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200832 // Render - Render the full object to the GL surface
833 // Return 0 on success, <0 on error
834 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400835
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200836 // Update - Update any UI component animations (called <= 30 FPS)
837 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
838 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400839
840protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200841 AnimationResource* mAnimation;
842 int mFrame;
843 int mFPS;
844 int mLoop;
845 int mRender;
846 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400847};
848
Vojtech Bocekede51c52014-02-07 23:58:09 +0100849class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400850{
851public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200852 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400853
854public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200855 // Render - Render the full object to the GL surface
856 // Return 0 on success, <0 on error
857 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400858
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200859 // Update - Update any UI component animations (called <= 30 FPS)
860 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
861 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400862
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200863 // NotifyVarChange - Notify of a variable change
864 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100865 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400866
867protected:
thatf6ed8fc2015-02-14 20:23:16 +0100868 ImageResource* mEmptyBar;
869 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200870 std::string mMinValVar;
871 std::string mMaxValVar;
872 std::string mCurValVar;
873 float mSlide;
874 float mSlideInc;
875 int mSlideFrames;
876 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400877
878protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200879 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400880};
881
Vojtech Bocekede51c52014-02-07 23:58:09 +0100882class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400883{
884public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200885 GUISlider(xml_node<>* node);
886 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400887
888public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200889 // Render - Render the full object to the GL surface
890 // Return 0 on success, <0 on error
891 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400892
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200893 // Update - Update any UI component animations (called <= 30 FPS)
894 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
895 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400896
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200897 // NotifyTouch - Notify of a touch event
898 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
899 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400900
901protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200902 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600903 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100904 ImageResource* sSlider;
905 ImageResource* sSliderUsed;
906 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200907 int sTouchW, sTouchH;
908 int sCurTouchX;
909 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400910};
911
that8834a0f2016-01-05 23:29:30 +0100912// these are ASCII codes reported via NotifyCharInput
913// other special keys (arrows etc.) are reported via NotifyKey
914#define KEYBOARD_ACTION 13 // CR
915#define KEYBOARD_BACKSPACE 8 // Backspace
916#define KEYBOARD_TAB 9 // Tab
917#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
918#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400919
Vojtech Bocekede51c52014-02-07 23:58:09 +0100920class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400921{
922public:
923 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200924 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400925
926public:
927 virtual int Render(void);
928 virtual int Update(void);
929 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
930 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100931 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400932
933protected:
thate79878b2015-03-14 23:07:23 +0100934 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200935 {
that8834a0f2016-01-05 23:29:30 +0100936 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
937 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100938 int end_x;
939 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200940 };
thate79878b2015-03-14 23:07:23 +0100941 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200942 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200943 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100944 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100945
946 enum {
947 MAX_KEYBOARD_LAYOUTS = 5,
948 MAX_KEYBOARD_ROWS = 9,
949 MAX_KEYBOARD_KEYS = 20
950 };
951 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600952 {
thatd86f49d2015-03-15 00:56:57 +0100953 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100954 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100955 int row_end_y[MAX_KEYBOARD_ROWS];
956 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600957 int revert_layout;
958 };
thatd86f49d2015-03-15 00:56:57 +0100959 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400960
thatf256b722015-05-23 20:44:12 +0200961 struct KeyLabel
962 {
that8834a0f2016-01-05 23:29:30 +0100963 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200964 int layout_from; // 1-based; 0 for labels that apply to all layouts
965 int layout_to; // same as Key.layout
966 string text; // key label text
967 ImageResource* image; // image (overrides text if defined)
968 };
969 std::vector<KeyLabel> mKeyLabels;
970
thate79878b2015-03-14 23:07:23 +0100971 // Find key at screen coordinates
972 Key* HitTestKey(int x, int y);
973
Dees_Troy51a0e822012-09-05 15:24:24 -0400974 bool mRendered;
975 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100976 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100977 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100978 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 +0200979 int highlightRenderCount;
980 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100981 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400982 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600983 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100984 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200985 COLOR mFontColor; // for centered key labels
986 COLOR mFontColorSmall; // for centered key labels
987 FontResource* mFont; // for main key labels
988 FontResource* mSmallFont; // for key labels like "?123"
989 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200990 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200991 COLOR mLongpressFontColor;
992 COLOR mBackgroundColor; // keyboard background color
993 COLOR mKeyColorAlphanumeric; // key background color
994 COLOR mKeyColorOther; // key background color
995 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400996};
997
998// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100999class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -04001000{
1001public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001002 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -04001003 virtual ~GUIInput();
1004
1005public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001006 // Render - Render the full object to the GL surface
1007 // Return 0 on success, <0 on error
1008 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001009
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001010 // Update - Update any UI component animations (called <= 30 FPS)
1011 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1012 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001013
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001014 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001015 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001016
1017 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001018 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1019 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001020
that8834a0f2016-01-05 23:29:30 +01001021 virtual int NotifyKey(int key, bool down);
1022 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001023
1024protected:
1025 virtual int GetSelection(int x, int y);
1026
1027 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001028 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001029 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001030 void HandleCursorByTouch(int x);
1031 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001032
1033protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001034 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001035 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001036 ImageResource* mBackground;
1037 ImageResource* mCursor;
1038 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001039 std::string mVariable;
1040 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001041 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001042 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001043 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001044 COLOR mCursorColor;
1045 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001046 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001047 int lastX;
1048 int mCursorLocation;
1049 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1050 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001051 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001052 unsigned mFontHeight;
1053 unsigned CursorWidth;
1054 bool mRendered;
1055 bool HasMask;
1056 bool DrawCursor;
1057 bool isLocalChange;
1058 bool HasAllowed;
1059 bool HasDisabled;
1060 std::string AllowedList;
1061 std::string DisabledList;
1062 unsigned MinLen;
1063 unsigned MaxLen;
1064};
1065
1066class HardwareKeyboard
1067{
1068public:
thatf37aec22015-02-01 13:38:35 +01001069 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001070 virtual ~HardwareKeyboard();
1071
1072public:
thatf37aec22015-02-01 13:38:35 +01001073 // called by the input handler for key events
1074 int KeyDown(int key_code);
1075 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001076
thatf37aec22015-02-01 13:38:35 +01001077 // called by the input handler when holding a key down
1078 int KeyRepeat();
1079
1080 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001081 void ConsumeKeyRelease(int key);
1082
that8834a0f2016-01-05 23:29:30 +01001083 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001084private:
that8834a0f2016-01-05 23:29:30 +01001085 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001086 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001087 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001088};
1089
Vojtech Bocekede51c52014-02-07 23:58:09 +01001090class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001091{
1092public:
1093 GUISliderValue(xml_node<>* node);
1094 virtual ~GUISliderValue();
1095
1096public:
1097 // Render - Render the full object to the GL surface
1098 // Return 0 on success, <0 on error
1099 virtual int Render(void);
1100
1101 // Update - Update any UI component animations (called <= 30 FPS)
1102 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1103 virtual int Update(void);
1104
1105 // SetPos - Update the position of the render object
1106 // Return 0 on success, <0 on error
1107 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1108
1109 // NotifyTouch - Notify of a touch event
1110 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1111 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1112
1113 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001114 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001115
1116 // SetPageFocus - Notify when a page gains or loses focus
1117 virtual void SetPageFocus(int inFocus);
1118
1119protected:
1120 int measureText(const std::string& str);
1121 int valueFromPct(float pct);
1122 float pctFromValue(int value);
1123 void loadValue(bool force = false);
1124
1125 std::string mVariable;
1126 int mMax;
1127 int mMin;
1128 int mValue;
1129 char *mValueStr;
1130 float mValuePct;
1131 std::string mMaxStr;
1132 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001133 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001134 GUIText* mLabel;
1135 int mLabelW;
1136 COLOR mTextColor;
1137 COLOR mLineColor;
1138 COLOR mSliderColor;
1139 bool mShowRange;
1140 bool mShowCurr;
1141 int mLineX;
1142 int mLineY;
1143 int mLineH;
1144 int mLinePadding;
1145 int mPadding;
1146 int mSliderY;
1147 int mSliderW;
1148 int mSliderH;
1149 bool mRendered;
1150 int mFontHeight;
1151 GUIAction *mAction;
1152 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001153 int mLineW;
1154 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001155 ImageResource *mBackgroundImage;
1156 ImageResource *mHandleImage;
1157 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001158};
1159
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001160class MouseCursor : public RenderObject
1161{
1162public:
1163 MouseCursor(int posX, int posY);
1164 virtual ~MouseCursor();
1165
1166 virtual int Render(void);
1167 virtual int Update(void);
1168 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1169
1170 void Move(int deltaX, int deltaY);
1171 void GetPos(int& x, int& y);
1172 void LoadData(xml_node<>* node);
1173 void ResetData(int resX, int resY);
1174
1175private:
1176 int m_resX;
1177 int m_resY;
1178 bool m_moved;
1179 float m_speedMultiplier;
1180 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001181 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001182 bool m_present;
1183};
1184
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001185class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1186{
1187public:
1188 GUIPatternPassword(xml_node<>* node);
1189 virtual ~GUIPatternPassword();
1190
1191public:
1192 virtual int Render(void);
1193 virtual int Update(void);
1194 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001195 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001196 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1197
1198protected:
1199 void CalculateDotPositions();
1200 void ResetActiveDots();
1201 void ConnectDot(int dot_idx);
1202 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001203 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001204 int InDot(int x, int y);
1205 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001206 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001207 void PatternDrawn();
1208
1209 struct Dot {
1210 int x;
1211 int y;
1212 bool active;
1213 };
1214
Aleksa Saraib25a1832015-12-31 17:36:00 +01001215 std::string mSizeVar;
1216 size_t mGridSize;
1217
1218 Dot* mDots;
1219 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001220 size_t mConnectedDotsLen;
1221 int mCurLineX;
1222 int mCurLineY;
1223 bool mTrackingTouch;
1224 bool mNeedRender;
1225
1226 COLOR mDotColor;
1227 COLOR mActiveDotColor;
1228 COLOR mLineColor;
1229 ImageResource *mDotImage;
1230 ImageResource *mActiveDotImage;
1231 gr_surface mDotCircle;
1232 gr_surface mActiveDotCircle;
1233 int mDotRadius;
1234 int mLineWidth;
1235
1236 std::string mPassVar;
1237 GUIAction *mAction;
1238 int mUpdate;
1239};
1240
1241
Dees_Troy51a0e822012-09-05 15:24:24 -04001242// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001243xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001244std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1245int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1246int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1247int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001248COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001249COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1250FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1251ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1252AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001253bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001254
1255#endif // _OBJECTS_HEADER