source-engine/game/client/swarm/vgui/nb_select_mission_entry.cpp
2023-10-03 17:23:56 +03:00

201 lines
6.1 KiB
C++

#include "cbase.h"
#include "nb_select_mission_entry.h"
#include "vgui_controls/Label.h"
#include "vgui_controls/ImagePanel.h"
#include "vgui_bitmapbutton.h"
#include "KeyValues.h"
#include "missionchooser/iasw_mission_chooser.h"
#include "missionchooser/iasw_mission_chooser_source.h"
#include "filesystem.h"
#include "nb_select_mission_panel.h"
#include "vgui/ISurface.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
CNB_Select_Mission_Entry::CNB_Select_Mission_Entry( vgui::Panel *parent, const char *name ) : BaseClass( parent, name )
{
// == MANAGED_MEMBER_CREATION_START: Do not edit by hand ==
m_pImage = new CBitmapButton( this, "Image", "" );
m_pName = new vgui::Label( this, "Name", "" );
// == MANAGED_MEMBER_CREATION_END ==
m_pImage->AddActionSignalTarget( this );
m_pImage->SetCommand( "MissionClicked" );
m_nMissionIndex = -1;
m_szMissionName[0] = 0;
m_flZoom = 0.0f;
}
CNB_Select_Mission_Entry::~CNB_Select_Mission_Entry()
{
}
void CNB_Select_Mission_Entry::ApplySchemeSettings( vgui::IScheme *pScheme )
{
BaseClass::ApplySchemeSettings( pScheme );
LoadControlSettings( "resource/ui/nb_select_mission_entry.res" );
m_szMissionName[0] = 0;
}
void CNB_Select_Mission_Entry::PerformLayout()
{
BaseClass::PerformLayout();
}
void CNB_Select_Mission_Entry::OnThink()
{
BaseClass::OnThink();
IASW_Mission_Chooser_Source *pSource = missionchooser ? missionchooser->LocalMissionSource() : NULL;
// TODO: If voting, then use:
//IASW_Mission_Chooser_Source *pSource = GetVotingMissionSource();
if ( !pSource )
{
//Warning( "Unable to select a mission as couldn't find an IASW_Mission_Chooser_Source\n" );
return;
}
color32 white;
white.r = 255;
white.g = 255;
white.b = 255;
white.a = 255;
ASW_Mission_Chooser_Mission *pMission = pSource->GetMission( m_nMissionIndex, true );
if ( pMission )
{
if ( Q_strcmp( pMission->m_szMissionName, m_szMissionName ) )
{
Q_snprintf(m_szMissionName, sizeof(m_szMissionName), "%s", pMission->m_szMissionName);
if (m_szMissionName[0] == '\0')
{
m_pName->SetText( "" );
m_pImage->SetImage( CBitmapButton::BUTTON_ENABLED, "vgui/swarm/MissionPics/UnknownMissionPic", white );
return;
}
// strip off the extension
char stripped[MAX_PATH];
V_StripExtension( m_szMissionName, stripped, MAX_PATH );
KeyValues *pMissionKeys = new KeyValues( stripped );
char tempfile[MAX_PATH];
Q_snprintf( tempfile, sizeof( tempfile ), "resource/overviews/%s.txt", stripped );
bool bNoOverview = false;
if ( !pMissionKeys->LoadFromFile( g_pFullFileSystem, tempfile, "GAME" ) )
{
// try to load it directly from the maps folder
Q_snprintf( tempfile, sizeof( tempfile ), "maps/%s.txt", stripped );
if ( !pMissionKeys->LoadFromFile( g_pFullFileSystem, tempfile, "GAME" ) )
{
bNoOverview = true;
}
}
if (bNoOverview)
{
m_pName->SetText(stripped);
if (m_pImage)
{
//Msg("setting image for %s to unknown pic\n", m_m_szMissionName);
m_pImage->SetImage( CBitmapButton::BUTTON_ENABLED, "vgui/swarm/MissionPics/UnknownMissionPic", white );
m_pImage->SetImage( CBitmapButton::BUTTON_ENABLED_MOUSE_OVER, "vgui/swarm/MissionPics/UnknownMissionPic", white );
m_pImage->SetImage( CBitmapButton::BUTTON_PRESSED, "vgui/swarm/MissionPics/UnknownMissionPic", white );
m_pImage->SetVisible( true );
}
}
else
{
const char *szTitle = pMissionKeys->GetString("missiontitle");
if (szTitle[0] == '\0')
m_pName->SetText( stripped );
else
m_pName->SetText( szTitle );
if (m_pImage)
{
const char *szImage = pMissionKeys->GetString("image");
if (szImage[0] == '\0')
{
//Msg("setting image for %s to unknown pic\n", m_m_szMissionName);
m_pImage->SetImage( CBitmapButton::BUTTON_ENABLED, "vgui/swarm/MissionPics/UnknownMissionPic", white );
m_pImage->SetImage( CBitmapButton::BUTTON_ENABLED_MOUSE_OVER, "vgui/swarm/MissionPics/UnknownMissionPic", white );
m_pImage->SetImage( CBitmapButton::BUTTON_PRESSED, "vgui/swarm/MissionPics/UnknownMissionPic", white );
}
else
{
//Msg("setting image for %s to %s\n", m_m_szMissionName, szImage);
char imagename[MAX_PATH];
Q_snprintf( imagename, sizeof(imagename), "vgui/%s", szImage );
m_pImage->SetImage( CBitmapButton::BUTTON_ENABLED, imagename, white );
m_pImage->SetImage( CBitmapButton::BUTTON_ENABLED_MOUSE_OVER, imagename, white );
m_pImage->SetImage( CBitmapButton::BUTTON_PRESSED, imagename, white );
}
m_pImage->SetVisible(true);
}
}
}
}
else
{
m_pName->SetText( "" );
m_pImage->SetImage( CBitmapButton::BUTTON_ENABLED, "vgui/swarm/MissionPics/UnknownMissionPic", white );
}
float flTargetZoom = m_pImage->IsCursorOver() ? 1.0f : 0;
if ( flTargetZoom == 1.0f && m_flZoom == 0.0f )
{
vgui::surface()->PlaySound( "UI/menu_focus.wav" );
}
m_flZoom = Approach( flTargetZoom, m_flZoom, gpGlobals->frametime * 10.0f );
float flZoom = 1.0f; // m_flZoom;
float flZoomDistX = YRES( 10 );
float flZoomDistY = YRES( 7 );
int x = flZoomDistX - flZoomDistX * flZoom;
int y = YRES( 34 ) + flZoomDistY - flZoomDistY * flZoom;
int w = YRES( 133 ) - ( flZoomDistX * 2 ) + ( flZoomDistX * 2 * flZoom );
int h = YRES( 100 ) - ( flZoomDistY * 2 ) + ( flZoomDistY * 2 * flZoom );
// "xpos" "0"
// "ypos" "34"
// "wide" "133"
// "tall" "100"
if ( flTargetZoom == 1.0f )
{
m_pName->SetFgColor( Color( 255, 255, 255, 255 ) );
}
else
{
m_pName->SetFgColor( Color( 83, 148, 192, 255 ) );
}
m_pImage->SetBounds( x, y, w, h );
}
void CNB_Select_Mission_Entry::OnCommand( const char *command )
{
if ( !Q_stricmp( "MissionClicked", command ) )
{
IASW_Mission_Chooser_Source *pSource = missionchooser ? missionchooser->LocalMissionSource() : NULL;
if ( pSource )
{
ASW_Mission_Chooser_Mission *pMission = pSource->GetMission( m_nMissionIndex, true );
if ( pMission )
{
CNB_Select_Mission_Panel *pPanel = dynamic_cast<CNB_Select_Mission_Panel*>( GetParent()->GetParent()->GetParent() );
if ( pPanel )
{
pPanel->MissionSelected( pMission );
}
}
}
}
}