mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-07 17:29:36 +00:00
1
This commit is contained in:
@@ -0,0 +1,300 @@
|
||||
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||||
// ModelBrowser.cpp : implementation file
|
||||
//
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "ModelBrowser.h"
|
||||
#include "matsys_controls/mdlpicker.h"
|
||||
#include "matsys_controls/matsyscontrols.h"
|
||||
#include "vgui_controls/TextEntry.h"
|
||||
#include "vgui_controls/Splitter.h"
|
||||
#include "vgui_controls/Button.h"
|
||||
#include "KeyValues.h"
|
||||
#include "vgui/KeyCode.h"
|
||||
#include "texturesystem.h"
|
||||
|
||||
static LPCTSTR pszIniSection = "Model Browser";
|
||||
|
||||
// CModelBrowser dialog
|
||||
|
||||
|
||||
class CModelBrowserPanel : public vgui::EditablePanel
|
||||
{
|
||||
public:
|
||||
CModelBrowserPanel( CModelBrowser *pBrowser, const char *panelName ) :
|
||||
vgui::EditablePanel( NULL, panelName )
|
||||
{
|
||||
m_pBrowser = pBrowser;
|
||||
}
|
||||
|
||||
virtual void OnSizeChanged(int newWide, int newTall)
|
||||
{
|
||||
// call Panel and not EditablePanel OnSizeChanged.
|
||||
Panel::OnSizeChanged(newWide, newTall);
|
||||
}
|
||||
|
||||
virtual void OnCommand( const char *pCommand )
|
||||
{
|
||||
if ( Q_strcmp( pCommand, "OK" ) == 0 )
|
||||
{
|
||||
m_pBrowser->EndDialog( IDOK );
|
||||
}
|
||||
else if ( Q_strcmp( pCommand, "Cancel" ) == 0 )
|
||||
{
|
||||
m_pBrowser->EndDialog( IDCANCEL );
|
||||
}
|
||||
}
|
||||
|
||||
virtual void OnKeyCodeTyped(vgui::KeyCode code)
|
||||
{
|
||||
vgui::EditablePanel::OnKeyCodeTyped( code );
|
||||
|
||||
if ( code == KEY_ENTER )
|
||||
{
|
||||
m_pBrowser->EndDialog( IDOK );
|
||||
}
|
||||
else if ( code == KEY_ESCAPE )
|
||||
{
|
||||
m_pBrowser->EndDialog( IDCANCEL );
|
||||
}
|
||||
}
|
||||
|
||||
virtual void OnMessage(const KeyValues *params, vgui::VPANEL ifromPanel)
|
||||
{
|
||||
vgui::EditablePanel::OnMessage( params, ifromPanel );
|
||||
|
||||
if ( Q_strcmp( params->GetName(), "MDLPreviewChanged" ) == 0 )
|
||||
{
|
||||
m_pBrowser->UpdateStatusLine();
|
||||
}
|
||||
}
|
||||
|
||||
CModelBrowser *m_pBrowser;
|
||||
};
|
||||
|
||||
IMPLEMENT_DYNAMIC(CModelBrowser, CDialog)
|
||||
CModelBrowser::CModelBrowser(CWnd* pParent /*=NULL*/)
|
||||
: CDialog(CModelBrowser::IDD, pParent)
|
||||
{
|
||||
m_pPicker = new CMDLPicker( NULL );
|
||||
m_pStatusLine = new vgui::TextEntry( NULL, "StatusLine" );
|
||||
|
||||
m_pButtonOK = new vgui::Button( NULL, "OpenButton", "OK" );
|
||||
m_pButtonCancel = new vgui::Button( NULL, "CancelButton", "Cancel" );
|
||||
}
|
||||
|
||||
CModelBrowser::~CModelBrowser()
|
||||
{
|
||||
}
|
||||
|
||||
void CModelBrowser::SetModelName( const char *pModelName )
|
||||
{
|
||||
char pszTempModelName[255];
|
||||
strcpy( pszTempModelName, pModelName );
|
||||
|
||||
char * pszSelectedModel = strchr( pszTempModelName, '/' );
|
||||
if( pszSelectedModel)
|
||||
{
|
||||
pszSelectedModel += 1;
|
||||
Q_FixSlashes( pszSelectedModel, '\\' );
|
||||
}
|
||||
|
||||
m_pPicker->SelectMDL( pModelName );
|
||||
m_pPicker->SetInitialSelection( pszSelectedModel );
|
||||
|
||||
m_pStatusLine->SetText( pModelName );
|
||||
}
|
||||
|
||||
void CModelBrowser::GetModelName( char *pModelName, int length )
|
||||
{
|
||||
m_pPicker->GetSelectedMDLName( pModelName, length );
|
||||
|
||||
Q_FixSlashes( pModelName, '/' );
|
||||
}
|
||||
|
||||
void CModelBrowser::GetSkin( int &nSkin )
|
||||
{
|
||||
nSkin = m_pPicker->GetSelectedSkin();
|
||||
}
|
||||
|
||||
void CModelBrowser::SetSkin( int nSkin )
|
||||
{
|
||||
m_pPicker->SelectSkin( nSkin );
|
||||
}
|
||||
|
||||
void CModelBrowser::UpdateStatusLine()
|
||||
{
|
||||
char szModel[1024];
|
||||
|
||||
m_pPicker->GetSelectedMDLName( szModel, sizeof(szModel) );
|
||||
|
||||
m_pStatusLine->SetText( szModel );
|
||||
|
||||
/* MDLHandle_t hMDL = vgui::MDLCache()->FindMDL( szModel );
|
||||
|
||||
studiohdr_t *hdr = vgui::MDLCache()->GetStudioHdr( hMDL );
|
||||
|
||||
vgui::MDLCache()->Release( hMDL ); */
|
||||
}
|
||||
|
||||
void CModelBrowser::SaveLoadSettings( bool bSave )
|
||||
{
|
||||
CString str;
|
||||
CRect rect;
|
||||
CWinApp *pApp = AfxGetApp();
|
||||
|
||||
if ( bSave )
|
||||
{
|
||||
GetWindowRect(rect);
|
||||
str.Format("%d %d %d %d", rect.left, rect.top, rect.right, rect.bottom);
|
||||
pApp->WriteProfileString(pszIniSection, "Position", str);
|
||||
pApp->WriteProfileString(pszIniSection, "Filter", m_pPicker->GetFilter() );
|
||||
}
|
||||
else
|
||||
{
|
||||
str = pApp->GetProfileString(pszIniSection, "Position");
|
||||
|
||||
if (!str.IsEmpty())
|
||||
{
|
||||
sscanf(str, "%d %d %d %d", &rect.left, &rect.top, &rect.right, &rect.bottom);
|
||||
|
||||
if (rect.left < 0)
|
||||
{
|
||||
ShowWindow(SW_SHOWMAXIMIZED);
|
||||
}
|
||||
else
|
||||
{
|
||||
MoveWindow(rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, FALSE);
|
||||
}
|
||||
|
||||
Resize();
|
||||
}
|
||||
|
||||
str = pApp->GetProfileString(pszIniSection, "Filter");
|
||||
|
||||
if (!str.IsEmpty())
|
||||
{
|
||||
m_pPicker->SetFilter( str );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CModelBrowser::DoDataExchange(CDataExchange* pDX)
|
||||
{
|
||||
CDialog::DoDataExchange(pDX);
|
||||
}
|
||||
|
||||
void CModelBrowser::Resize()
|
||||
{
|
||||
// reposition controls
|
||||
CRect rect;
|
||||
GetClientRect(&rect);
|
||||
|
||||
m_VGuiWindow.MoveWindow( rect );
|
||||
|
||||
m_pPicker->SetBounds( 0,0, rect.Width(), rect.Height() - 32 );
|
||||
m_pButtonCancel->SetPos( 8, rect.Height() - 30 );
|
||||
m_pButtonOK->SetPos( 84, rect.Height() - 30 );
|
||||
m_pStatusLine->SetBounds( 160, rect.Height() - 30, max( 100, rect.Width() - 166 ), 24 );
|
||||
}
|
||||
|
||||
void CModelBrowser::OnSize(UINT nType, int cx, int cy)
|
||||
{
|
||||
if (nType == SIZE_MINIMIZED || !IsWindow(m_VGuiWindow.m_hWnd) )
|
||||
{
|
||||
CDialog::OnSize(nType, cx, cy);
|
||||
return;
|
||||
}
|
||||
|
||||
Resize();
|
||||
|
||||
CDialog::OnSize(nType, cx, cy);
|
||||
}
|
||||
|
||||
|
||||
BEGIN_MESSAGE_MAP(CModelBrowser, CDialog)
|
||||
ON_WM_SIZE()
|
||||
ON_WM_DESTROY()
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
BOOL CModelBrowser::PreTranslateMessage( MSG* pMsg )
|
||||
{
|
||||
// don't filter dialog message
|
||||
return CWnd::PreTranslateMessage( pMsg );
|
||||
}
|
||||
|
||||
BOOL CModelBrowser::OnInitDialog()
|
||||
{
|
||||
CDialog::OnInitDialog();
|
||||
|
||||
m_VGuiWindow.Create( NULL, _T("ModelViewer"), WS_VISIBLE|WS_CHILD, CRect(0,0,100,100), this, 1001);
|
||||
|
||||
vgui::EditablePanel *pMainPanel = new CModelBrowserPanel( this, "ModelBrowerPanel" );
|
||||
|
||||
m_VGuiWindow.SetParentWindow( &m_VGuiWindow );
|
||||
m_VGuiWindow.SetMainPanel( pMainPanel );
|
||||
pMainPanel->MakePopup( false, false );
|
||||
m_VGuiWindow.SetRepaintInterval( 75 );
|
||||
|
||||
|
||||
m_pPicker->SetParent( pMainPanel );
|
||||
m_pPicker->AddActionSignalTarget( pMainPanel );
|
||||
|
||||
m_pButtonOK->SetParent( pMainPanel );
|
||||
m_pButtonOK->AddActionSignalTarget( pMainPanel );
|
||||
m_pButtonOK->SetCommand( "OK" );
|
||||
|
||||
m_pButtonCancel->SetParent( pMainPanel );
|
||||
m_pButtonCancel->AddActionSignalTarget( pMainPanel );
|
||||
m_pButtonCancel->SetCommand( "Cancel" );
|
||||
|
||||
m_pStatusLine->SetParent( pMainPanel );
|
||||
m_pStatusLine->SetEditable( false );
|
||||
|
||||
SaveLoadSettings( false ); // load
|
||||
|
||||
m_pPicker->Activate();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void CModelBrowser::OnDestroy()
|
||||
{
|
||||
SaveLoadSettings( true ); // save
|
||||
|
||||
// model browser destoys our defualt cube map, reload it
|
||||
g_Textures.RebindDefaultCubeMap();
|
||||
|
||||
CDialog::OnDestroy();
|
||||
}
|
||||
|
||||
void CModelBrowser::Show()
|
||||
{
|
||||
if (m_pPicker)
|
||||
{
|
||||
m_pPicker->SetVisible( true );
|
||||
}
|
||||
if (m_pStatusLine)
|
||||
m_pStatusLine->SetVisible( true );
|
||||
if (m_pButtonOK)
|
||||
m_pButtonOK->SetVisible( true );
|
||||
if (m_pButtonCancel)
|
||||
m_pButtonCancel->SetVisible( true );
|
||||
|
||||
}
|
||||
void CModelBrowser::Hide()
|
||||
{
|
||||
if (m_pPicker)
|
||||
m_pPicker->SetVisible( false );
|
||||
|
||||
if (m_pStatusLine)
|
||||
m_pStatusLine->SetVisible( false );
|
||||
|
||||
if (m_pButtonOK)
|
||||
m_pButtonOK->SetVisible( false );
|
||||
|
||||
if (m_pButtonCancel)
|
||||
m_pButtonCancel->SetVisible( false );
|
||||
}
|
||||
Reference in New Issue
Block a user