blob: eaab2e7c5227a6ec24f758f62fc80dd16c318e05 [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);
373 int fixabrecoverybootloop(std::string arg);
Mohd Faraz3c25ab32020-08-12 12:29:42 +0000374 int changeterminal(std::string arg);
Captain Throwback3b556102021-02-12 19:32:36 -0500375#ifndef TW_EXCLUDE_NANO
376 int editfile(std::string arg);
377#endif
that3f7b1ac2014-12-30 11:30:13 +0100378
379 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400380};
381
Vojtech Bocekede51c52014-02-07 23:58:09 +0100382class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400383{
384public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200385 GUIButton(xml_node<>* node);
386 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400387
388public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200389 // Render - Render the full object to the GL surface
390 // Return 0 on success, <0 on error
391 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400392
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200393 // Update - Update any UI component animations (called <= 30 FPS)
394 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
395 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400396
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200397 // SetPos - Update the position of the render object
398 // Return 0 on success, <0 on error
399 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400400
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200401 // NotifyTouch - Notify of a touch event
402 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
403 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400404
405protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200406 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100407 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200408 GUIText* mButtonLabel;
409 GUIAction* mAction;
410 int mTextX, mTextY, mTextW, mTextH;
411 int mIconX, mIconY, mIconW, mIconH;
412 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600413 bool hasHighlightColor;
414 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500415 bool hasFill;
416 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600417 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000418 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400419};
420
Vojtech Bocekede51c52014-02-07 23:58:09 +0100421class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400422{
423public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200424 GUICheckbox(xml_node<>* node);
425 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400426
427public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200428 // Render - Render the full object to the GL surface
429 // Return 0 on success, <0 on error
430 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400431
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200432 // Update - Update any UI component animations (called <= 30 FPS)
433 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
434 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400435
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200436 // SetPos - Update the position of the render object
437 // Return 0 on success, <0 on error
438 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400439
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200440 // NotifyTouch - Notify of a touch event
441 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
442 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400443
444protected:
thatf6ed8fc2015-02-14 20:23:16 +0100445 ImageResource* mChecked;
446 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200447 GUIText* mLabel;
448 int mTextX, mTextY;
449 int mCheckX, mCheckY, mCheckW, mCheckH;
450 int mLastState;
451 bool mRendered;
452 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400453};
454
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100455class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400456{
457public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100458 GUIScrollList(xml_node<>* node);
459 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400460
461public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200462 // Render - Render the full object to the GL surface
463 // Return 0 on success, <0 on error
464 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400465
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200466 // Update - Update any UI component animations (called <= 30 FPS)
467 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
468 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400469
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200470 // NotifyTouch - Notify of a touch event
471 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
472 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400473
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200474 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100475 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400476
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200477 // SetPos - Update the position of the render object
478 // Return 0 on success, <0 on error
479 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400480
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200481 // SetPageFocus - Notify when a page gains or loses focus
482 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400483
484protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100485 // derived classes need to implement these
486 // get number of items
487 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100488 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
489 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100490 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500491 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100492
that0af77952015-02-25 08:52:19 +0100493 // render a standard-layout list item with optional icon and text
494 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
495
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100496 enum { NO_ITEM = (size_t)-1 };
497 // returns item index at coordinates or NO_ITEM if there is no item there
498 size_t HitTestItem(int x, int y);
499
500 // 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
501 void SetMaxIconSize(int w, int h);
502
503 // This will make sure that the item indicated by list_index is visible on the screen
504 void SetVisibleListLocation(size_t list_index);
505
506 // Handle scrolling changes for drags and kinetic scrolling
507 void HandleScrolling();
508
that9876ac32015-02-15 21:40:59 +0100509 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100510 int GetDisplayItemCount();
511
512 // Returns the size in pixels of a partial item or row size
513 int GetDisplayRemainder();
514
515protected:
516 // Background
517 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100518 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100519
520 // Header
521 COLOR mHeaderBackgroundColor;
522 COLOR mHeaderFontColor;
523 std::string mHeaderText; // Original header text without parsing any variables
524 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100525 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100526 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100527 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100528 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
529 int mHeaderSeparatorH; // Height of the separator between header and list items
530 COLOR mHeaderSeparatorColor; // color of the header separator
531
532 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100533 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100534 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100535 bool hasHighlightColor; // indicates if a highlight color was set
536 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100537 COLOR mFontHighlightColor;
538 int mFontHeight;
539 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
540 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
541 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
542 int mSeparatorH; // Height of the separator between items
543 COLOR mSeparatorColor; // color of the separator that is between items
544
thata9998212015-02-19 22:51:24 +0100545 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100546 int mFastScrollW; // width of the fastscroll area
547 int mFastScrollLineW; // width of the line for fastscroll rendering
548 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100549 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100550 COLOR mFastScrollLineColor;
551 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100552
553 // Scrolling and dynamic state
554 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
555 int mFastScrollRectCurrentH; // current height of fastscroll rect
556 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100557 bool hasScroll; // indicates that we have enough items in the list to scroll
558 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
559 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
560 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 +0100561 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 +0100562 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
563 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
564 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
565 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
566 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500567 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 +0100568};
569
570class GUIFileSelector : public GUIScrollList
571{
572public:
573 GUIFileSelector(xml_node<>* node);
574 virtual ~GUIFileSelector();
575
576public:
577 // Update - Update any UI component animations (called <= 30 FPS)
578 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
579 virtual int Update(void);
580
581 // NotifyVarChange - Notify of a variable change
582 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
583
584 // SetPageFocus - Notify when a page gains or loses focus
585 virtual void SetPageFocus(int inFocus);
586
587 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100588 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100589 virtual void NotifySelect(size_t item_selected);
590
591protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200592 struct FileData {
593 std::string fileName;
594 unsigned char fileType; // Uses d_type format from struct dirent
595 mode_t protection; // Uses mode_t format from stat
596 uid_t userId;
597 gid_t groupId;
598 off_t fileSize;
599 time_t lastAccess; // Uses time_t format from stat
600 time_t lastModified; // Uses time_t format from stat
601 time_t lastStatChange; // Uses time_t format from stat
602 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400603
604protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200605 virtual int GetFileList(const std::string folder);
606 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400607
608protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200609 std::vector<FileData> mFolderList;
610 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100611 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600612 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100613 std::string mExtn; // used for filtering the file list, for example, *.zip
Ian Macdonald15430b62021-01-23 18:52:28 +0100614 std::string mPrfx; // used for filtering the file list, for example, Magisk-
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100615 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
616 std::string mSortVariable; // data manager variable used to change the sorting of files
617 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
618 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
619 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)
620 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100621 ImageResource* mFolderIcon;
622 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600623 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400624};
625
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100626class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400627{
628public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200629 GUIListBox(xml_node<>* node);
630 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400631
632public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200633 // Update - Update any UI component animations (called <= 30 FPS)
634 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
635 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400636
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200637 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100638 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400639
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200640 // SetPageFocus - Notify when a page gains or loses focus
641 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400642
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100643 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100644 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100645 virtual void NotifySelect(size_t item_selected);
646
Dees_Troy51a0e822012-09-05 15:24:24 -0400647protected:
that8ab5c132015-09-13 23:00:54 +0200648 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200649 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500650 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400651 std::string variableValue;
652 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200653 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200654 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200655 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400656
657protected:
that8ab5c132015-09-13 23:00:54 +0200658 std::vector<ListItem> mListItems;
659 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200660 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400661 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100662 ImageResource* mIconSelected;
663 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500664 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600665 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400666};
667
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100668class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500669{
670public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200671 GUIPartitionList(xml_node<>* node);
672 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500673
674public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200675 // Update - Update any UI component animations (called <= 30 FPS)
676 // 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 +0100677 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500678
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200679 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100680 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500681
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200682 // SetPageFocus - Notify when a page gains or loses focus
683 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500684
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100685 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100686 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100687 virtual void NotifySelect(size_t item_selected);
688
Dees_Troya13d74f2013-03-24 08:54:55 -0500689protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100690 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600691 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500692
693protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200694 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500695 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200696 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500697 std::string selectedList;
698 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500699 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100700 ImageResource* mIconSelected;
701 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500702 bool updateList;
703};
704
Ethan Yonker44925ad2015-07-22 12:33:59 -0500705class GUITextBox : public GUIScrollList
706{
707public:
708 GUITextBox(xml_node<>* node);
709
710public:
711 // Update - Update any UI component animations (called <= 30 FPS)
712 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
713 virtual int Update(void);
714
715 // NotifyVarChange - Notify of a variable change
716 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
717
718 // ScrollList interface
719 virtual size_t GetItemCount();
720 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
721 virtual void NotifySelect(size_t item_selected);
722protected:
723
724 size_t mLastCount;
725 bool mIsStatic;
726 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
727 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
728 std::vector<std::string> rText; // Rendered text - what we actually see
729
730};
731
that8d46c092015-02-26 01:30:04 +0100732class GUIConsole : public GUIScrollList
733{
734public:
735 GUIConsole(xml_node<>* node);
736
737public:
738 // Render - Render the full object to the GL surface
739 // Return 0 on success, <0 on error
740 virtual int Render(void);
741
742 // Update - Update any UI component animations (called <= 30 FPS)
743 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
744 virtual int Update(void);
745
746 // IsInRegion - Checks if the request is handled by this object
747 // Return 1 if this object handles the request, 0 if not
748 virtual int IsInRegion(int x, int y);
749
750 // NotifyTouch - Notify of a touch event
751 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
752 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
753
754 // ScrollList interface
755 virtual size_t GetItemCount();
756 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
757 virtual void NotifySelect(size_t item_selected);
thata9dd9f02017-02-23 23:08:56 +0100758
Ethan Yonker74db1572015-10-28 12:44:49 -0500759 static void Translate_Now();
thata9dd9f02017-02-23 23:08:56 +0100760 static void Clear_For_Retranslation();
that8d46c092015-02-26 01:30:04 +0100761protected:
762 enum SlideoutState
763 {
764 hidden = 0,
765 visible,
766 request_hide,
767 request_show
768 };
769
770 ImageResource* mSlideoutImage;
771 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
772 bool scrollToEnd; // true if we want to keep tracking the last line
773 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
774 int mSlideout;
775 SlideoutState mSlideoutState;
776 std::vector<std::string> rConsole;
777 std::vector<std::string> rConsoleColor;
778
779protected:
that8d46c092015-02-26 01:30:04 +0100780 int RenderSlideout(void);
781 int RenderConsole(void);
782};
783
that1964d192016-01-07 00:41:03 +0100784class TerminalEngine;
785class GUITerminal : public GUIScrollList, public InputObject
786{
787public:
788 GUITerminal(xml_node<>* node);
789
790public:
791 // Update - Update any UI component animations (called <= 30 FPS)
792 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
793 virtual int Update(void);
794
795 // NotifyTouch - Notify of a touch event
796 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
797 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
798
799 // NotifyKey - Notify of a key press
800 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
801 virtual int NotifyKey(int key, bool down);
802
803 // character input
804 virtual int NotifyCharInput(int ch);
805
806 // SetPageFocus - Notify when a page gains or loses focus
807 virtual void SetPageFocus(int inFocus);
808
809 // ScrollList interface
810 virtual size_t GetItemCount();
811 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
812 virtual void NotifySelect(size_t item_selected);
Mohd Faraz3c25ab32020-08-12 12:29:42 +0000813 bool status();
814 void stop();
that1964d192016-01-07 00:41:03 +0100815protected:
816 void InitAndResize();
817
818 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
819 int updateCounter; // to track if anything changed in the back-end
820 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
821};
822
Dees_Troy51a0e822012-09-05 15:24:24 -0400823// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100824class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400825{
826public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200827 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400828
829public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200830 // Render - Render the full object to the GL surface
831 // Return 0 on success, <0 on error
832 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400833
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200834 // Update - Update any UI component animations (called <= 30 FPS)
835 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
836 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400837
838protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200839 AnimationResource* mAnimation;
840 int mFrame;
841 int mFPS;
842 int mLoop;
843 int mRender;
844 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400845};
846
Vojtech Bocekede51c52014-02-07 23:58:09 +0100847class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400848{
849public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200850 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400851
852public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200853 // Render - Render the full object to the GL surface
854 // Return 0 on success, <0 on error
855 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400856
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200857 // Update - Update any UI component animations (called <= 30 FPS)
858 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
859 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400860
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200861 // NotifyVarChange - Notify of a variable change
862 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100863 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400864
865protected:
thatf6ed8fc2015-02-14 20:23:16 +0100866 ImageResource* mEmptyBar;
867 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200868 std::string mMinValVar;
869 std::string mMaxValVar;
870 std::string mCurValVar;
871 float mSlide;
872 float mSlideInc;
873 int mSlideFrames;
874 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400875
876protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200877 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400878};
879
Vojtech Bocekede51c52014-02-07 23:58:09 +0100880class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400881{
882public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200883 GUISlider(xml_node<>* node);
884 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400885
886public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200887 // Render - Render the full object to the GL surface
888 // Return 0 on success, <0 on error
889 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400890
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200891 // Update - Update any UI component animations (called <= 30 FPS)
892 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
893 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400894
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200895 // NotifyTouch - Notify of a touch event
896 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
897 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400898
899protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200900 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600901 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100902 ImageResource* sSlider;
903 ImageResource* sSliderUsed;
904 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200905 int sTouchW, sTouchH;
906 int sCurTouchX;
907 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400908};
909
that8834a0f2016-01-05 23:29:30 +0100910// these are ASCII codes reported via NotifyCharInput
911// other special keys (arrows etc.) are reported via NotifyKey
912#define KEYBOARD_ACTION 13 // CR
913#define KEYBOARD_BACKSPACE 8 // Backspace
914#define KEYBOARD_TAB 9 // Tab
915#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
916#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400917
Vojtech Bocekede51c52014-02-07 23:58:09 +0100918class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400919{
920public:
921 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200922 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400923
924public:
925 virtual int Render(void);
926 virtual int Update(void);
927 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
928 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100929 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400930
931protected:
thate79878b2015-03-14 23:07:23 +0100932 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200933 {
that8834a0f2016-01-05 23:29:30 +0100934 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
935 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100936 int end_x;
937 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200938 };
thate79878b2015-03-14 23:07:23 +0100939 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200940 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200941 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100942 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100943
944 enum {
945 MAX_KEYBOARD_LAYOUTS = 5,
946 MAX_KEYBOARD_ROWS = 9,
947 MAX_KEYBOARD_KEYS = 20
948 };
949 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600950 {
thatd86f49d2015-03-15 00:56:57 +0100951 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100952 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100953 int row_end_y[MAX_KEYBOARD_ROWS];
954 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600955 int revert_layout;
956 };
thatd86f49d2015-03-15 00:56:57 +0100957 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400958
thatf256b722015-05-23 20:44:12 +0200959 struct KeyLabel
960 {
that8834a0f2016-01-05 23:29:30 +0100961 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200962 int layout_from; // 1-based; 0 for labels that apply to all layouts
963 int layout_to; // same as Key.layout
964 string text; // key label text
965 ImageResource* image; // image (overrides text if defined)
966 };
967 std::vector<KeyLabel> mKeyLabels;
968
thate79878b2015-03-14 23:07:23 +0100969 // Find key at screen coordinates
970 Key* HitTestKey(int x, int y);
971
Dees_Troy51a0e822012-09-05 15:24:24 -0400972 bool mRendered;
973 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100974 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100975 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100976 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 +0200977 int highlightRenderCount;
978 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100979 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400980 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600981 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100982 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200983 COLOR mFontColor; // for centered key labels
984 COLOR mFontColorSmall; // for centered key labels
985 FontResource* mFont; // for main key labels
986 FontResource* mSmallFont; // for key labels like "?123"
987 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200988 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200989 COLOR mLongpressFontColor;
990 COLOR mBackgroundColor; // keyboard background color
991 COLOR mKeyColorAlphanumeric; // key background color
992 COLOR mKeyColorOther; // key background color
993 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400994};
995
996// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100997class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400998{
999public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001000 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -04001001 virtual ~GUIInput();
1002
1003public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001004 // Render - Render the full object to the GL surface
1005 // Return 0 on success, <0 on error
1006 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001007
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001008 // Update - Update any UI component animations (called <= 30 FPS)
1009 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1010 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001011
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001012 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001013 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001014
1015 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001016 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1017 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001018
that8834a0f2016-01-05 23:29:30 +01001019 virtual int NotifyKey(int key, bool down);
1020 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001021
1022protected:
1023 virtual int GetSelection(int x, int y);
1024
1025 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001026 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001027 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001028 void HandleCursorByTouch(int x);
1029 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001030
1031protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001032 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001033 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001034 ImageResource* mBackground;
1035 ImageResource* mCursor;
1036 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001037 std::string mVariable;
1038 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001039 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001040 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001041 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001042 COLOR mCursorColor;
1043 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001044 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001045 int lastX;
1046 int mCursorLocation;
1047 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1048 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001049 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001050 unsigned mFontHeight;
1051 unsigned CursorWidth;
1052 bool mRendered;
1053 bool HasMask;
1054 bool DrawCursor;
1055 bool isLocalChange;
1056 bool HasAllowed;
1057 bool HasDisabled;
1058 std::string AllowedList;
1059 std::string DisabledList;
1060 unsigned MinLen;
1061 unsigned MaxLen;
1062};
1063
1064class HardwareKeyboard
1065{
1066public:
thatf37aec22015-02-01 13:38:35 +01001067 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001068 virtual ~HardwareKeyboard();
1069
1070public:
thatf37aec22015-02-01 13:38:35 +01001071 // called by the input handler for key events
1072 int KeyDown(int key_code);
1073 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001074
thatf37aec22015-02-01 13:38:35 +01001075 // called by the input handler when holding a key down
1076 int KeyRepeat();
1077
1078 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001079 void ConsumeKeyRelease(int key);
1080
that8834a0f2016-01-05 23:29:30 +01001081 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001082private:
that8834a0f2016-01-05 23:29:30 +01001083 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001084 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001085 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001086};
1087
Vojtech Bocekede51c52014-02-07 23:58:09 +01001088class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001089{
1090public:
1091 GUISliderValue(xml_node<>* node);
1092 virtual ~GUISliderValue();
1093
1094public:
1095 // Render - Render the full object to the GL surface
1096 // Return 0 on success, <0 on error
1097 virtual int Render(void);
1098
1099 // Update - Update any UI component animations (called <= 30 FPS)
1100 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1101 virtual int Update(void);
1102
1103 // SetPos - Update the position of the render object
1104 // Return 0 on success, <0 on error
1105 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1106
1107 // NotifyTouch - Notify of a touch event
1108 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1109 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1110
1111 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001112 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001113
1114 // SetPageFocus - Notify when a page gains or loses focus
1115 virtual void SetPageFocus(int inFocus);
1116
1117protected:
1118 int measureText(const std::string& str);
1119 int valueFromPct(float pct);
1120 float pctFromValue(int value);
1121 void loadValue(bool force = false);
1122
1123 std::string mVariable;
1124 int mMax;
1125 int mMin;
1126 int mValue;
1127 char *mValueStr;
1128 float mValuePct;
1129 std::string mMaxStr;
1130 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001131 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001132 GUIText* mLabel;
1133 int mLabelW;
1134 COLOR mTextColor;
1135 COLOR mLineColor;
1136 COLOR mSliderColor;
1137 bool mShowRange;
1138 bool mShowCurr;
1139 int mLineX;
1140 int mLineY;
1141 int mLineH;
1142 int mLinePadding;
1143 int mPadding;
1144 int mSliderY;
1145 int mSliderW;
1146 int mSliderH;
1147 bool mRendered;
1148 int mFontHeight;
1149 GUIAction *mAction;
1150 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001151 int mLineW;
1152 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001153 ImageResource *mBackgroundImage;
1154 ImageResource *mHandleImage;
1155 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001156};
1157
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001158class MouseCursor : public RenderObject
1159{
1160public:
1161 MouseCursor(int posX, int posY);
1162 virtual ~MouseCursor();
1163
1164 virtual int Render(void);
1165 virtual int Update(void);
1166 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1167
1168 void Move(int deltaX, int deltaY);
1169 void GetPos(int& x, int& y);
1170 void LoadData(xml_node<>* node);
1171 void ResetData(int resX, int resY);
1172
1173private:
1174 int m_resX;
1175 int m_resY;
1176 bool m_moved;
1177 float m_speedMultiplier;
1178 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001179 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001180 bool m_present;
1181};
1182
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001183class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1184{
1185public:
1186 GUIPatternPassword(xml_node<>* node);
1187 virtual ~GUIPatternPassword();
1188
1189public:
1190 virtual int Render(void);
1191 virtual int Update(void);
1192 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001193 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001194 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1195
1196protected:
1197 void CalculateDotPositions();
1198 void ResetActiveDots();
1199 void ConnectDot(int dot_idx);
1200 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001201 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001202 int InDot(int x, int y);
1203 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001204 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001205 void PatternDrawn();
1206
1207 struct Dot {
1208 int x;
1209 int y;
1210 bool active;
1211 };
1212
Aleksa Saraib25a1832015-12-31 17:36:00 +01001213 std::string mSizeVar;
1214 size_t mGridSize;
1215
1216 Dot* mDots;
1217 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001218 size_t mConnectedDotsLen;
1219 int mCurLineX;
1220 int mCurLineY;
1221 bool mTrackingTouch;
1222 bool mNeedRender;
1223
1224 COLOR mDotColor;
1225 COLOR mActiveDotColor;
1226 COLOR mLineColor;
1227 ImageResource *mDotImage;
1228 ImageResource *mActiveDotImage;
1229 gr_surface mDotCircle;
1230 gr_surface mActiveDotCircle;
1231 int mDotRadius;
1232 int mLineWidth;
1233
1234 std::string mPassVar;
1235 GUIAction *mAction;
1236 int mUpdate;
1237};
1238
1239
Dees_Troy51a0e822012-09-05 15:24:24 -04001240// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001241xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001242std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1243int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1244int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1245int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001246COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001247COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1248FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1249ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1250AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001251bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001252
1253#endif // _OBJECTS_HEADER