blob: e965255fc78aa480d33fbc978526f8f01438e66f [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"
bigbiffd81833a2021-01-17 11:06:57 -050037#include "gui/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
Alexander Winkowski5d3e4882022-06-25 18:56:33 +000052#ifndef TW_FRAMERATE
53#define TW_FRAMERATE 30
54#endif
55
Dees_Troy51a0e822012-09-05 15:24:24 -040056class RenderObject
57{
58public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020059 RenderObject() { mRenderX = 0; mRenderY = 0; mRenderW = 0; mRenderH = 0; mPlacement = TOP_LEFT; }
60 virtual ~RenderObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -040061
62public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020063 // Render - Render the full object to the GL surface
64 // Return 0 on success, <0 on error
65 virtual int Render(void) = 0;
Dees_Troy51a0e822012-09-05 15:24:24 -040066
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020067 // Update - Update any UI component animations (called <= 30 FPS)
68 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
69 virtual int Update(void) { return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040070
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020071 // GetRenderPos - Returns the current position of the object
72 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 -040073
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020074 // SetRenderPos - Update the position of the object
75 // Return 0 on success, <0 on error
76 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 -040077
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020078 // GetPlacement - Returns the current placement
79 virtual int GetPlacement(Placement& placement) { placement = mPlacement; return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040080
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020081 // SetPlacement - Update the current placement
82 virtual int SetPlacement(Placement placement) { mPlacement = placement; return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040083
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020084 // SetPageFocus - Notify when a page gains or loses focus
that1964d192016-01-07 00:41:03 +010085 // TODO: This should be named NotifyPageFocus for consistency
Ethan Yonkerd0514ba2015-10-22 14:17:47 -050086 virtual void SetPageFocus(int inFocus __unused) { return; }
Dees_Troy51a0e822012-09-05 15:24:24 -040087
88protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020089 int mRenderX, mRenderY, mRenderW, mRenderH;
90 Placement mPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -040091};
92
93class ActionObject
94{
95public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020096 ActionObject() { mActionX = 0; mActionY = 0; mActionW = 0; mActionH = 0; }
97 virtual ~ActionObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -040098
99public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200100 // NotifyTouch - Notify of a touch event
101 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500102 virtual int NotifyTouch(TOUCH_STATE state __unused, int x __unused, int y __unused) { return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400103
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200104 // NotifyKey - Notify of a key press
105 // 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 -0500106 virtual int NotifyKey(int key __unused, bool down __unused) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400107
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200108 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 -0400109
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200110 // Return 0 on success, <0 on error
111 virtual int SetActionPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400112
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200113 // IsInRegion - Checks if the request is handled by this object
thatf8194e22015-01-29 01:05:01 +0100114 // Return 1 if this object handles the request, 0 if not
115 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 -0400116
Dees_Troy51a0e822012-09-05 15:24:24 -0400117protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200118 int mActionX, mActionY, mActionW, mActionH;
Dees_Troy51a0e822012-09-05 15:24:24 -0400119};
120
Vojtech Bocekede51c52014-02-07 23:58:09 +0100121class GUIObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400122{
123public:
Vojtech Bocekede51c52014-02-07 23:58:09 +0100124 GUIObject(xml_node<>* node);
125 virtual ~GUIObject();
Dees_Troy51a0e822012-09-05 15:24:24 -0400126
127public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200128 bool IsConditionVariable(std::string var);
129 bool isConditionTrue();
130 bool isConditionValid();
Vojtech Bocek07220562014-02-08 02:05:33 +0100131
132 // NotifyVarChange - Notify of a variable change
133 // Returns 0 on success, <0 on error
134 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400135
136protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200137 class Condition
138 {
139 public:
Vojtech Bocek07220562014-02-08 02:05:33 +0100140 Condition() {
141 mLastResult = true;
142 }
143
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200144 std::string mVar1;
145 std::string mVar2;
146 std::string mCompareOp;
147 std::string mLastVal;
Vojtech Bocek07220562014-02-08 02:05:33 +0100148 bool mLastResult;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200149 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400150
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200151 std::vector<Condition> mConditions;
Dees_Troy51a0e822012-09-05 15:24:24 -0400152
153protected:
that20fb95d2015-09-12 11:27:47 +0200154 static void LoadConditions(xml_node<>* node, std::vector<Condition>& conditions);
155 static bool isMounted(std::string vol);
156 static bool isConditionTrue(Condition* condition);
157 static bool UpdateConditions(std::vector<Condition>& conditions, const std::string& varName);
Vojtech Bocek07220562014-02-08 02:05:33 +0100158
159 bool mConditionsResult;
Dees_Troy51a0e822012-09-05 15:24:24 -0400160};
161
162class InputObject
163{
164public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200165 InputObject() { HasInputFocus = 0; }
166 virtual ~InputObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -0400167
168public:
that8834a0f2016-01-05 23:29:30 +0100169 // NotifyCharInput - Notify of character input (usually from the onscreen or hardware keyboard)
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200170 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
that8834a0f2016-01-05 23:29:30 +0100171 virtual int NotifyCharInput(int ch __unused) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400172
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200173 virtual int SetInputFocus(int focus) { HasInputFocus = focus; return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400174
175protected:
176 int HasInputFocus;
177};
178
179// Derived Objects
180// GUIText - Used for static text
Vojtech Bocekede51c52014-02-07 23:58:09 +0100181class GUIText : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400182{
183public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200184 // w and h may be ignored, in which case, no bounding box is applied
185 GUIText(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400186
187public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200188 // Render - Render the full object to the GL surface
189 // Return 0 on success, <0 on error
190 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400191
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200192 // Update - Update any UI component animations (called <= 30 FPS)
193 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
194 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400195
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200196 // Retrieve the size of the current string (dynamic strings may change per call)
197 virtual int GetCurrentBounds(int& w, int& h);
Dees_Troy51a0e822012-09-05 15:24:24 -0400198
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200199 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100200 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400201
202 // Set maximum width in pixels
203 virtual int SetMaxWidth(unsigned width);
204
Ethan Yonkera5db7122016-03-14 15:47:09 -0500205 void SetText(string newtext);
Dees_Troy51a0e822012-09-05 15:24:24 -0400206
Dees_Troy4d12f962012-10-19 13:13:15 -0400207public:
208 bool isHighlighted;
Ethan Yonkerb7a54a32015-10-05 10:16:27 -0500209 bool scaleWidth;
210 unsigned maxWidth;
Dees_Troy4d12f962012-10-19 13:13:15 -0400211
Dees_Troy51a0e822012-09-05 15:24:24 -0400212protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200213 std::string mText;
214 std::string mLastValue;
215 COLOR mColor;
Dees_Troy4d12f962012-10-19 13:13:15 -0400216 COLOR mHighlightColor;
thatf6ed8fc2015-02-14 20:23:16 +0100217 FontResource* mFont;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200218 int mIsStatic;
219 int mVarChanged;
220 int mFontHeight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400221};
222
223// GUIImage - Used for static image
Vojtech Bocekede51c52014-02-07 23:58:09 +0100224class GUIImage : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400225{
226public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200227 GUIImage(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400228
229public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200230 // Render - Render the full object to the GL surface
231 // Return 0 on success, <0 on error
232 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400233
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200234 // SetRenderPos - Update the position of the object
235 // Return 0 on success, <0 on error
236 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400237
Dees_Troy4d12f962012-10-19 13:13:15 -0400238public:
239 bool isHighlighted;
240
Dees_Troy51a0e822012-09-05 15:24:24 -0400241protected:
thatf6ed8fc2015-02-14 20:23:16 +0100242 ImageResource* mImage;
243 ImageResource* mHighlightImage;
Dees_Troy51a0e822012-09-05 15:24:24 -0400244};
245
246// GUIFill - Used for fill colors
Vojtech Bocekede51c52014-02-07 23:58:09 +0100247class GUIFill : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400248{
249public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200250 GUIFill(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400251
252public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200253 // Render - Render the full object to the GL surface
254 // Return 0 on success, <0 on error
255 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400256
257protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200258 COLOR mColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400259};
260
261// GUIAction - Used for standard actions
Vojtech Bocekede51c52014-02-07 23:58:09 +0100262class GUIAction : public GUIObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400263{
thatc6085482015-01-09 22:12:43 +0100264 friend class ActionThread;
265
Dees_Troy51a0e822012-09-05 15:24:24 -0400266public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200267 GUIAction(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400268
269public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200270 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100271 virtual int NotifyKey(int key, bool down);
Vojtech Bocek07220562014-02-08 02:05:33 +0100272 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
that3f7b1ac2014-12-30 11:30:13 +0100273
274 int doActions();
Dees_Troy51a0e822012-09-05 15:24:24 -0400275
276protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200277 class Action
278 {
279 public:
280 std::string mFunction;
281 std::string mArg;
282 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400283
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200284 std::vector<Action> mActions;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100285 std::map<int, bool> mKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400286
287protected:
that73a52952015-01-28 23:07:34 +0100288 enum ThreadType { THREAD_NONE, THREAD_ACTION, THREAD_CANCEL };
289
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200290 int getKeyByName(std::string key);
that3f7b1ac2014-12-30 11:30:13 +0100291 int doAction(Action action);
that73a52952015-01-28 23:07:34 +0100292 ThreadType getThreadType(const Action& action);
Dees_Troy51a0e822012-09-05 15:24:24 -0400293 void simulate_progress_bar(void);
Ethan Yonker0d47eb52015-01-09 11:23:19 -0600294 int flash_zip(std::string filename, int* wipe_cache);
mauronofrio6d3bf892019-10-26 19:47:55 +0200295 int ozip_decrypt(std::string zip_path);
thatcc8ddca2015-01-03 01:59:36 +0100296 void reinject_after_flash();
Dees_Troy51a0e822012-09-05 15:24:24 -0400297 void operation_start(const string operation_name);
that3f7b1ac2014-12-30 11:30:13 +0100298 void operation_end(const int operation_status);
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +0000299 time_t Start;
that3f7b1ac2014-12-30 11:30:13 +0100300
301 // map action name to function pointer
302 typedef int (GUIAction::*execFunction)(std::string);
303 typedef std::map<std::string, execFunction> mapFunc;
304 static mapFunc mf;
thatc6085482015-01-09 22:12:43 +0100305 static std::set<std::string> setActionsRunningInCallerThread;
that3f7b1ac2014-12-30 11:30:13 +0100306
307 // GUI actions
308 int reboot(std::string arg);
309 int home(std::string arg);
310 int key(std::string arg);
311 int page(std::string arg);
312 int reload(std::string arg);
313 int readBackup(std::string arg);
314 int set(std::string arg);
315 int clear(std::string arg);
316 int mount(std::string arg);
317 int unmount(std::string arg);
318 int restoredefaultsettings(std::string arg);
319 int copylog(std::string arg);
320 int compute(std::string arg);
321 int setguitimezone(std::string arg);
322 int overlay(std::string arg);
323 int queuezip(std::string arg);
324 int cancelzip(std::string arg);
325 int queueclear(std::string arg);
326 int sleep(std::string arg);
Matt Mower9a2a2052016-05-31 21:31:22 -0500327 int sleepcounter(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100328 int appenddatetobackupname(std::string arg);
329 int generatebackupname(std::string arg);
330 int checkpartitionlist(std::string arg);
331 int getpartitiondetails(std::string arg);
332 int screenshot(std::string arg);
333 int setbrightness(std::string arg);
Ethan Yonkerb4bff5e2016-12-16 07:47:58 -0600334 int checkforapp(std::string arg);
bigbiffcfa875c2021-06-20 16:20:27 -0400335 int unmapsuperdevices(std::string arg);
336 int removedynamicgroups(std:: string arg);
that3f7b1ac2014-12-30 11:30:13 +0100337
thatc6085482015-01-09 22:12:43 +0100338 // (originally) threaded actions
that3f7b1ac2014-12-30 11:30:13 +0100339 int fileexists(std::string arg);
340 int flash(std::string arg);
341 int wipe(std::string arg);
342 int refreshsizes(std::string arg);
343 int nandroid(std::string arg);
Ethan Yonkerb5fab762016-01-28 14:03:33 -0600344 int fixcontexts(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100345 int fixpermissions(std::string arg);
346 int dd(std::string arg);
347 int partitionsd(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100348 int cmd(std::string arg);
349 int terminalcommand(std::string arg);
350 int killterminal(std::string arg);
351 int reinjecttwrp(std::string arg);
352 int checkbackupname(std::string arg);
353 int decrypt(std::string arg);
354 int adbsideload(std::string arg);
355 int adbsideloadcancel(std::string arg);
356 int openrecoveryscript(std::string arg);
357 int installsu(std::string arg);
358 int fixsu(std::string arg);
359 int decrypt_backup(std::string arg);
360 int repair(std::string arg);
Ethan Yonkera2719152015-05-28 09:44:41 -0500361 int resize(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100362 int changefilesystem(std::string arg);
363 int startmtp(std::string arg);
364 int stopmtp(std::string arg);
Ethan Yonker96af84a2015-01-05 14:58:36 -0600365 int flashimage(std::string arg);
bigbiff7abc5fe2015-01-17 16:53:12 -0500366 int cancelbackup(std::string arg);
Ethan Yonkereb32b1f2015-05-18 10:23:03 -0500367 int checkpartitionlifetimewrites(std::string arg);
368 int mountsystemtoggle(std::string arg);
Ethan Yonker74db1572015-10-28 12:44:49 -0500369 int setlanguage(std::string arg);
Matt Mower9472ba12016-01-20 18:12:47 -0600370 int togglebacklight(std::string arg);
that10ae24f2015-12-26 20:53:51 +0100371 int twcmd(std::string arg);
Ethan Yonker1b190162016-12-05 15:25:19 -0600372 int setbootslot(std::string arg);
Ethan Yonkerb4bff5e2016-12-16 07:47:58 -0600373 int installapp(std::string arg);
Ethan Yonker76bbd3a2019-05-10 10:50:04 -0500374 int uninstalltwrpsystemapp(std::string arg);
Ethan Yonker53796e72019-01-11 22:49:52 -0600375 int repackimage(std::string arg);
nebrassyac29e692021-05-20 13:03:30 +0200376 int reflashtwrp(std::string arg);
Ethan Yonker53796e72019-01-11 22:49:52 -0600377 int fixabrecoverybootloop(std::string arg);
bigbiffdf8436b2020-08-30 16:22:34 -0400378 int enableadb(std::string arg);
379 int enablefastboot(std::string arg);
Mohd Faraz77bbeb02020-08-12 12:29:42 +0000380 int changeterminal(std::string arg);
epicXa721f952021-01-04 13:01:31 +0530381 int applycustomtwrpfolder(std::string arg);
bigbiffd21252f2021-09-18 15:56:32 -0400382 int mergesnapshots(std::string arg);
Captain Throwback16dd81b2021-02-12 19:32:36 -0500383#ifndef TW_EXCLUDE_NANO
384 int editfile(std::string arg);
385#endif
epicXa721f952021-01-04 13:01:31 +0530386
that3f7b1ac2014-12-30 11:30:13 +0100387 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400388};
389
Vojtech Bocekede51c52014-02-07 23:58:09 +0100390class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400391{
392public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200393 GUIButton(xml_node<>* node);
394 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400395
396public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200397 // Render - Render the full object to the GL surface
398 // Return 0 on success, <0 on error
399 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400400
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200401 // Update - Update any UI component animations (called <= 30 FPS)
402 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
403 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400404
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200405 // SetPos - Update the position of the render object
406 // Return 0 on success, <0 on error
407 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400408
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200409 // NotifyTouch - Notify of a touch event
410 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
411 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400412
413protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200414 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100415 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200416 GUIText* mButtonLabel;
417 GUIAction* mAction;
418 int mTextX, mTextY, mTextW, mTextH;
419 int mIconX, mIconY, mIconW, mIconH;
420 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600421 bool hasHighlightColor;
422 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500423 bool hasFill;
424 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600425 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000426 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400427};
428
Vojtech Bocekede51c52014-02-07 23:58:09 +0100429class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400430{
431public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200432 GUICheckbox(xml_node<>* node);
433 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400434
435public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200436 // Render - Render the full object to the GL surface
437 // Return 0 on success, <0 on error
438 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400439
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200440 // Update - Update any UI component animations (called <= 30 FPS)
441 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
442 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400443
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200444 // SetPos - Update the position of the render object
445 // Return 0 on success, <0 on error
446 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400447
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200448 // NotifyTouch - Notify of a touch event
449 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
450 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400451
452protected:
thatf6ed8fc2015-02-14 20:23:16 +0100453 ImageResource* mChecked;
454 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200455 GUIText* mLabel;
456 int mTextX, mTextY;
457 int mCheckX, mCheckY, mCheckW, mCheckH;
458 int mLastState;
459 bool mRendered;
460 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400461};
462
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100463class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400464{
465public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100466 GUIScrollList(xml_node<>* node);
467 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400468
469public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200470 // Render - Render the full object to the GL surface
471 // Return 0 on success, <0 on error
472 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400473
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200474 // Update - Update any UI component animations (called <= 30 FPS)
475 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
476 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400477
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200478 // NotifyTouch - Notify of a touch event
479 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
480 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400481
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200482 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100483 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400484
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200485 // SetPos - Update the position of the render object
486 // Return 0 on success, <0 on error
487 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400488
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200489 // SetPageFocus - Notify when a page gains or loses focus
490 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400491
492protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100493 // derived classes need to implement these
494 // get number of items
495 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100496 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
497 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100498 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500499 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100500
that0af77952015-02-25 08:52:19 +0100501 // render a standard-layout list item with optional icon and text
502 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
503
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100504 enum { NO_ITEM = (size_t)-1 };
505 // returns item index at coordinates or NO_ITEM if there is no item there
506 size_t HitTestItem(int x, int y);
507
508 // 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
509 void SetMaxIconSize(int w, int h);
510
511 // This will make sure that the item indicated by list_index is visible on the screen
512 void SetVisibleListLocation(size_t list_index);
513
514 // Handle scrolling changes for drags and kinetic scrolling
515 void HandleScrolling();
516
that9876ac32015-02-15 21:40:59 +0100517 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100518 int GetDisplayItemCount();
519
520 // Returns the size in pixels of a partial item or row size
521 int GetDisplayRemainder();
522
523protected:
524 // Background
525 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100526 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100527
528 // Header
529 COLOR mHeaderBackgroundColor;
530 COLOR mHeaderFontColor;
531 std::string mHeaderText; // Original header text without parsing any variables
532 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100533 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100534 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100535 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100536 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
537 int mHeaderSeparatorH; // Height of the separator between header and list items
538 COLOR mHeaderSeparatorColor; // color of the header separator
539
540 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100541 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100542 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100543 bool hasHighlightColor; // indicates if a highlight color was set
544 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100545 COLOR mFontHighlightColor;
546 int mFontHeight;
547 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
548 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
549 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
550 int mSeparatorH; // Height of the separator between items
551 COLOR mSeparatorColor; // color of the separator that is between items
552
thata9998212015-02-19 22:51:24 +0100553 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100554 int mFastScrollW; // width of the fastscroll area
555 int mFastScrollLineW; // width of the line for fastscroll rendering
556 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100557 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100558 COLOR mFastScrollLineColor;
559 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100560
561 // Scrolling and dynamic state
562 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
563 int mFastScrollRectCurrentH; // current height of fastscroll rect
564 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100565 bool hasScroll; // indicates that we have enough items in the list to scroll
566 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
567 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
568 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 +0100569 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 +0100570 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
571 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
572 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
573 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
574 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500575 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 +0100576};
577
578class GUIFileSelector : public GUIScrollList
579{
580public:
581 GUIFileSelector(xml_node<>* node);
582 virtual ~GUIFileSelector();
583
584public:
585 // Update - Update any UI component animations (called <= 30 FPS)
586 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
587 virtual int Update(void);
588
589 // NotifyVarChange - Notify of a variable change
590 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
591
592 // SetPageFocus - Notify when a page gains or loses focus
593 virtual void SetPageFocus(int inFocus);
594
595 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100596 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100597 virtual void NotifySelect(size_t item_selected);
598
599protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200600 struct FileData {
601 std::string fileName;
602 unsigned char fileType; // Uses d_type format from struct dirent
603 mode_t protection; // Uses mode_t format from stat
604 uid_t userId;
605 gid_t groupId;
606 off_t fileSize;
607 time_t lastAccess; // Uses time_t format from stat
608 time_t lastModified; // Uses time_t format from stat
609 time_t lastStatChange; // Uses time_t format from stat
610 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400611
612protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200613 virtual int GetFileList(const std::string folder);
614 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400615
616protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200617 std::vector<FileData> mFolderList;
618 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100619 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600620 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100621 std::string mExtn; // used for filtering the file list, for example, *.zip
Ian Macdonalde7c34e52021-01-23 18:52:28 +0100622 std::string mPrfx; // used for filtering the file list, for example, Magisk-
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100623 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
624 std::string mSortVariable; // data manager variable used to change the sorting of files
625 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
626 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
627 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)
628 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100629 ImageResource* mFolderIcon;
630 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600631 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400632};
633
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100634class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400635{
636public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200637 GUIListBox(xml_node<>* node);
638 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400639
640public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200641 // Update - Update any UI component animations (called <= 30 FPS)
642 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
643 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400644
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200645 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100646 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400647
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200648 // SetPageFocus - Notify when a page gains or loses focus
649 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400650
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100651 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100652 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100653 virtual void NotifySelect(size_t item_selected);
654
Dees_Troy51a0e822012-09-05 15:24:24 -0400655protected:
that8ab5c132015-09-13 23:00:54 +0200656 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200657 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500658 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400659 std::string variableValue;
660 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200661 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200662 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200663 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400664
665protected:
that8ab5c132015-09-13 23:00:54 +0200666 std::vector<ListItem> mListItems;
667 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200668 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400669 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100670 ImageResource* mIconSelected;
671 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500672 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600673 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400674};
675
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100676class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500677{
678public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200679 GUIPartitionList(xml_node<>* node);
680 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500681
682public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200683 // Update - Update any UI component animations (called <= 30 FPS)
684 // 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 +0100685 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500686
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200687 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100688 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500689
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200690 // SetPageFocus - Notify when a page gains or loses focus
691 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500692
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100693 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100694 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100695 virtual void NotifySelect(size_t item_selected);
696
Dees_Troya13d74f2013-03-24 08:54:55 -0500697protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100698 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600699 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500700
701protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200702 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500703 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200704 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500705 std::string selectedList;
706 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500707 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100708 ImageResource* mIconSelected;
709 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500710 bool updateList;
711};
712
Ethan Yonker44925ad2015-07-22 12:33:59 -0500713class GUITextBox : public GUIScrollList
714{
715public:
716 GUITextBox(xml_node<>* node);
717
718public:
719 // Update - Update any UI component animations (called <= 30 FPS)
720 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
721 virtual int Update(void);
722
723 // NotifyVarChange - Notify of a variable change
724 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
725
726 // ScrollList interface
727 virtual size_t GetItemCount();
728 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
729 virtual void NotifySelect(size_t item_selected);
730protected:
731
732 size_t mLastCount;
733 bool mIsStatic;
734 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
735 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
736 std::vector<std::string> rText; // Rendered text - what we actually see
737
738};
739
that8d46c092015-02-26 01:30:04 +0100740class GUIConsole : public GUIScrollList
741{
742public:
743 GUIConsole(xml_node<>* node);
744
745public:
746 // Render - Render the full object to the GL surface
747 // Return 0 on success, <0 on error
748 virtual int Render(void);
749
750 // Update - Update any UI component animations (called <= 30 FPS)
751 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
752 virtual int Update(void);
753
754 // IsInRegion - Checks if the request is handled by this object
755 // Return 1 if this object handles the request, 0 if not
756 virtual int IsInRegion(int x, int y);
757
758 // NotifyTouch - Notify of a touch event
759 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
760 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
761
762 // ScrollList interface
763 virtual size_t GetItemCount();
764 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
765 virtual void NotifySelect(size_t item_selected);
thata9dd9f02017-02-23 23:08:56 +0100766
Ethan Yonker74db1572015-10-28 12:44:49 -0500767 static void Translate_Now();
thata9dd9f02017-02-23 23:08:56 +0100768 static void Clear_For_Retranslation();
that8d46c092015-02-26 01:30:04 +0100769protected:
770 enum SlideoutState
771 {
772 hidden = 0,
773 visible,
774 request_hide,
775 request_show
776 };
777
778 ImageResource* mSlideoutImage;
779 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
780 bool scrollToEnd; // true if we want to keep tracking the last line
781 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
782 int mSlideout;
783 SlideoutState mSlideoutState;
784 std::vector<std::string> rConsole;
785 std::vector<std::string> rConsoleColor;
786
787protected:
that8d46c092015-02-26 01:30:04 +0100788 int RenderSlideout(void);
789 int RenderConsole(void);
790};
791
that1964d192016-01-07 00:41:03 +0100792class TerminalEngine;
793class GUITerminal : public GUIScrollList, public InputObject
794{
795public:
796 GUITerminal(xml_node<>* node);
797
798public:
799 // Update - Update any UI component animations (called <= 30 FPS)
800 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
801 virtual int Update(void);
802
803 // NotifyTouch - Notify of a touch event
804 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
805 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
806
807 // NotifyKey - Notify of a key press
808 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
809 virtual int NotifyKey(int key, bool down);
810
811 // character input
812 virtual int NotifyCharInput(int ch);
813
814 // SetPageFocus - Notify when a page gains or loses focus
815 virtual void SetPageFocus(int inFocus);
816
817 // ScrollList interface
818 virtual size_t GetItemCount();
819 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
820 virtual void NotifySelect(size_t item_selected);
Mohd Faraz77bbeb02020-08-12 12:29:42 +0000821 bool status();
822 void stop();
that1964d192016-01-07 00:41:03 +0100823protected:
824 void InitAndResize();
825
826 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
827 int updateCounter; // to track if anything changed in the back-end
828 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
829};
830
Dees_Troy51a0e822012-09-05 15:24:24 -0400831// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100832class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400833{
834public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200835 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400836
837public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200838 // Render - Render the full object to the GL surface
839 // Return 0 on success, <0 on error
840 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400841
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200842 // Update - Update any UI component animations (called <= 30 FPS)
843 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
844 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400845
846protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200847 AnimationResource* mAnimation;
848 int mFrame;
849 int mFPS;
850 int mLoop;
851 int mRender;
852 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400853};
854
Vojtech Bocekede51c52014-02-07 23:58:09 +0100855class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400856{
857public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200858 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400859
860public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200861 // Render - Render the full object to the GL surface
862 // Return 0 on success, <0 on error
863 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400864
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200865 // Update - Update any UI component animations (called <= 30 FPS)
866 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
867 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400868
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200869 // NotifyVarChange - Notify of a variable change
870 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100871 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400872
873protected:
thatf6ed8fc2015-02-14 20:23:16 +0100874 ImageResource* mEmptyBar;
875 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200876 std::string mMinValVar;
877 std::string mMaxValVar;
878 std::string mCurValVar;
879 float mSlide;
880 float mSlideInc;
881 int mSlideFrames;
882 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400883
884protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200885 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400886};
887
Vojtech Bocekede51c52014-02-07 23:58:09 +0100888class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400889{
890public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200891 GUISlider(xml_node<>* node);
892 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400893
894public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200895 // Render - Render the full object to the GL surface
896 // Return 0 on success, <0 on error
897 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400898
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200899 // Update - Update any UI component animations (called <= 30 FPS)
900 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
901 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400902
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200903 // NotifyTouch - Notify of a touch event
904 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
905 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400906
907protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200908 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600909 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100910 ImageResource* sSlider;
911 ImageResource* sSliderUsed;
912 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200913 int sTouchW, sTouchH;
914 int sCurTouchX;
915 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400916};
917
that8834a0f2016-01-05 23:29:30 +0100918// these are ASCII codes reported via NotifyCharInput
919// other special keys (arrows etc.) are reported via NotifyKey
920#define KEYBOARD_ACTION 13 // CR
921#define KEYBOARD_BACKSPACE 8 // Backspace
922#define KEYBOARD_TAB 9 // Tab
923#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
924#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400925
Vojtech Bocekede51c52014-02-07 23:58:09 +0100926class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400927{
928public:
929 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200930 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400931
932public:
933 virtual int Render(void);
934 virtual int Update(void);
935 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
936 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100937 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400938
939protected:
thate79878b2015-03-14 23:07:23 +0100940 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200941 {
that8834a0f2016-01-05 23:29:30 +0100942 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
943 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100944 int end_x;
945 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200946 };
thate79878b2015-03-14 23:07:23 +0100947 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200948 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200949 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100950 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100951
952 enum {
953 MAX_KEYBOARD_LAYOUTS = 5,
954 MAX_KEYBOARD_ROWS = 9,
955 MAX_KEYBOARD_KEYS = 20
956 };
957 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600958 {
thatd86f49d2015-03-15 00:56:57 +0100959 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100960 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100961 int row_end_y[MAX_KEYBOARD_ROWS];
962 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600963 int revert_layout;
964 };
thatd86f49d2015-03-15 00:56:57 +0100965 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400966
thatf256b722015-05-23 20:44:12 +0200967 struct KeyLabel
968 {
that8834a0f2016-01-05 23:29:30 +0100969 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200970 int layout_from; // 1-based; 0 for labels that apply to all layouts
971 int layout_to; // same as Key.layout
972 string text; // key label text
973 ImageResource* image; // image (overrides text if defined)
974 };
975 std::vector<KeyLabel> mKeyLabels;
976
thate79878b2015-03-14 23:07:23 +0100977 // Find key at screen coordinates
978 Key* HitTestKey(int x, int y);
979
Dees_Troy51a0e822012-09-05 15:24:24 -0400980 bool mRendered;
981 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100982 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100983 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100984 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 +0200985 int highlightRenderCount;
986 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100987 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400988 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600989 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100990 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200991 COLOR mFontColor; // for centered key labels
992 COLOR mFontColorSmall; // for centered key labels
993 FontResource* mFont; // for main key labels
994 FontResource* mSmallFont; // for key labels like "?123"
995 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200996 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200997 COLOR mLongpressFontColor;
998 COLOR mBackgroundColor; // keyboard background color
999 COLOR mKeyColorAlphanumeric; // key background color
1000 COLOR mKeyColorOther; // key background color
1001 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -04001002};
1003
1004// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +01001005class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -04001006{
1007public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001008 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -04001009 virtual ~GUIInput();
1010
1011public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001012 // Render - Render the full object to the GL surface
1013 // Return 0 on success, <0 on error
1014 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001015
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001016 // Update - Update any UI component animations (called <= 30 FPS)
1017 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1018 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001019
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001020 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001021 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001022
1023 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001024 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1025 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001026
that8834a0f2016-01-05 23:29:30 +01001027 virtual int NotifyKey(int key, bool down);
1028 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001029
1030protected:
1031 virtual int GetSelection(int x, int y);
1032
1033 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001034 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001035 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001036 void HandleCursorByTouch(int x);
1037 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001038
1039protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001040 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001041 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001042 ImageResource* mBackground;
1043 ImageResource* mCursor;
1044 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001045 std::string mVariable;
1046 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001047 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001048 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001049 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001050 COLOR mCursorColor;
1051 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001052 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001053 int lastX;
1054 int mCursorLocation;
1055 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1056 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001057 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001058 unsigned mFontHeight;
1059 unsigned CursorWidth;
1060 bool mRendered;
1061 bool HasMask;
1062 bool DrawCursor;
1063 bool isLocalChange;
1064 bool HasAllowed;
1065 bool HasDisabled;
1066 std::string AllowedList;
1067 std::string DisabledList;
1068 unsigned MinLen;
1069 unsigned MaxLen;
1070};
1071
1072class HardwareKeyboard
1073{
1074public:
thatf37aec22015-02-01 13:38:35 +01001075 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001076 virtual ~HardwareKeyboard();
1077
1078public:
thatf37aec22015-02-01 13:38:35 +01001079 // called by the input handler for key events
1080 int KeyDown(int key_code);
1081 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001082
thatf37aec22015-02-01 13:38:35 +01001083 // called by the input handler when holding a key down
1084 int KeyRepeat();
1085
1086 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001087 void ConsumeKeyRelease(int key);
1088
that8834a0f2016-01-05 23:29:30 +01001089 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001090private:
that8834a0f2016-01-05 23:29:30 +01001091 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001092 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001093 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001094};
1095
Vojtech Bocekede51c52014-02-07 23:58:09 +01001096class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001097{
1098public:
1099 GUISliderValue(xml_node<>* node);
1100 virtual ~GUISliderValue();
1101
1102public:
1103 // Render - Render the full object to the GL surface
1104 // Return 0 on success, <0 on error
1105 virtual int Render(void);
1106
1107 // Update - Update any UI component animations (called <= 30 FPS)
1108 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1109 virtual int Update(void);
1110
1111 // SetPos - Update the position of the render object
1112 // Return 0 on success, <0 on error
1113 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1114
1115 // NotifyTouch - Notify of a touch event
1116 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1117 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1118
1119 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001120 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001121
1122 // SetPageFocus - Notify when a page gains or loses focus
1123 virtual void SetPageFocus(int inFocus);
1124
1125protected:
1126 int measureText(const std::string& str);
1127 int valueFromPct(float pct);
1128 float pctFromValue(int value);
1129 void loadValue(bool force = false);
1130
1131 std::string mVariable;
1132 int mMax;
1133 int mMin;
1134 int mValue;
1135 char *mValueStr;
1136 float mValuePct;
1137 std::string mMaxStr;
1138 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001139 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001140 GUIText* mLabel;
1141 int mLabelW;
1142 COLOR mTextColor;
1143 COLOR mLineColor;
1144 COLOR mSliderColor;
1145 bool mShowRange;
1146 bool mShowCurr;
1147 int mLineX;
1148 int mLineY;
1149 int mLineH;
1150 int mLinePadding;
1151 int mPadding;
1152 int mSliderY;
1153 int mSliderW;
1154 int mSliderH;
1155 bool mRendered;
1156 int mFontHeight;
1157 GUIAction *mAction;
1158 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001159 int mLineW;
1160 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001161 ImageResource *mBackgroundImage;
1162 ImageResource *mHandleImage;
1163 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001164};
1165
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001166class MouseCursor : public RenderObject
1167{
1168public:
1169 MouseCursor(int posX, int posY);
1170 virtual ~MouseCursor();
1171
1172 virtual int Render(void);
1173 virtual int Update(void);
1174 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1175
1176 void Move(int deltaX, int deltaY);
1177 void GetPos(int& x, int& y);
1178 void LoadData(xml_node<>* node);
1179 void ResetData(int resX, int resY);
1180
1181private:
1182 int m_resX;
1183 int m_resY;
1184 bool m_moved;
1185 float m_speedMultiplier;
1186 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001187 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001188 bool m_present;
1189};
1190
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001191class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1192{
1193public:
1194 GUIPatternPassword(xml_node<>* node);
1195 virtual ~GUIPatternPassword();
1196
1197public:
1198 virtual int Render(void);
1199 virtual int Update(void);
1200 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001201 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001202 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1203
1204protected:
1205 void CalculateDotPositions();
1206 void ResetActiveDots();
1207 void ConnectDot(int dot_idx);
1208 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001209 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001210 int InDot(int x, int y);
1211 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001212 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001213 void PatternDrawn();
1214
1215 struct Dot {
1216 int x;
1217 int y;
1218 bool active;
1219 };
1220
Aleksa Saraib25a1832015-12-31 17:36:00 +01001221 std::string mSizeVar;
1222 size_t mGridSize;
1223
1224 Dot* mDots;
1225 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001226 size_t mConnectedDotsLen;
1227 int mCurLineX;
1228 int mCurLineY;
1229 bool mTrackingTouch;
1230 bool mNeedRender;
1231
1232 COLOR mDotColor;
1233 COLOR mActiveDotColor;
1234 COLOR mLineColor;
1235 ImageResource *mDotImage;
1236 ImageResource *mActiveDotImage;
1237 gr_surface mDotCircle;
1238 gr_surface mActiveDotCircle;
1239 int mDotRadius;
1240 int mLineWidth;
1241
1242 std::string mPassVar;
1243 GUIAction *mAction;
1244 int mUpdate;
1245};
1246
1247
Dees_Troy51a0e822012-09-05 15:24:24 -04001248// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001249xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001250std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1251int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1252int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1253int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001254COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001255COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1256FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1257ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1258AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001259bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001260
1261#endif // _OBJECTS_HEADER