blob: ee0f08b8f81f344808f12fd331cead23daef56d0 [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;
thatf6ed8fc2015-02-14 20:23:16 +0100214 FontResource* mFont;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200215 int mIsStatic;
216 int mVarChanged;
217 int mFontHeight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400218 unsigned maxWidth;
219 unsigned charSkip;
Dees_Troy51a0e822012-09-05 15:24:24 -0400220};
221
222// GUIImage - Used for static image
Vojtech Bocekede51c52014-02-07 23:58:09 +0100223class GUIImage : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400224{
225public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200226 GUIImage(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400227
228public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200229 // Render - Render the full object to the GL surface
230 // Return 0 on success, <0 on error
231 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400232
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200233 // SetRenderPos - Update the position of the object
234 // Return 0 on success, <0 on error
235 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400236
Dees_Troy4d12f962012-10-19 13:13:15 -0400237public:
238 bool isHighlighted;
239
Dees_Troy51a0e822012-09-05 15:24:24 -0400240protected:
thatf6ed8fc2015-02-14 20:23:16 +0100241 ImageResource* mImage;
242 ImageResource* mHighlightImage;
Dees_Troy51a0e822012-09-05 15:24:24 -0400243};
244
245// GUIFill - Used for fill colors
Vojtech Bocekede51c52014-02-07 23:58:09 +0100246class GUIFill : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400247{
248public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200249 GUIFill(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400250
251public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200252 // Render - Render the full object to the GL surface
253 // Return 0 on success, <0 on error
254 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400255
256protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200257 COLOR mColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400258};
259
260// GUIAction - Used for standard actions
Vojtech Bocekede51c52014-02-07 23:58:09 +0100261class GUIAction : public GUIObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400262{
thatc6085482015-01-09 22:12:43 +0100263 friend class ActionThread;
264
Dees_Troy51a0e822012-09-05 15:24:24 -0400265public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200266 GUIAction(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400267
268public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200269 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100270 virtual int NotifyKey(int key, bool down);
Vojtech Bocek07220562014-02-08 02:05:33 +0100271 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
that3f7b1ac2014-12-30 11:30:13 +0100272
273 int doActions();
Dees_Troy51a0e822012-09-05 15:24:24 -0400274
275protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200276 class Action
277 {
278 public:
279 std::string mFunction;
280 std::string mArg;
281 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400282
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200283 std::vector<Action> mActions;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100284 std::map<int, bool> mKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400285
286protected:
that73a52952015-01-28 23:07:34 +0100287 enum ThreadType { THREAD_NONE, THREAD_ACTION, THREAD_CANCEL };
288
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200289 int getKeyByName(std::string key);
that3f7b1ac2014-12-30 11:30:13 +0100290 int doAction(Action action);
that73a52952015-01-28 23:07:34 +0100291 ThreadType getThreadType(const Action& action);
Dees_Troy51a0e822012-09-05 15:24:24 -0400292 void simulate_progress_bar(void);
Ethan Yonker0d47eb52015-01-09 11:23:19 -0600293 int flash_zip(std::string filename, int* wipe_cache);
thatcc8ddca2015-01-03 01:59:36 +0100294 void reinject_after_flash();
Dees_Troy51a0e822012-09-05 15:24:24 -0400295 void operation_start(const string operation_name);
that3f7b1ac2014-12-30 11:30:13 +0100296 void operation_end(const int operation_status);
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +0000297 time_t Start;
that3f7b1ac2014-12-30 11:30:13 +0100298
299 // map action name to function pointer
300 typedef int (GUIAction::*execFunction)(std::string);
301 typedef std::map<std::string, execFunction> mapFunc;
302 static mapFunc mf;
thatc6085482015-01-09 22:12:43 +0100303 static std::set<std::string> setActionsRunningInCallerThread;
that3f7b1ac2014-12-30 11:30:13 +0100304
305 // GUI actions
306 int reboot(std::string arg);
307 int home(std::string arg);
308 int key(std::string arg);
309 int page(std::string arg);
310 int reload(std::string arg);
311 int readBackup(std::string arg);
312 int set(std::string arg);
313 int clear(std::string arg);
314 int mount(std::string arg);
315 int unmount(std::string arg);
316 int restoredefaultsettings(std::string arg);
317 int copylog(std::string arg);
318 int compute(std::string arg);
319 int setguitimezone(std::string arg);
320 int overlay(std::string arg);
321 int queuezip(std::string arg);
322 int cancelzip(std::string arg);
323 int queueclear(std::string arg);
324 int sleep(std::string arg);
325 int appenddatetobackupname(std::string arg);
326 int generatebackupname(std::string arg);
327 int checkpartitionlist(std::string arg);
328 int getpartitiondetails(std::string arg);
329 int screenshot(std::string arg);
330 int setbrightness(std::string arg);
331
thatc6085482015-01-09 22:12:43 +0100332 // (originally) threaded actions
that3f7b1ac2014-12-30 11:30:13 +0100333 int fileexists(std::string arg);
334 int flash(std::string arg);
335 int wipe(std::string arg);
336 int refreshsizes(std::string arg);
337 int nandroid(std::string arg);
338 int fixpermissions(std::string arg);
339 int dd(std::string arg);
340 int partitionsd(std::string arg);
341 int installhtcdumlock(std::string arg);
342 int htcdumlockrestoreboot(std::string arg);
343 int htcdumlockreflashrecovery(std::string arg);
344 int cmd(std::string arg);
345 int terminalcommand(std::string arg);
346 int killterminal(std::string arg);
347 int reinjecttwrp(std::string arg);
348 int checkbackupname(std::string arg);
349 int decrypt(std::string arg);
350 int adbsideload(std::string arg);
351 int adbsideloadcancel(std::string arg);
352 int openrecoveryscript(std::string arg);
353 int installsu(std::string arg);
354 int fixsu(std::string arg);
355 int decrypt_backup(std::string arg);
356 int repair(std::string arg);
357 int changefilesystem(std::string arg);
358 int startmtp(std::string arg);
359 int stopmtp(std::string arg);
Ethan Yonker96af84a2015-01-05 14:58:36 -0600360 int flashimage(std::string arg);
bigbiff7abc5fe2015-01-17 16:53:12 -0500361 int cancelbackup(std::string arg);
Ethan Yonkereb32b1f2015-05-18 10:23:03 -0500362 int checkpartitionlifetimewrites(std::string arg);
363 int mountsystemtoggle(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100364
365 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400366};
367
Vojtech Bocekede51c52014-02-07 23:58:09 +0100368class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400369{
370public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200371 GUIButton(xml_node<>* node);
372 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400373
374public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200375 // Render - Render the full object to the GL surface
376 // Return 0 on success, <0 on error
377 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400378
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200379 // Update - Update any UI component animations (called <= 30 FPS)
380 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
381 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400382
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200383 // SetPos - Update the position of the render object
384 // Return 0 on success, <0 on error
385 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400386
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200387 // NotifyTouch - Notify of a touch event
388 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
389 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400390
391protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200392 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100393 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200394 GUIText* mButtonLabel;
395 GUIAction* mAction;
396 int mTextX, mTextY, mTextW, mTextH;
397 int mIconX, mIconY, mIconW, mIconH;
398 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600399 bool hasHighlightColor;
400 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500401 bool hasFill;
402 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600403 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000404 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400405};
406
Vojtech Bocekede51c52014-02-07 23:58:09 +0100407class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400408{
409public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200410 GUICheckbox(xml_node<>* node);
411 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400412
413public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200414 // Render - Render the full object to the GL surface
415 // Return 0 on success, <0 on error
416 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400417
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200418 // Update - Update any UI component animations (called <= 30 FPS)
419 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
420 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400421
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200422 // SetPos - Update the position of the render object
423 // Return 0 on success, <0 on error
424 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400425
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200426 // NotifyTouch - Notify of a touch event
427 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
428 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400429
430protected:
thatf6ed8fc2015-02-14 20:23:16 +0100431 ImageResource* mChecked;
432 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200433 GUIText* mLabel;
434 int mTextX, mTextY;
435 int mCheckX, mCheckY, mCheckW, mCheckH;
436 int mLastState;
437 bool mRendered;
438 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400439};
440
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100441class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400442{
443public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100444 GUIScrollList(xml_node<>* node);
445 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400446
447public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200448 // Render - Render the full object to the GL surface
449 // Return 0 on success, <0 on error
450 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400451
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200452 // Update - Update any UI component animations (called <= 30 FPS)
453 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
454 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400455
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200456 // NotifyTouch - Notify of a touch event
457 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
458 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400459
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200460 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100461 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400462
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200463 // SetPos - Update the position of the render object
464 // Return 0 on success, <0 on error
465 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400466
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200467 // SetPageFocus - Notify when a page gains or loses focus
468 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400469
470protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100471 // derived classes need to implement these
472 // get number of items
473 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100474 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
475 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100476 // an item was selected
477 virtual void NotifySelect(size_t item_selected) {}
478
that0af77952015-02-25 08:52:19 +0100479 // render a standard-layout list item with optional icon and text
480 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
481
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100482 enum { NO_ITEM = (size_t)-1 };
483 // returns item index at coordinates or NO_ITEM if there is no item there
484 size_t HitTestItem(int x, int y);
485
486 // 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
487 void SetMaxIconSize(int w, int h);
488
489 // This will make sure that the item indicated by list_index is visible on the screen
490 void SetVisibleListLocation(size_t list_index);
491
492 // Handle scrolling changes for drags and kinetic scrolling
493 void HandleScrolling();
494
that9876ac32015-02-15 21:40:59 +0100495 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100496 int GetDisplayItemCount();
497
498 // Returns the size in pixels of a partial item or row size
499 int GetDisplayRemainder();
500
501protected:
502 // Background
503 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100504 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100505
506 // Header
507 COLOR mHeaderBackgroundColor;
508 COLOR mHeaderFontColor;
509 std::string mHeaderText; // Original header text without parsing any variables
510 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100511 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100512 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100513 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100514 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
515 int mHeaderSeparatorH; // Height of the separator between header and list items
516 COLOR mHeaderSeparatorColor; // color of the header separator
517
518 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100519 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100520 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100521 bool hasHighlightColor; // indicates if a highlight color was set
522 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100523 COLOR mFontHighlightColor;
524 int mFontHeight;
525 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
526 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
527 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
528 int mSeparatorH; // Height of the separator between items
529 COLOR mSeparatorColor; // color of the separator that is between items
530
thata9998212015-02-19 22:51:24 +0100531 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100532 int mFastScrollW; // width of the fastscroll area
533 int mFastScrollLineW; // width of the line for fastscroll rendering
534 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100535 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100536 COLOR mFastScrollLineColor;
537 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100538
539 // Scrolling and dynamic state
540 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
541 int mFastScrollRectCurrentH; // current height of fastscroll rect
542 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100543 bool hasScroll; // indicates that we have enough items in the list to scroll
544 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
545 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
546 int y_offset; // this is how many pixels offset in the y axis for per pixel scrolling, is always <= 0 and should never be < -actualItemHeight
that8d46c092015-02-26 01:30:04 +0100547 bool allowSelection; // true if touched item can be selected, false for pure read-only lists and the console
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100548 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
549 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
550 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
551 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
552 int mUpdate; // indicates that a change took place and we need to re-render
553};
554
555class GUIFileSelector : public GUIScrollList
556{
557public:
558 GUIFileSelector(xml_node<>* node);
559 virtual ~GUIFileSelector();
560
561public:
562 // Update - Update any UI component animations (called <= 30 FPS)
563 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
564 virtual int Update(void);
565
566 // NotifyVarChange - Notify of a variable change
567 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
568
569 // SetPageFocus - Notify when a page gains or loses focus
570 virtual void SetPageFocus(int inFocus);
571
572 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100573 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100574 virtual void NotifySelect(size_t item_selected);
575
576protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200577 struct FileData {
578 std::string fileName;
579 unsigned char fileType; // Uses d_type format from struct dirent
580 mode_t protection; // Uses mode_t format from stat
581 uid_t userId;
582 gid_t groupId;
583 off_t fileSize;
584 time_t lastAccess; // Uses time_t format from stat
585 time_t lastModified; // Uses time_t format from stat
586 time_t lastStatChange; // Uses time_t format from stat
587 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400588
589protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200590 virtual int GetFileList(const std::string folder);
591 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400592
593protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200594 std::vector<FileData> mFolderList;
595 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100596 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600597 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100598 std::string mExtn; // used for filtering the file list, for example, *.zip
599 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
600 std::string mSortVariable; // data manager variable used to change the sorting of files
601 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
602 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
603 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)
604 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100605 ImageResource* mFolderIcon;
606 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600607 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400608};
609
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100610class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400611{
612public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200613 GUIListBox(xml_node<>* node);
614 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400615
616public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200617 // Update - Update any UI component animations (called <= 30 FPS)
618 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
619 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400620
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200621 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100622 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400623
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200624 // SetPageFocus - Notify when a page gains or loses focus
625 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400626
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100627 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100628 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100629 virtual void NotifySelect(size_t item_selected);
630
Dees_Troy51a0e822012-09-05 15:24:24 -0400631protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200632 struct ListData {
633 std::string displayName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400634 std::string variableValue;
635 unsigned int selected;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200636 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400637
638protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200639 std::vector<ListData> mList;
640 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400641 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100642 ImageResource* mIconSelected;
643 ImageResource* mIconUnselected;
Dees_Troy51a0e822012-09-05 15:24:24 -0400644};
645
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100646class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500647{
648public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200649 GUIPartitionList(xml_node<>* node);
650 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500651
652public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200653 // Update - Update any UI component animations (called <= 30 FPS)
654 // 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 +0100655 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500656
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200657 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100658 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500659
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200660 // SetPageFocus - Notify when a page gains or loses focus
661 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500662
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100663 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100664 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100665 virtual void NotifySelect(size_t item_selected);
666
Dees_Troya13d74f2013-03-24 08:54:55 -0500667protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100668 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600669 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500670
671protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200672 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500673 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200674 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500675 std::string selectedList;
676 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500677 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100678 ImageResource* mIconSelected;
679 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500680 bool updateList;
681};
682
that8d46c092015-02-26 01:30:04 +0100683class GUIConsole : public GUIScrollList
684{
685public:
686 GUIConsole(xml_node<>* node);
687
688public:
689 // Render - Render the full object to the GL surface
690 // Return 0 on success, <0 on error
691 virtual int Render(void);
692
693 // Update - Update any UI component animations (called <= 30 FPS)
694 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
695 virtual int Update(void);
696
697 // IsInRegion - Checks if the request is handled by this object
698 // Return 1 if this object handles the request, 0 if not
699 virtual int IsInRegion(int x, int y);
700
701 // NotifyTouch - Notify of a touch event
702 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
703 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
704
705 // ScrollList interface
706 virtual size_t GetItemCount();
707 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
708 virtual void NotifySelect(size_t item_selected);
709protected:
710 enum SlideoutState
711 {
712 hidden = 0,
713 visible,
714 request_hide,
715 request_show
716 };
717
718 ImageResource* mSlideoutImage;
719 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
720 bool scrollToEnd; // true if we want to keep tracking the last line
721 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
722 int mSlideout;
723 SlideoutState mSlideoutState;
724 std::vector<std::string> rConsole;
725 std::vector<std::string> rConsoleColor;
726
727protected:
728 bool AddLines();
729 int RenderSlideout(void);
730 int RenderConsole(void);
731};
732
Dees_Troy51a0e822012-09-05 15:24:24 -0400733// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100734class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400735{
736public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200737 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400738
739public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200740 // Render - Render the full object to the GL surface
741 // Return 0 on success, <0 on error
742 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400743
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200744 // Update - Update any UI component animations (called <= 30 FPS)
745 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
746 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400747
748protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200749 AnimationResource* mAnimation;
750 int mFrame;
751 int mFPS;
752 int mLoop;
753 int mRender;
754 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400755};
756
Vojtech Bocekede51c52014-02-07 23:58:09 +0100757class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400758{
759public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200760 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400761
762public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200763 // Render - Render the full object to the GL surface
764 // Return 0 on success, <0 on error
765 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400766
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200767 // Update - Update any UI component animations (called <= 30 FPS)
768 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
769 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400770
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200771 // NotifyVarChange - Notify of a variable change
772 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100773 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400774
775protected:
thatf6ed8fc2015-02-14 20:23:16 +0100776 ImageResource* mEmptyBar;
777 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200778 std::string mMinValVar;
779 std::string mMaxValVar;
780 std::string mCurValVar;
781 float mSlide;
782 float mSlideInc;
783 int mSlideFrames;
784 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400785
786protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200787 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400788};
789
Vojtech Bocekede51c52014-02-07 23:58:09 +0100790class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400791{
792public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200793 GUISlider(xml_node<>* node);
794 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400795
796public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200797 // Render - Render the full object to the GL surface
798 // Return 0 on success, <0 on error
799 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400800
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200801 // Update - Update any UI component animations (called <= 30 FPS)
802 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
803 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400804
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200805 // NotifyTouch - Notify of a touch event
806 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
807 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400808
809protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200810 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600811 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100812 ImageResource* sSlider;
813 ImageResource* sSliderUsed;
814 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200815 int sTouchW, sTouchH;
816 int sCurTouchX;
817 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400818};
819
Dees_Troy51a0e822012-09-05 15:24:24 -0400820#define KEYBOARD_ACTION 253
821#define KEYBOARD_LAYOUT 254
822#define KEYBOARD_SWIPE_LEFT 252
823#define KEYBOARD_SWIPE_RIGHT 251
824#define KEYBOARD_ARROW_LEFT 250
825#define KEYBOARD_ARROW_RIGHT 249
826#define KEYBOARD_HOME 248
827#define KEYBOARD_END 247
828#define KEYBOARD_ARROW_UP 246
829#define KEYBOARD_ARROW_DOWN 245
830#define KEYBOARD_SPECIAL_KEYS 245
831#define KEYBOARD_BACKSPACE 8
832
Vojtech Bocekede51c52014-02-07 23:58:09 +0100833class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400834{
835public:
836 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200837 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400838
839public:
840 virtual int Render(void);
841 virtual int Update(void);
842 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
843 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
844
845protected:
thate79878b2015-03-14 23:07:23 +0100846 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200847 {
thate79878b2015-03-14 23:07:23 +0100848 unsigned char key; // ASCII code or one of the special KEYBOARD_* codes above
Dees_Troy51a0e822012-09-05 15:24:24 -0400849 unsigned char longpresskey;
that1a7ba972015-02-01 19:48:19 +0100850 int end_x;
851 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200852 };
thate79878b2015-03-14 23:07:23 +0100853 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatd86f49d2015-03-15 00:56:57 +0100854
855 enum {
856 MAX_KEYBOARD_LAYOUTS = 5,
857 MAX_KEYBOARD_ROWS = 9,
858 MAX_KEYBOARD_KEYS = 20
859 };
860 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600861 {
thatd86f49d2015-03-15 00:56:57 +0100862 ImageResource* keyboardImg;
863 struct Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
864 int row_end_y[MAX_KEYBOARD_ROWS];
865 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600866 int revert_layout;
867 };
thatd86f49d2015-03-15 00:56:57 +0100868 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400869
thate79878b2015-03-14 23:07:23 +0100870 // Find key at screen coordinates
871 Key* HitTestKey(int x, int y);
872
Dees_Troy51a0e822012-09-05 15:24:24 -0400873 bool mRendered;
874 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100875 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100876 bool CapsLockOn;
Dees_Troy51a0e822012-09-05 15:24:24 -0400877 unsigned int KeyboardWidth, KeyboardHeight;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600878 int rowY, colX, highlightRenderCount;
879 bool hasHighlight, hasCapsHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400880 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600881 COLOR mCapsHighlightColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400882};
883
884// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100885class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400886{
887public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200888 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400889 virtual ~GUIInput();
890
891public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200892 // Render - Render the full object to the GL surface
893 // Return 0 on success, <0 on error
894 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400895
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200896 // Update - Update any UI component animations (called <= 30 FPS)
897 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
898 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400899
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200900 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100901 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400902
903 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200904 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
905 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400906
907 virtual int NotifyKeyboard(int key);
908
909protected:
910 virtual int GetSelection(int x, int y);
911
912 // Handles displaying the text properly when chars are added, deleted, or for scrolling
913 virtual int HandleTextLocation(int x);
914
915protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200916 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -0400917 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +0100918 ImageResource* mBackground;
919 ImageResource* mCursor;
920 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -0400921 std::string mText;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200922 std::string mLastValue;
Dees_Troy51a0e822012-09-05 15:24:24 -0400923 std::string mVariable;
924 std::string mMask;
925 std::string mMaskVariable;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200926 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400927 COLOR mCursorColor;
928 int scrollingX;
929 int lastX;
930 int mCursorLocation;
931 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
932 int mFontY;
933 unsigned skipChars;
934 unsigned mFontHeight;
935 unsigned CursorWidth;
936 bool mRendered;
937 bool HasMask;
938 bool DrawCursor;
939 bool isLocalChange;
940 bool HasAllowed;
941 bool HasDisabled;
942 std::string AllowedList;
943 std::string DisabledList;
944 unsigned MinLen;
945 unsigned MaxLen;
946};
947
948class HardwareKeyboard
949{
950public:
thatf37aec22015-02-01 13:38:35 +0100951 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400952 virtual ~HardwareKeyboard();
953
954public:
thatf37aec22015-02-01 13:38:35 +0100955 // called by the input handler for key events
956 int KeyDown(int key_code);
957 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100958
thatf37aec22015-02-01 13:38:35 +0100959 // called by the input handler when holding a key down
960 int KeyRepeat();
961
962 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100963 void ConsumeKeyRelease(int key);
964
965private:
thatf37aec22015-02-01 13:38:35 +0100966 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100967 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400968};
969
Vojtech Bocekede51c52014-02-07 23:58:09 +0100970class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +0200971{
972public:
973 GUISliderValue(xml_node<>* node);
974 virtual ~GUISliderValue();
975
976public:
977 // Render - Render the full object to the GL surface
978 // Return 0 on success, <0 on error
979 virtual int Render(void);
980
981 // Update - Update any UI component animations (called <= 30 FPS)
982 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
983 virtual int Update(void);
984
985 // SetPos - Update the position of the render object
986 // Return 0 on success, <0 on error
987 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
988
989 // NotifyTouch - Notify of a touch event
990 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
991 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
992
993 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100994 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +0200995
996 // SetPageFocus - Notify when a page gains or loses focus
997 virtual void SetPageFocus(int inFocus);
998
999protected:
1000 int measureText(const std::string& str);
1001 int valueFromPct(float pct);
1002 float pctFromValue(int value);
1003 void loadValue(bool force = false);
1004
1005 std::string mVariable;
1006 int mMax;
1007 int mMin;
1008 int mValue;
1009 char *mValueStr;
1010 float mValuePct;
1011 std::string mMaxStr;
1012 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001013 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001014 GUIText* mLabel;
1015 int mLabelW;
1016 COLOR mTextColor;
1017 COLOR mLineColor;
1018 COLOR mSliderColor;
1019 bool mShowRange;
1020 bool mShowCurr;
1021 int mLineX;
1022 int mLineY;
1023 int mLineH;
1024 int mLinePadding;
1025 int mPadding;
1026 int mSliderY;
1027 int mSliderW;
1028 int mSliderH;
1029 bool mRendered;
1030 int mFontHeight;
1031 GUIAction *mAction;
1032 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001033 int mLineW;
1034 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001035 ImageResource *mBackgroundImage;
1036 ImageResource *mHandleImage;
1037 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001038};
1039
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001040class MouseCursor : public RenderObject
1041{
1042public:
1043 MouseCursor(int posX, int posY);
1044 virtual ~MouseCursor();
1045
1046 virtual int Render(void);
1047 virtual int Update(void);
1048 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1049
1050 void Move(int deltaX, int deltaY);
1051 void GetPos(int& x, int& y);
1052 void LoadData(xml_node<>* node);
1053 void ResetData(int resX, int resY);
1054
1055private:
1056 int m_resX;
1057 int m_resY;
1058 bool m_moved;
1059 float m_speedMultiplier;
1060 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001061 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001062 bool m_present;
1063};
1064
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001065class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1066{
1067public:
1068 GUIPatternPassword(xml_node<>* node);
1069 virtual ~GUIPatternPassword();
1070
1071public:
1072 virtual int Render(void);
1073 virtual int Update(void);
1074 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1075 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1076
1077protected:
1078 void CalculateDotPositions();
1079 void ResetActiveDots();
1080 void ConnectDot(int dot_idx);
1081 void ConnectIntermediateDots(int dot_idx);
1082 int InDot(int x, int y);
1083 bool DotUsed(int dot_idx);
1084 static bool IsInRect(int x, int y, int rx, int ry, int rw, int rh);
1085 void PatternDrawn();
1086
1087 struct Dot {
1088 int x;
1089 int y;
1090 bool active;
1091 };
1092
1093 Dot mDots[9];
1094 int mConnectedDots[9];
1095 size_t mConnectedDotsLen;
1096 int mCurLineX;
1097 int mCurLineY;
1098 bool mTrackingTouch;
1099 bool mNeedRender;
1100
1101 COLOR mDotColor;
1102 COLOR mActiveDotColor;
1103 COLOR mLineColor;
1104 ImageResource *mDotImage;
1105 ImageResource *mActiveDotImage;
1106 gr_surface mDotCircle;
1107 gr_surface mActiveDotCircle;
1108 int mDotRadius;
1109 int mLineWidth;
1110
1111 std::string mPassVar;
1112 GUIAction *mAction;
1113 int mUpdate;
1114};
1115
1116
Dees_Troy51a0e822012-09-05 15:24:24 -04001117// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001118xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001119std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1120int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1121int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1122int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001123COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001124COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1125FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1126ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1127AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
1128
Dees_Troy51a0e822012-09-05 15:24:24 -04001129bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, RenderObject::Placement* placement = NULL);
1130
1131#endif // _OBJECTS_HEADER
1132