blob: 3e335615e9ebeb9c1db6040f56cee1b1bbc46f59 [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"
Dees_Troy51a0e822012-09-05 15:24:24 -040037
Ethan Yonker751a85e2014-12-12 16:59:10 -060038#ifndef TW_X_OFFSET
39#define TW_X_OFFSET 0
40#endif
41#ifndef TW_Y_OFFSET
42#define TW_Y_OFFSET 0
43#endif
44
Dees_Troy51a0e822012-09-05 15:24:24 -040045class RenderObject
46{
47public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020048 enum Placement {
49 TOP_LEFT = 0,
50 TOP_RIGHT = 1,
51 BOTTOM_LEFT = 2,
52 BOTTOM_RIGHT = 3,
53 CENTER = 4,
Dees_Troy51a0e822012-09-05 15:24:24 -040054 CENTER_X_ONLY = 5,
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020055 };
Dees_Troy51a0e822012-09-05 15:24:24 -040056
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
84 virtual void SetPageFocus(int inFocus) { return; }
Dees_Troy51a0e822012-09-05 15:24:24 -040085
86protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020087 int mRenderX, mRenderY, mRenderW, mRenderH;
88 Placement mPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -040089};
90
91class ActionObject
92{
93public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020094 ActionObject() { mActionX = 0; mActionY = 0; mActionW = 0; mActionH = 0; }
95 virtual ~ActionObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -040096
97public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +020098 // NotifyTouch - Notify of a touch event
99 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
100 virtual int NotifyTouch(TOUCH_STATE state, int x, int y) { return 0; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400101
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200102 // NotifyKey - Notify of a key press
103 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100104 virtual int NotifyKey(int key, bool down) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400105
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200106 // GetRenderPos - Returns the current position of the object
107 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 // SetRenderPos - Update the position of the object
110 // Return 0 on success, <0 on error
111 virtual int SetActionPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400112
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200113 // IsInRegion - Checks if the request is handled by this object
thatf8194e22015-01-29 01:05:01 +0100114 // Return 1 if this object handles the request, 0 if not
115 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 -0400116
Dees_Troy51a0e822012-09-05 15:24:24 -0400117protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200118 int mActionX, mActionY, mActionW, mActionH;
Dees_Troy51a0e822012-09-05 15:24:24 -0400119};
120
Vojtech Bocekede51c52014-02-07 23:58:09 +0100121class GUIObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400122{
123public:
Vojtech Bocekede51c52014-02-07 23:58:09 +0100124 GUIObject(xml_node<>* node);
125 virtual ~GUIObject();
Dees_Troy51a0e822012-09-05 15:24:24 -0400126
127public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200128 bool IsConditionVariable(std::string var);
129 bool isConditionTrue();
130 bool isConditionValid();
Vojtech Bocek07220562014-02-08 02:05:33 +0100131
132 // NotifyVarChange - Notify of a variable change
133 // Returns 0 on success, <0 on error
134 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400135
136protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200137 class Condition
138 {
139 public:
Vojtech Bocek07220562014-02-08 02:05:33 +0100140 Condition() {
141 mLastResult = true;
142 }
143
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200144 std::string mVar1;
145 std::string mVar2;
146 std::string mCompareOp;
147 std::string mLastVal;
Vojtech Bocek07220562014-02-08 02:05:33 +0100148 bool mLastResult;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200149 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400150
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200151 std::vector<Condition> mConditions;
Dees_Troy51a0e822012-09-05 15:24:24 -0400152
153protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200154 bool isMounted(std::string vol);
155 bool isConditionTrue(Condition* condition);
Vojtech Bocek07220562014-02-08 02:05:33 +0100156
157 bool mConditionsResult;
Dees_Troy51a0e822012-09-05 15:24:24 -0400158};
159
160class InputObject
161{
162public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200163 InputObject() { HasInputFocus = 0; }
164 virtual ~InputObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -0400165
166public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200167 // NotifyKeyboard - Notify of keyboard input
168 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
169 virtual int NotifyKeyboard(int key) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400170
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200171 virtual int SetInputFocus(int focus) { HasInputFocus = focus; return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400172
173protected:
174 int HasInputFocus;
175};
176
177// Derived Objects
178// GUIText - Used for static text
Vojtech Bocekede51c52014-02-07 23:58:09 +0100179class GUIText : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400180{
181public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200182 // w and h may be ignored, in which case, no bounding box is applied
183 GUIText(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400184
185public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200186 // Render - Render the full object to the GL surface
187 // Return 0 on success, <0 on error
188 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400189
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200190 // Update - Update any UI component animations (called <= 30 FPS)
191 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
192 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400193
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200194 // Retrieve the size of the current string (dynamic strings may change per call)
195 virtual int GetCurrentBounds(int& w, int& h);
Dees_Troy51a0e822012-09-05 15:24:24 -0400196
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200197 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100198 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400199
200 // Set maximum width in pixels
201 virtual int SetMaxWidth(unsigned width);
202
203 // Set number of characters to skip (for scrolling)
204 virtual int SkipCharCount(unsigned skip);
205
Dees_Troy4d12f962012-10-19 13:13:15 -0400206public:
207 bool isHighlighted;
208
Dees_Troy51a0e822012-09-05 15:24:24 -0400209protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200210 std::string mText;
211 std::string mLastValue;
212 COLOR mColor;
Dees_Troy4d12f962012-10-19 13:13:15 -0400213 COLOR mHighlightColor;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200214 Resource* mFont;
215 int mIsStatic;
216 int mVarChanged;
217 int mFontHeight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400218 unsigned maxWidth;
219 unsigned charSkip;
Dees_Troy4d12f962012-10-19 13:13:15 -0400220 bool hasHighlightColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400221
222protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200223 std::string parseText(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400224};
225
226// GUIImage - Used for static image
Vojtech Bocekede51c52014-02-07 23:58:09 +0100227class GUIImage : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400228{
229public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200230 GUIImage(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400231
232public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200233 // Render - Render the full object to the GL surface
234 // Return 0 on success, <0 on error
235 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400236
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200237 // SetRenderPos - Update the position of the object
238 // Return 0 on success, <0 on error
239 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400240
Dees_Troy4d12f962012-10-19 13:13:15 -0400241public:
242 bool isHighlighted;
243
Dees_Troy51a0e822012-09-05 15:24:24 -0400244protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200245 Resource* mImage;
Dees_Troy4d12f962012-10-19 13:13:15 -0400246 Resource* mHighlightImage;
Dees_Troy51a0e822012-09-05 15:24:24 -0400247};
248
249// GUIFill - Used for fill colors
Vojtech Bocekede51c52014-02-07 23:58:09 +0100250class GUIFill : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400251{
252public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200253 GUIFill(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400254
255public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200256 // Render - Render the full object to the GL surface
257 // Return 0 on success, <0 on error
258 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400259
260protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200261 COLOR mColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400262};
263
264// GUIAction - Used for standard actions
Vojtech Bocekede51c52014-02-07 23:58:09 +0100265class GUIAction : public GUIObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400266{
thatc6085482015-01-09 22:12:43 +0100267 friend class ActionThread;
268
Dees_Troy51a0e822012-09-05 15:24:24 -0400269public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200270 GUIAction(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400271
272public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200273 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100274 virtual int NotifyKey(int key, bool down);
Vojtech Bocek07220562014-02-08 02:05:33 +0100275 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
that3f7b1ac2014-12-30 11:30:13 +0100276
277 int doActions();
Dees_Troy51a0e822012-09-05 15:24:24 -0400278
279protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200280 class Action
281 {
282 public:
283 std::string mFunction;
284 std::string mArg;
285 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400286
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200287 std::vector<Action> mActions;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100288 std::map<int, bool> mKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400289
290protected:
that73a52952015-01-28 23:07:34 +0100291 enum ThreadType { THREAD_NONE, THREAD_ACTION, THREAD_CANCEL };
292
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200293 int getKeyByName(std::string key);
that3f7b1ac2014-12-30 11:30:13 +0100294 int doAction(Action action);
that73a52952015-01-28 23:07:34 +0100295 ThreadType getThreadType(const Action& action);
Dees_Troy51a0e822012-09-05 15:24:24 -0400296 void simulate_progress_bar(void);
Ethan Yonker0d47eb52015-01-09 11:23:19 -0600297 int flash_zip(std::string filename, int* wipe_cache);
thatcc8ddca2015-01-03 01:59:36 +0100298 void reinject_after_flash();
Dees_Troy51a0e822012-09-05 15:24:24 -0400299 void operation_start(const string operation_name);
that3f7b1ac2014-12-30 11:30:13 +0100300 void operation_end(const int operation_status);
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +0000301 time_t Start;
that3f7b1ac2014-12-30 11:30:13 +0100302
303 // map action name to function pointer
304 typedef int (GUIAction::*execFunction)(std::string);
305 typedef std::map<std::string, execFunction> mapFunc;
306 static mapFunc mf;
thatc6085482015-01-09 22:12:43 +0100307 static std::set<std::string> setActionsRunningInCallerThread;
that3f7b1ac2014-12-30 11:30:13 +0100308
309 // GUI actions
310 int reboot(std::string arg);
311 int home(std::string arg);
312 int key(std::string arg);
313 int page(std::string arg);
314 int reload(std::string arg);
315 int readBackup(std::string arg);
316 int set(std::string arg);
317 int clear(std::string arg);
318 int mount(std::string arg);
319 int unmount(std::string arg);
320 int restoredefaultsettings(std::string arg);
321 int copylog(std::string arg);
322 int compute(std::string arg);
323 int setguitimezone(std::string arg);
324 int overlay(std::string arg);
325 int queuezip(std::string arg);
326 int cancelzip(std::string arg);
327 int queueclear(std::string arg);
328 int sleep(std::string arg);
329 int appenddatetobackupname(std::string arg);
330 int generatebackupname(std::string arg);
331 int checkpartitionlist(std::string arg);
332 int getpartitiondetails(std::string arg);
333 int screenshot(std::string arg);
334 int setbrightness(std::string arg);
335
thatc6085482015-01-09 22:12:43 +0100336 // (originally) threaded actions
that3f7b1ac2014-12-30 11:30:13 +0100337 int fileexists(std::string arg);
338 int flash(std::string arg);
339 int wipe(std::string arg);
340 int refreshsizes(std::string arg);
341 int nandroid(std::string arg);
342 int fixpermissions(std::string arg);
343 int dd(std::string arg);
344 int partitionsd(std::string arg);
345 int installhtcdumlock(std::string arg);
346 int htcdumlockrestoreboot(std::string arg);
347 int htcdumlockreflashrecovery(std::string arg);
348 int cmd(std::string arg);
349 int terminalcommand(std::string arg);
350 int killterminal(std::string arg);
351 int reinjecttwrp(std::string arg);
352 int checkbackupname(std::string arg);
353 int decrypt(std::string arg);
354 int adbsideload(std::string arg);
355 int adbsideloadcancel(std::string arg);
356 int openrecoveryscript(std::string arg);
357 int installsu(std::string arg);
358 int fixsu(std::string arg);
359 int decrypt_backup(std::string arg);
360 int repair(std::string arg);
361 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);
that3f7b1ac2014-12-30 11:30:13 +0100366
367 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400368};
369
Vojtech Bocekede51c52014-02-07 23:58:09 +0100370class GUIConsole : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400371{
372public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200373 GUIConsole(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400374
375public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200376 // Render - Render the full object to the GL surface
377 // Return 0 on success, <0 on error
378 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400379
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200380 // Update - Update any UI component animations (called <= 30 FPS)
381 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
382 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400383
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200384 // SetRenderPos - Update the position of the object
385 // Return 0 on success, <0 on error
386 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400387
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200388 // IsInRegion - Checks if the request is handled by this object
thatf8194e22015-01-29 01:05:01 +0100389 // Return 1 if this object handles the request, 0 if not
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200390 virtual int IsInRegion(int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400391
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200392 // NotifyTouch - Notify of a touch event
393 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
394 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400395
396protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200397 enum SlideoutState
398 {
399 hidden = 0,
400 visible,
401 request_hide,
402 request_show
403 };
404
405 Resource* mFont;
406 Resource* mSlideoutImage;
407 COLOR mForegroundColor;
408 COLOR mBackgroundColor;
409 COLOR mScrollColor;
410 unsigned int mFontHeight;
411 int mCurrentLine;
412 unsigned int mLastCount;
Dees Troy31218ec2014-02-25 20:35:56 +0000413 unsigned int RenderCount;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200414 unsigned int mMaxRows;
415 int mStartY;
416 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
417 int mSlideinX, mSlideinY, mSlideinW, mSlideinH;
418 int mConsoleX, mConsoleY, mConsoleW, mConsoleH;
419 int mLastTouchX, mLastTouchY;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200420 int mSlideout;
421 SlideoutState mSlideoutState;
Dees Troy31218ec2014-02-25 20:35:56 +0000422 std::vector<std::string> rConsole;
Ethan Yonkerbf2cb1c2014-07-02 10:15:54 -0500423 std::vector<std::string> rConsoleColor;
Dees Troy31218ec2014-02-25 20:35:56 +0000424 bool mRender;
Dees_Troy51a0e822012-09-05 15:24:24 -0400425
426protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200427 virtual int RenderSlideout(void);
428 virtual int RenderConsole(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400429};
430
Vojtech Bocekede51c52014-02-07 23:58:09 +0100431class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400432{
433public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200434 GUIButton(xml_node<>* node);
435 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400436
437public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200438 // Render - Render the full object to the GL surface
439 // Return 0 on success, <0 on error
440 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400441
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200442 // Update - Update any UI component animations (called <= 30 FPS)
443 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
444 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400445
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200446 // SetPos - Update the position of the render object
447 // Return 0 on success, <0 on error
448 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400449
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200450 // NotifyTouch - Notify of a touch event
451 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
452 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400453
454protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200455 GUIImage* mButtonImg;
456 Resource* mButtonIcon;
457 GUIText* mButtonLabel;
458 GUIAction* mAction;
459 int mTextX, mTextY, mTextW, mTextH;
460 int mIconX, mIconY, mIconW, mIconH;
461 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600462 bool hasHighlightColor;
463 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500464 bool hasFill;
465 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600466 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000467 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400468};
469
Vojtech Bocekede51c52014-02-07 23:58:09 +0100470class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400471{
472public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200473 GUICheckbox(xml_node<>* node);
474 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400475
476public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200477 // Render - Render the full object to the GL surface
478 // Return 0 on success, <0 on error
479 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400480
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200481 // Update - Update any UI component animations (called <= 30 FPS)
482 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
483 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400484
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200485 // SetPos - Update the position of the render object
486 // Return 0 on success, <0 on error
487 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400488
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200489 // NotifyTouch - Notify of a touch event
490 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
491 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400492
493protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200494 Resource* mChecked;
495 Resource* mUnchecked;
496 GUIText* mLabel;
497 int mTextX, mTextY;
498 int mCheckX, mCheckY, mCheckW, mCheckH;
499 int mLastState;
500 bool mRendered;
501 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400502};
503
Vojtech Bocekede51c52014-02-07 23:58:09 +0100504class GUIFileSelector : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400505{
506public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200507 GUIFileSelector(xml_node<>* node);
508 virtual ~GUIFileSelector();
Dees_Troy51a0e822012-09-05 15:24:24 -0400509
510public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200511 // Render - Render the full object to the GL surface
512 // Return 0 on success, <0 on error
513 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400514
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200515 // Update - Update any UI component animations (called <= 30 FPS)
516 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
517 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400518
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200519 // NotifyTouch - Notify of a touch event
520 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
521 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400522
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200523 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100524 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400525
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200526 // SetPos - Update the position of the render object
527 // Return 0 on success, <0 on error
528 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400529
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200530 // SetPageFocus - Notify when a page gains or loses focus
531 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400532
533protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200534 struct FileData {
535 std::string fileName;
536 unsigned char fileType; // Uses d_type format from struct dirent
537 mode_t protection; // Uses mode_t format from stat
538 uid_t userId;
539 gid_t groupId;
540 off_t fileSize;
541 time_t lastAccess; // Uses time_t format from stat
542 time_t lastModified; // Uses time_t format from stat
543 time_t lastStatChange; // Uses time_t format from stat
544 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400545
546protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200547 virtual int GetSelection(int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400548
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200549 virtual int GetFileList(const std::string folder);
550 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400551
552protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200553 std::vector<FileData> mFolderList;
554 std::vector<FileData> mFileList;
555 std::string mPathVar;
556 std::string mExtn;
557 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400558 std::string mSortVariable;
559 std::string mSelection;
560 std::string mHeaderText;
561 std::string mLastValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200562 int actualLineHeight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400563 int mStart;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200564 int mLineSpacing;
Dees_Troy51a0e822012-09-05 15:24:24 -0400565 int mSeparatorH;
566 int mHeaderSeparatorH;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200567 int mShowFolders, mShowFiles, mShowNavFolders;
568 int mUpdate;
569 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
Dees_Troy51a0e822012-09-05 15:24:24 -0400570 int mHeaderH;
Vojtech Bocek7cc278b2013-02-24 01:40:19 +0100571 int mFastScrollW;
572 int mFastScrollLineW;
573 int mFastScrollRectW;
574 int mFastScrollRectH;
575 int mFastScrollRectX;
576 int mFastScrollRectY;
Dees_Troy51a0e822012-09-05 15:24:24 -0400577 static int mSortOrder;
578 int startY;
579 int scrollingSpeed;
580 int scrollingY;
581 int mHeaderIsStatic;
582 int touchDebounce;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200583 unsigned mFontHeight;
584 unsigned mLineHeight;
585 int mIconWidth, mIconHeight, mFolderIconHeight, mFileIconHeight, mFolderIconWidth, mFileIconWidth, mHeaderIconHeight, mHeaderIconWidth;
586 Resource* mHeaderIcon;
Dees_Troy51a0e822012-09-05 15:24:24 -0400587 Resource* mFolderIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200588 Resource* mFileIcon;
589 Resource* mBackground;
590 Resource* mFont;
591 COLOR mBackgroundColor;
592 COLOR mFontColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400593 COLOR mHeaderBackgroundColor;
594 COLOR mHeaderFontColor;
595 COLOR mSeparatorColor;
596 COLOR mHeaderSeparatorColor;
Vojtech Bocek7cc278b2013-02-24 01:40:19 +0100597 COLOR mFastScrollLineColor;
598 COLOR mFastScrollRectColor;
Dees_Troye7585ca2013-02-15 11:42:29 -0600599 bool hasHighlightColor;
600 bool hasFontHighlightColor;
601 bool isHighlighted;
602 COLOR mHighlightColor;
603 COLOR mFontHighlightColor;
604 int startSelection;
Dees_Troyc0583f52013-02-28 11:19:57 -0600605 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400606};
607
Vojtech Bocekede51c52014-02-07 23:58:09 +0100608class GUIListBox : public GUIObject, public RenderObject, public ActionObject
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 // Render - Render the full object to the GL surface
616 // Return 0 on success, <0 on error
617 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400618
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200619 // Update - Update any UI component animations (called <= 30 FPS)
620 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
621 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400622
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200623 // NotifyTouch - Notify of a touch event
624 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
625 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400626
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200627 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100628 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400629
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200630 // SetPos - Update the position of the render object
631 // Return 0 on success, <0 on error
632 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400633
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200634 // SetPageFocus - Notify when a page gains or loses focus
635 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400636
637protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200638 struct ListData {
639 std::string displayName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400640 std::string variableValue;
641 unsigned int selected;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200642 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400643
644protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200645 virtual int GetSelection(int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400646
647protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200648 std::vector<ListData> mList;
649 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400650 std::string mSelection;
651 std::string currentValue;
Dees_Troyeead9852013-02-15 14:31:06 -0600652 std::string mHeaderText;
653 std::string mLastValue;
654 int actualLineHeight;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200655 int mStart;
Dees_Troyeead9852013-02-15 14:31:06 -0600656 int startY;
657 int mSeparatorH, mHeaderSeparatorH;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200658 int mLineSpacing;
659 int mUpdate;
660 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH, mHeaderH;
Dees_Troy58f5cf02013-02-27 22:21:41 +0000661 int mFastScrollW;
662 int mFastScrollLineW;
663 int mFastScrollRectW;
664 int mFastScrollRectH;
665 int mFastScrollRectX;
666 int mFastScrollRectY;
Dees_Troyeead9852013-02-15 14:31:06 -0600667 int mIconWidth, mIconHeight, mSelectedIconWidth, mSelectedIconHeight, mUnselectedIconWidth, mUnselectedIconHeight, mHeaderIconHeight, mHeaderIconWidth;
668 int scrollingSpeed;
669 int scrollingY;
Dees_Troy51a0e822012-09-05 15:24:24 -0400670 static int mSortOrder;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200671 unsigned mFontHeight;
672 unsigned mLineHeight;
Dees_Troyeead9852013-02-15 14:31:06 -0600673 Resource* mHeaderIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200674 Resource* mIconSelected;
675 Resource* mIconUnselected;
676 Resource* mBackground;
677 Resource* mFont;
678 COLOR mBackgroundColor;
679 COLOR mFontColor;
Dees_Troyeead9852013-02-15 14:31:06 -0600680 COLOR mHeaderBackgroundColor;
681 COLOR mHeaderFontColor;
682 COLOR mSeparatorColor;
683 COLOR mHeaderSeparatorColor;
Dees_Troy58f5cf02013-02-27 22:21:41 +0000684 COLOR mFastScrollLineColor;
685 COLOR mFastScrollRectColor;
Dees_Troyeead9852013-02-15 14:31:06 -0600686 bool hasHighlightColor;
687 bool hasFontHighlightColor;
688 bool isHighlighted;
689 COLOR mHighlightColor;
690 COLOR mFontHighlightColor;
691 int mHeaderIsStatic;
692 int startSelection;
693 int touchDebounce;
Dees_Troy51a0e822012-09-05 15:24:24 -0400694};
695
Vojtech Bocekede51c52014-02-07 23:58:09 +0100696class GUIPartitionList : public GUIObject, public RenderObject, public ActionObject
Dees_Troya13d74f2013-03-24 08:54:55 -0500697{
698public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200699 GUIPartitionList(xml_node<>* node);
700 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500701
702public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200703 // Render - Render the full object to the GL surface
704 // Return 0 on success, <0 on error
705 virtual int Render(void);
Dees_Troya13d74f2013-03-24 08:54:55 -0500706
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200707 // Update - Update any UI component animations (called <= 30 FPS)
708 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
709 virtual int Update(void);
Dees_Troya13d74f2013-03-24 08:54:55 -0500710
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200711 // NotifyTouch - Notify of a touch event
712 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
713 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troya13d74f2013-03-24 08:54:55 -0500714
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200715 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100716 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500717
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200718 // SetPos - Update the position of the render object
719 // Return 0 on success, <0 on error
720 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troya13d74f2013-03-24 08:54:55 -0500721
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200722 // SetPageFocus - Notify when a page gains or loses focus
723 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500724
725protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200726 virtual int GetSelection(int x, int y);
Dees_Troya13d74f2013-03-24 08:54:55 -0500727 virtual void MatchList(void);
728
729protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200730 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500731 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200732 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500733 std::string selectedList;
734 std::string currentValue;
735 std::string mHeaderText;
736 std::string mLastValue;
737 int actualLineHeight;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200738 int mStart;
Dees_Troya13d74f2013-03-24 08:54:55 -0500739 int startY;
740 int mSeparatorH, mHeaderSeparatorH;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200741 int mLineSpacing;
742 int mUpdate;
743 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH, mHeaderH;
Dees_Troya13d74f2013-03-24 08:54:55 -0500744 int mFastScrollW;
745 int mFastScrollLineW;
746 int mFastScrollRectW;
747 int mFastScrollRectH;
748 int mFastScrollRectX;
749 int mFastScrollRectY;
750 int mIconWidth, mIconHeight, mSelectedIconWidth, mSelectedIconHeight, mUnselectedIconWidth, mUnselectedIconHeight, mHeaderIconHeight, mHeaderIconWidth;
751 int scrollingSpeed;
752 int scrollingY;
753 static int mSortOrder;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200754 unsigned mFontHeight;
755 unsigned mLineHeight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500756 Resource* mHeaderIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200757 Resource* mIconSelected;
758 Resource* mIconUnselected;
759 Resource* mBackground;
760 Resource* mFont;
761 COLOR mBackgroundColor;
762 COLOR mFontColor;
Dees_Troya13d74f2013-03-24 08:54:55 -0500763 COLOR mHeaderBackgroundColor;
764 COLOR mHeaderFontColor;
765 COLOR mSeparatorColor;
766 COLOR mHeaderSeparatorColor;
767 COLOR mFastScrollLineColor;
768 COLOR mFastScrollRectColor;
769 bool hasHighlightColor;
770 bool hasFontHighlightColor;
771 bool isHighlighted;
772 COLOR mHighlightColor;
773 COLOR mFontHighlightColor;
774 int mHeaderIsStatic;
775 int startSelection;
776 int touchDebounce;
777 bool updateList;
778};
779
Dees_Troy51a0e822012-09-05 15:24:24 -0400780// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100781class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400782{
783public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200784 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400785
786public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200787 // Render - Render the full object to the GL surface
788 // Return 0 on success, <0 on error
789 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400790
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200791 // Update - Update any UI component animations (called <= 30 FPS)
792 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
793 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400794
795protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200796 AnimationResource* mAnimation;
797 int mFrame;
798 int mFPS;
799 int mLoop;
800 int mRender;
801 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400802};
803
Vojtech Bocekede51c52014-02-07 23:58:09 +0100804class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400805{
806public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200807 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400808
809public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200810 // Render - Render the full object to the GL surface
811 // Return 0 on success, <0 on error
812 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400813
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200814 // Update - Update any UI component animations (called <= 30 FPS)
815 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
816 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400817
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200818 // NotifyVarChange - Notify of a variable change
819 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100820 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400821
822protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200823 Resource* mEmptyBar;
824 Resource* mFullBar;
825 std::string mMinValVar;
826 std::string mMaxValVar;
827 std::string mCurValVar;
828 float mSlide;
829 float mSlideInc;
830 int mSlideFrames;
831 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400832
833protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200834 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400835};
836
Vojtech Bocekede51c52014-02-07 23:58:09 +0100837class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400838{
839public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200840 GUISlider(xml_node<>* node);
841 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400842
843public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200844 // Render - Render the full object to the GL surface
845 // Return 0 on success, <0 on error
846 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400847
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200848 // Update - Update any UI component animations (called <= 30 FPS)
849 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
850 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400851
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200852 // NotifyTouch - Notify of a touch event
853 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
854 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400855
856protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200857 GUIAction* sAction;
858 Resource* sSlider;
859 Resource* sSliderUsed;
860 Resource* sTouch;
861 int sTouchW, sTouchH;
862 int sCurTouchX;
863 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400864};
865
866#define MAX_KEYBOARD_LAYOUTS 5
867#define MAX_KEYBOARD_ROWS 9
868#define MAX_KEYBOARD_KEYS 20
869#define KEYBOARD_ACTION 253
870#define KEYBOARD_LAYOUT 254
871#define KEYBOARD_SWIPE_LEFT 252
872#define KEYBOARD_SWIPE_RIGHT 251
873#define KEYBOARD_ARROW_LEFT 250
874#define KEYBOARD_ARROW_RIGHT 249
875#define KEYBOARD_HOME 248
876#define KEYBOARD_END 247
877#define KEYBOARD_ARROW_UP 246
878#define KEYBOARD_ARROW_DOWN 245
879#define KEYBOARD_SPECIAL_KEYS 245
880#define KEYBOARD_BACKSPACE 8
881
Vojtech Bocekede51c52014-02-07 23:58:09 +0100882class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400883{
884public:
885 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200886 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400887
888public:
889 virtual int Render(void);
890 virtual int Update(void);
891 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
892 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
893
894protected:
895 virtual int GetSelection(int x, int y);
896
897protected:
898 struct keyboard_key_class
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200899 {
900 unsigned char key;
Dees_Troy51a0e822012-09-05 15:24:24 -0400901 unsigned char longpresskey;
that1a7ba972015-02-01 19:48:19 +0100902 int end_x;
903 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200904 };
that1a7ba972015-02-01 19:48:19 +0100905 int ParseKey(const char* keyinfo, keyboard_key_class& key, int& Xindex, int keyWidth, bool longpress);
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600906 struct capslock_tracking_struct
907 {
908 int capslock;
909 int set_capslock;
910 int revert_layout;
911 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400912
913 Resource* keyboardImg[MAX_KEYBOARD_LAYOUTS];
914 struct keyboard_key_class keyboard_keys[MAX_KEYBOARD_LAYOUTS][MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600915 struct capslock_tracking_struct caps_tracking[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400916 bool mRendered;
917 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100918 int currentLayout;
919 int row_heights[MAX_KEYBOARD_LAYOUTS][MAX_KEYBOARD_ROWS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400920 unsigned int KeyboardWidth, KeyboardHeight;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600921 int rowY, colX, highlightRenderCount, hasHighlight, hasCapsHighlight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400922 GUIAction* mAction;
Dees_Troy30b962e2012-10-19 20:48:59 -0400923 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600924 COLOR mCapsHighlightColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400925};
926
927// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100928class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400929{
930public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200931 // w and h may be ignored, in which case, no bounding box is applied
932 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400933 virtual ~GUIInput();
934
935public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200936 // Render - Render the full object to the GL surface
937 // Return 0 on success, <0 on error
938 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400939
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200940 // Update - Update any UI component animations (called <= 30 FPS)
941 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
942 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400943
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200944 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100945 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400946
947 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200948 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
949 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400950
951 virtual int NotifyKeyboard(int key);
952
953protected:
954 virtual int GetSelection(int x, int y);
955
956 // Handles displaying the text properly when chars are added, deleted, or for scrolling
957 virtual int HandleTextLocation(int x);
958
959protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200960 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -0400961 GUIAction* mAction;
962 Resource* mBackground;
963 Resource* mCursor;
964 Resource* mFont;
965 std::string mText;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200966 std::string mLastValue;
Dees_Troy51a0e822012-09-05 15:24:24 -0400967 std::string mVariable;
968 std::string mMask;
969 std::string mMaskVariable;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200970 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400971 COLOR mCursorColor;
972 int scrollingX;
973 int lastX;
974 int mCursorLocation;
975 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
976 int mFontY;
977 unsigned skipChars;
978 unsigned mFontHeight;
979 unsigned CursorWidth;
980 bool mRendered;
981 bool HasMask;
982 bool DrawCursor;
983 bool isLocalChange;
984 bool HasAllowed;
985 bool HasDisabled;
986 std::string AllowedList;
987 std::string DisabledList;
988 unsigned MinLen;
989 unsigned MaxLen;
990};
991
992class HardwareKeyboard
993{
994public:
thatf37aec22015-02-01 13:38:35 +0100995 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400996 virtual ~HardwareKeyboard();
997
998public:
thatf37aec22015-02-01 13:38:35 +0100999 // called by the input handler for key events
1000 int KeyDown(int key_code);
1001 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001002
thatf37aec22015-02-01 13:38:35 +01001003 // called by the input handler when holding a key down
1004 int KeyRepeat();
1005
1006 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001007 void ConsumeKeyRelease(int key);
1008
1009private:
thatf37aec22015-02-01 13:38:35 +01001010 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001011 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001012};
1013
Vojtech Bocekede51c52014-02-07 23:58:09 +01001014class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001015{
1016public:
1017 GUISliderValue(xml_node<>* node);
1018 virtual ~GUISliderValue();
1019
1020public:
1021 // Render - Render the full object to the GL surface
1022 // Return 0 on success, <0 on error
1023 virtual int Render(void);
1024
1025 // Update - Update any UI component animations (called <= 30 FPS)
1026 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1027 virtual int Update(void);
1028
1029 // SetPos - Update the position of the render object
1030 // Return 0 on success, <0 on error
1031 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1032
1033 // NotifyTouch - Notify of a touch event
1034 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1035 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1036
1037 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001038 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001039
1040 // SetPageFocus - Notify when a page gains or loses focus
1041 virtual void SetPageFocus(int inFocus);
1042
1043protected:
1044 int measureText(const std::string& str);
1045 int valueFromPct(float pct);
1046 float pctFromValue(int value);
1047 void loadValue(bool force = false);
1048
1049 std::string mVariable;
1050 int mMax;
1051 int mMin;
1052 int mValue;
1053 char *mValueStr;
1054 float mValuePct;
1055 std::string mMaxStr;
1056 std::string mMinStr;
1057 Resource *mFont;
1058 GUIText* mLabel;
1059 int mLabelW;
1060 COLOR mTextColor;
1061 COLOR mLineColor;
1062 COLOR mSliderColor;
1063 bool mShowRange;
1064 bool mShowCurr;
1065 int mLineX;
1066 int mLineY;
1067 int mLineH;
1068 int mLinePadding;
1069 int mPadding;
1070 int mSliderY;
1071 int mSliderW;
1072 int mSliderH;
1073 bool mRendered;
1074 int mFontHeight;
1075 GUIAction *mAction;
1076 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001077 int mLineW;
1078 bool mDragging;
1079 Resource *mBackgroundImage;
1080 Resource *mHandleImage;
1081 Resource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001082};
1083
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001084class MouseCursor : public RenderObject
1085{
1086public:
1087 MouseCursor(int posX, int posY);
1088 virtual ~MouseCursor();
1089
1090 virtual int Render(void);
1091 virtual int Update(void);
1092 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1093
1094 void Move(int deltaX, int deltaY);
1095 void GetPos(int& x, int& y);
1096 void LoadData(xml_node<>* node);
1097 void ResetData(int resX, int resY);
1098
1099private:
1100 int m_resX;
1101 int m_resY;
1102 bool m_moved;
1103 float m_speedMultiplier;
1104 COLOR m_color;
1105 Resource *m_image;
1106 bool m_present;
1107};
1108
Dees_Troy51a0e822012-09-05 15:24:24 -04001109// Helper APIs
1110bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, RenderObject::Placement* placement = NULL);
1111
1112#endif // _OBJECTS_HEADER
1113