You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
252 lines
6.7 KiB
252 lines
6.7 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include <vgui/IInput.h> |
|
#include <vgui/IPanel.h> |
|
#include <vgui/IScheme.h> |
|
#include <vgui/IBorder.h> |
|
#include <vgui/ISurface.h> |
|
#include <vgui/KeyCode.h> |
|
#include <KeyValues.h> |
|
|
|
#include <vgui_controls/MenuBar.h> |
|
#include <vgui_controls/MenuButton.h> |
|
#include <vgui_controls/Label.h> |
|
#include <vgui_controls/Controls.h> |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include <tier0/memdbgon.h> |
|
|
|
using namespace vgui; |
|
|
|
|
|
enum |
|
{ |
|
MENUBARINDENT = 4, // indent from top and bottom of panel. |
|
}; |
|
|
|
DECLARE_BUILD_FACTORY( MenuBar ); |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Constructor |
|
//----------------------------------------------------------------------------- |
|
MenuBar::MenuBar(Panel *parent, const char *panelName) : |
|
Panel(parent, panelName), |
|
m_nRightEdge( 0 ) |
|
{ |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Destructor |
|
//----------------------------------------------------------------------------- |
|
MenuBar::~MenuBar() |
|
{ |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void MenuBar::AddButton(MenuButton *button) |
|
{ |
|
button->SetParent(this); |
|
button->AddActionSignalTarget(this); |
|
m_pMenuButtons.AddToTail(button); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// This will add the menu to the menu bar |
|
//----------------------------------------------------------------------------- |
|
void MenuBar::AddMenu( const char *pButtonName, Menu *pMenu ) |
|
{ |
|
MenuButton *pMenuButton = new MenuButton(this, pButtonName, pButtonName); |
|
pMenuButton->SetMenu(pMenu); |
|
AddButton(pMenuButton); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Handle key presses, Activate shortcuts |
|
//----------------------------------------------------------------------------- |
|
void MenuBar::OnKeyCodeTyped(KeyCode code) |
|
{ |
|
switch(code) |
|
{ |
|
case KEY_RIGHT: |
|
{ |
|
// iterate the menu items looking for one that is open |
|
// if we find one open, open the one to the right |
|
for (int i = 0; i < m_pMenuButtons.Count() - 1; i++) |
|
{ |
|
MenuButton *panel = m_pMenuButtons[i]; |
|
if (panel->IsDepressed()) |
|
{ |
|
m_pMenuButtons[i]->DoClick(); |
|
m_pMenuButtons[i+1]->DoClick(); |
|
break; |
|
} |
|
} |
|
break; |
|
} |
|
case KEY_LEFT: |
|
{ |
|
// iterate the menu items looking for one that is open |
|
// if we find one open, open the one to the left |
|
for (int i = 1; i < m_pMenuButtons.Count(); i++) |
|
{ |
|
MenuButton *panel = m_pMenuButtons[i]; |
|
if (panel->IsDepressed()) |
|
{ |
|
m_pMenuButtons[i]->DoClick(); |
|
m_pMenuButtons[i-1]->DoClick(); |
|
break; |
|
} |
|
} |
|
break; |
|
} |
|
default: |
|
{ |
|
break; |
|
} |
|
} |
|
|
|
// don't chain back |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Handle key presses, Activate shortcuts |
|
// Input : code - |
|
//----------------------------------------------------------------------------- |
|
void MenuBar::OnKeyTyped(wchar_t unichar) |
|
{ |
|
if (unichar) |
|
{ |
|
// iterate the menu items looking for one with the matching hotkey |
|
for (int i = 0; i < m_pMenuButtons.Count(); i++) |
|
{ |
|
MenuButton *panel = m_pMenuButtons[i]; |
|
if (panel->IsVisible()) |
|
{ |
|
Panel *hot = panel->HasHotkey(unichar); |
|
if (hot) |
|
{ |
|
// post a message to the menuitem telling it it's hotkey was pressed |
|
PostMessage(hot, new KeyValues("Hotkey")); |
|
return; |
|
} |
|
} |
|
} |
|
} |
|
|
|
// don't chain back |
|
} |
|
|
|
void MenuBar::Paint() |
|
{ |
|
IScheme *pScheme = scheme()->GetIScheme( GetScheme() ); |
|
for ( int i = 0; i < m_pMenuButtons.Count(); i++) |
|
{ |
|
if (!m_pMenuButtons[i]->IsArmed()) |
|
m_pMenuButtons[i]->SetDefaultBorder(NULL); |
|
else |
|
{ |
|
m_pMenuButtons[i]->SetDefaultBorder(pScheme->GetBorder( "ButtonBorder")); |
|
} |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Message map |
|
//----------------------------------------------------------------------------- |
|
void MenuBar::ApplySchemeSettings(IScheme *pScheme) |
|
{ |
|
BaseClass::ApplySchemeSettings(pScheme); |
|
|
|
// get the borders we need |
|
SetBorder(pScheme->GetBorder("ButtonBorder")); |
|
|
|
// get the background color |
|
SetBgColor(pScheme->GetColor( "MenuBar.BgColor", GetBgColor() )); |
|
|
|
} |
|
|
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Reformat according to the new layout |
|
//----------------------------------------------------------------------------- |
|
void MenuBar::PerformLayout() |
|
{ |
|
int nBarWidth, nBarHeight; |
|
GetSize( nBarWidth, nBarHeight ); |
|
|
|
// Now position + resize all buttons |
|
int x = MENUBARINDENT; |
|
for ( int i = 0; i < m_pMenuButtons.Count(); ++i ) |
|
{ |
|
int nWide, nTall; |
|
|
|
m_pMenuButtons[i]->GetContentSize(nWide, nTall); |
|
m_pMenuButtons[i]->SetPos( x, MENUBARINDENT ); |
|
m_pMenuButtons[i]->SetSize( nWide + Label::Content, nBarHeight - 2 * MENUBARINDENT ); |
|
|
|
x += nWide + MENUBARINDENT; |
|
} |
|
|
|
m_nRightEdge = x; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Get the size of the menus in the bar (so other children can be added to menu bar) |
|
// Input : w - |
|
// int&h - |
|
//----------------------------------------------------------------------------- |
|
void MenuBar::GetContentSize( int& w, int&h ) |
|
{ |
|
w = m_nRightEdge + 2; |
|
h = GetTall(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Message map |
|
//----------------------------------------------------------------------------- |
|
void MenuBar::OnMenuClose() |
|
{ |
|
RequestFocus(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Message map |
|
//----------------------------------------------------------------------------- |
|
void MenuBar::OnCursorEnteredMenuButton(int VPanel) |
|
{ |
|
VPANEL menuButton = (VPANEL)VPanel; |
|
// see if we had a menu open |
|
for ( int i = 0; i < m_pMenuButtons.Count(); i++) |
|
{ |
|
// one of our buttons was pressed. |
|
if (m_pMenuButtons[i]->IsDepressed()) |
|
{ |
|
int oldbutton = i; |
|
// now see if menuButton is one of ours. |
|
for ( int j = 0; j < m_pMenuButtons.Count(); j++) |
|
{ |
|
MenuButton *button = static_cast<MenuButton *>(ipanel()->GetPanel(menuButton, GetModuleName())); |
|
// it is one of ours. |
|
if ( button == m_pMenuButtons[j]) |
|
{ |
|
// if its a different button than the one we already had open, |
|
if (j != oldbutton) |
|
{ |
|
// close this menu and open the one we just entered |
|
m_pMenuButtons[oldbutton]->DoClick(); |
|
button->DoClick(); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
}
|
|
|