blob: d64a5fcfd5ffb2f26ac3af04004727cea6d99f05 [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
Ethan Yonker74db1572015-10-28 12:44:49 -050046struct translate_later_struct {
47 std::string resource_name; // Name of the string resource for looking up
48 std::string default_value; // Default in case we don't find the string resource
49 std::string color; // Color for the console... normal, highlight, warning, error
50 std::string format; // Formatted extra variables like %i, %s
51 std::string text; // Final, translated, formatted text
52 bool inline_format; // Indicates if the final text includes an inlined format variable
53};
54
Dees_Troy51a0e822012-09-05 15:24:24 -040055class RenderObject
56{
57public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020058 RenderObject() { mRenderX = 0; mRenderY = 0; mRenderW = 0; mRenderH = 0; mPlacement = TOP_LEFT; }
59 virtual ~RenderObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -040060
61public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020062 // Render - Render the full object to the GL surface
63 // Return 0 on success, <0 on error
64 virtual int Render(void) = 0;
Dees_Troy51a0e822012-09-05 15:24:24 -040065
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020066 // Update - Update any UI component animations (called <= 30 FPS)
67 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
68 virtual int Update(void) { return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040069
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020070 // GetRenderPos - Returns the current position of the object
71 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 -040072
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020073 // SetRenderPos - Update the position of the object
74 // Return 0 on success, <0 on error
75 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 -040076
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020077 // GetPlacement - Returns the current placement
78 virtual int GetPlacement(Placement& placement) { placement = mPlacement; return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040079
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020080 // SetPlacement - Update the current placement
81 virtual int SetPlacement(Placement placement) { mPlacement = placement; return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -040082
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020083 // SetPageFocus - Notify when a page gains or loses focus
that1964d192016-01-07 00:41:03 +010084 // TODO: This should be named NotifyPageFocus for consistency
Ethan Yonkerd0514ba2015-10-22 14:17:47 -050085 virtual void SetPageFocus(int inFocus __unused) { return; }
Dees_Troy51a0e822012-09-05 15:24:24 -040086
87protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020088 int mRenderX, mRenderY, mRenderW, mRenderH;
89 Placement mPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -040090};
91
92class ActionObject
93{
94public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020095 ActionObject() { mActionX = 0; mActionY = 0; mActionW = 0; mActionH = 0; }
96 virtual ~ActionObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -040097
98public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020099 // NotifyTouch - Notify of a touch event
100 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500101 virtual int NotifyTouch(TOUCH_STATE state __unused, int x __unused, int y __unused) { return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400102
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200103 // NotifyKey - Notify of a key press
104 // 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 -0500105 virtual int NotifyKey(int key __unused, bool down __unused) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400106
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200107 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 -0400108
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200109 // Return 0 on success, <0 on error
110 virtual int SetActionPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400111
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200112 // IsInRegion - Checks if the request is handled by this object
thatf8194e22015-01-29 01:05:01 +0100113 // Return 1 if this object handles the request, 0 if not
114 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 -0400115
Dees_Troy51a0e822012-09-05 15:24:24 -0400116protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200117 int mActionX, mActionY, mActionW, mActionH;
Dees_Troy51a0e822012-09-05 15:24:24 -0400118};
119
Vojtech Bocekede51c52014-02-07 23:58:09 +0100120class GUIObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400121{
122public:
Vojtech Bocekede51c52014-02-07 23:58:09 +0100123 GUIObject(xml_node<>* node);
124 virtual ~GUIObject();
Dees_Troy51a0e822012-09-05 15:24:24 -0400125
126public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200127 bool IsConditionVariable(std::string var);
128 bool isConditionTrue();
129 bool isConditionValid();
Vojtech Bocek07220562014-02-08 02:05:33 +0100130
131 // NotifyVarChange - Notify of a variable change
132 // Returns 0 on success, <0 on error
133 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400134
135protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200136 class Condition
137 {
138 public:
Vojtech Bocek07220562014-02-08 02:05:33 +0100139 Condition() {
140 mLastResult = true;
141 }
142
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200143 std::string mVar1;
144 std::string mVar2;
145 std::string mCompareOp;
146 std::string mLastVal;
Vojtech Bocek07220562014-02-08 02:05:33 +0100147 bool mLastResult;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200148 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400149
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200150 std::vector<Condition> mConditions;
Dees_Troy51a0e822012-09-05 15:24:24 -0400151
152protected:
that20fb95d2015-09-12 11:27:47 +0200153 static void LoadConditions(xml_node<>* node, std::vector<Condition>& conditions);
154 static bool isMounted(std::string vol);
155 static bool isConditionTrue(Condition* condition);
156 static bool UpdateConditions(std::vector<Condition>& conditions, const std::string& varName);
Vojtech Bocek07220562014-02-08 02:05:33 +0100157
158 bool mConditionsResult;
Dees_Troy51a0e822012-09-05 15:24:24 -0400159};
160
161class InputObject
162{
163public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200164 InputObject() { HasInputFocus = 0; }
165 virtual ~InputObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -0400166
167public:
that8834a0f2016-01-05 23:29:30 +0100168 // NotifyCharInput - Notify of character input (usually from the onscreen or hardware keyboard)
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200169 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
that8834a0f2016-01-05 23:29:30 +0100170 virtual int NotifyCharInput(int ch __unused) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400171
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200172 virtual int SetInputFocus(int focus) { HasInputFocus = focus; return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400173
174protected:
175 int HasInputFocus;
176};
177
178// Derived Objects
179// GUIText - Used for static text
Vojtech Bocekede51c52014-02-07 23:58:09 +0100180class GUIText : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400181{
182public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200183 // w and h may be ignored, in which case, no bounding box is applied
184 GUIText(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400185
186public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200187 // Render - Render the full object to the GL surface
188 // Return 0 on success, <0 on error
189 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400190
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200191 // Update - Update any UI component animations (called <= 30 FPS)
192 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
193 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400194
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200195 // Retrieve the size of the current string (dynamic strings may change per call)
196 virtual int GetCurrentBounds(int& w, int& h);
Dees_Troy51a0e822012-09-05 15:24:24 -0400197
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200198 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100199 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400200
201 // Set maximum width in pixels
202 virtual int SetMaxWidth(unsigned width);
203
204 // Set number of characters to skip (for scrolling)
205 virtual int SkipCharCount(unsigned skip);
206
Dees_Troy4d12f962012-10-19 13:13:15 -0400207public:
208 bool isHighlighted;
Ethan Yonkerb7a54a32015-10-05 10:16:27 -0500209 bool scaleWidth;
210 unsigned maxWidth;
Dees_Troy4d12f962012-10-19 13:13:15 -0400211
Dees_Troy51a0e822012-09-05 15:24:24 -0400212protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200213 std::string mText;
214 std::string mLastValue;
215 COLOR mColor;
Dees_Troy4d12f962012-10-19 13:13:15 -0400216 COLOR mHighlightColor;
thatf6ed8fc2015-02-14 20:23:16 +0100217 FontResource* mFont;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200218 int mIsStatic;
219 int mVarChanged;
220 int mFontHeight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400221 unsigned charSkip;
Dees_Troy51a0e822012-09-05 15:24:24 -0400222};
223
224// GUIImage - Used for static image
Vojtech Bocekede51c52014-02-07 23:58:09 +0100225class GUIImage : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400226{
227public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200228 GUIImage(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400229
230public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200231 // Render - Render the full object to the GL surface
232 // Return 0 on success, <0 on error
233 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400234
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200235 // SetRenderPos - Update the position of the object
236 // Return 0 on success, <0 on error
237 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400238
Dees_Troy4d12f962012-10-19 13:13:15 -0400239public:
240 bool isHighlighted;
241
Dees_Troy51a0e822012-09-05 15:24:24 -0400242protected:
thatf6ed8fc2015-02-14 20:23:16 +0100243 ImageResource* mImage;
244 ImageResource* mHighlightImage;
Dees_Troy51a0e822012-09-05 15:24:24 -0400245};
246
247// GUIFill - Used for fill colors
Vojtech Bocekede51c52014-02-07 23:58:09 +0100248class GUIFill : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400249{
250public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200251 GUIFill(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400252
253public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200254 // Render - Render the full object to the GL surface
255 // Return 0 on success, <0 on error
256 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400257
258protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200259 COLOR mColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400260};
261
262// GUIAction - Used for standard actions
Vojtech Bocekede51c52014-02-07 23:58:09 +0100263class GUIAction : public GUIObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400264{
thatc6085482015-01-09 22:12:43 +0100265 friend class ActionThread;
266
Dees_Troy51a0e822012-09-05 15:24:24 -0400267public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200268 GUIAction(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400269
270public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200271 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100272 virtual int NotifyKey(int key, bool down);
Vojtech Bocek07220562014-02-08 02:05:33 +0100273 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
that3f7b1ac2014-12-30 11:30:13 +0100274
275 int doActions();
Dees_Troy51a0e822012-09-05 15:24:24 -0400276
277protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200278 class Action
279 {
280 public:
281 std::string mFunction;
282 std::string mArg;
283 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400284
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200285 std::vector<Action> mActions;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100286 std::map<int, bool> mKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400287
288protected:
that73a52952015-01-28 23:07:34 +0100289 enum ThreadType { THREAD_NONE, THREAD_ACTION, THREAD_CANCEL };
290
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200291 int getKeyByName(std::string key);
that3f7b1ac2014-12-30 11:30:13 +0100292 int doAction(Action action);
that73a52952015-01-28 23:07:34 +0100293 ThreadType getThreadType(const Action& action);
Dees_Troy51a0e822012-09-05 15:24:24 -0400294 void simulate_progress_bar(void);
Ethan Yonker0d47eb52015-01-09 11:23:19 -0600295 int flash_zip(std::string filename, int* wipe_cache);
thatcc8ddca2015-01-03 01:59:36 +0100296 void reinject_after_flash();
Dees_Troy51a0e822012-09-05 15:24:24 -0400297 void operation_start(const string operation_name);
that3f7b1ac2014-12-30 11:30:13 +0100298 void operation_end(const int operation_status);
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +0000299 time_t Start;
that3f7b1ac2014-12-30 11:30:13 +0100300
301 // map action name to function pointer
302 typedef int (GUIAction::*execFunction)(std::string);
303 typedef std::map<std::string, execFunction> mapFunc;
304 static mapFunc mf;
thatc6085482015-01-09 22:12:43 +0100305 static std::set<std::string> setActionsRunningInCallerThread;
that3f7b1ac2014-12-30 11:30:13 +0100306
307 // GUI actions
308 int reboot(std::string arg);
309 int home(std::string arg);
310 int key(std::string arg);
311 int page(std::string arg);
312 int reload(std::string arg);
313 int readBackup(std::string arg);
314 int set(std::string arg);
315 int clear(std::string arg);
316 int mount(std::string arg);
317 int unmount(std::string arg);
318 int restoredefaultsettings(std::string arg);
319 int copylog(std::string arg);
320 int compute(std::string arg);
321 int setguitimezone(std::string arg);
322 int overlay(std::string arg);
323 int queuezip(std::string arg);
324 int cancelzip(std::string arg);
325 int queueclear(std::string arg);
326 int sleep(std::string arg);
327 int appenddatetobackupname(std::string arg);
328 int generatebackupname(std::string arg);
329 int checkpartitionlist(std::string arg);
330 int getpartitiondetails(std::string arg);
331 int screenshot(std::string arg);
332 int setbrightness(std::string arg);
333
thatc6085482015-01-09 22:12:43 +0100334 // (originally) threaded actions
that3f7b1ac2014-12-30 11:30:13 +0100335 int fileexists(std::string arg);
336 int flash(std::string arg);
337 int wipe(std::string arg);
338 int refreshsizes(std::string arg);
339 int nandroid(std::string arg);
Ethan Yonkerb5fab762016-01-28 14:03:33 -0600340 int fixcontexts(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100341 int fixpermissions(std::string arg);
342 int dd(std::string arg);
343 int partitionsd(std::string arg);
344 int installhtcdumlock(std::string arg);
345 int htcdumlockrestoreboot(std::string arg);
346 int htcdumlockreflashrecovery(std::string arg);
347 int cmd(std::string arg);
348 int terminalcommand(std::string arg);
349 int killterminal(std::string arg);
350 int reinjecttwrp(std::string arg);
351 int checkbackupname(std::string arg);
352 int decrypt(std::string arg);
353 int adbsideload(std::string arg);
354 int adbsideloadcancel(std::string arg);
355 int openrecoveryscript(std::string arg);
356 int installsu(std::string arg);
357 int fixsu(std::string arg);
358 int decrypt_backup(std::string arg);
359 int repair(std::string arg);
Ethan Yonkera2719152015-05-28 09:44:41 -0500360 int resize(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100361 int changefilesystem(std::string arg);
362 int startmtp(std::string arg);
363 int stopmtp(std::string arg);
Ethan Yonker96af84a2015-01-05 14:58:36 -0600364 int flashimage(std::string arg);
bigbiff7abc5fe2015-01-17 16:53:12 -0500365 int cancelbackup(std::string arg);
Ethan Yonkereb32b1f2015-05-18 10:23:03 -0500366 int checkpartitionlifetimewrites(std::string arg);
367 int mountsystemtoggle(std::string arg);
Ethan Yonker74db1572015-10-28 12:44:49 -0500368 int setlanguage(std::string arg);
that10ae24f2015-12-26 20:53:51 +0100369 int twcmd(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100370
371 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400372};
373
Vojtech Bocekede51c52014-02-07 23:58:09 +0100374class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400375{
376public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200377 GUIButton(xml_node<>* node);
378 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400379
380public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200381 // Render - Render the full object to the GL surface
382 // Return 0 on success, <0 on error
383 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400384
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200385 // Update - Update any UI component animations (called <= 30 FPS)
386 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
387 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400388
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200389 // SetPos - Update the position of the render object
390 // Return 0 on success, <0 on error
391 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400392
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200393 // NotifyTouch - Notify of a touch event
394 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
395 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400396
397protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200398 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100399 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200400 GUIText* mButtonLabel;
401 GUIAction* mAction;
402 int mTextX, mTextY, mTextW, mTextH;
403 int mIconX, mIconY, mIconW, mIconH;
404 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600405 bool hasHighlightColor;
406 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500407 bool hasFill;
408 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600409 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000410 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400411};
412
Vojtech Bocekede51c52014-02-07 23:58:09 +0100413class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400414{
415public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200416 GUICheckbox(xml_node<>* node);
417 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400418
419public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200420 // Render - Render the full object to the GL surface
421 // Return 0 on success, <0 on error
422 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400423
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200424 // Update - Update any UI component animations (called <= 30 FPS)
425 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
426 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400427
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200428 // SetPos - Update the position of the render object
429 // Return 0 on success, <0 on error
430 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400431
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200432 // NotifyTouch - Notify of a touch event
433 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
434 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400435
436protected:
thatf6ed8fc2015-02-14 20:23:16 +0100437 ImageResource* mChecked;
438 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200439 GUIText* mLabel;
440 int mTextX, mTextY;
441 int mCheckX, mCheckY, mCheckW, mCheckH;
442 int mLastState;
443 bool mRendered;
444 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400445};
446
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100447class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400448{
449public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100450 GUIScrollList(xml_node<>* node);
451 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400452
453public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200454 // Render - Render the full object to the GL surface
455 // Return 0 on success, <0 on error
456 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400457
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200458 // Update - Update any UI component animations (called <= 30 FPS)
459 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
460 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400461
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200462 // NotifyTouch - Notify of a touch event
463 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
464 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400465
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200466 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100467 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400468
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200469 // SetPos - Update the position of the render object
470 // Return 0 on success, <0 on error
471 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400472
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200473 // SetPageFocus - Notify when a page gains or loses focus
474 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400475
476protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100477 // derived classes need to implement these
478 // get number of items
479 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100480 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
481 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100482 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500483 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100484
that0af77952015-02-25 08:52:19 +0100485 // render a standard-layout list item with optional icon and text
486 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
487
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100488 enum { NO_ITEM = (size_t)-1 };
489 // returns item index at coordinates or NO_ITEM if there is no item there
490 size_t HitTestItem(int x, int y);
491
492 // 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
493 void SetMaxIconSize(int w, int h);
494
495 // This will make sure that the item indicated by list_index is visible on the screen
496 void SetVisibleListLocation(size_t list_index);
497
498 // Handle scrolling changes for drags and kinetic scrolling
499 void HandleScrolling();
500
that9876ac32015-02-15 21:40:59 +0100501 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100502 int GetDisplayItemCount();
503
504 // Returns the size in pixels of a partial item or row size
505 int GetDisplayRemainder();
506
507protected:
508 // Background
509 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100510 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100511
512 // Header
513 COLOR mHeaderBackgroundColor;
514 COLOR mHeaderFontColor;
515 std::string mHeaderText; // Original header text without parsing any variables
516 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100517 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100518 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100519 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100520 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
521 int mHeaderSeparatorH; // Height of the separator between header and list items
522 COLOR mHeaderSeparatorColor; // color of the header separator
523
524 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100525 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100526 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100527 bool hasHighlightColor; // indicates if a highlight color was set
528 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100529 COLOR mFontHighlightColor;
530 int mFontHeight;
531 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
532 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
533 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
534 int mSeparatorH; // Height of the separator between items
535 COLOR mSeparatorColor; // color of the separator that is between items
536
thata9998212015-02-19 22:51:24 +0100537 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100538 int mFastScrollW; // width of the fastscroll area
539 int mFastScrollLineW; // width of the line for fastscroll rendering
540 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100541 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100542 COLOR mFastScrollLineColor;
543 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100544
545 // Scrolling and dynamic state
546 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
547 int mFastScrollRectCurrentH; // current height of fastscroll rect
548 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100549 bool hasScroll; // indicates that we have enough items in the list to scroll
550 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
551 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
552 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 +0100553 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 +0100554 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
555 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
556 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
557 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
558 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500559 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 +0100560};
561
562class GUIFileSelector : public GUIScrollList
563{
564public:
565 GUIFileSelector(xml_node<>* node);
566 virtual ~GUIFileSelector();
567
568public:
569 // Update - Update any UI component animations (called <= 30 FPS)
570 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
571 virtual int Update(void);
572
573 // NotifyVarChange - Notify of a variable change
574 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
575
576 // SetPageFocus - Notify when a page gains or loses focus
577 virtual void SetPageFocus(int inFocus);
578
579 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100580 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100581 virtual void NotifySelect(size_t item_selected);
582
583protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200584 struct FileData {
585 std::string fileName;
586 unsigned char fileType; // Uses d_type format from struct dirent
587 mode_t protection; // Uses mode_t format from stat
588 uid_t userId;
589 gid_t groupId;
590 off_t fileSize;
591 time_t lastAccess; // Uses time_t format from stat
592 time_t lastModified; // Uses time_t format from stat
593 time_t lastStatChange; // Uses time_t format from stat
594 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400595
596protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200597 virtual int GetFileList(const std::string folder);
598 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400599
600protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200601 std::vector<FileData> mFolderList;
602 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100603 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600604 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100605 std::string mExtn; // used for filtering the file list, for example, *.zip
606 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
607 std::string mSortVariable; // data manager variable used to change the sorting of files
608 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
609 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
610 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)
611 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100612 ImageResource* mFolderIcon;
613 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600614 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400615};
616
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100617class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400618{
619public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200620 GUIListBox(xml_node<>* node);
621 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400622
623public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200624 // Update - Update any UI component animations (called <= 30 FPS)
625 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
626 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400627
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200628 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100629 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400630
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200631 // SetPageFocus - Notify when a page gains or loses focus
632 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400633
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100634 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100635 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100636 virtual void NotifySelect(size_t item_selected);
637
Dees_Troy51a0e822012-09-05 15:24:24 -0400638protected:
that8ab5c132015-09-13 23:00:54 +0200639 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200640 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500641 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400642 std::string variableValue;
643 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200644 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200645 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200646 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400647
648protected:
that8ab5c132015-09-13 23:00:54 +0200649 std::vector<ListItem> mListItems;
650 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200651 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400652 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100653 ImageResource* mIconSelected;
654 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500655 bool isCheckList;
Ethan Yonkerdedbb7f2016-01-17 18:17:38 -0600656 bool isTextParsed;
Dees_Troy51a0e822012-09-05 15:24:24 -0400657};
658
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100659class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500660{
661public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200662 GUIPartitionList(xml_node<>* node);
663 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500664
665public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200666 // Update - Update any UI component animations (called <= 30 FPS)
667 // 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 +0100668 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500669
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200670 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100671 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500672
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200673 // SetPageFocus - Notify when a page gains or loses focus
674 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500675
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100676 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100677 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100678 virtual void NotifySelect(size_t item_selected);
679
Dees_Troya13d74f2013-03-24 08:54:55 -0500680protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100681 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600682 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500683
684protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200685 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500686 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200687 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500688 std::string selectedList;
689 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500690 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100691 ImageResource* mIconSelected;
692 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500693 bool updateList;
694};
695
Ethan Yonker44925ad2015-07-22 12:33:59 -0500696class GUITextBox : public GUIScrollList
697{
698public:
699 GUITextBox(xml_node<>* node);
700
701public:
702 // Update - Update any UI component animations (called <= 30 FPS)
703 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
704 virtual int Update(void);
705
706 // NotifyVarChange - Notify of a variable change
707 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
708
709 // ScrollList interface
710 virtual size_t GetItemCount();
711 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
712 virtual void NotifySelect(size_t item_selected);
713protected:
714
715 size_t mLastCount;
716 bool mIsStatic;
717 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
718 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
719 std::vector<std::string> rText; // Rendered text - what we actually see
720
721};
722
that8d46c092015-02-26 01:30:04 +0100723class GUIConsole : public GUIScrollList
724{
725public:
726 GUIConsole(xml_node<>* node);
727
728public:
729 // Render - Render the full object to the GL surface
730 // Return 0 on success, <0 on error
731 virtual int Render(void);
732
733 // Update - Update any UI component animations (called <= 30 FPS)
734 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
735 virtual int Update(void);
736
737 // IsInRegion - Checks if the request is handled by this object
738 // Return 1 if this object handles the request, 0 if not
739 virtual int IsInRegion(int x, int y);
740
741 // NotifyTouch - Notify of a touch event
742 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
743 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
744
745 // ScrollList interface
746 virtual size_t GetItemCount();
747 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
748 virtual void NotifySelect(size_t item_selected);
Ethan Yonker74db1572015-10-28 12:44:49 -0500749 static void Translate_Now();
that8d46c092015-02-26 01:30:04 +0100750protected:
751 enum SlideoutState
752 {
753 hidden = 0,
754 visible,
755 request_hide,
756 request_show
757 };
758
759 ImageResource* mSlideoutImage;
760 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
761 bool scrollToEnd; // true if we want to keep tracking the last line
762 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
763 int mSlideout;
764 SlideoutState mSlideoutState;
765 std::vector<std::string> rConsole;
766 std::vector<std::string> rConsoleColor;
767
768protected:
that8d46c092015-02-26 01:30:04 +0100769 int RenderSlideout(void);
770 int RenderConsole(void);
771};
772
that1964d192016-01-07 00:41:03 +0100773class TerminalEngine;
774class GUITerminal : public GUIScrollList, public InputObject
775{
776public:
777 GUITerminal(xml_node<>* node);
778
779public:
780 // Update - Update any UI component animations (called <= 30 FPS)
781 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
782 virtual int Update(void);
783
784 // NotifyTouch - Notify of a touch event
785 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
786 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
787
788 // NotifyKey - Notify of a key press
789 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
790 virtual int NotifyKey(int key, bool down);
791
792 // character input
793 virtual int NotifyCharInput(int ch);
794
795 // SetPageFocus - Notify when a page gains or loses focus
796 virtual void SetPageFocus(int inFocus);
797
798 // ScrollList interface
799 virtual size_t GetItemCount();
800 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
801 virtual void NotifySelect(size_t item_selected);
802protected:
803 void InitAndResize();
804
805 TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
806 int updateCounter; // to track if anything changed in the back-end
807 bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
808};
809
Dees_Troy51a0e822012-09-05 15:24:24 -0400810// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100811class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400812{
813public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200814 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400815
816public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200817 // Render - Render the full object to the GL surface
818 // Return 0 on success, <0 on error
819 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400820
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200821 // Update - Update any UI component animations (called <= 30 FPS)
822 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
823 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400824
825protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200826 AnimationResource* mAnimation;
827 int mFrame;
828 int mFPS;
829 int mLoop;
830 int mRender;
831 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400832};
833
Vojtech Bocekede51c52014-02-07 23:58:09 +0100834class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400835{
836public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200837 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400838
839public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200840 // Render - Render the full object to the GL surface
841 // Return 0 on success, <0 on error
842 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400843
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200844 // Update - Update any UI component animations (called <= 30 FPS)
845 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
846 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400847
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200848 // NotifyVarChange - Notify of a variable change
849 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100850 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400851
852protected:
thatf6ed8fc2015-02-14 20:23:16 +0100853 ImageResource* mEmptyBar;
854 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200855 std::string mMinValVar;
856 std::string mMaxValVar;
857 std::string mCurValVar;
858 float mSlide;
859 float mSlideInc;
860 int mSlideFrames;
861 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400862
863protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200864 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400865};
866
Vojtech Bocekede51c52014-02-07 23:58:09 +0100867class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400868{
869public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200870 GUISlider(xml_node<>* node);
871 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400872
873public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200874 // Render - Render the full object to the GL surface
875 // Return 0 on success, <0 on error
876 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400877
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200878 // Update - Update any UI component animations (called <= 30 FPS)
879 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
880 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400881
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200882 // NotifyTouch - Notify of a touch event
883 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
884 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400885
886protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200887 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600888 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100889 ImageResource* sSlider;
890 ImageResource* sSliderUsed;
891 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200892 int sTouchW, sTouchH;
893 int sCurTouchX;
894 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400895};
896
that8834a0f2016-01-05 23:29:30 +0100897// these are ASCII codes reported via NotifyCharInput
898// other special keys (arrows etc.) are reported via NotifyKey
899#define KEYBOARD_ACTION 13 // CR
900#define KEYBOARD_BACKSPACE 8 // Backspace
901#define KEYBOARD_TAB 9 // Tab
902#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
903#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
Dees_Troy51a0e822012-09-05 15:24:24 -0400904
Vojtech Bocekede51c52014-02-07 23:58:09 +0100905class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400906{
907public:
908 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200909 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400910
911public:
912 virtual int Render(void);
913 virtual int Update(void);
914 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
915 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
that8834a0f2016-01-05 23:29:30 +0100916 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400917
918protected:
thate79878b2015-03-14 23:07:23 +0100919 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200920 {
that8834a0f2016-01-05 23:29:30 +0100921 int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
922 int longpresskey;
that1a7ba972015-02-01 19:48:19 +0100923 int end_x;
924 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200925 };
thate79878b2015-03-14 23:07:23 +0100926 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200927 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200928 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
that8834a0f2016-01-05 23:29:30 +0100929 int KeyCharToCtrlChar(int key);
thatd86f49d2015-03-15 00:56:57 +0100930
931 enum {
932 MAX_KEYBOARD_LAYOUTS = 5,
933 MAX_KEYBOARD_ROWS = 9,
934 MAX_KEYBOARD_KEYS = 20
935 };
936 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600937 {
thatd86f49d2015-03-15 00:56:57 +0100938 ImageResource* keyboardImg;
that8834a0f2016-01-05 23:29:30 +0100939 Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
thatd86f49d2015-03-15 00:56:57 +0100940 int row_end_y[MAX_KEYBOARD_ROWS];
941 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600942 int revert_layout;
943 };
thatd86f49d2015-03-15 00:56:57 +0100944 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400945
thatf256b722015-05-23 20:44:12 +0200946 struct KeyLabel
947 {
that8834a0f2016-01-05 23:29:30 +0100948 int key; // same as in struct Key
thatf256b722015-05-23 20:44:12 +0200949 int layout_from; // 1-based; 0 for labels that apply to all layouts
950 int layout_to; // same as Key.layout
951 string text; // key label text
952 ImageResource* image; // image (overrides text if defined)
953 };
954 std::vector<KeyLabel> mKeyLabels;
955
thate79878b2015-03-14 23:07:23 +0100956 // Find key at screen coordinates
957 Key* HitTestKey(int x, int y);
958
Dees_Troy51a0e822012-09-05 15:24:24 -0400959 bool mRendered;
960 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100961 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100962 bool CapsLockOn;
that8834a0f2016-01-05 23:29:30 +0100963 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 +0200964 int highlightRenderCount;
965 Key* currentKey;
that8834a0f2016-01-05 23:29:30 +0100966 bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400967 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600968 COLOR mCapsHighlightColor;
that8834a0f2016-01-05 23:29:30 +0100969 COLOR mCtrlHighlightColor;
thatf256b722015-05-23 20:44:12 +0200970 COLOR mFontColor; // for centered key labels
971 COLOR mFontColorSmall; // for centered key labels
972 FontResource* mFont; // for main key labels
973 FontResource* mSmallFont; // for key labels like "?123"
974 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200975 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200976 COLOR mLongpressFontColor;
977 COLOR mBackgroundColor; // keyboard background color
978 COLOR mKeyColorAlphanumeric; // key background color
979 COLOR mKeyColorOther; // key background color
980 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400981};
982
983// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100984class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400985{
986public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200987 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400988 virtual ~GUIInput();
989
990public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200991 // Render - Render the full object to the GL surface
992 // Return 0 on success, <0 on error
993 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400994
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200995 // Update - Update any UI component animations (called <= 30 FPS)
996 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
997 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400998
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200999 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001000 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -04001001
1002 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001003 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1004 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -04001005
that8834a0f2016-01-05 23:29:30 +01001006 virtual int NotifyKey(int key, bool down);
1007 virtual int NotifyCharInput(int ch);
Dees_Troy51a0e822012-09-05 15:24:24 -04001008
1009protected:
1010 virtual int GetSelection(int x, int y);
1011
1012 // Handles displaying the text properly when chars are added, deleted, or for scrolling
1013 virtual int HandleTextLocation(int x);
1014
1015protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001016 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -04001017 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +01001018 ImageResource* mBackground;
1019 ImageResource* mCursor;
1020 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -04001021 std::string mText;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001022 std::string mLastValue;
Dees_Troy51a0e822012-09-05 15:24:24 -04001023 std::string mVariable;
1024 std::string mMask;
1025 std::string mMaskVariable;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +02001026 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -04001027 COLOR mCursorColor;
1028 int scrollingX;
1029 int lastX;
1030 int mCursorLocation;
1031 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
1032 int mFontY;
1033 unsigned skipChars;
1034 unsigned mFontHeight;
1035 unsigned CursorWidth;
1036 bool mRendered;
1037 bool HasMask;
1038 bool DrawCursor;
1039 bool isLocalChange;
1040 bool HasAllowed;
1041 bool HasDisabled;
1042 std::string AllowedList;
1043 std::string DisabledList;
1044 unsigned MinLen;
1045 unsigned MaxLen;
1046};
1047
1048class HardwareKeyboard
1049{
1050public:
thatf37aec22015-02-01 13:38:35 +01001051 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001052 virtual ~HardwareKeyboard();
1053
1054public:
thatf37aec22015-02-01 13:38:35 +01001055 // called by the input handler for key events
1056 int KeyDown(int key_code);
1057 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001058
thatf37aec22015-02-01 13:38:35 +01001059 // called by the input handler when holding a key down
1060 int KeyRepeat();
1061
1062 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001063 void ConsumeKeyRelease(int key);
1064
that8834a0f2016-01-05 23:29:30 +01001065 bool IsKeyDown(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001066private:
that8834a0f2016-01-05 23:29:30 +01001067 int mLastKey;
thatf37aec22015-02-01 13:38:35 +01001068 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001069 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001070};
1071
Vojtech Bocekede51c52014-02-07 23:58:09 +01001072class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001073{
1074public:
1075 GUISliderValue(xml_node<>* node);
1076 virtual ~GUISliderValue();
1077
1078public:
1079 // Render - Render the full object to the GL surface
1080 // Return 0 on success, <0 on error
1081 virtual int Render(void);
1082
1083 // Update - Update any UI component animations (called <= 30 FPS)
1084 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1085 virtual int Update(void);
1086
1087 // SetPos - Update the position of the render object
1088 // Return 0 on success, <0 on error
1089 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1090
1091 // NotifyTouch - Notify of a touch event
1092 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1093 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1094
1095 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001096 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001097
1098 // SetPageFocus - Notify when a page gains or loses focus
1099 virtual void SetPageFocus(int inFocus);
1100
1101protected:
1102 int measureText(const std::string& str);
1103 int valueFromPct(float pct);
1104 float pctFromValue(int value);
1105 void loadValue(bool force = false);
1106
1107 std::string mVariable;
1108 int mMax;
1109 int mMin;
1110 int mValue;
1111 char *mValueStr;
1112 float mValuePct;
1113 std::string mMaxStr;
1114 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001115 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001116 GUIText* mLabel;
1117 int mLabelW;
1118 COLOR mTextColor;
1119 COLOR mLineColor;
1120 COLOR mSliderColor;
1121 bool mShowRange;
1122 bool mShowCurr;
1123 int mLineX;
1124 int mLineY;
1125 int mLineH;
1126 int mLinePadding;
1127 int mPadding;
1128 int mSliderY;
1129 int mSliderW;
1130 int mSliderH;
1131 bool mRendered;
1132 int mFontHeight;
1133 GUIAction *mAction;
1134 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001135 int mLineW;
1136 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001137 ImageResource *mBackgroundImage;
1138 ImageResource *mHandleImage;
1139 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001140};
1141
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001142class MouseCursor : public RenderObject
1143{
1144public:
1145 MouseCursor(int posX, int posY);
1146 virtual ~MouseCursor();
1147
1148 virtual int Render(void);
1149 virtual int Update(void);
1150 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1151
1152 void Move(int deltaX, int deltaY);
1153 void GetPos(int& x, int& y);
1154 void LoadData(xml_node<>* node);
1155 void ResetData(int resX, int resY);
1156
1157private:
1158 int m_resX;
1159 int m_resY;
1160 bool m_moved;
1161 float m_speedMultiplier;
1162 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001163 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001164 bool m_present;
1165};
1166
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001167class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1168{
1169public:
1170 GUIPatternPassword(xml_node<>* node);
1171 virtual ~GUIPatternPassword();
1172
1173public:
1174 virtual int Render(void);
1175 virtual int Update(void);
1176 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001177 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001178 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1179
1180protected:
1181 void CalculateDotPositions();
1182 void ResetActiveDots();
1183 void ConnectDot(int dot_idx);
1184 void ConnectIntermediateDots(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001185 void Resize(size_t size);
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001186 int InDot(int x, int y);
1187 bool DotUsed(int dot_idx);
Aleksa Saraib25a1832015-12-31 17:36:00 +01001188 std::string GeneratePassphrase();
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001189 void PatternDrawn();
1190
1191 struct Dot {
1192 int x;
1193 int y;
1194 bool active;
1195 };
1196
Aleksa Saraib25a1832015-12-31 17:36:00 +01001197 std::string mSizeVar;
1198 size_t mGridSize;
1199
1200 Dot* mDots;
1201 int* mConnectedDots;
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001202 size_t mConnectedDotsLen;
1203 int mCurLineX;
1204 int mCurLineY;
1205 bool mTrackingTouch;
1206 bool mNeedRender;
1207
1208 COLOR mDotColor;
1209 COLOR mActiveDotColor;
1210 COLOR mLineColor;
1211 ImageResource *mDotImage;
1212 ImageResource *mActiveDotImage;
1213 gr_surface mDotCircle;
1214 gr_surface mActiveDotCircle;
1215 int mDotRadius;
1216 int mLineWidth;
1217
1218 std::string mPassVar;
1219 GUIAction *mAction;
1220 int mUpdate;
1221};
1222
1223
Dees_Troy51a0e822012-09-05 15:24:24 -04001224// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001225xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001226std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1227int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1228int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1229int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001230COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001231COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1232FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1233ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1234AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
1235
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001236bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001237
1238#endif // _OBJECTS_HEADER
1239