blob: c286567f99492ce3ae05a1540db8ea0f82bee277 [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;
that05360ba2015-02-06 00:58:16 +0100410 int mFontHeight;
411 int mCurrentLine; // index of last line to show; -1 to keep tracking last line
412 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
413 size_t RenderCount; // total number of lines after wrapping
414 int mMaxRows; // height of console in text rows
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200415 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
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100504struct ScrollListData {
505 Resource* displayResource;
506 std::string displayName;
507 int list_index;
508};
509
510class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400511{
512public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100513 GUIScrollList(xml_node<>* node);
514 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400515
516public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200517 // Render - Render the full object to the GL surface
518 // Return 0 on success, <0 on error
519 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400520
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200521 // Update - Update any UI component animations (called <= 30 FPS)
522 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
523 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400524
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200525 // NotifyTouch - Notify of a touch event
526 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
527 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400528
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200529 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100530 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400531
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200532 // SetPos - Update the position of the render object
533 // Return 0 on success, <0 on error
534 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400535
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200536 // SetPageFocus - Notify when a page gains or loses focus
537 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400538
539protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100540 // derived classes need to implement these
541 // get number of items
542 virtual size_t GetItemCount() { return 0; }
543 // get data for one item
544 virtual int GetListItem(size_t item_index, Resource*& icon, std::string &text)
545 { icon = NULL; text = ""; return -1; }
546 // an item was selected
547 virtual void NotifySelect(size_t item_selected) {}
548
549 enum { NO_ITEM = (size_t)-1 };
550 // returns item index at coordinates or NO_ITEM if there is no item there
551 size_t HitTestItem(int x, int y);
552
553 // 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
554 void SetMaxIconSize(int w, int h);
555
556 // This will make sure that the item indicated by list_index is visible on the screen
557 void SetVisibleListLocation(size_t list_index);
558
559 // Handle scrolling changes for drags and kinetic scrolling
560 void HandleScrolling();
561
562 // Returns many rows the list is capable of displaying
563 int GetDisplayItemCount();
564
565 // Returns the size in pixels of a partial item or row size
566 int GetDisplayRemainder();
567
568protected:
569 // Background
570 COLOR mBackgroundColor;
571 Resource* mBackground; // background image, if any, automatically centered
572 int mBackgroundW, mBackgroundH; // background width and height if using an image for the background
573
574 // Header
575 COLOR mHeaderBackgroundColor;
576 COLOR mHeaderFontColor;
577 std::string mHeaderText; // Original header text without parsing any variables
578 std::string mLastHeaderValue; // Header text after parsing variables
579 int mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
580 int mHeaderH; // actual header height including font, icon, padding, and separator heights
581 Resource* mHeaderIcon;
582 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
583 int mHeaderSeparatorH; // Height of the separator between header and list items
584 COLOR mHeaderSeparatorColor; // color of the header separator
585
586 // Per-item layout
587 Resource* mFont;
588 COLOR mFontColor;
589 bool hasHighlightColor; // indicates if a hightlight color was set
590 bool hasFontHighlightColor; // indicates if the font hightlight color is set
591 COLOR mHighlightColor; // background row hightlight color
592 COLOR mFontHighlightColor;
593 int mFontHeight;
594 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
595 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
596 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
597 int mSeparatorH; // Height of the separator between items
598 COLOR mSeparatorColor; // color of the separator that is between items
599
600 // Scrolling and dynamic state
601 int mFastScrollW; // width of the fastscroll area
602 int mFastScrollLineW; // width of the line for fastscroll rendering
603 int mFastScrollRectW; // width of the rectangle for fastscroll
604 int mFastScrollRectH; // height of the rectangle for fastscroll
605 COLOR mFastScrollLineColor;
606 COLOR mFastScrollRectColor;
607 bool hasScroll; // indicates that we have enough items in the list to scroll
608 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
609 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
610 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
611 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
612 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
613 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
614 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
615 int mUpdate; // indicates that a change took place and we need to re-render
616};
617
618class GUIFileSelector : public GUIScrollList
619{
620public:
621 GUIFileSelector(xml_node<>* node);
622 virtual ~GUIFileSelector();
623
624public:
625 // Update - Update any UI component animations (called <= 30 FPS)
626 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
627 virtual int Update(void);
628
629 // NotifyVarChange - Notify of a variable change
630 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
631
632 // SetPageFocus - Notify when a page gains or loses focus
633 virtual void SetPageFocus(int inFocus);
634
635 virtual size_t GetItemCount();
636 virtual int GetListItem(size_t item_index, Resource*& icon, std::string &text);
637 virtual void NotifySelect(size_t item_selected);
638
639protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200640 struct FileData {
641 std::string fileName;
642 unsigned char fileType; // Uses d_type format from struct dirent
643 mode_t protection; // Uses mode_t format from stat
644 uid_t userId;
645 gid_t groupId;
646 off_t fileSize;
647 time_t lastAccess; // Uses time_t format from stat
648 time_t lastModified; // Uses time_t format from stat
649 time_t lastStatChange; // Uses time_t format from stat
650 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400651
652protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200653 virtual int GetFileList(const std::string folder);
654 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400655
656protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200657 std::vector<FileData> mFolderList;
658 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100659 std::string mPathVar; // current path displayed, saved in the data manager
660 std::string mExtn; // used for filtering the file list, for example, *.zip
661 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
662 std::string mSortVariable; // data manager variable used to change the sorting of files
663 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
664 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
665 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)
666 static int mSortOrder; // must be static because it is used by the static function fileSort
Dees_Troy51a0e822012-09-05 15:24:24 -0400667 Resource* mFolderIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200668 Resource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600669 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400670};
671
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100672class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400673{
674public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200675 GUIListBox(xml_node<>* node);
676 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400677
678public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200679 // Update - Update any UI component animations (called <= 30 FPS)
680 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
681 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400682
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200683 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100684 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400685
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200686 // SetPageFocus - Notify when a page gains or loses focus
687 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400688
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100689 virtual size_t GetItemCount();
690 virtual int GetListItem(size_t item_index, Resource*& icon, std::string &text);
691 virtual void NotifySelect(size_t item_selected);
692
Dees_Troy51a0e822012-09-05 15:24:24 -0400693protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200694 struct ListData {
695 std::string displayName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400696 std::string variableValue;
697 unsigned int selected;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200698 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400699
700protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200701 std::vector<ListData> mList;
702 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400703 std::string currentValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200704 Resource* mIconSelected;
705 Resource* mIconUnselected;
Dees_Troy51a0e822012-09-05 15:24:24 -0400706};
707
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100708class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500709{
710public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200711 GUIPartitionList(xml_node<>* node);
712 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500713
714public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200715 // Update - Update any UI component animations (called <= 30 FPS)
716 // 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 +0100717 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500718
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200719 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100720 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
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
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100725 virtual size_t GetItemCount();
726 virtual int GetListItem(size_t item_index, Resource*& icon, std::string &text);
727 virtual void NotifySelect(size_t item_selected);
728
Dees_Troya13d74f2013-03-24 08:54:55 -0500729protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100730 void MatchList();
731 void SetStoragePosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500732
733protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200734 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500735 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200736 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500737 std::string selectedList;
738 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500739 std::string mLastValue;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200740 Resource* mIconSelected;
741 Resource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500742 bool updateList;
743};
744
Dees_Troy51a0e822012-09-05 15:24:24 -0400745// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100746class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400747{
748public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200749 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400750
751public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200752 // Render - Render the full object to the GL surface
753 // Return 0 on success, <0 on error
754 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400755
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200756 // Update - Update any UI component animations (called <= 30 FPS)
757 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
758 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400759
760protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200761 AnimationResource* mAnimation;
762 int mFrame;
763 int mFPS;
764 int mLoop;
765 int mRender;
766 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400767};
768
Vojtech Bocekede51c52014-02-07 23:58:09 +0100769class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400770{
771public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200772 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400773
774public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200775 // Render - Render the full object to the GL surface
776 // Return 0 on success, <0 on error
777 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400778
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200779 // Update - Update any UI component animations (called <= 30 FPS)
780 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
781 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400782
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200783 // NotifyVarChange - Notify of a variable change
784 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100785 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400786
787protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200788 Resource* mEmptyBar;
789 Resource* mFullBar;
790 std::string mMinValVar;
791 std::string mMaxValVar;
792 std::string mCurValVar;
793 float mSlide;
794 float mSlideInc;
795 int mSlideFrames;
796 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400797
798protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200799 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400800};
801
Vojtech Bocekede51c52014-02-07 23:58:09 +0100802class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400803{
804public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200805 GUISlider(xml_node<>* node);
806 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400807
808public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200809 // Render - Render the full object to the GL surface
810 // Return 0 on success, <0 on error
811 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400812
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200813 // Update - Update any UI component animations (called <= 30 FPS)
814 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
815 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400816
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200817 // NotifyTouch - Notify of a touch event
818 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
819 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400820
821protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200822 GUIAction* sAction;
823 Resource* sSlider;
824 Resource* sSliderUsed;
825 Resource* sTouch;
826 int sTouchW, sTouchH;
827 int sCurTouchX;
828 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400829};
830
831#define MAX_KEYBOARD_LAYOUTS 5
832#define MAX_KEYBOARD_ROWS 9
833#define MAX_KEYBOARD_KEYS 20
834#define KEYBOARD_ACTION 253
835#define KEYBOARD_LAYOUT 254
836#define KEYBOARD_SWIPE_LEFT 252
837#define KEYBOARD_SWIPE_RIGHT 251
838#define KEYBOARD_ARROW_LEFT 250
839#define KEYBOARD_ARROW_RIGHT 249
840#define KEYBOARD_HOME 248
841#define KEYBOARD_END 247
842#define KEYBOARD_ARROW_UP 246
843#define KEYBOARD_ARROW_DOWN 245
844#define KEYBOARD_SPECIAL_KEYS 245
845#define KEYBOARD_BACKSPACE 8
846
Vojtech Bocekede51c52014-02-07 23:58:09 +0100847class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400848{
849public:
850 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200851 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400852
853public:
854 virtual int Render(void);
855 virtual int Update(void);
856 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
857 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
858
859protected:
860 virtual int GetSelection(int x, int y);
861
862protected:
863 struct keyboard_key_class
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200864 {
865 unsigned char key;
Dees_Troy51a0e822012-09-05 15:24:24 -0400866 unsigned char longpresskey;
that1a7ba972015-02-01 19:48:19 +0100867 int end_x;
868 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200869 };
that1a7ba972015-02-01 19:48:19 +0100870 int ParseKey(const char* keyinfo, keyboard_key_class& key, int& Xindex, int keyWidth, bool longpress);
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600871 struct capslock_tracking_struct
872 {
873 int capslock;
874 int set_capslock;
875 int revert_layout;
876 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400877
878 Resource* keyboardImg[MAX_KEYBOARD_LAYOUTS];
879 struct keyboard_key_class keyboard_keys[MAX_KEYBOARD_LAYOUTS][MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600880 struct capslock_tracking_struct caps_tracking[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400881 bool mRendered;
882 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100883 int currentLayout;
884 int row_heights[MAX_KEYBOARD_LAYOUTS][MAX_KEYBOARD_ROWS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400885 unsigned int KeyboardWidth, KeyboardHeight;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600886 int rowY, colX, highlightRenderCount, hasHighlight, hasCapsHighlight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400887 GUIAction* mAction;
Dees_Troy30b962e2012-10-19 20:48:59 -0400888 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600889 COLOR mCapsHighlightColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400890};
891
892// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100893class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400894{
895public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200896 // w and h may be ignored, in which case, no bounding box is applied
897 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400898 virtual ~GUIInput();
899
900public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200901 // Render - Render the full object to the GL surface
902 // Return 0 on success, <0 on error
903 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400904
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200905 // Update - Update any UI component animations (called <= 30 FPS)
906 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
907 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400908
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200909 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100910 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400911
912 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200913 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
914 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400915
916 virtual int NotifyKeyboard(int key);
917
918protected:
919 virtual int GetSelection(int x, int y);
920
921 // Handles displaying the text properly when chars are added, deleted, or for scrolling
922 virtual int HandleTextLocation(int x);
923
924protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200925 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -0400926 GUIAction* mAction;
927 Resource* mBackground;
928 Resource* mCursor;
929 Resource* mFont;
930 std::string mText;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200931 std::string mLastValue;
Dees_Troy51a0e822012-09-05 15:24:24 -0400932 std::string mVariable;
933 std::string mMask;
934 std::string mMaskVariable;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200935 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400936 COLOR mCursorColor;
937 int scrollingX;
938 int lastX;
939 int mCursorLocation;
940 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
941 int mFontY;
942 unsigned skipChars;
943 unsigned mFontHeight;
944 unsigned CursorWidth;
945 bool mRendered;
946 bool HasMask;
947 bool DrawCursor;
948 bool isLocalChange;
949 bool HasAllowed;
950 bool HasDisabled;
951 std::string AllowedList;
952 std::string DisabledList;
953 unsigned MinLen;
954 unsigned MaxLen;
955};
956
957class HardwareKeyboard
958{
959public:
thatf37aec22015-02-01 13:38:35 +0100960 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400961 virtual ~HardwareKeyboard();
962
963public:
thatf37aec22015-02-01 13:38:35 +0100964 // called by the input handler for key events
965 int KeyDown(int key_code);
966 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100967
thatf37aec22015-02-01 13:38:35 +0100968 // called by the input handler when holding a key down
969 int KeyRepeat();
970
971 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100972 void ConsumeKeyRelease(int key);
973
974private:
thatf37aec22015-02-01 13:38:35 +0100975 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100976 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400977};
978
Vojtech Bocekede51c52014-02-07 23:58:09 +0100979class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +0200980{
981public:
982 GUISliderValue(xml_node<>* node);
983 virtual ~GUISliderValue();
984
985public:
986 // Render - Render the full object to the GL surface
987 // Return 0 on success, <0 on error
988 virtual int Render(void);
989
990 // Update - Update any UI component animations (called <= 30 FPS)
991 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
992 virtual int Update(void);
993
994 // SetPos - Update the position of the render object
995 // Return 0 on success, <0 on error
996 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
997
998 // NotifyTouch - Notify of a touch event
999 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1000 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1001
1002 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001003 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001004
1005 // SetPageFocus - Notify when a page gains or loses focus
1006 virtual void SetPageFocus(int inFocus);
1007
1008protected:
1009 int measureText(const std::string& str);
1010 int valueFromPct(float pct);
1011 float pctFromValue(int value);
1012 void loadValue(bool force = false);
1013
1014 std::string mVariable;
1015 int mMax;
1016 int mMin;
1017 int mValue;
1018 char *mValueStr;
1019 float mValuePct;
1020 std::string mMaxStr;
1021 std::string mMinStr;
1022 Resource *mFont;
1023 GUIText* mLabel;
1024 int mLabelW;
1025 COLOR mTextColor;
1026 COLOR mLineColor;
1027 COLOR mSliderColor;
1028 bool mShowRange;
1029 bool mShowCurr;
1030 int mLineX;
1031 int mLineY;
1032 int mLineH;
1033 int mLinePadding;
1034 int mPadding;
1035 int mSliderY;
1036 int mSliderW;
1037 int mSliderH;
1038 bool mRendered;
1039 int mFontHeight;
1040 GUIAction *mAction;
1041 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001042 int mLineW;
1043 bool mDragging;
1044 Resource *mBackgroundImage;
1045 Resource *mHandleImage;
1046 Resource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001047};
1048
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001049class MouseCursor : public RenderObject
1050{
1051public:
1052 MouseCursor(int posX, int posY);
1053 virtual ~MouseCursor();
1054
1055 virtual int Render(void);
1056 virtual int Update(void);
1057 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1058
1059 void Move(int deltaX, int deltaY);
1060 void GetPos(int& x, int& y);
1061 void LoadData(xml_node<>* node);
1062 void ResetData(int resX, int resY);
1063
1064private:
1065 int m_resX;
1066 int m_resY;
1067 bool m_moved;
1068 float m_speedMultiplier;
1069 COLOR m_color;
1070 Resource *m_image;
1071 bool m_present;
1072};
1073
Dees_Troy51a0e822012-09-05 15:24:24 -04001074// Helper APIs
1075bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, RenderObject::Placement* placement = NULL);
1076
1077#endif // _OBJECTS_HEADER
1078