blob: 6c6fa5eb00dcd62b1ef2dfcadd1bf44e7fcbcb80 [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
195 // Set number of characters to skip (for scrolling)
196 virtual int SkipCharCount(unsigned skip);
197
Dees_Troy4d12f962012-10-19 13:13:15 -0400198public:
199 bool isHighlighted;
Ethan Yonkerb7a54a32015-10-05 10:16:27 -0500200 bool scaleWidth;
201 unsigned maxWidth;
Dees_Troy4d12f962012-10-19 13:13:15 -0400202
Dees_Troy51a0e822012-09-05 15:24:24 -0400203protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200204 std::string mText;
205 std::string mLastValue;
206 COLOR mColor;
Dees_Troy4d12f962012-10-19 13:13:15 -0400207 COLOR mHighlightColor;
thatf6ed8fc2015-02-14 20:23:16 +0100208 FontResource* mFont;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200209 int mIsStatic;
210 int mVarChanged;
211 int mFontHeight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400212 unsigned charSkip;
Dees_Troy51a0e822012-09-05 15:24:24 -0400213};
214
215// GUIImage - Used for static image
Vojtech Bocekede51c52014-02-07 23:58:09 +0100216class GUIImage : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400217{
218public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200219 GUIImage(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400220
221public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200222 // Render - Render the full object to the GL surface
223 // Return 0 on success, <0 on error
224 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400225
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200226 // SetRenderPos - Update the position of the object
227 // Return 0 on success, <0 on error
228 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400229
Dees_Troy4d12f962012-10-19 13:13:15 -0400230public:
231 bool isHighlighted;
232
Dees_Troy51a0e822012-09-05 15:24:24 -0400233protected:
thatf6ed8fc2015-02-14 20:23:16 +0100234 ImageResource* mImage;
235 ImageResource* mHighlightImage;
Dees_Troy51a0e822012-09-05 15:24:24 -0400236};
237
238// GUIFill - Used for fill colors
Vojtech Bocekede51c52014-02-07 23:58:09 +0100239class GUIFill : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400240{
241public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200242 GUIFill(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400243
244public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200245 // Render - Render the full object to the GL surface
246 // Return 0 on success, <0 on error
247 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400248
249protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200250 COLOR mColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400251};
252
253// GUIAction - Used for standard actions
Vojtech Bocekede51c52014-02-07 23:58:09 +0100254class GUIAction : public GUIObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400255{
thatc6085482015-01-09 22:12:43 +0100256 friend class ActionThread;
257
Dees_Troy51a0e822012-09-05 15:24:24 -0400258public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200259 GUIAction(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400260
261public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200262 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100263 virtual int NotifyKey(int key, bool down);
Vojtech Bocek07220562014-02-08 02:05:33 +0100264 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
that3f7b1ac2014-12-30 11:30:13 +0100265
266 int doActions();
Dees_Troy51a0e822012-09-05 15:24:24 -0400267
268protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200269 class Action
270 {
271 public:
272 std::string mFunction;
273 std::string mArg;
274 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400275
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200276 std::vector<Action> mActions;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100277 std::map<int, bool> mKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400278
279protected:
that73a52952015-01-28 23:07:34 +0100280 enum ThreadType { THREAD_NONE, THREAD_ACTION, THREAD_CANCEL };
281
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200282 int getKeyByName(std::string key);
that3f7b1ac2014-12-30 11:30:13 +0100283 int doAction(Action action);
that73a52952015-01-28 23:07:34 +0100284 ThreadType getThreadType(const Action& action);
Dees_Troy51a0e822012-09-05 15:24:24 -0400285 void simulate_progress_bar(void);
Ethan Yonker0d47eb52015-01-09 11:23:19 -0600286 int flash_zip(std::string filename, int* wipe_cache);
thatcc8ddca2015-01-03 01:59:36 +0100287 void reinject_after_flash();
Dees_Troy51a0e822012-09-05 15:24:24 -0400288 void operation_start(const string operation_name);
that3f7b1ac2014-12-30 11:30:13 +0100289 void operation_end(const int operation_status);
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +0000290 time_t Start;
that3f7b1ac2014-12-30 11:30:13 +0100291
292 // map action name to function pointer
293 typedef int (GUIAction::*execFunction)(std::string);
294 typedef std::map<std::string, execFunction> mapFunc;
295 static mapFunc mf;
thatc6085482015-01-09 22:12:43 +0100296 static std::set<std::string> setActionsRunningInCallerThread;
that3f7b1ac2014-12-30 11:30:13 +0100297
298 // GUI actions
299 int reboot(std::string arg);
300 int home(std::string arg);
301 int key(std::string arg);
302 int page(std::string arg);
303 int reload(std::string arg);
304 int readBackup(std::string arg);
305 int set(std::string arg);
306 int clear(std::string arg);
307 int mount(std::string arg);
308 int unmount(std::string arg);
309 int restoredefaultsettings(std::string arg);
310 int copylog(std::string arg);
311 int compute(std::string arg);
312 int setguitimezone(std::string arg);
313 int overlay(std::string arg);
314 int queuezip(std::string arg);
315 int cancelzip(std::string arg);
316 int queueclear(std::string arg);
317 int sleep(std::string arg);
318 int appenddatetobackupname(std::string arg);
319 int generatebackupname(std::string arg);
320 int checkpartitionlist(std::string arg);
321 int getpartitiondetails(std::string arg);
322 int screenshot(std::string arg);
323 int setbrightness(std::string arg);
324
thatc6085482015-01-09 22:12:43 +0100325 // (originally) threaded actions
that3f7b1ac2014-12-30 11:30:13 +0100326 int fileexists(std::string arg);
327 int flash(std::string arg);
328 int wipe(std::string arg);
329 int refreshsizes(std::string arg);
330 int nandroid(std::string arg);
Ethan Yonkerb5fab762016-01-28 14:03:33 -0600331 int fixcontexts(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100332 int fixpermissions(std::string arg);
333 int dd(std::string arg);
334 int partitionsd(std::string arg);
335 int installhtcdumlock(std::string arg);
336 int htcdumlockrestoreboot(std::string arg);
337 int htcdumlockreflashrecovery(std::string arg);
338 int cmd(std::string arg);
339 int terminalcommand(std::string arg);
340 int killterminal(std::string arg);
341 int reinjecttwrp(std::string arg);
342 int checkbackupname(std::string arg);
343 int decrypt(std::string arg);
344 int adbsideload(std::string arg);
345 int adbsideloadcancel(std::string arg);
346 int openrecoveryscript(std::string arg);
347 int installsu(std::string arg);
348 int fixsu(std::string arg);
349 int decrypt_backup(std::string arg);
350 int repair(std::string arg);
Ethan Yonkera2719152015-05-28 09:44:41 -0500351 int resize(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100352 int changefilesystem(std::string arg);
353 int startmtp(std::string arg);
354 int stopmtp(std::string arg);
Ethan Yonker96af84a2015-01-05 14:58:36 -0600355 int flashimage(std::string arg);
bigbiff7abc5fe2015-01-17 16:53:12 -0500356 int cancelbackup(std::string arg);
Ethan Yonkereb32b1f2015-05-18 10:23:03 -0500357 int checkpartitionlifetimewrites(std::string arg);
358 int mountsystemtoggle(std::string arg);
Ethan Yonker74db1572015-10-28 12:44:49 -0500359 int setlanguage(std::string arg);
that10ae24f2015-12-26 20:53:51 +0100360 int twcmd(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
1004 virtual int HandleTextLocation(int x);
1005
1006protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001007 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001008 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001009 ImageResource* mBackground;
1010 ImageResource* mCursor;
1011 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001012 std::string mText;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001013 std::string mLastValue;
Dees_Troy51a0e822012-09-05 15:24:24 -04001014 std::string mVariable;
1015 std::string mMask;
1016 std::string mMaskVariable;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001017 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001018 COLOR mCursorColor;
1019 int scrollingX;
1020 int lastX;
1021 int mCursorLocation;
1022 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1023 int mFontY;
1024 unsigned skipChars;
1025 unsigned mFontHeight;
1026 unsigned CursorWidth;
1027 bool mRendered;
1028 bool HasMask;
1029 bool DrawCursor;
1030 bool isLocalChange;
1031 bool HasAllowed;
1032 bool HasDisabled;
1033 std::string AllowedList;
1034 std::string DisabledList;
1035 unsigned MinLen;
1036 unsigned MaxLen;
1037};
1038
1039class HardwareKeyboard
1040{
1041public:
thatf37aec22015-02-01 13:38:35 +01001042 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001043 virtual ~HardwareKeyboard();
1044
1045public:
thatf37aec22015-02-01 13:38:35 +01001046 // called by the input handler for key events
1047 int KeyDown(int key_code);
1048 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001049
thatf37aec22015-02-01 13:38:35 +01001050 // called by the input handler when holding a key down
1051 int KeyRepeat();
1052
1053 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001054 void ConsumeKeyRelease(int key);
1055
that8834a0f2016-01-05 23:29:30 +01001056 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001057private:
that8834a0f2016-01-05 23:29:30 +01001058 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001059 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001060 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001061};
1062
Vojtech Bocekede51c52014-02-07 23:58:09 +01001063class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001064{
1065public:
1066 GUISliderValue(xml_node<>* node);
1067 virtual ~GUISliderValue();
1068
1069public:
1070 // Render - Render the full object to the GL surface
1071 // Return 0 on success, <0 on error
1072 virtual int Render(void);
1073
1074 // Update - Update any UI component animations (called <= 30 FPS)
1075 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1076 virtual int Update(void);
1077
1078 // SetPos - Update the position of the render object
1079 // Return 0 on success, <0 on error
1080 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1081
1082 // NotifyTouch - Notify of a touch event
1083 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1084 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1085
1086 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001087 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001088
1089 // SetPageFocus - Notify when a page gains or loses focus
1090 virtual void SetPageFocus(int inFocus);
1091
1092protected:
1093 int measureText(const std::string& str);
1094 int valueFromPct(float pct);
1095 float pctFromValue(int value);
1096 void loadValue(bool force = false);
1097
1098 std::string mVariable;
1099 int mMax;
1100 int mMin;
1101 int mValue;
1102 char *mValueStr;
1103 float mValuePct;
1104 std::string mMaxStr;
1105 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001106 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001107 GUIText* mLabel;
1108 int mLabelW;
1109 COLOR mTextColor;
1110 COLOR mLineColor;
1111 COLOR mSliderColor;
1112 bool mShowRange;
1113 bool mShowCurr;
1114 int mLineX;
1115 int mLineY;
1116 int mLineH;
1117 int mLinePadding;
1118 int mPadding;
1119 int mSliderY;
1120 int mSliderW;
1121 int mSliderH;
1122 bool mRendered;
1123 int mFontHeight;
1124 GUIAction *mAction;
1125 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001126 int mLineW;
1127 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001128 ImageResource *mBackgroundImage;
1129 ImageResource *mHandleImage;
1130 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001131};
1132
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001133class MouseCursor : public RenderObject
1134{
1135public:
1136 MouseCursor(int posX, int posY);
1137 virtual ~MouseCursor();
1138
1139 virtual int Render(void);
1140 virtual int Update(void);
1141 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1142
1143 void Move(int deltaX, int deltaY);
1144 void GetPos(int& x, int& y);
1145 void LoadData(xml_node<>* node);
1146 void ResetData(int resX, int resY);
1147
1148private:
1149 int m_resX;
1150 int m_resY;
1151 bool m_moved;
1152 float m_speedMultiplier;
1153 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001154 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001155 bool m_present;
1156};
1157
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001158class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1159{
1160public:
1161 GUIPatternPassword(xml_node<>* node);
1162 virtual ~GUIPatternPassword();
1163
1164public:
1165 virtual int Render(void);
1166 virtual int Update(void);
1167 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001168 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001169 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1170
1171protected:
1172 void CalculateDotPositions();
1173 void ResetActiveDots();
1174 void ConnectDot(int dot_idx);
1175 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001176 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001177 int InDot(int x, int y);
1178 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001179 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001180 void PatternDrawn();
1181
1182 struct Dot {
1183 int x;
1184 int y;
1185 bool active;
1186 };
1187
Aleksa Saraib25a1832015-12-31 17:36:00 +01001188 std::string mSizeVar;
1189 size_t mGridSize;
1190
1191 Dot* mDots;
1192 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001193 size_t mConnectedDotsLen;
1194 int mCurLineX;
1195 int mCurLineY;
1196 bool mTrackingTouch;
1197 bool mNeedRender;
1198
1199 COLOR mDotColor;
1200 COLOR mActiveDotColor;
1201 COLOR mLineColor;
1202 ImageResource *mDotImage;
1203 ImageResource *mActiveDotImage;
1204 gr_surface mDotCircle;
1205 gr_surface mActiveDotCircle;
1206 int mDotRadius;
1207 int mLineWidth;
1208
1209 std::string mPassVar;
1210 GUIAction *mAction;
1211 int mUpdate;
1212};
1213
1214
Dees_Troy51a0e822012-09-05 15:24:24 -04001215// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001216xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001217std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1218int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1219int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1220int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001221COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001222COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1223FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1224ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1225AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
1226
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001227bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001228
1229#endif // _OBJECTS_HEADER
1230