summaryrefslogtreecommitdiff
path: root/hammer/ModelBrowser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'hammer/ModelBrowser.cpp')
-rw-r--r--hammer/ModelBrowser.cpp300
1 files changed, 300 insertions, 0 deletions
diff --git a/hammer/ModelBrowser.cpp b/hammer/ModelBrowser.cpp
new file mode 100644
index 0000000..eb39b33
--- /dev/null
+++ b/hammer/ModelBrowser.cpp
@@ -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 );
+}