// Ryzom - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program 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 Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #ifndef RZ_GROUP_MENU_H #define RZ_GROUP_MENU_H #include "interface_group.h" #include "group_modal.h" #include "view_text.h" #include "ctrl_text_button.h" class CViewBitmap; class CGroupMenu; class CGroupList; class CCtrlScroll; /** * CViewTextMenu is an element of a sub menu * \author Matthieu 'TrapII' Besson * \author Nevrax France * \date 2002 */ class CViewTextMenu : public CViewText { public: CViewTextMenu(const TCtorParam ¶m) : CViewText(param) { _Grayed = false; _Checked = false; _Checkable = false; _CheckBox = NULL; Over = false; } bool getGrayed() const; void setGrayed (bool g); bool getChecked() const { return _Checked; } void setChecked(bool c); bool getCheckable() const { return _Checkable; } void setCheckable(bool c); void setCheckBox(CViewBitmap *checkBox) { _CheckBox = checkBox; } CViewBitmap * getCheckBox() const { return _CheckBox; } bool getFormatted () const { return getMultiLine (); } virtual sint32 getAlpha() const; virtual void setAlpha (sint32 a); REFLECT_EXPORT_START(CViewTextMenu, CViewText) REFLECT_BOOL("grayed", getGrayed, setGrayed); REFLECT_BOOL("checked", getChecked, setChecked); REFLECT_EXPORT_END public: bool Over; NLMISC::CRGBA OldColor; NLMISC::CRGBA OldShadowColor; NLMISC::CRGBA OldColorOver; NLMISC::CRGBA OldShadowColorOver; NLMISC::CRGBA OldColorGrayed; NLMISC::CRGBA OldShadowColorGrayed; private: CViewBitmap *_CheckBox; bool _Grayed; bool _Checked; bool _Checkable; }; /** * CGroupSubMenu describe an element of a contextual menu (contains text lines and sub menu) * \author Matthieu 'TrapII' Besson * \author Nevrax France * \date 2002 */ class CGroupSubMenu : public CGroupFrame { public: CGroupSubMenu(const TCtorParam ¶m); virtual ~CGroupSubMenu(); virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parent=NULL); virtual void checkCoords(); virtual void updateCoords (); virtual void draw (); virtual bool handleEvent (const CEventDescriptor &eventDesc); virtual CInterfaceElement* getElement (const std::string &id); // retrieve the index of a line from its id (-1 if not found) sint getLineFromId(const std::string &id); CViewTextMenu* addLine (const ucstring &name, const std::string &ah, const std::string ¶ms, const std::string &id="", const std::string &cond = std::string(), const std::string &texture="", bool checkable = false, bool checked = false, bool formatted = false ); CViewTextMenu* addLineAtIndex(uint index, const ucstring &name, const std::string &ah, const std::string ¶ms, const std::string &id="", const std::string &cond = std::string(), const std::string &texture="", bool checkable = false, bool checked = false, bool formatted = false ); void addSeparator(const std::string &id = ""); void addSeparatorAtIndex(uint index, const std::string &id = ""); uint getNumLine() const { return (uint)_Lines.size(); } void removeLine(uint index); const std::string getActionHandler(uint lineIndex) const; const std::string getActionHandlerParam(uint lineIndex) const; void openSubMenu (sint32 nb); void hideSubMenus (); // reset all entries of the sub menu void reset(); virtual void setActive (bool state); // Tell if the line is a separator or not bool isSeparator (uint i) const; /** Set a user defined group at the given line * 'ownership' tells whether this menu should remove the group when it is deleted * Setting a user group on a line with a separator is illegal */ void setUserGroupRight(uint line, CInterfaceGroup *group, bool ownership); CInterfaceGroup *getUserGroupRight(uint line) const; // void setUserGroupLeft(uint line, CInterfaceGroup *group, bool ownership); CInterfaceGroup *getUserGroupLeft(uint line) const; void removeAllUserGroups(); uint getNumLines() const { return (uint)_Lines.size(); } // return pointer to submenu or NULL if there's none CGroupSubMenu *getSubMenu(uint index) const; void setSubMenu(uint index, CGroupSubMenu *sub); // if a menu isn't selectable, can't click on it, and there's no selection when the mouse is over it (but can click on its widgets, such as a usergroup) void setSelectable(uint lineIndex, bool selectable); bool getSelectable(uint lineIndex) const; // Gray a line. void setGrayedLine(uint line, bool g); // Hide a line. void setHiddenLine(uint line, bool h); // Max Visible Line (-1 == no limit) void setMaxVisibleLine(sint32 mvl); sint32 getMaxVisibleLine() { return _MaxVisibleLine; } // Get the Line Id (not the full Id) const std::string &getLineId(uint index); int luaGetNumLine(CLuaState &ls); int luaGetSubMenu(CLuaState &ls); int luaAddSubMenu(CLuaState &ls); int luaGetLineId(CLuaState &ls); int luaGetLineFromId(CLuaState &ls); int luaIsSeparator(CLuaState &ls); int luaAddLine(CLuaState &ls); int luaAddLineAtIndex(CLuaState &ls); int luaAddSeparator(CLuaState &ls); int luaAddSeparatorAtIndex(CLuaState &ls); int luaRemoveLine(CLuaState &ls); int luaSetUserGroupRight(CLuaState &ls); int luaGetUserGroupRight(CLuaState &ls); int luaSetUserGroupLeft(CLuaState &ls); int luaGetUserGroupLeft(CLuaState &ls); int luaReset(CLuaState &ls); int luaSetMaxVisibleLine(CLuaState &ls); // REFLECT_EXPORT_START(CGroupSubMenu, CGroupFrame) REFLECT_LUA_METHOD("getNumLine", luaGetNumLine); REFLECT_LUA_METHOD("getLineId", luaGetLineId); // return the id of a line from its index REFLECT_LUA_METHOD("getLineFromId", luaGetLineFromId); // return -1 if line with id is not found REFLECT_LUA_METHOD("getSubMenu", luaGetSubMenu); REFLECT_LUA_METHOD("addSubMenu", luaAddSubMenu); REFLECT_LUA_METHOD("isSeparator", luaIsSeparator); REFLECT_LUA_METHOD("addLine", luaAddLine); // name, ah, ah_params, id REFLECT_LUA_METHOD("addLineAtIndex", luaAddLineAtIndex); // index, name, ah, ah_params, id REFLECT_LUA_METHOD("addSeparator", luaAddSeparator); REFLECT_LUA_METHOD("addSeparatorAtIndex", luaAddSeparatorAtIndex); REFLECT_LUA_METHOD("removeLine", luaRemoveLine); REFLECT_LUA_METHOD("reset", luaReset); REFLECT_LUA_METHOD("setUserGroupRight", luaSetUserGroupRight); // line, group ptr REFLECT_LUA_METHOD("getUserGroupRight", luaGetUserGroupRight); // line REFLECT_LUA_METHOD("setUserGroupLeft", luaSetUserGroupLeft); // line, group ptr REFLECT_LUA_METHOD("getUserGroupLeft", luaGetUserGroupLeft);// line REFLECT_LUA_METHOD("setMaxVisibleLine", luaSetMaxVisibleLine); REFLECT_EXPORT_END protected: struct SSubMenuEntry { CViewTextMenu *ViewText; // Backup of the children that are in grouplist CInterfaceGroup *Separator; std::string AHName; std::string AHParams; std::string Id; std::string Cond; // condition to know if the entry is grayed CViewBitmap *CheckBox; CViewBitmap *RightArrow; CInterfaceGroup *UserGroupRight; // not for separator, inserted before checkbox & submenu arrow CInterfaceGroup *UserGroupLeft; bool UserGroupRightOwnership; bool UserGroupLeftOwnership; bool Selectable; sint32 HReal; // max H of the view text and the other user group sint32 TextDY; // Y of the view text to set SSubMenuEntry() { ViewText = NULL; Separator = NULL; CheckBox = NULL; RightArrow = NULL; UserGroupRight = NULL; UserGroupLeft = NULL; UserGroupRightOwnership = false; Selectable = true; HReal= 0; TextDY= 0; } }; protected: CGroupList *_GroupList; CCtrlScroll *_ScrollBar; CViewBitmap *_SelectionView; std::vector _Lines; std::vector _SubMenus; CGroupMenu *_GroupMenu; // Master parent sint32 _Selected; sint32 _MaxVisibleLine; // -1 == no limit friend class CGroupMenu; private: /** Clone this menu, and set its new father * If appendToMenu is NULL, the menu is just copied * otherwise, no copy is made, but this menu entries are appended to the already created 'appendMenu' menu. * NB : user groups are not duplicated */ CGroupSubMenu *cloneMenu(CGroupSubMenu *appendToMenu, CGroupMenu *newFather, CInterfaceGroup *initGroup = NULL) const; void initOptions(CInterfaceGroup *parent); CViewBitmap *createCheckBox(bool checked); CViewBitmap *createRightArrow(CInterfaceElement *parentPos, bool center); }; /** * class describing a menu composed of one or more CGroupListSubMenu * \author Matthieu 'TrapII' Besson * \author Nevrax France * \date 2002 */ class CGroupMenu : public CGroupModal { public: CGroupMenu(const TCtorParam ¶m); virtual ~CGroupMenu(); TCaseMode getCaseMode() { return _CaseMode; } virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup); virtual void draw (); void recurseDraw(CGroupSubMenu *pSubMenu); virtual bool handleEvent (const CEventDescriptor &eventDesc); virtual CInterfaceElement* getElement (const std::string &id); virtual void setActive (bool state); virtual bool isWindowUnder (sint32 x, sint32 y); // add line with a string, for backward compatibility void addLine (const std::string &name, const std::string &ah, const std::string ¶ms, const std::string &id = std::string(), const std::string &cond = std::string(), const std::string &texture="", bool checkable = false, bool checked = false); uint getNumLine() const; void deleteLine(uint index); const std::string getActionHandler(uint lineIndex) const; const std::string getActionHandlerParam(uint lineIndex) const; void addLine (const ucstring &name, const std::string &ah = "", const std::string ¶ms = "", const std::string &id = std::string(), const std::string &cond = std::string(), const std::string &texture="", bool checkable = false, bool checked = false ); void addLineAtIndex (uint index, const ucstring &name, const std::string &ah = "", const std::string ¶ms = "", const std::string &id = std::string(), const std::string &cond = std::string(), const std::string &texture="", bool checkable = false, bool checked = false ); void setUserGroupRight(uint line, CInterfaceGroup *gr, bool ownerShip = true); void setUserGroupLeft(uint line, CInterfaceGroup *gr, bool ownerShip = true); // clear all sub menus void reset (); // set the minW of the RootMenu. void setMinW(sint32 minW); // Gray a line on the RootMenu void setGrayedLine(uint line, bool g); CGroupSubMenu *getRootMenu() const { return _RootMenu; } // Max Visible Line (-1 == no limit) void setMaxVisibleLine(sint32 mvl) { _RootMenu->setMaxVisibleLine(mvl); } sint32 getMaxVisibleLine() { return _RootMenu->getMaxVisibleLine(); } // special for menu launched from a modal.... bool getCloseSubMenuUsingPopModal() const {return _CloseSubMenuUsingPopModal;} void setCloseSubMenuUsingPopModal(bool state) {_CloseSubMenuUsingPopModal= state;} int luaGetRootMenu(CLuaState &ls); int luaSetMinW(CLuaState &ls); REFLECT_EXPORT_START(CGroupMenu, CGroupModal) REFLECT_LUA_METHOD("getRootMenu", luaGetRootMenu); REFLECT_LUA_METHOD("setMinW", luaSetMinW); REFLECT_EXPORT_END protected: TCaseMode _CaseMode; CGroupSubMenu *_RootMenu; // Text lookup NLMISC::CRGBA _Color; NLMISC::CRGBA _ShadowColor; bool _CloseSubMenuUsingPopModal; bool _Shadow; bool _Formatted; uint8 _Space; sint32 _FontSize; NLMISC::CRGBA _ColorOver; // Color of the text when the mouse is over it NLMISC::CRGBA _ShadowColorOver; // Color of the shadow when the mouse is over it NLMISC::CRGBA _HighLightOver; // Background color of the selection NLMISC::CRGBA _ColorGrayed; // Color of the text when it is unusable NLMISC::CRGBA _ShadowColorGrayed; // Color of the shadow when it is unusable friend class CGroupSubMenu; }; #endif // RZ_GROUP_MENU_H /* End of group_menu.h */