Files
Leviathan/Client/Game/engine/Ui/Controls/ListControl/KUIControlPanel.cpp
T
2026-06-01 12:46:52 +02:00

493 lines
12 KiB
C++

#include "stdafx.h"
#include "SGameManager.h"
//#include "KUIControl.h"
#include "KUIControlPanel.h"
using namespace std;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// class KUIControlPanel
//
// * 상태에따라 크기변동이 가능한 패널 컨트롤.
// : 패널 컨트롤로 사용할 윈도우는 이 클래스를 상속해야 한다.
//
KUIControlPanel::KUIControlPanel( SGameManager * pGameManager, KUIControlPanelManager * pPanelManager, int nPanelID ):
SUIWnd( pGameManager ),
m_pPanelManager( pPanelManager ),
m_bExtend( false ),
m_nPanelID( nPanelID )
{
}
// 메모리 해제.
void KUIControlPanel::Release()
{
m_arrChangeVisibleWnd.clear();
}
// 초기설정.
void KUIControlPanel::Initialize( const KRect & original, const KRect & extension )
{
m_RectOriginal = original; // 기본크기.
m_RectExtention = extension; // 확장된크기.
// 최초크기지정.
//this->ResizeOriginal();
ChangeVisiblityWnd( false ); // 확장여부에따라 보임상태가 바뀌는 Wnd.
}
// 패널의 크기를 newSize 로 변경한다.
// 크기를 벗어난 내부 컨트롤들은 숨김처리.( 반대경우 보임 처리 )
void KUIControlPanel::ResizePanel( const KRect & newSize )
{
// 패널열기.
m_bExtend = true; //OpenPanel();
KRect rt = this->GetRect();
rt.right = rt.left + newSize.GetWidth();
rt.bottom = rt.top + newSize.GetHeight();
// 패널 크기변경.
KUIWnd::Resize( rt );
//this->Resize( rt );
// 윈도우 영역내,외 의 컨트롤 가시성 판단.
DecideVisibility();
// 패널 매니저에게 크기 변경을 알림.
m_pPanelManager->ResizePanel( this );
}
// 패널의 크기를 원본크기로 변경한다.
void KUIControlPanel::ResizeOriginal()
{
// 패널닫기.
m_bExtend = false; //ClosePanel();
// 윈도우 영역내,외 의 컨트롤 가시성 판단.
DecideVisibility();
ChangeVisiblityWnd( false ); // 확장여부에따라 보임상태가 바뀌는 Wnd.
}
// 윈도우 영역내,외 의 컨트롤 가시성 판단.
void KUIControlPanel::DecideVisibility()
{
//
// 크기를 벗어난 내부 컨트롤들은 숨김처리.( 반대경우 보임 처리 )
KRect rtWnd = this->GetRect();
KUIWnd * pWnd;
list<KUIWnd*> & childList = const_cast< list<KUIWnd*> & >( this->GetChildList() );
for( list< KUIWnd * >::iterator it=childList.begin(); it!=childList.end(); it++ )
{
pWnd = (*it);
// 보임.
if( rtWnd.IsIntersect( pWnd->GetRect() ) )
{
pWnd->SetShow( true );
}
// 숨김.
else
{
pWnd->SetShow( false );
}
}
}
// 패널 열기.
void KUIControlPanel::OpenPanel()
{
m_bExtend = true;
ChangeVisiblityWnd( true ); // 확장여부에따라 보임상태가 바뀌는 Wnd.
ResizePanel( GetRectExtension() );
// 패널 매니저에 사이즈 변경을 알림.
m_pPanelManager->ResizePanel( this );
// 필요기능정의.
CustomOpen();
}
// 패널 닫기.
void KUIControlPanel::ClosePanel()
{
m_bExtend = false;
ChangeVisiblityWnd( false ); // 확장여부에따라 보임상태가 바뀌는 Wnd.
ResizeOriginal();
// 패널 매니저에 사이즈 변경을 알림.
m_pPanelManager->ResizePanel( this );
// 필요기능정의.
CustomClose();
}
// 원본=>확장, 확장=>원본
void KUIControlPanel::ToggleExtend()
{
m_bExtend ^= true;
// 확장.
if( m_bExtend )
{
ChangeVisiblityWnd( true ); // 확장여부에따라 보임상태가 바뀌는 Wnd.
ResizePanel( GetRectExtension() );
}
// 축소.
else
{
ChangeVisiblityWnd( false ); // 확장여부에따라 보임상태가 바뀌는 Wnd.
ResizeOriginal();
}
//
// 패널 매니저에 사이즈 변경을 알림.
m_pPanelManager->ResizePanel( this );
}
// 부모윈도우의 이동. 패널에도 이동적용.
void KUIControlPanel::MovedParentWnd( int offsetX, int offsetY )
{
//this->MovePosOffset( offsetX, offsetY );
// const KRect & rt = m_pPanelManager->GetRectPanelOutline();
}
// 확장 여부에따라 숨김, 보임 처리가 바뀌는 Wnd.
void KUIControlPanel::AddChangeVisibleWnd( KUIWnd * pWnd )
{
m_arrChangeVisibleWnd.push_back( pWnd );
}
void KUIControlPanel::ChangeVisiblityWnd( bool bShow )
{
this->OnNotifyUIWindowOpen( m_bExtend );
int size = m_arrChangeVisibleWnd.size();
for( int i=0; i<size; i++ )
m_arrChangeVisibleWnd[ i ]->SetShow( bShow );
}
// 다양한 목적으로 사용되는 좌표.
const KPoint & KUIControlPanel::GetMultipurposePos()
{
return m_pPanelManager->GetMultipurposePos();
}
// 자신이 패널매니저에서 몇번째 인덱스인지 반환.
int KUIControlPanel::GetPanelIndex()
{
return m_pPanelManager->GetPanelIndex( this );
}
// 비활성처리.
void KUIControlPanel::Disable()
{
std::list< KUIWnd * > childList = static_cast< KUIWnd * >( this )->GetChildList();
for( std::list< KUIWnd * >::iterator it=childList.begin(); it!=childList.end(); ++it )
{
static_cast< KUIControl * >( *it )->Disable();
}
}
// 활성처리.
void KUIControlPanel::Enable()
{
std::list< KUIWnd * > childList = static_cast< KUIWnd * >( this )->GetChildList();
for( std::list< KUIWnd * >::iterator it=childList.begin(); it!=childList.end(); ++it )
{
static_cast< KUIControl * >( *it )->Enable();
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// class KUIControlPanelManager
//
// * KUIControlPanel 를 관리한다. ( 위치조절, 추가, 삭제 )
//
//
KUIControlPanelManager::KUIControlPanelManager( KUIWnd * pParentWnd, KUIControl * pPanelOutline, int gap )
: m_pParentWnd( pParentWnd ),
m_pPanelOutline( pPanelOutline ),
m_Gap( gap ),
m_MultipurposePos( 0, 0 ),
m_pCrrOpenPanel( NULL ),
m_bShow( false )
{
}
KUIControlPanelManager::~KUIControlPanelManager()
{
Release();
}
//-----------------------------
// 메모리 해제.
void KUIControlPanelManager::Release()
{
m_arrPanel.clear(); // 패널은 KUIWnd 를 상속받아 생성된 윈도우이다. 공통으로 해제하므로 이곳에선 컨테이너메모리만 해제한다.
}
// 닫기 통지.
void KUIControlPanelManager::CloseNotify()
{
int size = m_arrPanel.size();
for( int i=0; i<size; i++ )
{
m_arrPanel[ i ]->OnNotifyUIWindowOpen( false );
}
}
// * AddPanel() or DeletePanel() 을 모두 완료한 뒤 반드시 호출할것.
// 패널매니저 새로고침.
void KUIControlPanelManager::Initialize()
{
// 모든 패널윈도우 크기를 기본크기로 조절.
ResizeOriginalAll();
// 패널들의 위치를 조절한다. ( 확장된 패널이 없는 기본 위치 )
AdjustPosition();
}
// 부모윈도우 이동. 하위 패널들도 위치 이동.
void KUIControlPanelManager::MovedParentWnd( int ________offsetX, int ________offsetY )
{
int size = m_arrPanel.size();
if( size > 0 )
{
// 패널 아웃라인.
const KRect & rt = GetRectPanelOutline();
// 최상단 패널
int offsetX = rt.left;
int offsetY = m_arrPanel[ 0 ]->GetRect().top - rt.top;
for( int i=0; i<size; i++ )
{
m_arrPanel[ i ]->MovedParentWnd( offsetX, offsetY ); // 패널이동.
}
}
}
// 모든 패널윈도우 크기를 기본크기로 조절.
void KUIControlPanelManager::ResizeOriginalAll()
{
int size = m_arrPanel.size();
for( int i=0; i<size; i++ )
{
m_arrPanel[ i ]->SetShow( true );
//m_arrPanel[ i ]->SetShowChildAll( true ); // ?
//m_arrPanel[ i ]->SetActivate( true ); // ?
m_arrPanel[ i ]->ResizeOriginal(); // 최초크기지정.
}
}
// 패널추가.
void KUIControlPanelManager::AddPanel( KUIControlPanel * pPanel )
{
pPanel->SetPanelManager( this );
m_arrPanel.push_back( pPanel );
}
// 패널제거.
void KUIControlPanelManager::DeletePanel( KUIControlPanel * pPanel )
{
vector< KUIControlPanel * >::iterator findIT = find( m_arrPanel.begin(), m_arrPanel.end(), pPanel );
if( findIT != m_arrPanel.end() )
{
m_arrPanel.erase( findIT );
}
}
// 해당 패널가 패널매니저에서 몇번째 인덱스인지 반환.
int KUIControlPanelManager::GetPanelIndex( KUIControlPanel * pPanel )
{
int index = 0;
int size = m_arrPanel.size();
for( ; index<size; index++ )
{
if( m_arrPanel[ index ] == pPanel )
break;
}
return index;
}
// 패널 컨트롤이 위치할 부모윈도우상의 윤곽컨트롤.
const KRect & KUIControlPanelManager::GetRectPanelOutline(){
return m_pPanelOutline->GetRect();
}
// 패널들의 위치를 조절한다. ( 확장된 패널이 없는 기본 위치 )
void KUIControlPanelManager::AdjustPosition()
{
if( m_arrPanel.size() > 0 )
{
KUIControlPanel * pPanel = NULL;
int height = m_arrPanel[ 0 ]->GetRectOriginal().GetHeight() + m_Gap;
const KRect & rtPanelControl = m_pPanelOutline->GetRect(); // 패널컨트롤이 위치할 outline.
int size = m_arrPanel.size();
for( int i=0; i<size; i++ )
{
pPanel = m_arrPanel[ i ];
// 위치 조절.
pPanel->MovePos( rtPanelControl.left,
rtPanelControl.top + height * i );
}
}
}
// * KUIControlPanel 에서 패널 크기가 변경된 경우 호출됨.
// 해당 패널을 제외한 나머지 패널은 원본크기로 되돌림.
// 패널들의 위치조절.
void KUIControlPanelManager::ResizePanel( KUIControlPanel * pTarget )
{
if( m_arrPanel.size() < 1 )
return;
m_pCrrOpenPanel = pTarget;
// 0번째 패널.
KRect rtOutLine = m_pPanelOutline->GetRect(); // 패널 아웃라인 크기.
m_arrPanel[ 0 ]->MovePos( rtOutLine.left, rtOutLine.top ); // 최상단 패널 위치 지정.
if( pTarget != m_arrPanel[ 0 ] )
m_arrPanel[ 0 ]->ResizeOriginal();
//
// 해당 패널을 제외한 나머지 패널은 원본크기로 되돌림.
//
KUIControlPanel * pPrevPanel = m_arrPanel[ 0 ]; // 자신의 위에 있는 패널.
KUIControlPanel * pCrrPanel; // 자신.
int size = m_arrPanel.size();
for( int i=1; i<size; i++ ) // 1번째 패널부터 시작.
{
pCrrPanel = m_arrPanel[ i ];
// 해당 패널을 제외한 패널들 크기조절.
if( pTarget != pCrrPanel && pCrrPanel->GetIsExtend() )
pCrrPanel->ResizeOriginal(); // 패널의 크기를 원본크기로 변경한다.
// 위치 조절. 윗패널 로부터 Gap 만큼 떨어뜨림.
int nGap = pPrevPanel->GetIsExtend() ? 0 : m_Gap;
pCrrPanel->MovePos( pCrrPanel->GetRect().left, pPrevPanel->GetRect().bottom + nGap );
// 윗패널 보관.
pPrevPanel = pCrrPanel;
}
}
// 해당 패널 반환.
bool KUIControlPanelManager::FindPanelByIndex( KUIControlPanel *& OUT_pPanel, int index )
{
int size = m_arrPanel.size();
if( index >= 0 && index < size )
{
OUT_pPanel = m_arrPanel[ index ];
return true;
}
return false;
}
// 해당 패널 반환.
bool KUIControlPanelManager::FindPanel( KUIControlPanel *& OUT_pPanel, int wndID )
{
int size = m_arrPanel.size();
for( int i=0; i<size; i++ )
{
if( m_arrPanel[ i ]->GetGenWndID() == wndID )
{
OUT_pPanel = m_arrPanel[ i ];
return true;
}
}
return false;
}
// 해당 패널 Open.
KUIControlPanel * KUIControlPanelManager::OpenPanel( int wndID )
{
KUIControlPanel * pPanel = NULL;
if( FindPanel( pPanel, wndID ) )
{
pPanel->OpenPanel();
}
return pPanel;
}
// 해당 패널 Close.
void KUIControlPanelManager::ClosePanel( int wndID )
{
KUIControlPanel * pPanel;
if( FindPanel( pPanel, wndID ) )
{
pPanel->ClosePanel();
}
}
void KUIControlPanelManager::SetShow( bool bFlag )
{
m_bShow = bFlag;
KUIControlPanel * pPanel = NULL;
int nSize = m_arrPanel.size();
for( int i=0; i<nSize; i++ )
{
pPanel = m_arrPanel[ i ];
if( pPanel )
{
pPanel->SetShow( m_bShow );
}
}
}