blob: d4b42c297f19b26998b6deeab94a08ed9a29bc5f [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);
epicXa721f952021-01-04 13:01:31 +0530377 int applycustomtwrpfolder(std::string arg);
Captain Throwback16dd81b2021-02-12 19:32:36 -0500378#ifndef TW_EXCLUDE_NANO
379 int editfile(std::string arg);
380#endif
epicXa721f952021-01-04 13:01:31 +0530381
that3f7b1ac2014-12-30 11:30:13 +0100382 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400383};
384
Vojtech Bocekede51c52014-02-07 23:58:09 +0100385class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400386{
387public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200388 GUIButton(xml_node<>* node);
389 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400390
391public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200392 // Render - Render the full object to the GL surface
393 // Return 0 on success, <0 on error
394 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400395
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200396 // Update - Update any UI component animations (called <= 30 FPS)
397 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
398 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400399
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200400 // SetPos - Update the position of the render object
401 // Return 0 on success, <0 on error
402 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400403
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200404 // NotifyTouch - Notify of a touch event
405 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
406 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400407
408protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200409 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100410 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200411 GUIText* mButtonLabel;
412 GUIAction* mAction;
413 int mTextX, mTextY, mTextW, mTextH;
414 int mIconX, mIconY, mIconW, mIconH;
415 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600416 bool hasHighlightColor;
417 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500418 bool hasFill;
419 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600420 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000421 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400422};
423
Vojtech Bocekede51c52014-02-07 23:58:09 +0100424class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400425{
426public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200427 GUICheckbox(xml_node<>* node);
428 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400429
430public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200431 // Render - Render the full object to the GL surface
432 // Return 0 on success, <0 on error
433 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400434
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200435 // Update - Update any UI component animations (called <= 30 FPS)
436 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
437 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400438
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200439 // SetPos - Update the position of the render object
440 // Return 0 on success, <0 on error
441 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400442
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200443 // NotifyTouch - Notify of a touch event
444 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
445 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400446
447protected:
thatf6ed8fc2015-02-14 20:23:16 +0100448 ImageResource* mChecked;
449 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200450 GUIText* mLabel;
451 int mTextX, mTextY;
452 int mCheckX, mCheckY, mCheckW, mCheckH;
453 int mLastState;
454 bool mRendered;
455 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400456};
457
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100458class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400459{
460public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100461 GUIScrollList(xml_node<>* node);
462 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400463
464public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200465 // Render - Render the full object to the GL surface
466 // Return 0 on success, <0 on error
467 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400468
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200469 // Update - Update any UI component animations (called <= 30 FPS)
470 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
471 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400472
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200473 // NotifyTouch - Notify of a touch event
474 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
475 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400476
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200477 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100478 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400479
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200480 // SetPos - Update the position of the render object
481 // Return 0 on success, <0 on error
482 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400483
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200484 // SetPageFocus - Notify when a page gains or loses focus
485 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400486
487protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100488 // derived classes need to implement these
489 // get number of items
490 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100491 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
492 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100493 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500494 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100495
that0af77952015-02-25 08:52:19 +0100496 // render a standard-layout list item with optional icon and text
497 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
498
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100499 enum { NO_ITEM = (size_t)-1 };
500 // returns item index at coordinates or NO_ITEM if there is no item there
501 size_t HitTestItem(int x, int y);
502
503 // 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
504 void SetMaxIconSize(int w, int h);
505
506 // This will make sure that the item indicated by list_index is visible on the screen
507 void SetVisibleListLocation(size_t list_index);
508
509 // Handle scrolling changes for drags and kinetic scrolling
510 void HandleScrolling();
511
that9876ac32015-02-15 21:40:59 +0100512 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100513 int GetDisplayItemCount();
514
515 // Returns the size in pixels of a partial item or row size
516 int GetDisplayRemainder();
517
518protected:
519 // Background
520 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100521 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100522
523 // Header
524 COLOR mHeaderBackgroundColor;
525 COLOR mHeaderFontColor;
526 std::string mHeaderText; // Original header text without parsing any variables
527 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100528 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100529 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100530 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100531 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
532 int mHeaderSeparatorH; // Height of the separator between header and list items
533 COLOR mHeaderSeparatorColor; // color of the header separator
534
535 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100536 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100537 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100538 bool hasHighlightColor; // indicates if a highlight color was set
539 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100540 COLOR mFontHighlightColor;
541 int mFontHeight;
542 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
543 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
544 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
545 int mSeparatorH; // Height of the separator between items
546 COLOR mSeparatorColor; // color of the separator that is between items
547
thata9998212015-02-19 22:51:24 +0100548 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100549 int mFastScrollW; // width of the fastscroll area
550 int mFastScrollLineW; // width of the line for fastscroll rendering
551 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100552 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100553 COLOR mFastScrollLineColor;
554 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100555
556 // Scrolling and dynamic state
557 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
558 int mFastScrollRectCurrentH; // current height of fastscroll rect
559 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100560 bool hasScroll; // indicates that we have enough items in the list to scroll
561 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
562 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
563 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 +0100564 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 +0100565 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
566 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
567 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
568 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
569 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500570 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 +0100571};
572
573class GUIFileSelector : public GUIScrollList
574{
575public:
576 GUIFileSelector(xml_node<>* node);
577 virtual ~GUIFileSelector();
578
579public:
580 // Update - Update any UI component animations (called <= 30 FPS)
581 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
582 virtual int Update(void);
583
584 // NotifyVarChange - Notify of a variable change
585 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
586
587 // SetPageFocus - Notify when a page gains or loses focus
588 virtual void SetPageFocus(int inFocus);
589
590 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100591 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100592 virtual void NotifySelect(size_t item_selected);
593
594protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200595 struct FileData {
596 std::string fileName;
597 unsigned char fileType; // Uses d_type format from struct dirent
598 mode_t protection; // Uses mode_t format from stat
599 uid_t userId;
600 gid_t groupId;
601 off_t fileSize;
602 time_t lastAccess; // Uses time_t format from stat
603 time_t lastModified; // Uses time_t format from stat
604 time_t lastStatChange; // Uses time_t format from stat
605 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400606
607protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200608 virtual int GetFileList(const std::string folder);
609 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400610
611protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200612 std::vector<FileData> mFolderList;
613 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100614 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600615 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100616 std::string mExtn; // used for filtering the file list, for example, *.zip
Ian Macdonalde7c34e52021-01-23 18:52:28 +0100617 std::string mPrfx; // used for filtering the file list, for example, Magisk-
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100618 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
619 std::string mSortVariable; // data manager variable used to change the sorting of files
620 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
621 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
622 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)
623 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100624 ImageResource* mFolderIcon;
625 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600626 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400627};
628
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100629class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400630{
631public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200632 GUIListBox(xml_node<>* node);
633 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400634
635public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200636 // Update - Update any UI component animations (called <= 30 FPS)
637 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
638 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400639
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200640 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100641 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400642
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200643 // SetPageFocus - Notify when a page gains or loses focus
644 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400645
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100646 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100647 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100648 virtual void NotifySelect(size_t item_selected);
649
Dees_Troy51a0e822012-09-05 15:24:24 -0400650protected:
that8ab5c132015-09-13 23:00:54 +0200651 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200652 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500653 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400654 std::string variableValue;
655 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200656 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200657 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200658 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400659
660protected:
that8ab5c132015-09-13 23:00:54 +0200661 std::vector<ListItem> mListItems;
662 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200663 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400664 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100665 ImageResource* mIconSelected;
666 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500667 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600668 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400669};
670
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100671class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500672{
673public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200674 GUIPartitionList(xml_node<>* node);
675 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500676
677public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200678 // Update - Update any UI component animations (called <= 30 FPS)
679 // 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 +0100680 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500681
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200682 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100683 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500684
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200685 // SetPageFocus - Notify when a page gains or loses focus
686 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500687
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100688 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100689 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100690 virtual void NotifySelect(size_t item_selected);
691
Dees_Troya13d74f2013-03-24 08:54:55 -0500692protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100693 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600694 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500695
696protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200697 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500698 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200699 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500700 std::string selectedList;
701 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500702 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100703 ImageResource* mIconSelected;
704 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500705 bool updateList;
706};
707
Ethan Yonker44925ad2015-07-22 12:33:59 -0500708class GUITextBox : public GUIScrollList
709{
710public:
711 GUITextBox(xml_node<>* node);
712
713public:
714 // Update - Update any UI component animations (called <= 30 FPS)
715 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
716 virtual int Update(void);
717
718 // NotifyVarChange - Notify of a variable change
719 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
720
721 // ScrollList interface
722 virtual size_t GetItemCount();
723 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
724 virtual void NotifySelect(size_t item_selected);
725protected:
726
727 size_t mLastCount;
728 bool mIsStatic;
729 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
730 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
731 std::vector<std::string> rText; // Rendered text - what we actually see
732
733};
734
that8d46c092015-02-26 01:30:04 +0100735class GUIConsole : public GUIScrollList
736{
737public:
738 GUIConsole(xml_node<>* node);
739
740public:
741 // Render - Render the full object to the GL surface
742 // Return 0 on success, <0 on error
743 virtual int Render(void);
744
745 // Update - Update any UI component animations (called <= 30 FPS)
746 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
747 virtual int Update(void);
748
749 // IsInRegion - Checks if the request is handled by this object
750 // Return 1 if this object handles the request, 0 if not
751 virtual int IsInRegion(int x, int y);
752
753 // NotifyTouch - Notify of a touch event
754 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
755 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
756
757 // ScrollList interface
758 virtual size_t GetItemCount();
759 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
760 virtual void NotifySelect(size_t item_selected);
thata9dd9f02017-02-23 23:08:56 +0100761
Ethan Yonker74db1572015-10-28 12:44:49 -0500762 static void Translate_Now();
thata9dd9f02017-02-23 23:08:56 +0100763 static void Clear_For_Retranslation();
that8d46c092015-02-26 01:30:04 +0100764protected:
765 enum SlideoutState
766 {
767 hidden = 0,
768 visible,
769 request_hide,
770 request_show
771 };
772
773 ImageResource* mSlideoutImage;
774 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
775 bool scrollToEnd; // true if we want to keep tracking the last line
776 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
777 int mSlideout;
778 SlideoutState mSlideoutState;
779 std::vector<std::string> rConsole;
780 std::vector<std::string> rConsoleColor;
781
782protected:
that8d46c092015-02-26 01:30:04 +0100783 int RenderSlideout(void);
784 int RenderConsole(void);
785};
786
that1964d192016-01-07 00:41:03 +0100787class TerminalEngine;
788class GUITerminal : public GUIScrollList, public InputObject
789{
790public:
791 GUITerminal(xml_node<>* node);
792
793public:
794 // Update - Update any UI component animations (called <= 30 FPS)
795 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
796 virtual int Update(void);
797
798 // NotifyTouch - Notify of a touch event
799 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
800 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
801
802 // NotifyKey - Notify of a key press
803 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
804 virtual int NotifyKey(int key, bool down);
805
806 // character input
807 virtual int NotifyCharInput(int ch);
808
809 // SetPageFocus - Notify when a page gains or loses focus
810 virtual void SetPageFocus(int inFocus);
811
812 // ScrollList interface
813 virtual size_t GetItemCount();
814 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
815 virtual void NotifySelect(size_t item_selected);
Mohd Faraz77bbeb02020-08-12 12:29:42 +0000816 bool status();
817 void stop();
that1964d192016-01-07 00:41:03 +0100818protected:
819 void InitAndResize();
820
821 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
822 int updateCounter; // to track if anything changed in the back-end
823 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
824};
825
Dees_Troy51a0e822012-09-05 15:24:24 -0400826// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100827class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400828{
829public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200830 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400831
832public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200833 // Render - Render the full object to the GL surface
834 // Return 0 on success, <0 on error
835 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400836
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200837 // Update - Update any UI component animations (called <= 30 FPS)
838 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
839 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400840
841protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200842 AnimationResource* mAnimation;
843 int mFrame;
844 int mFPS;
845 int mLoop;
846 int mRender;
847 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400848};
849
Vojtech Bocekede51c52014-02-07 23:58:09 +0100850class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400851{
852public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200853 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400854
855public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200856 // Render - Render the full object to the GL surface
857 // Return 0 on success, <0 on error
858 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400859
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200860 // Update - Update any UI component animations (called <= 30 FPS)
861 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
862 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400863
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200864 // NotifyVarChange - Notify of a variable change
865 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100866 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400867
868protected:
thatf6ed8fc2015-02-14 20:23:16 +0100869 ImageResource* mEmptyBar;
870 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200871 std::string mMinValVar;
872 std::string mMaxValVar;
873 std::string mCurValVar;
874 float mSlide;
875 float mSlideInc;
876 int mSlideFrames;
877 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400878
879protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200880 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400881};
882
Vojtech Bocekede51c52014-02-07 23:58:09 +0100883class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400884{
885public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200886 GUISlider(xml_node<>* node);
887 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400888
889public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200890 // Render - Render the full object to the GL surface
891 // Return 0 on success, <0 on error
892 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400893
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200894 // Update - Update any UI component animations (called <= 30 FPS)
895 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
896 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400897
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200898 // NotifyTouch - Notify of a touch event
899 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
900 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400901
902protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200903 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600904 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100905 ImageResource* sSlider;
906 ImageResource* sSliderUsed;
907 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200908 int sTouchW, sTouchH;
909 int sCurTouchX;
910 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400911};
912
that8834a0f2016-01-05 23:29:30 +0100913// these are ASCII codes reported via NotifyCharInput
914// other special keys (arrows etc.) are reported via NotifyKey
915#define KEYBOARD_ACTION 13 // CR
916#define KEYBOARD_BACKSPACE 8 // Backspace
917#define KEYBOARD_TAB 9 // Tab
918#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
919#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400920
Vojtech Bocekede51c52014-02-07 23:58:09 +0100921class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400922{
923public:
924 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200925 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400926
927public:
928 virtual int Render(void);
929 virtual int Update(void);
930 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
931 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100932 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400933
934protected:
thate79878b2015-03-14 23:07:23 +0100935 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200936 {
that8834a0f2016-01-05 23:29:30 +0100937 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
938 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100939 int end_x;
940 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200941 };
thate79878b2015-03-14 23:07:23 +0100942 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200943 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200944 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100945 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100946
947 enum {
948 MAX_KEYBOARD_LAYOUTS = 5,
949 MAX_KEYBOARD_ROWS = 9,
950 MAX_KEYBOARD_KEYS = 20
951 };
952 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600953 {
thatd86f49d2015-03-15 00:56:57 +0100954 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100955 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100956 int row_end_y[MAX_KEYBOARD_ROWS];
957 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600958 int revert_layout;
959 };
thatd86f49d2015-03-15 00:56:57 +0100960 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400961
thatf256b722015-05-23 20:44:12 +0200962 struct KeyLabel
963 {
that8834a0f2016-01-05 23:29:30 +0100964 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200965 int layout_from; // 1-based; 0 for labels that apply to all layouts
966 int layout_to; // same as Key.layout
967 string text; // key label text
968 ImageResource* image; // image (overrides text if defined)
969 };
970 std::vector<KeyLabel> mKeyLabels;
971
thate79878b2015-03-14 23:07:23 +0100972 // Find key at screen coordinates
973 Key* HitTestKey(int x, int y);
974
Dees_Troy51a0e822012-09-05 15:24:24 -0400975 bool mRendered;
976 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100977 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100978 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100979 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 +0200980 int highlightRenderCount;
981 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100982 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400983 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600984 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100985 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200986 COLOR mFontColor; // for centered key labels
987 COLOR mFontColorSmall; // for centered key labels
988 FontResource* mFont; // for main key labels
989 FontResource* mSmallFont; // for key labels like "?123"
990 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200991 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200992 COLOR mLongpressFontColor;
993 COLOR mBackgroundColor; // keyboard background color
994 COLOR mKeyColorAlphanumeric; // key background color
995 COLOR mKeyColorOther; // key background color
996 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400997};
998
999// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +01001000class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -04001001{
1002public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001003 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -04001004 virtual ~GUIInput();
1005
1006public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001007 // Render - Render the full object to the GL surface
1008 // Return 0 on success, <0 on error
1009 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001010
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001011 // Update - Update any UI component animations (called <= 30 FPS)
1012 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1013 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001014
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001015 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001016 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001017
1018 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001019 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1020 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001021
that8834a0f2016-01-05 23:29:30 +01001022 virtual int NotifyKey(int key, bool down);
1023 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001024
1025protected:
1026 virtual int GetSelection(int x, int y);
1027
1028 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001029 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001030 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001031 void HandleCursorByTouch(int x);
1032 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001033
1034protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001035 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001036 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001037 ImageResource* mBackground;
1038 ImageResource* mCursor;
1039 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001040 std::string mVariable;
1041 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001042 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001043 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001044 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001045 COLOR mCursorColor;
1046 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001047 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001048 int lastX;
1049 int mCursorLocation;
1050 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1051 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001052 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001053 unsigned mFontHeight;
1054 unsigned CursorWidth;
1055 bool mRendered;
1056 bool HasMask;
1057 bool DrawCursor;
1058 bool isLocalChange;
1059 bool HasAllowed;
1060 bool HasDisabled;
1061 std::string AllowedList;
1062 std::string DisabledList;
1063 unsigned MinLen;
1064 unsigned MaxLen;
1065};
1066
1067class HardwareKeyboard
1068{
1069public:
thatf37aec22015-02-01 13:38:35 +01001070 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001071 virtual ~HardwareKeyboard();
1072
1073public:
thatf37aec22015-02-01 13:38:35 +01001074 // called by the input handler for key events
1075 int KeyDown(int key_code);
1076 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001077
thatf37aec22015-02-01 13:38:35 +01001078 // called by the input handler when holding a key down
1079 int KeyRepeat();
1080
1081 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001082 void ConsumeKeyRelease(int key);
1083
that8834a0f2016-01-05 23:29:30 +01001084 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001085private:
that8834a0f2016-01-05 23:29:30 +01001086 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001087 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001088 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001089};
1090
Vojtech Bocekede51c52014-02-07 23:58:09 +01001091class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001092{
1093public:
1094 GUISliderValue(xml_node<>* node);
1095 virtual ~GUISliderValue();
1096
1097public:
1098 // Render - Render the full object to the GL surface
1099 // Return 0 on success, <0 on error
1100 virtual int Render(void);
1101
1102 // Update - Update any UI component animations (called <= 30 FPS)
1103 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1104 virtual int Update(void);
1105
1106 // SetPos - Update the position of the render object
1107 // Return 0 on success, <0 on error
1108 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1109
1110 // NotifyTouch - Notify of a touch event
1111 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1112 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1113
1114 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001115 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001116
1117 // SetPageFocus - Notify when a page gains or loses focus
1118 virtual void SetPageFocus(int inFocus);
1119
1120protected:
1121 int measureText(const std::string& str);
1122 int valueFromPct(float pct);
1123 float pctFromValue(int value);
1124 void loadValue(bool force = false);
1125
1126 std::string mVariable;
1127 int mMax;
1128 int mMin;
1129 int mValue;
1130 char *mValueStr;
1131 float mValuePct;
1132 std::string mMaxStr;
1133 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001134 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001135 GUIText* mLabel;
1136 int mLabelW;
1137 COLOR mTextColor;
1138 COLOR mLineColor;
1139 COLOR mSliderColor;
1140 bool mShowRange;
1141 bool mShowCurr;
1142 int mLineX;
1143 int mLineY;
1144 int mLineH;
1145 int mLinePadding;
1146 int mPadding;
1147 int mSliderY;
1148 int mSliderW;
1149 int mSliderH;
1150 bool mRendered;
1151 int mFontHeight;
1152 GUIAction *mAction;
1153 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001154 int mLineW;
1155 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001156 ImageResource *mBackgroundImage;
1157 ImageResource *mHandleImage;
1158 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001159};
1160
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001161class MouseCursor : public RenderObject
1162{
1163public:
1164 MouseCursor(int posX, int posY);
1165 virtual ~MouseCursor();
1166
1167 virtual int Render(void);
1168 virtual int Update(void);
1169 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1170
1171 void Move(int deltaX, int deltaY);
1172 void GetPos(int& x, int& y);
1173 void LoadData(xml_node<>* node);
1174 void ResetData(int resX, int resY);
1175
1176private:
1177 int m_resX;
1178 int m_resY;
1179 bool m_moved;
1180 float m_speedMultiplier;
1181 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001182 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001183 bool m_present;
1184};
1185
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001186class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1187{
1188public:
1189 GUIPatternPassword(xml_node<>* node);
1190 virtual ~GUIPatternPassword();
1191
1192public:
1193 virtual int Render(void);
1194 virtual int Update(void);
1195 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001196 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001197 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1198
1199protected:
1200 void CalculateDotPositions();
1201 void ResetActiveDots();
1202 void ConnectDot(int dot_idx);
1203 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001204 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001205 int InDot(int x, int y);
1206 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001207 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001208 void PatternDrawn();
1209
1210 struct Dot {
1211 int x;
1212 int y;
1213 bool active;
1214 };
1215
Aleksa Saraib25a1832015-12-31 17:36:00 +01001216 std::string mSizeVar;
1217 size_t mGridSize;
1218
1219 Dot* mDots;
1220 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001221 size_t mConnectedDotsLen;
1222 int mCurLineX;
1223 int mCurLineY;
1224 bool mTrackingTouch;
1225 bool mNeedRender;
1226
1227 COLOR mDotColor;
1228 COLOR mActiveDotColor;
1229 COLOR mLineColor;
1230 ImageResource *mDotImage;
1231 ImageResource *mActiveDotImage;
1232 gr_surface mDotCircle;
1233 gr_surface mActiveDotCircle;
1234 int mDotRadius;
1235 int mLineWidth;
1236
1237 std::string mPassVar;
1238 GUIAction *mAction;
1239 int mUpdate;
1240};
1241
1242
Dees_Troy51a0e822012-09-05 15:24:24 -04001243// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001244xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001245std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1246int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1247int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1248int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001249COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001250COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1251FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1252ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1253AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001254bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001255
1256#endif // _OBJECTS_HEADER