core/MenuStyle_Base.cpp
author David Anderson <dvander@alliedmods.net>
Sun May 13 17:12:16 2007 +0000 (2007-05-13)
changeset 785 bca431afd754
parent 782 ac8df776d0e4
child 787 52283fe61d42
permissions -rw-r--r--
finished radio menus
added a new item flag so radio menus could ignore disabled control items due to a bug where 0 is always white in Valve menus
fixed a bug where ClientPressedKey() did not account for the max page items in a style
fixed some pagination drawing bugs with control items
dvander@769
     1
/**
dvander@769
     2
 * vim: set ts=4 :
dvander@769
     3
 * ===============================================================
dvander@769
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@769
     5
 * ===============================================================
dvander@769
     6
 *
dvander@769
     7
 * This file is not open source and may not be copied without explicit
dvander@769
     8
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@769
     9
 * in whole or significant part.
dvander@769
    10
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@769
    11
 *
dvander@769
    12
 * Version: $Id$
dvander@769
    13
 */
dvander@771
    14
dvander@769
    15
#include <stdarg.h>
dvander@769
    16
#include "sm_stringutil.h"
dvander@769
    17
#include "MenuStyle_Base.h"
dvander@775
    18
#include "PlayerManager.h"
dvander@775
    19
#include "MenuManager.h"
dvander@775
    20
dvander@775
    21
BaseMenuStyle::BaseMenuStyle() : m_WatchList(256)
dvander@775
    22
{
dvander@775
    23
}
dvander@775
    24
dvander@775
    25
void BaseMenuStyle::AddClientToWatch(int client)
dvander@775
    26
{
dvander@775
    27
	m_WatchList.push_back(client);
dvander@775
    28
}
dvander@775
    29
dvander@775
    30
void BaseMenuStyle::RemoveClientFromWatch(int client)
dvander@775
    31
{
dvander@775
    32
	m_WatchList.remove(client);
dvander@775
    33
}
dvander@775
    34
dvander@775
    35
void BaseMenuStyle::_CancelClientMenu(int client, bool bAutoIgnore/* =false */, MenuCancelReason reason/* =MenuCancel_Interrupt */)
dvander@775
    36
{
dvander@775
    37
	CBaseMenuPlayer *player = GetMenuPlayer(client);
dvander@775
    38
	menu_states_t &states = player->states;
dvander@775
    39
dvander@775
    40
	bool bOldIgnore = player->bAutoIgnore;
dvander@775
    41
	if (bAutoIgnore)
dvander@775
    42
	{
dvander@775
    43
		player->bAutoIgnore = true;
dvander@775
    44
	}
dvander@775
    45
dvander@775
    46
	/* Save states */
dvander@775
    47
	IMenuHandler *mh = states.mh;
dvander@775
    48
	IBaseMenu *menu = states.menu;
dvander@775
    49
dvander@775
    50
	/* Clear menu */
dvander@775
    51
	player->bInMenu = false;
dvander@775
    52
	if (player->menuHoldTime)
dvander@775
    53
	{
dvander@775
    54
		RemoveClientFromWatch(client);
dvander@775
    55
	}
dvander@775
    56
dvander@775
    57
	/* Fire callbacks */
dvander@775
    58
	mh->OnMenuCancel(menu, client, reason);
dvander@775
    59
	mh->OnMenuEnd(menu);
dvander@775
    60
dvander@775
    61
	if (bAutoIgnore)
dvander@775
    62
	{
dvander@775
    63
		player->bAutoIgnore = bOldIgnore;
dvander@775
    64
	}
dvander@775
    65
}
dvander@775
    66
dvander@775
    67
