public/IMenuManager.h
author David Anderson <dvander@alliedmods.net>
Mon May 21 01:11:37 2007 +0000 (2007-05-21)
changeset 819 a2f2353049b9
parent 790 9b1474d03470
child 840 5b83f1924e94
permissions -rw-r--r--
added key selection setting
fixed amb309
dvander@768
     1
/**
dvander@768
     2
 * vim: set ts=4 :
dvander@768
     3
 * ===============================================================
dvander@768
     4
 * SourceMod, Copyright (C) 2004-2007 AlliedModders LLC. 
dvander@768
     5
 * All rights reserved.
dvander@768
     6
 * ===============================================================
dvander@768
     7
 *
dvander@768
     8
 *  This file is part of the SourceMod/SourcePawn SDK.  This file may only be 
dvander@768
     9
 * used or modified under the Terms and Conditions of its License Agreement, 
dvander@768
    10
 * which is found in public/licenses/LICENSE.txt.  As of this notice, derivative 
dvander@768
    11
 * works must be licensed under the GNU General Public License (version 2 or 
dvander@768
    12
 * greater).  A copy of the GPL is included under public/licenses/GPL.txt.
dvander@768
    13
 * 
dvander@768
    14
 * To view the latest information, see: http://www.sourcemod.net/license.php
dvander@768
    15
 *
dvander@768
    16
 * Version: $Id$
dvander@768
    17
 */
dvander@768
    18
dvander@768
    19
#ifndef _INCLUDE_SOURCEMOD_MENU_SYSTEM_H_
dvander@768
    20
#define _INCLUDE_SOURCEMOD_MENU_SYSTEM_H_
dvander@768
    21
dvander@768
    22
#include <IShareSys.h>
dvander@790
    23
#include <IHandleSys.h>
dvander@768
    24
dvander@768
    25
#define SMINTERFACE_MENUMANAGER_NAME		"IMenuManager"
dvander@768
    26
#define SMINTERFACE_MENUMANAGER_VERSION		1
dvander@768
    27
dvander@768
    28
/**
dvander@768
    29
 * @file IMenuManager.h
dvander@768
    30
 * @brief Abstracts on-screen menus for clients.
dvander@768
    31
 */
dvander@768
    32
dvander@768
    33
