mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-09-01 15:09:19 +00:00
upload "kind" alien swarm
This commit is contained in:
@@ -0,0 +1,312 @@
|
||||
#include "cbase.h"
|
||||
#include "vgui/ivgui.h"
|
||||
#include <vgui/vgui.h>
|
||||
#include <vgui_controls/Controls.h>
|
||||
#include <vgui_controls/Button.h>
|
||||
#include <vgui_controls/TextImage.h>
|
||||
#include <vgui_controls/CheckButton.h>
|
||||
#include <vgui_controls/PanelListPanel.h>
|
||||
#include <vgui_controls/HTML.h>
|
||||
#include <vgui_controls/ScrollBar.h>
|
||||
#include "FileSystem.h"
|
||||
#include <vgui_controls/Panel.h>
|
||||
#include <vgui/isurface.h>
|
||||
#include "SwarmopediaPanel.h"
|
||||
#include "SwarmopediaTopics.h"
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
|
||||
SwarmopediaPanel::SwarmopediaPanel( vgui::Panel *pParent, const char *pElementName) : vgui::Panel(pParent, pElementName)
|
||||
{
|
||||
vgui::HScheme scheme = vgui::scheme()->LoadSchemeFromFile("resource/SwarmFrameScheme.res", "SwarmFrameScheme");
|
||||
SetScheme(scheme);
|
||||
|
||||
m_pHTML = NULL;
|
||||
m_pList = NULL;
|
||||
m_pTopicLabel = NULL;
|
||||
m_bCreatedPanels = false;
|
||||
}
|
||||
|
||||
SwarmopediaPanel::~SwarmopediaPanel()
|
||||
{
|
||||
}
|
||||
|
||||
void SwarmopediaPanel::OnThink()
|
||||
{
|
||||
BaseClass::OnThink();
|
||||
|
||||
if (!m_bCreatedPanels)
|
||||
{
|
||||
m_bCreatedPanels = true;
|
||||
|
||||
m_pHTML = new vgui::HTML( this, "SwarmopediaHTML");
|
||||
m_pList = new vgui::PanelListPanel(this, "TopicsList");
|
||||
m_pList->SetVerticalBufferPixels( 0 );
|
||||
|
||||
m_pTopicLabel = new vgui::Label( this, "TopicsLabel", "#asw_so_topics");
|
||||
|
||||
ShowDoc("index");
|
||||
ShowList("initial");
|
||||
InvalidateLayout(true, true);
|
||||
}
|
||||
}
|
||||
|
||||
void SwarmopediaPanel::PerformLayout()
|
||||
{
|
||||
BaseClass::PerformLayout();
|
||||
|
||||
int sw, sh;
|
||||
vgui::surface()->GetScreenSize( sw, sh );
|
||||
float fScale = float(sh) / 768.0f;
|
||||
|
||||
int list_wide = 200.0f * fScale;
|
||||
int padding = 5 * fScale;
|
||||
int iFooterSize = 32.0f * fScale;
|
||||
|
||||
int html_left = list_wide + padding;
|
||||
int html_wide = GetWide() - (html_left + padding);
|
||||
if (m_pHTML)
|
||||
m_pHTML->SetBounds(html_left, padding, html_wide, GetTall() - (iFooterSize + padding * 3));
|
||||
|
||||
int text_high = fScale * 20;
|
||||
if (m_pTopicLabel)
|
||||
m_pTopicLabel->SetBounds(padding, padding, list_wide - padding * 2, text_high);
|
||||
|
||||
Msg("SwarmopediaPanel::PerformLayout. fscale=%f list_wide=%d padding=%d footer=%d\n", fScale, list_wide, padding, iFooterSize);
|
||||
|
||||
if (m_pList)
|
||||
{
|
||||
m_pList->SetBounds(padding, padding + text_high, list_wide - padding * 2, GetTall() - (iFooterSize + padding * 3));
|
||||
m_pList->SetFirstColumnWidth(0);
|
||||
}
|
||||
}
|
||||
|
||||
void SwarmopediaPanel::ApplySchemeSettings(vgui::IScheme *pScheme)
|
||||
{
|
||||
BaseClass::ApplySchemeSettings(pScheme);
|
||||
if (m_pHTML)
|
||||
m_pHTML->SetBgColor(Color(0,0,0,255));
|
||||
}
|
||||
|
||||
void SwarmopediaPanel::OnCommand(const char* command)
|
||||
{
|
||||
BaseClass::OnCommand(command);
|
||||
}
|
||||
|
||||
bool SwarmopediaPanel::ShowDoc(const char *szDoc)
|
||||
{
|
||||
if (!m_pHTML)
|
||||
return false;
|
||||
|
||||
//Msg("SwarmopediaPanel::ShowDoc %s\n", szDoc);
|
||||
char fileRES[ MAX_PATH ];
|
||||
|
||||
char uilanguage[ 64 ];
|
||||
engine->GetUILanguage( uilanguage, sizeof( uilanguage ) );
|
||||
|
||||
Q_snprintf( fileRES, sizeof( fileRES ), "resource/swarmopedia/%s_%s.html", szDoc, uilanguage );
|
||||
|
||||
bool bFoundHTML = false;
|
||||
|
||||
if ( !g_pFullFileSystem->FileExists( fileRES ) )
|
||||
{
|
||||
// try english
|
||||
Q_snprintf( fileRES, sizeof( fileRES ), "resource/swarmopedia/%s_english.html", szDoc );
|
||||
}
|
||||
else
|
||||
{
|
||||
bFoundHTML = true;
|
||||
}
|
||||
|
||||
if( bFoundHTML || g_pFullFileSystem->FileExists( fileRES ) )
|
||||
{
|
||||
// it's a local HTML file
|
||||
char localURL[ _MAX_PATH + 7 ];
|
||||
Q_strncpy( localURL, "file://", sizeof( localURL ) );
|
||||
|
||||
char pPathData[ _MAX_PATH ];
|
||||
g_pFullFileSystem->GetLocalPath( fileRES, pPathData, sizeof(pPathData) );
|
||||
Q_strncat( localURL, pPathData, sizeof( localURL ), COPY_ALL_CHARACTERS );
|
||||
|
||||
// force steam to dump a local copy
|
||||
g_pFullFileSystem->GetLocalCopy( pPathData );
|
||||
|
||||
m_pHTML->SetVisible( true );
|
||||
m_pHTML->OpenURL( localURL );
|
||||
|
||||
InvalidateLayout();
|
||||
Repaint();
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Msg("Couldn't find html %s\n", fileRES);
|
||||
m_pHTML->SetVisible( false );
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void SwarmopediaPanel::AddListEntry(const char* szName, const char* szArticle, const char* szListTarget, int iSectionHeader)
|
||||
{
|
||||
if (!m_pList)
|
||||
return;
|
||||
|
||||
SwarmopediaTopicButton *pTopic = new SwarmopediaTopicButton(this, "TopicButton", this);
|
||||
pTopic->m_pLabel->SetText(szName);
|
||||
Q_snprintf(pTopic->m_szArticleTarget, sizeof(pTopic->m_szArticleTarget), "%s", szArticle);
|
||||
Q_snprintf(pTopic->m_szListTarget, sizeof(pTopic->m_szListTarget), "%s", szListTarget);
|
||||
pTopic->m_iSectionHeader = iSectionHeader;
|
||||
|
||||
m_pList->AddItem(NULL, pTopic);
|
||||
|
||||
pTopic->InvalidateLayout(true, true);
|
||||
}
|
||||
|
||||
void SwarmopediaPanel::ListEntryClicked(SwarmopediaTopicButton *pTopic)
|
||||
{
|
||||
if (!pTopic)
|
||||
return;
|
||||
|
||||
vgui::surface()->PlaySound("swarm/interface/tabclick2.wav");
|
||||
|
||||
// change article if needed
|
||||
if (Q_strlen(pTopic->m_szArticleTarget) > 0)
|
||||
{
|
||||
ShowDoc(pTopic->m_szArticleTarget);
|
||||
}
|
||||
|
||||
// change list if needed
|
||||
if (Q_strlen(pTopic->m_szListTarget) > 0)
|
||||
{
|
||||
ShowList(pTopic->m_szListTarget);
|
||||
}
|
||||
}
|
||||
|
||||
bool SwarmopediaPanel::ShowList(const char *szListName)
|
||||
{
|
||||
if (!m_pList)
|
||||
return false;
|
||||
|
||||
//Msg("ShowList(%s)\n", szListName);
|
||||
if (!GetSwarmopediaTopics())
|
||||
{
|
||||
Msg("Show list failed to find topics\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
m_pList->DeleteAllItems();
|
||||
//m_pList->SetVerticalBufferPixels(0);
|
||||
|
||||
if (!GetSwarmopediaTopics()->SetupList(this, szListName))
|
||||
{
|
||||
GetSwarmopediaTopics()->SetupList(this, "initial");
|
||||
return false;
|
||||
}
|
||||
m_pList->InvalidateLayout(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// =============================================================
|
||||
|
||||
SwarmopediaTopicButton::SwarmopediaTopicButton( vgui::Panel *pParent, const char *pElementName, SwarmopediaPanel *pSwarmopedia) : vgui::Panel(pParent, pElementName)
|
||||
{
|
||||
m_pSwarmopedia = pSwarmopedia;
|
||||
m_pLabel = new vgui::Label(this, "TopicLabel", "");
|
||||
m_pLabel->SetContentAlignment(vgui::Label::a_northwest);
|
||||
|
||||
SetMouseInputEnabled(true);
|
||||
m_pLabel->SetMouseInputEnabled(false);
|
||||
|
||||
m_hFont = vgui::INVALID_FONT;
|
||||
m_iSectionHeader = 0;
|
||||
|
||||
m_szArticleTarget[0] = '\0';
|
||||
m_szListTarget[0] = '\0';
|
||||
}
|
||||
|
||||
SwarmopediaTopicButton::~SwarmopediaTopicButton()
|
||||
{
|
||||
}
|
||||
|
||||
void SwarmopediaTopicButton::PerformLayout()
|
||||
{
|
||||
BaseClass::PerformLayout();
|
||||
|
||||
vgui::PanelListPanel *pParent = dynamic_cast<vgui::PanelListPanel*>(GetParent());
|
||||
int iScrollbarSize = 20;
|
||||
if (pParent)
|
||||
iScrollbarSize = pParent->GetScrollBar() ? pParent->GetScrollBar()->GetWide() : 20;
|
||||
|
||||
int sw, sh;
|
||||
vgui::surface()->GetScreenSize( sw, sh );
|
||||
float fScale = float(sh) / 768.0f;
|
||||
|
||||
int list_wide = 160.0f * fScale;
|
||||
int font_tall = vgui::surface()->GetFontTall(m_hFont);
|
||||
int padding = 5 * fScale;
|
||||
|
||||
int button_wide = list_wide - padding * 2;
|
||||
int xindent = 0;
|
||||
if (m_iSectionHeader <= 0)
|
||||
{
|
||||
xindent = (padding * 3) * (1 - m_iSectionHeader);
|
||||
}
|
||||
|
||||
SetSize(button_wide*5, font_tall);
|
||||
m_pLabel->SetBounds(xindent, 0, button_wide - xindent, font_tall);
|
||||
m_pLabel->InvalidateLayout();
|
||||
//m_pLabel->GetTextImage()->RecalculateNewLinePositions();
|
||||
}
|
||||
|
||||
void SwarmopediaTopicButton::ApplySchemeSettings(vgui::IScheme *pScheme)
|
||||
{
|
||||
BaseClass::ApplySchemeSettings(pScheme);
|
||||
|
||||
m_hFont = pScheme->GetFont( "DefaultButton", IsProportional() );
|
||||
m_pLabel->SetFont(m_hFont);
|
||||
|
||||
if (m_iSectionHeader <= 0)
|
||||
m_pLabel->SetFgColor(Color(66,142,192,255));
|
||||
else
|
||||
m_pLabel->SetFgColor(Color(192,192,192,255));
|
||||
}
|
||||
|
||||
void SwarmopediaTopicButton::OnMouseReleased(vgui::MouseCode code)
|
||||
{
|
||||
if (!IsCursorOver())
|
||||
return;
|
||||
|
||||
if (!m_pSwarmopedia)
|
||||
return;
|
||||
|
||||
if ( code != MOUSE_LEFT )
|
||||
return;
|
||||
|
||||
m_pSwarmopedia->ListEntryClicked(this);
|
||||
}
|
||||
|
||||
void SwarmopediaTopicButton::OnCursorEntered()
|
||||
{
|
||||
BaseClass::OnCursorEntered();
|
||||
|
||||
m_pLabel->SetFgColor(Color(0,0,0,255));
|
||||
m_pLabel->SetBgColor(Color(192,192,192,255));
|
||||
m_pLabel->SetPaintBackgroundEnabled(true);
|
||||
m_pLabel->SetPaintBackgroundType(0);
|
||||
}
|
||||
|
||||
void SwarmopediaTopicButton::OnCursorExited()
|
||||
{
|
||||
BaseClass::OnCursorExited();
|
||||
|
||||
if (m_iSectionHeader <= 0)
|
||||
m_pLabel->SetFgColor(Color(66,142,192,255));
|
||||
else
|
||||
m_pLabel->SetFgColor(Color(192,192,192,255));
|
||||
m_pLabel->SetBgColor(Color(0,0,0,0));
|
||||
m_pLabel->SetPaintBackgroundEnabled(false);
|
||||
}
|
||||
Reference in New Issue
Block a user