mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-11-29 21:25:54 +01:00
322 lines
8.6 KiB
C++
322 lines
8.6 KiB
C++
/* Copyright (c) 2002-2012 Croteam Ltd.
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of version 2 of the GNU General Public License as published by
|
|
the Free Software Foundation
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
|
|
|
|
// InfoSheet.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "InfoSheet.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef new
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CInfoSheet
|
|
#define CALLACTIVEPAGE(function, parameter) \
|
|
if( pgActivPage == &m_PgGlobal) \
|
|
m_PgGlobal.function( parameter); \
|
|
if( pgActivPage == &m_PgTerrain) \
|
|
m_PgTerrain.function( parameter); \
|
|
if( pgActivPage == &m_PgPosition) \
|
|
m_PgPosition.function( parameter); \
|
|
if( pgActivPage == &m_PgRenderingStatistics) \
|
|
m_PgRenderingStatistics.function( parameter); \
|
|
if( pgActivPage == &m_PgPolygon) \
|
|
m_PgPolygon.function( parameter); \
|
|
if( pgActivPage == &m_PgShadow) \
|
|
m_PgShadow.function( parameter); \
|
|
if( pgActivPage == &m_PgSector) \
|
|
m_PgSector.function( parameter); \
|
|
if( pgActivPage == &m_PgTexture) \
|
|
m_PgTexture.function( parameter); \
|
|
if( pgActivPage == &m_PgPrimitive) \
|
|
m_PgPrimitive.function( parameter);
|
|
|
|
|
|
IMPLEMENT_DYNAMIC(CInfoSheet, CPropertySheet)
|
|
|
|
CInfoSheet::CInfoSheet(CWnd* pWndParent)
|
|
: CPropertySheet(AFX_IDS_APP_TITLE, pWndParent)
|
|
{
|
|
// Add all pages so frame could get bounding sizes of all of them
|
|
AddPage( &m_PgGlobal);
|
|
AddPage( &m_PgTerrain);
|
|
AddPage( &m_PgPosition);
|
|
AddPage( &m_PgPrimitive);
|
|
//AddPage( &m_PgRenderingStatistics);
|
|
AddPage( &m_PgPolygon);
|
|
AddPage( &m_PgShadow);
|
|
AddPage( &m_PgSector);
|
|
AddPage( &m_PgTexture);
|
|
SoftSetActivePage(0);
|
|
// set mode that will be discarded on first OnIdle()
|
|
m_ModeID = INFO_MODE_ALL;
|
|
}
|
|
|
|
CInfoSheet::~CInfoSheet()
|
|
{
|
|
}
|
|
|
|
// don't take focus
|
|
void CInfoSheet::SoftSetActivePage( INDEX iActivePage)
|
|
{
|
|
// get active view
|
|
CWorldEditorView *pWorldEditorView = theApp.GetActiveView();
|
|
SetActivePage( iActivePage);
|
|
if( pWorldEditorView != NULL)
|
|
{
|
|
// pWorldEditorView->SetFocus();
|
|
}
|
|
}
|
|
|
|
BEGIN_MESSAGE_MAP(CInfoSheet, CPropertySheet)
|
|
//{{AFX_MSG_MAP(CInfoSheet)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CInfoSheet message handlers
|
|
|
|
void CInfoSheet::DoDataExchange(CDataExchange* pDX)
|
|
{
|
|
CPropertyPage *pgActivPage = GetActivePage();
|
|
CALLACTIVEPAGE(UpdateData, pDX->m_bSaveAndValidate);
|
|
|
|
CPropertySheet::DoDataExchange(pDX);
|
|
}
|
|
|
|
void CInfoSheet::DeleteAllPages()
|
|
{
|
|
// disable data exchange
|
|
theApp.m_bDisableDataExchange = TRUE;
|
|
INDEX iPagesCt, i;
|
|
iPagesCt = GetPageCount();
|
|
for( i=0; i<iPagesCt; i++)
|
|
RemovePage( 0);
|
|
// enable data exchange
|
|
theApp.m_bDisableDataExchange = FALSE;
|
|
}
|
|
|
|
void CInfoSheet::SetInfoModeGlobal(void)
|
|
{
|
|
m_ModeID = INFO_MODE_GLOBAL;
|
|
DeleteAllPages();
|
|
AddPage( &m_PgGlobal);
|
|
//AddPage( &m_PgRenderingStatistics);
|
|
SoftSetActivePage(0);
|
|
}
|
|
|
|
void CInfoSheet::SetInfoModePosition(void)
|
|
{
|
|
m_ModeID = INFO_MODE_POSITION;
|
|
DeleteAllPages();
|
|
AddPage( &m_PgGlobal);
|
|
//AddPage( &m_PgRenderingStatistics);
|
|
AddPage( &m_PgPosition);
|
|
SoftSetActivePage(1);
|
|
}
|
|
|
|
void CInfoSheet::SetInfoModePrimitive(void)
|
|
{
|
|
m_ModeID = INFO_MODE_PRIMITIVE;
|
|
DeleteAllPages();
|
|
AddPage( &m_PgGlobal);
|
|
//AddPage( &m_PgRenderingStatistics);
|
|
AddPage( &m_PgPosition);
|
|
AddPage( &m_PgPrimitive);
|
|
SoftSetActivePage(2);
|
|
}
|
|
|
|
INDEX _iLastActivePgInPolygonMode = 1;
|
|
void CInfoSheet::SetInfoModePolygon(void)
|
|
{
|
|
m_ModeID = INFO_MODE_POLYGON;
|
|
DeleteAllPages();
|
|
AddPage( &m_PgGlobal);
|
|
//AddPage( &m_PgRenderingStatistics);
|
|
AddPage( &m_PgPolygon);
|
|
AddPage( &m_PgShadow);
|
|
AddPage( &m_PgTexture);
|
|
SoftSetActivePage( _iLastActivePgInPolygonMode);
|
|
}
|
|
|
|
void CInfoSheet::SetInfoModeSector(void)
|
|
{
|
|
m_ModeID = INFO_MODE_SECTOR;
|
|
DeleteAllPages();
|
|
AddPage( &m_PgGlobal);
|
|
//AddPage( &m_PgRenderingStatistics);
|
|
AddPage( &m_PgSector);
|
|
SoftSetActivePage(1);
|
|
}
|
|
|
|
void CInfoSheet::SetInfoModeTerrain(void)
|
|
{
|
|
m_ModeID = INFO_MODE_TERRAIN;
|
|
DeleteAllPages();
|
|
AddPage( &m_PgGlobal);
|
|
AddPage( &m_PgTerrain);
|
|
SoftSetActivePage(1);
|
|
}
|
|
|
|
BOOL CInfoSheet::OnIdle(LONG lCount)
|
|
{
|
|
// get active view
|
|
CWorldEditorView *pWorldEditorView = theApp.GetActiveView();
|
|
// get active document
|
|
CWorldEditorDoc* pDoc = theApp.GetActiveDocument();
|
|
|
|
// if we don't have view
|
|
if( pDoc == NULL)
|
|
{
|
|
// force info mode: INFO_MODE_GLOBAL
|
|
if( m_ModeID != INFO_MODE_GLOBAL)
|
|
{
|
|
SetInfoModeGlobal();
|
|
CMainFrame* pMainFrame = STATIC_DOWNCAST(CMainFrame, AfxGetMainWnd());
|
|
pMainFrame->SetFocus();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// if CSG is on
|
|
if( pDoc->m_iMode == CSG_MODE)
|
|
{
|
|
ASSERT(pDoc->m_pwoSecondLayer != NULL);
|
|
// if CSG is done with primitive force info mode: INFO_MODE_PRIMITIVE
|
|
if( pDoc->m_bPrimitiveMode)
|
|
{
|
|
if( m_ModeID != INFO_MODE_PRIMITIVE)
|
|
{
|
|
// primitive mode includes position page
|
|
SetInfoModePrimitive();
|
|
}
|
|
}
|
|
// else force info mode: INFO_MODE_POSITION
|
|
else
|
|
{
|
|
if( m_ModeID != INFO_MODE_POSITION)
|
|
{
|
|
// no primitive page, only position page
|
|
SetInfoModePosition();
|
|
}
|
|
}
|
|
}
|
|
// else if we are in entity mode and only one entity is selected,
|
|
// force info mode: INFO_MODE_POSITION
|
|
else if( (pDoc->m_iMode == ENTITY_MODE) && (pDoc->m_selEntitySelection.Count() == 1) )
|
|
{
|
|
if( m_ModeID != INFO_MODE_POSITION)
|
|
{
|
|
SetInfoModePosition();
|
|
}
|
|
}
|
|
// else if we are in polygon mode
|
|
else if( pDoc->m_iMode == POLYGON_MODE)
|
|
{
|
|
if( m_ModeID == INFO_MODE_POLYGON)
|
|
{
|
|
if( GetActivePage() == &m_PgTexture) _iLastActivePgInPolygonMode = 1;
|
|
else if( GetActivePage() == &m_PgShadow)_iLastActivePgInPolygonMode = 2;
|
|
else _iLastActivePgInPolygonMode = 3;
|
|
}
|
|
if( m_ModeID != INFO_MODE_POLYGON)
|
|
{
|
|
SetInfoModePolygon();
|
|
}
|
|
}
|
|
// else if we are in sector mode
|
|
else if( pDoc->m_iMode == SECTOR_MODE)
|
|
{
|
|
if( m_ModeID != INFO_MODE_SECTOR)
|
|
{
|
|
SetInfoModeSector();
|
|
}
|
|
}
|
|
// else if we are in terrain mode
|
|
else if( pDoc->m_iMode == TERRAIN_MODE)
|
|
{
|
|
if( m_ModeID != INFO_MODE_TERRAIN)
|
|
{
|
|
SetInfoModeTerrain();
|
|
}
|
|
}
|
|
// we are not in CSG mode nor in single entity mode, force info mode: INFO_MODE_GLOBAL
|
|
else
|
|
{
|
|
if( m_ModeID != INFO_MODE_GLOBAL)
|
|
{
|
|
SetInfoModeGlobal();
|
|
}
|
|
}
|
|
}
|
|
// call OnIdle() for active page
|
|
CPropertyPage *pgActivPage = GetActivePage();
|
|
CALLACTIVEPAGE(OnIdle, lCount);
|
|
return TRUE;
|
|
}
|
|
|
|
void CInfoSheet::PostNcDestroy()
|
|
{
|
|
CPropertySheet::PostNcDestroy();
|
|
delete this;
|
|
}
|
|
|
|
BOOL CInfoSheet::PreTranslateMessage(MSG* pMsg)
|
|
{
|
|
CWorldEditorDoc* pDoc = theApp.GetActiveDocument();
|
|
CMainFrame* pMainFrame = STATIC_DOWNCAST(CMainFrame, AfxGetMainWnd());
|
|
BOOL bAlt = (GetKeyState( VK_MENU)&0x8000) != 0;
|
|
if(pMsg->message==WM_KEYDOWN)
|
|
{
|
|
// get active document
|
|
BOOL bSectorNameTyping = FALSE;
|
|
CPropertyPage *pgActivPage = GetActivePage();
|
|
if(pgActivPage == &m_PgSector)
|
|
{
|
|
bSectorNameTyping = m_PgSector.GetDlgItem( IDC_SECTOR_NAME) == CWnd::GetFocus();
|
|
}
|
|
if( (pMsg->wParam==VK_SPACE) && !bSectorNameTyping)
|
|
{
|
|
// don't translate message
|
|
return TRUE;
|
|
}
|
|
// if we have valid document
|
|
if( (pDoc != NULL) && !bSectorNameTyping)
|
|
{
|
|
if( (pMsg->wParam==VK_ADD) ||
|
|
(pMsg->wParam==VK_SUBTRACT) ||
|
|
(pMsg->wParam=='E') ||
|
|
(pMsg->wParam=='S') ||
|
|
(pMsg->wParam=='P') ||
|
|
(pMsg->wParam=='Z') ||
|
|
(pMsg->wParam=='Q') ||
|
|
(pMsg->wParam== VK_DECIMAL) )
|
|
{
|
|
// post this message to main frame
|
|
::PostMessage( pMainFrame->m_hWnd, WM_KEYDOWN, pMsg->wParam, pMsg->lParam);
|
|
// don't translate message
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
|
|
return CPropertySheet::PreTranslateMessage(pMsg);
|
|
}
|