blob: 438905b96d434454362770443579fa480beefb27 [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);
that3f7b1ac2014-12-30 11:30:13 +0100369
370 int simulate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400371};
372
Vojtech Bocekede51c52014-02-07 23:58:09 +0100373class GUIButton : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400374{
375public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200376 GUIButton(xml_node<>* node);
377 virtual ~GUIButton();
Dees_Troy51a0e822012-09-05 15:24:24 -0400378
379public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200380 // Render - Render the full object to the GL surface
381 // Return 0 on success, <0 on error
382 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400383
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200384 // Update - Update any UI component animations (called <= 30 FPS)
385 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
386 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400387
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200388 // SetPos - Update the position of the render object
389 // Return 0 on success, <0 on error
390 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400391
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200392 // NotifyTouch - Notify of a touch event
393 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
394 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400395
396protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200397 GUIImage* mButtonImg;
thatf6ed8fc2015-02-14 20:23:16 +0100398 ImageResource* mButtonIcon;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200399 GUIText* mButtonLabel;
400 GUIAction* mAction;
401 int mTextX, mTextY, mTextW, mTextH;
402 int mIconX, mIconY, mIconW, mIconH;
403 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600404 bool hasHighlightColor;
405 bool renderHighlight;
Dees_Troya13d74f2013-03-24 08:54:55 -0500406 bool hasFill;
407 COLOR mFillColor;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600408 COLOR mHighlightColor;
Dees Troyb21cc642013-09-10 17:36:41 +0000409 Placement TextPlacement;
Dees_Troy51a0e822012-09-05 15:24:24 -0400410};
411
Vojtech Bocekede51c52014-02-07 23:58:09 +0100412class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400413{
414public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200415 GUICheckbox(xml_node<>* node);
416 virtual ~GUICheckbox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400417
418public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200419 // Render - Render the full object to the GL surface
420 // Return 0 on success, <0 on error
421 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400422
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200423 // Update - Update any UI component animations (called <= 30 FPS)
424 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
425 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400426
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200427 // SetPos - Update the position of the render object
428 // Return 0 on success, <0 on error
429 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400430
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200431 // NotifyTouch - Notify of a touch event
432 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
433 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400434
435protected:
thatf6ed8fc2015-02-14 20:23:16 +0100436 ImageResource* mChecked;
437 ImageResource* mUnchecked;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200438 GUIText* mLabel;
439 int mTextX, mTextY;
440 int mCheckX, mCheckY, mCheckW, mCheckH;
441 int mLastState;
442 bool mRendered;
443 std::string mVarName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400444};
445
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100446class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400447{
448public:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100449 GUIScrollList(xml_node<>* node);
450 virtual ~GUIScrollList();
Dees_Troy51a0e822012-09-05 15:24:24 -0400451
452public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200453 // Render - Render the full object to the GL surface
454 // Return 0 on success, <0 on error
455 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400456
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200457 // Update - Update any UI component animations (called <= 30 FPS)
458 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
459 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400460
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200461 // NotifyTouch - Notify of a touch event
462 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
463 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400464
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200465 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100466 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400467
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200468 // SetPos - Update the position of the render object
469 // Return 0 on success, <0 on error
470 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
Dees_Troy51a0e822012-09-05 15:24:24 -0400471
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200472 // SetPageFocus - Notify when a page gains or loses focus
473 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400474
475protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100476 // derived classes need to implement these
477 // get number of items
478 virtual size_t GetItemCount() { return 0; }
that0af77952015-02-25 08:52:19 +0100479 // render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
480 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100481 // an item was selected
Ethan Yonkerd0514ba2015-10-22 14:17:47 -0500482 virtual void NotifySelect(size_t item_selected __unused) {}
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100483
that0af77952015-02-25 08:52:19 +0100484 // render a standard-layout list item with optional icon and text
485 void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
486
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100487 enum { NO_ITEM = (size_t)-1 };
488 // returns item index at coordinates or NO_ITEM if there is no item there
489 size_t HitTestItem(int x, int y);
490
491 // 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
492 void SetMaxIconSize(int w, int h);
493
494 // This will make sure that the item indicated by list_index is visible on the screen
495 void SetVisibleListLocation(size_t list_index);
496
497 // Handle scrolling changes for drags and kinetic scrolling
498 void HandleScrolling();
499
that9876ac32015-02-15 21:40:59 +0100500 // Returns many full rows the list is capable of displaying
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100501 int GetDisplayItemCount();
502
503 // Returns the size in pixels of a partial item or row size
504 int GetDisplayRemainder();
505
506protected:
507 // Background
508 COLOR mBackgroundColor;
thatf6ed8fc2015-02-14 20:23:16 +0100509 ImageResource* mBackground; // background image, if any, automatically centered
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100510
511 // Header
512 COLOR mHeaderBackgroundColor;
513 COLOR mHeaderFontColor;
514 std::string mHeaderText; // Original header text without parsing any variables
515 std::string mLastHeaderValue; // Header text after parsing variables
that9876ac32015-02-15 21:40:59 +0100516 bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100517 int mHeaderH; // actual header height including font, icon, padding, and separator heights
thatf6ed8fc2015-02-14 20:23:16 +0100518 ImageResource* mHeaderIcon;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100519 int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
520 int mHeaderSeparatorH; // Height of the separator between header and list items
521 COLOR mHeaderSeparatorColor; // color of the header separator
522
523 // Per-item layout
thatf6ed8fc2015-02-14 20:23:16 +0100524 FontResource* mFont;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100525 COLOR mFontColor;
that9876ac32015-02-15 21:40:59 +0100526 bool hasHighlightColor; // indicates if a highlight color was set
527 COLOR mHighlightColor; // background row highlight color
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100528 COLOR mFontHighlightColor;
529 int mFontHeight;
530 int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
531 int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
532 int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
533 int mSeparatorH; // Height of the separator between items
534 COLOR mSeparatorColor; // color of the separator that is between items
535
thata9998212015-02-19 22:51:24 +0100536 // Scrollbar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100537 int mFastScrollW; // width of the fastscroll area
538 int mFastScrollLineW; // width of the line for fastscroll rendering
539 int mFastScrollRectW; // width of the rectangle for fastscroll
thata9998212015-02-19 22:51:24 +0100540 int mFastScrollRectH; // minimum height of the rectangle for fastscroll
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100541 COLOR mFastScrollLineColor;
542 COLOR mFastScrollRectColor;
thata9998212015-02-19 22:51:24 +0100543
544 // Scrolling and dynamic state
545 int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
546 int mFastScrollRectCurrentH; // current height of fastscroll rect
547 int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100548 bool hasScroll; // indicates that we have enough items in the list to scroll
549 int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
550 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
551 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 +0100552 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 +0100553 size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
554 int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
555 int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
556 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
557 int mUpdate; // indicates that a change took place and we need to re-render
Ethan Yonker44925ad2015-07-22 12:33:59 -0500558 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 +0100559};
560
561class GUIFileSelector : public GUIScrollList
562{
563public:
564 GUIFileSelector(xml_node<>* node);
565 virtual ~GUIFileSelector();
566
567public:
568 // Update - Update any UI component animations (called <= 30 FPS)
569 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
570 virtual int Update(void);
571
572 // NotifyVarChange - Notify of a variable change
573 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
574
575 // SetPageFocus - Notify when a page gains or loses focus
576 virtual void SetPageFocus(int inFocus);
577
578 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100579 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100580 virtual void NotifySelect(size_t item_selected);
581
582protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200583 struct FileData {
584 std::string fileName;
585 unsigned char fileType; // Uses d_type format from struct dirent
586 mode_t protection; // Uses mode_t format from stat
587 uid_t userId;
588 gid_t groupId;
589 off_t fileSize;
590 time_t lastAccess; // Uses time_t format from stat
591 time_t lastModified; // Uses time_t format from stat
592 time_t lastStatChange; // Uses time_t format from stat
593 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400594
595protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200596 virtual int GetFileList(const std::string folder);
597 static bool fileSort(FileData d1, FileData d2);
Dees_Troy51a0e822012-09-05 15:24:24 -0400598
599protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200600 std::vector<FileData> mFolderList;
601 std::vector<FileData> mFileList;
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100602 std::string mPathVar; // current path displayed, saved in the data manager
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600603 std::string mPathDefault; // default value for the path if none is set in mPathVar
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100604 std::string mExtn; // used for filtering the file list, for example, *.zip
605 std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
606 std::string mSortVariable; // data manager variable used to change the sorting of files
607 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
608 int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
609 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)
610 static int mSortOrder; // must be static because it is used by the static function fileSort
thatf6ed8fc2015-02-14 20:23:16 +0100611 ImageResource* mFolderIcon;
612 ImageResource* mFileIcon;
Dees_Troyc0583f52013-02-28 11:19:57 -0600613 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400614};
615
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100616class GUIListBox : public GUIScrollList
Dees_Troy51a0e822012-09-05 15:24:24 -0400617{
618public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200619 GUIListBox(xml_node<>* node);
620 virtual ~GUIListBox();
Dees_Troy51a0e822012-09-05 15:24:24 -0400621
622public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200623 // Update - Update any UI component animations (called <= 30 FPS)
624 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
625 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400626
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200627 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100628 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400629
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200630 // SetPageFocus - Notify when a page gains or loses focus
631 virtual void SetPageFocus(int inFocus);
Dees_Troy51a0e822012-09-05 15:24:24 -0400632
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100633 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100634 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100635 virtual void NotifySelect(size_t item_selected);
636
Dees_Troy51a0e822012-09-05 15:24:24 -0400637protected:
that8ab5c132015-09-13 23:00:54 +0200638 struct ListItem {
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200639 std::string displayName;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500640 std::string variableName;
Dees_Troy51a0e822012-09-05 15:24:24 -0400641 std::string variableValue;
642 unsigned int selected;
thatc01391c2015-07-09 00:19:58 +0200643 GUIAction* action;
that8ab5c132015-09-13 23:00:54 +0200644 std::vector<Condition> mConditions;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200645 };
Dees_Troy51a0e822012-09-05 15:24:24 -0400646
647protected:
that8ab5c132015-09-13 23:00:54 +0200648 std::vector<ListItem> mListItems;
649 std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200650 std::string mVariable;
Dees_Troy51a0e822012-09-05 15:24:24 -0400651 std::string currentValue;
thatf6ed8fc2015-02-14 20:23:16 +0100652 ImageResource* mIconSelected;
653 ImageResource* mIconUnselected;
Ethan Yonker56ce3322015-07-30 15:04:32 -0500654 bool isCheckList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400655};
656
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100657class GUIPartitionList : public GUIScrollList
Dees_Troya13d74f2013-03-24 08:54:55 -0500658{
659public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200660 GUIPartitionList(xml_node<>* node);
661 virtual ~GUIPartitionList();
Dees_Troya13d74f2013-03-24 08:54:55 -0500662
663public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200664 // Update - Update any UI component animations (called <= 30 FPS)
665 // 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 +0100666 virtual int Update();
Dees_Troya13d74f2013-03-24 08:54:55 -0500667
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200668 // NotifyVarChange - Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100669 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troya13d74f2013-03-24 08:54:55 -0500670
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200671 // SetPageFocus - Notify when a page gains or loses focus
672 virtual void SetPageFocus(int inFocus);
Dees_Troya13d74f2013-03-24 08:54:55 -0500673
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100674 virtual size_t GetItemCount();
that0af77952015-02-25 08:52:19 +0100675 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100676 virtual void NotifySelect(size_t item_selected);
677
Dees_Troya13d74f2013-03-24 08:54:55 -0500678protected:
Ethan Yonker0a3a98f2015-02-05 00:48:28 +0100679 void MatchList();
Ethan Yonkercfd65092015-02-14 10:39:21 -0600680 void SetPosition();
Dees_Troya13d74f2013-03-24 08:54:55 -0500681
682protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200683 std::vector<PartitionList> mList;
Dees_Troya13d74f2013-03-24 08:54:55 -0500684 std::string ListType;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200685 std::string mVariable;
Dees_Troya13d74f2013-03-24 08:54:55 -0500686 std::string selectedList;
687 std::string currentValue;
Dees_Troya13d74f2013-03-24 08:54:55 -0500688 std::string mLastValue;
thatf6ed8fc2015-02-14 20:23:16 +0100689 ImageResource* mIconSelected;
690 ImageResource* mIconUnselected;
Dees_Troya13d74f2013-03-24 08:54:55 -0500691 bool updateList;
692};
693
Ethan Yonker44925ad2015-07-22 12:33:59 -0500694class GUITextBox : public GUIScrollList
695{
696public:
697 GUITextBox(xml_node<>* node);
698
699public:
700 // Update - Update any UI component animations (called <= 30 FPS)
701 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
702 virtual int Update(void);
703
704 // NotifyVarChange - Notify of a variable change
705 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
706
707 // ScrollList interface
708 virtual size_t GetItemCount();
709 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
710 virtual void NotifySelect(size_t item_selected);
711protected:
712
713 size_t mLastCount;
714 bool mIsStatic;
715 std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
716 std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
717 std::vector<std::string> rText; // Rendered text - what we actually see
718
719};
720
that8d46c092015-02-26 01:30:04 +0100721class GUIConsole : public GUIScrollList
722{
723public:
724 GUIConsole(xml_node<>* node);
725
726public:
727 // Render - Render the full object to the GL surface
728 // Return 0 on success, <0 on error
729 virtual int Render(void);
730
731 // Update - Update any UI component animations (called <= 30 FPS)
732 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
733 virtual int Update(void);
734
735 // IsInRegion - Checks if the request is handled by this object
736 // Return 1 if this object handles the request, 0 if not
737 virtual int IsInRegion(int x, int y);
738
739 // NotifyTouch - Notify of a touch event
740 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
741 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
742
743 // ScrollList interface
744 virtual size_t GetItemCount();
745 virtual void RenderItem(size_t itemindex, int yPos, bool selected);
746 virtual void NotifySelect(size_t item_selected);
Ethan Yonker74db1572015-10-28 12:44:49 -0500747 static void Translate_Now();
that8d46c092015-02-26 01:30:04 +0100748protected:
749 enum SlideoutState
750 {
751 hidden = 0,
752 visible,
753 request_hide,
754 request_show
755 };
756
757 ImageResource* mSlideoutImage;
758 size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
759 bool scrollToEnd; // true if we want to keep tracking the last line
760 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
761 int mSlideout;
762 SlideoutState mSlideoutState;
763 std::vector<std::string> rConsole;
764 std::vector<std::string> rConsoleColor;
765
766protected:
that8d46c092015-02-26 01:30:04 +0100767 int RenderSlideout(void);
768 int RenderConsole(void);
769};
770
Dees_Troy51a0e822012-09-05 15:24:24 -0400771// GUIAnimation - Used for animations
Vojtech Bocekede51c52014-02-07 23:58:09 +0100772class GUIAnimation : public GUIObject, public RenderObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400773{
774public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200775 GUIAnimation(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400776
777public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200778 // Render - Render the full object to the GL surface
779 // Return 0 on success, <0 on error
780 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400781
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200782 // Update - Update any UI component animations (called <= 30 FPS)
783 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
784 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400785
786protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200787 AnimationResource* mAnimation;
788 int mFrame;
789 int mFPS;
790 int mLoop;
791 int mRender;
792 int mUpdateCount;
Dees_Troy51a0e822012-09-05 15:24:24 -0400793};
794
Vojtech Bocekede51c52014-02-07 23:58:09 +0100795class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400796{
797public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200798 GUIProgressBar(xml_node<>* node);
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 // NotifyVarChange - Notify of a variable change
810 // Returns 0 on success, <0 on error
Vojtech Bocek07220562014-02-08 02:05:33 +0100811 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400812
813protected:
thatf6ed8fc2015-02-14 20:23:16 +0100814 ImageResource* mEmptyBar;
815 ImageResource* mFullBar;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200816 std::string mMinValVar;
817 std::string mMaxValVar;
818 std::string mCurValVar;
819 float mSlide;
820 float mSlideInc;
821 int mSlideFrames;
822 int mLastPos;
Dees_Troy51a0e822012-09-05 15:24:24 -0400823
824protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200825 virtual int RenderInternal(void); // Does the actual render
Dees_Troy51a0e822012-09-05 15:24:24 -0400826};
827
Vojtech Bocekede51c52014-02-07 23:58:09 +0100828class GUISlider : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400829{
830public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200831 GUISlider(xml_node<>* node);
832 virtual ~GUISlider();
Dees_Troy51a0e822012-09-05 15:24:24 -0400833
834public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200835 // Render - Render the full object to the GL surface
836 // Return 0 on success, <0 on error
837 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400838
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200839 // Update - Update any UI component animations (called <= 30 FPS)
840 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
841 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400842
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200843 // NotifyTouch - Notify of a touch event
844 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
845 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400846
847protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200848 GUIAction* sAction;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600849 GUIText* sSliderLabel;
thatf6ed8fc2015-02-14 20:23:16 +0100850 ImageResource* sSlider;
851 ImageResource* sSliderUsed;
852 ImageResource* sTouch;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200853 int sTouchW, sTouchH;
854 int sCurTouchX;
855 int sUpdate;
Dees_Troy51a0e822012-09-05 15:24:24 -0400856};
857
Dees_Troy51a0e822012-09-05 15:24:24 -0400858#define KEYBOARD_ACTION 253
859#define KEYBOARD_LAYOUT 254
860#define KEYBOARD_SWIPE_LEFT 252
861#define KEYBOARD_SWIPE_RIGHT 251
862#define KEYBOARD_ARROW_LEFT 250
863#define KEYBOARD_ARROW_RIGHT 249
864#define KEYBOARD_HOME 248
865#define KEYBOARD_END 247
866#define KEYBOARD_ARROW_UP 246
867#define KEYBOARD_ARROW_DOWN 245
868#define KEYBOARD_SPECIAL_KEYS 245
869#define KEYBOARD_BACKSPACE 8
870
Vojtech Bocekede51c52014-02-07 23:58:09 +0100871class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400872{
873public:
874 GUIKeyboard(xml_node<>* node);
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200875 virtual ~GUIKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -0400876
877public:
878 virtual int Render(void);
879 virtual int Update(void);
880 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
881 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
882
883protected:
thate79878b2015-03-14 23:07:23 +0100884 struct Key
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200885 {
thate79878b2015-03-14 23:07:23 +0100886 unsigned char key; // ASCII code or one of the special KEYBOARD_* codes above
Dees_Troy51a0e822012-09-05 15:24:24 -0400887 unsigned char longpresskey;
that1a7ba972015-02-01 19:48:19 +0100888 int end_x;
889 int layout;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200890 };
thate79878b2015-03-14 23:07:23 +0100891 int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
thatf256b722015-05-23 20:44:12 +0200892 void LoadKeyLabels(xml_node<>* parent, int layout);
thatf6b20662015-06-25 21:51:37 +0200893 void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
thatd86f49d2015-03-15 00:56:57 +0100894
895 enum {
896 MAX_KEYBOARD_LAYOUTS = 5,
897 MAX_KEYBOARD_ROWS = 9,
898 MAX_KEYBOARD_KEYS = 20
899 };
900 struct Layout
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600901 {
thatd86f49d2015-03-15 00:56:57 +0100902 ImageResource* keyboardImg;
903 struct Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
904 int row_end_y[MAX_KEYBOARD_ROWS];
905 bool is_caps;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600906 int revert_layout;
907 };
thatd86f49d2015-03-15 00:56:57 +0100908 Layout layouts[MAX_KEYBOARD_LAYOUTS];
Dees_Troy51a0e822012-09-05 15:24:24 -0400909
thatf256b722015-05-23 20:44:12 +0200910 struct KeyLabel
911 {
912 unsigned char key; // same as in struct Key
913 int layout_from; // 1-based; 0 for labels that apply to all layouts
914 int layout_to; // same as Key.layout
915 string text; // key label text
916 ImageResource* image; // image (overrides text if defined)
917 };
918 std::vector<KeyLabel> mKeyLabels;
919
thate79878b2015-03-14 23:07:23 +0100920 // Find key at screen coordinates
921 Key* HitTestKey(int x, int y);
922
Dees_Troy51a0e822012-09-05 15:24:24 -0400923 bool mRendered;
924 std::string mVariable;
that1a7ba972015-02-01 19:48:19 +0100925 int currentLayout;
thatd86f49d2015-03-15 00:56:57 +0100926 bool CapsLockOn;
thatf6b20662015-06-25 21:51:37 +0200927 int highlightRenderCount;
928 Key* currentKey;
Ethan Yonker21ff02a2015-02-18 14:35:00 -0600929 bool hasHighlight, hasCapsHighlight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400930 COLOR mHighlightColor;
Ethan Yonkerc3120d42014-02-17 07:55:00 -0600931 COLOR mCapsHighlightColor;
thatf256b722015-05-23 20:44:12 +0200932 COLOR mFontColor; // for centered key labels
933 COLOR mFontColorSmall; // for centered key labels
934 FontResource* mFont; // for main key labels
935 FontResource* mSmallFont; // for key labels like "?123"
936 FontResource* mLongpressFont; // for the small longpress label in the upper right corner
thatf6b20662015-06-25 21:51:37 +0200937 int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
thatf256b722015-05-23 20:44:12 +0200938 COLOR mLongpressFontColor;
939 COLOR mBackgroundColor; // keyboard background color
940 COLOR mKeyColorAlphanumeric; // key background color
941 COLOR mKeyColorOther; // key background color
942 int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
Dees_Troy51a0e822012-09-05 15:24:24 -0400943};
944
945// GUIInput - Used for keyboard input
Vojtech Bocekede51c52014-02-07 23:58:09 +0100946class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
Dees_Troy51a0e822012-09-05 15:24:24 -0400947{
948public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200949 GUIInput(xml_node<>* node);
Dees_Troy51a0e822012-09-05 15:24:24 -0400950 virtual ~GUIInput();
951
952public:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200953 // Render - Render the full object to the GL surface
954 // Return 0 on success, <0 on error
955 virtual int Render(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400956
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200957 // Update - Update any UI component animations (called <= 30 FPS)
958 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
959 virtual int Update(void);
Dees_Troy51a0e822012-09-05 15:24:24 -0400960
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200961 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +0100962 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Dees_Troy51a0e822012-09-05 15:24:24 -0400963
964 // NotifyTouch - Notify of a touch event
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200965 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
966 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
Dees_Troy51a0e822012-09-05 15:24:24 -0400967
968 virtual int NotifyKeyboard(int key);
969
970protected:
971 virtual int GetSelection(int x, int y);
972
973 // Handles displaying the text properly when chars are added, deleted, or for scrolling
974 virtual int HandleTextLocation(int x);
975
976protected:
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200977 GUIText* mInputText;
Dees_Troy51a0e822012-09-05 15:24:24 -0400978 GUIAction* mAction;
thatf6ed8fc2015-02-14 20:23:16 +0100979 ImageResource* mBackground;
980 ImageResource* mCursor;
981 FontResource* mFont;
Dees_Troy51a0e822012-09-05 15:24:24 -0400982 std::string mText;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200983 std::string mLastValue;
Dees_Troy51a0e822012-09-05 15:24:24 -0400984 std::string mVariable;
985 std::string mMask;
986 std::string mMaskVariable;
Vojtech Bocekfafb0c52013-07-25 22:53:02 +0200987 COLOR mBackgroundColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400988 COLOR mCursorColor;
989 int scrollingX;
990 int lastX;
991 int mCursorLocation;
992 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
993 int mFontY;
994 unsigned skipChars;
995 unsigned mFontHeight;
996 unsigned CursorWidth;
997 bool mRendered;
998 bool HasMask;
999 bool DrawCursor;
1000 bool isLocalChange;
1001 bool HasAllowed;
1002 bool HasDisabled;
1003 std::string AllowedList;
1004 std::string DisabledList;
1005 unsigned MinLen;
1006 unsigned MaxLen;
1007};
1008
1009class HardwareKeyboard
1010{
1011public:
thatf37aec22015-02-01 13:38:35 +01001012 HardwareKeyboard();
Dees_Troy51a0e822012-09-05 15:24:24 -04001013 virtual ~HardwareKeyboard();
1014
1015public:
thatf37aec22015-02-01 13:38:35 +01001016 // called by the input handler for key events
1017 int KeyDown(int key_code);
1018 int KeyUp(int key_code);
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001019
thatf37aec22015-02-01 13:38:35 +01001020 // called by the input handler when holding a key down
1021 int KeyRepeat();
1022
1023 // called by multi-key actions to suppress key-release notifications
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001024 void ConsumeKeyRelease(int key);
1025
1026private:
thatf37aec22015-02-01 13:38:35 +01001027 int mLastKeyChar;
Vojtech Bocek0b7fe502014-03-13 17:36:52 +01001028 std::set<int> mPressedKeys;
Dees_Troy51a0e822012-09-05 15:24:24 -04001029};
1030
Vojtech Bocekede51c52014-02-07 23:58:09 +01001031class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
Vojtech Bocek85932342013-04-01 22:11:33 +02001032{
1033public:
1034 GUISliderValue(xml_node<>* node);
1035 virtual ~GUISliderValue();
1036
1037public:
1038 // Render - Render the full object to the GL surface
1039 // Return 0 on success, <0 on error
1040 virtual int Render(void);
1041
1042 // Update - Update any UI component animations (called <= 30 FPS)
1043 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
1044 virtual int Update(void);
1045
1046 // SetPos - Update the position of the render object
1047 // Return 0 on success, <0 on error
1048 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1049
1050 // NotifyTouch - Notify of a touch event
1051 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
1052 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1053
1054 // Notify of a variable change
Vojtech Bocek07220562014-02-08 02:05:33 +01001055 virtual int NotifyVarChange(const std::string& varName, const std::string& value);
Vojtech Bocek85932342013-04-01 22:11:33 +02001056
1057 // SetPageFocus - Notify when a page gains or loses focus
1058 virtual void SetPageFocus(int inFocus);
1059
1060protected:
1061 int measureText(const std::string& str);
1062 int valueFromPct(float pct);
1063 float pctFromValue(int value);
1064 void loadValue(bool force = false);
1065
1066 std::string mVariable;
1067 int mMax;
1068 int mMin;
1069 int mValue;
1070 char *mValueStr;
1071 float mValuePct;
1072 std::string mMaxStr;
1073 std::string mMinStr;
thatf6ed8fc2015-02-14 20:23:16 +01001074 FontResource *mFont;
Vojtech Bocek85932342013-04-01 22:11:33 +02001075 GUIText* mLabel;
1076 int mLabelW;
1077 COLOR mTextColor;
1078 COLOR mLineColor;
1079 COLOR mSliderColor;
1080 bool mShowRange;
1081 bool mShowCurr;
1082 int mLineX;
1083 int mLineY;
1084 int mLineH;
1085 int mLinePadding;
1086 int mPadding;
1087 int mSliderY;
1088 int mSliderW;
1089 int mSliderH;
1090 bool mRendered;
1091 int mFontHeight;
1092 GUIAction *mAction;
1093 bool mChangeOnDrag;
Vojtech Bocek18d7c982014-08-04 17:19:28 +02001094 int mLineW;
1095 bool mDragging;
thatf6ed8fc2015-02-14 20:23:16 +01001096 ImageResource *mBackgroundImage;
1097 ImageResource *mHandleImage;
1098 ImageResource *mHandleHoverImage;
Vojtech Bocek85932342013-04-01 22:11:33 +02001099};
1100
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001101class MouseCursor : public RenderObject
1102{
1103public:
1104 MouseCursor(int posX, int posY);
1105 virtual ~MouseCursor();
1106
1107 virtual int Render(void);
1108 virtual int Update(void);
1109 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1110
1111 void Move(int deltaX, int deltaY);
1112 void GetPos(int& x, int& y);
1113 void LoadData(xml_node<>* node);
1114 void ResetData(int resX, int resY);
1115
1116private:
1117 int m_resX;
1118 int m_resY;
1119 bool m_moved;
1120 float m_speedMultiplier;
1121 COLOR m_color;
thatf6ed8fc2015-02-14 20:23:16 +01001122 ImageResource *m_image;
Vojtech Bocek1fc30fc2014-01-29 18:37:19 +01001123 bool m_present;
1124};
1125
Vojtech Bocek7e11ac52015-03-05 23:21:49 +01001126class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
1127{
1128public:
1129 GUIPatternPassword(xml_node<>* node);
1130 virtual ~GUIPatternPassword();
1131
1132public:
1133 virtual int Render(void);
1134 virtual int Update(void);
1135 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
1136 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
1137
1138protected:
1139 void CalculateDotPositions();
1140 void ResetActiveDots();
1141 void ConnectDot(int dot_idx);
1142 void ConnectIntermediateDots(int dot_idx);
1143 int InDot(int x, int y);
1144 bool DotUsed(int dot_idx);
1145 static bool IsInRect(int x, int y, int rx, int ry, int rw, int rh);
1146 void PatternDrawn();
1147
1148 struct Dot {
1149 int x;
1150 int y;
1151 bool active;
1152 };
1153
1154 Dot mDots[9];
1155 int mConnectedDots[9];
1156 size_t mConnectedDotsLen;
1157 int mCurLineX;
1158 int mCurLineY;
1159 bool mTrackingTouch;
1160 bool mNeedRender;
1161
1162 COLOR mDotColor;
1163 COLOR mActiveDotColor;
1164 COLOR mLineColor;
1165 ImageResource *mDotImage;
1166 ImageResource *mActiveDotImage;
1167 gr_surface mDotCircle;
1168 gr_surface mActiveDotCircle;
1169 int mDotRadius;
1170 int mLineWidth;
1171
1172 std::string mPassVar;
1173 GUIAction *mAction;
1174 int mUpdate;
1175};
1176
1177
Dees_Troy51a0e822012-09-05 15:24:24 -04001178// Helper APIs
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001179xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
thatf6ed8fc2015-02-14 20:23:16 +01001180std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
1181int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1182int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
1183int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
Ethan Yonker21ff02a2015-02-18 14:35:00 -06001184COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
thatf6ed8fc2015-02-14 20:23:16 +01001185COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
1186FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
1187ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
1188AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
1189
Ethan Yonkerb7a54a32015-10-05 10:16:27 -05001190bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
Dees_Troy51a0e822012-09-05 15:24:24 -04001191
1192#endif // _OBJECTS_HEADER
1193