// pages.hpp - Base classes for page manager of GUI #ifndef _PAGES_HEADER_HPP #define _PAGES_HEADER_HPP #include "../minzip/Zip.h" #include #include #include "rapidxml.hpp" using namespace rapidxml; enum TOUCH_STATE { TOUCH_START = 0, TOUCH_DRAG = 1, TOUCH_RELEASE = 2, TOUCH_HOLD = 3, TOUCH_REPEAT = 4 }; struct COLOR { unsigned char red; unsigned char green; unsigned char blue; unsigned char alpha; COLOR() : red(0), green(0), blue(0), alpha(0) {} COLOR(unsigned char r, unsigned char g, unsigned char b, unsigned char a = 255) : red(r), green(g), blue(b), alpha(a) {} }; // Utility Functions int ConvertStrToColor(std::string str, COLOR* color); int gui_forceRender(void); int gui_changePage(std::string newPage); int gui_changeOverlay(std::string newPage); std::string gui_parse_text(string inText); class Resource; class ResourceManager; class RenderObject; class ActionObject; class InputObject; class MouseCursor; class GUIObject; class HardwareKeyboard; class Page { public: Page(xml_node<>* page, std::vector*> *templates = NULL); virtual ~Page(); std::string GetName(void) { return mName; } public: virtual int Render(void); virtual int Update(void); virtual int NotifyTouch(TOUCH_STATE state, int x, int y); virtual int NotifyKey(int key, bool down); virtual int NotifyKeyboard(int key); virtual int SetKeyBoardFocus(int inFocus); virtual int NotifyVarChange(std::string varName, std::string value); virtual void SetPageFocus(int inFocus); protected: std::string mName; std::vector mObjects; std::vector mRenders; std::vector mActions; std::vector mInputs; ActionObject* mTouchStart; COLOR mBackground; protected: bool ProcessNode(xml_node<>* page, std::vector*> *templates = NULL, int depth = 0); }; class PageSet { public: PageSet(char* xmlFile); virtual ~PageSet(); public: int Load(ZipArchive* package); int CheckInclude(ZipArchive* package, xml_document<> *parentDoc); Page* FindPage(std::string name); int SetPage(std::string page); int SetOverlay(Page* page); const ResourceManager* GetResources(); // Helper routine for identifing if we're the current page int IsCurrentPage(Page* page); // These are routing routines int Render(void); int Update(void); int NotifyTouch(TOUCH_STATE state, int x, int y); int NotifyKey(int key, bool down); int NotifyKeyboard(int key); int SetKeyBoardFocus(int inFocus); int NotifyVarChange(std::string varName, std::string value); std::vector*> styles; protected: int LoadPages(xml_node<>* pages); int LoadVariables(xml_node<>* vars); protected: char* mXmlFile; xml_document<> mDoc; ResourceManager* mResources; std::vector mPages; std::vector*> templates; Page* mCurrentPage; std::vector mOverlays; // Special case for popup dialogs and the lock screen std::vector*> mIncludedDocs; }; class PageManager { public: // Used by GUI static int LoadPackage(std::string name, std::string package, std::string startpage); static PageSet* SelectPackage(std::string name); static int ReloadPackage(std::string name, std::string package); static void ReleasePackage(std::string name); // Used for actions and pages static int ChangePage(std::string name); static int ChangeOverlay(std::string name); static const ResourceManager* GetResources(); // Used for console-only mode static int SwitchToConsole(void); static int EndConsole(void); // Helper to identify if a particular page is the active page static int IsCurrentPage(Page* page); // These are routing routines static int Render(void); static int Update(void); static int NotifyTouch(TOUCH_STATE state, int x, int y); static int NotifyKey(int key, bool down); static int NotifyKeyboard(int key); static int SetKeyBoardFocus(int inFocus); static int NotifyVarChange(std::string varName, std::string value); static MouseCursor *GetMouseCursor(); static void LoadCursorData(xml_node<>* node); static HardwareKeyboard *GetHardwareKeyboard(); static xml_node<>* FindStyle(std::string name); protected: static PageSet* FindPackage(std::string name); protected: static std::map mPageSets; static PageSet* mCurrentSet; static PageSet* mBaseSet; static MouseCursor *mMouseCursor; static HardwareKeyboard *mHardwareKeyboard; }; #endif // _PAGES_HEADER_HPP