blob: 624db07f976d34551dcb0c15c4f871cfff28c042 [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);
Ethan Yonkera2719152015-05-28 09:44:41 -0500357 int resize(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100358 int changefilesystem(std::string arg);
359 int startmtp(std::string arg);
360 int stopmtp(std::string arg);
Ethan Yonker96af84a2015-01-05 14:58:36 -0600361 int flashimage(std::string arg);
bigbiff7abc5fe2015-01-17 16:53:12 -0500362 int cancelbackup(std::string arg);
Ethan Yonkereb32b1f2015-05-18 10:23:03 -0500363 int checkpartitionlifetimewrites(std::string arg);
364 int mountsystemtoggle(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100365
366 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400367};
368
Vojtech Bocekede51c52014-02-07 23:58:09 +0100369class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400370{
371public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200372 GUIButton(xml_node<>* node);
373 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400374
375public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200376 // Render - Render the full object to the GL surface
377 // Return 0 on success, <0 on error
378 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400379
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200380 // Update - Update any UI component animations (called <= 30 FPS)
381 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
382 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400383
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200384 // SetPos - Update the position of the render object
385 // Return 0 on success, <0 on error
386 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400387
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200388 // NotifyTouch - Notify of a touch event
389 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
390 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400391
392protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200393 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100394 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200395 GUIText* mButtonLabel;
396 GUIAction* mAction;
397 int mTextX, mTextY, mTextW, mTextH;
398 int mIconX, mIconY, mIconW, mIconH;
399 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600400 bool hasHighlightColor;
401 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500402 bool hasFill;
403 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600404 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000405 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400406};
407
Vojtech Bocekede51c52014-02-07 23:58:09 +0100408class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400409{
410public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200411 GUICheckbox(xml_node<>* node);
412 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400413
414public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200415 // Render - Render the full object to the GL surface
416 // Return 0 on success, <0 on error
417 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400418
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200419 // Update - Update any UI component animations (called <= 30 FPS)
420 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
421 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400422
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200423 // SetPos - Update the position of the render object
424 // Return 0 on success, <0 on error
425 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400426
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200427 // NotifyTouch - Notify of a touch event
428 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
429 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400430
431protected:
thatf6ed8fc2015-02-14 20:23:16 +0100432 ImageResource* mChecked;
433 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200434 GUIText* mLabel;
435 int mTextX, mTextY;
436 int mCheckX, mCheckY, mCheckW, mCheckH;
437 int mLastState;
438 bool mRendered;
439 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400440};
441
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100442class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400443{
444public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100445 GUIScrollList(xml_node<>* node);
446 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400447
448public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200449 // Render - Render the full object to the GL surface
450 // Return 0 on success, <0 on error
451 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400452
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200453 // Update - Update any UI component animations (called <= 30 FPS)
454 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
455 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400456
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200457 // NotifyTouch - Notify of a touch event
458 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
459 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400460
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200461 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100462 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400463
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200464 // SetPos - Update the position of the render object
465 // Return 0 on success, <0 on error
466 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400467
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200468 // SetPageFocus - Notify when a page gains or loses focus
469 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400470
471protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100472 // derived classes need to implement these
473 // get number of items
474 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100475 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
476 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100477 // an item was selected
478 virtual void NotifySelect(size_t item_selected) {}
479
that0af77952015-02-25 08:52:19 +0100480 // render a standard-layout list item with optional icon and text
481 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
482
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100483 enum { NO_ITEM = (size_t)-1 };
484 // returns item index at coordinates or NO_ITEM if there is no item there
485 size_t HitTestItem(int x, int y);
486
487 // 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
488 void SetMaxIconSize(int w, int h);
489
490 // This will make sure that the item indicated by list_index is visible on the screen
491 void SetVisibleListLocation(size_t list_index);
492
493 // Handle scrolling changes for drags and kinetic scrolling
494 void HandleScrolling();
495
that9876ac32015-02-15 21:40:59 +0100496 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100497 int GetDisplayItemCount();
498
499 // Returns the size in pixels of a partial item or row size
500 int GetDisplayRemainder();
501
502protected:
503 // Background
504 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100505 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100506
507 // Header
508 COLOR mHeaderBackgroundColor;
509 COLOR mHeaderFontColor;
510 std::string mHeaderText; // Original header text without parsing any variables
511 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100512 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100513 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100514 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100515 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
516 int mHeaderSeparatorH; // Height of the separator between header and list items
517 COLOR mHeaderSeparatorColor; // color of the header separator
518
519 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100520 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100521 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100522 bool hasHighlightColor; // indicates if a highlight color was set
523 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100524 COLOR mFontHighlightColor;
525 int mFontHeight;
526 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
527 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
528 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
529 int mSeparatorH; // Height of the separator between items
530 COLOR mSeparatorColor; // color of the separator that is between items
531
thata9998212015-02-19 22:51:24 +0100532 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100533 int mFastScrollW; // width of the fastscroll area
534 int mFastScrollLineW; // width of the line for fastscroll rendering
535 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100536 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100537 COLOR mFastScrollLineColor;
538 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100539
540 // Scrolling and dynamic state
541 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
542 int mFastScrollRectCurrentH; // current height of fastscroll rect
543 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100544 bool hasScroll; // indicates that we have enough items in the list to scroll
545 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
546 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
547 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 +0100548 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 +0100549 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
550 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
551 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
552 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
553 int mUpdate; // indicates that a change took place and we need to re-render
554};
555
556class GUIFileSelector : public GUIScrollList
557{
558public:
559 GUIFileSelector(xml_node<>* node);
560 virtual ~GUIFileSelector();
561
562public:
563 // Update - Update any UI component animations (called <= 30 FPS)
564 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
565 virtual int Update(void);
566
567 // NotifyVarChange - Notify of a variable change
568 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
569
570 // SetPageFocus - Notify when a page gains or loses focus
571 virtual void SetPageFocus(int inFocus);
572
573 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100574 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100575 virtual void NotifySelect(size_t item_selected);
576
577protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200578 struct FileData {
579 std::string fileName;
580 unsigned char fileType; // Uses d_type format from struct dirent
581 mode_t protection; // Uses mode_t format from stat
582 uid_t userId;
583 gid_t groupId;
584 off_t fileSize;
585 time_t lastAccess; // Uses time_t format from stat
586 time_t lastModified; // Uses time_t format from stat
587 time_t lastStatChange; // Uses time_t format from stat
588 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400589
590protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200591 virtual int GetFileList(const std::string folder);
592 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400593
594protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200595 std::vector<FileData> mFolderList;
596 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100597 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600598 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100599 std::string mExtn; // used for filtering the file list, for example, *.zip
600 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
601 std::string mSortVariable; // data manager variable used to change the sorting of files
602 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
603 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
604 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)
605 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100606 ImageResource* mFolderIcon;
607 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600608 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400609};
610
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100611class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400612{
613public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200614 GUIListBox(xml_node<>* node);
615 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400616
617public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200618 // Update - Update any UI component animations (called <= 30 FPS)
619 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
620 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400621
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200622 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100623 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400624
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200625 // SetPageFocus - Notify when a page gains or loses focus
626 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400627
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100628 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100629 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100630 virtual void NotifySelect(size_t item_selected);
631
Dees_Troy51a0e822012-09-05 15:24:24 -0400632protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200633 struct ListData {
634 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500635 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400636 std::string variableValue;
637 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200638 GUIAction* action;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200639 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400640
641protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200642 std::vector<ListData> mList;
643 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400644 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100645 ImageResource* mIconSelected;
646 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500647 bool isCheckList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400648};
649
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100650class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500651{
652public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200653 GUIPartitionList(xml_node<>* node);
654 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500655
656public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200657 // Update - Update any UI component animations (called <= 30 FPS)
658 // 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 +0100659 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500660
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200661 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100662 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500663
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200664 // SetPageFocus - Notify when a page gains or loses focus
665 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500666
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100667 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100668 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100669 virtual void NotifySelect(size_t item_selected);
670
Dees_Troya13d74f2013-03-24 08:54:55 -0500671protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100672 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600673 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500674
675protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200676 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500677 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200678 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500679 std::string selectedList;
680 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500681 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100682 ImageResource* mIconSelected;
683 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500684 bool updateList;
685};
686
that8d46c092015-02-26 01:30:04 +0100687class GUIConsole : public GUIScrollList
688{
689public:
690 GUIConsole(xml_node<>* node);
691
692public:
693 // Render - Render the full object to the GL surface
694 // Return 0 on success, <0 on error
695 virtual int Render(void);
696
697 // Update - Update any UI component animations (called <= 30 FPS)
698 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
699 virtual int Update(void);
700
701 // IsInRegion - Checks if the request is handled by this object
702 // Return 1 if this object handles the request, 0 if not
703 virtual int IsInRegion(int x, int y);
704
705 // NotifyTouch - Notify of a touch event
706 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
707 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
708
709 // ScrollList interface
710 virtual size_t GetItemCount();
711 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
712 virtual void NotifySelect(size_t item_selected);
713protected:
714 enum SlideoutState
715 {
716 hidden = 0,
717 visible,
718 request_hide,
719 request_show
720 };
721
722 ImageResource* mSlideoutImage;
723 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
724 bool scrollToEnd; // true if we want to keep tracking the last line
725 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
726 int mSlideout;
727 SlideoutState mSlideoutState;
728 std::vector<std::string> rConsole;
729 std::vector<std::string> rConsoleColor;
730
731protected:
732 bool AddLines();
733 int RenderSlideout(void);
734 int RenderConsole(void);
735};
736
Dees_Troy51a0e822012-09-05 15:24:24 -0400737// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100738class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400739{
740public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200741 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400742
743public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200744 // Render - Render the full object to the GL surface
745 // Return 0 on success, <0 on error
746 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400747
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200748 // Update - Update any UI component animations (called <= 30 FPS)
749 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
750 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400751
752protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200753 AnimationResource* mAnimation;
754 int mFrame;
755 int mFPS;
756 int mLoop;
757 int mRender;
758 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400759};
760
Vojtech Bocekede51c52014-02-07 23:58:09 +0100761class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400762{
763public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200764 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400765
766public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200767 // Render - Render the full object to the GL surface
768 // Return 0 on success, <0 on error
769 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400770
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200771 // Update - Update any UI component animations (called <= 30 FPS)
772 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
773 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400774
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200775 // NotifyVarChange - Notify of a variable change
776 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100777 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400778
779protected:
thatf6ed8fc2015-02-14 20:23:16 +0100780 ImageResource* mEmptyBar;
781 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200782 std::string mMinValVar;
783 std::string mMaxValVar;
784 std::string mCurValVar;
785 float mSlide;
786 float mSlideInc;
787 int mSlideFrames;
788 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400789
790protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200791 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400792};
793
Vojtech Bocekede51c52014-02-07 23:58:09 +0100794class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400795{
796public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200797 GUISlider(xml_node<>* node);
798 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400799
800public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200801 // Render - Render the full object to the GL surface
802 // Return 0 on success, <0 on error
803 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400804
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200805 // Update - Update any UI component animations (called <= 30 FPS)
806 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
807 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400808
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200809 // NotifyTouch - Notify of a touch event
810 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
811 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400812
813protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200814 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600815 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100816 ImageResource* sSlider;
817 ImageResource* sSliderUsed;
818 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200819 int sTouchW, sTouchH;
820 int sCurTouchX;
821 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400822};
823
Dees_Troy51a0e822012-09-05 15:24:24 -0400824#define KEYBOARD_ACTION 253
825#define KEYBOARD_LAYOUT 254
826#define KEYBOARD_SWIPE_LEFT 252
827#define KEYBOARD_SWIPE_RIGHT 251
828#define KEYBOARD_ARROW_LEFT 250
829#define KEYBOARD_ARROW_RIGHT 249
830#define KEYBOARD_HOME 248
831#define KEYBOARD_END 247
832#define KEYBOARD_ARROW_UP 246
833#define KEYBOARD_ARROW_DOWN 245
834#define KEYBOARD_SPECIAL_KEYS 245
835#define KEYBOARD_BACKSPACE 8
836
Vojtech Bocekede51c52014-02-07 23:58:09 +0100837class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400838{
839public:
840 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200841 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400842
843public:
844 virtual int Render(void);
845 virtual int Update(void);
846 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
847 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
848
849protected:
thate79878b2015-03-14 23:07:23 +0100850 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200851 {
thate79878b2015-03-14 23:07:23 +0100852 unsigned char key; // ASCII code or one of the special KEYBOARD_* codes above
Dees_Troy51a0e822012-09-05 15:24:24 -0400853 unsigned char longpresskey;
that1a7ba972015-02-01 19:48:19 +0100854 int end_x;
855 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200856 };
thate79878b2015-03-14 23:07:23 +0100857 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200858 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200859 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
thatd86f49d2015-03-15 00:56:57 +0100860
861 enum {
862 MAX_KEYBOARD_LAYOUTS = 5,
863 MAX_KEYBOARD_ROWS = 9,
864 MAX_KEYBOARD_KEYS = 20
865 };
866 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600867 {
thatd86f49d2015-03-15 00:56:57 +0100868 ImageResource* keyboardImg;
869 struct Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
870 int row_end_y[MAX_KEYBOARD_ROWS];
871 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600872 int revert_layout;
873 };
thatd86f49d2015-03-15 00:56:57 +0100874 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400875
thatf256b722015-05-23 20:44:12 +0200876 struct KeyLabel
877 {
878 unsigned char key; // same as in struct Key
879 int layout_from; // 1-based; 0 for labels that apply to all layouts
880 int layout_to; // same as Key.layout
881 string text; // key label text
882 ImageResource* image; // image (overrides text if defined)
883 };
884 std::vector<KeyLabel> mKeyLabels;
885
thate79878b2015-03-14 23:07:23 +0100886 // Find key at screen coordinates
887 Key* HitTestKey(int x, int y);
888
Dees_Troy51a0e822012-09-05 15:24:24 -0400889 bool mRendered;
890 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100891 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100892 bool CapsLockOn;
thatf6b20662015-06-25 21:51:37 +0200893 int highlightRenderCount;
894 Key* currentKey;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600895 bool hasHighlight, hasCapsHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400896 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600897 COLOR mCapsHighlightColor;
thatf256b722015-05-23 20:44:12 +0200898 COLOR mFontColor; // for centered key labels
899 COLOR mFontColorSmall; // for centered key labels
900 FontResource* mFont; // for main key labels
901 FontResource* mSmallFont; // for key labels like "?123"
902 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200903 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200904 COLOR mLongpressFontColor;
905 COLOR mBackgroundColor; // keyboard background color
906 COLOR mKeyColorAlphanumeric; // key background color
907 COLOR mKeyColorOther; // key background color
908 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400909};
910
911// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100912class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400913{
914public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200915 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400916 virtual ~GUIInput();
917
918public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200919 // Render - Render the full object to the GL surface
920 // Return 0 on success, <0 on error
921 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400922
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200923 // Update - Update any UI component animations (called <= 30 FPS)
924 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
925 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400926
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200927 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100928 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400929
930 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200931 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
932 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400933
934 virtual int NotifyKeyboard(int key);
935
936protected:
937 virtual int GetSelection(int x, int y);
938
939 // Handles displaying the text properly when chars are added, deleted, or for scrolling
940 virtual int HandleTextLocation(int x);
941
942protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200943 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -0400944 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +0100945 ImageResource* mBackground;
946 ImageResource* mCursor;
947 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -0400948 std::string mText;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200949 std::string mLastValue;
Dees_Troy51a0e822012-09-05 15:24:24 -0400950 std::string mVariable;
951 std::string mMask;
952 std::string mMaskVariable;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200953 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400954 COLOR mCursorColor;
955 int scrollingX;
956 int lastX;
957 int mCursorLocation;
958 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
959 int mFontY;
960 unsigned skipChars;
961 unsigned mFontHeight;
962 unsigned CursorWidth;
963 bool mRendered;
964 bool HasMask;
965 bool DrawCursor;
966 bool isLocalChange;
967 bool HasAllowed;
968 bool HasDisabled;
969 std::string AllowedList;
970 std::string DisabledList;
971 unsigned MinLen;
972 unsigned MaxLen;
973};
974
975class HardwareKeyboard
976{
977public:
thatf37aec22015-02-01 13:38:35 +0100978 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400979 virtual ~HardwareKeyboard();
980
981public:
thatf37aec22015-02-01 13:38:35 +0100982 // called by the input handler for key events
983 int KeyDown(int key_code);
984 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100985
thatf37aec22015-02-01 13:38:35 +0100986 // called by the input handler when holding a key down
987 int KeyRepeat();
988
989 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100990 void ConsumeKeyRelease(int key);
991
992private:
thatf37aec22015-02-01 13:38:35 +0100993 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100994 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400995};
996
Vojtech Bocekede51c52014-02-07 23:58:09 +0100997class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +0200998{
999public:
1000 GUISliderValue(xml_node<>* node);
1001 virtual ~GUISliderValue();
1002
1003public:
1004 // Render - Render the full object to the GL surface
1005 // Return 0 on success, <0 on error
1006 virtual int Render(void);
1007
1008 // Update - Update any UI component animations (called <= 30 FPS)
1009 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1010 virtual int Update(void);
1011
1012 // SetPos - Update the position of the render object
1013 // Return 0 on success, <0 on error
1014 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1015
1016 // NotifyTouch - Notify of a touch event
1017 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1018 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1019
1020 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001021 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001022
1023 // SetPageFocus - Notify when a page gains or loses focus
1024 virtual void SetPageFocus(int inFocus);
1025
1026protected:
1027 int measureText(const std::string& str);
1028 int valueFromPct(float pct);
1029 float pctFromValue(int value);
1030 void loadValue(bool force = false);
1031
1032 std::string mVariable;
1033 int mMax;
1034 int mMin;
1035 int mValue;
1036 char *mValueStr;
1037 float mValuePct;
1038 std::string mMaxStr;
1039 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001040 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001041 GUIText* mLabel;
1042 int mLabelW;
1043 COLOR mTextColor;
1044 COLOR mLineColor;
1045 COLOR mSliderColor;
1046 bool mShowRange;
1047 bool mShowCurr;
1048 int mLineX;
1049 int mLineY;
1050 int mLineH;
1051 int mLinePadding;
1052 int mPadding;
1053 int mSliderY;
1054 int mSliderW;
1055 int mSliderH;
1056 bool mRendered;
1057 int mFontHeight;
1058 GUIAction *mAction;
1059 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001060 int mLineW;
1061 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001062 ImageResource *mBackgroundImage;
1063 ImageResource *mHandleImage;
1064 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001065};
1066
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001067class MouseCursor : public RenderObject
1068{
1069public:
1070 MouseCursor(int posX, int posY);
1071 virtual ~MouseCursor();
1072
1073 virtual int Render(void);
1074 virtual int Update(void);
1075 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1076
1077 void Move(int deltaX, int deltaY);
1078 void GetPos(int& x, int& y);
1079 void LoadData(xml_node<>* node);
1080 void ResetData(int resX, int resY);
1081
1082private:
1083 int m_resX;
1084 int m_resY;
1085 bool m_moved;
1086 float m_speedMultiplier;
1087 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001088 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001089 bool m_present;
1090};
1091
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001092class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1093{
1094public:
1095 GUIPatternPassword(xml_node<>* node);
1096 virtual ~GUIPatternPassword();
1097
1098public:
1099 virtual int Render(void);
1100 virtual int Update(void);
1101 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1102 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1103
1104protected:
1105 void CalculateDotPositions();
1106 void ResetActiveDots();
1107 void ConnectDot(int dot_idx);
1108 void ConnectIntermediateDots(int dot_idx);
1109 int InDot(int x, int y);
1110 bool DotUsed(int dot_idx);
1111 static bool IsInRect(int x, int y, int rx, int ry, int rw, int rh);
1112 void PatternDrawn();
1113
1114 struct Dot {
1115 int x;
1116 int y;
1117 bool active;
1118 };
1119
1120 Dot mDots[9];
1121 int mConnectedDots[9];
1122 size_t mConnectedDotsLen;
1123 int mCurLineX;
1124 int mCurLineY;
1125 bool mTrackingTouch;
1126 bool mNeedRender;
1127
1128 COLOR mDotColor;
1129 COLOR mActiveDotColor;
1130 COLOR mLineColor;
1131 ImageResource *mDotImage;
1132 ImageResource *mActiveDotImage;
1133 gr_surface mDotCircle;
1134 gr_surface mActiveDotCircle;
1135 int mDotRadius;
1136 int mLineWidth;
1137
1138 std::string mPassVar;
1139 GUIAction *mAction;
1140 int mUpdate;
1141};
1142
1143
Dees_Troy51a0e822012-09-05 15:24:24 -04001144// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001145xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001146std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1147int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1148int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1149int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001150COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001151COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1152FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1153ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1154AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
1155
Dees_Troy51a0e822012-09-05 15:24:24 -04001156bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, RenderObject::Placement* placement = NULL);
1157
1158#endif // _OBJECTS_HEADER
1159