blob: 8d4484aecfe1531d86a55863e7e409ea86fba05a [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);
Ethan Yonker1b190162016-12-05 15:25:19 -0600360 int setbootslot(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100361
362 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400363};
364
Vojtech Bocekede51c52014-02-07 23:58:09 +0100365class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400366{
367public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200368 GUIButton(xml_node<>* node);
369 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400370
371public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200372 // Render - Render the full object to the GL surface
373 // Return 0 on success, <0 on error
374 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400375
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200376 // Update - Update any UI component animations (called <= 30 FPS)
377 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
378 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400379
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200380 // SetPos - Update the position of the render object
381 // Return 0 on success, <0 on error
382 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400383
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200384 // NotifyTouch - Notify of a touch event
385 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
386 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400387
388protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200389 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100390 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200391 GUIText* mButtonLabel;
392 GUIAction* mAction;
393 int mTextX, mTextY, mTextW, mTextH;
394 int mIconX, mIconY, mIconW, mIconH;
395 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600396 bool hasHighlightColor;
397 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500398 bool hasFill;
399 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600400 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000401 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400402};
403
Vojtech Bocekede51c52014-02-07 23:58:09 +0100404class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400405{
406public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200407 GUICheckbox(xml_node<>* node);
408 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400409
410public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200411 // Render - Render the full object to the GL surface
412 // Return 0 on success, <0 on error
413 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400414
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200415 // Update - Update any UI component animations (called <= 30 FPS)
416 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
417 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400418
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200419 // SetPos - Update the position of the render object
420 // Return 0 on success, <0 on error
421 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400422
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200423 // NotifyTouch - Notify of a touch event
424 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
425 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400426
427protected:
thatf6ed8fc2015-02-14 20:23:16 +0100428 ImageResource* mChecked;
429 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200430 GUIText* mLabel;
431 int mTextX, mTextY;
432 int mCheckX, mCheckY, mCheckW, mCheckH;
433 int mLastState;
434 bool mRendered;
435 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400436};
437
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100438class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400439{
440public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100441 GUIScrollList(xml_node<>* node);
442 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400443
444public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200445 // Render - Render the full object to the GL surface
446 // Return 0 on success, <0 on error
447 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400448
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200449 // Update - Update any UI component animations (called <= 30 FPS)
450 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
451 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400452
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200453 // NotifyTouch - Notify of a touch event
454 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
455 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400456
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200457 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100458 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400459
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200460 // SetPos - Update the position of the render object
461 // Return 0 on success, <0 on error
462 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400463
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200464 // SetPageFocus - Notify when a page gains or loses focus
465 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400466
467protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100468 // derived classes need to implement these
469 // get number of items
470 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100471 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
472 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100473 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500474 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100475
that0af77952015-02-25 08:52:19 +0100476 // render a standard-layout list item with optional icon and text
477 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
478
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100479 enum { NO_ITEM = (size_t)-1 };
480 // returns item index at coordinates or NO_ITEM if there is no item there
481 size_t HitTestItem(int x, int y);
482
483 // 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
484 void SetMaxIconSize(int w, int h);
485
486 // This will make sure that the item indicated by list_index is visible on the screen
487 void SetVisibleListLocation(size_t list_index);
488
489 // Handle scrolling changes for drags and kinetic scrolling
490 void HandleScrolling();
491
that9876ac32015-02-15 21:40:59 +0100492 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100493 int GetDisplayItemCount();
494
495 // Returns the size in pixels of a partial item or row size
496 int GetDisplayRemainder();
497
498protected:
499 // Background
500 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100501 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100502
503 // Header
504 COLOR mHeaderBackgroundColor;
505 COLOR mHeaderFontColor;
506 std::string mHeaderText; // Original header text without parsing any variables
507 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100508 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100509 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100510 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100511 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
512 int mHeaderSeparatorH; // Height of the separator between header and list items
513 COLOR mHeaderSeparatorColor; // color of the header separator
514
515 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100516 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100517 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100518 bool hasHighlightColor; // indicates if a highlight color was set
519 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100520 COLOR mFontHighlightColor;
521 int mFontHeight;
522 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
523 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
524 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
525 int mSeparatorH; // Height of the separator between items
526 COLOR mSeparatorColor; // color of the separator that is between items
527
thata9998212015-02-19 22:51:24 +0100528 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100529 int mFastScrollW; // width of the fastscroll area
530 int mFastScrollLineW; // width of the line for fastscroll rendering
531 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100532 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100533 COLOR mFastScrollLineColor;
534 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100535
536 // Scrolling and dynamic state
537 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
538 int mFastScrollRectCurrentH; // current height of fastscroll rect
539 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100540 bool hasScroll; // indicates that we have enough items in the list to scroll
541 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
542 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
543 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 +0100544 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 +0100545 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
546 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
547 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
548 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
549 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500550 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 +0100551};
552
553class GUIFileSelector : public GUIScrollList
554{
555public:
556 GUIFileSelector(xml_node<>* node);
557 virtual ~GUIFileSelector();
558
559public:
560 // Update - Update any UI component animations (called <= 30 FPS)
561 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
562 virtual int Update(void);
563
564 // NotifyVarChange - Notify of a variable change
565 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
566
567 // SetPageFocus - Notify when a page gains or loses focus
568 virtual void SetPageFocus(int inFocus);
569
570 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100571 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100572 virtual void NotifySelect(size_t item_selected);
573
574protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200575 struct FileData {
576 std::string fileName;
577 unsigned char fileType; // Uses d_type format from struct dirent
578 mode_t protection; // Uses mode_t format from stat
579 uid_t userId;
580 gid_t groupId;
581 off_t fileSize;
582 time_t lastAccess; // Uses time_t format from stat
583 time_t lastModified; // Uses time_t format from stat
584 time_t lastStatChange; // Uses time_t format from stat
585 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400586
587protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200588 virtual int GetFileList(const std::string folder);
589 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400590
591protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200592 std::vector<FileData> mFolderList;
593 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100594 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600595 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100596 std::string mExtn; // used for filtering the file list, for example, *.zip
597 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
598 std::string mSortVariable; // data manager variable used to change the sorting of files
599 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
600 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
601 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)
602 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100603 ImageResource* mFolderIcon;
604 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600605 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400606};
607
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100608class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400609{
610public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200611 GUIListBox(xml_node<>* node);
612 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400613
614public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200615 // Update - Update any UI component animations (called <= 30 FPS)
616 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
617 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400618
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200619 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100620 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400621
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200622 // SetPageFocus - Notify when a page gains or loses focus
623 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400624
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100625 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100626 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100627 virtual void NotifySelect(size_t item_selected);
628
Dees_Troy51a0e822012-09-05 15:24:24 -0400629protected:
that8ab5c132015-09-13 23:00:54 +0200630 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200631 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500632 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400633 std::string variableValue;
634 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200635 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200636 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200637 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400638
639protected:
that8ab5c132015-09-13 23:00:54 +0200640 std::vector<ListItem> mListItems;
641 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200642 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400643 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100644 ImageResource* mIconSelected;
645 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500646 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600647 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400648};
649
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100650class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500651{
652public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200653 GUIPartitionList(xml_node<>* node);
654 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500655
656public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200657 // Update - Update any UI component animations (called <= 30 FPS)
658 // 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 +0100659 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500660
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200661 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100662 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500663
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200664 // SetPageFocus - Notify when a page gains or loses focus
665 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500666
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100667 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100668 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100669 virtual void NotifySelect(size_t item_selected);
670
Dees_Troya13d74f2013-03-24 08:54:55 -0500671protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100672 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600673 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500674
675protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200676 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500677 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200678 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500679 std::string selectedList;
680 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500681 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100682 ImageResource* mIconSelected;
683 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500684 bool updateList;
685};
686
Ethan Yonker44925ad2015-07-22 12:33:59 -0500687class GUITextBox : public GUIScrollList
688{
689public:
690 GUITextBox(xml_node<>* node);
691
692public:
693 // Update - Update any UI component animations (called <= 30 FPS)
694 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
695 virtual int Update(void);
696
697 // NotifyVarChange - Notify of a variable change
698 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
699
700 // ScrollList interface
701 virtual size_t GetItemCount();
702 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
703 virtual void NotifySelect(size_t item_selected);
704protected:
705
706 size_t mLastCount;
707 bool mIsStatic;
708 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
709 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
710 std::vector<std::string> rText; // Rendered text - what we actually see
711
712};
713
that8d46c092015-02-26 01:30:04 +0100714class GUIConsole : public GUIScrollList
715{
716public:
717 GUIConsole(xml_node<>* node);
718
719public:
720 // Render - Render the full object to the GL surface
721 // Return 0 on success, <0 on error
722 virtual int Render(void);
723
724 // Update - Update any UI component animations (called <= 30 FPS)
725 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
726 virtual int Update(void);
727
728 // IsInRegion - Checks if the request is handled by this object
729 // Return 1 if this object handles the request, 0 if not
730 virtual int IsInRegion(int x, int y);
731
732 // NotifyTouch - Notify of a touch event
733 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
734 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
735
736 // ScrollList interface
737 virtual size_t GetItemCount();
738 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
739 virtual void NotifySelect(size_t item_selected);
Ethan Yonker74db1572015-10-28 12:44:49 -0500740 static void Translate_Now();
that8d46c092015-02-26 01:30:04 +0100741protected:
742 enum SlideoutState
743 {
744 hidden = 0,
745 visible,
746 request_hide,
747 request_show
748 };
749
750 ImageResource* mSlideoutImage;
751 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
752 bool scrollToEnd; // true if we want to keep tracking the last line
753 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
754 int mSlideout;
755 SlideoutState mSlideoutState;
756 std::vector<std::string> rConsole;
757 std::vector<std::string> rConsoleColor;
758
759protected:
that8d46c092015-02-26 01:30:04 +0100760 int RenderSlideout(void);
761 int RenderConsole(void);
762};
763
that1964d192016-01-07 00:41:03 +0100764class TerminalEngine;
765class GUITerminal : public GUIScrollList, public InputObject
766{
767public:
768 GUITerminal(xml_node<>* node);
769
770public:
771 // Update - Update any UI component animations (called <= 30 FPS)
772 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
773 virtual int Update(void);
774
775 // NotifyTouch - Notify of a touch event
776 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
777 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
778
779 // NotifyKey - Notify of a key press
780 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
781 virtual int NotifyKey(int key, bool down);
782
783 // character input
784 virtual int NotifyCharInput(int ch);
785
786 // SetPageFocus - Notify when a page gains or loses focus
787 virtual void SetPageFocus(int inFocus);
788
789 // ScrollList interface
790 virtual size_t GetItemCount();
791 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
792 virtual void NotifySelect(size_t item_selected);
793protected:
794 void InitAndResize();
795
796 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
797 int updateCounter; // to track if anything changed in the back-end
798 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
799};
800
Dees_Troy51a0e822012-09-05 15:24:24 -0400801// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100802class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400803{
804public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200805 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400806
807public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200808 // Render - Render the full object to the GL surface
809 // Return 0 on success, <0 on error
810 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400811
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200812 // Update - Update any UI component animations (called <= 30 FPS)
813 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
814 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400815
816protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200817 AnimationResource* mAnimation;
818 int mFrame;
819 int mFPS;
820 int mLoop;
821 int mRender;
822 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400823};
824
Vojtech Bocekede51c52014-02-07 23:58:09 +0100825class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400826{
827public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200828 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400829
830public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200831 // Render - Render the full object to the GL surface
832 // Return 0 on success, <0 on error
833 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400834
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200835 // Update - Update any UI component animations (called <= 30 FPS)
836 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
837 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400838
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200839 // NotifyVarChange - Notify of a variable change
840 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100841 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400842
843protected:
thatf6ed8fc2015-02-14 20:23:16 +0100844 ImageResource* mEmptyBar;
845 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200846 std::string mMinValVar;
847 std::string mMaxValVar;
848 std::string mCurValVar;
849 float mSlide;
850 float mSlideInc;
851 int mSlideFrames;
852 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400853
854protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200855 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400856};
857
Vojtech Bocekede51c52014-02-07 23:58:09 +0100858class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400859{
860public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200861 GUISlider(xml_node<>* node);
862 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400863
864public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200865 // Render - Render the full object to the GL surface
866 // Return 0 on success, <0 on error
867 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400868
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200869 // Update - Update any UI component animations (called <= 30 FPS)
870 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
871 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400872
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200873 // NotifyTouch - Notify of a touch event
874 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
875 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400876
877protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200878 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600879 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100880 ImageResource* sSlider;
881 ImageResource* sSliderUsed;
882 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200883 int sTouchW, sTouchH;
884 int sCurTouchX;
885 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400886};
887
that8834a0f2016-01-05 23:29:30 +0100888// these are ASCII codes reported via NotifyCharInput
889// other special keys (arrows etc.) are reported via NotifyKey
890#define KEYBOARD_ACTION 13 // CR
891#define KEYBOARD_BACKSPACE 8 // Backspace
892#define KEYBOARD_TAB 9 // Tab
893#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
894#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400895
Vojtech Bocekede51c52014-02-07 23:58:09 +0100896class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400897{
898public:
899 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200900 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400901
902public:
903 virtual int Render(void);
904 virtual int Update(void);
905 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
906 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100907 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400908
909protected:
thate79878b2015-03-14 23:07:23 +0100910 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200911 {
that8834a0f2016-01-05 23:29:30 +0100912 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
913 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100914 int end_x;
915 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200916 };
thate79878b2015-03-14 23:07:23 +0100917 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200918 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200919 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100920 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100921
922 enum {
923 MAX_KEYBOARD_LAYOUTS = 5,
924 MAX_KEYBOARD_ROWS = 9,
925 MAX_KEYBOARD_KEYS = 20
926 };
927 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600928 {
thatd86f49d2015-03-15 00:56:57 +0100929 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100930 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100931 int row_end_y[MAX_KEYBOARD_ROWS];
932 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600933 int revert_layout;
934 };
thatd86f49d2015-03-15 00:56:57 +0100935 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400936
thatf256b722015-05-23 20:44:12 +0200937 struct KeyLabel
938 {
that8834a0f2016-01-05 23:29:30 +0100939 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200940 int layout_from; // 1-based; 0 for labels that apply to all layouts
941 int layout_to; // same as Key.layout
942 string text; // key label text
943 ImageResource* image; // image (overrides text if defined)
944 };
945 std::vector<KeyLabel> mKeyLabels;
946
thate79878b2015-03-14 23:07:23 +0100947 // Find key at screen coordinates
948 Key* HitTestKey(int x, int y);
949
Dees_Troy51a0e822012-09-05 15:24:24 -0400950 bool mRendered;
951 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100952 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100953 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100954 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 +0200955 int highlightRenderCount;
956 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100957 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400958 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600959 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100960 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200961 COLOR mFontColor; // for centered key labels
962 COLOR mFontColorSmall; // for centered key labels
963 FontResource* mFont; // for main key labels
964 FontResource* mSmallFont; // for key labels like "?123"
965 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200966 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200967 COLOR mLongpressFontColor;
968 COLOR mBackgroundColor; // keyboard background color
969 COLOR mKeyColorAlphanumeric; // key background color
970 COLOR mKeyColorOther; // key background color
971 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400972};
973
974// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100975class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400976{
977public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200978 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400979 virtual ~GUIInput();
980
981public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200982 // Render - Render the full object to the GL surface
983 // Return 0 on success, <0 on error
984 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400985
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200986 // Update - Update any UI component animations (called <= 30 FPS)
987 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
988 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400989
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200990 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100991 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400992
993 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200994 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
995 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400996
that8834a0f2016-01-05 23:29:30 +0100997 virtual int NotifyKey(int key, bool down);
998 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -0400999
1000protected:
1001 virtual int GetSelection(int x, int y);
1002
1003 // Handles displaying the text properly when chars are added, deleted, or for scrolling
Ethan Yonkera5db7122016-03-14 15:47:09 -05001004 void HandleTextLocation(int x);
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001005 void UpdateDisplayText();
Ethan Yonkera5db7122016-03-14 15:47:09 -05001006 void HandleCursorByTouch(int x);
1007 void HandleCursorByText();
Dees_Troy51a0e822012-09-05 15:24:24 -04001008
1009protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001010 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001011 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001012 ImageResource* mBackground;
1013 ImageResource* mCursor;
1014 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001015 std::string mVariable;
1016 std::string mMask;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001017 std::string mValue;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001018 std::string displayValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001019 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001020 COLOR mCursorColor;
1021 int scrollingX;
Sultan Qasim Khan14138d92016-04-04 04:11:25 -04001022 int cursorX; // actual x axis location of the cursor
Dees_Troy51a0e822012-09-05 15:24:24 -04001023 int lastX;
1024 int mCursorLocation;
1025 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1026 int mFontY;
Ethan Yonkera5db7122016-03-14 15:47:09 -05001027 int textWidth;
Dees_Troy51a0e822012-09-05 15:24:24 -04001028 unsigned mFontHeight;
1029 unsigned CursorWidth;
1030 bool mRendered;
1031 bool HasMask;
1032 bool DrawCursor;
1033 bool isLocalChange;
1034 bool HasAllowed;
1035 bool HasDisabled;
1036 std::string AllowedList;
1037 std::string DisabledList;
1038 unsigned MinLen;
1039 unsigned MaxLen;
1040};
1041
1042class HardwareKeyboard
1043{
1044public:
thatf37aec22015-02-01 13:38:35 +01001045 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001046 virtual ~HardwareKeyboard();
1047
1048public:
thatf37aec22015-02-01 13:38:35 +01001049 // called by the input handler for key events
1050 int KeyDown(int key_code);
1051 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001052
thatf37aec22015-02-01 13:38:35 +01001053 // called by the input handler when holding a key down
1054 int KeyRepeat();
1055
1056 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001057 void ConsumeKeyRelease(int key);
1058
that8834a0f2016-01-05 23:29:30 +01001059 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001060private:
that8834a0f2016-01-05 23:29:30 +01001061 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001062 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001063 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001064};
1065
Vojtech Bocekede51c52014-02-07 23:58:09 +01001066class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001067{
1068public:
1069 GUISliderValue(xml_node<>* node);
1070 virtual ~GUISliderValue();
1071
1072public:
1073 // Render - Render the full object to the GL surface
1074 // Return 0 on success, <0 on error
1075 virtual int Render(void);
1076
1077 // Update - Update any UI component animations (called <= 30 FPS)
1078 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1079 virtual int Update(void);
1080
1081 // SetPos - Update the position of the render object
1082 // Return 0 on success, <0 on error
1083 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1084
1085 // NotifyTouch - Notify of a touch event
1086 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1087 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1088
1089 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001090 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001091
1092 // SetPageFocus - Notify when a page gains or loses focus
1093 virtual void SetPageFocus(int inFocus);
1094
1095protected:
1096 int measureText(const std::string& str);
1097 int valueFromPct(float pct);
1098 float pctFromValue(int value);
1099 void loadValue(bool force = false);
1100
1101 std::string mVariable;
1102 int mMax;
1103 int mMin;
1104 int mValue;
1105 char *mValueStr;
1106 float mValuePct;
1107 std::string mMaxStr;
1108 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001109 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001110 GUIText* mLabel;
1111 int mLabelW;
1112 COLOR mTextColor;
1113 COLOR mLineColor;
1114 COLOR mSliderColor;
1115 bool mShowRange;
1116 bool mShowCurr;
1117 int mLineX;
1118 int mLineY;
1119 int mLineH;
1120 int mLinePadding;
1121 int mPadding;
1122 int mSliderY;
1123 int mSliderW;
1124 int mSliderH;
1125 bool mRendered;
1126 int mFontHeight;
1127 GUIAction *mAction;
1128 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001129 int mLineW;
1130 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001131 ImageResource *mBackgroundImage;
1132 ImageResource *mHandleImage;
1133 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001134};
1135
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001136class MouseCursor : public RenderObject
1137{
1138public:
1139 MouseCursor(int posX, int posY);
1140 virtual ~MouseCursor();
1141
1142 virtual int Render(void);
1143 virtual int Update(void);
1144 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1145
1146 void Move(int deltaX, int deltaY);
1147 void GetPos(int& x, int& y);
1148 void LoadData(xml_node<>* node);
1149 void ResetData(int resX, int resY);
1150
1151private:
1152 int m_resX;
1153 int m_resY;
1154 bool m_moved;
1155 float m_speedMultiplier;
1156 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001157 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001158 bool m_present;
1159};
1160
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001161class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1162{
1163public:
1164 GUIPatternPassword(xml_node<>* node);
1165 virtual ~GUIPatternPassword();
1166
1167public:
1168 virtual int Render(void);
1169 virtual int Update(void);
1170 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001171 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001172 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1173
1174protected:
1175 void CalculateDotPositions();
1176 void ResetActiveDots();
1177 void ConnectDot(int dot_idx);
1178 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001179 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001180 int InDot(int x, int y);
1181 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001182 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001183 void PatternDrawn();
1184
1185 struct Dot {
1186 int x;
1187 int y;
1188 bool active;
1189 };
1190
Aleksa Saraib25a1832015-12-31 17:36:00 +01001191 std::string mSizeVar;
1192 size_t mGridSize;
1193
1194 Dot* mDots;
1195 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001196 size_t mConnectedDotsLen;
1197 int mCurLineX;
1198 int mCurLineY;
1199 bool mTrackingTouch;
1200 bool mNeedRender;
1201
1202 COLOR mDotColor;
1203 COLOR mActiveDotColor;
1204 COLOR mLineColor;
1205 ImageResource *mDotImage;
1206 ImageResource *mActiveDotImage;
1207 gr_surface mDotCircle;
1208 gr_surface mActiveDotCircle;
1209 int mDotRadius;
1210 int mLineWidth;
1211
1212 std::string mPassVar;
1213 GUIAction *mAction;
1214 int mUpdate;
1215};
1216
1217
Dees_Troy51a0e822012-09-05 15:24:24 -04001218// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001219xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001220std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1221int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1222int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1223int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001224COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001225COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1226FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1227ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1228AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
1229
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001230bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001231
1232#endif // _OBJECTS_HEADER
1233