blob: 630cf7102cfcd3cd50cc3fdbb158001e3fa98d2f [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);
that3f7b1ac2014-12-30 11:30:13 +0100370
371 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400372};
373
Vojtech Bocekede51c52014-02-07 23:58:09 +0100374class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400375{
376public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200377 GUIButton(xml_node<>* node);
378 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400379
380public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200381 // Render - Render the full object to the GL surface
382 // Return 0 on success, <0 on error
383 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400384
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200385 // Update - Update any UI component animations (called <= 30 FPS)
386 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
387 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400388
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200389 // SetPos - Update the position of the render object
390 // Return 0 on success, <0 on error
391 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400392
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200393 // NotifyTouch - Notify of a touch event
394 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
395 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400396
397protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200398 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100399 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200400 GUIText* mButtonLabel;
401 GUIAction* mAction;
402 int mTextX, mTextY, mTextW, mTextH;
403 int mIconX, mIconY, mIconW, mIconH;
404 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600405 bool hasHighlightColor;
406 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500407 bool hasFill;
408 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600409 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000410 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400411};
412
Vojtech Bocekede51c52014-02-07 23:58:09 +0100413class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400414{
415public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200416 GUICheckbox(xml_node<>* node);
417 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400418
419public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200420 // Render - Render the full object to the GL surface
421 // Return 0 on success, <0 on error
422 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400423
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200424 // Update - Update any UI component animations (called <= 30 FPS)
425 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
426 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400427
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200428 // SetPos - Update the position of the render object
429 // Return 0 on success, <0 on error
430 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400431
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200432 // NotifyTouch - Notify of a touch event
433 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
434 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400435
436protected:
thatf6ed8fc2015-02-14 20:23:16 +0100437 ImageResource* mChecked;
438 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200439 GUIText* mLabel;
440 int mTextX, mTextY;
441 int mCheckX, mCheckY, mCheckW, mCheckH;
442 int mLastState;
443 bool mRendered;
444 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400445};
446
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100447class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400448{
449public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100450 GUIScrollList(xml_node<>* node);
451 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400452
453public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200454 // Render - Render the full object to the GL surface
455 // Return 0 on success, <0 on error
456 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400457
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200458 // Update - Update any UI component animations (called <= 30 FPS)
459 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
460 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400461
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200462 // NotifyTouch - Notify of a touch event
463 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
464 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400465
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200466 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100467 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400468
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200469 // SetPos - Update the position of the render object
470 // Return 0 on success, <0 on error
471 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400472
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200473 // SetPageFocus - Notify when a page gains or loses focus
474 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400475
476protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100477 // derived classes need to implement these
478 // get number of items
479 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100480 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
481 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100482 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500483 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100484
that0af77952015-02-25 08:52:19 +0100485 // render a standard-layout list item with optional icon and text
486 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
487
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100488 enum { NO_ITEM = (size_t)-1 };
489 // returns item index at coordinates or NO_ITEM if there is no item there
490 size_t HitTestItem(int x, int y);
491
492 // 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
493 void SetMaxIconSize(int w, int h);
494
495 // This will make sure that the item indicated by list_index is visible on the screen
496 void SetVisibleListLocation(size_t list_index);
497
498 // Handle scrolling changes for drags and kinetic scrolling
499 void HandleScrolling();
500
that9876ac32015-02-15 21:40:59 +0100501 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100502 int GetDisplayItemCount();
503
504 // Returns the size in pixels of a partial item or row size
505 int GetDisplayRemainder();
506
507protected:
508 // Background
509 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100510 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100511
512 // Header
513 COLOR mHeaderBackgroundColor;
514 COLOR mHeaderFontColor;
515 std::string mHeaderText; // Original header text without parsing any variables
516 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100517 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100518 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100519 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100520 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
521 int mHeaderSeparatorH; // Height of the separator between header and list items
522 COLOR mHeaderSeparatorColor; // color of the header separator
523
524 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100525 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100526 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100527 bool hasHighlightColor; // indicates if a highlight color was set
528 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100529 COLOR mFontHighlightColor;
530 int mFontHeight;
531 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
532 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
533 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
534 int mSeparatorH; // Height of the separator between items
535 COLOR mSeparatorColor; // color of the separator that is between items
536
thata9998212015-02-19 22:51:24 +0100537 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100538 int mFastScrollW; // width of the fastscroll area
539 int mFastScrollLineW; // width of the line for fastscroll rendering
540 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100541 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100542 COLOR mFastScrollLineColor;
543 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100544
545 // Scrolling and dynamic state
546 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
547 int mFastScrollRectCurrentH; // current height of fastscroll rect
548 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100549 bool hasScroll; // indicates that we have enough items in the list to scroll
550 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
551 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
552 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 +0100553 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 +0100554 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
555 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
556 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
557 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
558 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500559 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 +0100560};
561
562class GUIFileSelector : public GUIScrollList
563{
564public:
565 GUIFileSelector(xml_node<>* node);
566 virtual ~GUIFileSelector();
567
568public:
569 // Update - Update any UI component animations (called <= 30 FPS)
570 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
571 virtual int Update(void);
572
573 // NotifyVarChange - Notify of a variable change
574 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
575
576 // SetPageFocus - Notify when a page gains or loses focus
577 virtual void SetPageFocus(int inFocus);
578
579 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100580 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100581 virtual void NotifySelect(size_t item_selected);
582
583protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200584 struct FileData {
585 std::string fileName;
586 unsigned char fileType; // Uses d_type format from struct dirent
587 mode_t protection; // Uses mode_t format from stat
588 uid_t userId;
589 gid_t groupId;
590 off_t fileSize;
591 time_t lastAccess; // Uses time_t format from stat
592 time_t lastModified; // Uses time_t format from stat
593 time_t lastStatChange; // Uses time_t format from stat
594 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400595
596protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200597 virtual int GetFileList(const std::string folder);
598 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400599
600protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200601 std::vector<FileData> mFolderList;
602 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100603 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600604 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100605 std::string mExtn; // used for filtering the file list, for example, *.zip
606 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
607 std::string mSortVariable; // data manager variable used to change the sorting of files
608 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
609 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
610 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)
611 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100612 ImageResource* mFolderIcon;
613 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600614 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400615};
616
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100617class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400618{
619public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200620 GUIListBox(xml_node<>* node);
621 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400622
623public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200624 // Update - Update any UI component animations (called <= 30 FPS)
625 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
626 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400627
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200628 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100629 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400630
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200631 // SetPageFocus - Notify when a page gains or loses focus
632 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400633
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100634 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100635 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100636 virtual void NotifySelect(size_t item_selected);
637
Dees_Troy51a0e822012-09-05 15:24:24 -0400638protected:
that8ab5c132015-09-13 23:00:54 +0200639 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200640 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500641 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400642 std::string variableValue;
643 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200644 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200645 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200646 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400647
648protected:
that8ab5c132015-09-13 23:00:54 +0200649 std::vector<ListItem> mListItems;
650 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200651 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400652 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100653 ImageResource* mIconSelected;
654 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500655 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600656 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400657};
658
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100659class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500660{
661public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200662 GUIPartitionList(xml_node<>* node);
663 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500664
665public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200666 // Update - Update any UI component animations (called <= 30 FPS)
667 // 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 +0100668 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500669
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200670 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100671 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500672
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200673 // SetPageFocus - Notify when a page gains or loses focus
674 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500675
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100676 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100677 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100678 virtual void NotifySelect(size_t item_selected);
679
Dees_Troya13d74f2013-03-24 08:54:55 -0500680protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100681 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600682 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500683
684protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200685 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500686 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200687 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500688 std::string selectedList;
689 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500690 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100691 ImageResource* mIconSelected;
692 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500693 bool updateList;
694};
695
Ethan Yonker44925ad2015-07-22 12:33:59 -0500696class GUITextBox : public GUIScrollList
697{
698public:
699 GUITextBox(xml_node<>* node);
700
701public:
702 // Update - Update any UI component animations (called <= 30 FPS)
703 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
704 virtual int Update(void);
705
706 // NotifyVarChange - Notify of a variable change
707 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
708
709 // ScrollList interface
710 virtual size_t GetItemCount();
711 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
712 virtual void NotifySelect(size_t item_selected);
713protected:
714
715 size_t mLastCount;
716 bool mIsStatic;
717 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
718 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
719 std::vector<std::string> rText; // Rendered text - what we actually see
720
721};
722
that8d46c092015-02-26 01:30:04 +0100723class GUIConsole : public GUIScrollList
724{
725public:
726 GUIConsole(xml_node<>* node);
727
728public:
729 // Render - Render the full object to the GL surface
730 // Return 0 on success, <0 on error
731 virtual int Render(void);
732
733 // Update - Update any UI component animations (called <= 30 FPS)
734 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
735 virtual int Update(void);
736
737 // IsInRegion - Checks if the request is handled by this object
738 // Return 1 if this object handles the request, 0 if not
739 virtual int IsInRegion(int x, int y);
740
741 // NotifyTouch - Notify of a touch event
742 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
743 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
744
745 // ScrollList interface
746 virtual size_t GetItemCount();
747 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
748 virtual void NotifySelect(size_t item_selected);
thata9dd9f02017-02-23 23:08:56 +0100749
Ethan Yonker74db1572015-10-28 12:44:49 -0500750 static void Translate_Now();
thata9dd9f02017-02-23 23:08:56 +0100751 static void Clear_For_Retranslation();
that8d46c092015-02-26 01:30:04 +0100752protected:
753 enum SlideoutState
754 {
755 hidden = 0,
756 visible,
757 request_hide,
758 request_show
759 };
760
761 ImageResource* mSlideoutImage;
762 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
763 bool scrollToEnd; // true if we want to keep tracking the last line
764 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
765 int mSlideout;
766 SlideoutState mSlideoutState;
767 std::vector<std::string> rConsole;
768 std::vector<std::string> rConsoleColor;
769
770protected:
that8d46c092015-02-26 01:30:04 +0100771 int RenderSlideout(void);
772 int RenderConsole(void);
773};
774
that1964d192016-01-07 00:41:03 +0100775class TerminalEngine;
776class GUITerminal : public GUIScrollList, public InputObject
777{
778public:
779 GUITerminal(xml_node<>* node);
780
781public:
782 // Update - Update any UI component animations (called <= 30 FPS)
783 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
784 virtual int Update(void);
785
786 // NotifyTouch - Notify of a touch event
787 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
788 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
789
790 // NotifyKey - Notify of a key press
791 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
792 virtual int NotifyKey(int key, bool down);
793
794 // character input
795 virtual int NotifyCharInput(int ch);
796
797 // SetPageFocus - Notify when a page gains or loses focus
798 virtual void SetPageFocus(int inFocus);
799
800 // ScrollList interface
801 virtual size_t GetItemCount();
802 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
803 virtual void NotifySelect(size_t item_selected);
804protected:
805 void InitAndResize();
806
807 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
808 int updateCounter; // to track if anything changed in the back-end
809 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
810};
811
Dees_Troy51a0e822012-09-05 15:24:24 -0400812// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100813class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400814{
815public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200816 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400817
818public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200819 // Render - Render the full object to the GL surface
820 // Return 0 on success, <0 on error
821 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400822
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200823 // Update - Update any UI component animations (called <= 30 FPS)
824 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
825 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400826
827protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200828 AnimationResource* mAnimation;
829 int mFrame;
830 int mFPS;
831 int mLoop;
832 int mRender;
833 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400834};
835
Vojtech Bocekede51c52014-02-07 23:58:09 +0100836class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400837{
838public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200839 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400840
841public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200842 // Render - Render the full object to the GL surface
843 // Return 0 on success, <0 on error
844 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400845
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200846 // Update - Update any UI component animations (called <= 30 FPS)
847 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
848 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400849
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200850 // NotifyVarChange - Notify of a variable change
851 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100852 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400853
854protected:
thatf6ed8fc2015-02-14 20:23:16 +0100855 ImageResource* mEmptyBar;
856 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200857 std::string mMinValVar;
858 std::string mMaxValVar;
859 std::string mCurValVar;
860 float mSlide;
861 float mSlideInc;
862 int mSlideFrames;
863 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400864
865protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200866 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400867};
868
Vojtech Bocekede51c52014-02-07 23:58:09 +0100869class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400870{
871public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200872 GUISlider(xml_node<>* node);
873 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400874
875public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200876 // Render - Render the full object to the GL surface
877 // Return 0 on success, <0 on error
878 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400879
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200880 // Update - Update any UI component animations (called <= 30 FPS)
881 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
882 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400883
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200884 // NotifyTouch - Notify of a touch event
885 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
886 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400887
888protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200889 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600890 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100891 ImageResource* sSlider;
892 ImageResource* sSliderUsed;
893 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200894 int sTouchW, sTouchH;
895 int sCurTouchX;
896 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400897};
898
that8834a0f2016-01-05 23:29:30 +0100899// these are ASCII codes reported via NotifyCharInput
900// other special keys (arrows etc.) are reported via NotifyKey
901#define KEYBOARD_ACTION 13 // CR
902#define KEYBOARD_BACKSPACE 8 // Backspace
903#define KEYBOARD_TAB 9 // Tab
904#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
905#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400906
Vojtech Bocekede51c52014-02-07 23:58:09 +0100907class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400908{
909public:
910 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200911 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400912
913public:
914 virtual int Render(void);
915 virtual int Update(void);
916 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
917 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100918 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400919
920protected:
thate79878b2015-03-14 23:07:23 +0100921 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200922 {
that8834a0f2016-01-05 23:29:30 +0100923 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
924 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100925 int end_x;
926 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200927 };
thate79878b2015-03-14 23:07:23 +0100928 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200929 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200930 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100931 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100932
933 enum {
934 MAX_KEYBOARD_LAYOUTS = 5,
935 MAX_KEYBOARD_ROWS = 9,
936 MAX_KEYBOARD_KEYS = 20
937 };
938 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600939 {
thatd86f49d2015-03-15 00:56:57 +0100940 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100941 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100942 int row_end_y[MAX_KEYBOARD_ROWS];
943 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600944 int revert_layout;
945 };
thatd86f49d2015-03-15 00:56:57 +0100946 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400947
thatf256b722015-05-23 20:44:12 +0200948 struct KeyLabel
949 {
that8834a0f2016-01-05 23:29:30 +0100950 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200951 int layout_from; // 1-based; 0 for labels that apply to all layouts
952 int layout_to; // same as Key.layout
953 string text; // key label text
954 ImageResource* image; // image (overrides text if defined)
955 };
956 std::vector<KeyLabel> mKeyLabels;
957
thate79878b2015-03-14 23:07:23 +0100958 // Find key at screen coordinates
959 Key* HitTestKey(int x, int y);
960
Dees_Troy51a0e822012-09-05 15:24:24 -0400961 bool mRendered;
962 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100963 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100964 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100965 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 +0200966 int highlightRenderCount;
967 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100968 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400969 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600970 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100971 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200972 COLOR mFontColor; // for centered key labels
973 COLOR mFontColorSmall; // for centered key labels
974 FontResource* mFont; // for main key labels
975 FontResource* mSmallFont; // for key labels like "?123"
976 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200977 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200978 COLOR mLongpressFontColor;
979 COLOR mBackgroundColor; // keyboard background color
980 COLOR mKeyColorAlphanumeric; // key background color
981 COLOR mKeyColorOther; // key background color
982 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400983};
984
985// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100986class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400987{
988public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200989 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400990 virtual ~GUIInput();
991
992public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200993 // Render - Render the full object to the GL surface
994 // Return 0 on success, <0 on error
995 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400996
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200997 // Update - Update any UI component animations (called <= 30 FPS)
998 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
999 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -04001000
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001001 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001002 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001003
1004 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001005 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1006 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001007
that8834a0f2016-01-05 23:29:30 +01001008 virtual int NotifyKey(int key, bool down);
1009 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001010
1011protected:
1012 virtual int GetSelection(int x, int y);
1013
1014 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001015 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001016 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001017 void HandleCursorByTouch(int x);
1018 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001019
1020protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001021 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001022 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001023 ImageResource* mBackground;
1024 ImageResource* mCursor;
1025 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001026 std::string mVariable;
1027 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001028 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001029 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001030 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001031 COLOR mCursorColor;
1032 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001033 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001034 int lastX;
1035 int mCursorLocation;
1036 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1037 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001038 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001039 unsigned mFontHeight;
1040 unsigned CursorWidth;
1041 bool mRendered;
1042 bool HasMask;
1043 bool DrawCursor;
1044 bool isLocalChange;
1045 bool HasAllowed;
1046 bool HasDisabled;
1047 std::string AllowedList;
1048 std::string DisabledList;
1049 unsigned MinLen;
1050 unsigned MaxLen;
1051};
1052
1053class HardwareKeyboard
1054{
1055public:
thatf37aec22015-02-01 13:38:35 +01001056 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001057 virtual ~HardwareKeyboard();
1058
1059public:
thatf37aec22015-02-01 13:38:35 +01001060 // called by the input handler for key events
1061 int KeyDown(int key_code);
1062 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001063
thatf37aec22015-02-01 13:38:35 +01001064 // called by the input handler when holding a key down
1065 int KeyRepeat();
1066
1067 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001068 void ConsumeKeyRelease(int key);
1069
that8834a0f2016-01-05 23:29:30 +01001070 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001071private:
that8834a0f2016-01-05 23:29:30 +01001072 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001073 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001074 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001075};
1076
Vojtech Bocekede51c52014-02-07 23:58:09 +01001077class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001078{
1079public:
1080 GUISliderValue(xml_node<>* node);
1081 virtual ~GUISliderValue();
1082
1083public:
1084 // Render - Render the full object to the GL surface
1085 // Return 0 on success, <0 on error
1086 virtual int Render(void);
1087
1088 // Update - Update any UI component animations (called <= 30 FPS)
1089 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1090 virtual int Update(void);
1091
1092 // SetPos - Update the position of the render object
1093 // Return 0 on success, <0 on error
1094 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1095
1096 // NotifyTouch - Notify of a touch event
1097 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1098 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1099
1100 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001101 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001102
1103 // SetPageFocus - Notify when a page gains or loses focus
1104 virtual void SetPageFocus(int inFocus);
1105
1106protected:
1107 int measureText(const std::string& str);
1108 int valueFromPct(float pct);
1109 float pctFromValue(int value);
1110 void loadValue(bool force = false);
1111
1112 std::string mVariable;
1113 int mMax;
1114 int mMin;
1115 int mValue;
1116 char *mValueStr;
1117 float mValuePct;
1118 std::string mMaxStr;
1119 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001120 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001121 GUIText* mLabel;
1122 int mLabelW;
1123 COLOR mTextColor;
1124 COLOR mLineColor;
1125 COLOR mSliderColor;
1126 bool mShowRange;
1127 bool mShowCurr;
1128 int mLineX;
1129 int mLineY;
1130 int mLineH;
1131 int mLinePadding;
1132 int mPadding;
1133 int mSliderY;
1134 int mSliderW;
1135 int mSliderH;
1136 bool mRendered;
1137 int mFontHeight;
1138 GUIAction *mAction;
1139 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001140 int mLineW;
1141 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001142 ImageResource *mBackgroundImage;
1143 ImageResource *mHandleImage;
1144 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001145};
1146
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001147class MouseCursor : public RenderObject
1148{
1149public:
1150 MouseCursor(int posX, int posY);
1151 virtual ~MouseCursor();
1152
1153 virtual int Render(void);
1154 virtual int Update(void);
1155 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1156
1157 void Move(int deltaX, int deltaY);
1158 void GetPos(int& x, int& y);
1159 void LoadData(xml_node<>* node);
1160 void ResetData(int resX, int resY);
1161
1162private:
1163 int m_resX;
1164 int m_resY;
1165 bool m_moved;
1166 float m_speedMultiplier;
1167 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001168 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001169 bool m_present;
1170};
1171
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001172class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1173{
1174public:
1175 GUIPatternPassword(xml_node<>* node);
1176 virtual ~GUIPatternPassword();
1177
1178public:
1179 virtual int Render(void);
1180 virtual int Update(void);
1181 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001182 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001183 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1184
1185protected:
1186 void CalculateDotPositions();
1187 void ResetActiveDots();
1188 void ConnectDot(int dot_idx);
1189 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001190 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001191 int InDot(int x, int y);
1192 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001193 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001194 void PatternDrawn();
1195
1196 struct Dot {
1197 int x;
1198 int y;
1199 bool active;
1200 };
1201
Aleksa Saraib25a1832015-12-31 17:36:00 +01001202 std::string mSizeVar;
1203 size_t mGridSize;
1204
1205 Dot* mDots;
1206 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001207 size_t mConnectedDotsLen;
1208 int mCurLineX;
1209 int mCurLineY;
1210 bool mTrackingTouch;
1211 bool mNeedRender;
1212
1213 COLOR mDotColor;
1214 COLOR mActiveDotColor;
1215 COLOR mLineColor;
1216 ImageResource *mDotImage;
1217 ImageResource *mActiveDotImage;
1218 gr_surface mDotCircle;
1219 gr_surface mActiveDotCircle;
1220 int mDotRadius;
1221 int mLineWidth;
1222
1223 std::string mPassVar;
1224 GUIAction *mAction;
1225 int mUpdate;
1226};
1227
1228
Dees_Troy51a0e822012-09-05 15:24:24 -04001229// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001230xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001231std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1232int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1233int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1234int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001235COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001236COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1237FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1238ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1239AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001240bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001241
1242#endif // _OBJECTS_HEADER