blob: 78ed94d4891c80fad79ea3ecd4108b130590dd44 [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
epicX98053c32021-01-04 13:01:31 +0530378 int applycustomtwrpfolder(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100379
380 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400381};
382
Vojtech Bocekede51c52014-02-07 23:58:09 +0100383class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400384{
385public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200386 GUIButton(xml_node<>* node);
387 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400388
389public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200390 // Render - Render the full object to the GL surface
391 // Return 0 on success, <0 on error
392 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400393
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200394 // Update - Update any UI component animations (called <= 30 FPS)
395 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
396 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400397
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200398 // SetPos - Update the position of the render object
399 // Return 0 on success, <0 on error
400 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400401
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200402 // NotifyTouch - Notify of a touch event
403 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
404 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400405
406protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200407 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100408 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200409 GUIText* mButtonLabel;
410 GUIAction* mAction;
411 int mTextX, mTextY, mTextW, mTextH;
412 int mIconX, mIconY, mIconW, mIconH;
413 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600414 bool hasHighlightColor;
415 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500416 bool hasFill;
417 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600418 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000419 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400420};
421
Vojtech Bocekede51c52014-02-07 23:58:09 +0100422class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400423{
424public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200425 GUICheckbox(xml_node<>* node);
426 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400427
428public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200429 // Render - Render the full object to the GL surface
430 // Return 0 on success, <0 on error
431 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400432
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200433 // Update - Update any UI component animations (called <= 30 FPS)
434 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
435 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400436
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200437 // SetPos - Update the position of the render object
438 // Return 0 on success, <0 on error
439 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400440
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200441 // NotifyTouch - Notify of a touch event
442 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
443 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400444
445protected:
thatf6ed8fc2015-02-14 20:23:16 +0100446 ImageResource* mChecked;
447 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200448 GUIText* mLabel;
449 int mTextX, mTextY;
450 int mCheckX, mCheckY, mCheckW, mCheckH;
451 int mLastState;
452 bool mRendered;
453 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400454};
455
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100456class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400457{
458public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100459 GUIScrollList(xml_node<>* node);
460 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400461
462public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200463 // Render - Render the full object to the GL surface
464 // Return 0 on success, <0 on error
465 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400466
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200467 // Update - Update any UI component animations (called <= 30 FPS)
468 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
469 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400470
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200471 // NotifyTouch - Notify of a touch event
472 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
473 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400474
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200475 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100476 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400477
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200478 // SetPos - Update the position of the render object
479 // Return 0 on success, <0 on error
480 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400481
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200482 // SetPageFocus - Notify when a page gains or loses focus
483 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400484
485protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100486 // derived classes need to implement these
487 // get number of items
488 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100489 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
490 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100491 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500492 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100493
that0af77952015-02-25 08:52:19 +0100494 // render a standard-layout list item with optional icon and text
495 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
496
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100497 enum { NO_ITEM = (size_t)-1 };
498 // returns item index at coordinates or NO_ITEM if there is no item there
499 size_t HitTestItem(int x, int y);
500
501 // 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
502 void SetMaxIconSize(int w, int h);
503
504 // This will make sure that the item indicated by list_index is visible on the screen
505 void SetVisibleListLocation(size_t list_index);
506
507 // Handle scrolling changes for drags and kinetic scrolling
508 void HandleScrolling();
509
that9876ac32015-02-15 21:40:59 +0100510 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100511 int GetDisplayItemCount();
512
513 // Returns the size in pixels of a partial item or row size
514 int GetDisplayRemainder();
515
516protected:
517 // Background
518 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100519 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100520
521 // Header
522 COLOR mHeaderBackgroundColor;
523 COLOR mHeaderFontColor;
524 std::string mHeaderText; // Original header text without parsing any variables
525 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100526 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100527 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100528 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100529 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
530 int mHeaderSeparatorH; // Height of the separator between header and list items
531 COLOR mHeaderSeparatorColor; // color of the header separator
532
533 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100534 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100535 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100536 bool hasHighlightColor; // indicates if a highlight color was set
537 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100538 COLOR mFontHighlightColor;
539 int mFontHeight;
540 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
541 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
542 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
543 int mSeparatorH; // Height of the separator between items
544 COLOR mSeparatorColor; // color of the separator that is between items
545
thata9998212015-02-19 22:51:24 +0100546 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100547 int mFastScrollW; // width of the fastscroll area
548 int mFastScrollLineW; // width of the line for fastscroll rendering
549 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100550 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100551 COLOR mFastScrollLineColor;
552 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100553
554 // Scrolling and dynamic state
555 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
556 int mFastScrollRectCurrentH; // current height of fastscroll rect
557 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100558 bool hasScroll; // indicates that we have enough items in the list to scroll
559 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
560 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
561 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 +0100562 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 +0100563 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
564 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
565 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
566 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
567 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500568 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 +0100569};
570
571class GUIFileSelector : public GUIScrollList
572{
573public:
574 GUIFileSelector(xml_node<>* node);
575 virtual ~GUIFileSelector();
576
577public:
578 // Update - Update any UI component animations (called <= 30 FPS)
579 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
580 virtual int Update(void);
581
582 // NotifyVarChange - Notify of a variable change
583 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
584
585 // SetPageFocus - Notify when a page gains or loses focus
586 virtual void SetPageFocus(int inFocus);
587
588 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100589 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100590 virtual void NotifySelect(size_t item_selected);
591
592protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200593 struct FileData {
594 std::string fileName;
595 unsigned char fileType; // Uses d_type format from struct dirent
596 mode_t protection; // Uses mode_t format from stat
597 uid_t userId;
598 gid_t groupId;
599 off_t fileSize;
600 time_t lastAccess; // Uses time_t format from stat
601 time_t lastModified; // Uses time_t format from stat
602 time_t lastStatChange; // Uses time_t format from stat
603 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400604
605protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200606 virtual int GetFileList(const std::string folder);
607 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400608
609protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200610 std::vector<FileData> mFolderList;
611 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100612 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600613 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100614 std::string mExtn; // used for filtering the file list, for example, *.zip
Ian Macdonald15430b62021-01-23 18:52:28 +0100615 std::string mPrfx; // used for filtering the file list, for example, Magisk-
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100616 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
617 std::string mSortVariable; // data manager variable used to change the sorting of files
618 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
619 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
620 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)
621 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100622 ImageResource* mFolderIcon;
623 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600624 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400625};
626
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100627class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400628{
629public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200630 GUIListBox(xml_node<>* node);
631 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400632
633public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200634 // Update - Update any UI component animations (called <= 30 FPS)
635 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
636 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400637
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200638 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100639 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400640
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200641 // SetPageFocus - Notify when a page gains or loses focus
642 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400643
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100644 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100645 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100646 virtual void NotifySelect(size_t item_selected);
647
Dees_Troy51a0e822012-09-05 15:24:24 -0400648protected:
that8ab5c132015-09-13 23:00:54 +0200649 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200650 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500651 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400652 std::string variableValue;
653 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200654 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200655 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200656 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400657
658protected:
that8ab5c132015-09-13 23:00:54 +0200659 std::vector<ListItem> mListItems;
660 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200661 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400662 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100663 ImageResource* mIconSelected;
664 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500665 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600666 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400667};
668
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100669class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500670{
671public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200672 GUIPartitionList(xml_node<>* node);
673 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500674
675public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200676 // Update - Update any UI component animations (called <= 30 FPS)
677 // 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 +0100678 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500679
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200680 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100681 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500682
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200683 // SetPageFocus - Notify when a page gains or loses focus
684 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500685
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100686 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100687 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100688 virtual void NotifySelect(size_t item_selected);
689
Dees_Troya13d74f2013-03-24 08:54:55 -0500690protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100691 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600692 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500693
694protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200695 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500696 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200697 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500698 std::string selectedList;
699 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500700 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100701 ImageResource* mIconSelected;
702 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500703 bool updateList;
704};
705
Ethan Yonker44925ad2015-07-22 12:33:59 -0500706class GUITextBox : public GUIScrollList
707{
708public:
709 GUITextBox(xml_node<>* node);
710
711public:
712 // Update - Update any UI component animations (called <= 30 FPS)
713 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
714 virtual int Update(void);
715
716 // NotifyVarChange - Notify of a variable change
717 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
718
719 // ScrollList interface
720 virtual size_t GetItemCount();
721 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
722 virtual void NotifySelect(size_t item_selected);
723protected:
724
725 size_t mLastCount;
726 bool mIsStatic;
727 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
728 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
729 std::vector<std::string> rText; // Rendered text - what we actually see
730
731};
732
that8d46c092015-02-26 01:30:04 +0100733class GUIConsole : public GUIScrollList
734{
735public:
736 GUIConsole(xml_node<>* node);
737
738public:
739 // Render - Render the full object to the GL surface
740 // Return 0 on success, <0 on error
741 virtual int Render(void);
742
743 // Update - Update any UI component animations (called <= 30 FPS)
744 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
745 virtual int Update(void);
746
747 // IsInRegion - Checks if the request is handled by this object
748 // Return 1 if this object handles the request, 0 if not
749 virtual int IsInRegion(int x, int y);
750
751 // NotifyTouch - Notify of a touch event
752 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
753 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
754
755 // ScrollList interface
756 virtual size_t GetItemCount();
757 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
758 virtual void NotifySelect(size_t item_selected);
thata9dd9f02017-02-23 23:08:56 +0100759
Ethan Yonker74db1572015-10-28 12:44:49 -0500760 static void Translate_Now();
thata9dd9f02017-02-23 23:08:56 +0100761 static void Clear_For_Retranslation();
that8d46c092015-02-26 01:30:04 +0100762protected:
763 enum SlideoutState
764 {
765 hidden = 0,
766 visible,
767 request_hide,
768 request_show
769 };
770
771 ImageResource* mSlideoutImage;
772 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
773 bool scrollToEnd; // true if we want to keep tracking the last line
774 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
775 int mSlideout;
776 SlideoutState mSlideoutState;
777 std::vector<std::string> rConsole;
778 std::vector<std::string> rConsoleColor;
779
780protected:
that8d46c092015-02-26 01:30:04 +0100781 int RenderSlideout(void);
782 int RenderConsole(void);
783};
784
that1964d192016-01-07 00:41:03 +0100785class TerminalEngine;
786class GUITerminal : public GUIScrollList, public InputObject
787{
788public:
789 GUITerminal(xml_node<>* node);
790
791public:
792 // Update - Update any UI component animations (called <= 30 FPS)
793 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
794 virtual int Update(void);
795
796 // NotifyTouch - Notify of a touch event
797 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
798 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
799
800 // NotifyKey - Notify of a key press
801 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
802 virtual int NotifyKey(int key, bool down);
803
804 // character input
805 virtual int NotifyCharInput(int ch);
806
807 // SetPageFocus - Notify when a page gains or loses focus
808 virtual void SetPageFocus(int inFocus);
809
810 // ScrollList interface
811 virtual size_t GetItemCount();
812 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
813 virtual void NotifySelect(size_t item_selected);
Mohd Faraz3c25ab32020-08-12 12:29:42 +0000814 bool status();
815 void stop();
that1964d192016-01-07 00:41:03 +0100816protected:
817 void InitAndResize();
818
819 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
820 int updateCounter; // to track if anything changed in the back-end
821 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
822};
823
Dees_Troy51a0e822012-09-05 15:24:24 -0400824// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100825class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400826{
827public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200828 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400829
830public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200831 // Render - Render the full object to the GL surface
832 // Return 0 on success, <0 on error
833 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400834
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200835 // Update - Update any UI component animations (called <= 30 FPS)
836 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
837 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400838
839protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200840 AnimationResource* mAnimation;
841 int mFrame;
842 int mFPS;
843 int mLoop;
844 int mRender;
845 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400846};
847
Vojtech Bocekede51c52014-02-07 23:58:09 +0100848class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400849{
850public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200851 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400852
853public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200854 // Render - Render the full object to the GL surface
855 // Return 0 on success, <0 on error
856 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400857
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200858 // Update - Update any UI component animations (called <= 30 FPS)
859 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
860 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400861
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200862 // NotifyVarChange - Notify of a variable change
863 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100864 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400865
866protected:
thatf6ed8fc2015-02-14 20:23:16 +0100867 ImageResource* mEmptyBar;
868 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200869 std::string mMinValVar;
870 std::string mMaxValVar;
871 std::string mCurValVar;
872 float mSlide;
873 float mSlideInc;
874 int mSlideFrames;
875 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400876
877protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200878 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400879};
880
Vojtech Bocekede51c52014-02-07 23:58:09 +0100881class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400882{
883public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200884 GUISlider(xml_node<>* node);
885 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400886
887public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200888 // Render - Render the full object to the GL surface
889 // Return 0 on success, <0 on error
890 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400891
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200892 // Update - Update any UI component animations (called <= 30 FPS)
893 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
894 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400895
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200896 // NotifyTouch - Notify of a touch event
897 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
898 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400899
900protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200901 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600902 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100903 ImageResource* sSlider;
904 ImageResource* sSliderUsed;
905 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200906 int sTouchW, sTouchH;
907 int sCurTouchX;
908 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400909};
910
that8834a0f2016-01-05 23:29:30 +0100911// these are ASCII codes reported via NotifyCharInput
912// other special keys (arrows etc.) are reported via NotifyKey
913#define KEYBOARD_ACTION 13 // CR
914#define KEYBOARD_BACKSPACE 8 // Backspace
915#define KEYBOARD_TAB 9 // Tab
916#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
917#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400918
Vojtech Bocekede51c52014-02-07 23:58:09 +0100919class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400920{
921public:
922 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200923 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400924
925public:
926 virtual int Render(void);
927 virtual int Update(void);
928 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
929 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100930 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400931
932protected:
thate79878b2015-03-14 23:07:23 +0100933 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200934 {
that8834a0f2016-01-05 23:29:30 +0100935 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
936 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100937 int end_x;
938 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200939 };
thate79878b2015-03-14 23:07:23 +0100940 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200941 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200942 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100943 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100944
945 enum {
946 MAX_KEYBOARD_LAYOUTS = 5,
947 MAX_KEYBOARD_ROWS = 9,
948 MAX_KEYBOARD_KEYS = 20
949 };
950 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600951 {
thatd86f49d2015-03-15 00:56:57 +0100952 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100953 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100954 int row_end_y[MAX_KEYBOARD_ROWS];
955 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600956 int revert_layout;
957 };
thatd86f49d2015-03-15 00:56:57 +0100958 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400959
thatf256b722015-05-23 20:44:12 +0200960 struct KeyLabel
961 {
that8834a0f2016-01-05 23:29:30 +0100962 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200963 int layout_from; // 1-based; 0 for labels that apply to all layouts
964 int layout_to; // same as Key.layout
965 string text; // key label text
966 ImageResource* image; // image (overrides text if defined)
967 };
968 std::vector<KeyLabel> mKeyLabels;
969
thate79878b2015-03-14 23:07:23 +0100970 // Find key at screen coordinates
971 Key* HitTestKey(int x, int y);
972
Dees_Troy51a0e822012-09-05 15:24:24 -0400973 bool mRendered;
974 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100975 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100976 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100977 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 +0200978 int highlightRenderCount;
979 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100980 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400981 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600982 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100983 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200984 COLOR mFontColor; // for centered key labels
985 COLOR mFontColorSmall; // for centered key labels
986 FontResource* mFont; // for main key labels
987 FontResource* mSmallFont; // for key labels like "?123"
988 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200989 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200990 COLOR mLongpressFontColor;
991 COLOR mBackgroundColor; // keyboard background color
992 COLOR mKeyColorAlphanumeric; // key background color
993 COLOR mKeyColorOther; // key background color
994 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400995};
996
997// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100998class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400999{
1000public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001001 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -04001002 virtual ~GUIInput();
1003
1004public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001005 // Render - Render the full object to the GL surface
1006 // Return 0 on success, <0 on error
1007 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001008
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001009 // Update - Update any UI component animations (called <= 30 FPS)
1010 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1011 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001012
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001013 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001014 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001015
1016 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001017 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1018 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001019
that8834a0f2016-01-05 23:29:30 +01001020 virtual int NotifyKey(int key, bool down);
1021 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001022
1023protected:
1024 virtual int GetSelection(int x, int y);
1025
1026 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001027 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001028 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001029 void HandleCursorByTouch(int x);
1030 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001031
1032protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001033 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001034 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001035 ImageResource* mBackground;
1036 ImageResource* mCursor;
1037 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001038 std::string mVariable;
1039 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001040 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001041 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001042 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001043 COLOR mCursorColor;
1044 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001045 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001046 int lastX;
1047 int mCursorLocation;
1048 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1049 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001050 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001051 unsigned mFontHeight;
1052 unsigned CursorWidth;
1053 bool mRendered;
1054 bool HasMask;
1055 bool DrawCursor;
1056 bool isLocalChange;
1057 bool HasAllowed;
1058 bool HasDisabled;
1059 std::string AllowedList;
1060 std::string DisabledList;
1061 unsigned MinLen;
1062 unsigned MaxLen;
1063};
1064
1065class HardwareKeyboard
1066{
1067public:
thatf37aec22015-02-01 13:38:35 +01001068 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001069 virtual ~HardwareKeyboard();
1070
1071public:
thatf37aec22015-02-01 13:38:35 +01001072 // called by the input handler for key events
1073 int KeyDown(int key_code);
1074 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001075
thatf37aec22015-02-01 13:38:35 +01001076 // called by the input handler when holding a key down
1077 int KeyRepeat();
1078
1079 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001080 void ConsumeKeyRelease(int key);
1081
that8834a0f2016-01-05 23:29:30 +01001082 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001083private:
that8834a0f2016-01-05 23:29:30 +01001084 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001085 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001086 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001087};
1088
Vojtech Bocekede51c52014-02-07 23:58:09 +01001089class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001090{
1091public:
1092 GUISliderValue(xml_node<>* node);
1093 virtual ~GUISliderValue();
1094
1095public:
1096 // Render - Render the full object to the GL surface
1097 // Return 0 on success, <0 on error
1098 virtual int Render(void);
1099
1100 // Update - Update any UI component animations (called <= 30 FPS)
1101 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1102 virtual int Update(void);
1103
1104 // SetPos - Update the position of the render object
1105 // Return 0 on success, <0 on error
1106 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1107
1108 // NotifyTouch - Notify of a touch event
1109 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1110 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1111
1112 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001113 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001114
1115 // SetPageFocus - Notify when a page gains or loses focus
1116 virtual void SetPageFocus(int inFocus);
1117
1118protected:
1119 int measureText(const std::string& str);
1120 int valueFromPct(float pct);
1121 float pctFromValue(int value);
1122 void loadValue(bool force = false);
1123
1124 std::string mVariable;
1125 int mMax;
1126 int mMin;
1127 int mValue;
1128 char *mValueStr;
1129 float mValuePct;
1130 std::string mMaxStr;
1131 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001132 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001133 GUIText* mLabel;
1134 int mLabelW;
1135 COLOR mTextColor;
1136 COLOR mLineColor;
1137 COLOR mSliderColor;
1138 bool mShowRange;
1139 bool mShowCurr;
1140 int mLineX;
1141 int mLineY;
1142 int mLineH;
1143 int mLinePadding;
1144 int mPadding;
1145 int mSliderY;
1146 int mSliderW;
1147 int mSliderH;
1148 bool mRendered;
1149 int mFontHeight;
1150 GUIAction *mAction;
1151 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001152 int mLineW;
1153 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001154 ImageResource *mBackgroundImage;
1155 ImageResource *mHandleImage;
1156 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001157};
1158
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001159class MouseCursor : public RenderObject
1160{
1161public:
1162 MouseCursor(int posX, int posY);
1163 virtual ~MouseCursor();
1164
1165 virtual int Render(void);
1166 virtual int Update(void);
1167 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1168
1169 void Move(int deltaX, int deltaY);
1170 void GetPos(int& x, int& y);
1171 void LoadData(xml_node<>* node);
1172 void ResetData(int resX, int resY);
1173
1174private:
1175 int m_resX;
1176 int m_resY;
1177 bool m_moved;
1178 float m_speedMultiplier;
1179 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001180 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001181 bool m_present;
1182};
1183
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001184class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1185{
1186public:
1187 GUIPatternPassword(xml_node<>* node);
1188 virtual ~GUIPatternPassword();
1189
1190public:
1191 virtual int Render(void);
1192 virtual int Update(void);
1193 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001194 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001195 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1196
1197protected:
1198 void CalculateDotPositions();
1199 void ResetActiveDots();
1200 void ConnectDot(int dot_idx);
1201 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001202 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001203 int InDot(int x, int y);
1204 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001205 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001206 void PatternDrawn();
1207
1208 struct Dot {
1209 int x;
1210 int y;
1211 bool active;
1212 };
1213
Aleksa Saraib25a1832015-12-31 17:36:00 +01001214 std::string mSizeVar;
1215 size_t mGridSize;
1216
1217 Dot* mDots;
1218 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001219 size_t mConnectedDotsLen;
1220 int mCurLineX;
1221 int mCurLineY;
1222 bool mTrackingTouch;
1223 bool mNeedRender;
1224
1225 COLOR mDotColor;
1226 COLOR mActiveDotColor;
1227 COLOR mLineColor;
1228 ImageResource *mDotImage;
1229 ImageResource *mActiveDotImage;
1230 gr_surface mDotCircle;
1231 gr_surface mActiveDotCircle;
1232 int mDotRadius;
1233 int mLineWidth;
1234
1235 std::string mPassVar;
1236 GUIAction *mAction;
1237 int mUpdate;
1238};
1239
1240
Dees_Troy51a0e822012-09-05 15:24:24 -04001241// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001242xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001243std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1244int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1245int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1246int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001247COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001248COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1249FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1250ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1251AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001252bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001253
1254#endif // _OBJECTS_HEADER