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 };