core/smn_menus.cpp
changeset 878 967a6613eb7e
parent 874 91a057a8c782
child 879 f1e33b35f3b6
     1.1 --- a/core/smn_menus.cpp	Tue Jun 05 16:27:45 2007 +0000
     1.2 +++ b/core/smn_menus.cpp	Tue Jun 05 16:44:19 2007 +0000
     1.3 @@ -38,6 +38,7 @@
     1.4  	MenuAction_Cancel = (1<<3),		/**< The menu was cancelled (param1=client, param2=item) */
     1.5  	MenuAction_End = (1<<4),		/**< A menu's display/selection cycle is complete (nothing passed). */
     1.6  	MenuAction_VoteEnd = (1<<5),	/**< (VOTE ONLY): A vote sequence has ended (param1=chosen item) */
     1.7 +	MenuAction_VoteStart = (1<<6), 	/**< (VOTE ONLY): A vote sequence has started */
     1.8  };
     1.9  
    1.10  class CPanelHandler : public IMenuHandler
    1.11 @@ -66,11 +67,15 @@
    1.12  	void OnMenuCancel(IBaseMenu *menu, int client, MenuCancelReason reason);
    1.13  	void OnMenuEnd(IBaseMenu *menu);
    1.14  	void OnMenuDestroy(IBaseMenu *menu);
    1.15 +	void OnMenuVoteStart(IBaseMenu *menu);
    1.16 +	void OnMenuVoteEnd(IBaseMenu *menu, unsigned int item);
    1.17  #if 0
    1.18  	void OnMenuDrawItem(IBaseMenu *menu, int client, unsigned int item, unsigned int &style);
    1.19  	void OnMenuDisplayItem(IBaseMenu *menu, int client, unsigned int item, const char **display);
    1.20  #endif
    1.21  private:
    1.22 +	void DoAction(IBaseMenu *menu, MenuAction action, cell_t param1, cell_t param2);
    1.23 +private:
    1.24  	IPluginFunction *m_pBasic;
    1.25  	int m_Flags;
    1.26  };
    1.27 @@ -232,11 +237,7 @@
    1.28  {
    1.29  	if ((m_Flags & (int)MenuAction_Start) == (int)MenuAction_Start)
    1.30  	{
    1.31 -		m_pBasic->PushCell(menu->GetHandle());
    1.32 -		m_pBasic->PushCell(MenuAction_Start);
    1.33 -		m_pBasic->PushCell(0);
    1.34 -		m_pBasic->PushCell(0);
    1.35 -		m_pBasic->Execute(NULL);
    1.36 +		DoAction(menu, MenuAction_Start, 0, 0);
    1.37  	}
    1.38  }
    1.39  
    1.40 @@ -254,11 +255,7 @@
    1.41  
    1.42  		Handle_t hndl =  g_HandleSys.CreateHandleEx(g_MenuHelpers.GetPanelType(), panel, &sec, &access, NULL);
    1.43  
    1.44 -		m_pBasic->PushCell(menu->GetHandle());
    1.45 -		m_pBasic->PushCell(MenuAction_Display);
    1.46 -		m_pBasic->PushCell(client);
    1.47 -		m_pBasic->PushCell(hndl);
    1.48 -		m_pBasic->Execute(NULL);
    1.49 +		DoAction(menu, MenuAction_Display, client, hndl);
    1.50  
    1.51  		g_HandleSys.FreeHandle(hndl, &sec);
    1.52  	}
    1.53 @@ -266,29 +263,17 @@
    1.54  
    1.55  void CMenuHandler::OnMenuSelect(IBaseMenu *menu, int client, unsigned int item)
    1.56  {
    1.57 -	m_pBasic->PushCell(menu->GetHandle());
    1.58 -	m_pBasic->PushCell(MenuAction_Select);
    1.59 -	m_pBasic->PushCell(client);
    1.60 -	m_pBasic->PushCell(item);
    1.61 -	m_pBasic->Execute(NULL);
    1.62 +	DoAction(menu, MenuAction_Select, client, item);
    1.63  }
    1.64  
    1.65  void CMenuHandler::OnMenuCancel(IBaseMenu *menu, int client, MenuCancelReason reason)
    1.66  {
    1.67 -	m_pBasic->PushCell(menu->GetHandle());
    1.68 -	m_pBasic->PushCell(MenuAction_Cancel);
    1.69 -	m_pBasic->PushCell(client);
    1.70 -	m_pBasic->PushCell(reason);
    1.71 -	m_pBasic->Execute(NULL);
    1.72 +	DoAction(menu, MenuAction_Cancel, client, (cell_t)reason);
    1.73  }
    1.74  
    1.75  void CMenuHandler::OnMenuEnd(IBaseMenu *menu)
    1.76  {
    1.77 -	m_pBasic->PushCell(menu->GetHandle());
    1.78 -	m_pBasic->PushCell(MenuAction_End);
    1.79 -	m_pBasic->PushCell(0);
    1.80 -	m_pBasic->PushCell(0);
    1.81 -	m_pBasic->Execute(NULL);
    1.82 +	DoAction(menu, MenuAction_End, 0, 0);
    1.83  }
    1.84  
    1.85  void CMenuHandler::OnMenuDestroy(IBaseMenu *menu)
    1.86 @@ -296,6 +281,25 @@
    1.87  	g_MenuHelpers.FreeMenuHandler(this);
    1.88  }
    1.89  
    1.90 +void CMenuHandler::OnMenuVoteStart(IBaseMenu *menu)
    1.91 +{
    1.92 +	DoAction(menu, MenuAction_VoteStart, 0, 0);
    1.93 +}
    1.94 +
    1.95 +void CMenuHandler::OnMenuVoteEnd(IBaseMenu *menu, unsigned int item)
    1.96 +{
    1.97 +	DoAction(menu, MenuAction_VoteEnd, item, 0);
    1.98 +}
    1.99 +
   1.100 +void CMenuHandler::DoAction(IBaseMenu *menu, MenuAction action, cell_t param1, cell_t param2)
   1.101 +{
   1.102 +	m_pBasic->PushCell(menu->GetHandle());
   1.103 +	m_pBasic->PushCell((cell_t)action);
   1.104 +	m_pBasic->PushCell(param1);
   1.105 +	m_pBasic->PushCell(param2);
   1.106 +	m_pBasic->Execute(NULL);
   1.107 +}
   1.108 +
   1.109  /**
   1.110   * INLINE FUNCTIONS FOR NATIVES
   1.111   */
   1.112 @@ -375,6 +379,23 @@
   1.113  	return menu->Display(params[2], params[3]) ? 1 : 0;
   1.114  }
   1.115  
   1.116 +static cell_t VoteMenu(IPluginContext *pContext, const cell_t *params)
   1.117 +{
   1.118 +	Handle_t hndl = (Handle_t)params[1];
   1.119 +	HandleError err;
   1.120 +	IBaseMenu *menu;
   1.121 +
   1.122 +	if ((err=g_Menus.ReadMenuHandle(params[1], &menu)) != HandleError_None)
   1.123 +	{
   1.124 +		return pContext->ThrowNativeError("Menu handle %x is invalid (error %d)", hndl, err);
   1.125 +	}
   1.126 +
   1.127 +	cell_t *addr;
   1.128 +	pContext->LocalToPhysAddr(params[2], &addr);
   1.129 +
   1.130 +	return menu->BroadcastVote(addr, params[3], params[4]);
   1.131 +}
   1.132 +
   1.133  static cell_t AddMenuItem(IPluginContext *pContext, const cell_t *params)
   1.134  {
   1.135  	Handle_t hndl = (Handle_t)params[1];
   1.136 @@ -930,5 +951,6 @@
   1.137  	{"SetPanelCurrentKey",		SetPanelCurrentKey},
   1.138  	{"SetPanelTitle",			SetPanelTitle},
   1.139  	{"SetPanelKeys",			SetPanelKeys},
   1.140 +	{"VoteMenu",				VoteMenu},
   1.141  	{NULL,						NULL},
   1.142  };