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.
303 lines
6.5 KiB
303 lines
6.5 KiB
//===== Copyright © 1996-2007, Valve Corporation, All rights reserved. ======//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $Workfile: $
|
|
// $Date: $
|
|
// $NoKeywords: $
|
|
//===========================================================================//
|
|
|
|
#include "stdafx.h"
|
|
#include "vguiwnd.h"
|
|
#include <vgui_controls/EditablePanel.h>
|
|
#include "vgui/ISurface.h"
|
|
#include "vgui/IVGui.h"
|
|
#include "VGuiMatSurface/IMatSystemSurface.h"
|
|
#include "HammerVGui.h"
|
|
#include "material.h"
|
|
#include "istudiorender.h"
|
|
#include "hammer.h"
|
|
#include "toolutils/enginetools_int.h"
|
|
#include "toolframework/ienginetool.h"
|
|
#include "ienginevgui.h"
|
|
|
|
|
|
IMPLEMENT_DYNCREATE(CVGuiPanelWnd, CWnd)
|
|
|
|
#define REPAINT_TIMER_ID 1042 //random value, hopfully no collisions
|
|
|
|
class CBaseMainPanel : public vgui::EditablePanel
|
|
{
|
|
public:
|
|
|
|
CBaseMainPanel(Panel *parent, const char *panelName) : vgui::EditablePanel( parent, panelName ) {};
|
|
|
|
virtual void OnSizeChanged(int newWide, int newTall)
|
|
{
|
|
// call Panel and not EditablePanel OnSizeChanged.
|
|
Panel::OnSizeChanged(newWide, newTall);
|
|
}
|
|
};
|
|
|
|
LRESULT CVGuiPanelWnd::WindowProc( UINT message, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
if ( !WindowProcVGui( message, wParam, lParam ) )
|
|
{
|
|
return CWnd::WindowProc( message, wParam, lParam ) ;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
BOOL CVGuiPanelWnd::OnEraseBkgnd(CDC* pDC)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CVGuiPanelWnd, CWnd)
|
|
ON_WM_ERASEBKGND()
|
|
END_MESSAGE_MAP()
|
|
|
|
CVGuiWnd::CVGuiWnd(void)
|
|
{
|
|
m_pMainPanel = NULL;
|
|
m_pParentWnd = NULL;
|
|
m_hVGuiContext = vgui::DEFAULT_VGUI_CONTEXT;
|
|
m_bIsDrawing = false;
|
|
m_ClearColor.SetColor( 0,0,0,255 );
|
|
m_bClearZBuffer = true;
|
|
}
|
|
|
|
CVGuiWnd::~CVGuiWnd(void)
|
|
{
|
|
if ( HammerVGui()->HasFocus( this ) )
|
|
{
|
|
HammerVGui()->SetFocus( NULL );
|
|
}
|
|
|
|
if ( m_hVGuiContext != vgui::DEFAULT_VGUI_CONTEXT )
|
|
{
|
|
vgui::ivgui()->DestroyContext( m_hVGuiContext );
|
|
m_hVGuiContext = vgui::DEFAULT_VGUI_CONTEXT;
|
|
}
|
|
|
|
// kill the timer if any
|
|
::KillTimer( m_pParentWnd->GetSafeHwnd(), REPAINT_TIMER_ID );
|
|
|
|
|
|
if ( m_pMainPanel )
|
|
m_pMainPanel->MarkForDeletion();
|
|
}
|
|
|
|
void CVGuiWnd::SetParentWindow(CWnd *pParent)
|
|
{
|
|
m_pParentWnd = pParent;
|
|
|
|
m_pParentWnd->EnableWindow( true );
|
|
m_pParentWnd->SetFocus();
|
|
}
|
|
|
|
int CVGuiWnd::GetVGuiContext()
|
|
{
|
|
return m_hVGuiContext;
|
|
}
|
|
|
|
void CVGuiWnd::SetCursor(vgui::HCursor cursor)
|
|
{
|
|
if ( m_pMainPanel )
|
|
{
|
|
m_pMainPanel->SetCursor( cursor );
|
|
}
|
|
}
|
|
|
|
void CVGuiWnd::SetCursor(const char *filename)
|
|
{
|
|
vgui::HCursor hCursor = vgui::surface()->CreateCursorFromFile( filename );
|
|
m_pMainPanel->SetCursor( hCursor );
|
|
}
|
|
|
|
void CVGuiWnd::SetMainPanel( vgui::EditablePanel * pPanel )
|
|
{
|
|
Assert( m_pMainPanel == NULL );
|
|
Assert( m_hVGuiContext == vgui::DEFAULT_VGUI_CONTEXT );
|
|
|
|
m_pMainPanel = pPanel;
|
|
|
|
m_pMainPanel->SetParent( vgui::surface()->GetEmbeddedPanel() );
|
|
m_pMainPanel->SetVisible( true );
|
|
m_pMainPanel->SetPaintBackgroundEnabled( false );
|
|
m_pMainPanel->SetCursor( vgui::dc_arrow );
|
|
|
|
// Initially, don't trap mouse input in case the engine is around (if we have this set to true and they go to the engine,
|
|
// it'll hog mouse input that the engine should get).
|
|
m_pMainPanel->SetMouseInputEnabled( false );
|
|
|
|
m_hVGuiContext = vgui::ivgui()->CreateContext();
|
|
vgui::ivgui()->AssociatePanelWithContext( m_hVGuiContext, m_pMainPanel->GetVPanel() );
|
|
}
|
|
|
|
vgui::EditablePanel *CVGuiWnd::CreateDefaultPanel()
|
|
{
|
|
return new CBaseMainPanel( NULL, "mainpanel" );
|
|
}
|
|
|
|
vgui::EditablePanel *CVGuiWnd::GetMainPanel()
|
|
{
|
|
return m_pMainPanel;
|
|
}
|
|
|
|
CWnd *CVGuiWnd::GetParentWnd()
|
|
{
|
|
return m_pParentWnd;
|
|
}
|
|
|
|
void CVGuiWnd::SetRepaintInterval( int msecs )
|
|
{
|
|
::SetTimer( m_pParentWnd->GetSafeHwnd(), REPAINT_TIMER_ID, msecs, NULL );
|
|
}
|
|
|
|
void CVGuiWnd::DrawVGuiPanel()
|
|
{
|
|
if ( !m_pMainPanel || !m_pParentWnd || m_bIsDrawing )
|
|
return;
|
|
|
|
m_bIsDrawing = true; // avoid recursion
|
|
|
|
HWND hWnd = m_pParentWnd->GetSafeHwnd();
|
|
|
|
int w,h;
|
|
RECT rect; ::GetClientRect(hWnd, &rect);
|
|
CMatRenderContextPtr pRenderContext( MaterialSystemInterface() );
|
|
|
|
MaterialSystemInterface()->SetView( hWnd );
|
|
|
|
pRenderContext->Viewport( 0, 0, rect.right, rect.bottom );
|
|
|
|
pRenderContext->ClearColor4ub( m_ClearColor.r(), m_ClearColor.g(), m_ClearColor.b(), m_ClearColor.a() );
|
|
|
|
pRenderContext->ClearBuffers( true, m_bClearZBuffer );
|
|
|
|
MaterialSystemInterface()->BeginFrame( 0 );
|
|
g_pStudioRender->BeginFrame();
|
|
|
|
// draw from the main panel down
|
|
|
|
m_pMainPanel->GetSize( w , h );
|
|
|
|
if ( w != rect.right || h != rect.bottom )
|
|
{
|
|
m_pMainPanel->SetBounds(0, 0, rect.right, rect.bottom );
|
|
m_pMainPanel->Repaint();
|
|
}
|
|
|
|
HammerVGui()->Simulate();
|
|
|
|
// Don't draw the engine's vgui stuff when in .
|
|
int iWasVisible = -1;
|
|
vgui::VPANEL hRoot = NULL;
|
|
if ( APP()->IsFoundryMode() && enginevgui )
|
|
{
|
|
hRoot = enginevgui->GetPanel( PANEL_ROOT );
|
|
iWasVisible = g_pVGuiPanel->IsVisible( hRoot );
|
|
g_pVGuiPanel->SetVisible( hRoot, false );
|
|
}
|
|
|
|
vgui::surface()->RestrictPaintToSinglePanel( m_pMainPanel->GetVPanel(), true );
|
|
vgui::surface()->PaintTraverseEx( m_pMainPanel->GetVPanel(), true );
|
|
vgui::surface()->RestrictPaintToSinglePanel( NULL );
|
|
|
|
if ( iWasVisible != -1 )
|
|
{
|
|
g_pVGuiPanel->SetVisible( hRoot, (iWasVisible != 0) );
|
|
}
|
|
|
|
g_pStudioRender->EndFrame();
|
|
MaterialSystemInterface()->EndFrame();
|
|
|
|
MaterialSystemInterface()->SwapBuffers();
|
|
|
|
if ( enginetools )
|
|
{
|
|
MaterialSystemInterface()->SetView( enginetools->GetEngineHwnd() );
|
|
}
|
|
|
|
m_bIsDrawing = false;
|
|
}
|
|
|
|
LRESULT CVGuiWnd::WindowProcVGui( UINT uMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
switch(uMsg)
|
|
{
|
|
|
|
case WM_GETDLGCODE :
|
|
{
|
|
// forward all keyboard into to vgui panel
|
|
return DLGC_WANTALLKEYS|DLGC_WANTCHARS;
|
|
}
|
|
|
|
case WM_PAINT :
|
|
{
|
|
// draw the VGUI panel now
|
|
DrawVGuiPanel();
|
|
break;
|
|
}
|
|
|
|
case WM_TIMER :
|
|
{
|
|
if ( wParam == REPAINT_TIMER_ID )
|
|
{
|
|
m_pParentWnd->Invalidate();
|
|
}
|
|
break;
|
|
}
|
|
|
|
case WM_SETCURSOR:
|
|
return 1; // don't pass WM_SETCURSOR
|
|
|
|
case WM_LBUTTONDOWN:
|
|
case WM_RBUTTONDOWN:
|
|
case WM_MBUTTONDOWN:
|
|
case WM_MOUSEMOVE:
|
|
{
|
|
// switch vgui focus to this panel
|
|
HammerVGui()->SetFocus( this );
|
|
|
|
// request keyboard focus too on mouse down
|
|
if ( uMsg != WM_MOUSEMOVE)
|
|
{
|
|
m_pParentWnd->Invalidate();
|
|
m_pParentWnd->SetFocus();
|
|
}
|
|
break;
|
|
}
|
|
case WM_KILLFOCUS:
|
|
{
|
|
// restore normal arrow cursor when mouse leaves VGUI panel
|
|
SetCursor( vgui::dc_arrow );
|
|
break;
|
|
}
|
|
|
|
case WM_LBUTTONUP:
|
|
case WM_RBUTTONUP:
|
|
case WM_MBUTTONUP:
|
|
case WM_LBUTTONDBLCLK:
|
|
case WM_RBUTTONDBLCLK:
|
|
case WM_MBUTTONDBLCLK:
|
|
case WM_MOUSEWHEEL:
|
|
case WM_KEYDOWN:
|
|
case WM_SYSKEYDOWN:
|
|
case WM_SYSCHAR:
|
|
case WM_CHAR:
|
|
case WM_KEYUP:
|
|
case WM_SYSKEYUP:
|
|
{
|
|
// redraw window
|
|
if ( m_pParentWnd )
|
|
{
|
|
m_pParentWnd->Invalidate();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|