diff options
Diffstat (limited to 'game/client/tf/vgui/tf_layeredmappanel.cpp')
| -rw-r--r-- | game/client/tf/vgui/tf_layeredmappanel.cpp | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/game/client/tf/vgui/tf_layeredmappanel.cpp b/game/client/tf/vgui/tf_layeredmappanel.cpp new file mode 100644 index 0000000..65fd609 --- /dev/null +++ b/game/client/tf/vgui/tf_layeredmappanel.cpp @@ -0,0 +1,343 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#include "cbase.h" +#include "tf_layeredmappanel.h" + +using namespace vgui; + +//========================================================= +// CLayeredMapToolTip +//========================================================= +CLayeredMapToolTip::CLayeredMapToolTip(vgui::Panel *parent, const char *text ) : vgui::BaseTooltip( parent, text ) +{ + m_hCurrentPanel = NULL; +} + +//========================================================= +void CLayeredMapToolTip::PerformLayout() +{ + BaseClass::PerformLayout(); + + if ( !ShouldLayout() ) + return; + + CTFLayeredMapItemPanel *pMapItemPanel = m_hCurrentPanel.Get(); + if ( !pMapItemPanel ) + return; + + m_pControlledPanel->SetVisible( false ); + + int x,y; + pMapItemPanel->GetPos( x, y ); + + int iXPos = 0; + int iYPos = 0; + + // Loop through the positions in our strategy, and hope we find a valid spot + for ( int i = 0; i < NUM_POSITIONS_PER_STRATEGY; i++ ) + { + itempanel_tooltippos_t iPos = g_iTooltipStrategies[IPTTP_TOP_SIDE][i]; + GetPosition( iPos, pMapItemPanel, x, y, &iXPos, &iYPos ); + + if ( ValidatePosition( pMapItemPanel, x, y, &iXPos, &iYPos ) ) + break; + } + + m_pControlledPanel->SetPos( iXPos, iYPos ); + m_pControlledPanel->SetVisible( true ); +} + +//========================================================= +void CLayeredMapToolTip::ShowTooltip( vgui::Panel *currentPanel ) +{ + // Set Data on visible panel + if ( !m_pControlledPanel ) + return; + + if ( currentPanel != m_hCurrentPanel.Get() ) + { + CTFLayeredMapItemPanel *pMapItemPanel = dynamic_cast<CTFLayeredMapItemPanel*>( currentPanel ); + m_hCurrentPanel.Set( pMapItemPanel ); + m_pControlledPanel->SetVisible( false ); + if ( pMapItemPanel ) + { + KeyValues *pData = pMapItemPanel->GetItemKvData(); + if ( pData ) + { + m_pControlledPanel->SetDialogVariable( "tooltipdescription", pData->GetString( "name", "No Name" ) ); + } + } + } + BaseClass::ShowTooltip( currentPanel ); +} + +//========================================================= +void CLayeredMapToolTip::HideTooltip() +{ + if ( !m_pControlledPanel ) + return; + + m_pControlledPanel->SetVisible( false ); + m_hCurrentPanel = NULL; +} + +//========================================================= +void CLayeredMapToolTip::SetupPanels( CTFLayeredMapPanel *pParentPanel, vgui::EditablePanel *pControlledPanel ) +{ + m_pParentPanel = pParentPanel; + m_pControlledPanel = pControlledPanel; +} + +//========================================================= +void CLayeredMapToolTip::GetPosition( itempanel_tooltippos_t iTooltipPosition, CTFLayeredMapItemPanel *pItemPanel, int iItemX, int iItemY, int *iXPos, int *iYPos ) +{ + switch ( iTooltipPosition ) + { + case IPTTP_LEFT: + *iXPos = (iItemX - m_pControlledPanel->GetWide() + XRES(18)); + *iYPos = iItemY - YRES(7); + break; + case IPTTP_RIGHT: + *iXPos = (iItemX + pItemPanel->GetWide() - XRES(20)); + *iYPos = iItemY - YRES(7); + break; + case IPTTP_LEFT_CENTERED: + *iXPos = (iItemX - m_pControlledPanel->GetWide()) - XRES(4); + *iYPos = (iItemY - (m_pControlledPanel->GetTall() * 0.5)); + break; + case IPTTP_RIGHT_CENTERED: + *iXPos = (iItemX + pItemPanel->GetWide()) + XRES(4); + *iYPos = (iItemY - (m_pControlledPanel->GetTall() * 0.5)); + break; + case IPTTP_ABOVE: + *iXPos = (iItemX + (pItemPanel->GetWide() * 0.5)) - (m_pControlledPanel->GetWide() * 0.5); + *iYPos = (iItemY - m_pControlledPanel->GetTall() - YRES(4)); + break; + case IPTTP_BELOW: + *iXPos = (iItemX + (pItemPanel->GetWide() * 0.5)) - (m_pControlledPanel->GetWide() * 0.5); + *iYPos = (iItemY + pItemPanel->GetTall() + YRES(4)); + break; + } +} + +//========================================================= +bool CLayeredMapToolTip::ValidatePosition( CTFLayeredMapItemPanel *pItemPanel, int iItemX, int iItemY, int *iXPos, int *iYPos ) +{ + bool bSucceeded = true; + + // Make sure the popup stays onscreen. + if ( *iXPos < 0 ) + { + *iXPos = 0; + } + else if ( (*iXPos + m_pControlledPanel->GetWide()) > m_pParentPanel->GetWide() ) + { + int iXPosNew = m_pParentPanel->GetWide() - m_pControlledPanel->GetWide(); + // make sure it is still on the screen + if ( iXPosNew >= 0 ) + { + *iXPos = iXPosNew; + } + else + { + bSucceeded = false; + } + } + + if ( *iYPos < 0 ) + { + *iYPos = 0; + } + else if ( (*iYPos + m_pControlledPanel->GetTall() + YRES(32)) > m_pParentPanel->GetTall() ) + { + // Move it up above our item + int iYPosNew = iItemY - m_pControlledPanel->GetTall() - YRES(4); + // make sure it is still on the screen + if ( iYPosNew >= 0 ) + { + *iYPos = iYPosNew; + } + else + { + bSucceeded = false; + } + } + + if ( bSucceeded ) + { + // We also fail if moving it to keep it on screen moved it over the item panel itself + Vector2D vecToolTipMin, vecToolTipMax, vecItemMin, vecItemMax; + vecToolTipMin.x = *iXPos; + vecToolTipMin.y = *iYPos; + vecToolTipMax.x = vecToolTipMin.x + m_pControlledPanel->GetWide(); + vecToolTipMax.y = vecToolTipMin.y + m_pControlledPanel->GetTall(); + + vecItemMin.x = iItemX; + vecItemMin.y = iItemY; + vecItemMax.x = vecItemMin.x + m_hCurrentPanel->GetWide(); + vecItemMax.y = vecItemMin.y + m_hCurrentPanel->GetTall(); + + bSucceeded = !( vecToolTipMin.x < vecItemMax.x && vecToolTipMax.x > vecItemMin.x && vecToolTipMin.y < vecItemMax.y && vecToolTipMax.y > vecItemMin.y ); + } + + return bSucceeded; +} + +//----------------------------------------------------------------------------- +// CTFLayeredImagePanelItem +//----------------------------------------------------------------------------- +DECLARE_BUILD_FACTORY( CTFLayeredMapItemPanel ); + +CTFLayeredMapItemPanel::CTFLayeredMapItemPanel( Panel *parent, const char *pName ) : vgui::EditablePanel( parent, pName ) +{ + m_bIsCompleted = false; + m_bIsMouseOvered = false; + + m_kvData = NULL; +} + +//----------------------------------------------------------------------------- +void CTFLayeredMapItemPanel::ApplySchemeSettings( vgui::IScheme *pScheme ) +{ + BaseClass::ApplySchemeSettings( pScheme ); + + // load control settings... + LoadControlSettings( "resource/UI/LayeredMapPanelItem.res" ); + + // get References to the 4 images + m_pIsCompleted = dynamic_cast<vgui::ScalableImagePanel*>( FindChildByName("IsCompletedImage") ); + m_pIsCompletedHighlight = dynamic_cast<vgui::ScalableImagePanel*>( FindChildByName("IsCompletedHighlight") ); + + m_pNotCompleted = dynamic_cast<vgui::ScalableImagePanel*>( FindChildByName("NotCompletedImage") ); + m_pNotCompletedHighlight = dynamic_cast<vgui::ScalableImagePanel*>( FindChildByName("NotCompletedHighlight") ); + + m_pIsCompleted->SetVisible( true ); + m_pIsCompleted->SetMouseInputEnabled( false ); + m_pIsCompletedHighlight->SetVisible( false ); + m_pIsCompletedHighlight->SetMouseInputEnabled( false ); + m_pNotCompleted->SetVisible( false ); + m_pNotCompleted->SetMouseInputEnabled( false ); + m_pNotCompletedHighlight->SetVisible( false ); + m_pNotCompletedHighlight->SetMouseInputEnabled( false ); + + SetMouseInputEnabled( true ); +} + +//----------------------------------------------------------------------------- +void CTFLayeredMapItemPanel::ApplySettings( KeyValues *inResourceData ) +{ + BaseClass::ApplySettings( inResourceData ); + // Store Information needed for a mouse over + + KeyValues *kvData = inResourceData->FindKey( "mapitem_kv" ); + if ( kvData ) + { + if ( m_kvData ) + { + m_kvData->deleteThis(); + } + m_kvData = new KeyValues( "mapitem_kv" ); + kvData->CopySubkeys( m_kvData ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFLayeredMapItemPanel::OnCursorEntered( void ) +{ + BaseClass::OnCursorEntered(); + m_pIsCompletedHighlight->SetVisible( m_bIsCompleted ); + m_pNotCompletedHighlight->SetVisible( !m_bIsCompleted ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFLayeredMapItemPanel::OnCursorExited( void ) +{ + BaseClass::OnCursorExited(); + m_pIsCompletedHighlight->SetVisible( false ); + m_pNotCompletedHighlight->SetVisible( false ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFLayeredMapItemPanel::OnMousePressed(vgui::MouseCode code) +{ + SetCompletionState( !m_bIsCompleted ); +} + +//----------------------------------------------------------------------------- +void CTFLayeredMapItemPanel::SetCompletionState( bool bIsCompleted ) +{ + m_bIsCompleted = bIsCompleted; + m_pIsCompleted->SetVisible( m_bIsCompleted ); + m_pNotCompleted->SetVisible( !m_bIsCompleted ); +} + +//----------------------------------------------------------------------------- +// CTFLayeredMapPanel +// - MultiImage Panel that places all images on top of each other. +// An external manager may then individually toggle each image on or off +// Each image is sized to fit the panel +//----------------------------------------------------------------------------- +DECLARE_BUILD_FACTORY( CTFLayeredMapPanel ); + +CTFLayeredMapPanel::CTFLayeredMapPanel( Panel *parent, const char *pName ) : vgui::EditablePanel( parent, pName ) +{ + m_pLayeredMapKv = NULL; +} + +//----------------------------------------------------------------------------- +void CTFLayeredMapPanel::ApplySchemeSettings( vgui::IScheme *pScheme ) +{ + BaseClass::ApplySchemeSettings( pScheme ); + + // load control settings... + LoadControlSettings( "resource/UI/LayeredMapPanel.res" ); + + m_MapItems.PurgeAndDeleteElements(); + + // Get ToolTip + m_pToolTipPanel = dynamic_cast<EditablePanel*>( FindChildByName( "ToolTipPanel" ) ); + m_pToolTip = new CLayeredMapToolTip( this ); + m_pToolTip->SetupPanels( this, m_pToolTipPanel ); + + if ( m_pLayeredMapKv ) + { + int iItemCount = m_pLayeredMapKv->GetInt( "item_count", 0 ); + for ( int i = 0; i < iItemCount; ++i ) + { + CTFLayeredMapItemPanel *pItem = dynamic_cast<CTFLayeredMapItemPanel*>( FindChildByName( VarArgs( "MapItem%d", i ) ) ); + if ( pItem ) + { + pItem->SetTooltip( m_pToolTip, "" ); + m_MapItems.AddToTail( pItem ); + } + } + } +} + +//----------------------------------------------------------------------------- +void CTFLayeredMapPanel::ApplySettings( KeyValues *inResourceData ) +{ + BaseClass::ApplySettings( inResourceData ); + + if ( inResourceData ) + { + if ( m_pLayeredMapKv ) + { + m_pLayeredMapKv->deleteThis(); + } + m_pLayeredMapKv = new KeyValues( "layeredMapPanel_kv" ); + inResourceData->CopySubkeys( m_pLayeredMapKv ); + } +} + |