DragonNest/Client/EtWorldPainter/SoundListPaneView.cpp

342 lines
9.8 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
// SoundListPaneView.cpp : implementation file
//
#include "stdafx.h"
#include "EtWorldPainter.h"
#include "SoundListPaneView.h"
#include "UserMessage.h"
#include "resource.h"
#include "MainFrm.h"
#include "PaneDefine.h"
#include "TEtWorld.h"
#include "TEtWorldSector.h"
#include "TEtWorldSound.h"
#include "TEtWorldSoundEnvi.h"
// CSoundListPaneView
IMPLEMENT_DYNCREATE(CSoundListPaneView, CFormView)
CSoundListPaneView::CSoundListPaneView()
: CFormView(CSoundListPaneView::IDD)
{
m_bActivate = false;
CBitmap bitmap;
bitmap.LoadBitmap( IDB_SOUNDTREEICON );
m_ImageList.Create( 16, 16, ILC_COLOR24|ILC_MASK, 4, 1 );
m_ImageList.Add( &bitmap, RGB(0,255,0) );
}
CSoundListPaneView::~CSoundListPaneView()
{
}
void CSoundListPaneView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TREE1, m_TreeCtrl);
}
BEGIN_MESSAGE_MAP(CSoundListPaneView, CFormView)
ON_WM_ERASEBKGND()
ON_WM_SIZE()
ON_MESSAGE( UM_REFRESH_PANE_VIEW, OnRefresh )
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE1, &CSoundListPaneView::OnTvnSelchangedTree1)
ON_MESSAGE( UM_SOUNDPANE_DROPITEM, OnDropItem )
ON_MESSAGE( UM_SOUNDPANE_DROPMOVEITEM, OnDropMoveItem )
ON_MESSAGE( UM_SOUNDLIST_PANE_ADDSOUNDENVI, OnAddSoundEnvi )
ON_MESSAGE( UM_SOUNDLIST_PANE_SELCHANGED, OnSelectChange )
ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_TREE1, &CSoundListPaneView::OnTvnBeginlabeleditTree1)
ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE1, &CSoundListPaneView::OnTvnEndlabeleditTree1)
END_MESSAGE_MAP()
// CSoundListPaneView diagnostics
#ifdef _DEBUG
void CSoundListPaneView::AssertValid() const
{
CFormView::AssertValid();
}
#ifndef _WIN32_WCE
void CSoundListPaneView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif
#endif //_DEBUG
// CSoundListPaneView message handlers
void CSoundListPaneView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
if( m_bActivate == true ) return;
m_bActivate = true;
}
BOOL CSoundListPaneView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
}
void CSoundListPaneView::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if( m_TreeCtrl ) {
m_TreeCtrl.SetWindowPos( NULL, 0, 0, cx, cy, SWP_FRAMECHANGED );
}
}
LRESULT CSoundListPaneView::OnRefresh( WPARAM wParam, LPARAM lParam )
{
m_TreeCtrl.DeleteAllItems();
m_TreeCtrl.SetImageList( &m_ImageList, TVSIL_NORMAL );
m_TreeCtrl.EnableMultiSelect( true );
m_hRootItem = m_TreeCtrl.InsertItem( "Sound", 0, 1 );
m_hBGMItem = m_TreeCtrl.InsertItem( "BGM", 2, 3, m_hRootItem );
m_hEnviItem = m_TreeCtrl.InsertItem( "Environment", 0, 1, m_hRootItem );
m_hPropItem = m_TreeCtrl.InsertItem( "Prop Sound List", 0, 1, m_hRootItem );
m_TreeCtrl.SelectItem( m_hRootItem );
m_TreeCtrl.Expand( m_hRootItem, TVE_EXPAND );
SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid;
if( Sector == -1 ) return S_OK;
CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector );
if( !pSector ) return S_OK;
CTEtWorldSound *pSound = (CTEtWorldSound *)pSector->GetSoundInfo();
for( DWORD i=0; i<pSound->GetEnviCount(); i++ ) {
CTEtWorldSoundEnvi *pEnvi = (CTEtWorldSoundEnvi *)pSound->GetEnviFromIndex(i);
m_TreeCtrl.InsertItem( pEnvi->GetName(), 2, 3, m_hEnviItem );
}
m_TreeCtrl.Expand( m_hEnviItem, TVE_EXPAND );
// Prop <20>о<EFBFBD><D0BE>ͼ<EFBFBD> Sound <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>.
return S_OK;
}
void CSoundListPaneView::CalcSelectItem()
{
m_SelectItemList.RemoveAll();
m_TreeCtrl.GetSelectedList( m_SelectItemList );
}
void CSoundListPaneView::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
CalcSelectItem();
CWnd *pWnd = GetPaneWnd( SOUNDPROP_PANE );
if( pWnd ) {
if( m_SelectItemList.GetCount() == 0 ) {
pWnd->SendMessage( UM_REFRESH_PANE_VIEW );
}
else if( m_SelectItemList.GetCount() == 1 ) {
int nFlag = 0;
CGlobalValue::GetInstance().m_pSelectSound = NULL;
if( m_SelectItemList.GetHead() == m_hRootItem ) nFlag = 1;
else if( m_SelectItemList.GetHead() == m_hBGMItem ) nFlag = 2;
else if( m_SelectItemList.GetHead() == m_hEnviItem ) nFlag = 3;
else if( m_SelectItemList.GetHead() == m_hPropItem ) nFlag = 4;
else {
CString szStr = m_TreeCtrl.GetItemText( m_SelectItemList.GetHead() );
SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid;
if( Sector != -1 ) {
CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector );
if( pSector ) {
CTEtWorldSound *pSound = (CTEtWorldSound *)pSector->GetSoundInfo();
if( pSound ) {
CEtWorldSoundEnvi *pEnvi = pSound->GetEnviFromName( szStr );
if( pEnvi ) {
CGlobalValue::GetInstance().m_pSelectSound = pEnvi;
nFlag = 5;
}
}
}
}
}
CGlobalValue::GetInstance().RefreshRender();
pWnd->SendMessage( UM_REFRESH_PANE_VIEW, nFlag );
}
else {
if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW );
}
}
*pResult = 0;
}
LRESULT CSoundListPaneView::OnDropItem( WPARAM wParam, LPARAM lParam )
{
CPoint p;
p.x = (long)lParam >> 16;
p.y = (long)( lParam << 16 ) >> 16;
char *szFileName = (char *)wParam;
SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid;
if( Sector == -1 ) return S_OK;
CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector );
if( !pSector ) return S_OK;
CTEtWorldSound *pSound = (CTEtWorldSound *)pSector->GetSoundInfo();
if( !pSound ) return S_OK;
char szTemp[_MAX_PATH];
_GetFullFileName( szTemp, _countof(szTemp), szFileName );
CRect rcRect;
m_TreeCtrl.GetItemRect( m_hBGMItem, rcRect, FALSE );
if( p.x >= rcRect.left && p.x <= rcRect.right && p.y >= rcRect.top && p.y <= rcRect.bottom ) {
// SetBGM <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OnChangevalue <20>ȿ<EFBFBD><C8BF><EFBFBD> <20>ǰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
CUnionValueProperty Variable( CUnionValueProperty::String );
Variable.SetVariable( szTemp );
pSound->OnChangeValue( &Variable, 0 );
CGlobalValue::GetInstance().SetModify();
CWnd *pWnd = GetPaneWnd( SOUNDPROP_PANE );
if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW, 2 );
return S_OK;
}
HTREEITEM hti;
hti = m_TreeCtrl.GetChildItem( m_hEnviItem );
while(hti) {
m_TreeCtrl.GetItemRect( hti, rcRect, FALSE );
if( p.x >= rcRect.left && p.x <= rcRect.right && p.y >= rcRect.top && p.y <= rcRect.bottom ) {
CString szItem = m_TreeCtrl.GetItemText( hti );
CTEtWorldSoundEnvi *pEnvi = (CTEtWorldSoundEnvi *)pSound->GetEnviFromName( szItem );
if( pEnvi ) {
CUnionValueProperty Variable( CUnionValueProperty::String );
Variable.SetVariable( szTemp );
pEnvi->OnChangeValue( &Variable, 0 );
CGlobalValue::GetInstance().SetModify();
CWnd *pWnd = GetPaneWnd( SOUNDPROP_PANE );
if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW, 5 );
return S_OK;
}
}
hti = m_TreeCtrl.GetNextSiblingItem( hti );
}
return S_OK;
}
LRESULT CSoundListPaneView::OnDropMoveItem( WPARAM wParam, LPARAM lParam )
{
CPoint p;
p.x = (long)wParam >> 16;
p.y = (long)( wParam << 16 ) >> 16;
CRect rcRect;
m_TreeCtrl.GetItemRect( m_hBGMItem, rcRect, FALSE );
if( p.x >= rcRect.left && p.x <= rcRect.right && p.y >= rcRect.top && p.y <= rcRect.bottom ) {
m_TreeCtrl.SelectItems( m_hBGMItem, m_hBGMItem );
return S_OK;
}
else m_TreeCtrl.SelectItems( 0, 0 );
HTREEITEM hti;
hti = m_TreeCtrl.GetChildItem( m_hEnviItem );
while(hti) {
m_TreeCtrl.GetItemRect( hti, rcRect, FALSE );
if( p.x >= rcRect.left && p.x <= rcRect.right && p.y >= rcRect.top && p.y <= rcRect.bottom ) {
m_TreeCtrl.SelectItems( hti, hti );
return S_OK;
}
hti = m_TreeCtrl.GetNextSiblingItem( hti );
}
return S_OK;
}
LRESULT CSoundListPaneView::OnAddSoundEnvi( WPARAM wParam, LPARAM lParam )
{
char *szName = (char*)wParam;
HTREEITEM hti = m_TreeCtrl.InsertItem( szName, 2, 3, m_hEnviItem );
m_TreeCtrl.Expand( m_hEnviItem, TVE_EXPAND );
m_TreeCtrl.SelectItems( hti, hti );
return S_OK;
}
void CSoundListPaneView::OnTvnBeginlabeleditTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
// TODO: Add your control notification handler code here
m_szPrevLabelString = pTVDispInfo->item.pszText;
*pResult = 0;
}
void CSoundListPaneView::OnTvnEndlabeleditTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVDISPINFO pTVDispInfo = reinterpret_cast<LPNMTVDISPINFO>(pNMHDR);
// TODO: Add your control notification handler code here
if( pTVDispInfo->item.pszText == NULL ) return;
if( m_hRootItem == pTVDispInfo->item.hItem ) return;
if( m_hBGMItem == pTVDispInfo->item.hItem ) return;
if( m_hEnviItem == pTVDispInfo->item.hItem ) return;
if( m_hPropItem == pTVDispInfo->item.hItem ) return;
if( m_TreeCtrl.GetParentItem( pTVDispInfo->item.hItem ) != m_hEnviItem ) return;
SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid;
if( Sector == -1 ) return;
CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector );
if( !pSector ) return;
CTEtWorldSound *pSound = (CTEtWorldSound *)pSector->GetSoundInfo();
if( !pSound ) return;
if( pSound->GetEnviFromName( pTVDispInfo->item.pszText ) ) return;
CTEtWorldSoundEnvi *pEnvi = (CTEtWorldSoundEnvi *)pSound->GetEnviFromName( m_szPrevLabelString );
if( !pEnvi ) return;
pEnvi->SetName( pTVDispInfo->item.pszText );
m_TreeCtrl.SetItemText( pTVDispInfo->item.hItem, pTVDispInfo->item.pszText );
*pResult = 0;
}
LRESULT CSoundListPaneView::OnSelectChange( WPARAM wParam, LPARAM lParam )
{
char *szName = (char*)wParam;
if( szName == NULL ) return S_OK;
HTREEITEM hti = m_TreeCtrl.FindItem( szName, FALSE, TRUE, FALSE, m_hEnviItem );
if( !hti ) return S_OK;
CalcSelectItem();
if( m_SelectItemList.GetCount() == 1 && m_SelectItemList.GetHead() == hti ) {
CWnd *pWnd = GetPaneWnd( SOUNDPROP_PANE );
pWnd->SendMessage( UM_REFRESH_PANE_VIEW, 5 );
}
else m_TreeCtrl.SelectItems( hti, hti );
return S_OK;
}