void BaseMenuStyle::CancelMenu(CBaseMenu *menu)
dvander@775
    68
{
dvander@775
    69
	int maxClients = g_Players.GetMaxClients();
dvander@775
    70
	for (int i=1; i<=maxClients; i++)
dvander@775
    71
	{
dvander@775
    72
		CBaseMenuPlayer *player = GetMenuPlayer(i);
dvander@775
    73
		if (player->bInMenu)
dvander@775
    74
		{
dvander@775
    75
			menu_states_t &states = player->states;
dvander@775
    76
			if (states.menu == menu)
dvander@775
    77
			{
dvander@775
    78
				_CancelClientMenu(i);
dvander@775
    79
			}
dvander@775
    80
		}
dvander@775
    81
	}
dvander@775
    82
}
dvander@775
    83
dvander@775
    84
bool BaseMenuStyle::CancelClientMenu(int client, bool autoIgnore)
dvander@775
    85
{
dvander@775
    86
	if (client < 1 || client > g_Players.MaxClients())
dvander@775
    87
	{
dvander@775
    88
		return false;
dvander@775
    89
	}
dvander@775
    90
dvander@775
    91
	CBaseMenuPlayer *player = GetMenuPlayer(client);
dvander@775
    92
	if (!player->bInMenu)
dvander@775
    93
	{
dvander@775
    94
		return false;
dvander@775
    95
	}
dvander@775
    96
dvander@775
    97
	_CancelClientMenu(client, autoIgnore);
dvander@775
    98
dvander@775
    99
	return true;
dvander@775
   100
}
dvander@775
   101
dvander@775
   102
MenuSource BaseMenuStyle::GetClientMenu(int client, void **object)
dvander@775
   103
{
dvander@775
   104
	if (client < 1 || client > g_Players.GetMaxClients())
dvander@775
   105
	{
dvander@775
   106
		return MenuSource_None;
dvander@775
   107
	}
dvander@775
   108
dvander@775
   109
	CBaseMenuPlayer *player = GetMenuPlayer(client);
dvander@775
   110
dvander@775
   111
	if (player->bInMenu)
dvander@775
   112
	{
dvander@775
   113
		IBaseMenu *menu;
dvander@775
   114
		if ((menu=player->states.menu) != NULL)
dvander@775
   115
		{
dvander@775
   116
			if (object)
dvander@775
   117
			{
dvander@775
   118
				*object = menu;
dvander@775
   119
			}
dvander@775
   120
			return MenuSource_BaseMenu;
dvander@775
   121
		}
dvander@775
   122
dvander@775
   123
		return MenuSource_Display;
dvander@780
   124
	} else if (player->bInExternMenu) {
dvander@782
   125
		if (player->menuHoldTime != 0
dvander@782
   126
			&& (gpGlobals->curtime > player->menuStartTime + player->menuHoldTime))
dvander@782
   127
		{
dvander@782
   128
			player->bInExternMenu = false;
dvander@782
   129
			return MenuSource_None;
dvander@782
   130
		}
dvander@780
   131
		return MenuSource_External;
dvander@775
   132
	}
dvander@775
   133
dvander@775
   134
	return MenuSource_None;
dvander@775
   135
}
dvander@775
   136
dvander@775
   137
void BaseMenuStyle::OnClientDisconnected(int client)
dvander@775
   138
{
dvander@775
   139
	CBaseMenuPlayer *player = GetMenuPlayer(client);
dvander@775
   140
	if (!player->bInMenu)
dvander@775
   141
	{
dvander@775
   142
		return;
dvander@775
   143
	}
dvander@775
   144
dvander@775
   145
	_CancelClientMenu(client, true, MenuCancel_Disconnect);
dvander@775
   146
dvander@775
   147
	player->bInMenu = false;
dvander@775
   148
}
dvander@775
   149
dvander@775
   150
static int do_lookup[256];
dvander@775
   151
