aboutsummaryrefslogtreecommitdiff
path: root/mp/src/vgui2/vgui_controls/MenuBar.cpp
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /mp/src/vgui2/vgui_controls/MenuBar.cpp
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/vgui2/vgui_controls/MenuBar.cpp')
-rw-r--r--mp/src/vgui2/vgui_controls/MenuBar.cpp252
1 files changed, 252 insertions, 0 deletions
diff --git a/mp/src/vgui2/vgui_controls/MenuBar.cpp b/mp/src/vgui2/vgui_controls/MenuBar.cpp
new file mode 100644
index 00000000..f0f5dd11
--- /dev/null
+++ b/mp/src/vgui2/vgui_controls/MenuBar.cpp
@@ -0,0 +1,252 @@
+//========= 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();
+ }
+ }
+ }
+ }
+ }
+}