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.
190 lines
4.8 KiB
190 lines
4.8 KiB
//====== 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;
|
|
}
|
|
|
|
|