void BaseMenuStyle::ProcessWatchList()
dvander@775
   152
{
dvander@775
   153
	if (!m_WatchList.size())
dvander@775
   154
	{
dvander@775
   155
		return;
dvander@775
   156
	}
dvander@775
   157
dvander@775
   158
	unsigned int total = 0;
dvander@775
   159
	for (FastLink<int>::iterator iter=m_WatchList.begin(); iter!=m_WatchList.end(); ++iter)
dvander@775
   160
	{
dvander@775
   161
		do_lookup[total++] = (*iter);
dvander@775
   162
	}
dvander@775
   163
dvander@775
   164
	int client;
dvander@775
   165
	CBaseMenuPlayer *player;
dvander@775
   166
	float curTime = gpGlobals->curtime;
dvander@775
   167
	for (unsigned int i=0; i<total; i++)
dvander@775
   168
	{
dvander@775
   169
		client = do_lookup[i];
dvander@775
   170
		player = GetMenuPlayer(client);
dvander@775
   171
		if (!player->bInMenu || !player->menuHoldTime)
dvander@775
   172
		{
dvander@775
   173
			m_WatchList.remove(i);
dvander@775
   174
			continue;
dvander@775
   175
		}
dvander@775
   176
		if (curTime > player->menuStartTime + player->menuHoldTime)
dvander@775
   177
		{
dvander@775
   178
			_CancelClientMenu(client, false);
dvander@775
   179
		}
dvander@775
   180
	}
dvander@775
   181
}
dvander@775
   182
dvander@775
   183
void BaseMenuStyle::ClientPressedKey(int client, unsigned int key_press)
dvander@775
   184
{
dvander@775
   185
	CBaseMenuPlayer *player = GetMenuPlayer(client);
dvander@775
   186
dvander@775
   187
	/* First question: Are we in a menu? */
dvander@775
   188
	if (!player->bInMenu)
dvander@775
   189
	{
dvander@775
   190
		return;
dvander@775
   191
	}
dvander@775
   192
dvander@775
   193
	bool cancel = false;
dvander@775
   194
	unsigned int item = 0;
dvander@775
   195
	MenuCancelReason reason = MenuCancel_Exit;
dvander@775
   196
	menu_states_t &states = player->states;
dvander@775
   197
dvander@775
   198
	assert(states.mh != NULL);
dvander@775
   199
dvander@775
   200
	if (states.menu == NULL)
dvander@775
   201
	{
dvander@775
   202
		item = key_press;
dvander@785
   203
	} else if (key_press < 1 || key_press > GetMaxPageItems()) {
dvander@775
   204
		cancel = true;
dvander@775
   205
	} else {
dvander@775
   206
		ItemSelection type = states.slots[key_press].type;
dvander@775
   207
dvander@775
   208
		/* For navigational items, we're going to redisplay */
dvander@775
   209
		if (type == ItemSel_Back)
dvander@775
   210
		{
dvander@775
   211
			if (!RedoClientMenu(client, ItemOrder_Descending))
dvander@775
   212
			{
dvander@775
   213
				cancel = true;
dvander@775
   214
				reason = MenuCancel_NoDisplay;
dvander@775
   215
			} else {
dvander@775
   216
				return;
dvander@775
   217
			}
dvander@775
   218
		} else if (type == ItemSel_Next) {
dvander@775
   219
			if (!RedoClientMenu(client, ItemOrder_Ascending))
dvander@775
   220
			{
dvander@775
   221
				cancel = true;						/* I like Saltines. */
dvander@775
   222
				reason = MenuCancel_NoDisplay;
dvander@775
   223
			} else {
dvander@775
   224
				return;
dvander@775
   225
			}
dvander@775
   226
		} else if (type == ItemSel_Exit || type == ItemSel_None) {
dvander@775
   227
			cancel = true;
dvander@775
   228
		} else {
dvander@775
   229
			item = states.slots[key_press].item;
dvander@775
   230
		}
dvander@775
   231
	}
dvander@775
   232
dvander@775
   233
	/* Save variables */
dvander@775
   234
	IMenuHandler *mh = states.mh;
dvander@775
   235
	IBaseMenu *menu = states.menu;
dvander@775
   236
dvander@775
   237
	/* Clear states */
dvander@775
   238
	player->bInMenu = false;
dvander@775
   239
	if (player->menuHoldTime)
dvander@775
   240
	{
dvander@775
   241
		m_WatchList.remove(client);
dvander@775
   242
	}
dvander@775
   243
dvander@775
   244
	if (cancel)
dvander@775
   245
	{
dvander@775
   246
		mh->OnMenuCancel(menu, client, reason);
dvander@775
   247
	} else {
dvander@775
   248
		mh->OnMenuSelect(menu, client, item);
dvander@775
   249
	}
dvander@775
   250
dvander@775
   251
	mh->OnMenuEnd(menu);
dvander@775
   252
}
dvander@775
   253
