DragonNest/Client/EtWorldPainter/DecalListPaneView.cpp
2024-12-19 09:48:26 +08:00

270 lines
7.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// DecalListPaneView.cpp : implementation file
//
#include "stdafx.h"
#include "EtWorldPainter.h"
#include "DecalListPaneView.h"
#include "TEtWorld.h"
#include "TEtWorldGrid.h"
#include "TEtWorldSector.h"
#include "UserMessage.h"
#include "EtWorldPainterDoc.h"
#include "EtWorldPainterView.h"
#include "MainFrm.h"
#include "PaneDefine.h"
#include "BrushRenderView.h"
#include "TEtWorldDecal.h"
#include "DummyView.h"
#include <map>
using namespace std;
// CDecalListPaneView
IMPLEMENT_DYNCREATE(CDecalListPaneView, CFormView)
CDecalListPaneView::CDecalListPaneView()
: CFormView(CDecalListPaneView::IDD)
{
m_bActivate = false;
m_nSortedCol = 0;
m_bAscending = true;
m_bSorting = false;
}
CDecalListPaneView::~CDecalListPaneView()
{
}
void CDecalListPaneView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_ListCtrl);
}
BEGIN_MESSAGE_MAP(CDecalListPaneView, CFormView)
ON_WM_SIZE()
ON_MESSAGE( UM_REFRESH_PANE_VIEW, OnRefresh )
ON_WM_ERASEBKGND()
ON_MESSAGE( UM_ENABLE_PANE_VIEW, OnEnablePane )
ON_NOTIFY(HDN_ITEMCLICK, 0, &CDecalListPaneView::OnHdnItemclickList1)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST1, &CDecalListPaneView::OnLvnItemchangedList1)
ON_NOTIFY(LVN_KEYDOWN, IDC_LIST1, &CDecalListPaneView::OnLvnKeydownList1)
END_MESSAGE_MAP()
// CDecalListPaneView diagnostics
#ifdef _DEBUG
void CDecalListPaneView::AssertValid() const
{
CFormView::AssertValid();
}
#ifndef _WIN32_WCE
void CDecalListPaneView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
#endif
#endif //_DEBUG
// CDecalListPaneView message handlers
void CDecalListPaneView::OnSize(UINT nType, int cx, int cy)
{
CFormView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
if( m_ListCtrl ) {
CRect rcRect;
GetClientRect( &rcRect );
m_ListCtrl.MoveWindow( &rcRect );
}
}
void CDecalListPaneView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
if( m_bActivate == true ) return;
m_bActivate = true;
m_ListCtrl.InsertColumn( 0, _T("Name"), LVCFMT_LEFT, 150 );
m_ListCtrl.InsertColumn( 1, _T("Position"), LVCFMT_LEFT, 30 );
m_ListCtrl.SetExtendedStyle( LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_FLATSB );
HWND hWndHeader = m_ListCtrl.GetDlgItem(0)->GetSafeHwnd();
m_header.SubclassWindow(hWndHeader);
}
LRESULT CDecalListPaneView::OnRefresh( WPARAM wParam, LPARAM lParam )
{
if( wParam == -1 ) {
m_ListCtrl.DeleteAllItems();
return S_OK;
}
else if( wParam == 0 ) {
m_ListCtrl.DeleteAllItems();
SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid;
if( Sector == -1 ) return S_OK;
CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector );
if( pSector == NULL ) return S_OK;
int nIndex;
char szPos[256];
for( DWORD i=0; i<pSector->GetDecalCount(); i++ ) {
CEtWorldDecal *pDecal = pSector->GetDecalFromIndex(i);
nIndex = m_ListCtrl.InsertItem( m_ListCtrl.GetItemCount(), pDecal->GetTextureName() );
sprintf_s( szPos, "%f, %f", pDecal->GetPosition().x, pDecal->GetPosition().y );
m_ListCtrl.SetItemText( nIndex, 1, szPos );
}
}
else if( wParam == 1 ) {
SectorIndex Sector = CGlobalValue::GetInstance().m_SelectGrid;
if( Sector == -1 ) return S_OK;
CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Sector );
if( pSector == NULL ) return S_OK;
for( int i=0; i<m_ListCtrl.GetItemCount(); i++ ) {
m_ListCtrl.SetItemState( i, 0, LVIS_SELECTED| LVIS_FOCUSED );
CString szStr = m_ListCtrl.GetItemText( i, 1 );
EtVector2 vPos;
for( int j=0; j<2; j++ ) {
const char *pTempStr = _GetSubStrByCount( 0, szStr.GetBuffer(), ',' );
vPos.x = (float)atof( pTempStr );
pTempStr = _GetSubStrByCount( 1, szStr.GetBuffer(), ',' );
vPos.y = (float)atof( pTempStr );
}
if( CGlobalValue::GetInstance().m_pSelectDecal ) {
float fDist = EtVec2Length( &EtVector2( CGlobalValue::GetInstance().m_pSelectDecal->GetPosition() - vPos ) );
if( fDist < 0.01f ) {
m_ListCtrl.SetSelectionMark( i );
m_ListCtrl.SetItemState( i, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED );
m_ListCtrl.EnsureVisible( i, FALSE );
}
}
}
}
return S_OK;
}
BOOL CDecalListPaneView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
// return CFormView::OnEraseBkgnd(pDC);
}
LRESULT CDecalListPaneView::OnEnablePane( WPARAM wParam, LPARAM lParam )
{
m_ListCtrl.EnableWindow( (BOOL)wParam );
return S_OK;
}
void CDecalListPaneView::OnHdnItemclickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR);
// TODO: Add your control notification handler code here
m_bSorting = true;
if ( phdr->iItem == m_nSortedCol )
SortColumn( phdr->iItem, !m_bAscending );
else {
SortColumn( phdr->iItem, m_header.GetAscending() ? true : false );
}
*pResult = 0;
m_bSorting = false;
}
void CDecalListPaneView::SortColumn(int iCol, bool bAsc)
{
m_bAscending = bAsc;
m_nSortedCol = iCol;
// set sort image for header and sort column.
m_ListCtrl.SetSortImage(m_nSortedCol, m_bAscending);
CXTSortClass csc(&m_ListCtrl, m_nSortedCol);
csc.Sort(m_bAscending, ( m_nSortedCol == 2 ) ? xtSortInt : xtSortString);
}
void CDecalListPaneView::OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult)
{
if( m_bSorting ) return;
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
if( GetFocus() == this || GetFocus() == &m_ListCtrl ) {
SectorIndex Index = CGlobalValue::GetInstance().m_SelectGrid;
if( Index == -1 ) return;
CTEtWorldSector *pSector = CTEtWorld::GetInstance().GetSector( Index );
if( pSector == NULL ) return;
for( DWORD i=0; i<pSector->GetDecalCount(); i++ )
((CTEtWorldDecal*)pSector->GetDecalFromIndex(i))->SetSelect( false );
CGlobalValue::GetInstance().m_pSelectDecal = NULL;
int nSelectCount = m_ListCtrl.GetSelectedCount();
int nIndex;
CString szStr;
POSITION p = m_ListCtrl.GetFirstSelectedItemPosition();
for( int i=0; i<nSelectCount; i++ ) {
nIndex = m_ListCtrl.GetNextSelectedItem(p);
szStr = m_ListCtrl.GetItemText( nIndex, 1 );
EtVector2 vPos;
for( int j=0; j<2; j++ ) {
const char *pTempStr = _GetSubStrByCount( 0, szStr.GetBuffer(), ',' );
vPos.x = (float)atof( pTempStr );
pTempStr = _GetSubStrByCount( 1, szStr.GetBuffer(), ',' );
vPos.y = (float)atof( pTempStr );
}
for( DWORD j=0; j<pSector->GetDecalCount(); j++ ) {
// <20><>ġ<EFBFBD><C4A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϸ<EFBFBD> üũ<C3BC>ϴ½<CFB4><C2BD><EFBFBD><EFBFBD><EFBFBD> <20>սô<D5BD>!
float fDist = EtVec2Length( &EtVector2( pSector->GetDecalFromIndex(j)->GetPosition() - vPos ) );
if( fDist < 0.01f ) {
CGlobalValue::GetInstance().m_pSelectDecal = (CTEtWorldDecal*)pSector->GetDecalFromIndex(j);
CGlobalValue::GetInstance().m_pSelectDecal->SetSelect( true );
break;
}
}
break;
}
CWnd *pWnd = GetPaneWnd( LAYER_PANE );
if( pWnd ) pWnd->SendMessage( UM_REFRESH_PANE_VIEW );
CGlobalValue::GetInstance().RefreshRender();
}
}
void CDecalListPaneView::OnLvnKeydownList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLVKEYDOWN pLVKeyDow = reinterpret_cast<LPNMLVKEYDOWN>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
if( CGlobalValue::GetInstance().m_nActiveView == CGlobalValue::BRUSH && CGlobalValue::GetInstance().IsCheckOutMe() && pLVKeyDow->wVKey == VK_DELETE ) {
CEtWorldPainterView *pView = (CEtWorldPainterView *)CGlobalValue::GetInstance().m_pParentView;
if( pView && pView->GetDummyView()->GetTabViewStruct( CGlobalValue::BRUSH ) ) {
CBrushRenderView *pBrushView = (CBrushRenderView *)pView->GetDummyView()->GetTabViewStruct( CGlobalValue::BRUSH )->pView;
if( pBrushView ) pBrushView->DeleteDecal();
}
}
}