source-engine/tools/toolutils/ToolMenuButton.cpp

186 lines
4.7 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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;
}