blob: 7506277291d96e2dc4b432eeddbcf509010c69af [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);
that10ae24f2015-12-26 20:53:51 +0100366 int twcmd(std::string arg);
Ethan Yonker1b190162016-12-05 15:25:19 -0600367 int setbootslot(std::string arg);
Ethan Yonkerb4bff5e2016-12-16 07:47:58 -0600368 int installapp(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100369
370 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400371};
372
Vojtech Bocekede51c52014-02-07 23:58:09 +0100373class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400374{
375public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200376 GUIButton(xml_node<>* node);
377 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400378
379public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200380 // Render - Render the full object to the GL surface
381 // Return 0 on success, <0 on error
382 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400383
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200384 // Update - Update any UI component animations (called <= 30 FPS)
385 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
386 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400387
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200388 // SetPos - Update the position of the render object
389 // Return 0 on success, <0 on error
390 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400391
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200392 // NotifyTouch - Notify of a touch event
393 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
394 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400395
396protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200397 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100398 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200399 GUIText* mButtonLabel;
400 GUIAction* mAction;
401 int mTextX, mTextY, mTextW, mTextH;
402 int mIconX, mIconY, mIconW, mIconH;
403 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600404 bool hasHighlightColor;
405 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500406 bool hasFill;
407 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600408 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000409 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400410};
411
Vojtech Bocekede51c52014-02-07 23:58:09 +0100412class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400413{
414public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200415 GUICheckbox(xml_node<>* node);
416 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400417
418public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200419 // Render - Render the full object to the GL surface
420 // Return 0 on success, <0 on error
421 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400422
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200423 // Update - Update any UI component animations (called <= 30 FPS)
424 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
425 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400426
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200427 // SetPos - Update the position of the render object
428 // Return 0 on success, <0 on error
429 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400430
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200431 // NotifyTouch - Notify of a touch event
432 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
433 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400434
435protected:
thatf6ed8fc2015-02-14 20:23:16 +0100436 ImageResource* mChecked;
437 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200438 GUIText* mLabel;
439 int mTextX, mTextY;
440 int mCheckX, mCheckY, mCheckW, mCheckH;
441 int mLastState;
442 bool mRendered;
443 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400444};
445
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100446class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400447{
448public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100449 GUIScrollList(xml_node<>* node);
450 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400451
452public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200453 // Render - Render the full object to the GL surface
454 // Return 0 on success, <0 on error
455 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400456
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200457 // Update - Update any UI component animations (called <= 30 FPS)
458 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
459 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400460
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200461 // NotifyTouch - Notify of a touch event
462 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
463 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400464
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200465 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100466 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400467
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200468 // SetPos - Update the position of the render object
469 // Return 0 on success, <0 on error
470 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400471
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200472 // SetPageFocus - Notify when a page gains or loses focus
473 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400474
475protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100476 // derived classes need to implement these
477 // get number of items
478 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100479 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
480 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100481 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500482 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100483
that0af77952015-02-25 08:52:19 +0100484 // render a standard-layout list item with optional icon and text
485 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
486
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100487 enum { NO_ITEM = (size_t)-1 };
488 // returns item index at coordinates or NO_ITEM if there is no item there
489 size_t HitTestItem(int x, int y);
490
491 // 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
492 void SetMaxIconSize(int w, int h);
493
494 // This will make sure that the item indicated by list_index is visible on the screen
495 void SetVisibleListLocation(size_t list_index);
496
497 // Handle scrolling changes for drags and kinetic scrolling
498 void HandleScrolling();
499
that9876ac32015-02-15 21:40:59 +0100500 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100501 int GetDisplayItemCount();
502
503 // Returns the size in pixels of a partial item or row size
504 int GetDisplayRemainder();
505
506protected:
507 // Background
508 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100509 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100510
511 // Header
512 COLOR mHeaderBackgroundColor;
513 COLOR mHeaderFontColor;
514 std::string mHeaderText; // Original header text without parsing any variables
515 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100516 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100517 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100518 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100519 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
520 int mHeaderSeparatorH; // Height of the separator between header and list items
521 COLOR mHeaderSeparatorColor; // color of the header separator
522
523 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100524 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100525 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100526 bool hasHighlightColor; // indicates if a highlight color was set
527 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100528 COLOR mFontHighlightColor;
529 int mFontHeight;
530 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
531 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
532 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
533 int mSeparatorH; // Height of the separator between items
534 COLOR mSeparatorColor; // color of the separator that is between items
535
thata9998212015-02-19 22:51:24 +0100536 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100537 int mFastScrollW; // width of the fastscroll area
538 int mFastScrollLineW; // width of the line for fastscroll rendering
539 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100540 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100541 COLOR mFastScrollLineColor;
542 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100543
544 // Scrolling and dynamic state
545 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
546 int mFastScrollRectCurrentH; // current height of fastscroll rect
547 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100548 bool hasScroll; // indicates that we have enough items in the list to scroll
549 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
550 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
551 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 +0100552 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 +0100553 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
554 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
555 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
556 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
557 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500558 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 +0100559};
560
561class GUIFileSelector : public GUIScrollList
562{
563public:
564 GUIFileSelector(xml_node<>* node);
565 virtual ~GUIFileSelector();
566
567public:
568 // Update - Update any UI component animations (called <= 30 FPS)
569 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
570 virtual int Update(void);
571
572 // NotifyVarChange - Notify of a variable change
573 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
574
575 // SetPageFocus - Notify when a page gains or loses focus
576 virtual void SetPageFocus(int inFocus);
577
578 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100579 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100580 virtual void NotifySelect(size_t item_selected);
581
582protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200583 struct FileData {
584 std::string fileName;
585 unsigned char fileType; // Uses d_type format from struct dirent
586 mode_t protection; // Uses mode_t format from stat
587 uid_t userId;
588 gid_t groupId;
589 off_t fileSize;
590 time_t lastAccess; // Uses time_t format from stat
591 time_t lastModified; // Uses time_t format from stat
592 time_t lastStatChange; // Uses time_t format from stat
593 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400594
595protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200596 virtual int GetFileList(const std::string folder);
597 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400598
599protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200600 std::vector<FileData> mFolderList;
601 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100602 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600603 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100604 std::string mExtn; // used for filtering the file list, for example, *.zip
605 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
606 std::string mSortVariable; // data manager variable used to change the sorting of files
607 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
608 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
609 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)
610 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100611 ImageResource* mFolderIcon;
612 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600613 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400614};
615
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100616class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400617{
618public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200619 GUIListBox(xml_node<>* node);
620 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400621
622public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200623 // Update - Update any UI component animations (called <= 30 FPS)
624 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
625 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400626
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200627 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100628 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400629
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200630 // SetPageFocus - Notify when a page gains or loses focus
631 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400632
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100633 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100634 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100635 virtual void NotifySelect(size_t item_selected);
636
Dees_Troy51a0e822012-09-05 15:24:24 -0400637protected:
that8ab5c132015-09-13 23:00:54 +0200638 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200639 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500640 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400641 std::string variableValue;
642 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200643 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200644 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200645 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400646
647protected:
that8ab5c132015-09-13 23:00:54 +0200648 std::vector<ListItem> mListItems;
649 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200650 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400651 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100652 ImageResource* mIconSelected;
653 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500654 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600655 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400656};
657
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100658class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500659{
660public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200661 GUIPartitionList(xml_node<>* node);
662 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500663
664public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200665 // Update - Update any UI component animations (called <= 30 FPS)
666 // 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 +0100667 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500668
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200669 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100670 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500671
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200672 // SetPageFocus - Notify when a page gains or loses focus
673 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500674
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100675 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100676 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100677 virtual void NotifySelect(size_t item_selected);
678
Dees_Troya13d74f2013-03-24 08:54:55 -0500679protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100680 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600681 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500682
683protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200684 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500685 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200686 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500687 std::string selectedList;
688 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500689 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100690 ImageResource* mIconSelected;
691 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500692 bool updateList;
693};
694
Ethan Yonker44925ad2015-07-22 12:33:59 -0500695class GUITextBox : public GUIScrollList
696{
697public:
698 GUITextBox(xml_node<>* node);
699
700public:
701 // Update - Update any UI component animations (called <= 30 FPS)
702 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
703 virtual int Update(void);
704
705 // NotifyVarChange - Notify of a variable change
706 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
707
708 // ScrollList interface
709 virtual size_t GetItemCount();
710 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
711 virtual void NotifySelect(size_t item_selected);
712protected:
713
714 size_t mLastCount;
715 bool mIsStatic;
716 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
717 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
718 std::vector<std::string> rText; // Rendered text - what we actually see
719
720};
721
that8d46c092015-02-26 01:30:04 +0100722class GUIConsole : public GUIScrollList
723{
724public:
725 GUIConsole(xml_node<>* node);
726
727public:
728 // Render - Render the full object to the GL surface
729 // Return 0 on success, <0 on error
730 virtual int Render(void);
731
732 // Update - Update any UI component animations (called <= 30 FPS)
733 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
734 virtual int Update(void);
735
736 // IsInRegion - Checks if the request is handled by this object
737 // Return 1 if this object handles the request, 0 if not
738 virtual int IsInRegion(int x, int y);
739
740 // NotifyTouch - Notify of a touch event
741 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
742 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
743
744 // ScrollList interface
745 virtual size_t GetItemCount();
746 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
747 virtual void NotifySelect(size_t item_selected);
Ethan Yonker74db1572015-10-28 12:44:49 -0500748 static void Translate_Now();
that8d46c092015-02-26 01:30:04 +0100749protected:
750 enum SlideoutState
751 {
752 hidden = 0,
753 visible,
754 request_hide,
755 request_show
756 };
757
758 ImageResource* mSlideoutImage;
759 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
760 bool scrollToEnd; // true if we want to keep tracking the last line
761 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
762 int mSlideout;
763 SlideoutState mSlideoutState;
764 std::vector<std::string> rConsole;
765 std::vector<std::string> rConsoleColor;
766
767protected:
that8d46c092015-02-26 01:30:04 +0100768 int RenderSlideout(void);
769 int RenderConsole(void);
770};
771
that1964d192016-01-07 00:41:03 +0100772class TerminalEngine;
773class GUITerminal : public GUIScrollList, public InputObject
774{
775public:
776 GUITerminal(xml_node<>* node);
777
778public:
779 // Update - Update any UI component animations (called <= 30 FPS)
780 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
781 virtual int Update(void);
782
783 // NotifyTouch - Notify of a touch event
784 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
785 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
786
787 // NotifyKey - Notify of a key press
788 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
789 virtual int NotifyKey(int key, bool down);
790
791 // character input
792 virtual int NotifyCharInput(int ch);
793
794 // SetPageFocus - Notify when a page gains or loses focus
795 virtual void SetPageFocus(int inFocus);
796
797 // ScrollList interface
798 virtual size_t GetItemCount();
799 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
800 virtual void NotifySelect(size_t item_selected);
801protected:
802 void InitAndResize();
803
804 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
805 int updateCounter; // to track if anything changed in the back-end
806 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
807};
808
Dees_Troy51a0e822012-09-05 15:24:24 -0400809// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100810class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400811{
812public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200813 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400814
815public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200816 // Render - Render the full object to the GL surface
817 // Return 0 on success, <0 on error
818 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400819
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200820 // Update - Update any UI component animations (called <= 30 FPS)
821 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
822 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400823
824protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200825 AnimationResource* mAnimation;
826 int mFrame;
827 int mFPS;
828 int mLoop;
829 int mRender;
830 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400831};
832
Vojtech Bocekede51c52014-02-07 23:58:09 +0100833class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400834{
835public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200836 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400837
838public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200839 // Render - Render the full object to the GL surface
840 // Return 0 on success, <0 on error
841 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400842
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200843 // Update - Update any UI component animations (called <= 30 FPS)
844 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
845 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400846
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200847 // NotifyVarChange - Notify of a variable change
848 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100849 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400850
851protected:
thatf6ed8fc2015-02-14 20:23:16 +0100852 ImageResource* mEmptyBar;
853 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200854 std::string mMinValVar;
855 std::string mMaxValVar;
856 std::string mCurValVar;
857 float mSlide;
858 float mSlideInc;
859 int mSlideFrames;
860 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400861
862protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200863 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400864};
865
Vojtech Bocekede51c52014-02-07 23:58:09 +0100866class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400867{
868public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200869 GUISlider(xml_node<>* node);
870 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400871
872public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200873 // Render - Render the full object to the GL surface
874 // Return 0 on success, <0 on error
875 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400876
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200877 // Update - Update any UI component animations (called <= 30 FPS)
878 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
879 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400880
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200881 // NotifyTouch - Notify of a touch event
882 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
883 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400884
885protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200886 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600887 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100888 ImageResource* sSlider;
889 ImageResource* sSliderUsed;
890 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200891 int sTouchW, sTouchH;
892 int sCurTouchX;
893 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400894};
895
that8834a0f2016-01-05 23:29:30 +0100896// these are ASCII codes reported via NotifyCharInput
897// other special keys (arrows etc.) are reported via NotifyKey
898#define KEYBOARD_ACTION 13 // CR
899#define KEYBOARD_BACKSPACE 8 // Backspace
900#define KEYBOARD_TAB 9 // Tab
901#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
902#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400903
Vojtech Bocekede51c52014-02-07 23:58:09 +0100904class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400905{
906public:
907 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200908 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400909
910public:
911 virtual int Render(void);
912 virtual int Update(void);
913 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
914 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100915 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400916
917protected:
thate79878b2015-03-14 23:07:23 +0100918 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200919 {
that8834a0f2016-01-05 23:29:30 +0100920 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
921 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100922 int end_x;
923 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200924 };
thate79878b2015-03-14 23:07:23 +0100925 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200926 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200927 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100928 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100929
930 enum {
931 MAX_KEYBOARD_LAYOUTS = 5,
932 MAX_KEYBOARD_ROWS = 9,
933 MAX_KEYBOARD_KEYS = 20
934 };
935 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600936 {
thatd86f49d2015-03-15 00:56:57 +0100937 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100938 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100939 int row_end_y[MAX_KEYBOARD_ROWS];
940 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600941 int revert_layout;
942 };
thatd86f49d2015-03-15 00:56:57 +0100943 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400944
thatf256b722015-05-23 20:44:12 +0200945 struct KeyLabel
946 {
that8834a0f2016-01-05 23:29:30 +0100947 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200948 int layout_from; // 1-based; 0 for labels that apply to all layouts
949 int layout_to; // same as Key.layout
950 string text; // key label text
951 ImageResource* image; // image (overrides text if defined)
952 };
953 std::vector<KeyLabel> mKeyLabels;
954
thate79878b2015-03-14 23:07:23 +0100955 // Find key at screen coordinates
956 Key* HitTestKey(int x, int y);
957
Dees_Troy51a0e822012-09-05 15:24:24 -0400958 bool mRendered;
959 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100960 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100961 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100962 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 +0200963 int highlightRenderCount;
964 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100965 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400966 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600967 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100968 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200969 COLOR mFontColor; // for centered key labels
970 COLOR mFontColorSmall; // for centered key labels
971 FontResource* mFont; // for main key labels
972 FontResource* mSmallFont; // for key labels like "?123"
973 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200974 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200975 COLOR mLongpressFontColor;
976 COLOR mBackgroundColor; // keyboard background color
977 COLOR mKeyColorAlphanumeric; // key background color
978 COLOR mKeyColorOther; // key background color
979 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400980};
981
982// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100983class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400984{
985public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200986 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400987 virtual ~GUIInput();
988
989public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200990 // Render - Render the full object to the GL surface
991 // Return 0 on success, <0 on error
992 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400993
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200994 // Update - Update any UI component animations (called <= 30 FPS)
995 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
996 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400997
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200998 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100999 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001000
1001 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001002 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1003 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001004
that8834a0f2016-01-05 23:29:30 +01001005 virtual int NotifyKey(int key, bool down);
1006 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001007
1008protected:
1009 virtual int GetSelection(int x, int y);
1010
1011 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001012 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001013 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001014 void HandleCursorByTouch(int x);
1015 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001016
1017protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001018 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001019 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001020 ImageResource* mBackground;
1021 ImageResource* mCursor;
1022 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001023 std::string mVariable;
1024 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001025 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001026 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001027 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001028 COLOR mCursorColor;
1029 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001030 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001031 int lastX;
1032 int mCursorLocation;
1033 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1034 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001035 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001036 unsigned mFontHeight;
1037 unsigned CursorWidth;
1038 bool mRendered;
1039 bool HasMask;
1040 bool DrawCursor;
1041 bool isLocalChange;
1042 bool HasAllowed;
1043 bool HasDisabled;
1044 std::string AllowedList;
1045 std::string DisabledList;
1046 unsigned MinLen;
1047 unsigned MaxLen;
1048};
1049
1050class HardwareKeyboard
1051{
1052public:
thatf37aec22015-02-01 13:38:35 +01001053 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001054 virtual ~HardwareKeyboard();
1055
1056public:
thatf37aec22015-02-01 13:38:35 +01001057 // called by the input handler for key events
1058 int KeyDown(int key_code);
1059 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001060
thatf37aec22015-02-01 13:38:35 +01001061 // called by the input handler when holding a key down
1062 int KeyRepeat();
1063
1064 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001065 void ConsumeKeyRelease(int key);
1066
that8834a0f2016-01-05 23:29:30 +01001067 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001068private:
that8834a0f2016-01-05 23:29:30 +01001069 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001070 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001071 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001072};
1073
Vojtech Bocekede51c52014-02-07 23:58:09 +01001074class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001075{
1076public:
1077 GUISliderValue(xml_node<>* node);
1078 virtual ~GUISliderValue();
1079
1080public:
1081 // Render - Render the full object to the GL surface
1082 // Return 0 on success, <0 on error
1083 virtual int Render(void);
1084
1085 // Update - Update any UI component animations (called <= 30 FPS)
1086 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1087 virtual int Update(void);
1088
1089 // SetPos - Update the position of the render object
1090 // Return 0 on success, <0 on error
1091 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1092
1093 // NotifyTouch - Notify of a touch event
1094 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1095 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1096
1097 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001098 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001099
1100 // SetPageFocus - Notify when a page gains or loses focus
1101 virtual void SetPageFocus(int inFocus);
1102
1103protected:
1104 int measureText(const std::string& str);
1105 int valueFromPct(float pct);
1106 float pctFromValue(int value);
1107 void loadValue(bool force = false);
1108
1109 std::string mVariable;
1110 int mMax;
1111 int mMin;
1112 int mValue;
1113 char *mValueStr;
1114 float mValuePct;
1115 std::string mMaxStr;
1116 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001117 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001118 GUIText* mLabel;
1119 int mLabelW;
1120 COLOR mTextColor;
1121 COLOR mLineColor;
1122 COLOR mSliderColor;
1123 bool mShowRange;
1124 bool mShowCurr;
1125 int mLineX;
1126 int mLineY;
1127 int mLineH;
1128 int mLinePadding;
1129 int mPadding;
1130 int mSliderY;
1131 int mSliderW;
1132 int mSliderH;
1133 bool mRendered;
1134 int mFontHeight;
1135 GUIAction *mAction;
1136 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001137 int mLineW;
1138 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001139 ImageResource *mBackgroundImage;
1140 ImageResource *mHandleImage;
1141 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001142};
1143
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001144class MouseCursor : public RenderObject
1145{
1146public:
1147 MouseCursor(int posX, int posY);
1148 virtual ~MouseCursor();
1149
1150 virtual int Render(void);
1151 virtual int Update(void);
1152 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1153
1154 void Move(int deltaX, int deltaY);
1155 void GetPos(int& x, int& y);
1156 void LoadData(xml_node<>* node);
1157 void ResetData(int resX, int resY);
1158
1159private:
1160 int m_resX;
1161 int m_resY;
1162 bool m_moved;
1163 float m_speedMultiplier;
1164 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001165 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001166 bool m_present;
1167};
1168
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001169class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1170{
1171public:
1172 GUIPatternPassword(xml_node<>* node);
1173 virtual ~GUIPatternPassword();
1174
1175public:
1176 virtual int Render(void);
1177 virtual int Update(void);
1178 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001179 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001180 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1181
1182protected:
1183 void CalculateDotPositions();
1184 void ResetActiveDots();
1185 void ConnectDot(int dot_idx);
1186 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001187 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001188 int InDot(int x, int y);
1189 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001190 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001191 void PatternDrawn();
1192
1193 struct Dot {
1194 int x;
1195 int y;
1196 bool active;
1197 };
1198
Aleksa Saraib25a1832015-12-31 17:36:00 +01001199 std::string mSizeVar;
1200 size_t mGridSize;
1201
1202 Dot* mDots;
1203 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001204 size_t mConnectedDotsLen;
1205 int mCurLineX;
1206 int mCurLineY;
1207 bool mTrackingTouch;
1208 bool mNeedRender;
1209
1210 COLOR mDotColor;
1211 COLOR mActiveDotColor;
1212 COLOR mLineColor;
1213 ImageResource *mDotImage;
1214 ImageResource *mActiveDotImage;
1215 gr_surface mDotCircle;
1216 gr_surface mActiveDotCircle;
1217 int mDotRadius;
1218 int mLineWidth;
1219
1220 std::string mPassVar;
1221 GUIAction *mAction;
1222 int mUpdate;
1223};
1224
1225
Dees_Troy51a0e822012-09-05 15:24:24 -04001226// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001227xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001228std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1229int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1230int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1231int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001232COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001233COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1234FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1235ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1236AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
1237
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001238bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001239
1240#endif // _OBJECTS_HEADER
1241