namespace SourceMod
dvander@768
    34
{
dvander@768
    35
	/**
dvander@768
    36
	 * @brief Used to determine how an item selection is interpreted.
dvander@768
    37
	 */
dvander@768
    38
	enum ItemSelection
dvander@768
    39
	{
dvander@768
    40
		ItemSel_None,					/**< Invalid selection */
dvander@768
    41
		ItemSel_Back,					/**< Go back one page */
dvander@768
    42
		ItemSel_Next,					/**< Go forward one page */
dvander@768
    43
		ItemSel_Exit,					/**< Menu was exited */
dvander@768
    44
		ItemSel_Item,					/**< Valid item selection */
dvander@768
    45
	};
dvander@768
    46
dvander@768
    47
	/**
dvander@768
    48
	 * @brief Used to determine which order to search for items in.
dvander@768
    49
	 */
dvander@768
    50
	enum ItemOrder
dvander@768
    51
	{
dvander@768
    52
		ItemOrder_Ascending,			/**< Items should be drawn ascendingly */
dvander@768
    53
		ItemOrder_Descending,			/**< Items should be drawn descendingly */
dvander@768
    54
	};
dvander@768
    55
dvander@768
    56
	/**
dvander@768
    57
	 * @brief Pairs an item type with an item menu position.
dvander@768
    58
	 */
dvander@768
    59
	struct menu_slots_t
dvander@768
    60
	{
dvander@768
    61
		ItemSelection type;				/**< Item selection type */
dvander@768
    62
		unsigned int item;				/**< Item position, if applicable */
dvander@768
    63
	};
dvander@768
    64
dvander@768
    65
	class IBaseMenu;
dvander@787
    66
	class IMenuPanel;
dvander@768
    67
	class IMenuHandler;
dvander@768
    68
dvander@768
    69
	/**
dvander@768
    70
	 * @brief Describes menu display information.
dvander@768
    71
	 */
dvander@768
    72
	struct menu_states_t
dvander@768
    73
	{
dvander@768
    74
		unsigned int apiVers;			/**< Must be filled with the API version */
dvander@768
    75
		IBaseMenu *menu;				/**< Menu pointer, or NULL if there is only a display */
dvander@768
    76
		IMenuHandler *mh;				/**< Menu callbacks handler */
dvander@768
    77
		unsigned int firstItem;			/**< MENU ONLY: First item displayed on the last page */
dvander@768
    78
		unsigned int lastItem;			/**< MENU ONLY: Last item displayed on the last page */
dvander@768
    79
		menu_slots_t slots[11];			/**< MENU ONLY: Item selection table (first index is 1) */
dvander@768
    80
	};
dvander@768
    81
dvander@768
    82
	#define ITEMDRAW_DEFAULT		(0)		/**< Item should be drawn normally */
dvander@768
    83
	#define ITEMDRAW_DISABLED		(1<<0)	/**< Item is drawn but not selectable */
dvander@768
    84
	#define ITEMDRAW_RAWLINE		(1<<1)	/**< Item should be a raw line, without a slot */
dvander@768
    85
	#define ITEMDRAW_NOTEXT			(1<<2)	/**< No text should be drawn */
dvander@768
    86
	#define ITEMDRAW_SPACER			(1<<3)	/**< Item should be drawn as a spacer, if possible */
dvander@777
    87
	#define ITEMDRAW_IGNORE	((1<<1)|(1<<2))	/**< Item should be completely ignored (rawline + notext) */
dvander@785
    88
	#define ITEMDRAW_CONTROL		(1<<4)	/**< Item is control text (back/next/exit) */
dvander@768
    89
dvander@768
    90
	/**
dvander@768
    91
	 * @brief Information about item drawing.
dvander@768
    92
	 */
dvander@768
    93
	struct ItemDrawInfo
dvander@768
    94
	{
dvander@768
    95
		ItemDrawInfo()
dvander@768
    96
		{
dvander@768
    97
			style = 0;
dvander@768
    98
			display = NULL;
dvander@768
    99
		}
dvander@768
   100
		ItemDrawInfo(const char *DISPLAY, unsigned int STYLE=ITEMDRAW_DEFAULT) 
dvander@768
   101
			: display(DISPLAY), style(STYLE)
dvander@768
   102
		{
dvander@768
   103
		}
dvander@777
   104
		const char *display;			/**< Display text (NULL for none) */
dvander@768
   105
		unsigned int style;				/**< ITEMDRAW style flags */
dvander@768
   106
	};
dvander@768
   107
dvander@768
   108
	/**
dvander@768
   109
	 * @brief Reasons for a menu dying.
dvander@768
   110
	 */
dvander@768
   111
	enum MenuCancelReason
dvander@768
   112
	{
dvander@787
   113
		MenuCancel_Disconnect = -1,	/**< Client dropped from the server */
dvander@787
   114
		MenuCancel_Interrupt = -2,	/**< Client was interrupted with another menu */
dvander@787
   115
		MenuCancel_Exit = -3,		/**< Client selected "exit" on a paginated menu */
dvander@787
   116
		MenuCancel_NoDisplay = -4,	/**< Menu could not be displayed to the client */
dvander@768
   117
	};
dvander@768
   118
dvander@777
   119
	#define MENU_NO_PAGINATION			0		/**< Menu should not be paginated (10 items max) */
dvander@768
   120
	#define MENU_TIME_FOREVER			0		/**< Menu should be displayed as long as possible */
dvander@768
   121
dvander@768
   122
	/**
dvander@768
   123
	 * @brief Extended menu options.
dvander@768
   124
	 */
dvander@768
   125
	enum MenuOption
dvander@768
   126
	{
dvander@768
   127
		MenuOption_IntroMessage,				/**< CONST CHAR *: Valve menus only; defaults to:
dvander@768
   128
													 "You have a menu, hit ESC"
dvander@768
   129
													 */
dvander@768
   130
		MenuOption_IntroColor,					/**< INT[4]: Valve menus only; specifies the intro message colour
dvander@768
   131
													 using R,G,B,A (defaults to 255,0,0,255)
dvander@768
   132
													 */
dvander@776
   133
		MenuOption_Priority,					/**< INT *: Valve menus only; priority (less is higher) */
dvander@768
   134
	};
dvander@768
   135
dvander@768
   136
	/**
dvander@768
   137
	 * @brief Describes the menu a player is viewing.
dvander@768
   138
	 */
dvander@768
   139
	enum MenuSource
dvander@768
   140
	{
dvander@768
   141
		MenuSource_None = 0,					/**< No menu is being displayed */
dvander@768
   142
		MenuSource_External = 1,				/**< External menu, no pointer */
dvander@768
   143
		MenuSource_BaseMenu = 2,				/**< An IBaseMenu pointer. */
dvander@787
   144
		MenuSource_Display = 3,					/**< IMenuPanel source, no pointer */
dvander@768
   145
	};
dvander@768
   146
dvander@768
   147
	class IMenuStyle;
dvander@768
   148
dvander@768
   149
	/**
dvander@768
   150
	 * @brief Sets how a raw menu should be drawn.
dvander@768
   151
	 */
dvander@787
   152
	class IMenuPanel
dvander@768
   153
	{
dvander@768
   154
	public:
dvander@768
   155
		/**
dvander@768
   156
		 * @brief Returns the parent IMenuStyle pointer.
dvander@768
   157
		 *
dvander@768
   158
		 * @return				IMenuStyle pointer which created
dvander@768
   159
		 *						this object.
dvander@768
   160
		 */
dvander@768
   161
		virtual IMenuStyle *GetParentStyle() =0;
dvander@768
   162
dvander@768
   163
		/**
dvander@768
   164
		 * @brief Resets/clears the cached display text.
dvander@768
   165
		 */
dvander@768
   166
		virtual void Reset() =0;
dvander@768
   167
dvander@768
   168
		/**
dvander@768
   169
		 * @brief Sets how the title should be drawn.
dvander@768
   170
		 *
dvander@768
   171
		 * @param text			Text string to display for the title.
dvander@768
   172
		 * @param onlyIfEmpty	Only sets the title if one does not already 
dvander@768
   173
		 *						exist.
dvander@768
   174
		 */
dvander@768
   175
		virtual void DrawTitle(const char *text, bool onlyIfEmpty=false) =0;
dvander@768
   176
dvander@768
   177
		/**
dvander@768
   178
		 * @brief Adds an item to the menu and returns the position (1-10).
dvander@768
   179
		 *
dvander@768
   180
		 * Note: Item will fail to draw if there are too many items,
dvander@768
   181
		 * or the item is not drawable (for example, invisible).	
dvander@768
   182
		 * 
dvander@768
   183
		 * @return				Item draw position, or 0 on failure.
dvander@768
   184
		 */
dvander@768
   185
		virtual unsigned int DrawItem(const ItemDrawInfo &item) =0;
dvander@768
   186
dvander@768
   187
		/**
dvander@768
   188
		 * @brief Draws a raw line of text, if supported.  The line does not 
dvander@768
   189
		 * need to be newline terminated.
dvander@768
   190
		 *
dvander@768
   191
		 * @return				True on success, false if not supported.
dvander@768
   192
		 */
dvander@768
   193
		virtual bool DrawRawLine(const char *rawline) =0;
dvander@768
   194
dvander@768
   195
		/**
dvander@768
   196
		 * @brief Sets an extended menu option.
dvander@768
   197
		 *
dvander@768
   198
		 * @param option		Option type.
dvander@768
   199
		 * @param valuePtr		Pointer of the type expected by the option.
dvander@768
   200
		 * @return				True on success, false if option or value is not supported.
dvander@768
   201
		 */
dvander@768
   202
		virtual bool SetExtOption(MenuOption option, const void *valuePtr) =0;
dvander@768
   203
dvander@768
   204
		/**
dvander@768
   205
		 * @brief Returns whether the display is capable of rendering an item
dvander@768
   206
		 * with the given flags.
dvander@768
   207
		 *
dvander@768
   208
		 * @param flags			ITEMDRAW flags.
dvander@768
   209
		 * @return				True if renderable, false otherwise.
dvander@768
   210
		 */
dvander@768
   211
		virtual bool CanDrawItem(unsigned int drawFlags) =0;
dvander@768
   212
dvander@768
   213
		/**
dvander@768
   214
		 * @brief Sends the menu display to a client.
dvander@768
   215
		 *
dvander@768
   216
		 * @param client		Client index to display to.
dvander@768
   217
		 * @param handler		Menu handler to use.
dvander@768
   218
		 * @param time			Time to hold menu for.
dvander@768
   219
		 * @return				True on success, false otherwise.
dvander@768
   220
		 */
dvander@768
   221
		virtual bool SendDisplay(int client, IMenuHandler *handler, unsigned int time) =0;
dvander@776
   222
dvander@776
   223
		/**
dvander@776
   224
		 * @brief Destroys the display object.
dvander@776
   225
		 */
dvander@776
   226
		virtual void DeleteThis() =0;
dvander@819
   227
dvander@819
   228
		/**
dvander@819
   229
		 * @brief Sets the selectable key map.  Returns false if the function 
dvander@819
   230
		 * is not supported.
dvander@819
   231
		 * 
dvander@819
   232
		 * @param keys			A bit string where each bit N-1 specifies 
dvander@819
   233
		 *						that key N is selectable (key 0 is bit 9).  
dvander@819
   234
		 *						If the selectable key map is 0, it will be
dvander@819
   235
		 *						automatically set to allow 0.
dvander@819
   236
		 * @return				True on success, false if not supported.
dvander@819
   237
		 */
dvander@819
   238
		virtual bool SetSelectableKeys(unsigned int keymap) =0;
dvander@768
   239
	};
dvander@768
   240
dvander@768
   241
	/**
dvander@768
   242
	 * @brief Describes a "MenuStyle" system which manages
dvander@768
   243
	 * menu drawing and construction.
dvander@768
   244
	 */
dvander@768
   245
	class IMenuStyle
dvander@768
   246
	{
dvander@768
   247
	public:
dvander@768
   248
		/**
dvander@768
   249
		 * @brief Returns the style API version.
dvander@768
   250
		 *
dvander@768
   251
		 * @return				API version.
dvander@768
   252
		 */
dvander@768
   253
		virtual unsigned int GetStyleAPIVersion()
dvander@768
   254
		{
dvander@768
   255
			return SMINTERFACE_MENUMANAGER_VERSION;
dvander@768
   256
		}
dvander@768
   257
dvander@768
   258
		/**
dvander@768
   259
		 * @brief Returns the name of the menu style.
dvander@768
   260
		 *
dvander@768
   261
		 * @return				String containing the style name.
dvander@768
   262
		 */
dvander@768
   263
		virtual const char *GetStyleName() =0;
dvander@768
   264
dvander@768
   265
		/**
dvander@787
   266
		 * @brief Creates an IMenuPanel object.
dvander@768
   267
		 *
dvander@776
   268
		 * Note: the object should be freed using ::DeleteThis.
dvander@768
   269
		 *
dvander@787
   270
		 * @return				IMenuPanel object.
dvander@768
   271
		 */
dvander@787
   272
		virtual IMenuPanel *CreatePanel() =0;
dvander@768
   273
dvander@768
   274
		/**
dvander@768
   275
		 * @brief Creates an IBaseMenu object of this style.
dvander@768
   276
		 *
dvander@768
   277
		 * Note: the object should be freed using IBaseMenu::Destroy.
dvander@768
   278
		 *
dvander@790
   279
		 * @param handler		IMenuHandler pointer.
dvander@790
   280
		 * @param pOwner		Optional IdentityToken_t owner for handle 
dvander@790
   281
		 *						creation.
dvander@768
   282
		 * @return				An IBaseMenu pointer.
dvander@768
   283
		 */
dvander@790
   284
		virtual IBaseMenu *CreateMenu(IMenuHandler *handler, IdentityToken_t *pOwner=NULL) =0;
dvander@768
   285
dvander@768
   286
		/**
dvander@768
   287
		 * @brief Returns the maximum number of items per page.
dvander@768
   288
		 *
dvander@768
   289
		 * @return				Number of items per page.
dvander@768
   290
		 */
dvander@768
   291
		virtual unsigned int GetMaxPageItems() =0;
dvander@768
   292
dvander@768
   293
		/**
dvander@768
   294
		 * @brief Returns whether or not a client is viewing a menu.
dvander@768
   295
		 *
dvander@768
   296
		 * @param client		Client index.
dvander@768
   297
		 * @param object		Optional pointer to retrieve menu object,
dvander@768
   298
		 *						if any.
dvander@768
   299
		 * @return				MenuSource value.
dvander@768
   300
		 */
dvander@768
   301
		virtual MenuSource GetClientMenu(int client, void **object) =0;
dvander@768
   302
dvander@768
   303
		/**
dvander@768
   304
		 * @brief Cancels a client's menu.
dvander@768
   305
		 *
dvander@768
   306
		 * @param client		Client index.
dvander@768
   307
		 * @param autoIgnore	If true, no menus can be created during 
dvander@768
   308
		 *						the cancellation process.
dvander@768
   309
		 * @return				True if a menu was cancelled, false otherwise.
dvander@768
   310
		 */
dvander@768
   311
		virtual bool CancelClientMenu(int client, bool autoIgnore=false) =0;
dvander@790
   312
dvander@790
   313
		/**
dvander@790
   314
		 * @brief Returns a Handle the IMenuStyle object.
dvander@790
   315
		 *
dvander@790
   316
		 * @return				Handle_t pointing to this object.
dvander@790
   317
		 */
dvander@790
   318
		virtual Handle_t GetHandle() =0;
dvander@768
   319
	};
dvander@768
   320
dvander@768
   321
	/**
dvander@768
   322
	 * @brief High-level interface for building menus.
dvander@768
   323
	 */
dvander@768
   324
	class IBaseMenu
dvander@768
   325
	{
dvander@768
   326
	public:
dvander@768
   327
		/**
dvander@768
   328
		 * @brief Appends an item to the end of a menu.
dvander@768
   329
		 *
dvander@768
   330
		 * @param info			Item information string.
dvander@768
   331
		 * @param draw			Default drawing information.
dvander@768
   332
		 * @return				True on success, false on item limit reached.
dvander@768
   333
		 */
dvander@768
   334
		virtual bool AppendItem(const char *info, const ItemDrawInfo &draw) =0;
dvander@768
   335
dvander@768
   336
		/**
dvander@768
   337
		 * @brief Inserts an item into the menu before a certain position; 
dvander@768
   338
		 * the new item will be at the given position and all next items 
dvander@768
   339
		 * pushed forward.
dvander@768
   340
		 *
dvander@768
   341
		 * @param position		Position, starting from 0.
dvander@768
   342
		 * @param info			Item information string.
dvander@768
   343
		 * @param draw			Default item draw info.
dvander@768
   344
		 * @return				True on success, false on invalid menu position
dvander@768
   345
		 */
dvander@768
   346
		virtual bool InsertItem(unsigned int position, const char *info, const ItemDrawInfo &draw) =0;
dvander@768
   347
dvander@768
   348
		/**
dvander@768
   349
		 * @brief Removes an item from the menu.
dvander@768
   350
		 *
dvander@768
   351
		 * @param position		Position, starting from 0.
dvander@768
   352
		 * @return				True on success, false on invalid menu position.
dvander@768
   353
		 */
dvander@768
   354
		virtual bool RemoveItem(unsigned int position) =0;
dvander@768
   355
dvander@768
   356
		/**
dvander@768
   357
		 * @brief Removes all items from the menu.
dvander@768
   358
		 */
dvander@768
   359
		virtual void RemoveAllItems() =0;
dvander@768
   360
dvander@768
   361
		/**
dvander@768
   362
		 * @brief Returns an item's info.
dvander@768
   363
		 *
dvander@768
   364
		 * @param position		Position, starting from 0.
dvander@768
   365
		 * @param draw			Optional pointer to store a draw information.
dvander@768
   366
		 * @return				Info string pointer, or NULL if position was invalid.
dvander@768
   367
		 */
dvander@768
   368
		virtual const char *GetItemInfo(unsigned int position, ItemDrawInfo *draw) =0;
dvander@768
   369
dvander@768
   370
		/**
dvander@768
   371
		 * @brief Returns the number of items.
dvander@768
   372
		 *
dvander@768
   373
		 * @return				Number of items in the menu.
dvander@768
   374
		 */
dvander@768
   375
		virtual unsigned int GetItemCount() =0;
dvander@768
   376
dvander@768
   377
		/** 
dvander@768
   378
		 * @brief Sets the menu's pagination,.
dvander@768
   379
		 *
dvander@768
   380
		 * @param itemsPerPage	Number of items per page, or MENU_NO_PAGINATION.
dvander@768
   381
		 * @return				True on success, false if itemsPerPage is too large.
dvander@768
   382
		 */
dvander@768
   383
		virtual bool SetPagination(unsigned int itemsPerPage) =0;
dvander@768
   384
dvander@768
   385
		/**
dvander@768
   386
		 * @brief Returns an item's pagination.
dvander@768
   387
		 *
dvander@768
   388
		 * @return				Pagination setting.
dvander@768
   389
		 */
dvander@768
   390
		virtual unsigned int GetPagination() =0;
dvander@768
   391
dvander@768
   392
		/**
dvander@768
   393
		 * @brief Returns the menu style.
dvander@768
   394
		 * 
dvander@768
   395
		 * @return				Menu style.
dvander@768
   396
		 */
dvander@768
   397
		virtual IMenuStyle *GetDrawStyle() =0;
dvander@768
   398
dvander@768
   399
		/**
dvander@768
   400
		 * @brief Sets the menu's display title/message.
dvander@768
   401
		 *
dvander@768
   402
		 * @param message		Message (format options allowed).
dvander@768
   403
		 */
dvander@768
   404
		virtual void SetDefaultTitle(const char *message) =0;
dvander@768
   405
dvander@768
   406
		/**
dvander@768
   407
		 * @brief Returns the menu's display/title message.
dvander@768
   408
		 *
dvander@768
   409
		 * @return				Message string.
dvander@768
   410
		 */
dvander@768
   411
		virtual const char *GetDefaultTitle() =0;
dvander@768
   412
dvander@768
   413
		/**
dvander@768
   414
		 * @brief Sets an extended menu option.
dvander@768
   415
		 *
dvander@768
   416
		 * @param option		Option type.
dvander@768
   417
		 * @param valuePtr		Pointer of the type expected by the option.
dvander@768
   418
		 * @return				True on success, false if option or value is not supported.
dvander@768
   419
		 */
dvander@768
   420
		virtual bool SetExtOption(MenuOption option, const void *valuePtr) =0;
dvander@768
   421
dvander@768
   422
		/**
dvander@787
   423
		 * @brief Creates a new IMenuPanel object using extended options specific
dvander@768
   424
		 * to the IMenuStyle parent.  Titles, items, etc, are not copied.
dvander@768
   425
		 *
dvander@787
   426
		 * Note: The object should be freed with IMenuPanel::DeleteThis.
dvander@768
   427
		 *
dvander@787
   428
		 * @return				IMenuPanel pointer.
dvander@768
   429
		 */
dvander@787
   430
		virtual IMenuPanel *CreatePanel() =0;
dvander@768
   431
dvander@768
   432
		/**
dvander@768
   433
		 * @brief Returns whether or not the menu should have an "Exit" button for
dvander@768
   434
		 * paginated menus.
dvander@768
   435
		 *
dvander@768
   436
		 * @return				True to have an exit button, false otherwise.
dvander@768
   437
		 */
dvander@768
   438
		virtual bool GetExitButton() =0;
dvander@768
   439
		
dvander@768
   440
		/**
dvander@768
   441
		 * @brief Sets whether or not the menu should have an "Exit" button for
dvander@768
   442
		 * paginated menus.
dvander@768
   443
		 *
dvander@768
   444
		 * @param set			True to enable, false to disable the exit button.
dvander@768
   445
		 * @return				True on success, false if the exit button is 
dvander@768
   446
		 *						non-optional.
dvander@768
   447
		 */
dvander@768
   448
		virtual bool SetExitButton(bool set) =0;
dvander@768
   449
dvander@768
   450
		/**
dvander@768
   451
		 * @brief Sends the menu to a client.
dvander@768
   452
		 *
dvander@768
   453
		 * @param client		Client index to display to.
dvander@768
   454
		 * @param time			Time to hold menu for.
dvander@768
   455
		 * @return				True on success, false otherwise.
dvander@768
   456
		 */
dvander@790
   457
		virtual bool Display(int client, unsigned int time) =0;
dvander@768
   458
dvander@768
   459
		/**
dvander@790
   460
		 * @brief Destroys the menu and frees all associated resources.
dvander@790
   461
		 *
dvander@790
   462
		 * @param releaseHandle	If true, the Handle will be released
dvander@790
   463
		 *						in the destructor.  This should be set
dvander@790
   464
		 *						to true except for IHandleTypeDispatch
dvander@790
   465
		 *						destructors.
dvander@768
   466
		 */
dvander@790
   467
		virtual void Destroy(bool releaseHandle=true) =0;
dvander@768
   468
dvander@768
   469
		/**
dvander@768
   470
		 * @brief Cancels the menu on all client's displays.  While the menu is
dvander@768
   471
		 * being cancelled, the menu may not be re-displayed to any clients.
dvander@768
   472
		 *
dvander@768
   473
		 * @return				Number of menus cancelled.
dvander@768
   474
		 */
dvander@768
   475
		virtual void Cancel() =0;
dvander@790
   476
dvander@790
   477
		/**
dvander@790
   478
		 * @brief Returns the menu's Handle.  The Handle is automatically
dvander@790
   479
		 * removed when the menu is destroyed.
dvander@790
   480
		 *
dvander@790
   481
		 * @return				Handle_t handle value.
dvander@790
   482
		 */
dvander@790
   483
		virtual Handle_t GetHandle() =0;
dvander@768
   484
	};
dvander@768
   485
dvander@768
   486
	/** 
dvander@768
   487
	 * @brief Contains callbacks for menu actions.
dvander@768
   488
	 */
dvander@768
   489
	class IMenuHandler
dvander@768
   490
	{
dvander@768
   491
	public:
dvander@768
   492
		/**
dvander@768
   493
		 * @brief Returns the menu api verison.
dvander@768
   494
		 *
dvander@768
   495
		 * @return				Menu API version.
dvander@768
   496
		 */
dvander@768
   497
		virtual unsigned int GetMenuAPIVersion2()
dvander@768
   498
		{
dvander@768
   499
			return SMINTERFACE_MENUMANAGER_VERSION;
dvander@768
   500
		}
dvander@768
   501
dvander@768
   502
		/** 
dvander@768
   503
		 * @brief A display/selection cycle has started.
dvander@768
   504
		 *
dvander@768
   505
		 * @param menu			Menu pointer.
dvander@768
   506
		 */
dvander@768
   507
		virtual void OnMenuStart(IBaseMenu *menu)
dvander@768
   508
		{
dvander@768
   509
		}
dvander@768
   510
dvander@768
   511
		/**
dvander@768
   512
		 * @brief Called before a menu is being displayed.  This is where
dvander@768
   513
		 * you can set an alternate title on the menu.
dvander@768
   514
		 *
dvander@768
   515
		 * @param menu			Menu pointer.
dvander@768
   516
		 * @param client		Client index.
dvander@787
   517
		 * @param display		IMenuPanel pointer.
dvander@768
   518
		 */
dvander@787
   519
		virtual void OnMenuDisplay(IBaseMenu *menu, int client, IMenuPanel *display)
dvander@768
   520
		{
dvander@768
   521
		}
dvander@768
   522
dvander@768
   523
		/**
dvander@768
   524
		 * @brief Called when an item is selected.
dvander@768
   525
		 *
dvander@768
   526
		 * @param menu			Menu pointer.
dvander@768
   527
		 * @param client		Client that selected the item.
dvander@768
   528
		 * @param item			Item number.
dvander@768
   529
		 */
dvander@768
   530
		virtual void OnMenuSelect(IBaseMenu *menu, int client, unsigned int item)
dvander@768
   531
		{
dvander@768
   532
		}
dvander@768
   533
dvander@768
   534
		/**
dvander@768
   535
		 * @brief An active menu display was dropped from a client.
dvander@768
   536
		 *
dvander@768
   537
		 * @param menu			Menu pointer.
dvander@768
   538
		 * @param client		Client that had the menu.
dvander@768
   539
		 * @param reason		Menu cancellation reason.
dvander@768
   540
		 */
dvander@768
   541
		virtual void OnMenuCancel(IBaseMenu *menu, int client, MenuCancelReason reason)
dvander@768
   542
		{
dvander@768
   543
		}
dvander@768
   544
dvander@768
   545
		/**
dvander@768
   546
		 * @brief A display/selection cycle has ended.
dvander@768
   547
		 *
dvander@768
   548
		 * @param menu			Menu pointer.
dvander@768
   549
		 */
dvander@768
   550
		virtual void OnMenuEnd(IBaseMenu *menu)
dvander@768
   551
		{
dvander@768
   552
		}
dvander@768
   553
dvander@768
   554
		/**
dvander@790
   555
		 * @brief Called when the menu object is destroyed.
dvander@790
   556
		 *
dvander@790
   557
		 * @param menu			Menu pointer.
dvander@790
   558
		 */
dvander@790
   559
		virtual void OnMenuDestroy(IBaseMenu *menu)
dvander@790
   560
		{
dvander@790
   561
		}
dvander@790
   562
dvander@790
   563
		/**
dvander@768
   564
		 * @brief Called when requesting how to render an item.
dvander@768
   565
		 *
dvander@768
   566
		 * @param menu			Menu pointer.
dvander@768
   567
		 * @param client		Client index receiving the menu.
dvander@768
   568
		 * @param item			Item number in the menu.
dvander@768
   569
		 * @param style			ITEMSTYLE flags, by reference for modification.
dvander@768
   570
		 */
dvander@768
   571
		virtual void OnMenuDrawItem(IBaseMenu *menu, int client, unsigned int item, unsigned int &style)
dvander@768
   572
		{
dvander@768
   573
		}
dvander@768
   574
dvander@768
   575
		/**
dvander@768
   576
		 * @brief Called when requesting how to draw an item's text.
dvander@768
   577
		 *
dvander@768
   578
		 * @param menu			Menu pointer.
dvander@768
   579
		 * @param client		Client index receiving the menu.
dvander@768
   580
		 * @param item			Item number in the menu.
dvander@768
   581
		 * @param display		Pointer to the display text string (changeable).
dvander@768
   582
		 */
dvander@768
   583
		virtual void OnMenuDisplayItem(IBaseMenu *menu, int client, unsigned int item, const char **display)
dvander@768
   584
		{
dvander@768
   585
		}
dvander@768
   586
	};
dvander@768
   587
dvander@768
   588
	/** 
dvander@768
   589
	 * @brief Handles a vote menu.
dvander@768
   590
	 */
dvander@768
   591
	class IMenuVoteHandler : public IMenuHandler
dvander@768
   592
	{
dvander@768
   593
	public:
dvander@768
   594
		/**
dvander@768
   595
		 * @brief Called when a vote ends.
dvander@768
   596
		 *
dvander@768
   597
		 * @param menu			Menu pointer.
dvander@768
   598
		 * @param item			Item position that was chosen by a majority.
dvander@768
   599
		 */
dvander@768
   600
		virtual void OnMenuVoteEnd(IBaseMenu *menu, unsigned int item) =0;
dvander@768
   601
	};
dvander@768
   602
dvander@768
   603
	/**
dvander@768
   604
	 * @brief Manages menu creation and displaying.
dvander@768
   605
	 */
dvander@768
   606
	class IMenuManager : public SMInterface
dvander@768
   607
	{
dvander@768
   608
	public:
dvander@768
   609
		virtual const char *GetInterfaceName()
dvander@768
   610
		{
dvander@768
   611
			return SMINTERFACE_MENUMANAGER_NAME;
dvander@768
   612
		}
dvander@768
   613
		virtual unsigned int GetInterfaceVersion()
dvander@768
   614
		{
dvander@768
   615
			return SMINTERFACE_MENUMANAGER_VERSION;
dvander@768
   616
		}
dvander@768
   617
	public:
dvander@768
   618
		/**
dvander@768
   619
		 * @brief Finds a style by name.
dvander@768
   620
		 *
dvander@768
   621
		 * @param name			Name of the style (case insensitive).
dvander@768
   622
		 * @return				IMenuStyle pointer, or NULL if not found.
dvander@768
   623
		 */
dvander@768
   624
		virtual IMenuStyle *FindStyleByName(const char *name) =0;
dvander@768
   625
dvander@790
   626
#if 0
dvander@768
   627
		/**
dvander@768
   628
		 * @brief Broadcasts a menu to a number of clients.
dvander@768
   629
		 *
dvander@768
   630
		 * @param menu			Menu pointer.
dvander@768
   631
		 * @param clients		Array of client indexes.
dvander@768
   632
		 * @param numClients	Number of clients in the array.
dvander@768
   633
		 * @param time			Time to hold the menu.
dvander@768
   634
		 * @return				Number of clients the menu will be waiting on.
dvander@768
   635
		 */
dvander@768
   636
		virtual unsigned int BroadcastMenu(IBaseMenu *menu, 
dvander@768
   637
									IMenuHandler *handler,
dvander@768
   638
									int clients[], 
dvander@768
   639
									unsigned int numClients,
dvander@768
   640
									unsigned int time) =0;
dvander@768
   641
dvander@768
   642
		/**
dvander@768
   643
		 * @brief Broadcasts a menu to a number of clients as a vote menu.
dvander@768
   644
		 *
dvander@768
   645
		 * @param menu			Menu pointer.
dvander@768
   646
		 * @param handler		IMenuHandler pointer.
dvander@768
   647
		 * @param clients		Array of client indexes.
dvander@768
   648
		 * @param numClients	Number of clients in the array.
dvander@768
   649
		 * @param time			Time to hold the menu.
dvander@768
   650
		 * @return				Number of clients the menu will be waiting on.
dvander@768
   651
		 */
dvander@768
   652
		virtual unsigned int VoteMenu(IBaseMenu *menu, 
dvander@768
   653
									IMenuVoteHandler *handler,
dvander@768
   654
									int clients[], 
dvander@768
   655
									unsigned int numClients,
dvander@768
   656
									unsigned int time) =0;
dvander@790
   657
#endif
dvander@768
   658
dvander@768
   659
		/**
dvander@768
   660
		 * @brief Returns the default draw style Core is using.
dvander@768
   661
		 *
dvander@768
   662
		 * @return				Menu style pointer.
dvander@768
   663
		 */
dvander@768
   664
		virtual IMenuStyle *GetDefaultStyle() =0;
dvander@768
   665
dvander@768
   666
		/**
dvander@768
   667
		 * @brief Given a set of menu states, converts it to an IDisplay object.
dvander@768
   668
		 *
dvander@768
   669
		 * The state parameter is both INPUT and OUTPUT.
dvander@768
   670
		 * INPUT: menu, mh, firstItem, lastItem
dvander@768
   671
		 * OUTPUT: display, firstItem, lastItem, slots
dvander@768
   672
		 *
dvander@768
   673
		 * @param client		Client index.
dvander@768
   674
		 * @param states		Menu states.
dvander@768
   675
		 * @return				IDisplay pointer, or NULL if no items could be 
dvander@768
   676
		 *						found in the IBaseMenu pointer, or NULL if any
dvander@768
   677
		 *						other error occurred.  Any valid pointer must
dvander@787
   678
		 *						be freed using IMenuPanel::DeleteThis.
dvander@768
   679
		 */
dvander@787
   680
		virtual IMenuPanel *RenderMenu(int client, menu_states_t &states, ItemOrder order) =0;
dvander@768
   681
	};
dvander@768
   682
}
dvander@768
   683
dvander@768
   684
#endif //_INCLUDE_SOURCEMOD_MENU_SYSTEM_H_