You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
300 lines
6.4 KiB
300 lines
6.4 KiB
//========= 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 ); |
|
}
|
|
|