|
|
//====== Copyright � 1996-2005, Valve Corporation, All rights reserved. =======
//
// Purpose: Core Movie Maker UI API
//
//=============================================================================
#include "toolutils/toolmenubutton.h"
#include "toolutils/toolmenubar.h"
#include "toolutils/basetoolsystem.h"
#include "vgui_controls/menu.h"
#include "vgui_controls/KeyBindingMap.h"
#include "vgui/ILocalize.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
using namespace vgui;
//-----------------------------------------------------------------------------
// Constructor
//-----------------------------------------------------------------------------
CToolMenuButton::CToolMenuButton( Panel *parent, const char *panelName, const char *text, Panel *actionTarget ) : BaseClass( parent, panelName, text ), m_pActionTarget( actionTarget ) { m_pMenu = new Menu( this, "Menu" ); }
void CToolMenuButton::Reset() { m_Items.RemoveAll(); m_pMenu->DeleteAllItems(); }
int CToolMenuButton::AddMenuItem( char const *itemName, const char *itemText, KeyValues *message, Panel *target, const KeyValues *userData /*= NULL*/, char const *kbcommandname /*= NULL*/ ) { int id = m_pMenu->AddMenuItem(itemText, message, target, userData); MenuItem_t item; item.m_ItemID = id; if ( kbcommandname ) { item.m_KeyBinding = kbcommandname; } m_Items.Insert( itemName, item ); return id; }
int CToolMenuButton::AddCheckableMenuItem( char const *itemName, const char *itemText, KeyValues *message, Panel *target, const KeyValues *userData /*= NULL*/, char const *kbcommandname /*= NULL*/ ) { int id = m_pMenu->AddCheckableMenuItem(itemText, message, target, userData); MenuItem_t item; item.m_ItemID = id; if ( kbcommandname ) { item.m_KeyBinding = kbcommandname; } m_Items.Insert( itemName, item ); return id; }
int CToolMenuButton::AddMenuItem( char const *itemName, const wchar_t *itemText, KeyValues *message, Panel *target, const KeyValues *userData /*= NULL*/, char const *kbcommandname /*= NULL*/ ) { int id = m_pMenu->AddMenuItem(itemName, itemText, message, target, userData); MenuItem_t item; item.m_ItemID = id; if ( kbcommandname ) { item.m_KeyBinding = kbcommandname; } m_Items.Insert( itemName, item ); return id; }
int CToolMenuButton::AddCheckableMenuItem( char const *itemName, const wchar_t *itemText, KeyValues *message, Panel *target, const KeyValues *userData /*= NULL*/, char const *kbcommandname /*= NULL*/ ) { int id = m_pMenu->AddCheckableMenuItem(itemName, itemText, message, target, userData); MenuItem_t item; item.m_ItemID = id; if ( kbcommandname ) { item.m_KeyBinding = kbcommandname; } m_Items.Insert( itemName, item ); return id; }
void CToolMenuButton::AddSeparator() { m_pMenu->AddSeparator(); }
void CToolMenuButton::SetItemEnabled( int itemID, bool state ) { m_pMenu->SetItemEnabled( m_Items[ itemID ].m_ItemID, state ); }
int CToolMenuButton::FindMenuItem( char const *itemName ) { int id = m_Items.Find( itemName ); if ( id == m_Items.InvalidIndex() ) return -1; return m_Items[ id ].m_ItemID; }
MenuItem *CToolMenuButton::GetMenuItem( int itemID ) { return m_pMenu->GetMenuItem( itemID ); }
void CToolMenuButton::AddSeparatorAfterItem( char const *itemName ) { int id = FindMenuItem( itemName ); if ( id != -1 ) { m_pMenu->AddSeparatorAfterItem( id ); } }
void CToolMenuButton::MoveMenuItem( int itemID, int moveBeforeThisItemID ) { m_pMenu->MoveMenuItem( itemID, moveBeforeThisItemID ); }
void CToolMenuButton::SetCurrentKeyBindingLabel( char const *itemName, char const *binding ) { int id = FindMenuItem( itemName ); if ( id != -1 ) { m_pMenu->SetCurrentKeyBinding( id, binding ); } }
void CToolMenuButton::UpdateMenuItemKeyBindings() { if ( !m_pActionTarget ) return;
int c = m_Items.Count(); for ( int i = 0; i < c; ++i ) { if ( !m_Items[ i ].m_KeyBinding.IsValid() ) continue;
char const *bindingName = m_Items[ i ].m_KeyBinding.String();
CUtlVector< BoundKey_t * > list; m_pActionTarget->LookupBoundKeys( bindingName, list ); if ( list.Count() <= 0 ) continue;
BoundKey_t *kb = list[ 0 ]; Assert( kb );
// Found it, now convert to binding string
// First do modifiers
wchar_t sz[ 256 ]; wcsncpy( sz, Panel::KeyCodeModifiersToDisplayString( (KeyCode)kb->keycode, kb->modifiers ), 256 ); sz[ 255 ] = L'\0';
char ansi[ 512 ]; g_pVGuiLocalize->ConvertUnicodeToANSI( sz, ansi, sizeof( ansi ) ); m_pMenu->SetCurrentKeyBinding( m_Items[ i ].m_ItemID, ansi );
} }
void CToolMenuButton::OnShowMenu( Menu *menu ) { CToolMenuBar *bar = dynamic_cast< CToolMenuBar * >( GetParent() ); if ( bar ) { CBaseToolSystem *sys = bar->GetToolSystem(); if ( sys ) { sys->UpdateMenu( menu ); } }
UpdateMenuItemKeyBindings();
m_pMenu->ForceCalculateWidth(); }
vgui::Menu *CToolMenuButton::GetMenu() { return m_pMenu; }
|