blob: ebf08a8db71efc374a515f000ffab269f5a88942 [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"
Ethan Yonkerb7a54a32015-10-05 10:16:27 -050037#include "placement.h"
Dees_Troy51a0e822012-09-05 15:24:24 -040038
Ethan Yonker751a85e2014-12-12 16:59:10 -060039#ifndef TW_X_OFFSET
40#define TW_X_OFFSET 0
41#endif
42#ifndef TW_Y_OFFSET
43#define TW_Y_OFFSET 0
44#endif
45
Ethan Yonker74db1572015-10-28 12:44:49 -050046struct translate_later_struct {
47 std::string resource_name; // Name of the string resource for looking up
48 std::string default_value; // Default in case we don't find the string resource
49 std::string color; // Color for the console... normal, highlight, warning, error
50 std::string format; // Formatted extra variables like %i, %s
51 std::string text; // Final, translated, formatted text
52 bool inline_format; // Indicates if the final text includes an inlined format variable
53};
54
Dees_Troy51a0e822012-09-05 15:24:24 -040055class RenderObject
56{
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
Ethan Yonkerd0514ba2015-10-22 14:17:47 -050084 virtual void SetPageFocus(int inFocus __unused) { 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
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500100 virtual int NotifyTouch(TOUCH_STATE state __unused, int x __unused, int y __unused) { 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
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500104 virtual int NotifyKey(int key __unused, bool down __unused) { 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:
that20fb95d2015-09-12 11:27:47 +0200154 static void LoadConditions(xml_node<>* node, std::vector<Condition>& conditions);
155 static bool isMounted(std::string vol);
156 static bool isConditionTrue(Condition* condition);
157 static bool UpdateConditions(std::vector<Condition>& conditions, const std::string& varName);
Vojtech Bocek07220562014-02-08 02:05:33 +0100158
159 bool mConditionsResult;
Dees_Troy51a0e822012-09-05 15:24:24 -0400160};
161
162class InputObject
163{
164public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200165 InputObject() { HasInputFocus = 0; }
166 virtual ~InputObject() {}
Dees_Troy51a0e822012-09-05 15:24:24 -0400167
168public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200169 // NotifyKeyboard - Notify of keyboard input
170 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500171 virtual int NotifyKeyboard(int key __unused) { return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400172
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200173 virtual int SetInputFocus(int focus) { HasInputFocus = focus; return 1; }
Dees_Troy51a0e822012-09-05 15:24:24 -0400174
175protected:
176 int HasInputFocus;
177};
178
179// Derived Objects
180// GUIText - Used for static text
Vojtech Bocekede51c52014-02-07 23:58:09 +0100181class GUIText : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400182{
183public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200184 // w and h may be ignored, in which case, no bounding box is applied
185 GUIText(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400186
187public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200188 // Render - Render the full object to the GL surface
189 // Return 0 on success, <0 on error
190 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400191
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200192 // Update - Update any UI component animations (called <= 30 FPS)
193 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
194 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400195
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200196 // Retrieve the size of the current string (dynamic strings may change per call)
197 virtual int GetCurrentBounds(int& w, int& h);
Dees_Troy51a0e822012-09-05 15:24:24 -0400198
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200199 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100200 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400201
202 // Set maximum width in pixels
203 virtual int SetMaxWidth(unsigned width);
204
205 // Set number of characters to skip (for scrolling)
206 virtual int SkipCharCount(unsigned skip);
207
Dees_Troy4d12f962012-10-19 13:13:15 -0400208public:
209 bool isHighlighted;
Ethan Yonkerb7a54a32015-10-05 10:16:27 -0500210 bool scaleWidth;
211 unsigned maxWidth;
Dees_Troy4d12f962012-10-19 13:13:15 -0400212
Dees_Troy51a0e822012-09-05 15:24:24 -0400213protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200214 std::string mText;
215 std::string mLastValue;
216 COLOR mColor;
Dees_Troy4d12f962012-10-19 13:13:15 -0400217 COLOR mHighlightColor;
thatf6ed8fc2015-02-14 20:23:16 +0100218 FontResource* mFont;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200219 int mIsStatic;
220 int mVarChanged;
221 int mFontHeight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400222 unsigned charSkip;
Dees_Troy51a0e822012-09-05 15:24:24 -0400223};
224
225// GUIImage - Used for static image
Vojtech Bocekede51c52014-02-07 23:58:09 +0100226class GUIImage : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400227{
228public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200229 GUIImage(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400230
231public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200232 // Render - Render the full object to the GL surface
233 // Return 0 on success, <0 on error
234 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400235
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200236 // SetRenderPos - Update the position of the object
237 // Return 0 on success, <0 on error
238 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400239
Dees_Troy4d12f962012-10-19 13:13:15 -0400240public:
241 bool isHighlighted;
242
Dees_Troy51a0e822012-09-05 15:24:24 -0400243protected:
thatf6ed8fc2015-02-14 20:23:16 +0100244 ImageResource* mImage;
245 ImageResource* mHighlightImage;
Dees_Troy51a0e822012-09-05 15:24:24 -0400246};
247
248// GUIFill - Used for fill colors
Vojtech Bocekede51c52014-02-07 23:58:09 +0100249class GUIFill : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400250{
251public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200252 GUIFill(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400253
254public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200255 // Render - Render the full object to the GL surface
256 // Return 0 on success, <0 on error
257 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400258
259protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200260 COLOR mColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400261};
262
263// GUIAction - Used for standard actions
Vojtech Bocekede51c52014-02-07 23:58:09 +0100264class GUIAction : public GUIObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400265{
thatc6085482015-01-09 22:12:43 +0100266 friend class ActionThread;
267
Dees_Troy51a0e822012-09-05 15:24:24 -0400268public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200269 GUIAction(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400270
271public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200272 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100273 virtual int NotifyKey(int key, bool down);
Vojtech Bocek07220562014-02-08 02:05:33 +0100274 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
that3f7b1ac2014-12-30 11:30:13 +0100275
276 int doActions();
Dees_Troy51a0e822012-09-05 15:24:24 -0400277
278protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200279 class Action
280 {
281 public:
282 std::string mFunction;
283 std::string mArg;
284 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400285
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200286 std::vector<Action> mActions;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +0100287 std::map<int, bool> mKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -0400288
289protected:
that73a52952015-01-28 23:07:34 +0100290 enum ThreadType { THREAD_NONE, THREAD_ACTION, THREAD_CANCEL };
291
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200292 int getKeyByName(std::string key);
that3f7b1ac2014-12-30 11:30:13 +0100293 int doAction(Action action);
that73a52952015-01-28 23:07:34 +0100294 ThreadType getThreadType(const Action& action);
Dees_Troy51a0e822012-09-05 15:24:24 -0400295 void simulate_progress_bar(void);
Ethan Yonker0d47eb52015-01-09 11:23:19 -0600296 int flash_zip(std::string filename, int* wipe_cache);
thatcc8ddca2015-01-03 01:59:36 +0100297 void reinject_after_flash();
Dees_Troy51a0e822012-09-05 15:24:24 -0400298 void operation_start(const string operation_name);
that3f7b1ac2014-12-30 11:30:13 +0100299 void operation_end(const int operation_status);
Samer Diab (S.a.M.e.R_d)71e9b042014-01-07 20:18:47 +0000300 time_t Start;
that3f7b1ac2014-12-30 11:30:13 +0100301
302 // map action name to function pointer
303 typedef int (GUIAction::*execFunction)(std::string);
304 typedef std::map<std::string, execFunction> mapFunc;
305 static mapFunc mf;
thatc6085482015-01-09 22:12:43 +0100306 static std::set<std::string> setActionsRunningInCallerThread;
that3f7b1ac2014-12-30 11:30:13 +0100307
308 // GUI actions
309 int reboot(std::string arg);
310 int home(std::string arg);
311 int key(std::string arg);
312 int page(std::string arg);
313 int reload(std::string arg);
314 int readBackup(std::string arg);
315 int set(std::string arg);
316 int clear(std::string arg);
317 int mount(std::string arg);
318 int unmount(std::string arg);
319 int restoredefaultsettings(std::string arg);
320 int copylog(std::string arg);
321 int compute(std::string arg);
322 int setguitimezone(std::string arg);
323 int overlay(std::string arg);
324 int queuezip(std::string arg);
325 int cancelzip(std::string arg);
326 int queueclear(std::string arg);
327 int sleep(std::string arg);
328 int appenddatetobackupname(std::string arg);
329 int generatebackupname(std::string arg);
330 int checkpartitionlist(std::string arg);
331 int getpartitiondetails(std::string arg);
332 int screenshot(std::string arg);
333 int setbrightness(std::string arg);
334
thatc6085482015-01-09 22:12:43 +0100335 // (originally) threaded actions
that3f7b1ac2014-12-30 11:30:13 +0100336 int fileexists(std::string arg);
337 int flash(std::string arg);
338 int wipe(std::string arg);
339 int refreshsizes(std::string arg);
340 int nandroid(std::string arg);
341 int fixpermissions(std::string arg);
342 int dd(std::string arg);
343 int partitionsd(std::string arg);
344 int installhtcdumlock(std::string arg);
345 int htcdumlockrestoreboot(std::string arg);
346 int htcdumlockreflashrecovery(std::string arg);
347 int cmd(std::string arg);
348 int terminalcommand(std::string arg);
349 int killterminal(std::string arg);
350 int reinjecttwrp(std::string arg);
351 int checkbackupname(std::string arg);
352 int decrypt(std::string arg);
353 int adbsideload(std::string arg);
354 int adbsideloadcancel(std::string arg);
355 int openrecoveryscript(std::string arg);
356 int installsu(std::string arg);
357 int fixsu(std::string arg);
358 int decrypt_backup(std::string arg);
359 int repair(std::string arg);
Ethan Yonkera2719152015-05-28 09:44:41 -0500360 int resize(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100361 int changefilesystem(std::string arg);
362 int startmtp(std::string arg);
363 int stopmtp(std::string arg);
Ethan Yonker96af84a2015-01-05 14:58:36 -0600364 int flashimage(std::string arg);
bigbiff7abc5fe2015-01-17 16:53:12 -0500365 int cancelbackup(std::string arg);
Ethan Yonkereb32b1f2015-05-18 10:23:03 -0500366 int checkpartitionlifetimewrites(std::string arg);
367 int mountsystemtoggle(std::string arg);
Ethan Yonker74db1572015-10-28 12:44:49 -0500368 int setlanguage(std::string arg);
that10ae24f2015-12-26 20:53:51 +0100369 int twcmd(std::string arg);
that3f7b1ac2014-12-30 11:30:13 +0100370
371 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400372};
373
Vojtech Bocekede51c52014-02-07 23:58:09 +0100374class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400375{
376public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200377 GUIButton(xml_node<>* node);
378 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400379
380public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200381 // Render - Render the full object to the GL surface
382 // Return 0 on success, <0 on error
383 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400384
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200385 // Update - Update any UI component animations (called <= 30 FPS)
386 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
387 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400388
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200389 // SetPos - Update the position of the render object
390 // Return 0 on success, <0 on error
391 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400392
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200393 // NotifyTouch - Notify of a touch event
394 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
395 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400396
397protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200398 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100399 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200400 GUIText* mButtonLabel;
401 GUIAction* mAction;
402 int mTextX, mTextY, mTextW, mTextH;
403 int mIconX, mIconY, mIconW, mIconH;
404 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600405 bool hasHighlightColor;
406 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500407 bool hasFill;
408 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600409 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000410 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400411};
412
Vojtech Bocekede51c52014-02-07 23:58:09 +0100413class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400414{
415public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200416 GUICheckbox(xml_node<>* node);
417 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400418
419public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200420 // Render - Render the full object to the GL surface
421 // Return 0 on success, <0 on error
422 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400423
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200424 // Update - Update any UI component animations (called <= 30 FPS)
425 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
426 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400427
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200428 // SetPos - Update the position of the render object
429 // Return 0 on success, <0 on error
430 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400431
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200432 // NotifyTouch - Notify of a touch event
433 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
434 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400435
436protected:
thatf6ed8fc2015-02-14 20:23:16 +0100437 ImageResource* mChecked;
438 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200439 GUIText* mLabel;
440 int mTextX, mTextY;
441 int mCheckX, mCheckY, mCheckW, mCheckH;
442 int mLastState;
443 bool mRendered;
444 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400445};
446
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100447class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400448{
449public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100450 GUIScrollList(xml_node<>* node);
451 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400452
453public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200454 // Render - Render the full object to the GL surface
455 // Return 0 on success, <0 on error
456 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400457
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200458 // Update - Update any UI component animations (called <= 30 FPS)
459 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
460 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400461
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200462 // NotifyTouch - Notify of a touch event
463 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
464 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400465
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200466 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100467 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400468
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200469 // SetPos - Update the position of the render object
470 // Return 0 on success, <0 on error
471 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400472
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200473 // SetPageFocus - Notify when a page gains or loses focus
474 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400475
476protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100477 // derived classes need to implement these
478 // get number of items
479 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100480 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
481 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100482 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500483 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100484
that0af77952015-02-25 08:52:19 +0100485 // render a standard-layout list item with optional icon and text
486 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
487
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100488 enum { NO_ITEM = (size_t)-1 };
489 // returns item index at coordinates or NO_ITEM if there is no item there
490 size_t HitTestItem(int x, int y);
491
492 // 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
493 void SetMaxIconSize(int w, int h);
494
495 // This will make sure that the item indicated by list_index is visible on the screen
496 void SetVisibleListLocation(size_t list_index);
497
498 // Handle scrolling changes for drags and kinetic scrolling
499 void HandleScrolling();
500
that9876ac32015-02-15 21:40:59 +0100501 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100502 int GetDisplayItemCount();
503
504 // Returns the size in pixels of a partial item or row size
505 int GetDisplayRemainder();
506
507protected:
508 // Background
509 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100510 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100511
512 // Header
513 COLOR mHeaderBackgroundColor;
514 COLOR mHeaderFontColor;
515 std::string mHeaderText; // Original header text without parsing any variables
516 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100517 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100518 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100519 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100520 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
521 int mHeaderSeparatorH; // Height of the separator between header and list items
522 COLOR mHeaderSeparatorColor; // color of the header separator
523
524 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100525 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100526 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100527 bool hasHighlightColor; // indicates if a highlight color was set
528 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100529 COLOR mFontHighlightColor;
530 int mFontHeight;
531 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
532 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
533 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
534 int mSeparatorH; // Height of the separator between items
535 COLOR mSeparatorColor; // color of the separator that is between items
536
thata9998212015-02-19 22:51:24 +0100537 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100538 int mFastScrollW; // width of the fastscroll area
539 int mFastScrollLineW; // width of the line for fastscroll rendering
540 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100541 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100542 COLOR mFastScrollLineColor;
543 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100544
545 // Scrolling and dynamic state
546 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
547 int mFastScrollRectCurrentH; // current height of fastscroll rect
548 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100549 bool hasScroll; // indicates that we have enough items in the list to scroll
550 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
551 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
552 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 +0100553 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 +0100554 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
555 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
556 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
557 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
558 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500559 bool AddLines(std::vector<std::string>* origText, std::vector<std::string>* origColor, size_t* lastCount, std::vector<std::string>* rText, std::vector<std::string>* rColor);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100560};
561
562class GUIFileSelector : public GUIScrollList
563{
564public:
565 GUIFileSelector(xml_node<>* node);
566 virtual ~GUIFileSelector();
567
568public:
569 // Update - Update any UI component animations (called <= 30 FPS)
570 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
571 virtual int Update(void);
572
573 // NotifyVarChange - Notify of a variable change
574 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
575
576 // SetPageFocus - Notify when a page gains or loses focus
577 virtual void SetPageFocus(int inFocus);
578
579 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100580 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100581 virtual void NotifySelect(size_t item_selected);
582
583protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200584 struct FileData {
585 std::string fileName;
586 unsigned char fileType; // Uses d_type format from struct dirent
587 mode_t protection; // Uses mode_t format from stat
588 uid_t userId;
589 gid_t groupId;
590 off_t fileSize;
591 time_t lastAccess; // Uses time_t format from stat
592 time_t lastModified; // Uses time_t format from stat
593 time_t lastStatChange; // Uses time_t format from stat
594 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400595
596protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200597 virtual int GetFileList(const std::string folder);
598 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400599
600protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200601 std::vector<FileData> mFolderList;
602 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100603 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600604 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100605 std::string mExtn; // used for filtering the file list, for example, *.zip
606 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
607 std::string mSortVariable; // data manager variable used to change the sorting of files
608 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
609 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
610 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)
611 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100612 ImageResource* mFolderIcon;
613 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600614 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400615};
616
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100617class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400618{
619public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200620 GUIListBox(xml_node<>* node);
621 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400622
623public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200624 // Update - Update any UI component animations (called <= 30 FPS)
625 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
626 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400627
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200628 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100629 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400630
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200631 // SetPageFocus - Notify when a page gains or loses focus
632 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400633
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100634 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100635 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100636 virtual void NotifySelect(size_t item_selected);
637
Dees_Troy51a0e822012-09-05 15:24:24 -0400638protected:
that8ab5c132015-09-13 23:00:54 +0200639 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200640 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500641 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400642 std::string variableValue;
643 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200644 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200645 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200646 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400647
648protected:
that8ab5c132015-09-13 23:00:54 +0200649 std::vector<ListItem> mListItems;
650 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200651 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400652 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100653 ImageResource* mIconSelected;
654 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500655 bool isCheckList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400656};
657
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100658class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500659{
660public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200661 GUIPartitionList(xml_node<>* node);
662 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500663
664public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200665 // Update - Update any UI component animations (called <= 30 FPS)
666 // 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 +0100667 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500668
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200669 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100670 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500671
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200672 // SetPageFocus - Notify when a page gains or loses focus
673 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500674
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100675 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100676 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100677 virtual void NotifySelect(size_t item_selected);
678
Dees_Troya13d74f2013-03-24 08:54:55 -0500679protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100680 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600681 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500682
683protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200684 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500685 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200686 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500687 std::string selectedList;
688 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500689 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100690 ImageResource* mIconSelected;
691 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500692 bool updateList;
693};
694
Ethan Yonker44925ad2015-07-22 12:33:59 -0500695class GUITextBox : public GUIScrollList
696{
697public:
698 GUITextBox(xml_node<>* node);
699
700public:
701 // Update - Update any UI component animations (called <= 30 FPS)
702 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
703 virtual int Update(void);
704
705 // NotifyVarChange - Notify of a variable change
706 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
707
708 // ScrollList interface
709 virtual size_t GetItemCount();
710 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
711 virtual void NotifySelect(size_t item_selected);
712protected:
713
714 size_t mLastCount;
715 bool mIsStatic;
716 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
717 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
718 std::vector<std::string> rText; // Rendered text - what we actually see
719
720};
721
that8d46c092015-02-26 01:30:04 +0100722class GUIConsole : public GUIScrollList
723{
724public:
725 GUIConsole(xml_node<>* node);
726
727public:
728 // Render - Render the full object to the GL surface
729 // Return 0 on success, <0 on error
730 virtual int Render(void);
731
732 // Update - Update any UI component animations (called <= 30 FPS)
733 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
734 virtual int Update(void);
735
736 // IsInRegion - Checks if the request is handled by this object
737 // Return 1 if this object handles the request, 0 if not
738 virtual int IsInRegion(int x, int y);
739
740 // NotifyTouch - Notify of a touch event
741 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
742 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
743
744 // ScrollList interface
745 virtual size_t GetItemCount();
746 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
747 virtual void NotifySelect(size_t item_selected);
Ethan Yonker74db1572015-10-28 12:44:49 -0500748 static void Translate_Now();
that8d46c092015-02-26 01:30:04 +0100749protected:
750 enum SlideoutState
751 {
752 hidden = 0,
753 visible,
754 request_hide,
755 request_show
756 };
757
758 ImageResource* mSlideoutImage;
759 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
760 bool scrollToEnd; // true if we want to keep tracking the last line
761 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
762 int mSlideout;
763 SlideoutState mSlideoutState;
764 std::vector<std::string> rConsole;
765 std::vector<std::string> rConsoleColor;
766
767protected:
that8d46c092015-02-26 01:30:04 +0100768 int RenderSlideout(void);
769 int RenderConsole(void);
770};
771
Dees_Troy51a0e822012-09-05 15:24:24 -0400772// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100773class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400774{
775public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200776 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400777
778public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200779 // Render - Render the full object to the GL surface
780 // Return 0 on success, <0 on error
781 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400782
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200783 // Update - Update any UI component animations (called <= 30 FPS)
784 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
785 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400786
787protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200788 AnimationResource* mAnimation;
789 int mFrame;
790 int mFPS;
791 int mLoop;
792 int mRender;
793 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400794};
795
Vojtech Bocekede51c52014-02-07 23:58:09 +0100796class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400797{
798public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200799 GUIProgressBar(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400800
801public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200802 // Render - Render the full object to the GL surface
803 // Return 0 on success, <0 on error
804 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400805
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200806 // Update - Update any UI component animations (called <= 30 FPS)
807 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
808 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400809
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200810 // NotifyVarChange - Notify of a variable change
811 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100812 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400813
814protected:
thatf6ed8fc2015-02-14 20:23:16 +0100815 ImageResource* mEmptyBar;
816 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200817 std::string mMinValVar;
818 std::string mMaxValVar;
819 std::string mCurValVar;
820 float mSlide;
821 float mSlideInc;
822 int mSlideFrames;
823 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400824
825protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200826 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400827};
828
Vojtech Bocekede51c52014-02-07 23:58:09 +0100829class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400830{
831public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200832 GUISlider(xml_node<>* node);
833 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400834
835public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200836 // Render - Render the full object to the GL surface
837 // Return 0 on success, <0 on error
838 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400839
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200840 // Update - Update any UI component animations (called <= 30 FPS)
841 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
842 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400843
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200844 // NotifyTouch - Notify of a touch event
845 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
846 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400847
848protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200849 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600850 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100851 ImageResource* sSlider;
852 ImageResource* sSliderUsed;
853 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200854 int sTouchW, sTouchH;
855 int sCurTouchX;
856 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400857};
858
Dees_Troy51a0e822012-09-05 15:24:24 -0400859#define KEYBOARD_ACTION 253
860#define KEYBOARD_LAYOUT 254
861#define KEYBOARD_SWIPE_LEFT 252
862#define KEYBOARD_SWIPE_RIGHT 251
863#define KEYBOARD_ARROW_LEFT 250
864#define KEYBOARD_ARROW_RIGHT 249
865#define KEYBOARD_HOME 248
866#define KEYBOARD_END 247
867#define KEYBOARD_ARROW_UP 246
868#define KEYBOARD_ARROW_DOWN 245
869#define KEYBOARD_SPECIAL_KEYS 245
870#define KEYBOARD_BACKSPACE 8
871
Vojtech Bocekede51c52014-02-07 23:58:09 +0100872class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400873{
874public:
875 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200876 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400877
878public:
879 virtual int Render(void);
880 virtual int Update(void);
881 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
882 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
883
884protected:
thate79878b2015-03-14 23:07:23 +0100885 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200886 {
thate79878b2015-03-14 23:07:23 +0100887 unsigned char key; // ASCII code or one of the special KEYBOARD_* codes above
Dees_Troy51a0e822012-09-05 15:24:24 -0400888 unsigned char longpresskey;
that1a7ba972015-02-01 19:48:19 +0100889 int end_x;
890 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200891 };
thate79878b2015-03-14 23:07:23 +0100892 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200893 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200894 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
thatd86f49d2015-03-15 00:56:57 +0100895
896 enum {
897 MAX_KEYBOARD_LAYOUTS = 5,
898 MAX_KEYBOARD_ROWS = 9,
899 MAX_KEYBOARD_KEYS = 20
900 };
901 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600902 {
thatd86f49d2015-03-15 00:56:57 +0100903 ImageResource* keyboardImg;
904 struct Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
905 int row_end_y[MAX_KEYBOARD_ROWS];
906 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600907 int revert_layout;
908 };
thatd86f49d2015-03-15 00:56:57 +0100909 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400910
thatf256b722015-05-23 20:44:12 +0200911 struct KeyLabel
912 {
913 unsigned char key; // same as in struct Key
914 int layout_from; // 1-based; 0 for labels that apply to all layouts
915 int layout_to; // same as Key.layout
916 string text; // key label text
917 ImageResource* image; // image (overrides text if defined)
918 };
919 std::vector<KeyLabel> mKeyLabels;
920
thate79878b2015-03-14 23:07:23 +0100921 // Find key at screen coordinates
922 Key* HitTestKey(int x, int y);
923
Dees_Troy51a0e822012-09-05 15:24:24 -0400924 bool mRendered;
925 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100926 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100927 bool CapsLockOn;
thatf6b20662015-06-25 21:51:37 +0200928 int highlightRenderCount;
929 Key* currentKey;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600930 bool hasHighlight, hasCapsHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400931 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600932 COLOR mCapsHighlightColor;
thatf256b722015-05-23 20:44:12 +0200933 COLOR mFontColor; // for centered key labels
934 COLOR mFontColorSmall; // for centered key labels
935 FontResource* mFont; // for main key labels
936 FontResource* mSmallFont; // for key labels like "?123"
937 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200938 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200939 COLOR mLongpressFontColor;
940 COLOR mBackgroundColor; // keyboard background color
941 COLOR mKeyColorAlphanumeric; // key background color
942 COLOR mKeyColorOther; // key background color
943 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400944};
945
946// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100947class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400948{
949public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200950 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400951 virtual ~GUIInput();
952
953public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200954 // Render - Render the full object to the GL surface
955 // Return 0 on success, <0 on error
956 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400957
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200958 // Update - Update any UI component animations (called <= 30 FPS)
959 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
960 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400961
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200962 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100963 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400964
965 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200966 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
967 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400968
969 virtual int NotifyKeyboard(int key);
970
971protected:
972 virtual int GetSelection(int x, int y);
973
974 // Handles displaying the text properly when chars are added, deleted, or for scrolling
975 virtual int HandleTextLocation(int x);
976
977protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200978 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -0400979 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +0100980 ImageResource* mBackground;
981 ImageResource* mCursor;
982 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -0400983 std::string mText;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200984 std::string mLastValue;
Dees_Troy51a0e822012-09-05 15:24:24 -0400985 std::string mVariable;
986 std::string mMask;
987 std::string mMaskVariable;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200988 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400989 COLOR mCursorColor;
990 int scrollingX;
991 int lastX;
992 int mCursorLocation;
993 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
994 int mFontY;
995 unsigned skipChars;
996 unsigned mFontHeight;
997 unsigned CursorWidth;
998 bool mRendered;
999 bool HasMask;
1000 bool DrawCursor;
1001 bool isLocalChange;
1002 bool HasAllowed;
1003 bool HasDisabled;
1004 std::string AllowedList;
1005 std::string DisabledList;
1006 unsigned MinLen;
1007 unsigned MaxLen;
1008};
1009
1010class HardwareKeyboard
1011{
1012public:
thatf37aec22015-02-01 13:38:35 +01001013 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001014 virtual ~HardwareKeyboard();
1015
1016public:
thatf37aec22015-02-01 13:38:35 +01001017 // called by the input handler for key events
1018 int KeyDown(int key_code);
1019 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001020
thatf37aec22015-02-01 13:38:35 +01001021 // called by the input handler when holding a key down
1022 int KeyRepeat();
1023
1024 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001025 void ConsumeKeyRelease(int key);
1026
1027private:
thatf37aec22015-02-01 13:38:35 +01001028 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001029 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001030};
1031
Vojtech Bocekede51c52014-02-07 23:58:09 +01001032class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001033{
1034public:
1035 GUISliderValue(xml_node<>* node);
1036 virtual ~GUISliderValue();
1037
1038public:
1039 // Render - Render the full object to the GL surface
1040 // Return 0 on success, <0 on error
1041 virtual int Render(void);
1042
1043 // Update - Update any UI component animations (called <= 30 FPS)
1044 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1045 virtual int Update(void);
1046
1047 // SetPos - Update the position of the render object
1048 // Return 0 on success, <0 on error
1049 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1050
1051 // NotifyTouch - Notify of a touch event
1052 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1053 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1054
1055 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001056 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001057
1058 // SetPageFocus - Notify when a page gains or loses focus
1059 virtual void SetPageFocus(int inFocus);
1060
1061protected:
1062 int measureText(const std::string& str);
1063 int valueFromPct(float pct);
1064 float pctFromValue(int value);
1065 void loadValue(bool force = false);
1066
1067 std::string mVariable;
1068 int mMax;
1069 int mMin;
1070 int mValue;
1071 char *mValueStr;
1072 float mValuePct;
1073 std::string mMaxStr;
1074 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001075 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001076 GUIText* mLabel;
1077 int mLabelW;
1078 COLOR mTextColor;
1079 COLOR mLineColor;
1080 COLOR mSliderColor;
1081 bool mShowRange;
1082 bool mShowCurr;
1083 int mLineX;
1084 int mLineY;
1085 int mLineH;
1086 int mLinePadding;
1087 int mPadding;
1088 int mSliderY;
1089 int mSliderW;
1090 int mSliderH;
1091 bool mRendered;
1092 int mFontHeight;
1093 GUIAction *mAction;
1094 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001095 int mLineW;
1096 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001097 ImageResource *mBackgroundImage;
1098 ImageResource *mHandleImage;
1099 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001100};
1101
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001102class MouseCursor : public RenderObject
1103{
1104public:
1105 MouseCursor(int posX, int posY);
1106 virtual ~MouseCursor();
1107
1108 virtual int Render(void);
1109 virtual int Update(void);
1110 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1111
1112 void Move(int deltaX, int deltaY);
1113 void GetPos(int& x, int& y);
1114 void LoadData(xml_node<>* node);
1115 void ResetData(int resX, int resY);
1116
1117private:
1118 int m_resX;
1119 int m_resY;
1120 bool m_moved;
1121 float m_speedMultiplier;
1122 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001123 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001124 bool m_present;
1125};
1126
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001127class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1128{
1129public:
1130 GUIPatternPassword(xml_node<>* node);
1131 virtual ~GUIPatternPassword();
1132
1133public:
1134 virtual int Render(void);
1135 virtual int Update(void);
1136 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1137 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1138
1139protected:
1140 void CalculateDotPositions();
1141 void ResetActiveDots();
1142 void ConnectDot(int dot_idx);
1143 void ConnectIntermediateDots(int dot_idx);
1144 int InDot(int x, int y);
1145 bool DotUsed(int dot_idx);
1146 static bool IsInRect(int x, int y, int rx, int ry, int rw, int rh);
1147 void PatternDrawn();
1148
1149 struct Dot {
1150 int x;
1151 int y;
1152 bool active;
1153 };
1154
1155 Dot mDots[9];
1156 int mConnectedDots[9];
1157 size_t mConnectedDotsLen;
1158 int mCurLineX;
1159 int mCurLineY;
1160 bool mTrackingTouch;
1161 bool mNeedRender;
1162
1163 COLOR mDotColor;
1164 COLOR mActiveDotColor;
1165 COLOR mLineColor;
1166 ImageResource *mDotImage;
1167 ImageResource *mActiveDotImage;
1168 gr_surface mDotCircle;
1169 gr_surface mActiveDotCircle;
1170 int mDotRadius;
1171 int mLineWidth;
1172
1173 std::string mPassVar;
1174 GUIAction *mAction;
1175 int mUpdate;
1176};
1177
1178
Dees_Troy51a0e822012-09-05 15:24:24 -04001179// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001180xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001181std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1182int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1183int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1184int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001185COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001186COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1187FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1188ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1189AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
1190
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001191bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001192
1193#endif // _OBJECTS_HEADER
1194