blob: 24e9d24724d9fad9f8a0119f0ace1c7ba01d0b56 [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);
that3f7b1ac2014-12-30 11:30:13 +0100374
375 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400376};
377
Vojtech Bocekede51c52014-02-07 23:58:09 +0100378class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400379{
380public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200381 GUIButton(xml_node<>* node);
382 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400383
384public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200385 // Render - Render the full object to the GL surface
386 // Return 0 on success, <0 on error
387 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400388
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200389 // Update - Update any UI component animations (called <= 30 FPS)
390 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
391 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400392
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200393 // SetPos - Update the position of the render object
394 // Return 0 on success, <0 on error
395 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400396
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200397 // NotifyTouch - Notify of a touch event
398 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
399 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400400
401protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200402 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100403 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200404 GUIText* mButtonLabel;
405 GUIAction* mAction;
406 int mTextX, mTextY, mTextW, mTextH;
407 int mIconX, mIconY, mIconW, mIconH;
408 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600409 bool hasHighlightColor;
410 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500411 bool hasFill;
412 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600413 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000414 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400415};
416
Vojtech Bocekede51c52014-02-07 23:58:09 +0100417class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400418{
419public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200420 GUICheckbox(xml_node<>* node);
421 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400422
423public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200424 // Render - Render the full object to the GL surface
425 // Return 0 on success, <0 on error
426 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400427
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200428 // Update - Update any UI component animations (called <= 30 FPS)
429 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
430 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400431
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200432 // SetPos - Update the position of the render object
433 // Return 0 on success, <0 on error
434 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400435
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200436 // NotifyTouch - Notify of a touch event
437 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
438 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400439
440protected:
thatf6ed8fc2015-02-14 20:23:16 +0100441 ImageResource* mChecked;
442 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200443 GUIText* mLabel;
444 int mTextX, mTextY;
445 int mCheckX, mCheckY, mCheckW, mCheckH;
446 int mLastState;
447 bool mRendered;
448 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400449};
450
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100451class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400452{
453public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100454 GUIScrollList(xml_node<>* node);
455 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400456
457public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200458 // Render - Render the full object to the GL surface
459 // Return 0 on success, <0 on error
460 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400461
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200462 // Update - Update any UI component animations (called <= 30 FPS)
463 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
464 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400465
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200466 // NotifyTouch - Notify of a touch event
467 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
468 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400469
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200470 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100471 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400472
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200473 // SetPos - Update the position of the render object
474 // Return 0 on success, <0 on error
475 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400476
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200477 // SetPageFocus - Notify when a page gains or loses focus
478 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400479
480protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100481 // derived classes need to implement these
482 // get number of items
483 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100484 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
485 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100486 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500487 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100488
that0af77952015-02-25 08:52:19 +0100489 // render a standard-layout list item with optional icon and text
490 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
491
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100492 enum { NO_ITEM = (size_t)-1 };
493 // returns item index at coordinates or NO_ITEM if there is no item there
494 size_t HitTestItem(int x, int y);
495
496 // 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
497 void SetMaxIconSize(int w, int h);
498
499 // This will make sure that the item indicated by list_index is visible on the screen
500 void SetVisibleListLocation(size_t list_index);
501
502 // Handle scrolling changes for drags and kinetic scrolling
503 void HandleScrolling();
504
that9876ac32015-02-15 21:40:59 +0100505 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100506 int GetDisplayItemCount();
507
508 // Returns the size in pixels of a partial item or row size
509 int GetDisplayRemainder();
510
511protected:
512 // Background
513 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100514 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100515
516 // Header
517 COLOR mHeaderBackgroundColor;
518 COLOR mHeaderFontColor;
519 std::string mHeaderText; // Original header text without parsing any variables
520 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100521 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100522 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100523 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100524 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
525 int mHeaderSeparatorH; // Height of the separator between header and list items
526 COLOR mHeaderSeparatorColor; // color of the header separator
527
528 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100529 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100530 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100531 bool hasHighlightColor; // indicates if a highlight color was set
532 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100533 COLOR mFontHighlightColor;
534 int mFontHeight;
535 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
536 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
537 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
538 int mSeparatorH; // Height of the separator between items
539 COLOR mSeparatorColor; // color of the separator that is between items
540
thata9998212015-02-19 22:51:24 +0100541 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100542 int mFastScrollW; // width of the fastscroll area
543 int mFastScrollLineW; // width of the line for fastscroll rendering
544 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100545 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100546 COLOR mFastScrollLineColor;
547 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100548
549 // Scrolling and dynamic state
550 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
551 int mFastScrollRectCurrentH; // current height of fastscroll rect
552 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100553 bool hasScroll; // indicates that we have enough items in the list to scroll
554 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
555 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
556 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 +0100557 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 +0100558 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
559 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
560 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
561 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
562 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500563 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 +0100564};
565
566class GUIFileSelector : public GUIScrollList
567{
568public:
569 GUIFileSelector(xml_node<>* node);
570 virtual ~GUIFileSelector();
571
572public:
573 // Update - Update any UI component animations (called <= 30 FPS)
574 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
575 virtual int Update(void);
576
577 // NotifyVarChange - Notify of a variable change
578 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
579
580 // SetPageFocus - Notify when a page gains or loses focus
581 virtual void SetPageFocus(int inFocus);
582
583 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100584 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100585 virtual void NotifySelect(size_t item_selected);
586
587protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200588 struct FileData {
589 std::string fileName;
590 unsigned char fileType; // Uses d_type format from struct dirent
591 mode_t protection; // Uses mode_t format from stat
592 uid_t userId;
593 gid_t groupId;
594 off_t fileSize;
595 time_t lastAccess; // Uses time_t format from stat
596 time_t lastModified; // Uses time_t format from stat
597 time_t lastStatChange; // Uses time_t format from stat
598 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400599
600protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200601 virtual int GetFileList(const std::string folder);
602 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400603
604protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200605 std::vector<FileData> mFolderList;
606 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100607 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600608 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100609 std::string mExtn; // used for filtering the file list, for example, *.zip
610 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
611 std::string mSortVariable; // data manager variable used to change the sorting of files
612 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
613 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
614 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)
615 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100616 ImageResource* mFolderIcon;
617 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600618 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400619};
620
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100621class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400622{
623public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200624 GUIListBox(xml_node<>* node);
625 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400626
627public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200628 // Update - Update any UI component animations (called <= 30 FPS)
629 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
630 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400631
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200632 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100633 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400634
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200635 // SetPageFocus - Notify when a page gains or loses focus
636 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400637
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100638 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100639 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100640 virtual void NotifySelect(size_t item_selected);
641
Dees_Troy51a0e822012-09-05 15:24:24 -0400642protected:
that8ab5c132015-09-13 23:00:54 +0200643 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200644 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500645 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400646 std::string variableValue;
647 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200648 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200649 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200650 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400651
652protected:
that8ab5c132015-09-13 23:00:54 +0200653 std::vector<ListItem> mListItems;
654 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200655 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400656 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100657 ImageResource* mIconSelected;
658 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500659 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600660 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400661};
662
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100663class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500664{
665public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200666 GUIPartitionList(xml_node<>* node);
667 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500668
669public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200670 // Update - Update any UI component animations (called <= 30 FPS)
671 // 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 +0100672 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500673
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200674 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100675 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500676
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200677 // SetPageFocus - Notify when a page gains or loses focus
678 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500679
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100680 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100681 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100682 virtual void NotifySelect(size_t item_selected);
683
Dees_Troya13d74f2013-03-24 08:54:55 -0500684protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100685 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600686 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500687
688protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200689 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500690 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200691 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500692 std::string selectedList;
693 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500694 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100695 ImageResource* mIconSelected;
696 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500697 bool updateList;
698};
699
Ethan Yonker44925ad2015-07-22 12:33:59 -0500700class GUITextBox : public GUIScrollList
701{
702public:
703 GUITextBox(xml_node<>* node);
704
705public:
706 // Update - Update any UI component animations (called <= 30 FPS)
707 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
708 virtual int Update(void);
709
710 // NotifyVarChange - Notify of a variable change
711 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
712
713 // ScrollList interface
714 virtual size_t GetItemCount();
715 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
716 virtual void NotifySelect(size_t item_selected);
717protected:
718
719 size_t mLastCount;
720 bool mIsStatic;
721 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
722 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
723 std::vector<std::string> rText; // Rendered text - what we actually see
724
725};
726
that8d46c092015-02-26 01:30:04 +0100727class GUIConsole : public GUIScrollList
728{
729public:
730 GUIConsole(xml_node<>* node);
731
732public:
733 // Render - Render the full object to the GL surface
734 // Return 0 on success, <0 on error
735 virtual int Render(void);
736
737 // Update - Update any UI component animations (called <= 30 FPS)
738 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
739 virtual int Update(void);
740
741 // IsInRegion - Checks if the request is handled by this object
742 // Return 1 if this object handles the request, 0 if not
743 virtual int IsInRegion(int x, int y);
744
745 // NotifyTouch - Notify of a touch event
746 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
747 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
748
749 // ScrollList interface
750 virtual size_t GetItemCount();
751 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
752 virtual void NotifySelect(size_t item_selected);
thata9dd9f02017-02-23 23:08:56 +0100753
Ethan Yonker74db1572015-10-28 12:44:49 -0500754 static void Translate_Now();
thata9dd9f02017-02-23 23:08:56 +0100755 static void Clear_For_Retranslation();
that8d46c092015-02-26 01:30:04 +0100756protected:
757 enum SlideoutState
758 {
759 hidden = 0,
760 visible,
761 request_hide,
762 request_show
763 };
764
765 ImageResource* mSlideoutImage;
766 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
767 bool scrollToEnd; // true if we want to keep tracking the last line
768 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
769 int mSlideout;
770 SlideoutState mSlideoutState;
771 std::vector<std::string> rConsole;
772 std::vector<std::string> rConsoleColor;
773
774protected:
that8d46c092015-02-26 01:30:04 +0100775 int RenderSlideout(void);
776 int RenderConsole(void);
777};
778
that1964d192016-01-07 00:41:03 +0100779class TerminalEngine;
780class GUITerminal : public GUIScrollList, public InputObject
781{
782public:
783 GUITerminal(xml_node<>* node);
784
785public:
786 // Update - Update any UI component animations (called <= 30 FPS)
787 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
788 virtual int Update(void);
789
790 // NotifyTouch - Notify of a touch event
791 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
792 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
793
794 // NotifyKey - Notify of a key press
795 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
796 virtual int NotifyKey(int key, bool down);
797
798 // character input
799 virtual int NotifyCharInput(int ch);
800
801 // SetPageFocus - Notify when a page gains or loses focus
802 virtual void SetPageFocus(int inFocus);
803
804 // ScrollList interface
805 virtual size_t GetItemCount();
806 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
807 virtual void NotifySelect(size_t item_selected);
808protected:
809 void InitAndResize();
810
811 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
812 int updateCounter; // to track if anything changed in the back-end
813 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
814};
815
Dees_Troy51a0e822012-09-05 15:24:24 -0400816// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100817class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400818{
819public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200820 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400821
822public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200823 // Render - Render the full object to the GL surface
824 // Return 0 on success, <0 on error
825 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400826
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200827 // Update - Update any UI component animations (called <= 30 FPS)
828 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
829 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400830
831protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200832 AnimationResource* mAnimation;
833 int mFrame;
834 int mFPS;
835 int mLoop;
836 int mRender;
837 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400838};
839
Vojtech Bocekede51c52014-02-07 23:58:09 +0100840class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400841{
842public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200843 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400844
845public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200846 // Render - Render the full object to the GL surface
847 // Return 0 on success, <0 on error
848 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400849
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200850 // Update - Update any UI component animations (called <= 30 FPS)
851 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
852 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400853
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200854 // NotifyVarChange - Notify of a variable change
855 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100856 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400857
858protected:
thatf6ed8fc2015-02-14 20:23:16 +0100859 ImageResource* mEmptyBar;
860 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200861 std::string mMinValVar;
862 std::string mMaxValVar;
863 std::string mCurValVar;
864 float mSlide;
865 float mSlideInc;
866 int mSlideFrames;
867 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400868
869protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200870 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400871};
872
Vojtech Bocekede51c52014-02-07 23:58:09 +0100873class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400874{
875public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200876 GUISlider(xml_node<>* node);
877 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400878
879public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200880 // Render - Render the full object to the GL surface
881 // Return 0 on success, <0 on error
882 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400883
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200884 // Update - Update any UI component animations (called <= 30 FPS)
885 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
886 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400887
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200888 // NotifyTouch - Notify of a touch event
889 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
890 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400891
892protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200893 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600894 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100895 ImageResource* sSlider;
896 ImageResource* sSliderUsed;
897 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200898 int sTouchW, sTouchH;
899 int sCurTouchX;
900 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400901};
902
that8834a0f2016-01-05 23:29:30 +0100903// these are ASCII codes reported via NotifyCharInput
904// other special keys (arrows etc.) are reported via NotifyKey
905#define KEYBOARD_ACTION 13 // CR
906#define KEYBOARD_BACKSPACE 8 // Backspace
907#define KEYBOARD_TAB 9 // Tab
908#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
909#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400910
Vojtech Bocekede51c52014-02-07 23:58:09 +0100911class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400912{
913public:
914 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200915 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400916
917public:
918 virtual int Render(void);
919 virtual int Update(void);
920 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
921 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100922 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400923
924protected:
thate79878b2015-03-14 23:07:23 +0100925 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200926 {
that8834a0f2016-01-05 23:29:30 +0100927 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
928 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100929 int end_x;
930 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200931 };
thate79878b2015-03-14 23:07:23 +0100932 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200933 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200934 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100935 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100936
937 enum {
938 MAX_KEYBOARD_LAYOUTS = 5,
939 MAX_KEYBOARD_ROWS = 9,
940 MAX_KEYBOARD_KEYS = 20
941 };
942 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600943 {
thatd86f49d2015-03-15 00:56:57 +0100944 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100945 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100946 int row_end_y[MAX_KEYBOARD_ROWS];
947 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600948 int revert_layout;
949 };
thatd86f49d2015-03-15 00:56:57 +0100950 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400951
thatf256b722015-05-23 20:44:12 +0200952 struct KeyLabel
953 {
that8834a0f2016-01-05 23:29:30 +0100954 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200955 int layout_from; // 1-based; 0 for labels that apply to all layouts
956 int layout_to; // same as Key.layout
957 string text; // key label text
958 ImageResource* image; // image (overrides text if defined)
959 };
960 std::vector<KeyLabel> mKeyLabels;
961
thate79878b2015-03-14 23:07:23 +0100962 // Find key at screen coordinates
963 Key* HitTestKey(int x, int y);
964
Dees_Troy51a0e822012-09-05 15:24:24 -0400965 bool mRendered;
966 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100967 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100968 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100969 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 +0200970 int highlightRenderCount;
971 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100972 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400973 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600974 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100975 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200976 COLOR mFontColor; // for centered key labels
977 COLOR mFontColorSmall; // for centered key labels
978 FontResource* mFont; // for main key labels
979 FontResource* mSmallFont; // for key labels like "?123"
980 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200981 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200982 COLOR mLongpressFontColor;
983 COLOR mBackgroundColor; // keyboard background color
984 COLOR mKeyColorAlphanumeric; // key background color
985 COLOR mKeyColorOther; // key background color
986 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400987};
988
989// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100990class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400991{
992public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200993 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400994 virtual ~GUIInput();
995
996public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200997 // Render - Render the full object to the GL surface
998 // Return 0 on success, <0 on error
999 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001000
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001001 // Update - Update any UI component animations (called <= 30 FPS)
1002 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1003 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001004
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001005 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001006 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001007
1008 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001009 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1010 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001011
that8834a0f2016-01-05 23:29:30 +01001012 virtual int NotifyKey(int key, bool down);
1013 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001014
1015protected:
1016 virtual int GetSelection(int x, int y);
1017
1018 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001019 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001020 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001021 void HandleCursorByTouch(int x);
1022 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001023
1024protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001025 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001026 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001027 ImageResource* mBackground;
1028 ImageResource* mCursor;
1029 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001030 std::string mVariable;
1031 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001032 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001033 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001034 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001035 COLOR mCursorColor;
1036 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001037 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001038 int lastX;
1039 int mCursorLocation;
1040 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1041 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001042 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001043 unsigned mFontHeight;
1044 unsigned CursorWidth;
1045 bool mRendered;
1046 bool HasMask;
1047 bool DrawCursor;
1048 bool isLocalChange;
1049 bool HasAllowed;
1050 bool HasDisabled;
1051 std::string AllowedList;
1052 std::string DisabledList;
1053 unsigned MinLen;
1054 unsigned MaxLen;
1055};
1056
1057class HardwareKeyboard
1058{
1059public:
thatf37aec22015-02-01 13:38:35 +01001060 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001061 virtual ~HardwareKeyboard();
1062
1063public:
thatf37aec22015-02-01 13:38:35 +01001064 // called by the input handler for key events
1065 int KeyDown(int key_code);
1066 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001067
thatf37aec22015-02-01 13:38:35 +01001068 // called by the input handler when holding a key down
1069 int KeyRepeat();
1070
1071 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001072 void ConsumeKeyRelease(int key);
1073
that8834a0f2016-01-05 23:29:30 +01001074 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001075private:
that8834a0f2016-01-05 23:29:30 +01001076 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001077 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001078 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001079};
1080
Vojtech Bocekede51c52014-02-07 23:58:09 +01001081class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001082{
1083public:
1084 GUISliderValue(xml_node<>* node);
1085 virtual ~GUISliderValue();
1086
1087public:
1088 // Render - Render the full object to the GL surface
1089 // Return 0 on success, <0 on error
1090 virtual int Render(void);
1091
1092 // Update - Update any UI component animations (called <= 30 FPS)
1093 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1094 virtual int Update(void);
1095
1096 // SetPos - Update the position of the render object
1097 // Return 0 on success, <0 on error
1098 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1099
1100 // NotifyTouch - Notify of a touch event
1101 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1102 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1103
1104 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001105 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001106
1107 // SetPageFocus - Notify when a page gains or loses focus
1108 virtual void SetPageFocus(int inFocus);
1109
1110protected:
1111 int measureText(const std::string& str);
1112 int valueFromPct(float pct);
1113 float pctFromValue(int value);
1114 void loadValue(bool force = false);
1115
1116 std::string mVariable;
1117 int mMax;
1118 int mMin;
1119 int mValue;
1120 char *mValueStr;
1121 float mValuePct;
1122 std::string mMaxStr;
1123 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001124 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001125 GUIText* mLabel;
1126 int mLabelW;
1127 COLOR mTextColor;
1128 COLOR mLineColor;
1129 COLOR mSliderColor;
1130 bool mShowRange;
1131 bool mShowCurr;
1132 int mLineX;
1133 int mLineY;
1134 int mLineH;
1135 int mLinePadding;
1136 int mPadding;
1137 int mSliderY;
1138 int mSliderW;
1139 int mSliderH;
1140 bool mRendered;
1141 int mFontHeight;
1142 GUIAction *mAction;
1143 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001144 int mLineW;
1145 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001146 ImageResource *mBackgroundImage;
1147 ImageResource *mHandleImage;
1148 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001149};
1150
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001151class MouseCursor : public RenderObject
1152{
1153public:
1154 MouseCursor(int posX, int posY);
1155 virtual ~MouseCursor();
1156
1157 virtual int Render(void);
1158 virtual int Update(void);
1159 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1160
1161 void Move(int deltaX, int deltaY);
1162 void GetPos(int& x, int& y);
1163 void LoadData(xml_node<>* node);
1164 void ResetData(int resX, int resY);
1165
1166private:
1167 int m_resX;
1168 int m_resY;
1169 bool m_moved;
1170 float m_speedMultiplier;
1171 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001172 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001173 bool m_present;
1174};
1175
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001176class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1177{
1178public:
1179 GUIPatternPassword(xml_node<>* node);
1180 virtual ~GUIPatternPassword();
1181
1182public:
1183 virtual int Render(void);
1184 virtual int Update(void);
1185 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001186 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001187 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1188
1189protected:
1190 void CalculateDotPositions();
1191 void ResetActiveDots();
1192 void ConnectDot(int dot_idx);
1193 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001194 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001195 int InDot(int x, int y);
1196 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001197 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001198 void PatternDrawn();
1199
1200 struct Dot {
1201 int x;
1202 int y;
1203 bool active;
1204 };
1205
Aleksa Saraib25a1832015-12-31 17:36:00 +01001206 std::string mSizeVar;
1207 size_t mGridSize;
1208
1209 Dot* mDots;
1210 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001211 size_t mConnectedDotsLen;
1212 int mCurLineX;
1213 int mCurLineY;
1214 bool mTrackingTouch;
1215 bool mNeedRender;
1216
1217 COLOR mDotColor;
1218 COLOR mActiveDotColor;
1219 COLOR mLineColor;
1220 ImageResource *mDotImage;
1221 ImageResource *mActiveDotImage;
1222 gr_surface mDotCircle;
1223 gr_surface mActiveDotCircle;
1224 int mDotRadius;
1225 int mLineWidth;
1226
1227 std::string mPassVar;
1228 GUIAction *mAction;
1229 int mUpdate;
1230};
1231
1232
Dees_Troy51a0e822012-09-05 15:24:24 -04001233// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001234xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001235std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1236int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1237int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1238int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001239COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001240COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1241FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1242ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1243AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001244bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001245
1246#endif // _OBJECTS_HEADER