1257 lines
39 KiB
C++
Executable File
1257 lines
39 KiB
C++
Executable File
/*
|
|
Copyright 2013 bigbiff/Dees_Troy TeamWin
|
|
This file is part of TWRP/TeamWin Recovery Project.
|
|
|
|
TWRP is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
TWRP is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with TWRP. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
// objects.hpp - Base classes for object manager of GUI
|
|
|
|
#ifndef _OBJECTS_HEADER
|
|
#define _OBJECTS_HEADER
|
|
|
|
#include "rapidxml.hpp"
|
|
#include <vector>
|
|
#include <string>
|
|
#include <map>
|
|
#include <set>
|
|
#include <time.h>
|
|
|
|
using namespace rapidxml;
|
|
|
|
#include "../data.hpp"
|
|
#include "resources.hpp"
|
|
#include "pages.hpp"
|
|
#include "../partitions.hpp"
|
|
#include "placement.h"
|
|
|
|
#ifndef TW_X_OFFSET
|
|
#define TW_X_OFFSET 0
|
|
#endif
|
|
#ifndef TW_Y_OFFSET
|
|
#define TW_Y_OFFSET 0
|
|
#endif
|
|
#ifndef TW_W_OFFSET
|
|
#define TW_W_OFFSET 0
|
|
#endif
|
|
#ifndef TW_H_OFFSET
|
|
#define TW_H_OFFSET 0
|
|
#endif
|
|
|
|
class RenderObject
|
|
{
|
|
public:
|
|
RenderObject() { mRenderX = 0; mRenderY = 0; mRenderW = 0; mRenderH = 0; mPlacement = TOP_LEFT; }
|
|
virtual ~RenderObject() {}
|
|
|
|
public:
|
|
// Render - Render the full object to the GL surface
|
|
// Return 0 on success, <0 on error
|
|
virtual int Render(void) = 0;
|
|
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update(void) { return 0; }
|
|
|
|
// GetRenderPos - Returns the current position of the object
|
|
virtual int GetRenderPos(int& x, int& y, int& w, int& h) { x = mRenderX; y = mRenderY; w = mRenderW; h = mRenderH; return 0; }
|
|
|
|
// SetRenderPos - Update the position of the object
|
|
// Return 0 on success, <0 on error
|
|
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; }
|
|
|
|
// GetPlacement - Returns the current placement
|
|
virtual int GetPlacement(Placement& placement) { placement = mPlacement; return 0; }
|
|
|
|
// SetPlacement - Update the current placement
|
|
virtual int SetPlacement(Placement placement) { mPlacement = placement; return 0; }
|
|
|
|
// SetPageFocus - Notify when a page gains or loses focus
|
|
// TODO: This should be named NotifyPageFocus for consistency
|
|
virtual void SetPageFocus(int inFocus __unused) { return; }
|
|
|
|
protected:
|
|
int mRenderX, mRenderY, mRenderW, mRenderH;
|
|
Placement mPlacement;
|
|
};
|
|
|
|
class ActionObject
|
|
{
|
|
public:
|
|
ActionObject() { mActionX = 0; mActionY = 0; mActionW = 0; mActionH = 0; }
|
|
virtual ~ActionObject() {}
|
|
|
|
public:
|
|
// NotifyTouch - Notify of a touch event
|
|
// Return 0 on success, >0 to ignore remainder of touch, and <0 on error
|
|
virtual int NotifyTouch(TOUCH_STATE state __unused, int x __unused, int y __unused) { return 0; }
|
|
|
|
// NotifyKey - Notify of a key press
|
|
// Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
|
|
virtual int NotifyKey(int key __unused, bool down __unused) { return 1; }
|
|
|
|
virtual int GetActionPos(int& x, int& y, int& w, int& h) { x = mActionX; y = mActionY; w = mActionW; h = mActionH; return 0; }
|
|
|
|
// Return 0 on success, <0 on error
|
|
virtual int SetActionPos(int x, int y, int w = 0, int h = 0);
|
|
|
|
// IsInRegion - Checks if the request is handled by this object
|
|
// Return 1 if this object handles the request, 0 if not
|
|
virtual int IsInRegion(int x, int y) { return ((x < mActionX || x >= mActionX + mActionW || y < mActionY || y >= mActionY + mActionH) ? 0 : 1); }
|
|
|
|
protected:
|
|
int mActionX, mActionY, mActionW, mActionH;
|
|
};
|
|
|
|
class GUIObject
|
|
{
|
|
public:
|
|
GUIObject(xml_node<>* node);
|
|
virtual ~GUIObject();
|
|
|
|
public:
|
|
bool IsConditionVariable(std::string var);
|
|
bool isConditionTrue();
|
|
bool isConditionValid();
|
|
|
|
// NotifyVarChange - Notify of a variable change
|
|
// Returns 0 on success, <0 on error
|
|
virtual int NotifyVarChange(const std::string& varName, const std::string& value);
|
|
|
|
protected:
|
|
class Condition
|
|
{
|
|
public:
|
|
Condition() {
|
|
mLastResult = true;
|
|
}
|
|
|
|
std::string mVar1;
|
|
std::string mVar2;
|
|
std::string mCompareOp;
|
|
std::string mLastVal;
|
|
bool mLastResult;
|
|
};
|
|
|
|
std::vector<Condition> mConditions;
|
|
|
|
protected:
|
|
static void LoadConditions(xml_node<>* node, std::vector<Condition>& conditions);
|
|
static bool isMounted(std::string vol);
|
|
static bool isConditionTrue(Condition* condition);
|
|
static bool UpdateConditions(std::vector<Condition>& conditions, const std::string& varName);
|
|
|
|
bool mConditionsResult;
|
|
};
|
|
|
|
class InputObject
|
|
{
|
|
public:
|
|
InputObject() { HasInputFocus = 0; }
|
|
virtual ~InputObject() {}
|
|
|
|
public:
|
|
// NotifyCharInput - Notify of character input (usually from the onscreen or hardware keyboard)
|
|
// Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
|
|
virtual int NotifyCharInput(int ch __unused) { return 1; }
|
|
|
|
virtual int SetInputFocus(int focus) { HasInputFocus = focus; return 1; }
|
|
|
|
protected:
|
|
int HasInputFocus;
|
|
};
|
|
|
|
// Derived Objects
|
|
// GUIText - Used for static text
|
|
class GUIText : public GUIObject, public RenderObject, public ActionObject
|
|
{
|
|
public:
|
|
// w and h may be ignored, in which case, no bounding box is applied
|
|
GUIText(xml_node<>* node);
|
|
|
|
public:
|
|
// Render - Render the full object to the GL surface
|
|
// Return 0 on success, <0 on error
|
|
virtual int Render(void);
|
|
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update(void);
|
|
|
|
// Retrieve the size of the current string (dynamic strings may change per call)
|
|
virtual int GetCurrentBounds(int& w, int& h);
|
|
|
|
// Notify of a variable change
|
|
virtual int NotifyVarChange(const std::string& varName, const std::string& value);
|
|
|
|
// Set maximum width in pixels
|
|
virtual int SetMaxWidth(unsigned width);
|
|
|
|
void SetText(string newtext);
|
|
|
|
public:
|
|
bool isHighlighted;
|
|
bool scaleWidth;
|
|
unsigned maxWidth;
|
|
|
|
protected:
|
|
std::string mText;
|
|
std::string mLastValue;
|
|
COLOR mColor;
|
|
COLOR mHighlightColor;
|
|
FontResource* mFont;
|
|
int mIsStatic;
|
|
int mVarChanged;
|
|
int mFontHeight;
|
|
};
|
|
|
|
// GUIImage - Used for static image
|
|
class GUIImage : public GUIObject, public RenderObject
|
|
{
|
|
public:
|
|
GUIImage(xml_node<>* node);
|
|
|
|
public:
|
|
// Render - Render the full object to the GL surface
|
|
// Return 0 on success, <0 on error
|
|
virtual int Render(void);
|
|
|
|
// SetRenderPos - Update the position of the object
|
|
// Return 0 on success, <0 on error
|
|
virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
|
|
|
|
public:
|
|
bool isHighlighted;
|
|
|
|
protected:
|
|
ImageResource* mImage;
|
|
ImageResource* mHighlightImage;
|
|
};
|
|
|
|
// GUIFill - Used for fill colors
|
|
class GUIFill : public GUIObject, public RenderObject
|
|
{
|
|
public:
|
|
GUIFill(xml_node<>* node);
|
|
|
|
public:
|
|
// Render - Render the full object to the GL surface
|
|
// Return 0 on success, <0 on error
|
|
virtual int Render(void);
|
|
|
|
protected:
|
|
COLOR mColor;
|
|
};
|
|
|
|
// GUIAction - Used for standard actions
|
|
class GUIAction : public GUIObject, public ActionObject
|
|
{
|
|
friend class ActionThread;
|
|
|
|
public:
|
|
GUIAction(xml_node<>* node);
|
|
|
|
public:
|
|
virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
|
|
virtual int NotifyKey(int key, bool down);
|
|
virtual int NotifyVarChange(const std::string& varName, const std::string& value);
|
|
|
|
int doActions();
|
|
|
|
protected:
|
|
class Action
|
|
{
|
|
public:
|
|
std::string mFunction;
|
|
std::string mArg;
|
|
};
|
|
|
|
std::vector<Action> mActions;
|
|
std::map<int, bool> mKeys;
|
|
|
|
protected:
|
|
enum ThreadType { THREAD_NONE, THREAD_ACTION, THREAD_CANCEL };
|
|
|
|
int getKeyByName(std::string key);
|
|
int doAction(Action action);
|
|
ThreadType getThreadType(const Action& action);
|
|
void simulate_progress_bar(void);
|
|
int flash_zip(std::string filename, int* wipe_cache);
|
|
int ozip_decrypt(std::string zip_path);
|
|
void reinject_after_flash();
|
|
void operation_start(const string operation_name);
|
|
void operation_end(const int operation_status);
|
|
time_t Start;
|
|
|
|
// map action name to function pointer
|
|
typedef int (GUIAction::*execFunction)(std::string);
|
|
typedef std::map<std::string, execFunction> mapFunc;
|
|
static mapFunc mf;
|
|
static std::set<std::string> setActionsRunningInCallerThread;
|
|
|
|
// GUI actions
|
|
int reboot(std::string arg);
|
|
int home(std::string arg);
|
|
int key(std::string arg);
|
|
int page(std::string arg);
|
|
int reload(std::string arg);
|
|
int readBackup(std::string arg);
|
|
int set(std::string arg);
|
|
int clear(std::string arg);
|
|
int mount(std::string arg);
|
|
int unmount(std::string arg);
|
|
int restoredefaultsettings(std::string arg);
|
|
int copylog(std::string arg);
|
|
int compute(std::string arg);
|
|
int setguitimezone(std::string arg);
|
|
int overlay(std::string arg);
|
|
int queuezip(std::string arg);
|
|
int cancelzip(std::string arg);
|
|
int queueclear(std::string arg);
|
|
int sleep(std::string arg);
|
|
int sleepcounter(std::string arg);
|
|
int appenddatetobackupname(std::string arg);
|
|
int generatebackupname(std::string arg);
|
|
int checkpartitionlist(std::string arg);
|
|
int getpartitiondetails(std::string arg);
|
|
int screenshot(std::string arg);
|
|
int setbrightness(std::string arg);
|
|
int checkforapp(std::string arg);
|
|
|
|
// (originally) threaded actions
|
|
int fileexists(std::string arg);
|
|
int flash(std::string arg);
|
|
int wipe(std::string arg);
|
|
int refreshsizes(std::string arg);
|
|
int nandroid(std::string arg);
|
|
int fixcontexts(std::string arg);
|
|
int fixpermissions(std::string arg);
|
|
int dd(std::string arg);
|
|
int partitionsd(std::string arg);
|
|
int installhtcdumlock(std::string arg);
|
|
int htcdumlockrestoreboot(std::string arg);
|
|
int htcdumlockreflashrecovery(std::string arg);
|
|
int cmd(std::string arg);
|
|
int terminalcommand(std::string arg);
|
|
int killterminal(std::string arg);
|
|
int reinjecttwrp(std::string arg);
|
|
int checkbackupname(std::string arg);
|
|
int decrypt(std::string arg);
|
|
int adbsideload(std::string arg);
|
|
int adbsideloadcancel(std::string arg);
|
|
int openrecoveryscript(std::string arg);
|
|
int installsu(std::string arg);
|
|
int fixsu(std::string arg);
|
|
int decrypt_backup(std::string arg);
|
|
int repair(std::string arg);
|
|
int resize(std::string arg);
|
|
int changefilesystem(std::string arg);
|
|
int startmtp(std::string arg);
|
|
int stopmtp(std::string arg);
|
|
int flashimage(std::string arg);
|
|
int cancelbackup(std::string arg);
|
|
int checkpartitionlifetimewrites(std::string arg);
|
|
int mountsystemtoggle(std::string arg);
|
|
int setlanguage(std::string arg);
|
|
int togglebacklight(std::string arg);
|
|
int twcmd(std::string arg);
|
|
int setbootslot(std::string arg);
|
|
int installapp(std::string arg);
|
|
int uninstalltwrpsystemapp(std::string arg);
|
|
int repackimage(std::string arg);
|
|
int fixabrecoverybootloop(std::string arg);
|
|
int enableadb(std::string arg);
|
|
int enablefastboot(std::string arg);
|
|
int changeterminal(std::string arg);
|
|
int applycustomtwrpfolder(std::string arg);
|
|
#ifndef TW_EXCLUDE_NANO
|
|
int editfile(std::string arg);
|
|
#endif
|
|
|
|
int simulate;
|
|
};
|
|
|
|
class GUIButton : public GUIObject, public RenderObject, public ActionObject
|
|
{
|
|
public:
|
|
GUIButton(xml_node<>* node);
|
|
virtual ~GUIButton();
|
|
|
|
public:
|
|
// Render - Render the full object to the GL surface
|
|
// Return 0 on success, <0 on error
|
|
virtual int Render(void);
|
|
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update(void);
|
|
|
|
// SetPos - Update the position of the render object
|
|
// Return 0 on success, <0 on error
|
|
virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
|
|
|
|
// NotifyTouch - Notify of a touch event
|
|
// Return 0 on success, >0 to ignore remainder of touch, and <0 on error
|
|
virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
|
|
|
|
protected:
|
|
GUIImage* mButtonImg;
|
|
ImageResource* mButtonIcon;
|
|
GUIText* mButtonLabel;
|
|
GUIAction* mAction;
|
|
int mTextX, mTextY, mTextW, mTextH;
|
|
int mIconX, mIconY, mIconW, mIconH;
|
|
bool mRendered;
|
|
bool hasHighlightColor;
|
|
bool renderHighlight;
|
|
bool hasFill;
|
|
COLOR mFillColor;
|
|
COLOR mHighlightColor;
|
|
Placement TextPlacement;
|
|
};
|
|
|
|
class GUICheckbox: public GUIObject, public RenderObject, public ActionObject
|
|
{
|
|
public:
|
|
GUICheckbox(xml_node<>* node);
|
|
virtual ~GUICheckbox();
|
|
|
|
public:
|
|
// Render - Render the full object to the GL surface
|
|
// Return 0 on success, <0 on error
|
|
virtual int Render(void);
|
|
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update(void);
|
|
|
|
// SetPos - Update the position of the render object
|
|
// Return 0 on success, <0 on error
|
|
virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
|
|
|
|
// NotifyTouch - Notify of a touch event
|
|
// Return 0 on success, >0 to ignore remainder of touch, and <0 on error
|
|
virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
|
|
|
|
protected:
|
|
ImageResource* mChecked;
|
|
ImageResource* mUnchecked;
|
|
GUIText* mLabel;
|
|
int mTextX, mTextY;
|
|
int mCheckX, mCheckY, mCheckW, mCheckH;
|
|
int mLastState;
|
|
bool mRendered;
|
|
std::string mVarName;
|
|
};
|
|
|
|
class GUIScrollList : public GUIObject, public RenderObject, public ActionObject
|
|
{
|
|
public:
|
|
GUIScrollList(xml_node<>* node);
|
|
virtual ~GUIScrollList();
|
|
|
|
public:
|
|
// Render - Render the full object to the GL surface
|
|
// Return 0 on success, <0 on error
|
|
virtual int Render(void);
|
|
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update(void);
|
|
|
|
// NotifyTouch - Notify of a touch event
|
|
// Return 0 on success, >0 to ignore remainder of touch, and <0 on error
|
|
virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
|
|
|
|
// NotifyVarChange - Notify of a variable change
|
|
virtual int NotifyVarChange(const std::string& varName, const std::string& value);
|
|
|
|
// SetPos - Update the position of the render object
|
|
// Return 0 on success, <0 on error
|
|
virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
|
|
|
|
// SetPageFocus - Notify when a page gains or loses focus
|
|
virtual void SetPageFocus(int inFocus);
|
|
|
|
protected:
|
|
// derived classes need to implement these
|
|
// get number of items
|
|
virtual size_t GetItemCount() { return 0; }
|
|
// render a single item in rect (mRenderX, yPos, mRenderW, actualItemHeight)
|
|
virtual void RenderItem(size_t itemindex, int yPos, bool selected);
|
|
// an item was selected
|
|
virtual void NotifySelect(size_t item_selected __unused) {}
|
|
|
|
// render a standard-layout list item with optional icon and text
|
|
void RenderStdItem(int yPos, bool selected, ImageResource* icon, const char* text, int iconAndTextH = 0);
|
|
|
|
enum { NO_ITEM = (size_t)-1 };
|
|
// returns item index at coordinates or NO_ITEM if there is no item there
|
|
size_t HitTestItem(int x, int y);
|
|
|
|
// 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
|
|
void SetMaxIconSize(int w, int h);
|
|
|
|
// This will make sure that the item indicated by list_index is visible on the screen
|
|
void SetVisibleListLocation(size_t list_index);
|
|
|
|
// Handle scrolling changes for drags and kinetic scrolling
|
|
void HandleScrolling();
|
|
|
|
// Returns many full rows the list is capable of displaying
|
|
int GetDisplayItemCount();
|
|
|
|
// Returns the size in pixels of a partial item or row size
|
|
int GetDisplayRemainder();
|
|
|
|
protected:
|
|
// Background
|
|
COLOR mBackgroundColor;
|
|
ImageResource* mBackground; // background image, if any, automatically centered
|
|
|
|
// Header
|
|
COLOR mHeaderBackgroundColor;
|
|
COLOR mHeaderFontColor;
|
|
std::string mHeaderText; // Original header text without parsing any variables
|
|
std::string mLastHeaderValue; // Header text after parsing variables
|
|
bool mHeaderIsStatic; // indicates if the header is static (no need to check for changes in NotifyVarChange)
|
|
int mHeaderH; // actual header height including font, icon, padding, and separator heights
|
|
ImageResource* mHeaderIcon;
|
|
int mHeaderIconHeight, mHeaderIconWidth; // width and height of the header icon if present
|
|
int mHeaderSeparatorH; // Height of the separator between header and list items
|
|
COLOR mHeaderSeparatorColor; // color of the header separator
|
|
|
|
// Per-item layout
|
|
FontResource* mFont;
|
|
COLOR mFontColor;
|
|
bool hasHighlightColor; // indicates if a highlight color was set
|
|
COLOR mHighlightColor; // background row highlight color
|
|
COLOR mFontHighlightColor;
|
|
int mFontHeight;
|
|
int actualItemHeight; // Actual height of each item in pixels including max icon size, font size, and padding
|
|
int maxIconWidth, maxIconHeight; // max icon width and height for the list, set by derived class in SetMaxIconSize
|
|
int mItemSpacing; // stores the spacing or padding on the y axis, part of the actualItemHeight
|
|
int mSeparatorH; // Height of the separator between items
|
|
COLOR mSeparatorColor; // color of the separator that is between items
|
|
|
|
// Scrollbar
|
|
int mFastScrollW; // width of the fastscroll area
|
|
int mFastScrollLineW; // width of the line for fastscroll rendering
|
|
int mFastScrollRectW; // width of the rectangle for fastscroll
|
|
int mFastScrollRectH; // minimum height of the rectangle for fastscroll
|
|
COLOR mFastScrollLineColor;
|
|
COLOR mFastScrollRectColor;
|
|
|
|
// Scrolling and dynamic state
|
|
int mFastScrollRectCurrentY; // current top of fastscroll rect relative to list top
|
|
int mFastScrollRectCurrentH; // current height of fastscroll rect
|
|
int mFastScrollRectTouchY; // offset from top of fastscroll rect where the user initially touched
|
|
bool hasScroll; // indicates that we have enough items in the list to scroll
|
|
int firstDisplayedItem; // this item goes at the top of the display list - may only be partially visible
|
|
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
|
|
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
|
|
bool allowSelection; // true if touched item can be selected, false for pure read-only lists and the console
|
|
size_t selectedItem; // selected item index after the initial touch, set to -1 if we are scrolling
|
|
int touchDebounce; // debounce for touches, minimum of 6 pixels but may be larger calculated based actualItemHeight / 3
|
|
int lastY, last2Y; // last 2 touch locations, used for tracking kinetic scroll speed
|
|
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
|
|
int mUpdate; // indicates that a change took place and we need to re-render
|
|
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);
|
|
};
|
|
|
|
class GUIFileSelector : public GUIScrollList
|
|
{
|
|
public:
|
|
GUIFileSelector(xml_node<>* node);
|
|
virtual ~GUIFileSelector();
|
|
|
|
public:
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update(void);
|
|
|
|
// NotifyVarChange - Notify of a variable change
|
|
virtual int NotifyVarChange(const std::string& varName, const std::string& value);
|
|
|
|
// SetPageFocus - Notify when a page gains or loses focus
|
|
virtual void SetPageFocus(int inFocus);
|
|
|
|
virtual size_t GetItemCount();
|
|
virtual void RenderItem(size_t itemindex, int yPos, bool selected);
|
|
virtual void NotifySelect(size_t item_selected);
|
|
|
|
protected:
|
|
struct FileData {
|
|
std::string fileName;
|
|
unsigned char fileType; // Uses d_type format from struct dirent
|
|
mode_t protection; // Uses mode_t format from stat
|
|
uid_t userId;
|
|
gid_t groupId;
|
|
off_t fileSize;
|
|
time_t lastAccess; // Uses time_t format from stat
|
|
time_t lastModified; // Uses time_t format from stat
|
|
time_t lastStatChange; // Uses time_t format from stat
|
|
};
|
|
|
|
protected:
|
|
virtual int GetFileList(const std::string folder);
|
|
static bool fileSort(FileData d1, FileData d2);
|
|
|
|
protected:
|
|
std::vector<FileData> mFolderList;
|
|
std::vector<FileData> mFileList;
|
|
std::string mPathVar; // current path displayed, saved in the data manager
|
|
std::string mPathDefault; // default value for the path if none is set in mPathVar
|
|
std::string mExtn; // used for filtering the file list, for example, *.zip
|
|
std::string mPrfx; // used for filtering the file list, for example, Magisk-
|
|
std::string mVariable; // set when the user selects an item, pull path like /path/to/foo
|
|
std::string mSortVariable; // data manager variable used to change the sorting of files
|
|
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
|
|
int mShowFolders, mShowFiles; // indicates if the list should show folders and/or files
|
|
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)
|
|
static int mSortOrder; // must be static because it is used by the static function fileSort
|
|
ImageResource* mFolderIcon;
|
|
ImageResource* mFileIcon;
|
|
bool updateFileList;
|
|
};
|
|
|
|
class GUIListBox : public GUIScrollList
|
|
{
|
|
public:
|
|
GUIListBox(xml_node<>* node);
|
|
virtual ~GUIListBox();
|
|
|
|
public:
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update(void);
|
|
|
|
// NotifyVarChange - Notify of a variable change
|
|
virtual int NotifyVarChange(const std::string& varName, const std::string& value);
|
|
|
|
// SetPageFocus - Notify when a page gains or loses focus
|
|
virtual void SetPageFocus(int inFocus);
|
|
|
|
virtual size_t GetItemCount();
|
|
virtual void RenderItem(size_t itemindex, int yPos, bool selected);
|
|
virtual void NotifySelect(size_t item_selected);
|
|
|
|
protected:
|
|
struct ListItem {
|
|
std::string displayName;
|
|
std::string variableName;
|
|
std::string variableValue;
|
|
unsigned int selected;
|
|
GUIAction* action;
|
|
std::vector<Condition> mConditions;
|
|
};
|
|
|
|
protected:
|
|
std::vector<ListItem> mListItems;
|
|
std::vector<size_t> mVisibleItems; // contains indexes in mListItems of visible items only
|
|
std::string mVariable;
|
|
std::string currentValue;
|
|
ImageResource* mIconSelected;
|
|
ImageResource* mIconUnselected;
|
|
bool isCheckList;
|
|
bool isTextParsed;
|
|
};
|
|
|
|
class GUIPartitionList : public GUIScrollList
|
|
{
|
|
public:
|
|
GUIPartitionList(xml_node<>* node);
|
|
virtual ~GUIPartitionList();
|
|
|
|
public:
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update();
|
|
|
|
// NotifyVarChange - Notify of a variable change
|
|
virtual int NotifyVarChange(const std::string& varName, const std::string& value);
|
|
|
|
// SetPageFocus - Notify when a page gains or loses focus
|
|
virtual void SetPageFocus(int inFocus);
|
|
|
|
virtual size_t GetItemCount();
|
|
virtual void RenderItem(size_t itemindex, int yPos, bool selected);
|
|
virtual void NotifySelect(size_t item_selected);
|
|
|
|
protected:
|
|
void MatchList();
|
|
void SetPosition();
|
|
|
|
protected:
|
|
std::vector<PartitionList> mList;
|
|
std::string ListType;
|
|
std::string mVariable;
|
|
std::string selectedList;
|
|
std::string currentValue;
|
|
std::string mLastValue;
|
|
ImageResource* mIconSelected;
|
|
ImageResource* mIconUnselected;
|
|
bool updateList;
|
|
};
|
|
|
|
class GUITextBox : public GUIScrollList
|
|
{
|
|
public:
|
|
GUITextBox(xml_node<>* node);
|
|
|
|
public:
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update(void);
|
|
|
|
// NotifyVarChange - Notify of a variable change
|
|
virtual int NotifyVarChange(const std::string& varName, const std::string& value);
|
|
|
|
// ScrollList interface
|
|
virtual size_t GetItemCount();
|
|
virtual void RenderItem(size_t itemindex, int yPos, bool selected);
|
|
virtual void NotifySelect(size_t item_selected);
|
|
protected:
|
|
|
|
size_t mLastCount;
|
|
bool mIsStatic;
|
|
std::vector<std::string> mLastValue; // Parsed text - parsed for variables but not word wrapped
|
|
std::vector<std::string> mText; // Original text - not parsed for variables and not word wrapped
|
|
std::vector<std::string> rText; // Rendered text - what we actually see
|
|
|
|
};
|
|
|
|
class GUIConsole : public GUIScrollList
|
|
{
|
|
public:
|
|
GUIConsole(xml_node<>* node);
|
|
|
|
public:
|
|
// Render - Render the full object to the GL surface
|
|
// Return 0 on success, <0 on error
|
|
virtual int Render(void);
|
|
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update(void);
|
|
|
|
// IsInRegion - Checks if the request is handled by this object
|
|
// Return 1 if this object handles the request, 0 if not
|
|
virtual int IsInRegion(int x, int y);
|
|
|
|
// NotifyTouch - Notify of a touch event
|
|
// Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
|
|
virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
|
|
|
|
// ScrollList interface
|
|
virtual size_t GetItemCount();
|
|
virtual void RenderItem(size_t itemindex, int yPos, bool selected);
|
|
virtual void NotifySelect(size_t item_selected);
|
|
|
|
static void Translate_Now();
|
|
static void Clear_For_Retranslation();
|
|
protected:
|
|
enum SlideoutState
|
|
{
|
|
hidden = 0,
|
|
visible,
|
|
request_hide,
|
|
request_show
|
|
};
|
|
|
|
ImageResource* mSlideoutImage;
|
|
size_t mLastCount; // lines from gConsole that are already split and copied into rConsole
|
|
bool scrollToEnd; // true if we want to keep tracking the last line
|
|
int mSlideoutX, mSlideoutY, mSlideoutW, mSlideoutH;
|
|
int mSlideout;
|
|
SlideoutState mSlideoutState;
|
|
std::vector<std::string> rConsole;
|
|
std::vector<std::string> rConsoleColor;
|
|
|
|
protected:
|
|
int RenderSlideout(void);
|
|
int RenderConsole(void);
|
|
};
|
|
|
|
class TerminalEngine;
|
|
class GUITerminal : public GUIScrollList, public InputObject
|
|
{
|
|
public:
|
|
GUITerminal(xml_node<>* node);
|
|
|
|
public:
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update(void);
|
|
|
|
// NotifyTouch - Notify of a touch event
|
|
// Return 0 on success, >0 to ignore remainder of touch, and <0 on error (Return error to allow other handlers)
|
|
virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
|
|
|
|
// NotifyKey - Notify of a key press
|
|
// Return 0 on success (and consume key), >0 to pass key to next handler, and <0 on error
|
|
virtual int NotifyKey(int key, bool down);
|
|
|
|
// character input
|
|
virtual int NotifyCharInput(int ch);
|
|
|
|
// SetPageFocus - Notify when a page gains or loses focus
|
|
virtual void SetPageFocus(int inFocus);
|
|
|
|
// ScrollList interface
|
|
virtual size_t GetItemCount();
|
|
virtual void RenderItem(size_t itemindex, int yPos, bool selected);
|
|
virtual void NotifySelect(size_t item_selected);
|
|
bool status();
|
|
void stop();
|
|
protected:
|
|
void InitAndResize();
|
|
|
|
TerminalEngine* engine; // non-visual parts of the terminal (text buffer etc.), not owned
|
|
int updateCounter; // to track if anything changed in the back-end
|
|
bool lastCondition; // to track if the condition became true and we might need to resize the terminal engine
|
|
};
|
|
|
|
// GUIAnimation - Used for animations
|
|
class GUIAnimation : public GUIObject, public RenderObject
|
|
{
|
|
public:
|
|
GUIAnimation(xml_node<>* node);
|
|
|
|
public:
|
|
// Render - Render the full object to the GL surface
|
|
// Return 0 on success, <0 on error
|
|
virtual int Render(void);
|
|
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update(void);
|
|
|
|
protected:
|
|
AnimationResource* mAnimation;
|
|
int mFrame;
|
|
int mFPS;
|
|
int mLoop;
|
|
int mRender;
|
|
int mUpdateCount;
|
|
};
|
|
|
|
class GUIProgressBar : public GUIObject, public RenderObject, public ActionObject
|
|
{
|
|
public:
|
|
GUIProgressBar(xml_node<>* node);
|
|
|
|
public:
|
|
// Render - Render the full object to the GL surface
|
|
// Return 0 on success, <0 on error
|
|
virtual int Render(void);
|
|
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update(void);
|
|
|
|
// NotifyVarChange - Notify of a variable change
|
|
// Returns 0 on success, <0 on error
|
|
virtual int NotifyVarChange(const std::string& varName, const std::string& value);
|
|
|
|
protected:
|
|
ImageResource* mEmptyBar;
|
|
ImageResource* mFullBar;
|
|
std::string mMinValVar;
|
|
std::string mMaxValVar;
|
|
std::string mCurValVar;
|
|
float mSlide;
|
|
float mSlideInc;
|
|
int mSlideFrames;
|
|
int mLastPos;
|
|
|
|
protected:
|
|
virtual int RenderInternal(void); // Does the actual render
|
|
};
|
|
|
|
class GUISlider : public GUIObject, public RenderObject, public ActionObject
|
|
{
|
|
public:
|
|
GUISlider(xml_node<>* node);
|
|
virtual ~GUISlider();
|
|
|
|
public:
|
|
// Render - Render the full object to the GL surface
|
|
// Return 0 on success, <0 on error
|
|
virtual int Render(void);
|
|
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update(void);
|
|
|
|
// NotifyTouch - Notify of a touch event
|
|
// Return 0 on success, >0 to ignore remainder of touch, and <0 on error
|
|
virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
|
|
|
|
protected:
|
|
GUIAction* sAction;
|
|
GUIText* sSliderLabel;
|
|
ImageResource* sSlider;
|
|
ImageResource* sSliderUsed;
|
|
ImageResource* sTouch;
|
|
int sTouchW, sTouchH;
|
|
int sCurTouchX;
|
|
int sUpdate;
|
|
};
|
|
|
|
// these are ASCII codes reported via NotifyCharInput
|
|
// other special keys (arrows etc.) are reported via NotifyKey
|
|
#define KEYBOARD_ACTION 13 // CR
|
|
#define KEYBOARD_BACKSPACE 8 // Backspace
|
|
#define KEYBOARD_TAB 9 // Tab
|
|
#define KEYBOARD_SWIPE_LEFT 21 // Ctrl+U to delete line, same as in readline (used by shell etc.)
|
|
#define KEYBOARD_SWIPE_RIGHT 11 // Ctrl+K, same as in readline
|
|
|
|
class GUIKeyboard : public GUIObject, public RenderObject, public ActionObject
|
|
{
|
|
public:
|
|
GUIKeyboard(xml_node<>* node);
|
|
virtual ~GUIKeyboard();
|
|
|
|
public:
|
|
virtual int Render(void);
|
|
virtual int Update(void);
|
|
virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
|
|
virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
|
|
virtual void SetPageFocus(int inFocus);
|
|
|
|
protected:
|
|
struct Key
|
|
{
|
|
int key; // positive: ASCII/Unicode code; negative: Linux key code (KEY_*)
|
|
int longpresskey;
|
|
int end_x;
|
|
int layout;
|
|
};
|
|
int ParseKey(const char* keyinfo, Key& key, int& Xindex, int keyWidth, bool longpress);
|
|
void LoadKeyLabels(xml_node<>* parent, int layout);
|
|
void DrawKey(Key& key, int keyX, int keyY, int keyW, int keyH);
|
|
int KeyCharToCtrlChar(int key);
|
|
|
|
enum {
|
|
MAX_KEYBOARD_LAYOUTS = 5,
|
|
MAX_KEYBOARD_ROWS = 9,
|
|
MAX_KEYBOARD_KEYS = 20
|
|
};
|
|
struct Layout
|
|
{
|
|
ImageResource* keyboardImg;
|
|
Key keys[MAX_KEYBOARD_ROWS][MAX_KEYBOARD_KEYS];
|
|
int row_end_y[MAX_KEYBOARD_ROWS];
|
|
bool is_caps;
|
|
int revert_layout;
|
|
};
|
|
Layout layouts[MAX_KEYBOARD_LAYOUTS];
|
|
|
|
struct KeyLabel
|
|
{
|
|
int key; // same as in struct Key
|
|
int layout_from; // 1-based; 0 for labels that apply to all layouts
|
|
int layout_to; // same as Key.layout
|
|
string text; // key label text
|
|
ImageResource* image; // image (overrides text if defined)
|
|
};
|
|
std::vector<KeyLabel> mKeyLabels;
|
|
|
|
// Find key at screen coordinates
|
|
Key* HitTestKey(int x, int y);
|
|
|
|
bool mRendered;
|
|
std::string mVariable;
|
|
int currentLayout;
|
|
bool CapsLockOn;
|
|
static bool CtrlActive; // all keyboards share a common Control key state so that the Control key can be on a separate keyboard instance
|
|
int highlightRenderCount;
|
|
Key* currentKey;
|
|
bool hasHighlight, hasCapsHighlight, hasCtrlHighlight;
|
|
COLOR mHighlightColor;
|
|
COLOR mCapsHighlightColor;
|
|
COLOR mCtrlHighlightColor;
|
|
COLOR mFontColor; // for centered key labels
|
|
COLOR mFontColorSmall; // for centered key labels
|
|
FontResource* mFont; // for main key labels
|
|
FontResource* mSmallFont; // for key labels like "?123"
|
|
FontResource* mLongpressFont; // for the small longpress label in the upper right corner
|
|
int longpressOffsetX, longpressOffsetY; // distance of the longpress label from the key corner
|
|
COLOR mLongpressFontColor;
|
|
COLOR mBackgroundColor; // keyboard background color
|
|
COLOR mKeyColorAlphanumeric; // key background color
|
|
COLOR mKeyColorOther; // key background color
|
|
int mKeyMarginX, mKeyMarginY; // space around key boxes - applied to left/right and top/bottom
|
|
};
|
|
|
|
// GUIInput - Used for keyboard input
|
|
class GUIInput : public GUIObject, public RenderObject, public ActionObject, public InputObject
|
|
{
|
|
public:
|
|
GUIInput(xml_node<>* node);
|
|
virtual ~GUIInput();
|
|
|
|
public:
|
|
// Render - Render the full object to the GL surface
|
|
// Return 0 on success, <0 on error
|
|
virtual int Render(void);
|
|
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update(void);
|
|
|
|
// Notify of a variable change
|
|
virtual int NotifyVarChange(const std::string& varName, const std::string& value);
|
|
|
|
// NotifyTouch - Notify of a touch event
|
|
// Return 0 on success, >0 to ignore remainder of touch, and <0 on error
|
|
virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
|
|
|
|
virtual int NotifyKey(int key, bool down);
|
|
virtual int NotifyCharInput(int ch);
|
|
|
|
protected:
|
|
virtual int GetSelection(int x, int y);
|
|
|
|
// Handles displaying the text properly when chars are added, deleted, or for scrolling
|
|
void HandleTextLocation(int x);
|
|
void UpdateDisplayText();
|
|
void HandleCursorByTouch(int x);
|
|
void HandleCursorByText();
|
|
|
|
protected:
|
|
GUIText* mInputText;
|
|
GUIAction* mAction;
|
|
ImageResource* mBackground;
|
|
ImageResource* mCursor;
|
|
FontResource* mFont;
|
|
std::string mVariable;
|
|
std::string mMask;
|
|
std::string mValue;
|
|
std::string displayValue;
|
|
COLOR mBackgroundColor;
|
|
COLOR mCursorColor;
|
|
int scrollingX;
|
|
int cursorX; // actual x axis location of the cursor
|
|
int lastX;
|
|
int mCursorLocation;
|
|
int mBackgroundX, mBackgroundY, mBackgroundW, mBackgroundH;
|
|
int mFontY;
|
|
int textWidth;
|
|
unsigned mFontHeight;
|
|
unsigned CursorWidth;
|
|
bool mRendered;
|
|
bool HasMask;
|
|
bool DrawCursor;
|
|
bool isLocalChange;
|
|
bool HasAllowed;
|
|
bool HasDisabled;
|
|
std::string AllowedList;
|
|
std::string DisabledList;
|
|
unsigned MinLen;
|
|
unsigned MaxLen;
|
|
};
|
|
|
|
class HardwareKeyboard
|
|
{
|
|
public:
|
|
HardwareKeyboard();
|
|
virtual ~HardwareKeyboard();
|
|
|
|
public:
|
|
// called by the input handler for key events
|
|
int KeyDown(int key_code);
|
|
int KeyUp(int key_code);
|
|
|
|
// called by the input handler when holding a key down
|
|
int KeyRepeat();
|
|
|
|
// called by multi-key actions to suppress key-release notifications
|
|
void ConsumeKeyRelease(int key);
|
|
|
|
bool IsKeyDown(int key_code);
|
|
private:
|
|
int mLastKey;
|
|
int mLastKeyChar;
|
|
std::set<int> mPressedKeys;
|
|
};
|
|
|
|
class GUISliderValue: public GUIObject, public RenderObject, public ActionObject
|
|
{
|
|
public:
|
|
GUISliderValue(xml_node<>* node);
|
|
virtual ~GUISliderValue();
|
|
|
|
public:
|
|
// Render - Render the full object to the GL surface
|
|
// Return 0 on success, <0 on error
|
|
virtual int Render(void);
|
|
|
|
// Update - Update any UI component animations (called <= 30 FPS)
|
|
// Return 0 if nothing to update, 1 on success and contiue, >1 if full render required, and <0 on error
|
|
virtual int Update(void);
|
|
|
|
// SetPos - Update the position of the render object
|
|
// Return 0 on success, <0 on error
|
|
virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
|
|
|
|
// NotifyTouch - Notify of a touch event
|
|
// Return 0 on success, >0 to ignore remainder of touch, and <0 on error
|
|
virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
|
|
|
|
// Notify of a variable change
|
|
virtual int NotifyVarChange(const std::string& varName, const std::string& value);
|
|
|
|
// SetPageFocus - Notify when a page gains or loses focus
|
|
virtual void SetPageFocus(int inFocus);
|
|
|
|
protected:
|
|
int measureText(const std::string& str);
|
|
int valueFromPct(float pct);
|
|
float pctFromValue(int value);
|
|
void loadValue(bool force = false);
|
|
|
|
std::string mVariable;
|
|
int mMax;
|
|
int mMin;
|
|
int mValue;
|
|
char *mValueStr;
|
|
float mValuePct;
|
|
std::string mMaxStr;
|
|
std::string mMinStr;
|
|
FontResource *mFont;
|
|
GUIText* mLabel;
|
|
int mLabelW;
|
|
COLOR mTextColor;
|
|
COLOR mLineColor;
|
|
COLOR mSliderColor;
|
|
bool mShowRange;
|
|
bool mShowCurr;
|
|
int mLineX;
|
|
int mLineY;
|
|
int mLineH;
|
|
int mLinePadding;
|
|
int mPadding;
|
|
int mSliderY;
|
|
int mSliderW;
|
|
int mSliderH;
|
|
bool mRendered;
|
|
int mFontHeight;
|
|
GUIAction *mAction;
|
|
bool mChangeOnDrag;
|
|
int mLineW;
|
|
bool mDragging;
|
|
ImageResource *mBackgroundImage;
|
|
ImageResource *mHandleImage;
|
|
ImageResource *mHandleHoverImage;
|
|
};
|
|
|
|
class MouseCursor : public RenderObject
|
|
{
|
|
public:
|
|
MouseCursor(int posX, int posY);
|
|
virtual ~MouseCursor();
|
|
|
|
virtual int Render(void);
|
|
virtual int Update(void);
|
|
virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
|
|
|
|
void Move(int deltaX, int deltaY);
|
|
void GetPos(int& x, int& y);
|
|
void LoadData(xml_node<>* node);
|
|
void ResetData(int resX, int resY);
|
|
|
|
private:
|
|
int m_resX;
|
|
int m_resY;
|
|
bool m_moved;
|
|
float m_speedMultiplier;
|
|
COLOR m_color;
|
|
ImageResource *m_image;
|
|
bool m_present;
|
|
};
|
|
|
|
class GUIPatternPassword : public GUIObject, public RenderObject, public ActionObject
|
|
{
|
|
public:
|
|
GUIPatternPassword(xml_node<>* node);
|
|
virtual ~GUIPatternPassword();
|
|
|
|
public:
|
|
virtual int Render(void);
|
|
virtual int Update(void);
|
|
virtual int NotifyTouch(TOUCH_STATE state, int x, int y);
|
|
virtual int NotifyVarChange(const std::string& varName, const std::string& value);
|
|
virtual int SetRenderPos(int x, int y, int w = 0, int h = 0);
|
|
|
|
protected:
|
|
void CalculateDotPositions();
|
|
void ResetActiveDots();
|
|
void ConnectDot(int dot_idx);
|
|
void ConnectIntermediateDots(int dot_idx);
|
|
void Resize(size_t size);
|
|
int InDot(int x, int y);
|
|
bool DotUsed(int dot_idx);
|
|
std::string GeneratePassphrase();
|
|
void PatternDrawn();
|
|
|
|
struct Dot {
|
|
int x;
|
|
int y;
|
|
bool active;
|
|
};
|
|
|
|
std::string mSizeVar;
|
|
size_t mGridSize;
|
|
|
|
Dot* mDots;
|
|
int* mConnectedDots;
|
|
size_t mConnectedDotsLen;
|
|
int mCurLineX;
|
|
int mCurLineY;
|
|
bool mTrackingTouch;
|
|
bool mNeedRender;
|
|
|
|
COLOR mDotColor;
|
|
COLOR mActiveDotColor;
|
|
COLOR mLineColor;
|
|
ImageResource *mDotImage;
|
|
ImageResource *mActiveDotImage;
|
|
gr_surface mDotCircle;
|
|
gr_surface mActiveDotCircle;
|
|
int mDotRadius;
|
|
int mLineWidth;
|
|
|
|
std::string mPassVar;
|
|
GUIAction *mAction;
|
|
int mUpdate;
|
|
};
|
|
|
|
|
|
// Helper APIs
|
|
xml_node<>* FindNode(xml_node<>* parent, const char* nodename, int depth = 0);
|
|
std::string LoadAttrString(xml_node<>* element, const char* attrname, const char* defaultvalue = "");
|
|
int LoadAttrInt(xml_node<>* element, const char* attrname, int defaultvalue = 0);
|
|
int LoadAttrIntScaleX(xml_node<>* element, const char* attrname, int defaultvalue = 0);
|
|
int LoadAttrIntScaleY(xml_node<>* element, const char* attrname, int defaultvalue = 0);
|
|
COLOR LoadAttrColor(xml_node<>* element, const char* attrname, bool* found_color, COLOR defaultvalue = COLOR(0,0,0,0));
|
|
COLOR LoadAttrColor(xml_node<>* element, const char* attrname, COLOR defaultvalue = COLOR(0,0,0,0));
|
|
FontResource* LoadAttrFont(xml_node<>* element, const char* attrname);
|
|
ImageResource* LoadAttrImage(xml_node<>* element, const char* attrname);
|
|
AnimationResource* LoadAttrAnimation(xml_node<>* element, const char* attrname);
|
|
bool LoadPlacement(xml_node<>* node, int* x, int* y, int* w = NULL, int* h = NULL, Placement* placement = NULL);
|
|
|
|
#endif // _OBJECTS_HEADER
|