blob: 2e306e0f751adac370a468c8f340622c15f724e0 [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);
thatcc8ddca2015-01-03 01:59:36 +0100291 void reinject_after_flash();
Dees_Troy51a0e822012-09-05 15:24:24 -0400292 void operation_start(const string operation_name);
that3f7b1ac2014-12-30 11:30:13 +0100293 void operation_end(const int operation_status);
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +0000294 time_t Start;
that3f7b1ac2014-12-30 11:30:13 +0100295
296 // map action name to function pointer
297 typedef int (GUIAction::*execFunction)(std::string);
298 typedef std::map<std::string, execFunction> mapFunc;
299 static mapFunc mf;
thatc6085482015-01-09 22:12:43 +0100300 static std::set<std::string> setActionsRunningInCallerThread;
that3f7b1ac2014-12-30 11:30:13 +0100301
302 // GUI actions
303 int reboot(std::string arg);
304 int home(std::string arg);
305 int key(std::string arg);
306 int page(std::string arg);
307 int reload(std::string arg);
308 int readBackup(std::string arg);
309 int set(std::string arg);
310 int clear(std::string arg);
311 int mount(std::string arg);
312 int unmount(std::string arg);
313 int restoredefaultsettings(std::string arg);
314 int copylog(std::string arg);
315 int compute(std::string arg);
316 int setguitimezone(std::string arg);
317 int overlay(std::string arg);
318 int queuezip(std::string arg);
319 int cancelzip(std::string arg);
320 int queueclear(std::string arg);
321 int sleep(std::string arg);
Matt Mower9a2a2052016-05-31 21:31:22 -0500322 int sleepcounter(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100323 int appenddatetobackupname(std::string arg);
324 int generatebackupname(std::string arg);
325 int checkpartitionlist(std::string arg);
326 int getpartitiondetails(std::string arg);
327 int screenshot(std::string arg);
328 int setbrightness(std::string arg);
Ethan Yonkerb4bff5e2016-12-16 07:47:58 -0600329 int checkforapp(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100330
thatc6085482015-01-09 22:12:43 +0100331 // (originally) threaded actions
that3f7b1ac2014-12-30 11:30:13 +0100332 int fileexists(std::string arg);
333 int flash(std::string arg);
334 int wipe(std::string arg);
335 int refreshsizes(std::string arg);
336 int nandroid(std::string arg);
Ethan Yonkerb5fab762016-01-28 14:03:33 -0600337 int fixcontexts(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100338 int fixpermissions(std::string arg);
339 int dd(std::string arg);
340 int partitionsd(std::string arg);
341 int installhtcdumlock(std::string arg);
342 int htcdumlockrestoreboot(std::string arg);
343 int htcdumlockreflashrecovery(std::string arg);
344 int cmd(std::string arg);
345 int terminalcommand(std::string arg);
346 int killterminal(std::string arg);
347 int reinjecttwrp(std::string arg);
348 int checkbackupname(std::string arg);
349 int decrypt(std::string arg);
350 int adbsideload(std::string arg);
351 int adbsideloadcancel(std::string arg);
352 int openrecoveryscript(std::string arg);
353 int installsu(std::string arg);
354 int fixsu(std::string arg);
355 int decrypt_backup(std::string arg);
356 int repair(std::string arg);
Ethan Yonkera2719152015-05-28 09:44:41 -0500357 int resize(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100358 int changefilesystem(std::string arg);
359 int startmtp(std::string arg);
360 int stopmtp(std::string arg);
Ethan Yonker96af84a2015-01-05 14:58:36 -0600361 int flashimage(std::string arg);
bigbiff7abc5fe2015-01-17 16:53:12 -0500362 int cancelbackup(std::string arg);
Ethan Yonkereb32b1f2015-05-18 10:23:03 -0500363 int checkpartitionlifetimewrites(std::string arg);
364 int mountsystemtoggle(std::string arg);
Ethan Yonker74db1572015-10-28 12:44:49 -0500365 int setlanguage(std::string arg);
Matt Mower9472ba12016-01-20 18:12:47 -0600366 int togglebacklight(std::string arg);
that10ae24f2015-12-26 20:53:51 +0100367 int twcmd(std::string arg);
Ethan Yonker1b190162016-12-05 15:25:19 -0600368 int setbootslot(std::string arg);
Ethan Yonkerb4bff5e2016-12-16 07:47:58 -0600369 int installapp(std::string arg);
Ethan Yonker53796e72019-01-11 22:49:52 -0600370 int repackimage(std::string arg);
371 int fixabrecoverybootloop(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100372
373 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400374};
375
Vojtech Bocekede51c52014-02-07 23:58:09 +0100376class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400377{
378public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200379 GUIButton(xml_node<>* node);
380 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400381
382public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200383 // Render - Render the full object to the GL surface
384 // Return 0 on success, <0 on error
385 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400386
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200387 // Update - Update any UI component animations (called <= 30 FPS)
388 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
389 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400390
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200391 // SetPos - Update the position of the render object
392 // Return 0 on success, <0 on error
393 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400394
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200395 // NotifyTouch - Notify of a touch event
396 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
397 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400398
399protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200400 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100401 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200402 GUIText* mButtonLabel;
403 GUIAction* mAction;
404 int mTextX, mTextY, mTextW, mTextH;
405 int mIconX, mIconY, mIconW, mIconH;
406 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600407 bool hasHighlightColor;
408 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500409 bool hasFill;
410 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600411 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000412 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400413};
414
Vojtech Bocekede51c52014-02-07 23:58:09 +0100415class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400416{
417public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200418 GUICheckbox(xml_node<>* node);
419 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400420
421public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200422 // Render - Render the full object to the GL surface
423 // Return 0 on success, <0 on error
424 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400425
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200426 // Update - Update any UI component animations (called <= 30 FPS)
427 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
428 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400429
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200430 // SetPos - Update the position of the render object
431 // Return 0 on success, <0 on error
432 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400433
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200434 // NotifyTouch - Notify of a touch event
435 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
436 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400437
438protected:
thatf6ed8fc2015-02-14 20:23:16 +0100439 ImageResource* mChecked;
440 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200441 GUIText* mLabel;
442 int mTextX, mTextY;
443 int mCheckX, mCheckY, mCheckW, mCheckH;
444 int mLastState;
445 bool mRendered;
446 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400447};
448
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100449class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400450{
451public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100452 GUIScrollList(xml_node<>* node);
453 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400454
455public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200456 // Render - Render the full object to the GL surface
457 // Return 0 on success, <0 on error
458 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400459
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200460 // Update - Update any UI component animations (called <= 30 FPS)
461 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
462 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400463
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200464 // NotifyTouch - Notify of a touch event
465 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
466 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400467
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200468 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100469 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400470
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200471 // SetPos - Update the position of the render object
472 // Return 0 on success, <0 on error
473 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400474
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200475 // SetPageFocus - Notify when a page gains or loses focus
476 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400477
478protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100479 // derived classes need to implement these
480 // get number of items
481 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100482 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
483 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100484 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500485 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100486
that0af77952015-02-25 08:52:19 +0100487 // render a standard-layout list item with optional icon and text
488 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
489
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100490 enum { NO_ITEM = (size_t)-1 };
491 // returns item index at coordinates or NO_ITEM if there is no item there
492 size_t HitTestItem(int x, int y);
493
494 // 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
495 void SetMaxIconSize(int w, int h);
496
497 // This will make sure that the item indicated by list_index is visible on the screen
498 void SetVisibleListLocation(size_t list_index);
499
500 // Handle scrolling changes for drags and kinetic scrolling
501 void HandleScrolling();
502
that9876ac32015-02-15 21:40:59 +0100503 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100504 int GetDisplayItemCount();
505
506 // Returns the size in pixels of a partial item or row size
507 int GetDisplayRemainder();
508
509protected:
510 // Background
511 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100512 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100513
514 // Header
515 COLOR mHeaderBackgroundColor;
516 COLOR mHeaderFontColor;
517 std::string mHeaderText; // Original header text without parsing any variables
518 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100519 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100520 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100521 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100522 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
523 int mHeaderSeparatorH; // Height of the separator between header and list items
524 COLOR mHeaderSeparatorColor; // color of the header separator
525
526 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100527 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100528 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100529 bool hasHighlightColor; // indicates if a highlight color was set
530 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100531 COLOR mFontHighlightColor;
532 int mFontHeight;
533 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
534 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
535 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
536 int mSeparatorH; // Height of the separator between items
537 COLOR mSeparatorColor; // color of the separator that is between items
538
thata9998212015-02-19 22:51:24 +0100539 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100540 int mFastScrollW; // width of the fastscroll area
541 int mFastScrollLineW; // width of the line for fastscroll rendering
542 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100543 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100544 COLOR mFastScrollLineColor;
545 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100546
547 // Scrolling and dynamic state
548 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
549 int mFastScrollRectCurrentH; // current height of fastscroll rect
550 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100551 bool hasScroll; // indicates that we have enough items in the list to scroll
552 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
553 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
554 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 +0100555 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 +0100556 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
557 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
558 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
559 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
560 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500561 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 +0100562};
563
564class GUIFileSelector : public GUIScrollList
565{
566public:
567 GUIFileSelector(xml_node<>* node);
568 virtual ~GUIFileSelector();
569
570public:
571 // Update - Update any UI component animations (called <= 30 FPS)
572 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
573 virtual int Update(void);
574
575 // NotifyVarChange - Notify of a variable change
576 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
577
578 // SetPageFocus - Notify when a page gains or loses focus
579 virtual void SetPageFocus(int inFocus);
580
581 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100582 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100583 virtual void NotifySelect(size_t item_selected);
584
585protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200586 struct FileData {
587 std::string fileName;
588 unsigned char fileType; // Uses d_type format from struct dirent
589 mode_t protection; // Uses mode_t format from stat
590 uid_t userId;
591 gid_t groupId;
592 off_t fileSize;
593 time_t lastAccess; // Uses time_t format from stat
594 time_t lastModified; // Uses time_t format from stat
595 time_t lastStatChange; // Uses time_t format from stat
596 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400597
598protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200599 virtual int GetFileList(const std::string folder);
600 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400601
602protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200603 std::vector<FileData> mFolderList;
604 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100605 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600606 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100607 std::string mExtn; // used for filtering the file list, for example, *.zip
608 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
609 std::string mSortVariable; // data manager variable used to change the sorting of files
610 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
611 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
612 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)
613 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100614 ImageResource* mFolderIcon;
615 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600616 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400617};
618
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100619class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400620{
621public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200622 GUIListBox(xml_node<>* node);
623 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400624
625public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200626 // Update - Update any UI component animations (called <= 30 FPS)
627 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
628 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400629
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200630 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100631 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400632
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200633 // SetPageFocus - Notify when a page gains or loses focus
634 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400635
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100636 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100637 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100638 virtual void NotifySelect(size_t item_selected);
639
Dees_Troy51a0e822012-09-05 15:24:24 -0400640protected:
that8ab5c132015-09-13 23:00:54 +0200641 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200642 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500643 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400644 std::string variableValue;
645 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200646 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200647 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200648 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400649
650protected:
that8ab5c132015-09-13 23:00:54 +0200651 std::vector<ListItem> mListItems;
652 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200653 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400654 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100655 ImageResource* mIconSelected;
656 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500657 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600658 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400659};
660
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100661class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500662{
663public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200664 GUIPartitionList(xml_node<>* node);
665 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500666
667public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200668 // Update - Update any UI component animations (called <= 30 FPS)
669 // 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 +0100670 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500671
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200672 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100673 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500674
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200675 // SetPageFocus - Notify when a page gains or loses focus
676 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500677
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100678 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100679 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100680 virtual void NotifySelect(size_t item_selected);
681
Dees_Troya13d74f2013-03-24 08:54:55 -0500682protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100683 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600684 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500685
686protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200687 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500688 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200689 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500690 std::string selectedList;
691 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500692 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100693 ImageResource* mIconSelected;
694 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500695 bool updateList;
696};
697
Ethan Yonker44925ad2015-07-22 12:33:59 -0500698class GUITextBox : public GUIScrollList
699{
700public:
701 GUITextBox(xml_node<>* node);
702
703public:
704 // Update - Update any UI component animations (called <= 30 FPS)
705 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
706 virtual int Update(void);
707
708 // NotifyVarChange - Notify of a variable change
709 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
710
711 // ScrollList interface
712 virtual size_t GetItemCount();
713 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
714 virtual void NotifySelect(size_t item_selected);
715protected:
716
717 size_t mLastCount;
718 bool mIsStatic;
719 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
720 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
721 std::vector<std::string> rText; // Rendered text - what we actually see
722
723};
724
that8d46c092015-02-26 01:30:04 +0100725class GUIConsole : public GUIScrollList
726{
727public:
728 GUIConsole(xml_node<>* node);
729
730public:
731 // Render - Render the full object to the GL surface
732 // Return 0 on success, <0 on error
733 virtual int Render(void);
734
735 // Update - Update any UI component animations (called <= 30 FPS)
736 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
737 virtual int Update(void);
738
739 // IsInRegion - Checks if the request is handled by this object
740 // Return 1 if this object handles the request, 0 if not
741 virtual int IsInRegion(int x, int y);
742
743 // NotifyTouch - Notify of a touch event
744 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
745 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
746
747 // ScrollList interface
748 virtual size_t GetItemCount();
749 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
750 virtual void NotifySelect(size_t item_selected);
thata9dd9f02017-02-23 23:08:56 +0100751
Ethan Yonker74db1572015-10-28 12:44:49 -0500752 static void Translate_Now();
thata9dd9f02017-02-23 23:08:56 +0100753 static void Clear_For_Retranslation();
that8d46c092015-02-26 01:30:04 +0100754protected:
755 enum SlideoutState
756 {
757 hidden = 0,
758 visible,
759 request_hide,
760 request_show
761 };
762
763 ImageResource* mSlideoutImage;
764 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
765 bool scrollToEnd; // true if we want to keep tracking the last line
766 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
767 int mSlideout;
768 SlideoutState mSlideoutState;
769 std::vector<std::string> rConsole;
770 std::vector<std::string> rConsoleColor;
771
772protected:
that8d46c092015-02-26 01:30:04 +0100773 int RenderSlideout(void);
774 int RenderConsole(void);
775};
776
that1964d192016-01-07 00:41:03 +0100777class TerminalEngine;
778class GUITerminal : public GUIScrollList, public InputObject
779{
780public:
781 GUITerminal(xml_node<>* node);
782
783public:
784 // Update - Update any UI component animations (called <= 30 FPS)
785 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
786 virtual int Update(void);
787
788 // NotifyTouch - Notify of a touch event
789 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
790 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
791
792 // NotifyKey - Notify of a key press
793 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
794 virtual int NotifyKey(int key, bool down);
795
796 // character input
797 virtual int NotifyCharInput(int ch);
798
799 // SetPageFocus - Notify when a page gains or loses focus
800 virtual void SetPageFocus(int inFocus);
801
802 // ScrollList interface
803 virtual size_t GetItemCount();
804 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
805 virtual void NotifySelect(size_t item_selected);
806protected:
807 void InitAndResize();
808
809 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
810 int updateCounter; // to track if anything changed in the back-end
811 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
812};
813
Dees_Troy51a0e822012-09-05 15:24:24 -0400814// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100815class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400816{
817public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200818 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400819
820public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200821 // Render - Render the full object to the GL surface
822 // Return 0 on success, <0 on error
823 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400824
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200825 // Update - Update any UI component animations (called <= 30 FPS)
826 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
827 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400828
829protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200830 AnimationResource* mAnimation;
831 int mFrame;
832 int mFPS;
833 int mLoop;
834 int mRender;
835 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400836};
837
Vojtech Bocekede51c52014-02-07 23:58:09 +0100838class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400839{
840public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200841 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400842
843public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200844 // Render - Render the full object to the GL surface
845 // Return 0 on success, <0 on error
846 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400847
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200848 // Update - Update any UI component animations (called <= 30 FPS)
849 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
850 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400851
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200852 // NotifyVarChange - Notify of a variable change
853 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100854 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400855
856protected:
thatf6ed8fc2015-02-14 20:23:16 +0100857 ImageResource* mEmptyBar;
858 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200859 std::string mMinValVar;
860 std::string mMaxValVar;
861 std::string mCurValVar;
862 float mSlide;
863 float mSlideInc;
864 int mSlideFrames;
865 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400866
867protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200868 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400869};
870
Vojtech Bocekede51c52014-02-07 23:58:09 +0100871class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400872{
873public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200874 GUISlider(xml_node<>* node);
875 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400876
877public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200878 // Render - Render the full object to the GL surface
879 // Return 0 on success, <0 on error
880 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400881
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200882 // Update - Update any UI component animations (called <= 30 FPS)
883 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
884 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400885
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200886 // NotifyTouch - Notify of a touch event
887 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
888 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400889
890protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200891 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600892 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100893 ImageResource* sSlider;
894 ImageResource* sSliderUsed;
895 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200896 int sTouchW, sTouchH;
897 int sCurTouchX;
898 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400899};
900
that8834a0f2016-01-05 23:29:30 +0100901// these are ASCII codes reported via NotifyCharInput
902// other special keys (arrows etc.) are reported via NotifyKey
903#define KEYBOARD_ACTION 13 // CR
904#define KEYBOARD_BACKSPACE 8 // Backspace
905#define KEYBOARD_TAB 9 // Tab
906#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
907#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400908
Vojtech Bocekede51c52014-02-07 23:58:09 +0100909class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400910{
911public:
912 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200913 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400914
915public:
916 virtual int Render(void);
917 virtual int Update(void);
918 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
919 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100920 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400921
922protected:
thate79878b2015-03-14 23:07:23 +0100923 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200924 {
that8834a0f2016-01-05 23:29:30 +0100925 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
926 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100927 int end_x;
928 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200929 };
thate79878b2015-03-14 23:07:23 +0100930 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200931 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200932 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100933 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100934
935 enum {
936 MAX_KEYBOARD_LAYOUTS = 5,
937 MAX_KEYBOARD_ROWS = 9,
938 MAX_KEYBOARD_KEYS = 20
939 };
940 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600941 {
thatd86f49d2015-03-15 00:56:57 +0100942 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100943 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100944 int row_end_y[MAX_KEYBOARD_ROWS];
945 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600946 int revert_layout;
947 };
thatd86f49d2015-03-15 00:56:57 +0100948 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400949
thatf256b722015-05-23 20:44:12 +0200950 struct KeyLabel
951 {
that8834a0f2016-01-05 23:29:30 +0100952 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200953 int layout_from; // 1-based; 0 for labels that apply to all layouts
954 int layout_to; // same as Key.layout
955 string text; // key label text
956 ImageResource* image; // image (overrides text if defined)
957 };
958 std::vector<KeyLabel> mKeyLabels;
959
thate79878b2015-03-14 23:07:23 +0100960 // Find key at screen coordinates
961 Key* HitTestKey(int x, int y);
962
Dees_Troy51a0e822012-09-05 15:24:24 -0400963 bool mRendered;
964 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100965 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100966 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100967 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 +0200968 int highlightRenderCount;
969 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100970 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400971 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600972 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100973 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200974 COLOR mFontColor; // for centered key labels
975 COLOR mFontColorSmall; // for centered key labels
976 FontResource* mFont; // for main key labels
977 FontResource* mSmallFont; // for key labels like "?123"
978 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200979 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200980 COLOR mLongpressFontColor;
981 COLOR mBackgroundColor; // keyboard background color
982 COLOR mKeyColorAlphanumeric; // key background color
983 COLOR mKeyColorOther; // key background color
984 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400985};
986
987// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100988class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400989{
990public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200991 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400992 virtual ~GUIInput();
993
994public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200995 // Render - Render the full object to the GL surface
996 // Return 0 on success, <0 on error
997 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400998
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200999 // Update - Update any UI component animations (called <= 30 FPS)
1000 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1001 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001002
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001003 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001004 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001005
1006 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001007 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1008 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001009
that8834a0f2016-01-05 23:29:30 +01001010 virtual int NotifyKey(int key, bool down);
1011 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001012
1013protected:
1014 virtual int GetSelection(int x, int y);
1015
1016 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001017 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001018 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001019 void HandleCursorByTouch(int x);
1020 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001021
1022protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001023 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001024 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001025 ImageResource* mBackground;
1026 ImageResource* mCursor;
1027 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001028 std::string mVariable;
1029 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001030 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001031 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001032 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001033 COLOR mCursorColor;
1034 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001035 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001036 int lastX;
1037 int mCursorLocation;
1038 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1039 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001040 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001041 unsigned mFontHeight;
1042 unsigned CursorWidth;
1043 bool mRendered;
1044 bool HasMask;
1045 bool DrawCursor;
1046 bool isLocalChange;
1047 bool HasAllowed;
1048 bool HasDisabled;
1049 std::string AllowedList;
1050 std::string DisabledList;
1051 unsigned MinLen;
1052 unsigned MaxLen;
1053};
1054
1055class HardwareKeyboard
1056{
1057public:
thatf37aec22015-02-01 13:38:35 +01001058 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001059 virtual ~HardwareKeyboard();
1060
1061public:
thatf37aec22015-02-01 13:38:35 +01001062 // called by the input handler for key events
1063 int KeyDown(int key_code);
1064 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001065
thatf37aec22015-02-01 13:38:35 +01001066 // called by the input handler when holding a key down
1067 int KeyRepeat();
1068
1069 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001070 void ConsumeKeyRelease(int key);
1071
that8834a0f2016-01-05 23:29:30 +01001072 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001073private:
that8834a0f2016-01-05 23:29:30 +01001074 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001075 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001076 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001077};
1078
Vojtech Bocekede51c52014-02-07 23:58:09 +01001079class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001080{
1081public:
1082 GUISliderValue(xml_node<>* node);
1083 virtual ~GUISliderValue();
1084
1085public:
1086 // Render - Render the full object to the GL surface
1087 // Return 0 on success, <0 on error
1088 virtual int Render(void);
1089
1090 // Update - Update any UI component animations (called <= 30 FPS)
1091 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1092 virtual int Update(void);
1093
1094 // SetPos - Update the position of the render object
1095 // Return 0 on success, <0 on error
1096 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1097
1098 // NotifyTouch - Notify of a touch event
1099 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1100 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1101
1102 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001103 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001104
1105 // SetPageFocus - Notify when a page gains or loses focus
1106 virtual void SetPageFocus(int inFocus);
1107
1108protected:
1109 int measureText(const std::string& str);
1110 int valueFromPct(float pct);
1111 float pctFromValue(int value);
1112 void loadValue(bool force = false);
1113
1114 std::string mVariable;
1115 int mMax;
1116 int mMin;
1117 int mValue;
1118 char *mValueStr;
1119 float mValuePct;
1120 std::string mMaxStr;
1121 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001122 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001123 GUIText* mLabel;
1124 int mLabelW;
1125 COLOR mTextColor;
1126 COLOR mLineColor;
1127 COLOR mSliderColor;
1128 bool mShowRange;
1129 bool mShowCurr;
1130 int mLineX;
1131 int mLineY;
1132 int mLineH;
1133 int mLinePadding;
1134 int mPadding;
1135 int mSliderY;
1136 int mSliderW;
1137 int mSliderH;
1138 bool mRendered;
1139 int mFontHeight;
1140 GUIAction *mAction;
1141 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001142 int mLineW;
1143 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001144 ImageResource *mBackgroundImage;
1145 ImageResource *mHandleImage;
1146 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001147};
1148
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001149class MouseCursor : public RenderObject
1150{
1151public:
1152 MouseCursor(int posX, int posY);
1153 virtual ~MouseCursor();
1154
1155 virtual int Render(void);
1156 virtual int Update(void);
1157 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1158
1159 void Move(int deltaX, int deltaY);
1160 void GetPos(int& x, int& y);
1161 void LoadData(xml_node<>* node);
1162 void ResetData(int resX, int resY);
1163
1164private:
1165 int m_resX;
1166 int m_resY;
1167 bool m_moved;
1168 float m_speedMultiplier;
1169 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001170 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001171 bool m_present;
1172};
1173
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001174class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1175{
1176public:
1177 GUIPatternPassword(xml_node<>* node);
1178 virtual ~GUIPatternPassword();
1179
1180public:
1181 virtual int Render(void);
1182 virtual int Update(void);
1183 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001184 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001185 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1186
1187protected:
1188 void CalculateDotPositions();
1189 void ResetActiveDots();
1190 void ConnectDot(int dot_idx);
1191 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001192 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001193 int InDot(int x, int y);
1194 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001195 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001196 void PatternDrawn();
1197
1198 struct Dot {
1199 int x;
1200 int y;
1201 bool active;
1202 };
1203
Aleksa Saraib25a1832015-12-31 17:36:00 +01001204 std::string mSizeVar;
1205 size_t mGridSize;
1206
1207 Dot* mDots;
1208 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001209 size_t mConnectedDotsLen;
1210 int mCurLineX;
1211 int mCurLineY;
1212 bool mTrackingTouch;
1213 bool mNeedRender;
1214
1215 COLOR mDotColor;
1216 COLOR mActiveDotColor;
1217 COLOR mLineColor;
1218 ImageResource *mDotImage;
1219 ImageResource *mActiveDotImage;
1220 gr_surface mDotCircle;
1221 gr_surface mActiveDotCircle;
1222 int mDotRadius;
1223 int mLineWidth;
1224
1225 std::string mPassVar;
1226 GUIAction *mAction;
1227 int mUpdate;
1228};
1229
1230
Dees_Troy51a0e822012-09-05 15:24:24 -04001231// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001232xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001233std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1234int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1235int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1236int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001237COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001238COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1239FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1240ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1241AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001242bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001243
1244#endif // _OBJECTS_HEADER