mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-11-30 05:35:54 +01:00
190 lines
5.5 KiB
C++
190 lines
5.5 KiB
C++
|
/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */
|
||
|
|
||
|
// CtrlBrowseFile.cpp : implementation file
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "CtrlBrowseFile.h"
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#undef new
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CCtrlBrowseFile
|
||
|
|
||
|
CCtrlBrowseFile::CCtrlBrowseFile()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
CCtrlBrowseFile::~CCtrlBrowseFile()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void CCtrlBrowseFile::SetDialogPtr( CPropertyComboBar *pDialog)
|
||
|
{
|
||
|
m_pDialog = pDialog;
|
||
|
}
|
||
|
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CCtrlBrowseFile, CButton)
|
||
|
//{{AFX_MSG_MAP(CCtrlBrowseFile)
|
||
|
ON_CONTROL_REFLECT(BN_CLICKED, OnClicked)
|
||
|
//}}AFX_MSG_MAP
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CCtrlBrowseFile message handlers
|
||
|
CTFileName CCtrlBrowseFile::GetIntersectingFile()
|
||
|
{
|
||
|
// obtain curently active document
|
||
|
CWorldEditorDoc *pDoc = theApp.GetDocument();
|
||
|
ASSERT( pDoc != NULL);
|
||
|
|
||
|
// obtain curently selected property ID
|
||
|
CPropertyID *ppidProperty = m_pDialog->GetSelectedProperty();
|
||
|
if( ppidProperty == NULL ||
|
||
|
!((ppidProperty->pid_eptType == CEntityProperty::EPT_FILENAME) ||
|
||
|
(ppidProperty->pid_eptType == CEntityProperty::EPT_FILENAMENODEP)) ) return CTString("");
|
||
|
|
||
|
// lock selection's dynamic container
|
||
|
pDoc->m_selEntitySelection.Lock();
|
||
|
// file name to contain selection intersecting file
|
||
|
CTFileName fnIntersectingFile;
|
||
|
CTFileNameNoDep fnIntersectingFileNoDep;
|
||
|
// for each of the selected entities
|
||
|
FOREACHINDYNAMICCONTAINER(pDoc->m_selEntitySelection, CEntity, iten)
|
||
|
{
|
||
|
// obtain property ptr
|
||
|
CEntityProperty *pepProperty = iten->PropertyForName( ppidProperty->pid_strName);
|
||
|
// if this is first entity in dynamic container
|
||
|
if( pDoc->m_selEntitySelection.Pointer(0) == iten)
|
||
|
{
|
||
|
if( m_bFileNameNoDep)
|
||
|
{
|
||
|
fnIntersectingFileNoDep = ENTITYPROPERTY( &*iten, pepProperty->ep_slOffset, CTFileNameNoDep);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
fnIntersectingFile = ENTITYPROPERTY( &*iten, pepProperty->ep_slOffset, CTFileName);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if( m_bFileNameNoDep)
|
||
|
{
|
||
|
CTFileNameNoDep fnCurrentFileNoDep = ENTITYPROPERTY( &*iten, pepProperty->ep_slOffset, CTFileNameNoDep);
|
||
|
if( fnCurrentFileNoDep != fnIntersectingFileNoDep)
|
||
|
{
|
||
|
fnIntersectingFileNoDep = CTString("");
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
CTFileName fnCurrentFile = ENTITYPROPERTY( &*iten, pepProperty->ep_slOffset, CTFileName);
|
||
|
if( fnCurrentFile != fnIntersectingFile)
|
||
|
{
|
||
|
fnIntersectingFile = CTString("");
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// unlock selection's dynamic container
|
||
|
pDoc->m_selEntitySelection.Unlock();
|
||
|
if( m_bFileNameNoDep)
|
||
|
{
|
||
|
return fnIntersectingFileNoDep;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return fnIntersectingFile;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CCtrlBrowseFile::OnClicked()
|
||
|
{
|
||
|
// don't do anything if document doesn't exist
|
||
|
if( theApp.GetDocument() == NULL) return;
|
||
|
// obtain curently active document
|
||
|
CWorldEditorDoc *pDoc = theApp.GetDocument();
|
||
|
|
||
|
// obtain curently selected property ID
|
||
|
CPropertyID *ppidProperty = m_pDialog->GetSelectedProperty();
|
||
|
if( ppidProperty == NULL) return;
|
||
|
|
||
|
// file name to contain selection intersecting file
|
||
|
CTFileName fnIntersectingFile = GetIntersectingFile();
|
||
|
|
||
|
// call file requester
|
||
|
CTFileName fnChoosedFile;
|
||
|
if( fnIntersectingFile.FileExt() == ".mdl")
|
||
|
{
|
||
|
fnChoosedFile = _EngineGUI.FileRequester( "Choose file",
|
||
|
FILTER_MDL FILTER_ALL FILTER_END,
|
||
|
KEY_NAME_REQUEST_FILE_DIR, fnIntersectingFile.FileDir(),
|
||
|
fnIntersectingFile.FileName()+fnIntersectingFile.FileExt());
|
||
|
}
|
||
|
else if( fnIntersectingFile.FileExt() == ".tex")
|
||
|
{
|
||
|
fnChoosedFile = _EngineGUI.FileRequester( "Choose file",
|
||
|
FILTER_TEX FILTER_ALL FILTER_END,
|
||
|
KEY_NAME_REQUEST_FILE_DIR, fnIntersectingFile.FileDir(),
|
||
|
fnIntersectingFile.FileName()+fnIntersectingFile.FileExt());
|
||
|
}
|
||
|
else if( fnIntersectingFile.FileExt() == ".wav")
|
||
|
{
|
||
|
fnChoosedFile = _EngineGUI.FileRequester( "Choose file",
|
||
|
FILTER_WAV FILTER_ALL FILTER_END,
|
||
|
KEY_NAME_REQUEST_FILE_DIR, fnIntersectingFile.FileDir(),
|
||
|
fnIntersectingFile.FileName()+fnIntersectingFile.FileExt());
|
||
|
}
|
||
|
else if( fnIntersectingFile.FileExt() == ".smc")
|
||
|
{
|
||
|
fnChoosedFile = _EngineGUI.FileRequester( "Choose file",
|
||
|
FILTER_SMC FILTER_ALL FILTER_END,
|
||
|
KEY_NAME_REQUEST_FILE_DIR, fnIntersectingFile.FileDir(),
|
||
|
fnIntersectingFile.FileName()+fnIntersectingFile.FileExt());
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
fnChoosedFile = _EngineGUI.FileRequester( "Choose file",
|
||
|
FILTER_ALL FILTER_MDL FILTER_TEX FILTER_WAV FILTER_END,
|
||
|
KEY_NAME_REQUEST_FILE_DIR, fnIntersectingFile.FileDir(),
|
||
|
fnIntersectingFile.FileName()+fnIntersectingFile.FileExt());
|
||
|
}
|
||
|
|
||
|
if( fnChoosedFile == "") return;
|
||
|
|
||
|
// for each of the selected entities
|
||
|
FOREACHINDYNAMICCONTAINER(pDoc->m_selEntitySelection, CEntity, iten)
|
||
|
{
|
||
|
// obtain property ptr
|
||
|
CEntityProperty *penpProperty = iten->PropertyForName( ppidProperty->pid_strName);
|
||
|
// discard old entity settings
|
||
|
iten->End();
|
||
|
// set new file name value
|
||
|
if( m_bFileNameNoDep)
|
||
|
{
|
||
|
ENTITYPROPERTY( &*iten, penpProperty->ep_slOffset, CTFileNameNoDep) =
|
||
|
(CTFileNameNoDep) fnChoosedFile;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ENTITYPROPERTY( &*iten, penpProperty->ep_slOffset, CTFileName) = fnChoosedFile;
|
||
|
}
|
||
|
// apply new entity settings
|
||
|
iten->Initialize();
|
||
|
}
|
||
|
// mark that document is changed
|
||
|
pDoc->SetModifiedFlag( TRUE);
|
||
|
pDoc->UpdateAllViews( NULL);
|
||
|
pDoc->m_chSelections.MarkChanged();
|
||
|
// reload data to dialog
|
||
|
m_pDialog->UpdateData( FALSE);
|
||
|
}
|