blob: 3a39fe565338d098d01e96f1abea2bf33e6e529d [file] [log] [blame]
Dees_Troy51a0e822012-09-05 15:24:24 -04001// objects.h - Base classes for object manager of GUI
2
3#ifndef _OBJECTS_HEADER
4#define _OBJECTS_HEADER
5
6#include "rapidxml.hpp"
7#include <vector>
8#include <string>
9#include <map>
10
11extern "C" {
12#include "../minzip/Zip.h"
13}
14
15using namespace rapidxml;
16
17#include "../data.hpp"
18#include "resources.hpp"
19#include "pages.hpp"
20
21class RenderObject
22{
23public:
24 enum Placement {
25 TOP_LEFT = 0,
26 TOP_RIGHT = 1,
27 BOTTOM_LEFT = 2,
28 BOTTOM_RIGHT = 3,
29 CENTER = 4,
30 CENTER_X_ONLY = 5,
31 };
32
33public:
34 RenderObject() { mRenderX = 0; mRenderY = 0; mRenderW = 0; mRenderH = 0; mPlacement = TOP_LEFT; }
35 virtual ~RenderObject() {}
36
37public:
38 // Render - Render the full object to the GL surface
39 // Return 0 on success, <0 on error
40 virtual int Render(void) = 0;
41
42 // Update - Update any UI component animations (called <= 30 FPS)
43 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
44 virtual int Update(void) { return 0; }
45
46 // GetRenderPos - Returns the current position of the object
47 virtual int GetRenderPos(int& x, int& y, int& w, int& h) { x = mRenderX; y = mRenderY; w = mRenderW; h = mRenderH; return 0; }
48
49 // SetRenderPos - Update the position of the object
50 // Return 0 on success, <0 on error
51 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; }
52
53 // GetPlacement - Returns the current placement
54 virtual int GetPlacement(Placement& placement) { placement = mPlacement; return 0; }
55
56 // SetPlacement - Update the current placement
57 virtual int SetPlacement(Placement placement) { mPlacement = placement; return 0; }
58
59 // SetPageFocus - Notify when a page gains or loses focus
60 virtual void SetPageFocus(int inFocus) { return; }
61
62protected:
63 int mRenderX, mRenderY, mRenderW, mRenderH;
64 Placement mPlacement;
65};
66
67class ActionObject
68{
69public:
70 ActionObject() { mActionX = 0; mActionY = 0; mActionW = 0; mActionH = 0; }
71 virtual ~ActionObject() {}
72
73public:
74 // NotifyTouch - Notify of a touch event
75 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
76 virtual int NotifyTouch(TOUCH_STATE state, int x, int y) { return 0; }
77
78 // NotifyKey - Notify of a key press
79 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
80 virtual int NotifyKey(int key) { return 1; }
81
82 // GetRenderPos - Returns the current position of the object
83 virtual int GetActionPos(int& x, int& y, int& w, int& h) { x = mActionX; y = mActionY; w = mActionW; h = mActionH; return 0; }
84
85 // SetRenderPos - Update the position of the object
86 // Return 0 on success, <0 on error
87 virtual int SetActionPos(int x, int y, int w = 0, int h = 0);
88
89 // IsInRegion - Checks if the request is handled by this object
90 // Return 0 if this object handles the request, 1 if not
91 virtual int IsInRegion(int x, int y) { return ((x < mActionX || x > mActionX + mActionW || y < mActionY || y > mActionY + mActionH) ? 0 : 1); }
92
93 // NotifyVarChange - Notify of a variable change
94 // Returns 0 on success, <0 on error
95 virtual int NotifyVarChange(std::string varName, std::string value) { return 0; }
96
97protected:
98 int mActionX, mActionY, mActionW, mActionH;
99};
100
101class Conditional
102{
103public:
104 Conditional(xml_node<>* node);
105
106public:
107 bool IsConditionVariable(std::string var);
108 bool isConditionTrue();
109 bool isConditionValid();
110 void NotifyPageSet();
111
112protected:
113 class Condition
114 {
115 public:
116 std::string mVar1;
117 std::string mVar2;
118 std::string mCompareOp;
119 std::string mLastVal;
120 };
121
122 std::vector<Condition> mConditions;
123
124protected:
125 bool isMounted(std::string vol);
126 bool isConditionTrue(Condition* condition);
127
128};
129
130class InputObject
131{
132public:
133 InputObject() { HasInputFocus = 0; }
134 virtual ~InputObject() {}
135
136public:
137 // NotifyKeyboard - Notify of keyboard input
138 // Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
139 virtual int NotifyKeyboard(int key) { return 1; }
140
141 virtual int SetInputFocus(int focus) { HasInputFocus = focus; return 1; }
142
143protected:
144 int HasInputFocus;
145};
146
147// Derived Objects
148// GUIText - Used for static text
149class GUIText : public RenderObject, public ActionObject, public Conditional
150
151{
152public:
153 // w and h may be ignored, in which case, no bounding box is applied
154 GUIText(xml_node<>* node);
155
156public:
157 // Render - Render the full object to the GL surface
158 // Return 0 on success, <0 on error
159 virtual int Render(void);
160
161 // Update - Update any UI component animations (called <= 30 FPS)
162 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
163 virtual int Update(void);
164
165 // Retrieve the size of the current string (dynamic strings may change per call)
166 virtual int GetCurrentBounds(int& w, int& h);
167
168 // Notify of a variable change
169 virtual int NotifyVarChange(std::string varName, std::string value);
170
171 // Set maximum width in pixels
172 virtual int SetMaxWidth(unsigned width);
173
174 // Set number of characters to skip (for scrolling)
175 virtual int SkipCharCount(unsigned skip);
176
Dees_Troy4d12f962012-10-19 13:13:15 -0400177public:
178 bool isHighlighted;
179
Dees_Troy51a0e822012-09-05 15:24:24 -0400180protected:
181 std::string mText;
182 std::string mLastValue;
183 COLOR mColor;
Dees_Troy4d12f962012-10-19 13:13:15 -0400184 COLOR mHighlightColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400185 Resource* mFont;
186 int mIsStatic;
187 int mVarChanged;
188 int mFontHeight;
189 unsigned maxWidth;
190 unsigned charSkip;
Dees_Troy4d12f962012-10-19 13:13:15 -0400191 bool hasHighlightColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400192
193protected:
194 std::string parseText(void);
195};
196
197// GUIImage - Used for static image
198class GUIImage : public RenderObject
199{
200public:
201 GUIImage(xml_node<>* node);
202
203public:
204 // Render - Render the full object to the GL surface
205 // Return 0 on success, <0 on error
206 virtual int Render(void);
207
208 // SetRenderPos - Update the position of the object
209 // Return 0 on success, <0 on error
210 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
211
Dees_Troy4d12f962012-10-19 13:13:15 -0400212public:
213 bool isHighlighted;
214
Dees_Troy51a0e822012-09-05 15:24:24 -0400215protected:
216 Resource* mImage;
Dees_Troy4d12f962012-10-19 13:13:15 -0400217 Resource* mHighlightImage;
Dees_Troy51a0e822012-09-05 15:24:24 -0400218};
219
220// GUIFill - Used for fill colors
221class GUIFill : public RenderObject
222{
223public:
224 GUIFill(xml_node<>* node);
225
226public:
227 // Render - Render the full object to the GL surface
228 // Return 0 on success, <0 on error
229 virtual int Render(void);
230
231protected:
232 COLOR mColor;
233};
234
235// GUIAction - Used for standard actions
236class GUIAction : public ActionObject, public Conditional
237{
238public:
239 GUIAction(xml_node<>* node);
240
241public:
242 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
243 virtual int NotifyKey(int key);
244 virtual int NotifyVarChange(std::string varName, std::string value);
245 virtual int doActions();
246
247protected:
248 class Action
249 {
250 public:
251 std::string mFunction;
252 std::string mArg;
253 };
254
255 std::vector<Action> mActions;
256 int mKey;
257
258protected:
259 int getKeyByName(std::string key);
260 virtual int doAction(Action action, int isThreaded = 0);
261 static void* thread_start(void *cookie);
262 void simulate_progress_bar(void);
Dees_Troy657c3092012-09-10 20:32:10 -0400263 int flash_zip(std::string filename, std::string pageName, const int simulate, int* wipe_cache);
Dees_Troy51a0e822012-09-05 15:24:24 -0400264 void operation_start(const string operation_name);
265 void operation_end(const int operation_status, const int simulate);
266 static void* command_thread(void *cookie);
267};
268
269class GUIConsole : public RenderObject, public ActionObject
270{
271public:
272 GUIConsole(xml_node<>* node);
273
274public:
275 // Render - Render the full object to the GL surface
276 // Return 0 on success, <0 on error
277 virtual int Render(void);
278
279 // Update - Update any UI component animations (called <= 30 FPS)
280 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
281 virtual int Update(void);
282
283 // SetRenderPos - Update the position of the object
284 // Return 0 on success, <0 on error
285 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
286
287 // IsInRegion - Checks if the request is handled by this object
288 // Return 0 if this object handles the request, 1 if not
289 virtual int IsInRegion(int x, int y);
290
291 // NotifyTouch - Notify of a touch event
292 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
293 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
294
295protected:
296 enum SlideoutState
297 {
298 hidden = 0,
299 visible,
300 request_hide,
301 request_show
302 };
303 Resource* mFont;
304 Resource* mSlideoutImage;
305 COLOR mForegroundColor;
306 COLOR mBackgroundColor;
307 COLOR mScrollColor;
308 unsigned int mFontHeight;
309 int mCurrentLine;
310 unsigned int mLastCount;
311 unsigned int mMaxRows;
312 int mStartY;
313 int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
314 int mSlideinX, mSlideinY, mSlideinW, mSlideinH;
315 int mConsoleX, mConsoleY, mConsoleW, mConsoleH;
316 int mLastTouchX, mLastTouchY;
317 int mSlideMultiplier;
318 int mSlideout;
319 SlideoutState mSlideoutState;
320
321protected:
322 virtual int RenderSlideout(void);
323 virtual int RenderConsole(void);
324
325};
326
327class GUIButton : public RenderObject, public ActionObject, public Conditional
328{
329public:
330 GUIButton(xml_node<>* node);
331 virtual ~GUIButton();
332
333public:
334 // Render - Render the full object to the GL surface
335 // Return 0 on success, <0 on error
336 virtual int Render(void);
337
338 // Update - Update any UI component animations (called <= 30 FPS)
339 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
340 virtual int Update(void);
341
342 // SetPos - Update the position of the render object
343 // Return 0 on success, <0 on error
344 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
345
346 // NotifyTouch - Notify of a touch event
347 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
348 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
349
350protected:
351 GUIImage* mButtonImg;
352 Resource* mButtonIcon;
353 GUIText* mButtonLabel;
354 GUIAction* mAction;
355 int mTextX, mTextY, mTextW, mTextH;
356 int mIconX, mIconY, mIconW, mIconH;
357 bool mRendered;
Dees_Troy1a7a6672013-02-15 09:39:07 -0600358 bool hasHighlightColor;
359 bool renderHighlight;
360 COLOR mHighlightColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400361};
362
363class GUICheckbox: public RenderObject, public ActionObject, public Conditional
364{
365public:
366 GUICheckbox(xml_node<>* node);
367 virtual ~GUICheckbox();
368
369public:
370 // Render - Render the full object to the GL surface
371 // Return 0 on success, <0 on error
372 virtual int Render(void);
373
374 // Update - Update any UI component animations (called <= 30 FPS)
375 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
376 virtual int Update(void);
377
378 // SetPos - Update the position of the render object
379 // Return 0 on success, <0 on error
380 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
381
382 // NotifyTouch - Notify of a touch event
383 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
384 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
385
386protected:
387 Resource* mChecked;
388 Resource* mUnchecked;
389 GUIText* mLabel;
390 int mTextX, mTextY;
391 int mCheckX, mCheckY, mCheckW, mCheckH;
392 int mLastState;
393 bool mRendered;
394 std::string mVarName;
395};
396
397class GUIFileSelector : public RenderObject, public ActionObject
398{
399public:
400 GUIFileSelector(xml_node<>* node);
401 virtual ~GUIFileSelector();
402
403public:
404 // Render - Render the full object to the GL surface
405 // Return 0 on success, <0 on error
406 virtual int Render(void);
407
408 // Update - Update any UI component animations (called <= 30 FPS)
409 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
410 virtual int Update(void);
411
412 // NotifyTouch - Notify of a touch event
413 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
414 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
415
416 // NotifyVarChange - Notify of a variable change
417 virtual int NotifyVarChange(std::string varName, std::string value);
418
419 // SetPos - Update the position of the render object
420 // Return 0 on success, <0 on error
421 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
422
423 // SetPageFocus - Notify when a page gains or loses focus
424 virtual void SetPageFocus(int inFocus);
425
426protected:
427 struct FileData {
428 std::string fileName;
429 unsigned char fileType; // Uses d_type format from struct dirent
430 mode_t protection; // Uses mode_t format from stat
431 uid_t userId;
432 gid_t groupId;
433 off_t fileSize;
434 time_t lastAccess; // Uses time_t format from stat
435 time_t lastModified; // Uses time_t format from stat
436 time_t lastStatChange; // Uses time_t format from stat
437 };
438
439protected:
440 virtual int GetSelection(int x, int y);
441
442 virtual int GetFileList(const std::string folder);
443 static bool fileSort(FileData d1, FileData d2);
444
445protected:
446 std::vector<FileData> mFolderList;
447 std::vector<FileData> mFileList;
448 std::string mPathVar;
449 std::string mExtn;
450 std::string mVariable;
451 std::string mSortVariable;
452 std::string mSelection;
453 std::string mHeaderText;
454 std::string mLastValue;
455 int actualLineHeight;
456 int mStart;
457 int mLineSpacing;
458 int mSeparatorH;
459 int mHeaderSeparatorH;
460 int mShowFolders, mShowFiles, mShowNavFolders;
461 int mUpdate;
462 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
463 int mHeaderH;
Vojtech Bocek7cc278b2013-02-24 01:40:19 +0100464 int mFastScrollW;
465 int mFastScrollLineW;
466 int mFastScrollRectW;
467 int mFastScrollRectH;
468 int mFastScrollRectX;
469 int mFastScrollRectY;
Dees_Troy51a0e822012-09-05 15:24:24 -0400470 static int mSortOrder;
471 int startY;
472 int scrollingSpeed;
473 int scrollingY;
474 int mHeaderIsStatic;
475 int touchDebounce;
476 unsigned mFontHeight;
477 unsigned mLineHeight;
478 int mIconWidth, mIconHeight, mFolderIconHeight, mFileIconHeight, mFolderIconWidth, mFileIconWidth, mHeaderIconHeight, mHeaderIconWidth;
479 Resource* mHeaderIcon;
480 Resource* mFolderIcon;
481 Resource* mFileIcon;
482 Resource* mBackground;
483 Resource* mFont;
484 COLOR mBackgroundColor;
485 COLOR mFontColor;
486 COLOR mHeaderBackgroundColor;
487 COLOR mHeaderFontColor;
488 COLOR mSeparatorColor;
489 COLOR mHeaderSeparatorColor;
Vojtech Bocek7cc278b2013-02-24 01:40:19 +0100490 COLOR mFastScrollLineColor;
491 COLOR mFastScrollRectColor;
Dees_Troye7585ca2013-02-15 11:42:29 -0600492 bool hasHighlightColor;
493 bool hasFontHighlightColor;
494 bool isHighlighted;
495 COLOR mHighlightColor;
496 COLOR mFontHighlightColor;
497 int startSelection;
Dees_Troyc0583f52013-02-28 11:19:57 -0600498 bool updateFileList;
Dees_Troy51a0e822012-09-05 15:24:24 -0400499};
500
501class GUIListBox : public RenderObject, public ActionObject
502{
503public:
504 GUIListBox(xml_node<>* node);
505 virtual ~GUIListBox();
506
507public:
508 // Render - Render the full object to the GL surface
509 // Return 0 on success, <0 on error
510 virtual int Render(void);
511
512 // Update - Update any UI component animations (called <= 30 FPS)
513 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
514 virtual int Update(void);
515
516 // NotifyTouch - Notify of a touch event
517 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
518 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
519
520 // NotifyVarChange - Notify of a variable change
521 virtual int NotifyVarChange(std::string varName, std::string value);
522
523 // SetPos - Update the position of the render object
524 // Return 0 on success, <0 on error
525 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
526
527 // SetPageFocus - Notify when a page gains or loses focus
528 virtual void SetPageFocus(int inFocus);
529
530protected:
531 struct ListData {
532 std::string displayName;
533 std::string variableValue;
534 unsigned int selected;
535 };
536
537protected:
538 virtual int GetSelection(int x, int y);
539
540protected:
541 std::vector<ListData> mList;
542 std::string mVariable;
543 std::string mSelection;
544 std::string currentValue;
Dees_Troyeead9852013-02-15 14:31:06 -0600545 std::string mHeaderText;
546 std::string mLastValue;
547 int actualLineHeight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400548 int mStart;
Dees_Troyeead9852013-02-15 14:31:06 -0600549 int startY;
550 int mSeparatorH, mHeaderSeparatorH;
Dees_Troy51a0e822012-09-05 15:24:24 -0400551 int mLineSpacing;
552 int mUpdate;
Dees_Troyeead9852013-02-15 14:31:06 -0600553 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH, mHeaderH;
Dees_Troy58f5cf02013-02-27 22:21:41 +0000554 int mFastScrollW;
555 int mFastScrollLineW;
556 int mFastScrollRectW;
557 int mFastScrollRectH;
558 int mFastScrollRectX;
559 int mFastScrollRectY;
Dees_Troyeead9852013-02-15 14:31:06 -0600560 int mIconWidth, mIconHeight, mSelectedIconWidth, mSelectedIconHeight, mUnselectedIconWidth, mUnselectedIconHeight, mHeaderIconHeight, mHeaderIconWidth;
561 int scrollingSpeed;
562 int scrollingY;
Dees_Troy51a0e822012-09-05 15:24:24 -0400563 static int mSortOrder;
564 unsigned mFontHeight;
565 unsigned mLineHeight;
Dees_Troyeead9852013-02-15 14:31:06 -0600566 Resource* mHeaderIcon;
Dees_Troy51a0e822012-09-05 15:24:24 -0400567 Resource* mIconSelected;
568 Resource* mIconUnselected;
569 Resource* mBackground;
570 Resource* mFont;
571 COLOR mBackgroundColor;
572 COLOR mFontColor;
Dees_Troyeead9852013-02-15 14:31:06 -0600573 COLOR mHeaderBackgroundColor;
574 COLOR mHeaderFontColor;
575 COLOR mSeparatorColor;
576 COLOR mHeaderSeparatorColor;
Dees_Troy58f5cf02013-02-27 22:21:41 +0000577 COLOR mFastScrollLineColor;
578 COLOR mFastScrollRectColor;
Dees_Troyeead9852013-02-15 14:31:06 -0600579 bool hasHighlightColor;
580 bool hasFontHighlightColor;
581 bool isHighlighted;
582 COLOR mHighlightColor;
583 COLOR mFontHighlightColor;
584 int mHeaderIsStatic;
585 int startSelection;
586 int touchDebounce;
Dees_Troy51a0e822012-09-05 15:24:24 -0400587};
588
589// GUIAnimation - Used for animations
590class GUIAnimation : public RenderObject
591{
592public:
593 GUIAnimation(xml_node<>* node);
594
595public:
596 // Render - Render the full object to the GL surface
597 // Return 0 on success, <0 on error
598 virtual int Render(void);
599
600 // Update - Update any UI component animations (called <= 30 FPS)
601 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
602 virtual int Update(void);
603
604protected:
605 AnimationResource* mAnimation;
606 int mFrame;
607 int mFPS;
608 int mLoop;
609 int mRender;
610 int mUpdateCount;
611};
612
613class GUIProgressBar : public RenderObject, public ActionObject
614{
615public:
616 GUIProgressBar(xml_node<>* node);
617
618public:
619 // Render - Render the full object to the GL surface
620 // Return 0 on success, <0 on error
621 virtual int Render(void);
622
623 // 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);
626
627 // NotifyVarChange - Notify of a variable change
628 // Returns 0 on success, <0 on error
629 virtual int NotifyVarChange(std::string varName, std::string value);
630
631protected:
632 Resource* mEmptyBar;
633 Resource* mFullBar;
634 std::string mMinValVar;
635 std::string mMaxValVar;
636 std::string mCurValVar;
637 float mSlide;
638 float mSlideInc;
639 int mSlideFrames;
640 int mLastPos;
641
642protected:
643 virtual int RenderInternal(void); // Does the actual render
644
645};
646
647class GUISlider : public RenderObject, public ActionObject
648{
649public:
650 GUISlider(xml_node<>* node);
651 virtual ~GUISlider();
652
653public:
654 // Render - Render the full object to the GL surface
655 // Return 0 on success, <0 on error
656 virtual int Render(void);
657
658 // Update - Update any UI component animations (called <= 30 FPS)
659 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
660 virtual int Update(void);
661
662 // NotifyTouch - Notify of a touch event
663 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
664 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
665
666protected:
667 GUIAction* sAction;
668 Resource* sSlider;
669 Resource* sSliderUsed;
670 Resource* sTouch;
671 int sTouchW, sTouchH;
672 int sCurTouchX;
673 int sUpdate;
674};
675
676#define MAX_KEYBOARD_LAYOUTS 5
677#define MAX_KEYBOARD_ROWS 9
678#define MAX_KEYBOARD_KEYS 20
679#define KEYBOARD_ACTION 253
680#define KEYBOARD_LAYOUT 254
681#define KEYBOARD_SWIPE_LEFT 252
682#define KEYBOARD_SWIPE_RIGHT 251
683#define KEYBOARD_ARROW_LEFT 250
684#define KEYBOARD_ARROW_RIGHT 249
685#define KEYBOARD_HOME 248
686#define KEYBOARD_END 247
687#define KEYBOARD_ARROW_UP 246
688#define KEYBOARD_ARROW_DOWN 245
689#define KEYBOARD_SPECIAL_KEYS 245
690#define KEYBOARD_BACKSPACE 8
691
692class GUIKeyboard : public RenderObject, public ActionObject, public Conditional
693{
694public:
695 GUIKeyboard(xml_node<>* node);
696 virtual ~GUIKeyboard();
697
698public:
699 virtual int Render(void);
700 virtual int Update(void);
701 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
702 virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
703
704protected:
705 virtual int GetSelection(int x, int y);
706
707protected:
708 struct keyboard_key_class
709 {
710 unsigned char key;
711 unsigned char longpresskey;
712 unsigned int end_x;
713 unsigned int layout;
714 };
715
716 Resource* keyboardImg[MAX_KEYBOARD_LAYOUTS];
717 struct keyboard_key_class keyboard_keys[MAX_KEYBOARD_LAYOUTS][MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
718 bool mRendered;
719 std::string mVariable;
720 unsigned int cursorLocation;
721 unsigned int currentLayout;
722 unsigned int row_heights[MAX_KEYBOARD_LAYOUTS][MAX_KEYBOARD_ROWS];
723 unsigned int KeyboardWidth, KeyboardHeight;
Dees_Troy30b962e2012-10-19 20:48:59 -0400724 int rowY, colX, highlightRenderCount, hasHighlight;
Dees_Troy51a0e822012-09-05 15:24:24 -0400725 GUIAction* mAction;
Dees_Troy30b962e2012-10-19 20:48:59 -0400726 COLOR mHighlightColor;
Dees_Troy51a0e822012-09-05 15:24:24 -0400727};
728
729// GUIInput - Used for keyboard input
730class GUIInput : public RenderObject, public ActionObject, public Conditional, public InputObject
731{
732public:
733 // w and h may be ignored, in which case, no bounding box is applied
734 GUIInput(xml_node<>* node);
735 virtual ~GUIInput();
736
737public:
738 // Render - Render the full object to the GL surface
739 // Return 0 on success, <0 on error
740 virtual int Render(void);
741
742 // Update - Update any UI component animations (called <= 30 FPS)
743 // Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
744 virtual int Update(void);
745
746 // Notify of a variable change
747 virtual int NotifyVarChange(std::string varName, std::string value);
748
749 // NotifyTouch - Notify of a touch event
750 // Return 0 on success, >0 to ignore remainder of touch, and <0 on error
751 virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
752
753 virtual int NotifyKeyboard(int key);
754
755protected:
756 virtual int GetSelection(int x, int y);
757
758 // Handles displaying the text properly when chars are added, deleted, or for scrolling
759 virtual int HandleTextLocation(int x);
760
761protected:
762 GUIText* mInputText;
763 GUIAction* mAction;
764 Resource* mBackground;
765 Resource* mCursor;
766 Resource* mFont;
767 std::string mText;
768 std::string mLastValue;
769 std::string mVariable;
770 std::string mMask;
771 std::string mMaskVariable;
772 COLOR mBackgroundColor;
773 COLOR mCursorColor;
774 int scrollingX;
775 int lastX;
776 int mCursorLocation;
777 int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
778 int mFontY;
779 unsigned skipChars;
780 unsigned mFontHeight;
781 unsigned CursorWidth;
782 bool mRendered;
783 bool HasMask;
784 bool DrawCursor;
785 bool isLocalChange;
786 bool HasAllowed;
787 bool HasDisabled;
788 std::string AllowedList;
789 std::string DisabledList;
790 unsigned MinLen;
791 unsigned MaxLen;
792};
793
794class HardwareKeyboard
795{
796public:
797 HardwareKeyboard(void);
798 virtual ~HardwareKeyboard();
799
800public:
801 virtual int KeyDown(int key_code);
802 virtual int KeyUp(int key_code);
803 virtual int KeyRepeat(void);
804};
805
806// Helper APIs
807bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, RenderObject::Placement* placement = NULL);
808
809#endif // _OBJECTS_HEADER
810