dvander@775
   254
bool BaseMenuStyle::DoClientMenu(int client, IMenuDisplay *menu, IMenuHandler *mh, unsigned int time)
dvander@775
   255
{
dvander@775
   256
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@775
   257
	if (!pPlayer || pPlayer->IsFakeClient() || !pPlayer->IsInGame())
dvander@775
   258
	{
dvander@775
   259
		return false;
dvander@775
   260
	}
dvander@775
   261
dvander@775
   262
	CBaseMenuPlayer *player = GetMenuPlayer(client);
dvander@775
   263
	if (player->bAutoIgnore)
dvander@775
   264
	{
dvander@775
   265
		return false;
dvander@775
   266
	}
dvander@775
   267
dvander@775
   268
	/* For the duration of this, we are going to totally ignore whether
dvander@775
   269
	* the player is already in a menu or not (except to cancel the old one).
dvander@775
   270
	* Instead, we are simply going to ignore any further menu displays, so
dvander@775
   271
	* this display can't be interrupted.
dvander@775
   272
	*/
dvander@775
   273
	player->bAutoIgnore = true;
dvander@775
   274
dvander@775
   275
	/* Cancel any old menus */
dvander@775
   276
	menu_states_t &states = player->states;
dvander@775
   277
	if (player->bInMenu)
dvander@775
   278
	{
dvander@775
   279
		/* We need to cancel the old menu */
dvander@775
   280
		if (player->menuHoldTime)
dvander@775
   281
		{
dvander@775
   282
			RemoveClientFromWatch(client);
dvander@775
   283
		}
dvander@775
   284
		states.mh->OnMenuCancel(states.menu, client, MenuCancel_Interrupt);
dvander@775
   285
		states.mh->OnMenuEnd(states.menu);
dvander@775
   286
	}
dvander@775
   287
dvander@775
   288
	states.firstItem = 0;
dvander@775
   289
	states.lastItem = 0;
dvander@775
   290
	states.menu = NULL;
dvander@775
   291
	states.mh = mh;
dvander@775
   292
	states.apiVers = SMINTERFACE_MENUMANAGER_VERSION;
dvander@775
   293
	player->bInMenu = true;
dvander@775
   294
	player->menuStartTime = gpGlobals->curtime;
dvander@775
   295
	player->menuHoldTime = time;
dvander@775
   296
dvander@775
   297
	if (time)
dvander@775
   298
	{
dvander@775
   299
		AddClientToWatch(client);
dvander@775
   300
	}
dvander@775
   301
dvander@775
   302
	/* Draw the display */
dvander@775
   303
	SendDisplay(client, menu);
dvander@775
   304
dvander@775
   305
	/* We can be interrupted again! */
dvander@775
   306
	player->bAutoIgnore = false;
dvander@775
   307
dvander@775
   308
	return true;
dvander@775
   309
}
dvander@775
   310
dvander@775
   311
