blob: 48a2e8953a97fd65873386203879bc4ef23dd20c [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);
mauronofrio6d3bf892019-10-26 19:47:55 +0200291 int ozip_decrypt(std::string zip_path);
thatcc8ddca2015-01-03 01:59:36 +0100292 void reinject_after_flash();
Dees_Troy51a0e822012-09-05 15:24:24 -0400293 void operation_start(const string operation_name);
that3f7b1ac2014-12-30 11:30:13 +0100294 void operation_end(const int operation_status);
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +0000295 time_t Start;
that3f7b1ac2014-12-30 11:30:13 +0100296
297 // map action name to function pointer
298 typedef int (GUIAction::*execFunction)(std::string);
299 typedef std::map<std::string, execFunction> mapFunc;
300 static mapFunc mf;
thatc6085482015-01-09 22:12:43 +0100301 static std::set<std::string> setActionsRunningInCallerThread;
that3f7b1ac2014-12-30 11:30:13 +0100302
303 // GUI actions
304 int reboot(std::string arg);
305 int home(std::string arg);
306 int key(std::string arg);
307 int page(std::string arg);
308 int reload(std::string arg);
309 int readBackup(std::string arg);
310 int set(std::string arg);
311 int clear(std::string arg);
312 int mount(std::string arg);
313 int unmount(std::string arg);
314 int restoredefaultsettings(std::string arg);
315 int copylog(std::string arg);
316 int compute(std::string arg);
317 int setguitimezone(std::string arg);
318 int overlay(std::string arg);
319 int queuezip(std::string arg);
320 int cancelzip(std::string arg);
321 int queueclear(std::string arg);
322 int sleep(std::string arg);
Matt Mower9a2a2052016-05-31 21:31:22 -0500323 int sleepcounter(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100324 int appenddatetobackupname(std::string arg);
325 int generatebackupname(std::string arg);
326 int checkpartitionlist(std::string arg);
327 int getpartitiondetails(std::string arg);
328 int screenshot(std::string arg);
329 int setbrightness(std::string arg);
Ethan Yonkerb4bff5e2016-12-16 07:47:58 -0600330 int checkforapp(std::string arg);
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);
bigbiffdf8436b2020-08-30 16:22:34 -0400374 int enableadb(std::string arg);
375 int enablefastboot(std::string arg);
Mohd Faraz77bbeb02020-08-12 12:29:42 +0000376 int changeterminal(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100377 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400378};
379
Vojtech Bocekede51c52014-02-07 23:58:09 +0100380class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400381{
382public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200383 GUIButton(xml_node<>* node);
384 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400385
386public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200387 // Render - Render the full object to the GL surface
388 // Return 0 on success, <0 on error
389 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400390
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200391 // Update - Update any UI component animations (called <= 30 FPS)
392 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
393 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400394
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200395 // SetPos - Update the position of the render object
396 // Return 0 on success, <0 on error
397 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400398
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200399 // NotifyTouch - Notify of a touch event
400 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
401 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400402
403protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200404 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100405 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200406 GUIText* mButtonLabel;
407 GUIAction* mAction;
408 int mTextX, mTextY, mTextW, mTextH;
409 int mIconX, mIconY, mIconW, mIconH;
410 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600411 bool hasHighlightColor;
412 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500413 bool hasFill;
414 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600415 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000416 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400417};
418
Vojtech Bocekede51c52014-02-07 23:58:09 +0100419class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400420{
421public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200422 GUICheckbox(xml_node<>* node);
423 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400424
425public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200426 // Render - Render the full object to the GL surface
427 // Return 0 on success, <0 on error
428 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400429
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200430 // Update - Update any UI component animations (called <= 30 FPS)
431 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
432 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400433
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200434 // SetPos - Update the position of the render object
435 // Return 0 on success, <0 on error
436 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400437
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200438 // NotifyTouch - Notify of a touch event
439 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
440 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400441
442protected:
thatf6ed8fc2015-02-14 20:23:16 +0100443 ImageResource* mChecked;
444 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200445 GUIText* mLabel;
446 int mTextX, mTextY;
447 int mCheckX, mCheckY, mCheckW, mCheckH;
448 int mLastState;
449 bool mRendered;
450 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400451};
452
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100453class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400454{
455public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100456 GUIScrollList(xml_node<>* node);
457 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400458
459public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200460 // Render - Render the full object to the GL surface
461 // Return 0 on success, <0 on error
462 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400463
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200464 // Update - Update any UI component animations (called <= 30 FPS)
465 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
466 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400467
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200468 // NotifyTouch - Notify of a touch event
469 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
470 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400471
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200472 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100473 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400474
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200475 // SetPos - Update the position of the render object
476 // Return 0 on success, <0 on error
477 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400478
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200479 // SetPageFocus - Notify when a page gains or loses focus
480 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400481
482protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100483 // derived classes need to implement these
484 // get number of items
485 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100486 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
487 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100488 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500489 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100490
that0af77952015-02-25 08:52:19 +0100491 // render a standard-layout list item with optional icon and text
492 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
493
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100494 enum { NO_ITEM = (size_t)-1 };
495 // returns item index at coordinates or NO_ITEM if there is no item there
496 size_t HitTestItem(int x, int y);
497
498 // 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
499 void SetMaxIconSize(int w, int h);
500
501 // This will make sure that the item indicated by list_index is visible on the screen
502 void SetVisibleListLocation(size_t list_index);
503
504 // Handle scrolling changes for drags and kinetic scrolling
505 void HandleScrolling();
506
that9876ac32015-02-15 21:40:59 +0100507 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100508 int GetDisplayItemCount();
509
510 // Returns the size in pixels of a partial item or row size
511 int GetDisplayRemainder();
512
513protected:
514 // Background
515 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100516 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100517
518 // Header
519 COLOR mHeaderBackgroundColor;
520 COLOR mHeaderFontColor;
521 std::string mHeaderText; // Original header text without parsing any variables
522 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100523 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100524 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100525 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100526 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
527 int mHeaderSeparatorH; // Height of the separator between header and list items
528 COLOR mHeaderSeparatorColor; // color of the header separator
529
530 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100531 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100532 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100533 bool hasHighlightColor; // indicates if a highlight color was set
534 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100535 COLOR mFontHighlightColor;
536 int mFontHeight;
537 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
538 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
539 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
540 int mSeparatorH; // Height of the separator between items
541 COLOR mSeparatorColor; // color of the separator that is between items
542
thata9998212015-02-19 22:51:24 +0100543 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100544 int mFastScrollW; // width of the fastscroll area
545 int mFastScrollLineW; // width of the line for fastscroll rendering
546 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100547 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100548 COLOR mFastScrollLineColor;
549 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100550
551 // Scrolling and dynamic state
552 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
553 int mFastScrollRectCurrentH; // current height of fastscroll rect
554 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100555 bool hasScroll; // indicates that we have enough items in the list to scroll
556 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
557 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
558 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 +0100559 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 +0100560 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
561 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
562 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
563 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
564 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500565 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 +0100566};
567
568class GUIFileSelector : public GUIScrollList
569{
570public:
571 GUIFileSelector(xml_node<>* node);
572 virtual ~GUIFileSelector();
573
574public:
575 // Update - Update any UI component animations (called <= 30 FPS)
576 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
577 virtual int Update(void);
578
579 // NotifyVarChange - Notify of a variable change
580 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
581
582 // SetPageFocus - Notify when a page gains or loses focus
583 virtual void SetPageFocus(int inFocus);
584
585 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100586 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100587 virtual void NotifySelect(size_t item_selected);
588
589protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200590 struct FileData {
591 std::string fileName;
592 unsigned char fileType; // Uses d_type format from struct dirent
593 mode_t protection; // Uses mode_t format from stat
594 uid_t userId;
595 gid_t groupId;
596 off_t fileSize;
597 time_t lastAccess; // Uses time_t format from stat
598 time_t lastModified; // Uses time_t format from stat
599 time_t lastStatChange; // Uses time_t format from stat
600 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400601
602protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200603 virtual int GetFileList(const std::string folder);
604 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400605
606protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200607 std::vector<FileData> mFolderList;
608 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100609 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600610 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100611 std::string mExtn; // used for filtering the file list, for example, *.zip
Ian Macdonalde7c34e52021-01-23 18:52:28 +0100612 std::string mPrfx; // used for filtering the file list, for example, Magisk-
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100613 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
614 std::string mSortVariable; // data manager variable used to change the sorting of files
615 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
616 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
617 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)
618 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100619 ImageResource* mFolderIcon;
620 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600621 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400622};
623
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100624class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400625{
626public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200627 GUIListBox(xml_node<>* node);
628 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400629
630public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200631 // Update - Update any UI component animations (called <= 30 FPS)
632 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
633 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400634
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200635 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100636 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400637
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200638 // SetPageFocus - Notify when a page gains or loses focus
639 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400640
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100641 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100642 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100643 virtual void NotifySelect(size_t item_selected);
644
Dees_Troy51a0e822012-09-05 15:24:24 -0400645protected:
that8ab5c132015-09-13 23:00:54 +0200646 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200647 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500648 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400649 std::string variableValue;
650 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200651 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200652 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200653 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400654
655protected:
that8ab5c132015-09-13 23:00:54 +0200656 std::vector<ListItem> mListItems;
657 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200658 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400659 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100660 ImageResource* mIconSelected;
661 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500662 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600663 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400664};
665
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100666class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500667{
668public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200669 GUIPartitionList(xml_node<>* node);
670 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500671
672public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200673 // Update - Update any UI component animations (called <= 30 FPS)
674 // 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 +0100675 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500676
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200677 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100678 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500679
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200680 // SetPageFocus - Notify when a page gains or loses focus
681 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500682
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100683 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100684 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100685 virtual void NotifySelect(size_t item_selected);
686
Dees_Troya13d74f2013-03-24 08:54:55 -0500687protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100688 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600689 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500690
691protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200692 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500693 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200694 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500695 std::string selectedList;
696 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500697 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100698 ImageResource* mIconSelected;
699 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500700 bool updateList;
701};
702
Ethan Yonker44925ad2015-07-22 12:33:59 -0500703class GUITextBox : public GUIScrollList
704{
705public:
706 GUITextBox(xml_node<>* node);
707
708public:
709 // Update - Update any UI component animations (called <= 30 FPS)
710 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
711 virtual int Update(void);
712
713 // NotifyVarChange - Notify of a variable change
714 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
715
716 // ScrollList interface
717 virtual size_t GetItemCount();
718 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
719 virtual void NotifySelect(size_t item_selected);
720protected:
721
722 size_t mLastCount;
723 bool mIsStatic;
724 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
725 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
726 std::vector<std::string> rText; // Rendered text - what we actually see
727
728};
729
that8d46c092015-02-26 01:30:04 +0100730class GUIConsole : public GUIScrollList
731{
732public:
733 GUIConsole(xml_node<>* node);
734
735public:
736 // Render - Render the full object to the GL surface
737 // Return 0 on success, <0 on error
738 virtual int Render(void);
739
740 // Update - Update any UI component animations (called <= 30 FPS)
741 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
742 virtual int Update(void);
743
744 // IsInRegion - Checks if the request is handled by this object
745 // Return 1 if this object handles the request, 0 if not
746 virtual int IsInRegion(int x, int y);
747
748 // NotifyTouch - Notify of a touch event
749 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
750 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
751
752 // ScrollList interface
753 virtual size_t GetItemCount();
754 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
755 virtual void NotifySelect(size_t item_selected);
thata9dd9f02017-02-23 23:08:56 +0100756
Ethan Yonker74db1572015-10-28 12:44:49 -0500757 static void Translate_Now();
thata9dd9f02017-02-23 23:08:56 +0100758 static void Clear_For_Retranslation();
that8d46c092015-02-26 01:30:04 +0100759protected:
760 enum SlideoutState
761 {
762 hidden = 0,
763 visible,
764 request_hide,
765 request_show
766 };
767
768 ImageResource* mSlideoutImage;
769 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
770 bool scrollToEnd; // true if we want to keep tracking the last line
771 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
772 int mSlideout;
773 SlideoutState mSlideoutState;
774 std::vector<std::string> rConsole;
775 std::vector<std::string> rConsoleColor;
776
777protected:
that8d46c092015-02-26 01:30:04 +0100778 int RenderSlideout(void);
779 int RenderConsole(void);
780};
781
that1964d192016-01-07 00:41:03 +0100782class TerminalEngine;
783class GUITerminal : public GUIScrollList, public InputObject
784{
785public:
786 GUITerminal(xml_node<>* node);
787
788public:
789 // Update - Update any UI component animations (called <= 30 FPS)
790 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
791 virtual int Update(void);
792
793 // NotifyTouch - Notify of a touch event
794 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
795 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
796
797 // NotifyKey - Notify of a key press
798 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
799 virtual int NotifyKey(int key, bool down);
800
801 // character input
802 virtual int NotifyCharInput(int ch);
803
804 // SetPageFocus - Notify when a page gains or loses focus
805 virtual void SetPageFocus(int inFocus);
806
807 // ScrollList interface
808 virtual size_t GetItemCount();
809 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
810 virtual void NotifySelect(size_t item_selected);
Mohd Faraz77bbeb02020-08-12 12:29:42 +0000811 bool status();
812 void stop();
that1964d192016-01-07 00:41:03 +0100813protected:
814 void InitAndResize();
815
816 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
817 int updateCounter; // to track if anything changed in the back-end
818 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
819};
820
Dees_Troy51a0e822012-09-05 15:24:24 -0400821// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100822class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400823{
824public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200825 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400826
827public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200828 // Render - Render the full object to the GL surface
829 // Return 0 on success, <0 on error
830 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400831
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200832 // Update - Update any UI component animations (called <= 30 FPS)
833 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
834 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400835
836protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200837 AnimationResource* mAnimation;
838 int mFrame;
839 int mFPS;
840 int mLoop;
841 int mRender;
842 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400843};
844
Vojtech Bocekede51c52014-02-07 23:58:09 +0100845class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400846{
847public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200848 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400849
850public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200851 // Render - Render the full object to the GL surface
852 // Return 0 on success, <0 on error
853 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400854
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200855 // Update - Update any UI component animations (called <= 30 FPS)
856 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
857 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400858
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200859 // NotifyVarChange - Notify of a variable change
860 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100861 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400862
863protected:
thatf6ed8fc2015-02-14 20:23:16 +0100864 ImageResource* mEmptyBar;
865 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200866 std::string mMinValVar;
867 std::string mMaxValVar;
868 std::string mCurValVar;
869 float mSlide;
870 float mSlideInc;
871 int mSlideFrames;
872 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400873
874protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200875 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400876};
877
Vojtech Bocekede51c52014-02-07 23:58:09 +0100878class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400879{
880public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200881 GUISlider(xml_node<>* node);
882 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400883
884public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200885 // Render - Render the full object to the GL surface
886 // Return 0 on success, <0 on error
887 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400888
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200889 // Update - Update any UI component animations (called <= 30 FPS)
890 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
891 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400892
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200893 // NotifyTouch - Notify of a touch event
894 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
895 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400896
897protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200898 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600899 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100900 ImageResource* sSlider;
901 ImageResource* sSliderUsed;
902 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200903 int sTouchW, sTouchH;
904 int sCurTouchX;
905 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400906};
907
that8834a0f2016-01-05 23:29:30 +0100908// these are ASCII codes reported via NotifyCharInput
909// other special keys (arrows etc.) are reported via NotifyKey
910#define KEYBOARD_ACTION 13 // CR
911#define KEYBOARD_BACKSPACE 8 // Backspace
912#define KEYBOARD_TAB 9 // Tab
913#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
914#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400915
Vojtech Bocekede51c52014-02-07 23:58:09 +0100916class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400917{
918public:
919 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200920 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400921
922public:
923 virtual int Render(void);
924 virtual int Update(void);
925 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
926 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100927 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400928
929protected:
thate79878b2015-03-14 23:07:23 +0100930 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200931 {
that8834a0f2016-01-05 23:29:30 +0100932 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
933 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100934 int end_x;
935 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200936 };
thate79878b2015-03-14 23:07:23 +0100937 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200938 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200939 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100940 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100941
942 enum {
943 MAX_KEYBOARD_LAYOUTS = 5,
944 MAX_KEYBOARD_ROWS = 9,
945 MAX_KEYBOARD_KEYS = 20
946 };
947 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600948 {
thatd86f49d2015-03-15 00:56:57 +0100949 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100950 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100951 int row_end_y[MAX_KEYBOARD_ROWS];
952 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600953 int revert_layout;
954 };
thatd86f49d2015-03-15 00:56:57 +0100955 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400956
thatf256b722015-05-23 20:44:12 +0200957 struct KeyLabel
958 {
that8834a0f2016-01-05 23:29:30 +0100959 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200960 int layout_from; // 1-based; 0 for labels that apply to all layouts
961 int layout_to; // same as Key.layout
962 string text; // key label text
963 ImageResource* image; // image (overrides text if defined)
964 };
965 std::vector<KeyLabel> mKeyLabels;
966
thate79878b2015-03-14 23:07:23 +0100967 // Find key at screen coordinates
968 Key* HitTestKey(int x, int y);
969
Dees_Troy51a0e822012-09-05 15:24:24 -0400970 bool mRendered;
971 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100972 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100973 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100974 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 +0200975 int highlightRenderCount;
976 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100977 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400978 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600979 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100980 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200981 COLOR mFontColor; // for centered key labels
982 COLOR mFontColorSmall; // for centered key labels
983 FontResource* mFont; // for main key labels
984 FontResource* mSmallFont; // for key labels like "?123"
985 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200986 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200987 COLOR mLongpressFontColor;
988 COLOR mBackgroundColor; // keyboard background color
989 COLOR mKeyColorAlphanumeric; // key background color
990 COLOR mKeyColorOther; // key background color
991 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400992};
993
994// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100995class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400996{
997public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200998 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400999 virtual ~GUIInput();
1000
1001public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001002 // Render - Render the full object to the GL surface
1003 // Return 0 on success, <0 on error
1004 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001005
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001006 // Update - Update any UI component animations (called <= 30 FPS)
1007 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1008 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001009
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001010 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001011 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001012
1013 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001014 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1015 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001016
that8834a0f2016-01-05 23:29:30 +01001017 virtual int NotifyKey(int key, bool down);
1018 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001019
1020protected:
1021 virtual int GetSelection(int x, int y);
1022
1023 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001024 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001025 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001026 void HandleCursorByTouch(int x);
1027 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001028
1029protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001030 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001031 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001032 ImageResource* mBackground;
1033 ImageResource* mCursor;
1034 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001035 std::string mVariable;
1036 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001037 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001038 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001039 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001040 COLOR mCursorColor;
1041 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001042 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001043 int lastX;
1044 int mCursorLocation;
1045 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1046 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001047 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001048 unsigned mFontHeight;
1049 unsigned CursorWidth;
1050 bool mRendered;
1051 bool HasMask;
1052 bool DrawCursor;
1053 bool isLocalChange;
1054 bool HasAllowed;
1055 bool HasDisabled;
1056 std::string AllowedList;
1057 std::string DisabledList;
1058 unsigned MinLen;
1059 unsigned MaxLen;
1060};
1061
1062class HardwareKeyboard
1063{
1064public:
thatf37aec22015-02-01 13:38:35 +01001065 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001066 virtual ~HardwareKeyboard();
1067
1068public:
thatf37aec22015-02-01 13:38:35 +01001069 // called by the input handler for key events
1070 int KeyDown(int key_code);
1071 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001072
thatf37aec22015-02-01 13:38:35 +01001073 // called by the input handler when holding a key down
1074 int KeyRepeat();
1075
1076 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001077 void ConsumeKeyRelease(int key);
1078
that8834a0f2016-01-05 23:29:30 +01001079 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001080private:
that8834a0f2016-01-05 23:29:30 +01001081 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001082 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001083 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001084};
1085
Vojtech Bocekede51c52014-02-07 23:58:09 +01001086class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001087{
1088public:
1089 GUISliderValue(xml_node<>* node);
1090 virtual ~GUISliderValue();
1091
1092public:
1093 // Render - Render the full object to the GL surface
1094 // Return 0 on success, <0 on error
1095 virtual int Render(void);
1096
1097 // Update - Update any UI component animations (called <= 30 FPS)
1098 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1099 virtual int Update(void);
1100
1101 // SetPos - Update the position of the render object
1102 // Return 0 on success, <0 on error
1103 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1104
1105 // NotifyTouch - Notify of a touch event
1106 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1107 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1108
1109 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001110 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001111
1112 // SetPageFocus - Notify when a page gains or loses focus
1113 virtual void SetPageFocus(int inFocus);
1114
1115protected:
1116 int measureText(const std::string& str);
1117 int valueFromPct(float pct);
1118 float pctFromValue(int value);
1119 void loadValue(bool force = false);
1120
1121 std::string mVariable;
1122 int mMax;
1123 int mMin;
1124 int mValue;
1125 char *mValueStr;
1126 float mValuePct;
1127 std::string mMaxStr;
1128 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001129 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001130 GUIText* mLabel;
1131 int mLabelW;
1132 COLOR mTextColor;
1133 COLOR mLineColor;
1134 COLOR mSliderColor;
1135 bool mShowRange;
1136 bool mShowCurr;
1137 int mLineX;
1138 int mLineY;
1139 int mLineH;
1140 int mLinePadding;
1141 int mPadding;
1142 int mSliderY;
1143 int mSliderW;
1144 int mSliderH;
1145 bool mRendered;
1146 int mFontHeight;
1147 GUIAction *mAction;
1148 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001149 int mLineW;
1150 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001151 ImageResource *mBackgroundImage;
1152 ImageResource *mHandleImage;
1153 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001154};
1155
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001156class MouseCursor : public RenderObject
1157{
1158public:
1159 MouseCursor(int posX, int posY);
1160 virtual ~MouseCursor();
1161
1162 virtual int Render(void);
1163 virtual int Update(void);
1164 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1165
1166 void Move(int deltaX, int deltaY);
1167 void GetPos(int& x, int& y);
1168 void LoadData(xml_node<>* node);
1169 void ResetData(int resX, int resY);
1170
1171private:
1172 int m_resX;
1173 int m_resY;
1174 bool m_moved;
1175 float m_speedMultiplier;
1176 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001177 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001178 bool m_present;
1179};
1180
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001181class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1182{
1183public:
1184 GUIPatternPassword(xml_node<>* node);
1185 virtual ~GUIPatternPassword();
1186
1187public:
1188 virtual int Render(void);
1189 virtual int Update(void);
1190 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001191 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001192 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1193
1194protected:
1195 void CalculateDotPositions();
1196 void ResetActiveDots();
1197 void ConnectDot(int dot_idx);
1198 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001199 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001200 int InDot(int x, int y);
1201 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001202 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001203 void PatternDrawn();
1204
1205 struct Dot {
1206 int x;
1207 int y;
1208 bool active;
1209 };
1210
Aleksa Saraib25a1832015-12-31 17:36:00 +01001211 std::string mSizeVar;
1212 size_t mGridSize;
1213
1214 Dot* mDots;
1215 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001216 size_t mConnectedDotsLen;
1217 int mCurLineX;
1218 int mCurLineY;
1219 bool mTrackingTouch;
1220 bool mNeedRender;
1221
1222 COLOR mDotColor;
1223 COLOR mActiveDotColor;
1224 COLOR mLineColor;
1225 ImageResource *mDotImage;
1226 ImageResource *mActiveDotImage;
1227 gr_surface mDotCircle;
1228 gr_surface mActiveDotCircle;
1229 int mDotRadius;
1230 int mLineWidth;
1231
1232 std::string mPassVar;
1233 GUIAction *mAction;
1234 int mUpdate;
1235};
1236
1237
Dees_Troy51a0e822012-09-05 15:24:24 -04001238// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001239xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001240std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1241int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1242int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1243int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001244COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001245COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1246FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1247ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1248AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001249bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001250
1251#endif // _OBJECTS_HEADER