blob: 02f9e5468936bc1c829f3bd8d706f03601a5f278 [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);
that3f7b1ac2014-12-30 11:30:13 +0100376 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400377};
378
Vojtech Bocekede51c52014-02-07 23:58:09 +0100379class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400380{
381public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200382 GUIButton(xml_node<>* node);
383 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400384
385public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200386 // Render - Render the full object to the GL surface
387 // Return 0 on success, <0 on error
388 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400389
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200390 // Update - Update any UI component animations (called <= 30 FPS)
391 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
392 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400393
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200394 // SetPos - Update the position of the render object
395 // Return 0 on success, <0 on error
396 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400397
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200398 // NotifyTouch - Notify of a touch event
399 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
400 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400401
402protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200403 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100404 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200405 GUIText* mButtonLabel;
406 GUIAction* mAction;
407 int mTextX, mTextY, mTextW, mTextH;
408 int mIconX, mIconY, mIconW, mIconH;
409 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600410 bool hasHighlightColor;
411 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500412 bool hasFill;
413 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600414 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000415 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400416};
417
Vojtech Bocekede51c52014-02-07 23:58:09 +0100418class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400419{
420public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200421 GUICheckbox(xml_node<>* node);
422 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400423
424public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200425 // Render - Render the full object to the GL surface
426 // Return 0 on success, <0 on error
427 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400428
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200429 // Update - Update any UI component animations (called <= 30 FPS)
430 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
431 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400432
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200433 // SetPos - Update the position of the render object
434 // Return 0 on success, <0 on error
435 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400436
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200437 // NotifyTouch - Notify of a touch event
438 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
439 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400440
441protected:
thatf6ed8fc2015-02-14 20:23:16 +0100442 ImageResource* mChecked;
443 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200444 GUIText* mLabel;
445 int mTextX, mTextY;
446 int mCheckX, mCheckY, mCheckW, mCheckH;
447 int mLastState;
448 bool mRendered;
449 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400450};
451
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100452class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400453{
454public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100455 GUIScrollList(xml_node<>* node);
456 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400457
458public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200459 // Render - Render the full object to the GL surface
460 // Return 0 on success, <0 on error
461 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400462
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200463 // Update - Update any UI component animations (called <= 30 FPS)
464 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
465 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400466
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200467 // NotifyTouch - Notify of a touch event
468 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
469 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400470
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200471 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100472 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400473
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200474 // SetPos - Update the position of the render object
475 // Return 0 on success, <0 on error
476 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400477
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200478 // SetPageFocus - Notify when a page gains or loses focus
479 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400480
481protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100482 // derived classes need to implement these
483 // get number of items
484 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100485 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
486 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100487 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500488 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100489
that0af77952015-02-25 08:52:19 +0100490 // render a standard-layout list item with optional icon and text
491 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
492
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100493 enum { NO_ITEM = (size_t)-1 };
494 // returns item index at coordinates or NO_ITEM if there is no item there
495 size_t HitTestItem(int x, int y);
496
497 // 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
498 void SetMaxIconSize(int w, int h);
499
500 // This will make sure that the item indicated by list_index is visible on the screen
501 void SetVisibleListLocation(size_t list_index);
502
503 // Handle scrolling changes for drags and kinetic scrolling
504 void HandleScrolling();
505
that9876ac32015-02-15 21:40:59 +0100506 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100507 int GetDisplayItemCount();
508
509 // Returns the size in pixels of a partial item or row size
510 int GetDisplayRemainder();
511
512protected:
513 // Background
514 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100515 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100516
517 // Header
518 COLOR mHeaderBackgroundColor;
519 COLOR mHeaderFontColor;
520 std::string mHeaderText; // Original header text without parsing any variables
521 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100522 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100523 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100524 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100525 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
526 int mHeaderSeparatorH; // Height of the separator between header and list items
527 COLOR mHeaderSeparatorColor; // color of the header separator
528
529 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100530 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100531 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100532 bool hasHighlightColor; // indicates if a highlight color was set
533 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100534 COLOR mFontHighlightColor;
535 int mFontHeight;
536 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
537 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
538 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
539 int mSeparatorH; // Height of the separator between items
540 COLOR mSeparatorColor; // color of the separator that is between items
541
thata9998212015-02-19 22:51:24 +0100542 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100543 int mFastScrollW; // width of the fastscroll area
544 int mFastScrollLineW; // width of the line for fastscroll rendering
545 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100546 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100547 COLOR mFastScrollLineColor;
548 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100549
550 // Scrolling and dynamic state
551 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
552 int mFastScrollRectCurrentH; // current height of fastscroll rect
553 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100554 bool hasScroll; // indicates that we have enough items in the list to scroll
555 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
556 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
557 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 +0100558 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 +0100559 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
560 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
561 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
562 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
563 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500564 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 +0100565};
566
567class GUIFileSelector : public GUIScrollList
568{
569public:
570 GUIFileSelector(xml_node<>* node);
571 virtual ~GUIFileSelector();
572
573public:
574 // Update - Update any UI component animations (called <= 30 FPS)
575 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
576 virtual int Update(void);
577
578 // NotifyVarChange - Notify of a variable change
579 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
580
581 // SetPageFocus - Notify when a page gains or loses focus
582 virtual void SetPageFocus(int inFocus);
583
584 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100585 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100586 virtual void NotifySelect(size_t item_selected);
587
588protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200589 struct FileData {
590 std::string fileName;
591 unsigned char fileType; // Uses d_type format from struct dirent
592 mode_t protection; // Uses mode_t format from stat
593 uid_t userId;
594 gid_t groupId;
595 off_t fileSize;
596 time_t lastAccess; // Uses time_t format from stat
597 time_t lastModified; // Uses time_t format from stat
598 time_t lastStatChange; // Uses time_t format from stat
599 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400600
601protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200602 virtual int GetFileList(const std::string folder);
603 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400604
605protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200606 std::vector<FileData> mFolderList;
607 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100608 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600609 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100610 std::string mExtn; // used for filtering the file list, for example, *.zip
Ian Macdonalde7c34e52021-01-23 18:52:28 +0100611 std::string mPrfx; // used for filtering the file list, for example, Magisk-
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100612 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
613 std::string mSortVariable; // data manager variable used to change the sorting of files
614 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
615 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
616 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)
617 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100618 ImageResource* mFolderIcon;
619 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600620 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400621};
622
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100623class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400624{
625public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200626 GUIListBox(xml_node<>* node);
627 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400628
629public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200630 // Update - Update any UI component animations (called <= 30 FPS)
631 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
632 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400633
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200634 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100635 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400636
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200637 // SetPageFocus - Notify when a page gains or loses focus
638 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400639
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100640 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100641 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100642 virtual void NotifySelect(size_t item_selected);
643
Dees_Troy51a0e822012-09-05 15:24:24 -0400644protected:
that8ab5c132015-09-13 23:00:54 +0200645 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200646 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500647 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400648 std::string variableValue;
649 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200650 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200651 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200652 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400653
654protected:
that8ab5c132015-09-13 23:00:54 +0200655 std::vector<ListItem> mListItems;
656 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200657 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400658 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100659 ImageResource* mIconSelected;
660 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500661 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600662 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400663};
664
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100665class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500666{
667public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200668 GUIPartitionList(xml_node<>* node);
669 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500670
671public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200672 // Update - Update any UI component animations (called <= 30 FPS)
673 // 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 +0100674 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500675
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200676 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100677 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500678
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200679 // SetPageFocus - Notify when a page gains or loses focus
680 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500681
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100682 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100683 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100684 virtual void NotifySelect(size_t item_selected);
685
Dees_Troya13d74f2013-03-24 08:54:55 -0500686protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100687 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600688 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500689
690protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200691 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500692 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200693 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500694 std::string selectedList;
695 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500696 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100697 ImageResource* mIconSelected;
698 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500699 bool updateList;
700};
701
Ethan Yonker44925ad2015-07-22 12:33:59 -0500702class GUITextBox : public GUIScrollList
703{
704public:
705 GUITextBox(xml_node<>* node);
706
707public:
708 // Update - Update any UI component animations (called <= 30 FPS)
709 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
710 virtual int Update(void);
711
712 // NotifyVarChange - Notify of a variable change
713 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
714
715 // ScrollList interface
716 virtual size_t GetItemCount();
717 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
718 virtual void NotifySelect(size_t item_selected);
719protected:
720
721 size_t mLastCount;
722 bool mIsStatic;
723 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
724 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
725 std::vector<std::string> rText; // Rendered text - what we actually see
726
727};
728
that8d46c092015-02-26 01:30:04 +0100729class GUIConsole : public GUIScrollList
730{
731public:
732 GUIConsole(xml_node<>* node);
733
734public:
735 // Render - Render the full object to the GL surface
736 // Return 0 on success, <0 on error
737 virtual int Render(void);
738
739 // Update - Update any UI component animations (called <= 30 FPS)
740 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
741 virtual int Update(void);
742
743 // IsInRegion - Checks if the request is handled by this object
744 // Return 1 if this object handles the request, 0 if not
745 virtual int IsInRegion(int x, int y);
746
747 // NotifyTouch - Notify of a touch event
748 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
749 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
750
751 // ScrollList interface
752 virtual size_t GetItemCount();
753 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
754 virtual void NotifySelect(size_t item_selected);
thata9dd9f02017-02-23 23:08:56 +0100755
Ethan Yonker74db1572015-10-28 12:44:49 -0500756 static void Translate_Now();
thata9dd9f02017-02-23 23:08:56 +0100757 static void Clear_For_Retranslation();
that8d46c092015-02-26 01:30:04 +0100758protected:
759 enum SlideoutState
760 {
761 hidden = 0,
762 visible,
763 request_hide,
764 request_show
765 };
766
767 ImageResource* mSlideoutImage;
768 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
769 bool scrollToEnd; // true if we want to keep tracking the last line
770 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
771 int mSlideout;
772 SlideoutState mSlideoutState;
773 std::vector<std::string> rConsole;
774 std::vector<std::string> rConsoleColor;
775
776protected:
that8d46c092015-02-26 01:30:04 +0100777 int RenderSlideout(void);
778 int RenderConsole(void);
779};
780
that1964d192016-01-07 00:41:03 +0100781class TerminalEngine;
782class GUITerminal : public GUIScrollList, public InputObject
783{
784public:
785 GUITerminal(xml_node<>* node);
786
787public:
788 // Update - Update any UI component animations (called <= 30 FPS)
789 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
790 virtual int Update(void);
791
792 // NotifyTouch - Notify of a touch event
793 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
794 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
795
796 // NotifyKey - Notify of a key press
797 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
798 virtual int NotifyKey(int key, bool down);
799
800 // character input
801 virtual int NotifyCharInput(int ch);
802
803 // SetPageFocus - Notify when a page gains or loses focus
804 virtual void SetPageFocus(int inFocus);
805
806 // ScrollList interface
807 virtual size_t GetItemCount();
808 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
809 virtual void NotifySelect(size_t item_selected);
810protected:
811 void InitAndResize();
812
813 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
814 int updateCounter; // to track if anything changed in the back-end
815 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
816};
817
Dees_Troy51a0e822012-09-05 15:24:24 -0400818// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100819class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400820{
821public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200822 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400823
824public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200825 // Render - Render the full object to the GL surface
826 // Return 0 on success, <0 on error
827 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400828
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200829 // Update - Update any UI component animations (called <= 30 FPS)
830 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
831 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400832
833protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200834 AnimationResource* mAnimation;
835 int mFrame;
836 int mFPS;
837 int mLoop;
838 int mRender;
839 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400840};
841
Vojtech Bocekede51c52014-02-07 23:58:09 +0100842class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400843{
844public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200845 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400846
847public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200848 // Render - Render the full object to the GL surface
849 // Return 0 on success, <0 on error
850 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400851
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200852 // Update - Update any UI component animations (called <= 30 FPS)
853 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
854 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400855
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200856 // NotifyVarChange - Notify of a variable change
857 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100858 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400859
860protected:
thatf6ed8fc2015-02-14 20:23:16 +0100861 ImageResource* mEmptyBar;
862 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200863 std::string mMinValVar;
864 std::string mMaxValVar;
865 std::string mCurValVar;
866 float mSlide;
867 float mSlideInc;
868 int mSlideFrames;
869 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400870
871protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200872 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400873};
874
Vojtech Bocekede51c52014-02-07 23:58:09 +0100875class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400876{
877public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200878 GUISlider(xml_node<>* node);
879 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400880
881public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200882 // Render - Render the full object to the GL surface
883 // Return 0 on success, <0 on error
884 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400885
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200886 // Update - Update any UI component animations (called <= 30 FPS)
887 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
888 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400889
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200890 // NotifyTouch - Notify of a touch event
891 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
892 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400893
894protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200895 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600896 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100897 ImageResource* sSlider;
898 ImageResource* sSliderUsed;
899 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200900 int sTouchW, sTouchH;
901 int sCurTouchX;
902 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400903};
904
that8834a0f2016-01-05 23:29:30 +0100905// these are ASCII codes reported via NotifyCharInput
906// other special keys (arrows etc.) are reported via NotifyKey
907#define KEYBOARD_ACTION 13 // CR
908#define KEYBOARD_BACKSPACE 8 // Backspace
909#define KEYBOARD_TAB 9 // Tab
910#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
911#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400912
Vojtech Bocekede51c52014-02-07 23:58:09 +0100913class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400914{
915public:
916 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200917 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400918
919public:
920 virtual int Render(void);
921 virtual int Update(void);
922 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
923 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100924 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400925
926protected:
thate79878b2015-03-14 23:07:23 +0100927 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200928 {
that8834a0f2016-01-05 23:29:30 +0100929 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
930 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100931 int end_x;
932 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200933 };
thate79878b2015-03-14 23:07:23 +0100934 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200935 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200936 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100937 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100938
939 enum {
940 MAX_KEYBOARD_LAYOUTS = 5,
941 MAX_KEYBOARD_ROWS = 9,
942 MAX_KEYBOARD_KEYS = 20
943 };
944 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600945 {
thatd86f49d2015-03-15 00:56:57 +0100946 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100947 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100948 int row_end_y[MAX_KEYBOARD_ROWS];
949 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600950 int revert_layout;
951 };
thatd86f49d2015-03-15 00:56:57 +0100952 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400953
thatf256b722015-05-23 20:44:12 +0200954 struct KeyLabel
955 {
that8834a0f2016-01-05 23:29:30 +0100956 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200957 int layout_from; // 1-based; 0 for labels that apply to all layouts
958 int layout_to; // same as Key.layout
959 string text; // key label text
960 ImageResource* image; // image (overrides text if defined)
961 };
962 std::vector<KeyLabel> mKeyLabels;
963
thate79878b2015-03-14 23:07:23 +0100964 // Find key at screen coordinates
965 Key* HitTestKey(int x, int y);
966
Dees_Troy51a0e822012-09-05 15:24:24 -0400967 bool mRendered;
968 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100969 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100970 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100971 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 +0200972 int highlightRenderCount;
973 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100974 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400975 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600976 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100977 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200978 COLOR mFontColor; // for centered key labels
979 COLOR mFontColorSmall; // for centered key labels
980 FontResource* mFont; // for main key labels
981 FontResource* mSmallFont; // for key labels like "?123"
982 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200983 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200984 COLOR mLongpressFontColor;
985 COLOR mBackgroundColor; // keyboard background color
986 COLOR mKeyColorAlphanumeric; // key background color
987 COLOR mKeyColorOther; // key background color
988 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400989};
990
991// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100992class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400993{
994public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200995 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400996 virtual ~GUIInput();
997
998public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200999 // Render - Render the full object to the GL surface
1000 // Return 0 on success, <0 on error
1001 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001002
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001003 // Update - Update any UI component animations (called <= 30 FPS)
1004 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1005 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001006
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001007 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001008 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001009
1010 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001011 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1012 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001013
that8834a0f2016-01-05 23:29:30 +01001014 virtual int NotifyKey(int key, bool down);
1015 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001016
1017protected:
1018 virtual int GetSelection(int x, int y);
1019
1020 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001021 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001022 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001023 void HandleCursorByTouch(int x);
1024 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001025
1026protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001027 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001028 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001029 ImageResource* mBackground;
1030 ImageResource* mCursor;
1031 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001032 std::string mVariable;
1033 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001034 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001035 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001036 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001037 COLOR mCursorColor;
1038 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001039 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001040 int lastX;
1041 int mCursorLocation;
1042 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1043 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001044 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001045 unsigned mFontHeight;
1046 unsigned CursorWidth;
1047 bool mRendered;
1048 bool HasMask;
1049 bool DrawCursor;
1050 bool isLocalChange;
1051 bool HasAllowed;
1052 bool HasDisabled;
1053 std::string AllowedList;
1054 std::string DisabledList;
1055 unsigned MinLen;
1056 unsigned MaxLen;
1057};
1058
1059class HardwareKeyboard
1060{
1061public:
thatf37aec22015-02-01 13:38:35 +01001062 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001063 virtual ~HardwareKeyboard();
1064
1065public:
thatf37aec22015-02-01 13:38:35 +01001066 // called by the input handler for key events
1067 int KeyDown(int key_code);
1068 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001069
thatf37aec22015-02-01 13:38:35 +01001070 // called by the input handler when holding a key down
1071 int KeyRepeat();
1072
1073 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001074 void ConsumeKeyRelease(int key);
1075
that8834a0f2016-01-05 23:29:30 +01001076 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001077private:
that8834a0f2016-01-05 23:29:30 +01001078 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001079 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001080 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001081};
1082
Vojtech Bocekede51c52014-02-07 23:58:09 +01001083class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001084{
1085public:
1086 GUISliderValue(xml_node<>* node);
1087 virtual ~GUISliderValue();
1088
1089public:
1090 // Render - Render the full object to the GL surface
1091 // Return 0 on success, <0 on error
1092 virtual int Render(void);
1093
1094 // Update - Update any UI component animations (called <= 30 FPS)
1095 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1096 virtual int Update(void);
1097
1098 // SetPos - Update the position of the render object
1099 // Return 0 on success, <0 on error
1100 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1101
1102 // NotifyTouch - Notify of a touch event
1103 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1104 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1105
1106 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001107 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001108
1109 // SetPageFocus - Notify when a page gains or loses focus
1110 virtual void SetPageFocus(int inFocus);
1111
1112protected:
1113 int measureText(const std::string& str);
1114 int valueFromPct(float pct);
1115 float pctFromValue(int value);
1116 void loadValue(bool force = false);
1117
1118 std::string mVariable;
1119 int mMax;
1120 int mMin;
1121 int mValue;
1122 char *mValueStr;
1123 float mValuePct;
1124 std::string mMaxStr;
1125 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001126 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001127 GUIText* mLabel;
1128 int mLabelW;
1129 COLOR mTextColor;
1130 COLOR mLineColor;
1131 COLOR mSliderColor;
1132 bool mShowRange;
1133 bool mShowCurr;
1134 int mLineX;
1135 int mLineY;
1136 int mLineH;
1137 int mLinePadding;
1138 int mPadding;
1139 int mSliderY;
1140 int mSliderW;
1141 int mSliderH;
1142 bool mRendered;
1143 int mFontHeight;
1144 GUIAction *mAction;
1145 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001146 int mLineW;
1147 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001148 ImageResource *mBackgroundImage;
1149 ImageResource *mHandleImage;
1150 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001151};
1152
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001153class MouseCursor : public RenderObject
1154{
1155public:
1156 MouseCursor(int posX, int posY);
1157 virtual ~MouseCursor();
1158
1159 virtual int Render(void);
1160 virtual int Update(void);
1161 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1162
1163 void Move(int deltaX, int deltaY);
1164 void GetPos(int& x, int& y);
1165 void LoadData(xml_node<>* node);
1166 void ResetData(int resX, int resY);
1167
1168private:
1169 int m_resX;
1170 int m_resY;
1171 bool m_moved;
1172 float m_speedMultiplier;
1173 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001174 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001175 bool m_present;
1176};
1177
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001178class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1179{
1180public:
1181 GUIPatternPassword(xml_node<>* node);
1182 virtual ~GUIPatternPassword();
1183
1184public:
1185 virtual int Render(void);
1186 virtual int Update(void);
1187 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001188 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001189 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1190
1191protected:
1192 void CalculateDotPositions();
1193 void ResetActiveDots();
1194 void ConnectDot(int dot_idx);
1195 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001196 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001197 int InDot(int x, int y);
1198 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001199 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001200 void PatternDrawn();
1201
1202 struct Dot {
1203 int x;
1204 int y;
1205 bool active;
1206 };
1207
Aleksa Saraib25a1832015-12-31 17:36:00 +01001208 std::string mSizeVar;
1209 size_t mGridSize;
1210
1211 Dot* mDots;
1212 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001213 size_t mConnectedDotsLen;
1214 int mCurLineX;
1215 int mCurLineY;
1216 bool mTrackingTouch;
1217 bool mNeedRender;
1218
1219 COLOR mDotColor;
1220 COLOR mActiveDotColor;
1221 COLOR mLineColor;
1222 ImageResource *mDotImage;
1223 ImageResource *mActiveDotImage;
1224 gr_surface mDotCircle;
1225 gr_surface mActiveDotCircle;
1226 int mDotRadius;
1227 int mLineWidth;
1228
1229 std::string mPassVar;
1230 GUIAction *mAction;
1231 int mUpdate;
1232};
1233
1234
Dees_Troy51a0e822012-09-05 15:24:24 -04001235// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001236xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001237std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1238int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1239int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1240int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001241COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001242COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1243FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1244ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1245AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001246bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001247
1248#endif // _OBJECTS_HEADER