bool BaseMenuStyle::DoClientMenu(int client, CBaseMenu *menu, IMenuHandler *mh, unsigned int time)
dvander@775
   312
{
dvander@775
   313
	mh->OnMenuStart(menu);
dvander@775
   314
dvander@775
   315
	if (!mh)
dvander@775
   316
	{
dvander@775
   317
		mh->OnMenuCancel(menu, client, MenuCancel_NoDisplay);
dvander@775
   318
		mh->OnMenuEnd(menu);
dvander@775
   319
		return false;
dvander@775
   320
	}
dvander@775
   321
dvander@775
   322
	CPlayer *pPlayer = g_Players.GetPlayerByIndex(client);
dvander@775
   323
	if (!pPlayer || pPlayer->IsFakeClient() || !pPlayer->IsInGame())
dvander@775
   324
	{
dvander@775
   325
		mh->OnMenuCancel(menu, client, MenuCancel_NoDisplay);
dvander@775
   326
		mh->OnMenuEnd(menu);
dvander@775
   327
		return false;
dvander@775
   328
	}
dvander@775
   329
dvander@775
   330
	CBaseMenuPlayer *player = GetMenuPlayer(client);
dvander@775
   331
	if (player->bAutoIgnore)
dvander@775
   332
	{
dvander@775
   333
		mh->OnMenuCancel(menu, client, MenuCancel_NoDisplay);
dvander@775
   334
		mh->OnMenuEnd(menu);
dvander@775
   335
		return false;
dvander@775
   336
	}
dvander@775
   337
dvander@775
   338
	/* For the duration of this, we are going to totally ignore whether
dvander@775
   339
	* the player is already in a menu or not (except to cancel the old one).
dvander@775
   340
	* Instead, we are simply going to ignore any further menu displays, so
dvander@775
   341
	* this display can't be interrupted.
dvander@775
   342
	*/
dvander@775
   343
	player->bAutoIgnore = true;
dvander@775
   344
dvander@775
   345
	/* Cancel any old menus */
dvander@775
   346
	menu_states_t &states = player->states;
dvander@775
   347
	if (player->bInMenu)
dvander@775
   348
	{
dvander@775
   349
		_CancelClientMenu(client, true);
dvander@775
   350
	}
dvander@775
   351
dvander@775
   352
	states.firstItem = 0;
dvander@775
   353
	states.lastItem = 0;
dvander@775
   354
	states.menu = menu;
dvander@775
   355
	states.mh = mh;
dvander@775
   356
	states.apiVers = SMINTERFACE_MENUMANAGER_VERSION;
dvander@775
   357
dvander@775
   358
	IMenuDisplay *display = g_Menus.RenderMenu(client, states, ItemOrder_Ascending);
dvander@775
   359
	if (!display)
dvander@775
   360
	{
dvander@775
   361
		player->bAutoIgnore = false;
dvander@775
   362
		player->bInMenu = false;
dvander@775
   363
		mh->OnMenuCancel(menu, client, MenuCancel_NoDisplay);
dvander@775
   364
		mh->OnMenuEnd(menu);
dvander@775
   365
		return false;
dvander@775
   366
	}
dvander@775
   367
dvander@775
   368
	/* Finally, set our states */
dvander@775
   369
	player->bInMenu = true;
dvander@775
   370
	player->menuStartTime = gpGlobals->curtime;
dvander@775
   371
	player->menuHoldTime = time;
dvander@775
   372
dvander@775
   373
	if (time)
dvander@775
   374
	{
dvander@775
   375
		AddClientToWatch(client);
dvander@775
   376
	}
dvander@775
   377
dvander@775
   378
	/* Draw the display */
dvander@775
   379
	SendDisplay(client, display);
dvander@775
   380
dvander@775
   381
	/* Free the display pointer */
dvander@776
   382
	display->DeleteThis();
dvander@775
   383
dvander@775
   384
	/* We can be interrupted again! */
dvander@775
   385
	player->bAutoIgnore = false;
dvander@775
   386
dvander@775
   387
	return true;
dvander@775
   388
}
dvander@775
   389
dvander@775
   390
bool BaseMenuStyle::RedoClientMenu(int client, ItemOrder order)
dvander@775
   391
{
dvander@775
   392
	CBaseMenuPlayer *player = GetMenuPlayer(client);
dvander@775
   393
	menu_states_t &states = player->states;
dvander@775
   394
dvander@775
   395
	player->bAutoIgnore = true;
dvander@775
   396
	IMenuDisplay *display = g_Menus.RenderMenu(client, states, order);
dvander@775
   397
	if (!display)
dvander@775
   398
	{
dvander@775
   399
		if (player->menuHoldTime)
dvander@775
   400
		{
dvander@775
   401
			m_WatchList.remove(client);
dvander@775
   402
		}
dvander@775
   403
		player->bAutoIgnore = false;
dvander@775
   404
		return false;
dvander@775
   405
	}
dvander@775
   406
dvander@775
   407
	SendDisplay(client, display);
dvander@775
   408
dvander@776
   409
	display->DeleteThis();
dvander@775
   410
dvander@775
   411
	player->bAutoIgnore = false;
dvander@775
   412
dvander@775
   413
	return true;
dvander@775
   414
}
dvander@769
   415
