blob: 7913b36cb9a570e5e21d55d8ad71d34ddc78c95d [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
45
Dees_Troy51a0e822012-09-05 15:24:24 -040046class RenderObject
47{
48public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020049 RenderObject() { mRenderX = 0; mRenderY = 0; mRenderW = 0; mRenderH = 0; mPlacement = TOP_LEFT; }
50 virtual ~RenderObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -040051
52public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020053 // Render - Render the full object to the GL surface
54 // Return 0 on success, <0 on error
55 virtual int Render(void) = 0;
Dees_Troy51a0e822012-09-05 15:24:24 -040056
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020057 // Update - Update any UI component animations (called <= 30 FPS)
58 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
59 virtual int Update(void) { return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040060
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020061 // GetRenderPos - Returns the current position of the object
62 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 -040063
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020064 // SetRenderPos - Update the position of the object
65 // Return 0 on success, <0 on error
66 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 -040067
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020068 // GetPlacement - Returns the current placement
69 virtual int GetPlacement(Placement& placement) { placement = mPlacement; return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040070
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020071 // SetPlacement - Update the current placement
72 virtual int SetPlacement(Placement placement) { mPlacement = placement; return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040073
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020074 // SetPageFocus - Notify when a page gains or loses focus
that1964d192016-01-07 00:41:03 +010075 // TODO: This should be named NotifyPageFocus for consistency
Ethan Yonkerd0514ba2015-10-22 14:17:47 -050076 virtual void SetPageFocus(int inFocus __unused) { return; }
Dees_Troy51a0e822012-09-05 15:24:24 -040077
78protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020079 int mRenderX, mRenderY, mRenderW, mRenderH;
80 Placement mPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -040081};
82
83class ActionObject
84{
85public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020086 ActionObject() { mActionX = 0; mActionY = 0; mActionW = 0; mActionH = 0; }
87 virtual ~ActionObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -040088
89public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020090 // NotifyTouch - Notify of a touch event
91 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
Ethan Yonkerd0514ba2015-10-22 14:17:47 -050092 virtual int NotifyTouch(TOUCH_STATE state __unused, int x __unused, int y __unused) { return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040093
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020094 // NotifyKey - Notify of a key press
95 // 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 -050096 virtual int NotifyKey(int key __unused, bool down __unused) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -040097
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020098 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 -040099
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200100 // Return 0 on success, <0 on error
101 virtual int SetActionPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400102
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200103 // IsInRegion - Checks if the request is handled by this object
thatf8194e22015-01-29 01:05:01 +0100104 // Return 1 if this object handles the request, 0 if not
105 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 -0400106
Dees_Troy51a0e822012-09-05 15:24:24 -0400107protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200108 int mActionX, mActionY, mActionW, mActionH;
Dees_Troy51a0e822012-09-05 15:24:24 -0400109};
110
Vojtech Bocekede51c52014-02-07 23:58:09 +0100111class GUIObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400112{
113public:
Vojtech Bocekede51c52014-02-07 23:58:09 +0100114 GUIObject(xml_node<>* node);
115 virtual ~GUIObject();
Dees_Troy51a0e822012-09-05 15:24:24 -0400116
117public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200118 bool IsConditionVariable(std::string var);
119 bool isConditionTrue();
120 bool isConditionValid();
Vojtech Bocek07220562014-02-08 02:05:33 +0100121
122 // NotifyVarChange - Notify of a variable change
123 // Returns 0 on success, <0 on error
124 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400125
126protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200127 class Condition
128 {
129 public:
Vojtech Bocek07220562014-02-08 02:05:33 +0100130 Condition() {
131 mLastResult = true;
132 }
133
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200134 std::string mVar1;
135 std::string mVar2;
136 std::string mCompareOp;
137 std::string mLastVal;
Vojtech Bocek07220562014-02-08 02:05:33 +0100138 bool mLastResult;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200139 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400140
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200141 std::vector<Condition> mConditions;
Dees_Troy51a0e822012-09-05 15:24:24 -0400142
143protected:
that20fb95d2015-09-12 11:27:47 +0200144 static void LoadConditions(xml_node<>* node, std::vector<Condition>& conditions);
145 static bool isMounted(std::string vol);
146 static bool isConditionTrue(Condition* condition);
147 static bool UpdateConditions(std::vector<Condition>& conditions, const std::string& varName);
Vojtech Bocek07220562014-02-08 02:05:33 +0100148
149 bool mConditionsResult;
Dees_Troy51a0e822012-09-05 15:24:24 -0400150};
151
152class InputObject
153{
154public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200155 InputObject() { HasInputFocus = 0; }
156 virtual ~InputObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -0400157
158public:
that8834a0f2016-01-05 23:29:30 +0100159 // NotifyCharInput - Notify of character input (usually from the onscreen or hardware keyboard)
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200160 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
that8834a0f2016-01-05 23:29:30 +0100161 virtual int NotifyCharInput(int ch __unused) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400162
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200163 virtual int SetInputFocus(int focus) { HasInputFocus = focus; return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400164
165protected:
166 int HasInputFocus;
167};
168
169// Derived Objects
170// GUIText - Used for static text
Vojtech Bocekede51c52014-02-07 23:58:09 +0100171class GUIText : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400172{
173public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200174 // w and h may be ignored, in which case, no bounding box is applied
175 GUIText(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400176
177public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200178 // Render - Render the full object to the GL surface
179 // Return 0 on success, <0 on error
180 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400181
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200182 // Update - Update any UI component animations (called <= 30 FPS)
183 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
184 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400185
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200186 // Retrieve the size of the current string (dynamic strings may change per call)
187 virtual int GetCurrentBounds(int& w, int& h);
Dees_Troy51a0e822012-09-05 15:24:24 -0400188
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200189 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100190 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400191
192 // Set maximum width in pixels
193 virtual int SetMaxWidth(unsigned width);
194
Ethan Yonkera5db7122016-03-14 15:47:09 -0500195 void SetText(string newtext);
Dees_Troy51a0e822012-09-05 15:24:24 -0400196
Dees_Troy4d12f962012-10-19 13:13:15 -0400197public:
198 bool isHighlighted;
Ethan Yonkerb7a54a32015-10-05 10:16:27 -0500199 bool scaleWidth;
200 unsigned maxWidth;
Dees_Troy4d12f962012-10-19 13:13:15 -0400201
Dees_Troy51a0e822012-09-05 15:24:24 -0400202protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200203 std::string mText;
204 std::string mLastValue;
205 COLOR mColor;
Dees_Troy4d12f962012-10-19 13:13:15 -0400206 COLOR mHighlightColor;
thatf6ed8fc2015-02-14 20:23:16 +0100207 FontResource* mFont;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200208 int mIsStatic;
209 int mVarChanged;
210 int mFontHeight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400211};
212
213// GUIImage - Used for static image
Vojtech Bocekede51c52014-02-07 23:58:09 +0100214class GUIImage : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400215{
216public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200217 GUIImage(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400218
219public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200220 // Render - Render the full object to the GL surface
221 // Return 0 on success, <0 on error
222 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400223
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200224 // SetRenderPos - Update the position of the object
225 // Return 0 on success, <0 on error
226 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400227
Dees_Troy4d12f962012-10-19 13:13:15 -0400228public:
229 bool isHighlighted;
230
Dees_Troy51a0e822012-09-05 15:24:24 -0400231protected:
thatf6ed8fc2015-02-14 20:23:16 +0100232 ImageResource* mImage;
233 ImageResource* mHighlightImage;
Dees_Troy51a0e822012-09-05 15:24:24 -0400234};
235
236// GUIFill - Used for fill colors
Vojtech Bocekede51c52014-02-07 23:58:09 +0100237class GUIFill : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400238{
239public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200240 GUIFill(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400241
242public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200243 // Render - Render the full object to the GL surface
244 // Return 0 on success, <0 on error
245 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400246
247protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200248 COLOR mColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400249};
250
251// GUIAction - Used for standard actions
Vojtech Bocekede51c52014-02-07 23:58:09 +0100252class GUIAction : public GUIObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400253{
thatc6085482015-01-09 22:12:43 +0100254 friend class ActionThread;
255
Dees_Troy51a0e822012-09-05 15:24:24 -0400256public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200257 GUIAction(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400258
259public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200260 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100261 virtual int NotifyKey(int key, bool down);
Vojtech Bocek07220562014-02-08 02:05:33 +0100262 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
that3f7b1ac2014-12-30 11:30:13 +0100263
264 int doActions();
Dees_Troy51a0e822012-09-05 15:24:24 -0400265
266protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200267 class Action
268 {
269 public:
270 std::string mFunction;
271 std::string mArg;
272 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400273
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200274 std::vector<Action> mActions;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100275 std::map<int, bool> mKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400276
277protected:
that73a52952015-01-28 23:07:34 +0100278 enum ThreadType { THREAD_NONE, THREAD_ACTION, THREAD_CANCEL };
279
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200280 int getKeyByName(std::string key);
that3f7b1ac2014-12-30 11:30:13 +0100281 int doAction(Action action);
that73a52952015-01-28 23:07:34 +0100282 ThreadType getThreadType(const Action& action);
Dees_Troy51a0e822012-09-05 15:24:24 -0400283 void simulate_progress_bar(void);
Ethan Yonker0d47eb52015-01-09 11:23:19 -0600284 int flash_zip(std::string filename, int* wipe_cache);
thatcc8ddca2015-01-03 01:59:36 +0100285 void reinject_after_flash();
Dees_Troy51a0e822012-09-05 15:24:24 -0400286 void operation_start(const string operation_name);
that3f7b1ac2014-12-30 11:30:13 +0100287 void operation_end(const int operation_status);
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +0000288 time_t Start;
that3f7b1ac2014-12-30 11:30:13 +0100289
290 // map action name to function pointer
291 typedef int (GUIAction::*execFunction)(std::string);
292 typedef std::map<std::string, execFunction> mapFunc;
293 static mapFunc mf;
thatc6085482015-01-09 22:12:43 +0100294 static std::set<std::string> setActionsRunningInCallerThread;
that3f7b1ac2014-12-30 11:30:13 +0100295
296 // GUI actions
297 int reboot(std::string arg);
298 int home(std::string arg);
299 int key(std::string arg);
300 int page(std::string arg);
301 int reload(std::string arg);
302 int readBackup(std::string arg);
303 int set(std::string arg);
304 int clear(std::string arg);
305 int mount(std::string arg);
306 int unmount(std::string arg);
307 int restoredefaultsettings(std::string arg);
308 int copylog(std::string arg);
309 int compute(std::string arg);
310 int setguitimezone(std::string arg);
311 int overlay(std::string arg);
312 int queuezip(std::string arg);
313 int cancelzip(std::string arg);
314 int queueclear(std::string arg);
315 int sleep(std::string arg);
316 int appenddatetobackupname(std::string arg);
317 int generatebackupname(std::string arg);
318 int checkpartitionlist(std::string arg);
319 int getpartitiondetails(std::string arg);
320 int screenshot(std::string arg);
321 int setbrightness(std::string arg);
322
thatc6085482015-01-09 22:12:43 +0100323 // (originally) threaded actions
that3f7b1ac2014-12-30 11:30:13 +0100324 int fileexists(std::string arg);
325 int flash(std::string arg);
326 int wipe(std::string arg);
327 int refreshsizes(std::string arg);
328 int nandroid(std::string arg);
Ethan Yonkerb5fab762016-01-28 14:03:33 -0600329 int fixcontexts(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100330 int fixpermissions(std::string arg);
331 int dd(std::string arg);
332 int partitionsd(std::string arg);
333 int installhtcdumlock(std::string arg);
334 int htcdumlockrestoreboot(std::string arg);
335 int htcdumlockreflashrecovery(std::string arg);
336 int cmd(std::string arg);
337 int terminalcommand(std::string arg);
338 int killterminal(std::string arg);
339 int reinjecttwrp(std::string arg);
340 int checkbackupname(std::string arg);
341 int decrypt(std::string arg);
342 int adbsideload(std::string arg);
343 int adbsideloadcancel(std::string arg);
344 int openrecoveryscript(std::string arg);
345 int installsu(std::string arg);
346 int fixsu(std::string arg);
347 int decrypt_backup(std::string arg);
348 int repair(std::string arg);
Ethan Yonkera2719152015-05-28 09:44:41 -0500349 int resize(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100350 int changefilesystem(std::string arg);
351 int startmtp(std::string arg);
352 int stopmtp(std::string arg);
Ethan Yonker96af84a2015-01-05 14:58:36 -0600353 int flashimage(std::string arg);
bigbiff7abc5fe2015-01-17 16:53:12 -0500354 int cancelbackup(std::string arg);
Ethan Yonkereb32b1f2015-05-18 10:23:03 -0500355 int checkpartitionlifetimewrites(std::string arg);
356 int mountsystemtoggle(std::string arg);
Ethan Yonker74db1572015-10-28 12:44:49 -0500357 int setlanguage(std::string arg);
that10ae24f2015-12-26 20:53:51 +0100358 int twcmd(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100359
360 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400361};
362
Vojtech Bocekede51c52014-02-07 23:58:09 +0100363class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400364{
365public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200366 GUIButton(xml_node<>* node);
367 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400368
369public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200370 // Render - Render the full object to the GL surface
371 // Return 0 on success, <0 on error
372 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400373
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200374 // Update - Update any UI component animations (called <= 30 FPS)
375 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
376 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400377
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200378 // SetPos - Update the position of the render object
379 // Return 0 on success, <0 on error
380 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400381
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200382 // NotifyTouch - Notify of a touch event
383 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
384 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400385
386protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200387 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100388 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200389 GUIText* mButtonLabel;
390 GUIAction* mAction;
391 int mTextX, mTextY, mTextW, mTextH;
392 int mIconX, mIconY, mIconW, mIconH;
393 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600394 bool hasHighlightColor;
395 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500396 bool hasFill;
397 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600398 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000399 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400400};
401
Vojtech Bocekede51c52014-02-07 23:58:09 +0100402class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400403{
404public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200405 GUICheckbox(xml_node<>* node);
406 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400407
408public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200409 // Render - Render the full object to the GL surface
410 // Return 0 on success, <0 on error
411 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400412
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200413 // Update - Update any UI component animations (called <= 30 FPS)
414 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
415 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400416
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200417 // SetPos - Update the position of the render object
418 // Return 0 on success, <0 on error
419 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400420
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200421 // NotifyTouch - Notify of a touch event
422 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
423 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400424
425protected:
thatf6ed8fc2015-02-14 20:23:16 +0100426 ImageResource* mChecked;
427 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200428 GUIText* mLabel;
429 int mTextX, mTextY;
430 int mCheckX, mCheckY, mCheckW, mCheckH;
431 int mLastState;
432 bool mRendered;
433 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400434};
435
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100436class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400437{
438public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100439 GUIScrollList(xml_node<>* node);
440 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400441
442public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200443 // Render - Render the full object to the GL surface
444 // Return 0 on success, <0 on error
445 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400446
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200447 // Update - Update any UI component animations (called <= 30 FPS)
448 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
449 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400450
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200451 // NotifyTouch - Notify of a touch event
452 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
453 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400454
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200455 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100456 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400457
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200458 // SetPos - Update the position of the render object
459 // Return 0 on success, <0 on error
460 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400461
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200462 // SetPageFocus - Notify when a page gains or loses focus
463 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400464
465protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100466 // derived classes need to implement these
467 // get number of items
468 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100469 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
470 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100471 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500472 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100473
that0af77952015-02-25 08:52:19 +0100474 // render a standard-layout list item with optional icon and text
475 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
476
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100477 enum { NO_ITEM = (size_t)-1 };
478 // returns item index at coordinates or NO_ITEM if there is no item there
479 size_t HitTestItem(int x, int y);
480
481 // 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
482 void SetMaxIconSize(int w, int h);
483
484 // This will make sure that the item indicated by list_index is visible on the screen
485 void SetVisibleListLocation(size_t list_index);
486
487 // Handle scrolling changes for drags and kinetic scrolling
488 void HandleScrolling();
489
that9876ac32015-02-15 21:40:59 +0100490 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100491 int GetDisplayItemCount();
492
493 // Returns the size in pixels of a partial item or row size
494 int GetDisplayRemainder();
495
496protected:
497 // Background
498 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100499 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100500
501 // Header
502 COLOR mHeaderBackgroundColor;
503 COLOR mHeaderFontColor;
504 std::string mHeaderText; // Original header text without parsing any variables
505 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100506 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100507 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100508 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100509 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
510 int mHeaderSeparatorH; // Height of the separator between header and list items
511 COLOR mHeaderSeparatorColor; // color of the header separator
512
513 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100514 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100515 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100516 bool hasHighlightColor; // indicates if a highlight color was set
517 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100518 COLOR mFontHighlightColor;
519 int mFontHeight;
520 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
521 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
522 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
523 int mSeparatorH; // Height of the separator between items
524 COLOR mSeparatorColor; // color of the separator that is between items
525
thata9998212015-02-19 22:51:24 +0100526 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100527 int mFastScrollW; // width of the fastscroll area
528 int mFastScrollLineW; // width of the line for fastscroll rendering
529 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100530 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100531 COLOR mFastScrollLineColor;
532 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100533
534 // Scrolling and dynamic state
535 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
536 int mFastScrollRectCurrentH; // current height of fastscroll rect
537 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100538 bool hasScroll; // indicates that we have enough items in the list to scroll
539 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
540 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
541 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 +0100542 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 +0100543 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
544 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
545 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
546 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
547 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500548 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 +0100549};
550
551class GUIFileSelector : public GUIScrollList
552{
553public:
554 GUIFileSelector(xml_node<>* node);
555 virtual ~GUIFileSelector();
556
557public:
558 // Update - Update any UI component animations (called <= 30 FPS)
559 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
560 virtual int Update(void);
561
562 // NotifyVarChange - Notify of a variable change
563 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
564
565 // SetPageFocus - Notify when a page gains or loses focus
566 virtual void SetPageFocus(int inFocus);
567
568 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100569 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100570 virtual void NotifySelect(size_t item_selected);
571
572protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200573 struct FileData {
574 std::string fileName;
575 unsigned char fileType; // Uses d_type format from struct dirent
576 mode_t protection; // Uses mode_t format from stat
577 uid_t userId;
578 gid_t groupId;
579 off_t fileSize;
580 time_t lastAccess; // Uses time_t format from stat
581 time_t lastModified; // Uses time_t format from stat
582 time_t lastStatChange; // Uses time_t format from stat
583 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400584
585protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200586 virtual int GetFileList(const std::string folder);
587 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400588
589protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200590 std::vector<FileData> mFolderList;
591 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100592 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600593 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100594 std::string mExtn; // used for filtering the file list, for example, *.zip
595 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
596 std::string mSortVariable; // data manager variable used to change the sorting of files
597 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
598 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
599 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)
600 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100601 ImageResource* mFolderIcon;
602 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600603 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400604};
605
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100606class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400607{
608public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200609 GUIListBox(xml_node<>* node);
610 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400611
612public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200613 // Update - Update any UI component animations (called <= 30 FPS)
614 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
615 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400616
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200617 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100618 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400619
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200620 // SetPageFocus - Notify when a page gains or loses focus
621 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400622
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100623 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100624 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100625 virtual void NotifySelect(size_t item_selected);
626
Dees_Troy51a0e822012-09-05 15:24:24 -0400627protected:
that8ab5c132015-09-13 23:00:54 +0200628 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200629 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500630 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400631 std::string variableValue;
632 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200633 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200634 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200635 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400636
637protected:
that8ab5c132015-09-13 23:00:54 +0200638 std::vector<ListItem> mListItems;
639 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200640 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400641 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100642 ImageResource* mIconSelected;
643 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500644 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600645 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400646};
647
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100648class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500649{
650public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200651 GUIPartitionList(xml_node<>* node);
652 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500653
654public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200655 // Update - Update any UI component animations (called <= 30 FPS)
656 // 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 +0100657 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500658
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200659 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100660 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500661
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200662 // SetPageFocus - Notify when a page gains or loses focus
663 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500664
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100665 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100666 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100667 virtual void NotifySelect(size_t item_selected);
668
Dees_Troya13d74f2013-03-24 08:54:55 -0500669protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100670 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600671 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500672
673protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200674 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500675 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200676 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500677 std::string selectedList;
678 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500679 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100680 ImageResource* mIconSelected;
681 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500682 bool updateList;
683};
684
Ethan Yonker44925ad2015-07-22 12:33:59 -0500685class GUITextBox : public GUIScrollList
686{
687public:
688 GUITextBox(xml_node<>* node);
689
690public:
691 // Update - Update any UI component animations (called <= 30 FPS)
692 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
693 virtual int Update(void);
694
695 // NotifyVarChange - Notify of a variable change
696 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
697
698 // ScrollList interface
699 virtual size_t GetItemCount();
700 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
701 virtual void NotifySelect(size_t item_selected);
702protected:
703
704 size_t mLastCount;
705 bool mIsStatic;
706 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
707 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
708 std::vector<std::string> rText; // Rendered text - what we actually see
709
710};
711
that8d46c092015-02-26 01:30:04 +0100712class GUIConsole : public GUIScrollList
713{
714public:
715 GUIConsole(xml_node<>* node);
716
717public:
718 // Render - Render the full object to the GL surface
719 // Return 0 on success, <0 on error
720 virtual int Render(void);
721
722 // Update - Update any UI component animations (called <= 30 FPS)
723 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
724 virtual int Update(void);
725
726 // IsInRegion - Checks if the request is handled by this object
727 // Return 1 if this object handles the request, 0 if not
728 virtual int IsInRegion(int x, int y);
729
730 // NotifyTouch - Notify of a touch event
731 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
732 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
733
734 // ScrollList interface
735 virtual size_t GetItemCount();
736 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
737 virtual void NotifySelect(size_t item_selected);
Ethan Yonker74db1572015-10-28 12:44:49 -0500738 static void Translate_Now();
that8d46c092015-02-26 01:30:04 +0100739protected:
740 enum SlideoutState
741 {
742 hidden = 0,
743 visible,
744 request_hide,
745 request_show
746 };
747
748 ImageResource* mSlideoutImage;
749 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
750 bool scrollToEnd; // true if we want to keep tracking the last line
751 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
752 int mSlideout;
753 SlideoutState mSlideoutState;
754 std::vector<std::string> rConsole;
755 std::vector<std::string> rConsoleColor;
756
757protected:
that8d46c092015-02-26 01:30:04 +0100758 int RenderSlideout(void);
759 int RenderConsole(void);
760};
761
that1964d192016-01-07 00:41:03 +0100762class TerminalEngine;
763class GUITerminal : public GUIScrollList, public InputObject
764{
765public:
766 GUITerminal(xml_node<>* node);
767
768public:
769 // Update - Update any UI component animations (called <= 30 FPS)
770 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
771 virtual int Update(void);
772
773 // NotifyTouch - Notify of a touch event
774 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
775 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
776
777 // NotifyKey - Notify of a key press
778 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
779 virtual int NotifyKey(int key, bool down);
780
781 // character input
782 virtual int NotifyCharInput(int ch);
783
784 // SetPageFocus - Notify when a page gains or loses focus
785 virtual void SetPageFocus(int inFocus);
786
787 // ScrollList interface
788 virtual size_t GetItemCount();
789 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
790 virtual void NotifySelect(size_t item_selected);
791protected:
792 void InitAndResize();
793
794 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
795 int updateCounter; // to track if anything changed in the back-end
796 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
797};
798
Dees_Troy51a0e822012-09-05 15:24:24 -0400799// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100800class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400801{
802public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200803 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400804
805public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200806 // Render - Render the full object to the GL surface
807 // Return 0 on success, <0 on error
808 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400809
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200810 // Update - Update any UI component animations (called <= 30 FPS)
811 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
812 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400813
814protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200815 AnimationResource* mAnimation;
816 int mFrame;
817 int mFPS;
818 int mLoop;
819 int mRender;
820 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400821};
822
Vojtech Bocekede51c52014-02-07 23:58:09 +0100823class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400824{
825public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200826 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400827
828public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200829 // Render - Render the full object to the GL surface
830 // Return 0 on success, <0 on error
831 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400832
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200833 // Update - Update any UI component animations (called <= 30 FPS)
834 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
835 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400836
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200837 // NotifyVarChange - Notify of a variable change
838 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100839 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400840
841protected:
thatf6ed8fc2015-02-14 20:23:16 +0100842 ImageResource* mEmptyBar;
843 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200844 std::string mMinValVar;
845 std::string mMaxValVar;
846 std::string mCurValVar;
847 float mSlide;
848 float mSlideInc;
849 int mSlideFrames;
850 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400851
852protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200853 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400854};
855
Vojtech Bocekede51c52014-02-07 23:58:09 +0100856class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400857{
858public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200859 GUISlider(xml_node<>* node);
860 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400861
862public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200863 // Render - Render the full object to the GL surface
864 // Return 0 on success, <0 on error
865 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400866
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200867 // Update - Update any UI component animations (called <= 30 FPS)
868 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
869 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400870
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200871 // NotifyTouch - Notify of a touch event
872 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
873 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400874
875protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200876 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600877 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100878 ImageResource* sSlider;
879 ImageResource* sSliderUsed;
880 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200881 int sTouchW, sTouchH;
882 int sCurTouchX;
883 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400884};
885
that8834a0f2016-01-05 23:29:30 +0100886// these are ASCII codes reported via NotifyCharInput
887// other special keys (arrows etc.) are reported via NotifyKey
888#define KEYBOARD_ACTION 13 // CR
889#define KEYBOARD_BACKSPACE 8 // Backspace
890#define KEYBOARD_TAB 9 // Tab
891#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
892#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400893
Vojtech Bocekede51c52014-02-07 23:58:09 +0100894class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400895{
896public:
897 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200898 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400899
900public:
901 virtual int Render(void);
902 virtual int Update(void);
903 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
904 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100905 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400906
907protected:
thate79878b2015-03-14 23:07:23 +0100908 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200909 {
that8834a0f2016-01-05 23:29:30 +0100910 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
911 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100912 int end_x;
913 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200914 };
thate79878b2015-03-14 23:07:23 +0100915 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200916 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200917 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100918 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100919
920 enum {
921 MAX_KEYBOARD_LAYOUTS = 5,
922 MAX_KEYBOARD_ROWS = 9,
923 MAX_KEYBOARD_KEYS = 20
924 };
925 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600926 {
thatd86f49d2015-03-15 00:56:57 +0100927 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100928 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100929 int row_end_y[MAX_KEYBOARD_ROWS];
930 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600931 int revert_layout;
932 };
thatd86f49d2015-03-15 00:56:57 +0100933 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400934
thatf256b722015-05-23 20:44:12 +0200935 struct KeyLabel
936 {
that8834a0f2016-01-05 23:29:30 +0100937 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200938 int layout_from; // 1-based; 0 for labels that apply to all layouts
939 int layout_to; // same as Key.layout
940 string text; // key label text
941 ImageResource* image; // image (overrides text if defined)
942 };
943 std::vector<KeyLabel> mKeyLabels;
944
thate79878b2015-03-14 23:07:23 +0100945 // Find key at screen coordinates
946 Key* HitTestKey(int x, int y);
947
Dees_Troy51a0e822012-09-05 15:24:24 -0400948 bool mRendered;
949 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100950 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100951 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100952 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 +0200953 int highlightRenderCount;
954 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100955 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400956 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600957 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100958 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200959 COLOR mFontColor; // for centered key labels
960 COLOR mFontColorSmall; // for centered key labels
961 FontResource* mFont; // for main key labels
962 FontResource* mSmallFont; // for key labels like "?123"
963 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200964 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200965 COLOR mLongpressFontColor;
966 COLOR mBackgroundColor; // keyboard background color
967 COLOR mKeyColorAlphanumeric; // key background color
968 COLOR mKeyColorOther; // key background color
969 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400970};
971
972// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100973class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400974{
975public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200976 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400977 virtual ~GUIInput();
978
979public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200980 // Render - Render the full object to the GL surface
981 // Return 0 on success, <0 on error
982 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400983
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200984 // Update - Update any UI component animations (called <= 30 FPS)
985 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
986 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400987
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200988 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100989 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400990
991 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200992 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
993 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400994
that8834a0f2016-01-05 23:29:30 +0100995 virtual int NotifyKey(int key, bool down);
996 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -0400997
998protected:
999 virtual int GetSelection(int x, int y);
1000
1001 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001002 void HandleTextLocation(int x);
1003 void UpdateTextWidth();
1004 void HandleCursorByTouch(int x);
1005 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001006
1007protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001008 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001009 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001010 ImageResource* mBackground;
1011 ImageResource* mCursor;
1012 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001013 std::string mText;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001014 std::string mLastValue;
Dees_Troy51a0e822012-09-05 15:24:24 -04001015 std::string mVariable;
1016 std::string mMask;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001017 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001018 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001019 COLOR mCursorColor;
1020 int scrollingX;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001021 int cursorX;
Dees_Troy51a0e822012-09-05 15:24:24 -04001022 int lastX;
1023 int mCursorLocation;
1024 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1025 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001026 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001027 unsigned mFontHeight;
1028 unsigned CursorWidth;
1029 bool mRendered;
1030 bool HasMask;
1031 bool DrawCursor;
1032 bool isLocalChange;
1033 bool HasAllowed;
1034 bool HasDisabled;
1035 std::string AllowedList;
1036 std::string DisabledList;
1037 unsigned MinLen;
1038 unsigned MaxLen;
1039};
1040
1041class HardwareKeyboard
1042{
1043public:
thatf37aec22015-02-01 13:38:35 +01001044 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001045 virtual ~HardwareKeyboard();
1046
1047public:
thatf37aec22015-02-01 13:38:35 +01001048 // called by the input handler for key events
1049 int KeyDown(int key_code);
1050 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001051
thatf37aec22015-02-01 13:38:35 +01001052 // called by the input handler when holding a key down
1053 int KeyRepeat();
1054
1055 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001056 void ConsumeKeyRelease(int key);
1057
that8834a0f2016-01-05 23:29:30 +01001058 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001059private:
that8834a0f2016-01-05 23:29:30 +01001060 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001061 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001062 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001063};
1064
Vojtech Bocekede51c52014-02-07 23:58:09 +01001065class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001066{
1067public:
1068 GUISliderValue(xml_node<>* node);
1069 virtual ~GUISliderValue();
1070
1071public:
1072 // Render - Render the full object to the GL surface
1073 // Return 0 on success, <0 on error
1074 virtual int Render(void);
1075
1076 // Update - Update any UI component animations (called <= 30 FPS)
1077 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1078 virtual int Update(void);
1079
1080 // SetPos - Update the position of the render object
1081 // Return 0 on success, <0 on error
1082 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1083
1084 // NotifyTouch - Notify of a touch event
1085 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1086 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1087
1088 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001089 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001090
1091 // SetPageFocus - Notify when a page gains or loses focus
1092 virtual void SetPageFocus(int inFocus);
1093
1094protected:
1095 int measureText(const std::string& str);
1096 int valueFromPct(float pct);
1097 float pctFromValue(int value);
1098 void loadValue(bool force = false);
1099
1100 std::string mVariable;
1101 int mMax;
1102 int mMin;
1103 int mValue;
1104 char *mValueStr;
1105 float mValuePct;
1106 std::string mMaxStr;
1107 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001108 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001109 GUIText* mLabel;
1110 int mLabelW;
1111 COLOR mTextColor;
1112 COLOR mLineColor;
1113 COLOR mSliderColor;
1114 bool mShowRange;
1115 bool mShowCurr;
1116 int mLineX;
1117 int mLineY;
1118 int mLineH;
1119 int mLinePadding;
1120 int mPadding;
1121 int mSliderY;
1122 int mSliderW;
1123 int mSliderH;
1124 bool mRendered;
1125 int mFontHeight;
1126 GUIAction *mAction;
1127 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001128 int mLineW;
1129 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001130 ImageResource *mBackgroundImage;
1131 ImageResource *mHandleImage;
1132 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001133};
1134
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001135class MouseCursor : public RenderObject
1136{
1137public:
1138 MouseCursor(int posX, int posY);
1139 virtual ~MouseCursor();
1140
1141 virtual int Render(void);
1142 virtual int Update(void);
1143 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1144
1145 void Move(int deltaX, int deltaY);
1146 void GetPos(int& x, int& y);
1147 void LoadData(xml_node<>* node);
1148 void ResetData(int resX, int resY);
1149
1150private:
1151 int m_resX;
1152 int m_resY;
1153 bool m_moved;
1154 float m_speedMultiplier;
1155 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001156 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001157 bool m_present;
1158};
1159
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001160class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1161{
1162public:
1163 GUIPatternPassword(xml_node<>* node);
1164 virtual ~GUIPatternPassword();
1165
1166public:
1167 virtual int Render(void);
1168 virtual int Update(void);
1169 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001170 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001171 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1172
1173protected:
1174 void CalculateDotPositions();
1175 void ResetActiveDots();
1176 void ConnectDot(int dot_idx);
1177 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001178 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001179 int InDot(int x, int y);
1180 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001181 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001182 void PatternDrawn();
1183
1184 struct Dot {
1185 int x;
1186 int y;
1187 bool active;
1188 };
1189
Aleksa Saraib25a1832015-12-31 17:36:00 +01001190 std::string mSizeVar;
1191 size_t mGridSize;
1192
1193 Dot* mDots;
1194 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001195 size_t mConnectedDotsLen;
1196 int mCurLineX;
1197 int mCurLineY;
1198 bool mTrackingTouch;
1199 bool mNeedRender;
1200
1201 COLOR mDotColor;
1202 COLOR mActiveDotColor;
1203 COLOR mLineColor;
1204 ImageResource *mDotImage;
1205 ImageResource *mActiveDotImage;
1206 gr_surface mDotCircle;
1207 gr_surface mActiveDotCircle;
1208 int mDotRadius;
1209 int mLineWidth;
1210
1211 std::string mPassVar;
1212 GUIAction *mAction;
1213 int mUpdate;
1214};
1215
1216
Dees_Troy51a0e822012-09-05 15:24:24 -04001217// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001218xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001219std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1220int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1221int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1222int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001223COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001224COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1225FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1226ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1227AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
1228
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001229bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001230
1231#endif // _OBJECTS_HEADER
1232