dvander@769: /** dvander@769: * vim: set ts=4 : dvander@769: * =============================================================== dvander@769: * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. dvander@769: * =============================================================== dvander@769: * dvander@769: * This file is not open source and may not be copied without explicit dvander@769: * written permission of AlliedModders LLC. This file may not be redistributed dvander@769: * in whole or significant part. dvander@769: * For information, see LICENSE.txt or http://www.sourcemod.net/license.php dvander@769: * dvander@769: * Version: $Id$ dvander@769: */ dvander@769: dvander@769: #ifndef _INCLUDE_SOURCEMOD_MENUMANAGER_H_ dvander@769: #define _INCLUDE_SOURCEMOD_MENUMANAGER_H_ dvander@769: dvander@769: #include dvander@769: #include dvander@769: #include dvander@769: #include dvander@769: #include "sm_memtable.h" dvander@769: #include "sm_globals.h" dvander@769: dvander@769: using namespace SourceMod; dvander@769: using namespace SourceHook; dvander@769: dvander@769: class BroadcastHandler : public IMenuHandler dvander@769: { dvander@769: public: dvander@769: BroadcastHandler(IMenuHandler *handler); dvander@769: public: //IMenuHandler dvander@787: void OnMenuDisplay(IBaseMenu *menu, int client, IMenuPanel *display); dvander@769: void OnMenuSelect(IBaseMenu *menu, int client, unsigned int item); dvander@769: void OnMenuEnd(IBaseMenu *menu); dvander@769: void OnMenuCancel(IBaseMenu *menu, int client, MenuCancelReason reason); dvander@769: unsigned int GetMenuAPIVersion2(); dvander@769: public: dvander@769: virtual void OnBroadcastEnd(IBaseMenu *menu); dvander@769: public: dvander@769: IMenuHandler *m_pHandler; dvander@769: unsigned int numClients; dvander@769: }; dvander@769: dvander@769: class VoteHandler : public BroadcastHandler dvander@769: { dvander@769: public: dvander@769: VoteHandler(IMenuVoteHandler *handler); dvander@769: public: dvander@769: void Initialize(IBaseMenu *menu); dvander@769: void OnMenuSelect(IBaseMenu *menu, int client, unsigned int item); dvander@769: void OnBroadcastEnd(IBaseMenu *menu); dvander@769: private: dvander@769: CVector m_counts; dvander@769: CVector m_ties; dvander@769: unsigned int numItems; dvander@769: IMenuVoteHandler *m_pVoteHandler; dvander@769: }; dvander@769: dvander@769: class MenuManager : dvander@769: public IMenuManager, dvander@790: public SMGlobalClass, dvander@790: public IHandleTypeDispatch dvander@769: { dvander@769: friend class BroadcastHandler; dvander@769: friend class VoteHandler; dvander@790: friend class CBaseMenu; dvander@790: friend class BaseMenuStyle; dvander@769: public: dvander@769: MenuManager(); dvander@769: public: //SMGlobalClass dvander@769: void OnSourceModAllInitialized(); dvander@769: void OnSourceModAllShutdown(); dvander@769: public: //IMenuManager dvander@769: virtual const char *GetInterfaceName() dvander@769: { dvander@769: return SMINTERFACE_MENUMANAGER_NAME; dvander@769: } dvander@769: virtual unsigned int GetInterfaceVersion() dvander@769: { dvander@769: return SMINTERFACE_MENUMANAGER_VERSION; dvander@769: } dvander@769: public: dvander@769: unsigned int GetStyleCount(); dvander@769: IMenuStyle *GetStyle(unsigned int index); dvander@769: IMenuStyle *FindStyleByName(const char *name); dvander@769: unsigned int BroadcastMenu(IBaseMenu *menu, dvander@769: IMenuHandler *handler, dvander@769: int clients[], dvander@769: unsigned int numClients, dvander@769: unsigned int time); dvander@769: unsigned int VoteMenu(IBaseMenu *menu, dvander@769: IMenuVoteHandler *handler, dvander@769: int clients[], dvander@769: unsigned int numClients, dvander@769: unsigned int time); dvander@769: IMenuStyle *GetDefaultStyle(); dvander@780: void AddStyle(IMenuStyle *style); dvander@769: bool SetDefaultStyle(IMenuStyle *style); dvander@787: IMenuPanel *RenderMenu(int client, menu_states_t &states, ItemOrder order); dvander@790: public: //IHandleTypeDispatch dvander@790: void OnHandleDestroy(HandleType_t type, void *object); dvander@790: public: dvander@790: HandleError ReadMenuHandle(Handle_t handle, IBaseMenu **menu); dvander@790: HandleError ReadStyleHandle(Handle_t handle, IMenuStyle **style); dvander@769: protected: dvander@769: void FreeBroadcastHandler(BroadcastHandler *bh); dvander@769: void FreeVoteHandler(VoteHandler *vh); dvander@790: Handle_t CreateMenuHandle(IBaseMenu *menu, IdentityToken_t *pOwner); dvander@790: Handle_t CreateStyleHandle(IMenuStyle *style); dvander@769: private: dvander@769: int m_ShowMenu; dvander@769: IMenuStyle *m_pDefaultStyle; dvander@769: CStack m_BroadcastHandlers; dvander@769: CStack m_VoteHandlers; dvander@769: CVector m_Styles; dvander@790: HandleType_t m_StyleType; dvander@790: HandleType_t m_MenuType; dvander@769: }; dvander@769: dvander@769: extern MenuManager g_Menus; dvander@769: dvander@769: #endif //_INCLUDE_SOURCEMOD_MENUMANAGER_H_