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.
185 lines
4.7 KiB
185 lines
4.7 KiB
//========= Copyright 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; |
|
} |
|
|
|
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; |
|
} |
|
|
|
|
|
|