507 lines
12 KiB
C++
507 lines
12 KiB
C++
// ViewPane.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "ViewPane.h"
|
|
#include "ViewManager.h"
|
|
|
|
#include "LayoutWnd.h"
|
|
#include "Viewport.h"
|
|
#include "LayoutConfigDialog.h"
|
|
|
|
#include "TopRendererWnd.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#define ID_MAXIMIZED 50000
|
|
#define ID_LAYOUT_CONFIG 50001
|
|
#define FIRST_ID_VIEWPORT 50100
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CViewPane
|
|
|
|
IMPLEMENT_DYNCREATE(CViewPane, CView)
|
|
|
|
BEGIN_MESSAGE_MAP(CViewPane, CView)
|
|
//{{AFX_MSG_MAP(CViewPane)
|
|
ON_WM_CREATE()
|
|
ON_WM_LBUTTONDBLCLK()
|
|
ON_WM_SIZE()
|
|
ON_WM_ERASEBKGND()
|
|
ON_WM_DESTROY()
|
|
ON_WM_MOUSEWHEEL()
|
|
ON_WM_RBUTTONDOWN()
|
|
ON_WM_SETFOCUS()
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
CViewPane::CViewPane()
|
|
{
|
|
m_viewportType = ET_ViewportUnknown;
|
|
|
|
m_viewport = 0;
|
|
m_active = 0;
|
|
m_nBorder = 1;
|
|
|
|
m_titleHeight = 16;
|
|
m_bFullscreen = false;
|
|
|
|
m_id = -1;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
CViewPane::~CViewPane()
|
|
{
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CViewPane::OnDestroy()
|
|
{
|
|
DetachViewport();
|
|
|
|
CView::OnDestroy();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CViewPane drawing
|
|
|
|
void CViewPane::OnDraw(CDC* pDC)
|
|
{
|
|
////////////////////////////////////////////////////////////////////////
|
|
// Paint the window with a gray brush and draw the view controls and
|
|
// the view's caption. Also draw the context menu button
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
//CPaintDC dc(this);
|
|
CDC &dc = *pDC;
|
|
|
|
CDC cBmpDC;
|
|
CRect rect, rectScreen;
|
|
CBrush cFillBrush;
|
|
CString cWindowText;
|
|
CFont cFont;
|
|
CBitmap cViewTools;
|
|
CBrush cGreenBrush(0x0022FF22);
|
|
CBrush cWhiteBrush(0x00FFFFFF);
|
|
|
|
//bool active = GetFocus() == m_viewport;
|
|
bool active = m_active;
|
|
|
|
// Create a font and select it into the DC. make the font bold if this is the
|
|
// active view
|
|
VERIFY(cFont.CreateFont(-::MulDiv(8, GetDeviceCaps(dc.m_hDC, LOGPIXELSY), 72), 0, 0, 0,
|
|
(active) ? FW_BOLD : FW_DONTCARE, FALSE, FALSE, FALSE,
|
|
ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
|
|
DEFAULT_PITCH, "Tahoma"));
|
|
dc.SelectObject(cFont);
|
|
|
|
// Get the rect of the client window
|
|
GetClientRect(&rect);
|
|
|
|
CRect vpRect( m_nBorder,m_nBorder+m_titleHeight-1,rect.right-m_nBorder-1,rect.bottom-m_nBorder-m_titleHeight );
|
|
|
|
if (!m_viewport)
|
|
dc.FillRect(&rect, &cWhiteBrush);
|
|
|
|
bool bHighlightTitle = false;
|
|
if (m_viewport)
|
|
{
|
|
if (m_viewport->IsAVIRecording() || GetIEditor()->GetAnimation()->IsRecording())
|
|
bHighlightTitle = true;
|
|
}
|
|
|
|
COLORREF cTextColor = dc.GetTextColor();
|
|
|
|
// Create a Title filled rect.
|
|
rect.bottom = m_titleHeight;
|
|
if (!bHighlightTitle)
|
|
{
|
|
cFillBrush.m_hObject = ::GetSysColorBrush(COLOR_BTNFACE);
|
|
}
|
|
else
|
|
{
|
|
cFillBrush.CreateSolidBrush(RGB(255,0,0));
|
|
cTextColor = RGB(255,255,255);
|
|
}
|
|
dc.FillRect(&rect, &cFillBrush);
|
|
|
|
|
|
// Get a client rect and prepare writing the view's name
|
|
GetClientRect(&rect);
|
|
GetWindowText(cWindowText);
|
|
dc.SetBkMode(TRANSPARENT);
|
|
|
|
CString sTitleText = cWindowText;
|
|
sTitleText.Format( "%s (%dx%d)",(const char*)cWindowText,(int)vpRect.Width(),(int)vpRect.Height() );
|
|
|
|
COLORREF cPrevTextColor = dc.SetTextColor( cTextColor );
|
|
// Write the view's name
|
|
rect.top += 1;
|
|
dc.DrawText(sTitleText, rect, DT_CENTER);
|
|
dc.SetTextColor( cPrevTextColor );
|
|
|
|
// Draw the button for the view's menu
|
|
GetClientRect(&rect);
|
|
rect.left = rect.right - 12;
|
|
rect.right -= 3;
|
|
rect.top = 3;
|
|
rect.bottom = 12;
|
|
dc.DrawFrameControl(&rect, DFC_BUTTON, ((active) ? DFCS_BUTTONPUSH : DFCS_BUTTONPUSH) | DFCS_FLAT);
|
|
|
|
// Draw selection.
|
|
GetClientRect(&rect);
|
|
CPen pen;
|
|
if (active)
|
|
pen.CreatePen(PS_SOLID, 1, RGB(255,0,0));
|
|
else
|
|
pen.CreatePen(PS_SOLID, 1, RGB(255,255,255));
|
|
|
|
dc.SelectObject( pen );
|
|
dc.MoveTo( 0,0 );
|
|
dc.LineTo( rect.right-1,0 );
|
|
dc.LineTo( rect.right-1,rect.bottom-1 );
|
|
dc.LineTo( 0,rect.bottom-1 );
|
|
dc.LineTo( 0,0 );
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CViewPane diagnostics
|
|
|
|
#ifdef _DEBUG
|
|
void CViewPane::AssertValid() const
|
|
{
|
|
//CView::AssertValid();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CViewPane::Dump(CDumpContext& dc) const
|
|
{
|
|
//CView::Dump(dc);
|
|
}
|
|
|
|
#endif //_DEBUG
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
int CViewPane::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
|
{
|
|
CLogFile::WriteLine("Creating view...");
|
|
if (CView::OnCreate(lpCreateStruct) == -1)
|
|
return -1;
|
|
|
|
// TODO: Add your specialized creation code here
|
|
//m_viewport.Create( this,"EditWnd",m_editSink );
|
|
|
|
// Create the standard toolbar
|
|
//m_toolBar.CreateEx(this, TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP);
|
|
//m_toolBar.LoadToolBar(IDR_VIEW);
|
|
|
|
return 0;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CViewPane::AssignViewport( EViewportType type )
|
|
{
|
|
m_viewportType = type;
|
|
|
|
CViewport *viewport = GetIEditor()->GetViewManager()->CreateView( m_viewportType,this );
|
|
if (viewport != m_viewport && m_viewport)
|
|
{
|
|
DetachViewport();
|
|
}
|
|
m_viewport = viewport;
|
|
if (m_viewport)
|
|
{
|
|
SetViewport( m_viewport );
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CViewPane::SetViewport( CViewport *pViewport )
|
|
{
|
|
if (pViewport)
|
|
{
|
|
m_viewport = pViewport;
|
|
m_viewportType = pViewport->GetType();
|
|
|
|
m_viewport->ModifyStyle( WS_POPUP,WS_CHILD,0 );
|
|
m_viewport->SetParent( this );
|
|
m_viewport->ShowWindow( SW_SHOW );
|
|
|
|
CRect rc;
|
|
GetClientRect( rc );
|
|
m_viewport->MoveWindow( m_nBorder,m_nBorder+m_titleHeight-1,rc.right-m_nBorder-1,rc.bottom-m_nBorder-m_titleHeight );
|
|
SetWindowText( m_viewport->GetName() );
|
|
m_viewport->Invalidate(FALSE);
|
|
Invalidate(FALSE);
|
|
}
|
|
else
|
|
{
|
|
m_viewport = 0;
|
|
m_viewportType = ET_ViewportUnknown;
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CViewPane::SwapViewports( CViewPane *pView )
|
|
{
|
|
CViewport *pViewport = pView->GetViewport();
|
|
CViewport *pViewportOld = m_viewport;
|
|
|
|
SetViewport( pViewport );
|
|
pView->SetViewport(pViewportOld);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CViewPane::DetachViewport()
|
|
{
|
|
if (m_viewport && m_viewport->m_hWnd != 0)
|
|
{
|
|
m_viewport->ShowWindow( SW_HIDE );
|
|
m_viewport->SetParent( 0 );
|
|
m_viewport->ModifyStyle( WS_CHILD,WS_POPUP,0 );
|
|
GetIEditor()->GetViewManager()->ReleaseView(m_viewport);
|
|
m_viewport = 0;
|
|
}
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CViewPane::OnSize(UINT nType, int cx, int cy)
|
|
{
|
|
CView::OnSize(nType, cx, cy);
|
|
|
|
int toolHeight = 0;
|
|
|
|
/*
|
|
// TODO: Add your message handler code here
|
|
if (m_toolBar)
|
|
{
|
|
CRect rc;
|
|
m_toolBar.MoveWindow( 0,0,cx-1,20 );
|
|
m_toolBar.GetWindowRect( rc );
|
|
toolHeight = rc.bottom - rc.top;
|
|
}
|
|
*/
|
|
int nBorder = 2;
|
|
|
|
if (m_viewport)
|
|
m_viewport->MoveWindow( m_nBorder,m_nBorder+m_titleHeight-1,cx-m_nBorder-1,cy-m_nBorder-m_titleHeight );
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
BOOL CViewPane::OnEraseBkgnd(CDC* pDC)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
// Do nothing.
|
|
return FALSE;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CViewPane::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView)
|
|
{
|
|
// TODO: Add your specialized code here and/or call the base class
|
|
|
|
CView::OnActivateView(bActivate, pActivateView, pDeactiveView);
|
|
|
|
m_active = bActivate;
|
|
if (bActivate)
|
|
{
|
|
if (m_viewport)
|
|
{
|
|
m_viewport->SetActive(true);
|
|
m_viewport->SetFocus();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (m_viewport)
|
|
m_viewport->SetActive(false);
|
|
}
|
|
|
|
RedrawWindow();
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CViewPane::OnRButtonDown(UINT nFlags, CPoint point)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
CView::OnRButtonDown(nFlags, point);
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
// Process clicks on the view buttons and the menu button
|
|
////////////////////////////////////////////////////////////////////////
|
|
RECT rcClient;
|
|
// Only continue when we have a viewport.
|
|
|
|
// Call the event handler
|
|
GetClientRect(&rcClient);
|
|
ClientToScreen( &point );
|
|
|
|
// Create pop up menu.
|
|
CMenu m;
|
|
CMenu viewsMenu;
|
|
m.CreatePopupMenu();
|
|
viewsMenu.CreatePopupMenu();
|
|
|
|
if (m_viewport)
|
|
m_viewport->OnTitleMenu( m );
|
|
if (m.GetMenuItemCount() > 0)
|
|
{
|
|
m.AppendMenu( MF_SEPARATOR,0,"" );
|
|
}
|
|
m.AppendMenu( MF_STRING|((IsFullscreen())?MF_CHECKED:MF_UNCHECKED),ID_MAXIMIZED,"Maximized" );
|
|
m.AppendMenu( MF_POPUP,(UINT_PTR)viewsMenu.GetSafeHmenu(),"View" );
|
|
m.AppendMenu( MF_STRING|((IsFullscreen())?MF_CHECKED:MF_UNCHECKED),ID_LAYOUT_CONFIG,"Configure Layout..." );
|
|
|
|
std::vector<CViewportDesc*> vdesc;
|
|
GetIEditor()->GetViewManager()->GetViewportDescriptions( vdesc );
|
|
for (int i = 0; i < vdesc.size(); i++)
|
|
{
|
|
int flags = MF_STRING;
|
|
if (vdesc[i]->type == m_viewportType)
|
|
flags |= MF_CHECKED;
|
|
else
|
|
flags |= MF_UNCHECKED;
|
|
if (m_viewportType == ET_ViewportCamera || vdesc[i]->type == ET_ViewportCamera)
|
|
flags |= MF_GRAYED;
|
|
viewsMenu.AppendMenu( flags, FIRST_ID_VIEWPORT+i,vdesc[i]->name );
|
|
}
|
|
|
|
/*
|
|
int ViewId = 101;
|
|
// Append other viewes.
|
|
std::vector<CViewport*> views;
|
|
CViewManager::Instance()->GetViews( views );
|
|
for (int i = 0; i < views.size(); i++)
|
|
{
|
|
m.AppendMenu( MF_STRING|((IsFullscreen())?MF_CHECKED:MF_UNCHECKED),ViewId+i,views[i]->GetViewName() );
|
|
}
|
|
*/
|
|
|
|
int id = m.TrackPopupMenu( TPM_RETURNCMD|TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,this );
|
|
// Ids above 100 reserved for view pane commands.
|
|
if (id < ID_MAXIMIZED)
|
|
{
|
|
if (m_viewport)
|
|
m_viewport->OnTitleMenuCommand( id );
|
|
} else if (id >= FIRST_ID_VIEWPORT)
|
|
{
|
|
// Viewport type specified.
|
|
id = id - FIRST_ID_VIEWPORT;
|
|
if (vdesc[id]->type != m_viewportType)
|
|
{
|
|
CLayoutWnd *wnd = GetIEditor()->GetViewManager()->GetLayout();
|
|
if (wnd)
|
|
{
|
|
DetachViewport();
|
|
wnd->AssignViewport( this,vdesc[id]->type );
|
|
}
|
|
}
|
|
} else {
|
|
CLayoutWnd *layout = GetIEditor()->GetViewManager()->GetLayout();
|
|
switch (id)
|
|
{
|
|
case ID_MAXIMIZED:
|
|
if (m_viewport && layout)
|
|
{
|
|
layout->MaximizeViewport( GetId() );
|
|
//SetFullscreenViewport(true);
|
|
}
|
|
break;
|
|
|
|
case ID_LAYOUT_CONFIG:
|
|
{
|
|
if (layout)
|
|
{
|
|
CLayoutConfigDialog dlg;
|
|
dlg.SetLayout( layout->GetLayout() );
|
|
if (dlg.DoModal() == IDOK)
|
|
{
|
|
// Will kill this Pane. so must be last line in this function.
|
|
layout->CreateLayout( dlg.GetLayout() );
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void CViewPane::OnLButtonDblClk(UINT nFlags, CPoint point)
|
|
{
|
|
////////////////////////////////////////////////////////////////////////
|
|
// Switch in and out of fullscreen mode for a edit view
|
|
////////////////////////////////////////////////////////////////////////
|
|
CLayoutWnd *wnd = GetIEditor()->GetViewManager()->GetLayout();
|
|
if (wnd)
|
|
wnd->MaximizeViewport( GetId() );
|
|
}
|
|
|
|
BOOL CViewPane::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
|
|
{
|
|
// TODO: Add your message handler code here and/or call default
|
|
|
|
return CView::OnMouseWheel(nFlags, zDelta, pt);
|
|
}
|
|
|
|
void CViewPane::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
|
|
{
|
|
// TODO: Add your specialized code here and/or call the base class
|
|
if (m_viewport)
|
|
m_viewport->UpdateContent( 0xFFFFFFFF );
|
|
}
|
|
|
|
void CViewPane::OnSetFocus(CWnd* pOldWnd)
|
|
{
|
|
CView::OnSetFocus(pOldWnd);
|
|
|
|
// Forward SetFocus call to child viewport.
|
|
if (m_viewport)
|
|
m_viewport->SetFocus();
|
|
}
|
|
|
|
BOOL CViewPane::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
|
|
{
|
|
// Extend the framework's command route from the view to
|
|
// the application-specific CMyShape that is currently selected
|
|
// in the view. m_pActiveShape is NULL if no shape object
|
|
// is currently selected in the view.
|
|
if ((m_viewport != NULL)
|
|
&& m_viewport->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
|
|
return TRUE;
|
|
|
|
|
|
return CView::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
|
|
}
|
|
|
|
void CViewPane::SetFullscren( bool f )
|
|
{
|
|
m_bFullscreen = f;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
void CViewPane::SetFullscreenViewport( bool b )
|
|
{
|
|
if (!m_viewport)
|
|
return;
|
|
|
|
if (b)
|
|
{
|
|
m_viewport->SetParent( 0 );
|
|
m_viewport->ModifyStyle( WS_CHILD,WS_POPUP,0 );
|
|
|
|
GetIEditor()->GetRenderer()->ChangeResolution( 800,600,32,80,true );
|
|
|
|
}
|
|
else
|
|
{
|
|
m_viewport->SetParent( this );
|
|
m_viewport->ModifyStyle( WS_POPUP,WS_CHILD,0 );
|
|
GetIEditor()->GetRenderer()->ChangeResolution( 800,600,32,80,false );
|
|
}
|
|
}
|