Files
2026-06-01 12:46:52 +02:00

236 lines
6.6 KiB
C++

#pragma once
//#include <vector>
#include "SUIWnd.h"
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// 2010.04.02 bintitle
//
// class KUIControlPanel
//
// * 상태에따라 크기변동이 가능한 패널 컨트롤.
// 이름은 Control 이지만 실제로 Wnd 를 상속하는 윈도우이다.
/// 윈도우인 이유는 실제 nui 가 각각 따로 주어지기 때문이다.
//
// : 패널 컨트롤로 사용할 윈도우는 이 클래스를 상속해야 한다.
//
class KUIControlPanel : public SUIWnd
{
protected:
class KUIControlPanelManager * m_pPanelManager;
KRect m_RectOriginal; // 기본크기.
KRect m_RectExtention; // 확장된크기.
int m_nPanelID; // 패널의 아이디.
bool m_bExtend; // 확장여부. true(확장)
std::vector< KUIWnd * > m_arrChangeVisibleWnd; // 확장 여부에따라 숨김, 보임 처리가 바뀌는 Wnd.
public:
KUIControlPanel( SGameManager * pGameManager, KUIControlPanelManager * pPanelManager=NULL, int nPanelID=0 );
virtual ~KUIControlPanel(){
Release();
}
//-----------------------------
// 패널의 크기를 newSize 로 변경한다.
// 크기를 벗어난 내부 컨트롤들은 숨김처리.( 반대경우 보임 처리 )
virtual void ResizePanel( const KRect & newSize );
// 패널의 크기를 원본크기로 변경한다. 각 패널윈도우의 크기가 다르므로 재정의할것!!.
virtual void ResizeOriginal() = 0;
// 패널의 크기 변경( Open, Close ) 시에 필요기능 정의.
virtual void CustomOpen(){}
virtual void CustomClose(){}
// 활성처리.
void Enable();
// 비활성처리.
virtual void Disable();
// 메모리 해제.
void Release();
// 초기설정.
void Initialize( const KRect & original, const KRect & extension );
// 부모윈도우의 이동. 패널에도 이동적용.
void MovedParentWnd( int offsetX, int offsetY );
// 윈도우 영역내,외 의 컨트롤 가시성 판단.
void DecideVisibility();
// 확장 여부에따라 숨김, 보임 처리가 바뀌는 Wnd.
void AddChangeVisibleWnd( KUIWnd * pWnd );
void ChangeVisiblityWnd( bool bShow );
//-----------------------------
void SetPanelManager( KUIControlPanelManager * pPanelManager ){
m_pPanelManager = pPanelManager;
}
void OpenPanel(); // 패널 열기.
void ClosePanel();// 패널 닫기.
// 원본=>확장, 확장=>원본
void ToggleExtend();
bool GetIsExtend(){ // 확장여부 반환.
return m_bExtend;
}
const KRect & GetRectOriginal(){ // 기본크기.
return m_RectOriginal;
}
const KRect & GetRectExtension(){ // 확장된크기.
return m_RectExtention;
}
// 다양한 목적으로 사용되는 좌표.
const KPoint & GetMultipurposePos();
// 자신이 패널매니저에서 몇번째 인덱스인지 반환.
int GetPanelIndex();
int GetPanelID(){ // 패널의 아이디.
return m_nPanelID;
}
//-------------------------------------------------
// KUIControlPanel 을 구현한 클래스의 데이터.
virtual int GetNumberData(){ return 0; }
virtual const char * GetStrData() { return NULL; }
};
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// class KUIControlPanelManager
//
// * KUIControlPanel 를 관리한다. ( 위치조절, 추가, 삭제 )
//
//
class KUIControlPanelManager
{
private:
KUIWnd * m_pParentWnd; // 패널을 사용하는 윈도우.
KUIControl * m_pPanelOutline; // 패널이 들어갈 윤곽 컨트롤. ( 크기, 위치 지정용 )
int m_Gap; // 패널들 사이의 간격.
std::vector< KUIControlPanel * > m_arrPanel; // 패널윈도우 배열.
KPoint m_MultipurposePos; // 다양한 목적으로 쓰일 수 있는 위치값.
// ex) 길드관리 wnd 에서는 각 패널들에서 띄우게 되는 시작좌표를 지정하였음.
KUIControlPanel * m_pCrrOpenPanel; // 현재 열려있는 패널.
bool m_bShow;
public:
KUIControlPanelManager( KUIWnd * pParentWnd, KUIControl * pPanelOutline, int gap=0 );
~KUIControlPanelManager();
//-----------------------------
// 메모리 해제.
void Release();
// 닫기 통지. 매니저에 속한 패널들에게 OnNotifyUIWindowOpen() 를 보낸다.
void CloseNotify();
// * AddPanel() or DeletePanel() 을 모두 완료한 뒤 반드시 호출할것.
// 패널들을 최초위치로 설정.
void Initialize();
// 부모윈도우 이동. 하위 패널들도 위치 이동.
void MovedParentWnd(int oX, int oY);
// 모든 패널윈도우 크기를 기본크기로 조절.
void ResizeOriginalAll();
// 해당 패널을 제외한 나머지 패널은 원본크기로 되돌림.
void ResizePanel( KUIControlPanel * pTarget );
// 패널들의 위치를 조절한다.
void AdjustPosition();
// 패널추가.
void AddPanel( KUIControlPanel * pPanel );
// 패널제거.
void DeletePanel( KUIControlPanel * pPanel );
// 해당 패널가 패널매니저에서 몇번째 인덱스인지 반환.
int GetPanelIndex( KUIControlPanel * pPanel );
const KRect & GetRectParentWnd(){
return m_pParentWnd->GetRect();
}
// 패널 컨트롤이 위치할 부모윈도우상의 윤곽컨트롤.
const KRect & GetRectPanelOutline();
// 패널윈도우 배열 반환.
const std::vector< KUIControlPanel * > & GetPanelControls(){ return m_arrPanel; }
// 해당 패널 반환.
// 해당 패널 반환.
bool FindPanelByIndex( KUIControlPanel *& OUT_pPanel, int index );
bool FindPanel( KUIControlPanel *& OUT_pPanel, int wndID );
KUIControlPanel * OpenPanel( int wndID ); // 해당 패널 Open.
void ClosePanel( int wndID ); // 해당 패널 Close.
// 다양한 목적으로 쓰일 수 있는 위치값.
void SetMultipurposePos( KPoint & kPos ){
m_MultipurposePos = kPos;
}
const KPoint & GetMultipurposePos(){
return m_MultipurposePos;
}
KUIControlPanel * GetCrrOpenPanel(){ // 현재 열려있는 패널.
return m_pCrrOpenPanel;
}
void SetShow( bool bFlag );
};