493 lines
12 KiB
C++
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 );
|
|
}
|
|
}
|
|
} |