#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 & childList = const_cast< list & >( 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; iSetShow( 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; iOnNotifyUIWindowOpen( 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; iMovedParentWnd( offsetX, offsetY ); // 패널이동. } } } // 모든 패널윈도우 크기를 기본크기로 조절. void KUIControlPanelManager::ResizeOriginalAll() { int size = m_arrPanel.size(); for( int i=0; iSetShow( 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( ; indexGetRect(); } // 패널들의 위치를 조절한다. ( 확장된 패널이 없는 기본 위치 ) 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; iMovePos( 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; iGetIsExtend() ) 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; iGetGenWndID() == 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; iSetShow( m_bShow ); } } }