blob: 0d969279ac453406ddd6915b35be892b08a215a0 [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);
Matt Mower9a2a2052016-05-31 21:31:22 -0500316 int sleepcounter(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100317 int appenddatetobackupname(std::string arg);
318 int generatebackupname(std::string arg);
319 int checkpartitionlist(std::string arg);
320 int getpartitiondetails(std::string arg);
321 int screenshot(std::string arg);
322 int setbrightness(std::string arg);
323
thatc6085482015-01-09 22:12:43 +0100324 // (originally) threaded actions
that3f7b1ac2014-12-30 11:30:13 +0100325 int fileexists(std::string arg);
326 int flash(std::string arg);
327 int wipe(std::string arg);
328 int refreshsizes(std::string arg);
329 int nandroid(std::string arg);
Ethan Yonkerb5fab762016-01-28 14:03:33 -0600330 int fixcontexts(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100331 int fixpermissions(std::string arg);
332 int dd(std::string arg);
333 int partitionsd(std::string arg);
334 int installhtcdumlock(std::string arg);
335 int htcdumlockrestoreboot(std::string arg);
336 int htcdumlockreflashrecovery(std::string arg);
337 int cmd(std::string arg);
338 int terminalcommand(std::string arg);
339 int killterminal(std::string arg);
340 int reinjecttwrp(std::string arg);
341 int checkbackupname(std::string arg);
342 int decrypt(std::string arg);
343 int adbsideload(std::string arg);
344 int adbsideloadcancel(std::string arg);
345 int openrecoveryscript(std::string arg);
346 int installsu(std::string arg);
347 int fixsu(std::string arg);
348 int decrypt_backup(std::string arg);
349 int repair(std::string arg);
Ethan Yonkera2719152015-05-28 09:44:41 -0500350 int resize(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100351 int changefilesystem(std::string arg);
352 int startmtp(std::string arg);
353 int stopmtp(std::string arg);
Ethan Yonker96af84a2015-01-05 14:58:36 -0600354 int flashimage(std::string arg);
bigbiff7abc5fe2015-01-17 16:53:12 -0500355 int cancelbackup(std::string arg);
Ethan Yonkereb32b1f2015-05-18 10:23:03 -0500356 int checkpartitionlifetimewrites(std::string arg);
357 int mountsystemtoggle(std::string arg);
Ethan Yonker74db1572015-10-28 12:44:49 -0500358 int setlanguage(std::string arg);
that10ae24f2015-12-26 20:53:51 +0100359 int twcmd(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100360
361 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400362};
363
Vojtech Bocekede51c52014-02-07 23:58:09 +0100364class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400365{
366public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200367 GUIButton(xml_node<>* node);
368 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400369
370public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200371 // Render - Render the full object to the GL surface
372 // Return 0 on success, <0 on error
373 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400374
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200375 // Update - Update any UI component animations (called <= 30 FPS)
376 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
377 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400378
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200379 // SetPos - Update the position of the render object
380 // Return 0 on success, <0 on error
381 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400382
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200383 // NotifyTouch - Notify of a touch event
384 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
385 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400386
387protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200388 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100389 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200390 GUIText* mButtonLabel;
391 GUIAction* mAction;
392 int mTextX, mTextY, mTextW, mTextH;
393 int mIconX, mIconY, mIconW, mIconH;
394 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600395 bool hasHighlightColor;
396 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500397 bool hasFill;
398 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600399 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000400 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400401};
402
Vojtech Bocekede51c52014-02-07 23:58:09 +0100403class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400404{
405public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200406 GUICheckbox(xml_node<>* node);
407 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400408
409public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200410 // Render - Render the full object to the GL surface
411 // Return 0 on success, <0 on error
412 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400413
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200414 // Update - Update any UI component animations (called <= 30 FPS)
415 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
416 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400417
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200418 // SetPos - Update the position of the render object
419 // Return 0 on success, <0 on error
420 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400421
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200422 // NotifyTouch - Notify of a touch event
423 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
424 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400425
426protected:
thatf6ed8fc2015-02-14 20:23:16 +0100427 ImageResource* mChecked;
428 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200429 GUIText* mLabel;
430 int mTextX, mTextY;
431 int mCheckX, mCheckY, mCheckW, mCheckH;
432 int mLastState;
433 bool mRendered;
434 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400435};
436
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100437class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400438{
439public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100440 GUIScrollList(xml_node<>* node);
441 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400442
443public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200444 // Render - Render the full object to the GL surface
445 // Return 0 on success, <0 on error
446 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400447
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200448 // Update - Update any UI component animations (called <= 30 FPS)
449 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
450 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400451
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200452 // NotifyTouch - Notify of a touch event
453 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
454 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400455
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200456 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100457 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400458
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200459 // SetPos - Update the position of the render object
460 // Return 0 on success, <0 on error
461 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400462
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200463 // SetPageFocus - Notify when a page gains or loses focus
464 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400465
466protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100467 // derived classes need to implement these
468 // get number of items
469 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100470 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
471 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100472 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500473 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100474
that0af77952015-02-25 08:52:19 +0100475 // render a standard-layout list item with optional icon and text
476 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
477
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100478 enum { NO_ITEM = (size_t)-1 };
479 // returns item index at coordinates or NO_ITEM if there is no item there
480 size_t HitTestItem(int x, int y);
481
482 // 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
483 void SetMaxIconSize(int w, int h);
484
485 // This will make sure that the item indicated by list_index is visible on the screen
486 void SetVisibleListLocation(size_t list_index);
487
488 // Handle scrolling changes for drags and kinetic scrolling
489 void HandleScrolling();
490
that9876ac32015-02-15 21:40:59 +0100491 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100492 int GetDisplayItemCount();
493
494 // Returns the size in pixels of a partial item or row size
495 int GetDisplayRemainder();
496
497protected:
498 // Background
499 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100500 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100501
502 // Header
503 COLOR mHeaderBackgroundColor;
504 COLOR mHeaderFontColor;
505 std::string mHeaderText; // Original header text without parsing any variables
506 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100507 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100508 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100509 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100510 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
511 int mHeaderSeparatorH; // Height of the separator between header and list items
512 COLOR mHeaderSeparatorColor; // color of the header separator
513
514 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100515 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100516 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100517 bool hasHighlightColor; // indicates if a highlight color was set
518 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100519 COLOR mFontHighlightColor;
520 int mFontHeight;
521 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
522 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
523 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
524 int mSeparatorH; // Height of the separator between items
525 COLOR mSeparatorColor; // color of the separator that is between items
526
thata9998212015-02-19 22:51:24 +0100527 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100528 int mFastScrollW; // width of the fastscroll area
529 int mFastScrollLineW; // width of the line for fastscroll rendering
530 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100531 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100532 COLOR mFastScrollLineColor;
533 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100534
535 // Scrolling and dynamic state
536 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
537 int mFastScrollRectCurrentH; // current height of fastscroll rect
538 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100539 bool hasScroll; // indicates that we have enough items in the list to scroll
540 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
541 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
542 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 +0100543 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 +0100544 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
545 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
546 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
547 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
548 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500549 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 +0100550};
551
552class GUIFileSelector : public GUIScrollList
553{
554public:
555 GUIFileSelector(xml_node<>* node);
556 virtual ~GUIFileSelector();
557
558public:
559 // Update - Update any UI component animations (called <= 30 FPS)
560 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
561 virtual int Update(void);
562
563 // NotifyVarChange - Notify of a variable change
564 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
565
566 // SetPageFocus - Notify when a page gains or loses focus
567 virtual void SetPageFocus(int inFocus);
568
569 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100570 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100571 virtual void NotifySelect(size_t item_selected);
572
573protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200574 struct FileData {
575 std::string fileName;
576 unsigned char fileType; // Uses d_type format from struct dirent
577 mode_t protection; // Uses mode_t format from stat
578 uid_t userId;
579 gid_t groupId;
580 off_t fileSize;
581 time_t lastAccess; // Uses time_t format from stat
582 time_t lastModified; // Uses time_t format from stat
583 time_t lastStatChange; // Uses time_t format from stat
584 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400585
586protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200587 virtual int GetFileList(const std::string folder);
588 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400589
590protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200591 std::vector<FileData> mFolderList;
592 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100593 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600594 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100595 std::string mExtn; // used for filtering the file list, for example, *.zip
596 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
597 std::string mSortVariable; // data manager variable used to change the sorting of files
598 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
599 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
600 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)
601 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100602 ImageResource* mFolderIcon;
603 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600604 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400605};
606
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100607class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400608{
609public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200610 GUIListBox(xml_node<>* node);
611 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400612
613public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200614 // Update - Update any UI component animations (called <= 30 FPS)
615 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
616 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400617
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200618 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100619 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400620
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200621 // SetPageFocus - Notify when a page gains or loses focus
622 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400623
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100624 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100625 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100626 virtual void NotifySelect(size_t item_selected);
627
Dees_Troy51a0e822012-09-05 15:24:24 -0400628protected:
that8ab5c132015-09-13 23:00:54 +0200629 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200630 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500631 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400632 std::string variableValue;
633 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200634 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200635 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200636 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400637
638protected:
that8ab5c132015-09-13 23:00:54 +0200639 std::vector<ListItem> mListItems;
640 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200641 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400642 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100643 ImageResource* mIconSelected;
644 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500645 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600646 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400647};
648
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100649class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500650{
651public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200652 GUIPartitionList(xml_node<>* node);
653 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500654
655public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200656 // Update - Update any UI component animations (called <= 30 FPS)
657 // 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 +0100658 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500659
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200660 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100661 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500662
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200663 // SetPageFocus - Notify when a page gains or loses focus
664 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500665
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100666 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100667 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100668 virtual void NotifySelect(size_t item_selected);
669
Dees_Troya13d74f2013-03-24 08:54:55 -0500670protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100671 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600672 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500673
674protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200675 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500676 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200677 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500678 std::string selectedList;
679 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500680 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100681 ImageResource* mIconSelected;
682 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500683 bool updateList;
684};
685
Ethan Yonker44925ad2015-07-22 12:33:59 -0500686class GUITextBox : public GUIScrollList
687{
688public:
689 GUITextBox(xml_node<>* node);
690
691public:
692 // Update - Update any UI component animations (called <= 30 FPS)
693 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
694 virtual int Update(void);
695
696 // NotifyVarChange - Notify of a variable change
697 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
698
699 // ScrollList interface
700 virtual size_t GetItemCount();
701 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
702 virtual void NotifySelect(size_t item_selected);
703protected:
704
705 size_t mLastCount;
706 bool mIsStatic;
707 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
708 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
709 std::vector<std::string> rText; // Rendered text - what we actually see
710
711};
712
that8d46c092015-02-26 01:30:04 +0100713class GUIConsole : public GUIScrollList
714{
715public:
716 GUIConsole(xml_node<>* node);
717
718public:
719 // Render - Render the full object to the GL surface
720 // Return 0 on success, <0 on error
721 virtual int Render(void);
722
723 // Update - Update any UI component animations (called <= 30 FPS)
724 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
725 virtual int Update(void);
726
727 // IsInRegion - Checks if the request is handled by this object
728 // Return 1 if this object handles the request, 0 if not
729 virtual int IsInRegion(int x, int y);
730
731 // NotifyTouch - Notify of a touch event
732 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
733 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
734
735 // ScrollList interface
736 virtual size_t GetItemCount();
737 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
738 virtual void NotifySelect(size_t item_selected);
Ethan Yonker74db1572015-10-28 12:44:49 -0500739 static void Translate_Now();
that8d46c092015-02-26 01:30:04 +0100740protected:
741 enum SlideoutState
742 {
743 hidden = 0,
744 visible,
745 request_hide,
746 request_show
747 };
748
749 ImageResource* mSlideoutImage;
750 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
751 bool scrollToEnd; // true if we want to keep tracking the last line
752 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
753 int mSlideout;
754 SlideoutState mSlideoutState;
755 std::vector<std::string> rConsole;
756 std::vector<std::string> rConsoleColor;
757
758protected:
that8d46c092015-02-26 01:30:04 +0100759 int RenderSlideout(void);
760 int RenderConsole(void);
761};
762
that1964d192016-01-07 00:41:03 +0100763class TerminalEngine;
764class GUITerminal : public GUIScrollList, public InputObject
765{
766public:
767 GUITerminal(xml_node<>* node);
768
769public:
770 // Update - Update any UI component animations (called <= 30 FPS)
771 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
772 virtual int Update(void);
773
774 // NotifyTouch - Notify of a touch event
775 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
776 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
777
778 // NotifyKey - Notify of a key press
779 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
780 virtual int NotifyKey(int key, bool down);
781
782 // character input
783 virtual int NotifyCharInput(int ch);
784
785 // SetPageFocus - Notify when a page gains or loses focus
786 virtual void SetPageFocus(int inFocus);
787
788 // ScrollList interface
789 virtual size_t GetItemCount();
790 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
791 virtual void NotifySelect(size_t item_selected);
792protected:
793 void InitAndResize();
794
795 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
796 int updateCounter; // to track if anything changed in the back-end
797 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
798};
799
Dees_Troy51a0e822012-09-05 15:24:24 -0400800// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100801class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400802{
803public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200804 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400805
806public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200807 // Render - Render the full object to the GL surface
808 // Return 0 on success, <0 on error
809 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400810
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200811 // Update - Update any UI component animations (called <= 30 FPS)
812 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
813 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400814
815protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200816 AnimationResource* mAnimation;
817 int mFrame;
818 int mFPS;
819 int mLoop;
820 int mRender;
821 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400822};
823
Vojtech Bocekede51c52014-02-07 23:58:09 +0100824class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400825{
826public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200827 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400828
829public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200830 // Render - Render the full object to the GL surface
831 // Return 0 on success, <0 on error
832 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400833
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200834 // Update - Update any UI component animations (called <= 30 FPS)
835 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
836 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400837
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200838 // NotifyVarChange - Notify of a variable change
839 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100840 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400841
842protected:
thatf6ed8fc2015-02-14 20:23:16 +0100843 ImageResource* mEmptyBar;
844 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200845 std::string mMinValVar;
846 std::string mMaxValVar;
847 std::string mCurValVar;
848 float mSlide;
849 float mSlideInc;
850 int mSlideFrames;
851 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400852
853protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200854 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400855};
856
Vojtech Bocekede51c52014-02-07 23:58:09 +0100857class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400858{
859public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200860 GUISlider(xml_node<>* node);
861 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400862
863public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200864 // Render - Render the full object to the GL surface
865 // Return 0 on success, <0 on error
866 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400867
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200868 // Update - Update any UI component animations (called <= 30 FPS)
869 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
870 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400871
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200872 // NotifyTouch - Notify of a touch event
873 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
874 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400875
876protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200877 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600878 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100879 ImageResource* sSlider;
880 ImageResource* sSliderUsed;
881 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200882 int sTouchW, sTouchH;
883 int sCurTouchX;
884 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400885};
886
that8834a0f2016-01-05 23:29:30 +0100887// these are ASCII codes reported via NotifyCharInput
888// other special keys (arrows etc.) are reported via NotifyKey
889#define KEYBOARD_ACTION 13 // CR
890#define KEYBOARD_BACKSPACE 8 // Backspace
891#define KEYBOARD_TAB 9 // Tab
892#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
893#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400894
Vojtech Bocekede51c52014-02-07 23:58:09 +0100895class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400896{
897public:
898 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200899 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400900
901public:
902 virtual int Render(void);
903 virtual int Update(void);
904 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
905 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100906 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400907
908protected:
thate79878b2015-03-14 23:07:23 +0100909 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200910 {
that8834a0f2016-01-05 23:29:30 +0100911 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
912 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100913 int end_x;
914 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200915 };
thate79878b2015-03-14 23:07:23 +0100916 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200917 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200918 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100919 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100920
921 enum {
922 MAX_KEYBOARD_LAYOUTS = 5,
923 MAX_KEYBOARD_ROWS = 9,
924 MAX_KEYBOARD_KEYS = 20
925 };
926 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600927 {
thatd86f49d2015-03-15 00:56:57 +0100928 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100929 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100930 int row_end_y[MAX_KEYBOARD_ROWS];
931 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600932 int revert_layout;
933 };
thatd86f49d2015-03-15 00:56:57 +0100934 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400935
thatf256b722015-05-23 20:44:12 +0200936 struct KeyLabel
937 {
that8834a0f2016-01-05 23:29:30 +0100938 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200939 int layout_from; // 1-based; 0 for labels that apply to all layouts
940 int layout_to; // same as Key.layout
941 string text; // key label text
942 ImageResource* image; // image (overrides text if defined)
943 };
944 std::vector<KeyLabel> mKeyLabels;
945
thate79878b2015-03-14 23:07:23 +0100946 // Find key at screen coordinates
947 Key* HitTestKey(int x, int y);
948
Dees_Troy51a0e822012-09-05 15:24:24 -0400949 bool mRendered;
950 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100951 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100952 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100953 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 +0200954 int highlightRenderCount;
955 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100956 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400957 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600958 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100959 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200960 COLOR mFontColor; // for centered key labels
961 COLOR mFontColorSmall; // for centered key labels
962 FontResource* mFont; // for main key labels
963 FontResource* mSmallFont; // for key labels like "?123"
964 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200965 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200966 COLOR mLongpressFontColor;
967 COLOR mBackgroundColor; // keyboard background color
968 COLOR mKeyColorAlphanumeric; // key background color
969 COLOR mKeyColorOther; // key background color
970 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400971};
972
973// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100974class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400975{
976public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200977 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400978 virtual ~GUIInput();
979
980public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200981 // Render - Render the full object to the GL surface
982 // Return 0 on success, <0 on error
983 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400984
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200985 // Update - Update any UI component animations (called <= 30 FPS)
986 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
987 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400988
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200989 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100990 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400991
992 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200993 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
994 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400995
that8834a0f2016-01-05 23:29:30 +0100996 virtual int NotifyKey(int key, bool down);
997 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -0400998
999protected:
1000 virtual int GetSelection(int x, int y);
1001
1002 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001003 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001004 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001005 void HandleCursorByTouch(int x);
1006 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001007
1008protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001009 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001010 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001011 ImageResource* mBackground;
1012 ImageResource* mCursor;
1013 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001014 std::string mVariable;
1015 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001016 std::string mValue;
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;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001021 int cursorX; // actual x axis location of the cursor
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