dvander@769
   416
CBaseMenu::CBaseMenu(IMenuStyle *pStyle) : 
dvander@775
   417
m_pStyle(pStyle), m_Strings(512), m_Pagination(7), m_ExitButton(true), m_bShouldDelete(false), m_bCancelling(false)
dvander@769
   418
{
dvander@769
   419
}
dvander@769
   420
dvander@769
   421
CBaseMenu::~CBaseMenu()
dvander@769
   422
{
dvander@769
   423
}
dvander@769
   424
dvander@769
   425
bool CBaseMenu::AppendItem(const char *info, const ItemDrawInfo &draw)
dvander@769
   426
{
dvander@778
   427
	if (m_Pagination == (unsigned)MENU_NO_PAGINATION
dvander@769
   428
		&& m_items.size() >= m_pStyle->GetMaxPageItems())
dvander@769
   429
	{
dvander@769
   430
		return false;
dvander@769
   431
	}
dvander@769
   432
dvander@769
   433
	CItem item;
dvander@769
   434
dvander@769
   435
	item.infoString = m_Strings.AddString(info);
dvander@769
   436
	if (draw.display)
dvander@769
   437
	{
dvander@769
   438
		item.displayString = m_Strings.AddString(draw.display);
dvander@769
   439
	}
dvander@769
   440
	item.style = draw.style;
dvander@769
   441
dvander@769
   442
dvander@769
   443
	m_items.push_back(item);
dvander@769
   444
dvander@769
   445
	return true;
dvander@769
   446
}
dvander@769
   447
dvander@769
   448
bool CBaseMenu::InsertItem(unsigned int position, const char *info, const ItemDrawInfo &draw)
dvander@769
   449
{
dvander@778
   450
	if (m_Pagination == (unsigned)MENU_NO_PAGINATION
dvander@769
   451
		&& m_items.size() >= m_pStyle->GetMaxPageItems())
dvander@769
   452
	{
dvander@769
   453
		return false;
dvander@769
   454
	}
dvander@769
   455
dvander@769
   456
	if (position >= m_items.size())
dvander@769
   457
	{
dvander@769
   458
		return false;
dvander@769
   459
	}
dvander@769
   460
dvander@769
   461
	CItem item;
dvander@769
   462
	item.infoString = m_Strings.AddString(info);
dvander@769
   463
	if (draw.display)
dvander@769
   464
	{
dvander@769
   465
		item.displayString = m_Strings.AddString(draw.display);
dvander@769
   466
	}
dvander@769
   467
	item.style = draw.style;
dvander@769
   468
dvander@769
   469
	CVector<CItem>::iterator iter = m_items.iterAt(position);
dvander@769
   470
	m_items.insert(iter, item);
dvander@769
   471
dvander@769
   472
	return true;
dvander@769
   473
}
dvander@769
   474
dvander@769
   475
bool CBaseMenu::RemoveItem(unsigned int position)
dvander@769
   476
{
dvander@769
   477
	if (position >= m_items.size())
dvander@769
   478
	{
dvander@769
   479
		return false;
dvander@769
   480
	}
dvander@769
   481
dvander@769
   482
	m_items.erase(m_items.iterAt(position));
dvander@769
   483
dvander@769
   484
	if (m_items.size() == 0)
dvander@769
   485
	{
dvander@769
   486
		m_Strings.Reset();
dvander@769
   487
	}
dvander@769
   488
dvander@769
   489
	return true;
dvander@769
   490
}
dvander@769
   491
dvander@769
   492
