blob: e70053e3b4e6d2141d686ef901687e3fce7f2578 [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);
that3f7b1ac2014-12-30 11:30:13 +0100362
363 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400364};
365
Vojtech Bocekede51c52014-02-07 23:58:09 +0100366class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400367{
368public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200369 GUIButton(xml_node<>* node);
370 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400371
372public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200373 // Render - Render the full object to the GL surface
374 // Return 0 on success, <0 on error
375 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400376
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200377 // Update - Update any UI component animations (called <= 30 FPS)
378 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
379 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400380
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200381 // SetPos - Update the position of the render object
382 // Return 0 on success, <0 on error
383 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400384
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200385 // NotifyTouch - Notify of a touch event
386 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
387 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400388
389protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200390 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100391 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200392 GUIText* mButtonLabel;
393 GUIAction* mAction;
394 int mTextX, mTextY, mTextW, mTextH;
395 int mIconX, mIconY, mIconW, mIconH;
396 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600397 bool hasHighlightColor;
398 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500399 bool hasFill;
400 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600401 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000402 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400403};
404
Vojtech Bocekede51c52014-02-07 23:58:09 +0100405class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400406{
407public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200408 GUICheckbox(xml_node<>* node);
409 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400410
411public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200412 // Render - Render the full object to the GL surface
413 // Return 0 on success, <0 on error
414 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400415
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200416 // Update - Update any UI component animations (called <= 30 FPS)
417 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
418 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400419
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200420 // SetPos - Update the position of the render object
421 // Return 0 on success, <0 on error
422 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400423
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200424 // NotifyTouch - Notify of a touch event
425 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
426 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400427
428protected:
thatf6ed8fc2015-02-14 20:23:16 +0100429 ImageResource* mChecked;
430 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200431 GUIText* mLabel;
432 int mTextX, mTextY;
433 int mCheckX, mCheckY, mCheckW, mCheckH;
434 int mLastState;
435 bool mRendered;
436 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400437};
438
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100439class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400440{
441public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100442 GUIScrollList(xml_node<>* node);
443 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400444
445public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200446 // Render - Render the full object to the GL surface
447 // Return 0 on success, <0 on error
448 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400449
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200450 // Update - Update any UI component animations (called <= 30 FPS)
451 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
452 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400453
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200454 // NotifyTouch - Notify of a touch event
455 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
456 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400457
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200458 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100459 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400460
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200461 // SetPos - Update the position of the render object
462 // Return 0 on success, <0 on error
463 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400464
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200465 // SetPageFocus - Notify when a page gains or loses focus
466 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400467
468protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100469 // derived classes need to implement these
470 // get number of items
471 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100472 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
473 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100474 // an item was selected
475 virtual void NotifySelect(size_t item_selected) {}
476
that0af77952015-02-25 08:52:19 +0100477 // render a standard-layout list item with optional icon and text
478 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
479
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100480 enum { NO_ITEM = (size_t)-1 };
481 // returns item index at coordinates or NO_ITEM if there is no item there
482 size_t HitTestItem(int x, int y);
483
484 // 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
485 void SetMaxIconSize(int w, int h);
486
487 // This will make sure that the item indicated by list_index is visible on the screen
488 void SetVisibleListLocation(size_t list_index);
489
490 // Handle scrolling changes for drags and kinetic scrolling
491 void HandleScrolling();
492
that9876ac32015-02-15 21:40:59 +0100493 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100494 int GetDisplayItemCount();
495
496 // Returns the size in pixels of a partial item or row size
497 int GetDisplayRemainder();
498
499protected:
500 // Background
501 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100502 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100503
504 // Header
505 COLOR mHeaderBackgroundColor;
506 COLOR mHeaderFontColor;
507 std::string mHeaderText; // Original header text without parsing any variables
508 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100509 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100510 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100511 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100512 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
513 int mHeaderSeparatorH; // Height of the separator between header and list items
514 COLOR mHeaderSeparatorColor; // color of the header separator
515
516 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100517 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100518 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100519 bool hasHighlightColor; // indicates if a highlight color was set
520 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100521 COLOR mFontHighlightColor;
522 int mFontHeight;
523 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
524 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
525 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
526 int mSeparatorH; // Height of the separator between items
527 COLOR mSeparatorColor; // color of the separator that is between items
528
thata9998212015-02-19 22:51:24 +0100529 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100530 int mFastScrollW; // width of the fastscroll area
531 int mFastScrollLineW; // width of the line for fastscroll rendering
532 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100533 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100534 COLOR mFastScrollLineColor;
535 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100536
537 // Scrolling and dynamic state
538 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
539 int mFastScrollRectCurrentH; // current height of fastscroll rect
540 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100541 bool hasScroll; // indicates that we have enough items in the list to scroll
542 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
543 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
544 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 +0100545 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 +0100546 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
547 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
548 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
549 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
550 int mUpdate; // indicates that a change took place and we need to re-render
551};
552
553class GUIFileSelector : public GUIScrollList
554{
555public:
556 GUIFileSelector(xml_node<>* node);
557 virtual ~GUIFileSelector();
558
559public:
560 // Update - Update any UI component animations (called <= 30 FPS)
561 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
562 virtual int Update(void);
563
564 // NotifyVarChange - Notify of a variable change
565 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
566
567 // SetPageFocus - Notify when a page gains or loses focus
568 virtual void SetPageFocus(int inFocus);
569
570 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100571 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100572 virtual void NotifySelect(size_t item_selected);
573
574protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200575 struct FileData {
576 std::string fileName;
577 unsigned char fileType; // Uses d_type format from struct dirent
578 mode_t protection; // Uses mode_t format from stat
579 uid_t userId;
580 gid_t groupId;
581 off_t fileSize;
582 time_t lastAccess; // Uses time_t format from stat
583 time_t lastModified; // Uses time_t format from stat
584 time_t lastStatChange; // Uses time_t format from stat
585 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400586
587protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200588 virtual int GetFileList(const std::string folder);
589 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400590
591protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200592 std::vector<FileData> mFolderList;
593 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100594 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600595 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100596 std::string mExtn; // used for filtering the file list, for example, *.zip
597 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
598 std::string mSortVariable; // data manager variable used to change the sorting of files
599 std::string mSelection; // set when the user selects an item without the full path like selecting /path/to/foo would just be set to foo
600 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
601 int mShowNavFolders; // indicates if the list should include the "up a level" item and allow you to traverse folders (nav folders are disabled for the restore list, for instance)
602 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100603 ImageResource* mFolderIcon;
604 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600605 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400606};
607
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100608class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400609{
610public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200611 GUIListBox(xml_node<>* node);
612 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400613
614public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200615 // Update - Update any UI component animations (called <= 30 FPS)
616 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
617 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400618
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200619 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100620 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400621
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200622 // SetPageFocus - Notify when a page gains or loses focus
623 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400624
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100625 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100626 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100627 virtual void NotifySelect(size_t item_selected);
628
Dees_Troy51a0e822012-09-05 15:24:24 -0400629protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200630 struct ListData {
631 std::string displayName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400632 std::string variableValue;
633 unsigned int selected;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200634 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400635
636protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200637 std::vector<ListData> mList;
638 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400639 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100640 ImageResource* mIconSelected;
641 ImageResource* mIconUnselected;
Dees_Troy51a0e822012-09-05 15:24:24 -0400642};
643
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100644class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500645{
646public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200647 GUIPartitionList(xml_node<>* node);
648 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500649
650public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200651 // Update - Update any UI component animations (called <= 30 FPS)
652 // 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 +0100653 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500654
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200655 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100656 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500657
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200658 // SetPageFocus - Notify when a page gains or loses focus
659 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500660
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100661 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100662 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100663 virtual void NotifySelect(size_t item_selected);
664
Dees_Troya13d74f2013-03-24 08:54:55 -0500665protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100666 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600667 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500668
669protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200670 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500671 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200672 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500673 std::string selectedList;
674 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500675 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100676 ImageResource* mIconSelected;
677 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500678 bool updateList;
679};
680
that8d46c092015-02-26 01:30:04 +0100681class GUIConsole : public GUIScrollList
682{
683public:
684 GUIConsole(xml_node<>* node);
685
686public:
687 // Render - Render the full object to the GL surface
688 // Return 0 on success, <0 on error
689 virtual int Render(void);
690
691 // Update - Update any UI component animations (called <= 30 FPS)
692 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
693 virtual int Update(void);
694
695 // IsInRegion - Checks if the request is handled by this object
696 // Return 1 if this object handles the request, 0 if not
697 virtual int IsInRegion(int x, int y);
698
699 // NotifyTouch - Notify of a touch event
700 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
701 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
702
703 // ScrollList interface
704 virtual size_t GetItemCount();
705 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
706 virtual void NotifySelect(size_t item_selected);
707protected:
708 enum SlideoutState
709 {
710 hidden = 0,
711 visible,
712 request_hide,
713 request_show
714 };
715
716 ImageResource* mSlideoutImage;
717 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
718 bool scrollToEnd; // true if we want to keep tracking the last line
719 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
720 int mSlideout;
721 SlideoutState mSlideoutState;
722 std::vector<std::string> rConsole;
723 std::vector<std::string> rConsoleColor;
724
725protected:
726 bool AddLines();
727 int RenderSlideout(void);
728 int RenderConsole(void);
729};
730
Dees_Troy51a0e822012-09-05 15:24:24 -0400731// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100732class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400733{
734public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200735 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400736
737public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200738 // Render - Render the full object to the GL surface
739 // Return 0 on success, <0 on error
740 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400741
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200742 // Update - Update any UI component animations (called <= 30 FPS)
743 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
744 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400745
746protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200747 AnimationResource* mAnimation;
748 int mFrame;
749 int mFPS;
750 int mLoop;
751 int mRender;
752 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400753};
754
Vojtech Bocekede51c52014-02-07 23:58:09 +0100755class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400756{
757public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200758 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400759
760public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200761 // Render - Render the full object to the GL surface
762 // Return 0 on success, <0 on error
763 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400764
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200765 // Update - Update any UI component animations (called <= 30 FPS)
766 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
767 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400768
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200769 // NotifyVarChange - Notify of a variable change
770 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100771 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400772
773protected:
thatf6ed8fc2015-02-14 20:23:16 +0100774 ImageResource* mEmptyBar;
775 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200776 std::string mMinValVar;
777 std::string mMaxValVar;
778 std::string mCurValVar;
779 float mSlide;
780 float mSlideInc;
781 int mSlideFrames;
782 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400783
784protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200785 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400786};
787
Vojtech Bocekede51c52014-02-07 23:58:09 +0100788class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400789{
790public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200791 GUISlider(xml_node<>* node);
792 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400793
794public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200795 // Render - Render the full object to the GL surface
796 // Return 0 on success, <0 on error
797 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400798
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200799 // Update - Update any UI component animations (called <= 30 FPS)
800 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
801 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400802
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200803 // NotifyTouch - Notify of a touch event
804 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
805 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400806
807protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200808 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600809 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100810 ImageResource* sSlider;
811 ImageResource* sSliderUsed;
812 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200813 int sTouchW, sTouchH;
814 int sCurTouchX;
815 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400816};
817
Dees_Troy51a0e822012-09-05 15:24:24 -0400818#define KEYBOARD_ACTION 253
819#define KEYBOARD_LAYOUT 254
820#define KEYBOARD_SWIPE_LEFT 252
821#define KEYBOARD_SWIPE_RIGHT 251
822#define KEYBOARD_ARROW_LEFT 250
823#define KEYBOARD_ARROW_RIGHT 249
824#define KEYBOARD_HOME 248
825#define KEYBOARD_END 247
826#define KEYBOARD_ARROW_UP 246
827#define KEYBOARD_ARROW_DOWN 245
828#define KEYBOARD_SPECIAL_KEYS 245
829#define KEYBOARD_BACKSPACE 8
830
Vojtech Bocekede51c52014-02-07 23:58:09 +0100831class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400832{
833public:
834 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200835 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400836
837public:
838 virtual int Render(void);
839 virtual int Update(void);
840 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
841 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
842
843protected:
thate79878b2015-03-14 23:07:23 +0100844 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200845 {
thate79878b2015-03-14 23:07:23 +0100846 unsigned char key; // ASCII code or one of the special KEYBOARD_* codes above
Dees_Troy51a0e822012-09-05 15:24:24 -0400847 unsigned char longpresskey;
that1a7ba972015-02-01 19:48:19 +0100848 int end_x;
849 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200850 };
thate79878b2015-03-14 23:07:23 +0100851 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatd86f49d2015-03-15 00:56:57 +0100852
853 enum {
854 MAX_KEYBOARD_LAYOUTS = 5,
855 MAX_KEYBOARD_ROWS = 9,
856 MAX_KEYBOARD_KEYS = 20
857 };
858 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600859 {
thatd86f49d2015-03-15 00:56:57 +0100860 ImageResource* keyboardImg;
861 struct Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
862 int row_end_y[MAX_KEYBOARD_ROWS];
863 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600864 int revert_layout;
865 };
thatd86f49d2015-03-15 00:56:57 +0100866 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400867
thate79878b2015-03-14 23:07:23 +0100868 // Find key at screen coordinates
869 Key* HitTestKey(int x, int y);
870
Dees_Troy51a0e822012-09-05 15:24:24 -0400871 bool mRendered;
872 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100873 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100874 bool CapsLockOn;
Dees_Troy51a0e822012-09-05 15:24:24 -0400875 unsigned int KeyboardWidth, KeyboardHeight;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600876 int rowY, colX, highlightRenderCount;
877 bool hasHighlight, hasCapsHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400878 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600879 COLOR mCapsHighlightColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400880};
881
882// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100883class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400884{
885public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200886 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400887 virtual ~GUIInput();
888
889public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200890 // Render - Render the full object to the GL surface
891 // Return 0 on success, <0 on error
892 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400893
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200894 // Update - Update any UI component animations (called <= 30 FPS)
895 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
896 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400897
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200898 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100899 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400900
901 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200902 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
903 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400904
905 virtual int NotifyKeyboard(int key);
906
907protected:
908 virtual int GetSelection(int x, int y);
909
910 // Handles displaying the text properly when chars are added, deleted, or for scrolling
911 virtual int HandleTextLocation(int x);
912
913protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200914 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -0400915 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +0100916 ImageResource* mBackground;
917 ImageResource* mCursor;
918 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -0400919 std::string mText;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200920 std::string mLastValue;
Dees_Troy51a0e822012-09-05 15:24:24 -0400921 std::string mVariable;
922 std::string mMask;
923 std::string mMaskVariable;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200924 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400925 COLOR mCursorColor;
926 int scrollingX;
927 int lastX;
928 int mCursorLocation;
929 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
930 int mFontY;
931 unsigned skipChars;
932 unsigned mFontHeight;
933 unsigned CursorWidth;
934 bool mRendered;
935 bool HasMask;
936 bool DrawCursor;
937 bool isLocalChange;
938 bool HasAllowed;
939 bool HasDisabled;
940 std::string AllowedList;
941 std::string DisabledList;
942 unsigned MinLen;
943 unsigned MaxLen;
944};
945
946class HardwareKeyboard
947{
948public:
thatf37aec22015-02-01 13:38:35 +0100949 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400950 virtual ~HardwareKeyboard();
951
952public:
thatf37aec22015-02-01 13:38:35 +0100953 // called by the input handler for key events
954 int KeyDown(int key_code);
955 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100956
thatf37aec22015-02-01 13:38:35 +0100957 // called by the input handler when holding a key down
958 int KeyRepeat();
959
960 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100961 void ConsumeKeyRelease(int key);
962
963private:
thatf37aec22015-02-01 13:38:35 +0100964 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100965 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400966};
967
Vojtech Bocekede51c52014-02-07 23:58:09 +0100968class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +0200969{
970public:
971 GUISliderValue(xml_node<>* node);
972 virtual ~GUISliderValue();
973
974public:
975 // Render - Render the full object to the GL surface
976 // Return 0 on success, <0 on error
977 virtual int Render(void);
978
979 // Update - Update any UI component animations (called <= 30 FPS)
980 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
981 virtual int Update(void);
982
983 // SetPos - Update the position of the render object
984 // Return 0 on success, <0 on error
985 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
986
987 // NotifyTouch - Notify of a touch event
988 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
989 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
990
991 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100992 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +0200993
994 // SetPageFocus - Notify when a page gains or loses focus
995 virtual void SetPageFocus(int inFocus);
996
997protected:
998 int measureText(const std::string& str);
999 int valueFromPct(float pct);
1000 float pctFromValue(int value);
1001 void loadValue(bool force = false);
1002
1003 std::string mVariable;
1004 int mMax;
1005 int mMin;
1006 int mValue;
1007 char *mValueStr;
1008 float mValuePct;
1009 std::string mMaxStr;
1010 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001011 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001012 GUIText* mLabel;
1013 int mLabelW;
1014 COLOR mTextColor;
1015 COLOR mLineColor;
1016 COLOR mSliderColor;
1017 bool mShowRange;
1018 bool mShowCurr;
1019 int mLineX;
1020 int mLineY;
1021 int mLineH;
1022 int mLinePadding;
1023 int mPadding;
1024 int mSliderY;
1025 int mSliderW;
1026 int mSliderH;
1027 bool mRendered;
1028 int mFontHeight;
1029 GUIAction *mAction;
1030 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001031 int mLineW;
1032 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001033 ImageResource *mBackgroundImage;
1034 ImageResource *mHandleImage;
1035 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001036};
1037
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001038class MouseCursor : public RenderObject
1039{
1040public:
1041 MouseCursor(int posX, int posY);
1042 virtual ~MouseCursor();
1043
1044 virtual int Render(void);
1045 virtual int Update(void);
1046 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1047
1048 void Move(int deltaX, int deltaY);
1049 void GetPos(int& x, int& y);
1050 void LoadData(xml_node<>* node);
1051 void ResetData(int resX, int resY);
1052
1053private:
1054 int m_resX;
1055 int m_resY;
1056 bool m_moved;
1057 float m_speedMultiplier;
1058 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001059 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001060 bool m_present;
1061};
1062
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001063class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1064{
1065public:
1066 GUIPatternPassword(xml_node<>* node);
1067 virtual ~GUIPatternPassword();
1068
1069public:
1070 virtual int Render(void);
1071 virtual int Update(void);
1072 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1073 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1074
1075protected:
1076 void CalculateDotPositions();
1077 void ResetActiveDots();
1078 void ConnectDot(int dot_idx);
1079 void ConnectIntermediateDots(int dot_idx);
1080 int InDot(int x, int y);
1081 bool DotUsed(int dot_idx);
1082 static bool IsInRect(int x, int y, int rx, int ry, int rw, int rh);
1083 void PatternDrawn();
1084
1085 struct Dot {
1086 int x;
1087 int y;
1088 bool active;
1089 };
1090
1091 Dot mDots[9];
1092 int mConnectedDots[9];
1093 size_t mConnectedDotsLen;
1094 int mCurLineX;
1095 int mCurLineY;
1096 bool mTrackingTouch;
1097 bool mNeedRender;
1098
1099 COLOR mDotColor;
1100 COLOR mActiveDotColor;
1101 COLOR mLineColor;
1102 ImageResource *mDotImage;
1103 ImageResource *mActiveDotImage;
1104 gr_surface mDotCircle;
1105 gr_surface mActiveDotCircle;
1106 int mDotRadius;
1107 int mLineWidth;
1108
1109 std::string mPassVar;
1110 GUIAction *mAction;
1111 int mUpdate;
1112};
1113
1114
Dees_Troy51a0e822012-09-05 15:24:24 -04001115// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001116xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001117std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1118int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1119int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1120int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001121COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001122COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1123FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1124ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1125AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
1126
Dees_Troy51a0e822012-09-05 15:24:24 -04001127bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, RenderObject::Placement* placement = NULL);
1128
1129#endif // _OBJECTS_HEADER
1130