blob: 3f7241831f0bb0465a13b56ca4f57f6f1fee16f2 [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 Yonker76bbd3a2019-05-10 10:50:04 -0500370 int uninstalltwrpsystemapp(std::string arg);
Ethan Yonker53796e72019-01-11 22:49:52 -0600371 int repackimage(std::string arg);
372 int fixabrecoverybootloop(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100373
374 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400375};
376
Vojtech Bocekede51c52014-02-07 23:58:09 +0100377class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400378{
379public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200380 GUIButton(xml_node<>* node);
381 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400382
383public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200384 // Render - Render the full object to the GL surface
385 // Return 0 on success, <0 on error
386 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400387
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200388 // Update - Update any UI component animations (called <= 30 FPS)
389 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
390 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400391
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200392 // SetPos - Update the position of the render object
393 // Return 0 on success, <0 on error
394 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400395
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200396 // NotifyTouch - Notify of a touch event
397 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
398 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400399
400protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200401 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100402 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200403 GUIText* mButtonLabel;
404 GUIAction* mAction;
405 int mTextX, mTextY, mTextW, mTextH;
406 int mIconX, mIconY, mIconW, mIconH;
407 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600408 bool hasHighlightColor;
409 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500410 bool hasFill;
411 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600412 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000413 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400414};
415
Vojtech Bocekede51c52014-02-07 23:58:09 +0100416class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400417{
418public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200419 GUICheckbox(xml_node<>* node);
420 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400421
422public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200423 // Render - Render the full object to the GL surface
424 // Return 0 on success, <0 on error
425 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400426
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200427 // Update - Update any UI component animations (called <= 30 FPS)
428 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
429 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400430
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200431 // SetPos - Update the position of the render object
432 // Return 0 on success, <0 on error
433 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400434
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200435 // NotifyTouch - Notify of a touch event
436 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
437 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400438
439protected:
thatf6ed8fc2015-02-14 20:23:16 +0100440 ImageResource* mChecked;
441 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200442 GUIText* mLabel;
443 int mTextX, mTextY;
444 int mCheckX, mCheckY, mCheckW, mCheckH;
445 int mLastState;
446 bool mRendered;
447 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400448};
449
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100450class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400451{
452public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100453 GUIScrollList(xml_node<>* node);
454 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400455
456public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200457 // Render - Render the full object to the GL surface
458 // Return 0 on success, <0 on error
459 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400460
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200461 // Update - Update any UI component animations (called <= 30 FPS)
462 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
463 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400464
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200465 // NotifyTouch - Notify of a touch event
466 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
467 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400468
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200469 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100470 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400471
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200472 // SetPos - Update the position of the render object
473 // Return 0 on success, <0 on error
474 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400475
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200476 // SetPageFocus - Notify when a page gains or loses focus
477 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400478
479protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100480 // derived classes need to implement these
481 // get number of items
482 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100483 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
484 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100485 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500486 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100487
that0af77952015-02-25 08:52:19 +0100488 // render a standard-layout list item with optional icon and text
489 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
490
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100491 enum { NO_ITEM = (size_t)-1 };
492 // returns item index at coordinates or NO_ITEM if there is no item there
493 size_t HitTestItem(int x, int y);
494
495 // 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
496 void SetMaxIconSize(int w, int h);
497
498 // This will make sure that the item indicated by list_index is visible on the screen
499 void SetVisibleListLocation(size_t list_index);
500
501 // Handle scrolling changes for drags and kinetic scrolling
502 void HandleScrolling();
503
that9876ac32015-02-15 21:40:59 +0100504 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100505 int GetDisplayItemCount();
506
507 // Returns the size in pixels of a partial item or row size
508 int GetDisplayRemainder();
509
510protected:
511 // Background
512 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100513 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100514
515 // Header
516 COLOR mHeaderBackgroundColor;
517 COLOR mHeaderFontColor;
518 std::string mHeaderText; // Original header text without parsing any variables
519 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100520 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100521 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100522 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100523 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
524 int mHeaderSeparatorH; // Height of the separator between header and list items
525 COLOR mHeaderSeparatorColor; // color of the header separator
526
527 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100528 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100529 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100530 bool hasHighlightColor; // indicates if a highlight color was set
531 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100532 COLOR mFontHighlightColor;
533 int mFontHeight;
534 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
535 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
536 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
537 int mSeparatorH; // Height of the separator between items
538 COLOR mSeparatorColor; // color of the separator that is between items
539
thata9998212015-02-19 22:51:24 +0100540 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100541 int mFastScrollW; // width of the fastscroll area
542 int mFastScrollLineW; // width of the line for fastscroll rendering
543 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100544 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100545 COLOR mFastScrollLineColor;
546 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100547
548 // Scrolling and dynamic state
549 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
550 int mFastScrollRectCurrentH; // current height of fastscroll rect
551 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100552 bool hasScroll; // indicates that we have enough items in the list to scroll
553 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
554 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
555 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 +0100556 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 +0100557 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
558 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
559 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
560 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
561 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500562 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 +0100563};
564
565class GUIFileSelector : public GUIScrollList
566{
567public:
568 GUIFileSelector(xml_node<>* node);
569 virtual ~GUIFileSelector();
570
571public:
572 // Update - Update any UI component animations (called <= 30 FPS)
573 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
574 virtual int Update(void);
575
576 // NotifyVarChange - Notify of a variable change
577 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
578
579 // SetPageFocus - Notify when a page gains or loses focus
580 virtual void SetPageFocus(int inFocus);
581
582 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100583 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100584 virtual void NotifySelect(size_t item_selected);
585
586protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200587 struct FileData {
588 std::string fileName;
589 unsigned char fileType; // Uses d_type format from struct dirent
590 mode_t protection; // Uses mode_t format from stat
591 uid_t userId;
592 gid_t groupId;
593 off_t fileSize;
594 time_t lastAccess; // Uses time_t format from stat
595 time_t lastModified; // Uses time_t format from stat
596 time_t lastStatChange; // Uses time_t format from stat
597 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400598
599protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200600 virtual int GetFileList(const std::string folder);
601 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400602
603protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200604 std::vector<FileData> mFolderList;
605 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100606 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600607 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100608 std::string mExtn; // used for filtering the file list, for example, *.zip
609 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
610 std::string mSortVariable; // data manager variable used to change the sorting of files
611 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
612 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
613 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)
614 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100615 ImageResource* mFolderIcon;
616 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600617 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400618};
619
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100620class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400621{
622public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200623 GUIListBox(xml_node<>* node);
624 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400625
626public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200627 // Update - Update any UI component animations (called <= 30 FPS)
628 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
629 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400630
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200631 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100632 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400633
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200634 // SetPageFocus - Notify when a page gains or loses focus
635 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400636
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100637 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100638 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100639 virtual void NotifySelect(size_t item_selected);
640
Dees_Troy51a0e822012-09-05 15:24:24 -0400641protected:
that8ab5c132015-09-13 23:00:54 +0200642 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200643 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500644 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400645 std::string variableValue;
646 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200647 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200648 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200649 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400650
651protected:
that8ab5c132015-09-13 23:00:54 +0200652 std::vector<ListItem> mListItems;
653 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200654 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400655 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100656 ImageResource* mIconSelected;
657 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500658 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600659 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400660};
661
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100662class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500663{
664public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200665 GUIPartitionList(xml_node<>* node);
666 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500667
668public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200669 // Update - Update any UI component animations (called <= 30 FPS)
670 // 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 +0100671 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500672
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200673 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100674 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500675
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200676 // SetPageFocus - Notify when a page gains or loses focus
677 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500678
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100679 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100680 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100681 virtual void NotifySelect(size_t item_selected);
682
Dees_Troya13d74f2013-03-24 08:54:55 -0500683protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100684 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600685 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500686
687protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200688 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500689 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200690 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500691 std::string selectedList;
692 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500693 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100694 ImageResource* mIconSelected;
695 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500696 bool updateList;
697};
698
Ethan Yonker44925ad2015-07-22 12:33:59 -0500699class GUITextBox : public GUIScrollList
700{
701public:
702 GUITextBox(xml_node<>* node);
703
704public:
705 // Update - Update any UI component animations (called <= 30 FPS)
706 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
707 virtual int Update(void);
708
709 // NotifyVarChange - Notify of a variable change
710 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
711
712 // ScrollList interface
713 virtual size_t GetItemCount();
714 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
715 virtual void NotifySelect(size_t item_selected);
716protected:
717
718 size_t mLastCount;
719 bool mIsStatic;
720 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
721 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
722 std::vector<std::string> rText; // Rendered text - what we actually see
723
724};
725
that8d46c092015-02-26 01:30:04 +0100726class GUIConsole : public GUIScrollList
727{
728public:
729 GUIConsole(xml_node<>* node);
730
731public:
732 // Render - Render the full object to the GL surface
733 // Return 0 on success, <0 on error
734 virtual int Render(void);
735
736 // Update - Update any UI component animations (called <= 30 FPS)
737 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
738 virtual int Update(void);
739
740 // IsInRegion - Checks if the request is handled by this object
741 // Return 1 if this object handles the request, 0 if not
742 virtual int IsInRegion(int x, int y);
743
744 // NotifyTouch - Notify of a touch event
745 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
746 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
747
748 // ScrollList interface
749 virtual size_t GetItemCount();
750 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
751 virtual void NotifySelect(size_t item_selected);
thata9dd9f02017-02-23 23:08:56 +0100752
Ethan Yonker74db1572015-10-28 12:44:49 -0500753 static void Translate_Now();
thata9dd9f02017-02-23 23:08:56 +0100754 static void Clear_For_Retranslation();
that8d46c092015-02-26 01:30:04 +0100755protected:
756 enum SlideoutState
757 {
758 hidden = 0,
759 visible,
760 request_hide,
761 request_show
762 };
763
764 ImageResource* mSlideoutImage;
765 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
766 bool scrollToEnd; // true if we want to keep tracking the last line
767 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
768 int mSlideout;
769 SlideoutState mSlideoutState;
770 std::vector<std::string> rConsole;
771 std::vector<std::string> rConsoleColor;
772
773protected:
that8d46c092015-02-26 01:30:04 +0100774 int RenderSlideout(void);
775 int RenderConsole(void);
776};
777
that1964d192016-01-07 00:41:03 +0100778class TerminalEngine;
779class GUITerminal : public GUIScrollList, public InputObject
780{
781public:
782 GUITerminal(xml_node<>* node);
783
784public:
785 // Update - Update any UI component animations (called <= 30 FPS)
786 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
787 virtual int Update(void);
788
789 // NotifyTouch - Notify of a touch event
790 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
791 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
792
793 // NotifyKey - Notify of a key press
794 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
795 virtual int NotifyKey(int key, bool down);
796
797 // character input
798 virtual int NotifyCharInput(int ch);
799
800 // SetPageFocus - Notify when a page gains or loses focus
801 virtual void SetPageFocus(int inFocus);
802
803 // ScrollList interface
804 virtual size_t GetItemCount();
805 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
806 virtual void NotifySelect(size_t item_selected);
807protected:
808 void InitAndResize();
809
810 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
811 int updateCounter; // to track if anything changed in the back-end
812 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
813};
814
Dees_Troy51a0e822012-09-05 15:24:24 -0400815// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100816class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400817{
818public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200819 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400820
821public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200822 // Render - Render the full object to the GL surface
823 // Return 0 on success, <0 on error
824 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400825
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200826 // Update - Update any UI component animations (called <= 30 FPS)
827 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
828 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400829
830protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200831 AnimationResource* mAnimation;
832 int mFrame;
833 int mFPS;
834 int mLoop;
835 int mRender;
836 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400837};
838
Vojtech Bocekede51c52014-02-07 23:58:09 +0100839class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400840{
841public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200842 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400843
844public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200845 // Render - Render the full object to the GL surface
846 // Return 0 on success, <0 on error
847 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400848
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200849 // Update - Update any UI component animations (called <= 30 FPS)
850 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
851 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400852
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200853 // NotifyVarChange - Notify of a variable change
854 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100855 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400856
857protected:
thatf6ed8fc2015-02-14 20:23:16 +0100858 ImageResource* mEmptyBar;
859 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200860 std::string mMinValVar;
861 std::string mMaxValVar;
862 std::string mCurValVar;
863 float mSlide;
864 float mSlideInc;
865 int mSlideFrames;
866 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400867
868protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200869 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400870};
871
Vojtech Bocekede51c52014-02-07 23:58:09 +0100872class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400873{
874public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200875 GUISlider(xml_node<>* node);
876 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400877
878public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200879 // Render - Render the full object to the GL surface
880 // Return 0 on success, <0 on error
881 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400882
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200883 // Update - Update any UI component animations (called <= 30 FPS)
884 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
885 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400886
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200887 // NotifyTouch - Notify of a touch event
888 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
889 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400890
891protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200892 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600893 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100894 ImageResource* sSlider;
895 ImageResource* sSliderUsed;
896 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200897 int sTouchW, sTouchH;
898 int sCurTouchX;
899 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400900};
901
that8834a0f2016-01-05 23:29:30 +0100902// these are ASCII codes reported via NotifyCharInput
903// other special keys (arrows etc.) are reported via NotifyKey
904#define KEYBOARD_ACTION 13 // CR
905#define KEYBOARD_BACKSPACE 8 // Backspace
906#define KEYBOARD_TAB 9 // Tab
907#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
908#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400909
Vojtech Bocekede51c52014-02-07 23:58:09 +0100910class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400911{
912public:
913 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200914 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400915
916public:
917 virtual int Render(void);
918 virtual int Update(void);
919 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
920 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100921 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400922
923protected:
thate79878b2015-03-14 23:07:23 +0100924 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200925 {
that8834a0f2016-01-05 23:29:30 +0100926 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
927 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100928 int end_x;
929 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200930 };
thate79878b2015-03-14 23:07:23 +0100931 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200932 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200933 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100934 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100935
936 enum {
937 MAX_KEYBOARD_LAYOUTS = 5,
938 MAX_KEYBOARD_ROWS = 9,
939 MAX_KEYBOARD_KEYS = 20
940 };
941 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600942 {
thatd86f49d2015-03-15 00:56:57 +0100943 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100944 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100945 int row_end_y[MAX_KEYBOARD_ROWS];
946 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600947 int revert_layout;
948 };
thatd86f49d2015-03-15 00:56:57 +0100949 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400950
thatf256b722015-05-23 20:44:12 +0200951 struct KeyLabel
952 {
that8834a0f2016-01-05 23:29:30 +0100953 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200954 int layout_from; // 1-based; 0 for labels that apply to all layouts
955 int layout_to; // same as Key.layout
956 string text; // key label text
957 ImageResource* image; // image (overrides text if defined)
958 };
959 std::vector<KeyLabel> mKeyLabels;
960
thate79878b2015-03-14 23:07:23 +0100961 // Find key at screen coordinates
962 Key* HitTestKey(int x, int y);
963
Dees_Troy51a0e822012-09-05 15:24:24 -0400964 bool mRendered;
965 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100966 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100967 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100968 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 +0200969 int highlightRenderCount;
970 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100971 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400972 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600973 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100974 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200975 COLOR mFontColor; // for centered key labels
976 COLOR mFontColorSmall; // for centered key labels
977 FontResource* mFont; // for main key labels
978 FontResource* mSmallFont; // for key labels like "?123"
979 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200980 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200981 COLOR mLongpressFontColor;
982 COLOR mBackgroundColor; // keyboard background color
983 COLOR mKeyColorAlphanumeric; // key background color
984 COLOR mKeyColorOther; // key background color
985 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400986};
987
988// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100989class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400990{
991public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200992 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400993 virtual ~GUIInput();
994
995public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200996 // Render - Render the full object to the GL surface
997 // Return 0 on success, <0 on error
998 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400999
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001000 // Update - Update any UI component animations (called <= 30 FPS)
1001 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1002 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001003
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001004 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001005 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001006
1007 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001008 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1009 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001010
that8834a0f2016-01-05 23:29:30 +01001011 virtual int NotifyKey(int key, bool down);
1012 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001013
1014protected:
1015 virtual int GetSelection(int x, int y);
1016
1017 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001018 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001019 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001020 void HandleCursorByTouch(int x);
1021 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001022
1023protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001024 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001025 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001026 ImageResource* mBackground;
1027 ImageResource* mCursor;
1028 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001029 std::string mVariable;
1030 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001031 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001032 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001033 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001034 COLOR mCursorColor;
1035 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001036 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001037 int lastX;
1038 int mCursorLocation;
1039 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1040 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001041 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001042 unsigned mFontHeight;
1043 unsigned CursorWidth;
1044 bool mRendered;
1045 bool HasMask;
1046 bool DrawCursor;
1047 bool isLocalChange;
1048 bool HasAllowed;
1049 bool HasDisabled;
1050 std::string AllowedList;
1051 std::string DisabledList;
1052 unsigned MinLen;
1053 unsigned MaxLen;
1054};
1055
1056class HardwareKeyboard
1057{
1058public:
thatf37aec22015-02-01 13:38:35 +01001059 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001060 virtual ~HardwareKeyboard();
1061
1062public:
thatf37aec22015-02-01 13:38:35 +01001063 // called by the input handler for key events
1064 int KeyDown(int key_code);
1065 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001066
thatf37aec22015-02-01 13:38:35 +01001067 // called by the input handler when holding a key down
1068 int KeyRepeat();
1069
1070 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001071 void ConsumeKeyRelease(int key);
1072
that8834a0f2016-01-05 23:29:30 +01001073 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001074private:
that8834a0f2016-01-05 23:29:30 +01001075 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001076 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001077 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001078};
1079
Vojtech Bocekede51c52014-02-07 23:58:09 +01001080class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001081{
1082public:
1083 GUISliderValue(xml_node<>* node);
1084 virtual ~GUISliderValue();
1085
1086public:
1087 // Render - Render the full object to the GL surface
1088 // Return 0 on success, <0 on error
1089 virtual int Render(void);
1090
1091 // Update - Update any UI component animations (called <= 30 FPS)
1092 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1093 virtual int Update(void);
1094
1095 // SetPos - Update the position of the render object
1096 // Return 0 on success, <0 on error
1097 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1098
1099 // NotifyTouch - Notify of a touch event
1100 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1101 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1102
1103 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001104 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001105
1106 // SetPageFocus - Notify when a page gains or loses focus
1107 virtual void SetPageFocus(int inFocus);
1108
1109protected:
1110 int measureText(const std::string& str);
1111 int valueFromPct(float pct);
1112 float pctFromValue(int value);
1113 void loadValue(bool force = false);
1114
1115 std::string mVariable;
1116 int mMax;
1117 int mMin;
1118 int mValue;
1119 char *mValueStr;
1120 float mValuePct;
1121 std::string mMaxStr;
1122 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001123 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001124 GUIText* mLabel;
1125 int mLabelW;
1126 COLOR mTextColor;
1127 COLOR mLineColor;
1128 COLOR mSliderColor;
1129 bool mShowRange;
1130 bool mShowCurr;
1131 int mLineX;
1132 int mLineY;
1133 int mLineH;
1134 int mLinePadding;
1135 int mPadding;
1136 int mSliderY;
1137 int mSliderW;
1138 int mSliderH;
1139 bool mRendered;
1140 int mFontHeight;
1141 GUIAction *mAction;
1142 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001143 int mLineW;
1144 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001145 ImageResource *mBackgroundImage;
1146 ImageResource *mHandleImage;
1147 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001148};
1149
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001150class MouseCursor : public RenderObject
1151{
1152public:
1153 MouseCursor(int posX, int posY);
1154 virtual ~MouseCursor();
1155
1156 virtual int Render(void);
1157 virtual int Update(void);
1158 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1159
1160 void Move(int deltaX, int deltaY);
1161 void GetPos(int& x, int& y);
1162 void LoadData(xml_node<>* node);
1163 void ResetData(int resX, int resY);
1164
1165private:
1166 int m_resX;
1167 int m_resY;
1168 bool m_moved;
1169 float m_speedMultiplier;
1170 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001171 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001172 bool m_present;
1173};
1174
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001175class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1176{
1177public:
1178 GUIPatternPassword(xml_node<>* node);
1179 virtual ~GUIPatternPassword();
1180
1181public:
1182 virtual int Render(void);
1183 virtual int Update(void);
1184 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001185 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001186 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1187
1188protected:
1189 void CalculateDotPositions();
1190 void ResetActiveDots();
1191 void ConnectDot(int dot_idx);
1192 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001193 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001194 int InDot(int x, int y);
1195 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001196 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001197 void PatternDrawn();
1198
1199 struct Dot {
1200 int x;
1201 int y;
1202 bool active;
1203 };
1204
Aleksa Saraib25a1832015-12-31 17:36:00 +01001205 std::string mSizeVar;
1206 size_t mGridSize;
1207
1208 Dot* mDots;
1209 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001210 size_t mConnectedDotsLen;
1211 int mCurLineX;
1212 int mCurLineY;
1213 bool mTrackingTouch;
1214 bool mNeedRender;
1215
1216 COLOR mDotColor;
1217 COLOR mActiveDotColor;
1218 COLOR mLineColor;
1219 ImageResource *mDotImage;
1220 ImageResource *mActiveDotImage;
1221 gr_surface mDotCircle;
1222 gr_surface mActiveDotCircle;
1223 int mDotRadius;
1224 int mLineWidth;
1225
1226 std::string mPassVar;
1227 GUIAction *mAction;
1228 int mUpdate;
1229};
1230
1231
Dees_Troy51a0e822012-09-05 15:24:24 -04001232// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001233xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001234std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1235int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1236int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1237int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001238COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001239COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1240FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1241ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1242AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001243bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001244
1245#endif // _OBJECTS_HEADER