public/IMenuManager.h
author Scott Ehlert <ds@alliedmods.net>
Wed Aug 15 06:19:30 2007 +0000 (2007-08-15)
changeset 1330 ab94316bb52b
parent 1296 0197a1212cb8
child 1347 b1e02bc27316
permissions -rw-r--r--
Updated license headers on virtually all files with extremely minor changes in the name of some sort of strange consistency.
All plugin and include file headers also have been changed to say about GPL3 instead of GPL2.

(This day shall henceforth be known as the Eighty Column Massacre of '07)
dvander@768
     1
/**
dvander@768
     2
 * vim: set ts=4 :
ds@1330
     3
 * =============================================================================
dvander@1226
     4
 * SourceMod
dvander@1226
     5
 * Copyright (C) 2004-2007 AlliedModders LLC.  All rights reserved.
ds@1330
     6
 * =============================================================================
dvander@768
     7
 *
ds@1330
     8
 * This program is free software; you can redistribute it and/or modify it under
ds@1330
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
ds@1330
    10
 * Free Software Foundation.
dvander@768
    11
 * 
ds@1330
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
ds@1330
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ds@1330
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ds@1330
    15
 * details.
dvander@1226
    16
 *
ds@1330
    17
 * You should have received a copy of the GNU General Public License along with
ds@1330
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@1226
    19
 *
ds@1330
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
ds@1330
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ds@1330
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ds@1330
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
ds@1330
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ds@1330
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
ds@1330
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ds@1330
    27
 * or <http://www.sourcemod.net/license.php>.
dvander@768
    28
 *
dvander@768
    29
 * Version: $Id$
dvander@768
    30
 */
dvander@768
    31
dvander@768
    32
#ifndef _INCLUDE_SOURCEMOD_MENU_SYSTEM_H_
dvander@768
    33
#define _INCLUDE_SOURCEMOD_MENU_SYSTEM_H_
dvander@768
    34
dvander@768
    35
#include <IShareSys.h>
dvander@790
    36
#include <IHandleSys.h>
dvander@768
    37
dvander@768
    38
#define SMINTERFACE_MENUMANAGER_NAME		"IMenuManager"
dvander@1296
    39
#define SMINTERFACE_MENUMANAGER_VERSION		11
dvander@768
    40
dvander@768
    41
/**
dvander@768
    42
 * @file IMenuManager.h
dvander@768
    43
 * @brief Abstracts on-screen menus for clients.
dvander@768
    44
 */
dvander@768
    45
dvander@768
    46
namespace SourceMod
dvander@768
    47
{
dvander@768
    48
	/**
dvander@768
    49
	 * @brief Used to determine how an item selection is interpreted.
dvander@768
    50
	 */
dvander@768
    51
	enum ItemSelection
dvander@768
    52
	{
dvander@768
    53
		ItemSel_None,					/**< Invalid selection */
dvander@1005
    54
		ItemSel_Back,					/**< Go back one page (really "Previous") */
dvander@768
    55
		ItemSel_Next,					/**< Go forward one page */
dvander@768
    56
		ItemSel_Exit,					/**< Menu was exited */
dvander@768
    57
		ItemSel_Item,					/**< Valid item selection */
dvander@1005
    58
		ItemSel_ExitBack,				/**< Sends MenuEnd_ExitBack */
dvander@768
    59
	};
dvander@768
    60
dvander@768
    61
	/**
dvander@768
    62
	 * @brief Used to determine which order to search for items in.
dvander@768
    63
	 */
dvander@768
    64
	enum ItemOrder
dvander@768
    65
	{
dvander@768
    66
		ItemOrder_Ascending,			/**< Items should be drawn ascendingly */
dvander@768
    67
		ItemOrder_Descending,			/**< Items should be drawn descendingly */
dvander@768
    68
	};
dvander@768
    69
dvander@768
    70
	/**
dvander@768
    71
	 * @brief Pairs an item type with an item menu position.
dvander@768
    72
	 */
dvander@768
    73
	struct menu_slots_t
dvander@768
    74
	{
dvander@768
    75
		ItemSelection type;				/**< Item selection type */
dvander@768
    76
		unsigned int item;				/**< Item position, if applicable */
dvander@768
    77
	};
dvander@768
    78
dvander@768
    79
	class IBaseMenu;
dvander@787
    80
	class IMenuPanel;
dvander@768
    81
	class IMenuHandler;
dvander@768
    82
dvander@768
    83
	/**
dvander@768
    84
	 * @brief Describes menu display information.
dvander@768
    85
	 */
dvander@768
    86
	struct menu_states_t
dvander@768
    87
	{
dvander@768
    88
		unsigned int apiVers;			/**< Must be filled with the API version */
dvander@768
    89
		IBaseMenu *menu;				/**< Menu pointer, or NULL if there is only a display */
dvander@768
    90
		IMenuHandler *mh;				/**< Menu callbacks handler */
dvander@768
    91
		unsigned int firstItem;			/**< MENU ONLY: First item displayed on the last page */
dvander@768
    92
		unsigned int lastItem;			/**< MENU ONLY: Last item displayed on the last page */
dvander@768
    93
		menu_slots_t slots[11];			/**< MENU ONLY: Item selection table (first index is 1) */
dvander@768
    94
	};
dvander@768
    95
dvander@768
    96
	#define ITEMDRAW_DEFAULT		(0)		/**< Item should be drawn normally */
dvander@768
    97
	#define ITEMDRAW_DISABLED		(1<<0)	/**< Item is drawn but not selectable */
dvander@768
    98
	#define ITEMDRAW_RAWLINE		(1<<1)	/**< Item should be a raw line, without a slot */
dvander@768
    99
	#define ITEMDRAW_NOTEXT			(1<<2)	/**< No text should be drawn */
dvander@768
   100
	#define ITEMDRAW_SPACER			(1<<3)	/**< Item should be drawn as a spacer, if possible */
dvander@777
   101
	#define ITEMDRAW_IGNORE	((1<<1)|(1<<2))	/**< Item should be completely ignored (rawline + notext) */
dvander@785
   102
	#define ITEMDRAW_CONTROL		(1<<4)	/**< Item is control text (back/next/exit) */
dvander@768
   103
dvander@768
   104
	/**
dvander@768
   105
	 * @brief Information about item drawing.
dvander@768
   106
	 */
dvander@768
   107
	struct ItemDrawInfo
dvander@768
   108
	{
dvander@1163
   109
		ItemDrawInfo(const char *DISPLAY=NULL, unsigned int STYLE=ITEMDRAW_DEFAULT, 
dvander@1163
   110
					 unsigned int FLAGS=0, const char *HELPTEXT=NULL) 
dvander@1163
   111
			: display(DISPLAY), style(STYLE), access(FLAGS)
dvander@768
   112
		{
dvander@768
   113
		}
dvander@777
   114
		const char *display;			/**< Display text (NULL for none) */
dvander@768
   115
		unsigned int style;				/**< ITEMDRAW style flags */
dvander@1163
   116
		unsigned int access;				/**< Access flags required to see */
dvander@768
   117
	};
dvander@768
   118
dvander@768
   119
	/**
dvander@1269
   120
	 * @brief Contains information about a vote result.
dvander@1269
   121
	 */
dvander@1269
   122
	struct menu_vote_result_t
dvander@1269
   123
	{
dvander@1269
   124
		unsigned int num_clients;		/**< Number of clients the menu was displayed to */
dvander@1269
   125
		unsigned int num_votes;			/**< Number of votes received */
dvander@1269
   126
		struct menu_client_vote_t
dvander@1269
   127
		{
dvander@1269
   128
			int client;					/**< Client index */
dvander@1269
   129
			int item;					/**< Item # (or -1 for none) */
dvander@1269
   130
		} *client_list;					/**< Array of size num_clients */
dvander@1269
   131
		unsigned int num_items;			/**< Number of items voted for */
dvander@1269
   132
		struct menu_item_vote_t
dvander@1269
   133
		{
dvander@1269
   134
			unsigned int item;			/**< Item index */
dvander@1269
   135
			unsigned int count;			/**< Number of votes */
dvander@1269
   136
		} *item_list;					/**< Array of size num_items, sorted by count, 
dvander@1269
   137
											 descending */
dvander@1269
   138
	};
dvander@1269
   139
dvander@1269
   140
	/**
dvander@768
   141
	 * @brief Reasons for a menu dying.
dvander@768
   142
	 */
dvander@768
   143
	enum MenuCancelReason
dvander@768
   144
	{
dvander@1005
   145
		MenuCancel_Disconnected = -1,	/**< Client dropped from the server */
dvander@1005
   146
		MenuCancel_Interrupted = -2,	/**< Client was interrupted with another menu */
dvander@1005
   147
		MenuCancel_Exit = -3,			/**< Client selected "exit" on a paginated menu */
dvander@1005
   148
		MenuCancel_NoDisplay = -4,		/**< Menu could not be displayed to the client */
dvander@1005
   149
		MenuCancel_Timeout = -5,		/**< Menu timed out */
dvander@1005
   150
		MenuCancel_ExitBack = -6,		/**< Client selected "exit back" on a paginated menu */
dvander@768
   151
	};
dvander@768
   152
dvander@997
   153
	/**
dvander@997
   154
	 * @brief Reasons a menu ended.
dvander@997
   155
	 */
dvander@997
   156
	enum MenuEndReason
dvander@997
   157
	{
dvander@1005
   158
		MenuEnd_Selected = 0,				/**< Menu item was selected */
dvander@1005
   159
		MenuEnd_VotingDone = -1,			/**< Voting finished */
dvander@1005
   160
		MenuEnd_VotingCancelled = -2,		/**< Voting was cancelled */
dvander@1005
   161
		MenuEnd_Cancelled = -3,				/**< Menu was uncleanly cancelled */
dvander@1005
   162
		MenuEnd_Exit = -4,					/**< Menu was cleanly exited via "exit" */
dvander@1005
   163
		MenuEnd_ExitBack = -5,				/**< Menu was cleanly exited via "back" */
dvander@997
   164
	};
dvander@997
   165
dvander@1296
   166
	/**
dvander@1296
   167
	 * @brief Reasons a vote can be cancelled.
dvander@1296
   168
	 */
dvander@1296
   169
	enum VoteCancelReason
dvander@1296
   170
	{
dvander@1296
   171
		VoteCancel_Generic = -1,		/**< Vote was generically cancelled. */
dvander@1296
   172
		VoteCancel_NoVotes = -2,		/**< Vote did not receive any votes. */
dvander@1296
   173
	};
dvander@997
   174
dvander@777
   175
	#define MENU_NO_PAGINATION			0		/**< Menu should not be paginated (10 items max) */
dvander@768
   176
	#define MENU_TIME_FOREVER			0		/**< Menu should be displayed as long as possible */
dvander@768
   177
dvander@1259
   178
	#define MENUFLAG_BUTTON_EXIT		(1<<0)	/**< Menu has an "exit" button */
dvander@1259
   179
	#define MENUFLAG_BUTTON_EXITBACK	(1<<1)	/**< Menu has an "exit back" button */
dvander@1259
   180
	#define MENUFLAG_NO_SOUND			(1<<2)	/**< Menu will not have any select sounds */
dvander@1259
   181
dvander@768
   182
	/**
dvander@768
   183
	 * @brief Extended menu options.
dvander@768
   184
	 */
dvander@768
   185
	enum MenuOption
dvander@768
   186
	{
dvander@768
   187
		MenuOption_IntroMessage,				/**< CONST CHAR *: Valve menus only; defaults to:
dvander@768
   188
													 "You have a menu, hit ESC"
dvander@768
   189
													 */
dvander@768
   190
		MenuOption_IntroColor,					/**< INT[4]: Valve menus only; specifies the intro message colour
dvander@768
   191
													 using R,G,B,A (defaults to 255,0,0,255)
dvander@768
   192
													 */
dvander@776
   193
		MenuOption_Priority,					/**< INT *: Valve menus only; priority (less is higher) */
dvander@768
   194
	};
dvander@768
   195
dvander@768
   196
	/**
dvander@768
   197
	 * @brief Describes the menu a player is viewing.
dvander@768
   198
	 */
dvander@768
   199
	enum MenuSource
dvander@768
   200
	{
dvander@768
   201
		MenuSource_None = 0,					/**< No menu is being displayed */
dvander@768
   202
		MenuSource_External = 1,				/**< External menu, no pointer */
dvander@768
   203
		MenuSource_BaseMenu = 2,				/**< An IBaseMenu pointer. */
dvander@787
   204
		MenuSource_Display = 3,					/**< IMenuPanel source, no pointer */
dvander@768
   205
	};
dvander@768
   206
dvander@768
   207
	class IMenuStyle;
dvander@768
   208
dvander@768
   209
	/**
dvander@768
   210
	 * @brief Sets how a raw menu should be drawn.
dvander@768
   211
	 */
dvander@787
   212
	class IMenuPanel
dvander@768
   213
	{
dvander@768
   214
	public:
dvander@768
   215
		/**
dvander@768
   216
		 * @brief Returns the parent IMenuStyle pointer.
dvander@768
   217
		 *
dvander@768
   218
		 * @return				IMenuStyle pointer which created
dvander@768
   219
		 *						this object.
dvander@768
   220
		 */
dvander@768
   221
		virtual IMenuStyle *GetParentStyle() =0;
dvander@768
   222
dvander@768
   223
		/**
dvander@768
   224
		 * @brief Resets/clears the cached display text.
dvander@768
   225
		 */
dvander@768
   226
		virtual void Reset() =0;
dvander@768
   227
dvander@768
   228
		/**
dvander@768
   229
		 * @brief Sets how the title should be drawn.
dvander@768
   230
		 *
dvander@768
   231
		 * @param text			Text string to display for the title.
dvander@768
   232
		 * @param onlyIfEmpty	Only sets the title if one does not already 
dvander@768
   233
		 *						exist.
dvander@768
   234
		 */
dvander@768
   235
		virtual void DrawTitle(const char *text, bool onlyIfEmpty=false) =0;
dvander@768
   236
dvander@768
   237
		/**
dvander@768
   238
		 * @brief Adds an item to the menu and returns the position (1-10).
dvander@768
   239
		 *
dvander@768
   240
		 * Note: Item will fail to draw if there are too many items,
dvander@768
   241
		 * or the item is not drawable (for example, invisible).	
dvander@768
   242
		 * 
dvander@768
   243
		 * @return				Item draw position, or 0 on failure.
dvander@768
   244
		 */
dvander@768
   245
		virtual unsigned int DrawItem(const ItemDrawInfo &item) =0;
dvander@768
   246
dvander@768
   247
		/**
dvander@768
   248
		 * @brief Draws a raw line of text, if supported.  The line does not 
dvander@768
   249
		 * need to be newline terminated.
dvander@768
   250
		 *
dvander@768
   251
		 * @return				True on success, false if not supported.
dvander@768
   252
		 */
dvander@768
   253
		virtual bool DrawRawLine(const char *rawline) =0;
dvander@768
   254
dvander@768
   255
		/**
dvander@768
   256
		 * @brief Sets an extended menu option.
dvander@768
   257
		 *
dvander@768
   258
		 * @param option		Option type.
dvander@768
   259
		 * @param valuePtr		Pointer of the type expected by the option.
dvander@768
   260
		 * @return				True on success, false if option or value is not supported.
dvander@768
   261
		 */
dvander@768
   262
		virtual bool SetExtOption(MenuOption option, const void *valuePtr) =0;
dvander@768
   263
dvander@768
   264
		/**
dvander@768
   265
		 * @brief Returns whether the display is capable of rendering an item
dvander@768
   266
		 * with the given flags.
dvander@768
   267
		 *
dvander@768
   268
		 * @param flags			ITEMDRAW flags.
dvander@768
   269
		 * @return				True if renderable, false otherwise.
dvander@768
   270
		 */
dvander@768
   271
		virtual bool CanDrawItem(unsigned int drawFlags) =0;
dvander@768
   272
dvander@768
   273
		/**
dvander@768
   274
		 * @brief Sends the menu display to a client.
dvander@768
   275
		 *
dvander@768
   276
		 * @param client		Client index to display to.
dvander@768
   277
		 * @param handler		Menu handler to use.
dvander@768
   278
		 * @param time			Time to hold menu for.
dvander@768
   279
		 * @return				True on success, false otherwise.
dvander@768
   280
		 */
dvander@768
   281
		virtual bool SendDisplay(int client, IMenuHandler *handler, unsigned int time) =0;
dvander@776
   282
dvander@776
   283
		/**
dvander@776
   284
		 * @brief Destroys the display object.
dvander@776
   285
		 */
dvander@776
   286
		virtual void DeleteThis() =0;
dvander@819
   287
dvander@819
   288
		/**
dvander@819
   289
		 * @brief Sets the selectable key map.  Returns false if the function 
dvander@819
   290
		 * is not supported.
dvander@819
   291
		 * 
dvander@819
   292
		 * @param keys			A bit string where each bit N-1 specifies 
dvander@819
   293
		 *						that key N is selectable (key 0 is bit 9).  
dvander@819
   294
		 *						If the selectable key map is 0, it will be
dvander@819
   295
		 *						automatically set to allow 0.
dvander@819
   296
		 * @return				True on success, false if not supported.
dvander@819
   297
		 */
dvander@819
   298
		virtual bool SetSelectableKeys(unsigned int keymap) =0;
dvander@840
   299
dvander@840
   300
		/**
dvander@840
   301
		 * @brief Returns the current key position.
dvander@840
   302
		 *
dvander@840
   303
		 * @return				Current key position starting at 1.
dvander@840
   304
		 */
dvander@840
   305
		virtual unsigned int GetCurrentKey() =0;
dvander@840
   306
dvander@840
   307
		/**
dvander@840
   308
		 * @brief Sets the next key position.  This cannot be used
dvander@840
   309
		 * to traverse backwards.
dvander@840
   310
		 *
dvander@840
   311
		 * @param key			Key that is greater or equal to
dvander@840
   312
		 *						GetCurrentKey().
dvander@840
   313
		 * @return				True on success, false otherwise.
dvander@840
   314
		 */
dvander@840
   315
		virtual bool SetCurrentKey(unsigned int key) =0;
dvander@768
   316
	};
dvander@768
   317
dvander@768
   318
	/**
dvander@768
   319
	 * @brief Describes a "MenuStyle" system which manages
dvander@768
   320
	 * menu drawing and construction.
dvander@768
   321
	 */
dvander@768
   322
	class IMenuStyle
dvander@768
   323
	{
dvander@768
   324
	public:
dvander@768
   325
		/**
dvander@768
   326
		 * @brief Returns the style API version.
dvander@768
   327
		 *
dvander@768
   328
		 * @return				API version.
dvander@768
   329
		 */
dvander@768
   330
		virtual unsigned int GetStyleAPIVersion()
dvander@768
   331
		{
dvander@768
   332
			return SMINTERFACE_MENUMANAGER_VERSION;
dvander@768
   333
		}
dvander@768
   334
dvander@768
   335
		/**
dvander@768
   336
		 * @brief Returns the name of the menu style.
dvander@768
   337
		 *
dvander@768
   338
		 * @return				String containing the style name.
dvander@768
   339
		 */
dvander@768
   340
		virtual const char *GetStyleName() =0;
dvander@768
   341
dvander@768
   342
		/**
dvander@787
   343
		 * @brief Creates an IMenuPanel object.
dvander@768
   344
		 *
dvander@776
   345
		 * Note: the object should be freed using ::DeleteThis.
dvander@768
   346
		 *
dvander@787
   347
		 * @return				IMenuPanel object.
dvander@768
   348
		 */
dvander@787
   349
		virtual IMenuPanel *CreatePanel() =0;
dvander@768
   350
dvander@768
   351
		/**
dvander@768
   352
		 * @brief Creates an IBaseMenu object of this style.
dvander@768
   353
		 *
dvander@768
   354
		 * Note: the object should be freed using IBaseMenu::Destroy.
dvander@768
   355
		 *
dvander@790
   356
		 * @param handler		IMenuHandler pointer.
dvander@790
   357
		 * @param pOwner		Optional IdentityToken_t owner for handle 
dvander@790
   358
		 *						creation.
dvander@768
   359
		 * @return				An IBaseMenu pointer.
dvander@768
   360
		 */
dvander@790
   361
		virtual IBaseMenu *CreateMenu(IMenuHandler *handler, IdentityToken_t *pOwner=NULL) =0;
dvander@768
   362
dvander@768
   363
		/**
dvander@768
   364
		 * @brief Returns the maximum number of items per page.
dvander@768
   365
		 *
dvander@768
   366
		 * @return				Number of items per page.
dvander@768
   367
		 */
dvander@768
   368
		virtual unsigned int GetMaxPageItems() =0;
dvander@768
   369
dvander@768
   370
		/**
dvander@768
   371
		 * @brief Returns whether or not a client is viewing a menu.
dvander@768
   372
		 *
dvander@768
   373
		 * @param client		Client index.
dvander@768
   374
		 * @param object		Optional pointer to retrieve menu object,
dvander@768
   375
		 *						if any.
dvander@768
   376
		 * @return				MenuSource value.
dvander@768
   377
		 */
dvander@768
   378
		virtual MenuSource GetClientMenu(int client, void **object) =0;
dvander@768
   379
dvander@768
   380
		/**
dvander@768
   381
		 * @brief Cancels a client's menu.
dvander@768
   382
		 *
dvander@768
   383
		 * @param client		Client index.
dvander@768
   384
		 * @param autoIgnore	If true, no menus can be created during 
dvander@768
   385
		 *						the cancellation process.
dvander@768
   386
		 * @return				True if a menu was cancelled, false otherwise.
dvander@768
   387
		 */
dvander@768
   388
		virtual bool CancelClientMenu(int client, bool autoIgnore=false) =0;
dvander@790
   389
dvander@790
   390
		/**
dvander@790
   391
		 * @brief Returns a Handle the IMenuStyle object.
dvander@790
   392
		 *
dvander@790
   393
		 * @return				Handle_t pointing to this object.
dvander@790
   394
		 */
dvander@790
   395
		virtual Handle_t GetHandle() =0;
dvander@768
   396
	};
dvander@768
   397
dvander@768
   398
	/**
dvander@768
   399
	 * @brief High-level interface for building menus.
dvander@768
   400
	 */
dvander@768
   401
	class IBaseMenu
dvander@768
   402
	{
dvander@768
   403
	public:
dvander@768
   404
		/**
dvander@768
   405
		 * @brief Appends an item to the end of a menu.
dvander@768
   406
		 *
dvander@768
   407
		 * @param info			Item information string.
dvander@768
   408
		 * @param draw			Default drawing information.
dvander@768
   409
		 * @return				True on success, false on item limit reached.
dvander@768
   410
		 */
dvander@768
   411
		virtual bool AppendItem(const char *info, const ItemDrawInfo &draw) =0;
dvander@768
   412
dvander@768
   413
		/**
dvander@768
   414
		 * @brief Inserts an item into the menu before a certain position; 
dvander@768
   415
		 * the new item will be at the given position and all next items 
dvander@768
   416
		 * pushed forward.
dvander@768
   417
		 *
dvander@768
   418
		 * @param position		Position, starting from 0.
dvander@768
   419
		 * @param info			Item information string.
dvander@768
   420
		 * @param draw			Default item draw info.
dvander@768
   421
		 * @return				True on success, false on invalid menu position
dvander@768
   422
		 */
dvander@768
   423
		virtual bool InsertItem(unsigned int position, const char *info, const ItemDrawInfo &draw) =0;
dvander@768
   424
dvander@768
   425
		/**
dvander@768
   426
		 * @brief Removes an item from the menu.
dvander@768
   427
		 *
dvander@768
   428
		 * @param position		Position, starting from 0.
dvander@768
   429
		 * @return				True on success, false on invalid menu position.
dvander@768
   430
		 */
dvander@768
   431
		virtual bool RemoveItem(unsigned int position) =0;
dvander@768
   432
dvander@768
   433
		/**
dvander@768
   434
		 * @brief Removes all items from the menu.
dvander@768
   435
		 */
dvander@768
   436
		virtual void RemoveAllItems() =0;
dvander@768
   437
dvander@768
   438
		/**
dvander@768
   439
		 * @brief Returns an item's info.
dvander@768
   440
		 *
dvander@768
   441
		 * @param position		Position, starting from 0.
dvander@768
   442
		 * @param draw			Optional pointer to store a draw information.
dvander@768
   443
		 * @return				Info string pointer, or NULL if position was invalid.
dvander@768
   444
		 */
dvander@768
   445
		virtual const char *GetItemInfo(unsigned int position, ItemDrawInfo *draw) =0;
dvander@768
   446
dvander@768
   447
		/**
dvander@768
   448
		 * @brief Returns the number of items.
dvander@768
   449
		 *
dvander@768
   450
		 * @return				Number of items in the menu.
dvander@768
   451
		 */
dvander@768
   452
		virtual unsigned int GetItemCount() =0;
dvander@768
   453
dvander@768
   454
		/** 
dvander@768
   455
		 * @brief Sets the menu's pagination,.
dvander@768
   456
		 *
dvander@768
   457
		 * @param itemsPerPage	Number of items per page, or MENU_NO_PAGINATION.
dvander@768
   458
		 * @return				True on success, false if itemsPerPage is too large.
dvander@768
   459
		 */
dvander@768
   460
		virtual bool SetPagination(unsigned int itemsPerPage) =0;
dvander@768
   461
dvander@768
   462
		/**
dvander@768
   463
		 * @brief Returns an item's pagination.
dvander@768
   464
		 *
dvander@768
   465
		 * @return				Pagination setting.
dvander@768
   466
		 */
dvander@768
   467
		virtual unsigned int GetPagination() =0;
dvander@768
   468
dvander@768
   469
		/**
dvander@768
   470
		 * @brief Returns the menu style.
dvander@768
   471
		 * 
dvander@768
   472
		 * @return				Menu style.
dvander@768
   473
		 */
dvander@768
   474
		virtual IMenuStyle *GetDrawStyle() =0;
dvander@768
   475
dvander@768
   476
		/**
dvander@768
   477
		 * @brief Sets the menu's display title/message.
dvander@768
   478
		 *
dvander@768
   479
		 * @param message		Message (format options allowed).
dvander@768
   480
		 */
dvander@768
   481
		virtual void SetDefaultTitle(const char *message) =0;
dvander@768
   482
dvander@768
   483
		/**
dvander@768
   484
		 * @brief Returns the menu's display/title message.
dvander@768
   485
		 *
dvander@768
   486
		 * @return				Message string.
dvander@768
   487
		 */
dvander@768
   488
		virtual const char *GetDefaultTitle() =0;
dvander@768
   489
dvander@768
   490
		/**
dvander@768
   491
		 * @brief Sets an extended menu option.
dvander@768
   492
		 *
dvander@768
   493
		 * @param option		Option type.
dvander@768
   494
		 * @param valuePtr		Pointer of the type expected by the option.
dvander@768
   495
		 * @return				True on success, false if option or value is not supported.
dvander@768
   496
		 */
dvander@768
   497
		virtual bool SetExtOption(MenuOption option, const void *valuePtr) =0;
dvander@768
   498
dvander@768
   499
		/**
dvander@787
   500
		 * @brief Creates a new IMenuPanel object using extended options specific
dvander@768
   501
		 * to the IMenuStyle parent.  Titles, items, etc, are not copied.
dvander@768
   502
		 *
dvander@787
   503
		 * Note: The object should be freed with IMenuPanel::DeleteThis.
dvander@768
   504
		 *
dvander@787
   505
		 * @return				IMenuPanel pointer.
dvander@768
   506
		 */
dvander@787
   507
		virtual IMenuPanel *CreatePanel() =0;
dvander@768
   508
dvander@768
   509
		/**
dvander@768
   510
		 * @brief Sends the menu to a client.
dvander@768
   511
		 *
dvander@768
   512
		 * @param client		Client index to display to.
dvander@768
   513
		 * @param time			Time to hold menu for.
dvander@1269
   514
		 * @param alt_handler	Alternate IMenuHandler.
dvander@768
   515
		 * @return				True on success, false otherwise.
dvander@768
   516
		 */
dvander@1269
   517
		virtual bool Display(int client, unsigned int time, IMenuHandler *alt_handler=NULL) =0;
dvander@768
   518
dvander@768
   519
		/**
dvander@790
   520
		 * @brief Destroys the menu and frees all associated resources.
dvander@790
   521
		 *
dvander@790
   522
		 * @param releaseHandle	If true, the Handle will be released
dvander@790
   523
		 *						in the destructor.  This should be set
dvander@790
   524
		 *						to true except for IHandleTypeDispatch
dvander@790
   525
		 *						destructors.
dvander@768
   526
		 */
dvander@790
   527
		virtual void Destroy(bool releaseHandle=true) =0;
dvander@768
   528
dvander@768
   529
		/**
dvander@768
   530
		 * @brief Cancels the menu on all client's displays.  While the menu is
dvander@768
   531
		 * being cancelled, the menu may not be re-displayed to any clients.
dvander@884
   532
		 * If a vote menu is currently active, it will be cancelled as well.
dvander@768
   533
		 *
dvander@768
   534
		 * @return				Number of menus cancelled.
dvander@768
   535
		 */
dvander@768
   536
		virtual void Cancel() =0;
dvander@790
   537
dvander@790
   538
		/**
dvander@790
   539
		 * @brief Returns the menu's Handle.  The Handle is automatically
dvander@790
   540
		 * removed when the menu is destroyed.
dvander@790
   541
		 *
dvander@790
   542
		 * @return				Handle_t handle value.
dvander@790
   543
		 */
dvander@790
   544
		virtual Handle_t GetHandle() =0;
dvander@1259
   545
		
dvander@1259
   546
		/**
dvander@1259
   547
		 * @brief Returns menu option flags.
dvander@1259
   548
		 *
dvander@1259
   549
		 * @return				Menu option flags.
dvander@1259
   550
		 */
dvander@1259
   551
		virtual unsigned int GetMenuOptionFlags() =0;
dvander@1259
   552
dvander@1259
   553
		/**
dvander@1259
   554
		 * @brief Sets menu option flags.
dvander@1259
   555
		 *
dvander@1259
   556
		 * @param flags			Menu option flags.
dvander@1259
   557
		 */
dvander@1259
   558
		virtual void SetMenuOptionFlags(unsigned int flags) =0;
dvander@1269
   559
dvander@1269
   560
		/**
dvander@1269
   561
		 * @brief Returns the menu's handler.
dvander@1269
   562
		 *
dvander@1269
   563
		 * @return				IMenuHandler of the menu.
dvander@1269
   564
		 */
dvander@1269
   565
		virtual IMenuHandler *GetHandler() =0;
dvander@768
   566
	};
dvander@768
   567
dvander@768
   568
	/** 
dvander@768
   569
	 * @brief Contains callbacks for menu actions.
dvander@768
   570
	 */
dvander@768
   571
	class IMenuHandler
dvander@768
   572
	{
dvander@768
   573
	public:
dvander@768
   574
		/**
dvander@768
   575
		 * @brief Returns the menu api verison.
dvander@768
   576
		 *
dvander@768
   577
		 * @return				Menu API version.
dvander@768
   578
		 */
dvander@768
   579
		virtual unsigned int GetMenuAPIVersion2()
dvander@768
   580
		{
dvander@768
   581
			return SMINTERFACE_MENUMANAGER_VERSION;
dvander@768
   582
		}
dvander@768
   583
dvander@768
   584
		/** 
dvander@768
   585
		 * @brief A display/selection cycle has started.
dvander@768
   586
		 *
dvander@768
   587
		 * @param menu			Menu pointer.
dvander@768
   588
		 */
dvander@768
   589
		virtual void OnMenuStart(IBaseMenu *menu)
dvander@768
   590
		{
dvander@768
   591
		}
dvander@768
   592
dvander@768
   593
		/**
dvander@768
   594
		 * @brief Called before a menu is being displayed.  This is where
dvander@768
   595
		 * you can set an alternate title on the menu.
dvander@768
   596
		 *
dvander@768
   597
		 * @param menu			Menu pointer.
dvander@768
   598
		 * @param client		Client index.
dvander@787
   599
		 * @param display		IMenuPanel pointer.
dvander@768
   600
		 */
dvander@787
   601
		virtual void OnMenuDisplay(IBaseMenu *menu, int client, IMenuPanel *display)
dvander@768
   602
		{
dvander@768
   603
		}
dvander@768
   604
dvander@768
   605
		/**
dvander@768
   606
		 * @brief Called when an item is selected.
dvander@768
   607
		 *
dvander@768
   608
		 * @param menu			Menu pointer.
dvander@768
   609
		 * @param client		Client that selected the item.
dvander@768
   610
		 * @param item			Item number.
dvander@768
   611
		 */
dvander@768
   612
		virtual void OnMenuSelect(IBaseMenu *menu, int client, unsigned int item)
dvander@768
   613
		{
dvander@768
   614
		}
dvander@768
   615
dvander@768
   616
		/**
dvander@768
   617
		 * @brief An active menu display was dropped from a client.
dvander@768
   618
		 *
dvander@768
   619
		 * @param menu			Menu pointer.
dvander@768
   620
		 * @param client		Client that had the menu.
dvander@768
   621
		 * @param reason		Menu cancellation reason.
dvander@768
   622
		 */
dvander@768
   623
		virtual void OnMenuCancel(IBaseMenu *menu, int client, MenuCancelReason reason)
dvander@768
   624
		{
dvander@768
   625
		}
dvander@768
   626
dvander@768
   627
		/**
dvander@768
   628
		 * @brief A display/selection cycle has ended.
dvander@768
   629
		 *
dvander@768
   630
		 * @param menu			Menu pointer.
dvander@768
   631
		 */
dvander@997
   632
		virtual void OnMenuEnd(IBaseMenu *menu, MenuEndReason reason)
dvander@768
   633
		{
dvander@768
   634
		}
dvander@768
   635
dvander@768
   636
		/**
dvander@790
   637
		 * @brief Called when the menu object is destroyed.
dvander@790
   638
		 *
dvander@790
   639
		 * @param menu			Menu pointer.
dvander@790
   640
		 */
dvander@790
   641
		virtual void OnMenuDestroy(IBaseMenu *menu)
dvander@790
   642
		{
dvander@790
   643
		}
dvander@790
   644
dvander@790
   645
		/**
dvander@768
   646
		 * @brief Called when requesting how to render an item.
dvander@768
   647
		 *
dvander@768
   648
		 * @param menu			Menu pointer.
dvander@768
   649
		 * @param client		Client index receiving the menu.
dvander@768
   650
		 * @param item			Item number in the menu.
dvander@768
   651
		 * @param style			ITEMSTYLE flags, by reference for modification.
dvander@768
   652
		 */
dvander@768
   653
		virtual void OnMenuDrawItem(IBaseMenu *menu, int client, unsigned int item, unsigned int &style)
dvander@768
   654
		{
dvander@768
   655
		}
dvander@768
   656
dvander@768
   657
		/**
dvander@1163
   658
		 * @brief Called when drawing item text.
dvander@768
   659
		 *
dvander@768
   660
		 * @param menu			Menu pointer.
dvander@768
   661
		 * @param client		Client index receiving the menu.
dvander@1163
   662
		 * @param panel			Panel being used to draw the menu.
dvander@768
   663
		 * @param item			Item number in the menu.
dvander@1163
   664
		 * @param dr			Item draw information.
dvander@1163
   665
		 * @return				0 to let the render algorithm decide how to draw, otherwise,
dvander@1163
   666
		 *						the return value from panel->DrawItem should be returned.
dvander@768
   667
		 */
dvander@1163
   668
		virtual unsigned int OnMenuDisplayItem(IBaseMenu *menu, 
dvander@1163
   669
											   int client, 
dvander@1163
   670
											   IMenuPanel *panel,
dvander@1163
   671
											   unsigned int item, 
dvander@1163
   672
											   const ItemDrawInfo &dr)
dvander@768
   673
		{
dvander@1163
   674
			return 0;
dvander@768
   675
		}
dvander@768
   676
dvander@768
   677
		/**
dvander@877
   678
		 * @brief Called when a vote has been started and displayed to 
dvander@877
   679
		 * clients.  This is called after OnMenuStart() and OnMenuDisplay(),
dvander@877
   680
		 * but before OnMenuSelect().
dvander@877
   681
		 *
dvander@877
   682
		 * @param menu			Menu pointer.
dvander@877
   683
		 */
dvander@877
   684
		virtual void OnMenuVoteStart(IBaseMenu *menu)
dvander@877
   685
		{
dvander@877
   686
		}
dvander@877
   687
dvander@877
   688
		/**
dvander@877
   689
		 * @brief Called when a vote ends.  This is automatically called by the 
dvander@884
   690
		 * wrapper, and never needs to called from a style implementation.  
dvander@884
   691
		 *
dvander@884
   692
		 * This function does not replace OnMenuEnd(), nor does it have the 
dvander@884
   693
		 * same meaning as OnMenuEnd(), meaning you should not destroy a menu
dvander@884
   694
		 * while it is in this function.
dvander@768
   695
		 *
dvander@768
   696
		 * @param menu			Menu pointer.
dvander@1269
   697
		 * @param results		Menu vote results.
dvander@768
   698
		 */
dvander@1269
   699
		virtual void OnMenuVoteResults(IBaseMenu *menu, const menu_vote_result_t *results)
dvander@877
   700
		{
dvander@877
   701
		}
dvander@884
   702
dvander@884
   703
		/**
dvander@884
   704
		 * @brief Called when a vote is cancelled.  If this is called, then 
dvander@1269
   705
		 * OnMenuVoteResults() will not be called.  In both cases, OnMenuEnd will 
dvander@884
   706
		 * always be called.
dvander@884
   707
		 *
dvander@884
   708
		 * @param menu			Menu pointer.
dvander@884
   709
		 */
dvander@1296
   710
		virtual void OnMenuVoteCancel(IBaseMenu *menu, VoteCancelReason reason)
dvander@884
   711
		{
dvander@884
   712
		}
dvander@877
   713
dvander@877
   714
		/**
dvander@1269
   715
		 * @brief Call to set private handler stuff.
dvander@877
   716
		 *
dvander@1269
   717
		 * @param option		Option name.
dvander@1269
   718
		 * @param data			Private data.
dvander@1269
   719
		 * @return				True if set, false if invalid or unrecognized.
dvander@877
   720
		 */
dvander@1269
   721
		virtual bool OnSetHandlerOption(const char *option, const void *data)
dvander@1269
   722
		{
dvander@1269
   723
			return false;
dvander@1269
   724
		}
dvander@768
   725
	};
dvander@768
   726
dvander@768
   727
	/**
dvander@768
   728
	 * @brief Manages menu creation and displaying.
dvander@768
   729
	 */
dvander@768
   730
	class IMenuManager : public SMInterface
dvander@768
   731
	{
dvander@768
   732
	public:
dvander@768
   733
		virtual const char *GetInterfaceName()
dvander@768
   734
		{
dvander@768
   735
			return SMINTERFACE_MENUMANAGER_NAME;
dvander@768
   736
		}
dvander@768
   737
		virtual unsigned int GetInterfaceVersion()
dvander@768
   738
		{
dvander@768
   739
			return SMINTERFACE_MENUMANAGER_VERSION;
dvander@768
   740
		}
dvander@960
   741
		virtual bool IsVersionCompatible(unsigned int version)
dvander@960
   742
		{
dvander@1296
   743
			if (version < 11 || version > GetInterfaceVersion())
dvander@960
   744
			{
dvander@960
   745
				return false;
dvander@960
   746
			}
dvander@960
   747
			return true;
dvander@960
   748
		}
dvander@768
   749
	public:
dvander@768
   750
		/**
dvander@768
   751
		 * @brief Finds a style by name.
dvander@768
   752
		 *
dvander@768
   753
		 * @param name			Name of the style (case insensitive).
dvander@768
   754
		 * @return				IMenuStyle pointer, or NULL if not found.
dvander@768
   755
		 */
dvander@768
   756
		virtual IMenuStyle *FindStyleByName(const char *name) =0;
dvander@768
   757
dvander@768
   758
		/**
dvander@768
   759
		 * @brief Returns the default draw style Core is using.
dvander@768
   760
		 *
dvander@768
   761
		 * @return				Menu style pointer.
dvander@768
   762
		 */
dvander@768
   763
		virtual IMenuStyle *GetDefaultStyle() =0;
dvander@768
   764
dvander@768
   765
		/**
dvander@1269
   766
		 * @brief Given a set of menu states, converts it to an IMenuPanel object.
dvander@768
   767
		 *
dvander@768
   768
		 * The state parameter is both INPUT and OUTPUT.
dvander@768
   769
		 * INPUT: menu, mh, firstItem, lastItem
dvander@768
   770
		 * OUTPUT: display, firstItem, lastItem, slots
dvander@768
   771
		 *
dvander@768
   772
		 * @param client		Client index.
dvander@768
   773
		 * @param states		Menu states.
dvander@1269
   774
		 * @return				IMenuPanel pointer, or NULL if no items could be 
dvander@768
   775
		 *						found in the IBaseMenu pointer, or NULL if any
dvander@768
   776
		 *						other error occurred.  Any valid pointer must
dvander@787
   777
		 *						be freed using IMenuPanel::DeleteThis.
dvander@768
   778
		 */
dvander@787
   779
		virtual IMenuPanel *RenderMenu(int client, menu_states_t &states, ItemOrder order) =0;
dvander@877
   780
dvander@877
   781
		/**
dvander@1269
   782
		 * @brief Cancels a menu.  Calls IBaseMenu::Cancel() after doing some preparatory 
dvander@1269
   783
		 * work.  This should always be used instead of directly calling Cancel().
dvander@877
   784
		 *
dvander@1269
   785
		 * @param menu			IBaseMenu pointer.
dvander@877
   786
		 */
dvander@1269
   787
		virtual void CancelMenu(IBaseMenu *menu) =0;
dvander@877
   788
dvander@877
   789
		/**
dvander@1269
   790
		 * @brief Displays a menu as a vote.
dvander@877
   791
		 *
dvander@1269
   792
		 * @param menu			IBaseMenu pointer.
dvander@1269
   793
		 * @param num_clients	Number of clients to display to.
dvander@1269
   794
		 * @param clients		Client index array.
dvander@1269
   795
		 * @param max_time		Maximum time to hold menu for.
dvander@1269
   796
		 * @param flags			Vote flags (currently unused).
dvander@1269
   797
		 * @return				True on success, false if a vote is in progress.
dvander@877
   798
		 */
dvander@1269
   799
		virtual bool StartVote(IBaseMenu *menu,
dvander@1269
   800
								unsigned int num_clients,
dvander@1269
   801
								int clients[],
dvander@1269
   802
								unsigned int max_time,
dvander@1269
   803
								unsigned int flags=0) =0;
dvander@1269
   804
dvander@1269
   805
		/**
dvander@1269
   806
		 * @brief Returns whether or not a vote is in progress.
dvander@1269
   807
		 *
dvander@1269
   808
		 * @return				True if a vote is in progress, false otherwise.
dvander@1269
   809
		 */
dvander@1269
   810
		virtual bool IsVoteInProgress() =0;
dvander@1269
   811
dvander@1269
   812
		/**
dvander@1269
   813
		 * @brief Cancels the vote in progress.  This calls IBaseMenu::Cancel().
dvander@1269
   814
		 */
dvander@1269
   815
		virtual void CancelVoting() =0;
dvander@1291
   816
dvander@1291
   817
		/**
dvander@1291
   818
		 * @brief Returns the remaining vote delay from the last menu.  This delay is 
dvander@1291
   819
		 * a suggestion for all public votes, and is not enforced.
dvander@1291
   820
		 *
dvander@1291
   821
		 * @return				Number of seconds to wait.
dvander@1291
   822
		 */
dvander@1291
   823
		virtual unsigned int GetRemainingVoteDelay() =0;
dvander@768
   824
	};
dvander@768
   825
}
dvander@768
   826
dvander@768
   827
#endif //_INCLUDE_SOURCEMOD_MENU_SYSTEM_H_