void CBaseMenu::RemoveAllItems()
dvander@769
   493
{
dvander@769
   494
	m_items.clear();
dvander@769
   495
	m_Strings.Reset();
dvander@769
   496
}
dvander@769
   497
dvander@769
   498
const char *CBaseMenu::GetItemInfo(unsigned int position, ItemDrawInfo *draw/* =NULL */)
dvander@769
   499
{
dvander@769
   500
	if (position >= m_items.size())
dvander@769
   501
	{
dvander@769
   502
		return NULL;
dvander@769
   503
	}
dvander@769
   504
dvander@769
   505
	if (draw)
dvander@769
   506
	{
dvander@769
   507
		draw->display = m_Strings.GetString(m_items[position].displayString);
dvander@769
   508
		draw->style = m_items[position].style;
dvander@769
   509
	}
dvander@769
   510
dvander@769
   511
	return m_Strings.GetString(m_items[position].infoString);
dvander@769
   512
}
dvander@769
   513
dvander@769
   514
unsigned int CBaseMenu::GetItemCount()
dvander@769
   515
{
dvander@769
   516
	return m_items.size();
dvander@769
   517
}
dvander@769
   518
dvander@769
   519
bool CBaseMenu::SetPagination(unsigned int itemsPerPage)
dvander@769
   520
{
dvander@769
   521
	if (itemsPerPage > 7)
dvander@769
   522
	{
dvander@769
   523
		return false;
dvander@769
   524
	}
dvander@769
   525
dvander@769
   526
	m_Pagination = itemsPerPage;
dvander@769
   527
dvander@769
   528
	return true;
dvander@769
   529
}
dvander@769
   530
dvander@769
   531
unsigned int CBaseMenu::GetPagination()
dvander@769
   532
{
dvander@769
   533
	return m_Pagination;
dvander@769
   534
}
dvander@769
   535
dvander@769
   536
IMenuStyle *CBaseMenu::GetDrawStyle()
dvander@769
   537
{
dvander@769
   538
	return m_pStyle;
dvander@769
   539
}
dvander@769
   540
dvander@769
   541
void CBaseMenu::SetDefaultTitle(const char *message)
dvander@769
   542
{
dvander@769
   543
	m_Title.assign(message);
dvander@769
   544
}
dvander@769
   545
dvander@769
   546
const char *CBaseMenu::GetDefaultTitle()
dvander@769
   547
{
dvander@769
   548
	return m_Title.c_str();
dvander@769
   549
}
dvander@769
   550
dvander@769
   551
bool CBaseMenu::GetExitButton()
dvander@769
   552
{
dvander@769
   553
	return m_ExitButton;
dvander@769
   554
}
dvander@769
   555
dvander@769
   556
bool CBaseMenu::SetExitButton(bool set)
dvander@769
   557
{
dvander@769
   558
	m_ExitButton = set;
dvander@769
   559
	return true;
dvander@769
   560
}
dvander@775
   561
dvander@775
   562
void CBaseMenu::Cancel()
dvander@775
   563
{
dvander@775
   564
	if (m_bCancelling)
dvander@775
   565
	{
dvander@775
   566
		return;
dvander@775
   567
	}
dvander@775
   568
dvander@775
   569
	m_bCancelling = true;
dvander@775
   570
	Cancel_Finally();
dvander@775
   571
	m_bCancelling = false;
dvander@775
   572
dvander@775
   573
	if (m_bShouldDelete)
dvander@775
   574
	{
dvander@775
   575
		delete this;
dvander@775
   576
	}
dvander@775
   577
}
dvander@775
   578
dvander@775
   579
void CBaseMenu::Destroy()
dvander@775
   580
{
dvander@775
   581
	if (!m_bCancelling || m_bShouldDelete)
dvander@775
   582
	{
dvander@775
   583
		Cancel();
dvander@775
   584
		delete this;
dvander@775
   585
	} else {
dvander@775
   586
		m_bShouldDelete = true;
dvander@775
   587
	}
dvander@775
   588
}
dvander@775
   589