Files
2022-10-26 12:25:11 +08:00

201 lines
7.5 KiB
C++

#pragma once
#ifdef _YMS_TREECONTROL
#if WZENGINEVER < 400
#error "Impossible Build!! - Reason: WZENGINEVER < 400!!"
#endif //#if WZENGINEVER >= 400
#include "TreeMenuInfoParser.h"
#include "TextureListInfoParser.h"
#include "ListboxScrollControlProduce.h"
//------------------------------------------------------------------------------
class TreeMenuGroup : public ListboxScrollControlProduce
{
public:
class TreeObject;
#ifdef _DEBUG
typedef std::list<TreeObject> TreeObjectList;
#else
typedef STLX_LIST<TreeObject> TreeObjectList;
#endif //_DEBUG
//! call back 함수에서 그릴때 체크해서 원하는 형태로 그림
enum DataFlag
{
kDataFlag = (1 << 1),
kDataFlag_Notice = (kDataFlag | 1 << 2),
kDataFlag_IconBlink = (kDataFlag | 1 << 3),
kDataFlag_None = (1<<31),
};
class TreeObject
{
public:
TreeObject();
TreeObject(TreeObject* _parent, BASE_TreeMenuInfo* _info, bool _visible, bool _enable, DWORD _data_flag = kDataFlag_None);
~TreeObject();
void add_data_flag(DataFlag e) { data_flag_ |= e; }
void remove_data_flag(DataFlag e) { data_flag_ &= (~e); }
bool is_notice() { return ((data_flag_ & kDataFlag_Notice) == kDataFlag_Notice); }
bool is_icon_blink() { return ((data_flag_ & kDataFlag_IconBlink) == kDataFlag_IconBlink); }
//------------------------------------------------------------------------------
TreeObject* parent;
bool is_visible;
bool is_enable;
union
{
bool is_unfold; //!< BASE_TreeMenuInfo::menu_type == kMenuType_Group 일때
bool is_check; //!< BASE_TreeMenuInfo::menu_type == kMenuType_CheckButton 일때
};
BASE_TreeMenuInfo* info;
//! 하위 메뉴
TreeObjectList menu_list;
private:
//DataFlag
DWORD data_flag_;
};
//------------------------------------------------------------------------------
//! 트리메뉴를 그릴 기본 콜백 함수
//! Init에서 콜백을 넣지 않으면 아래 함수 사용
static void Callback_TreeRender(CCtrlListWZ* list_control,
CCtrlListWZ::CListSellData* sell_data,
int sell_index,
RECT& render_area);
public:
TreeMenuGroup();
virtual ~TreeMenuGroup();
//------------------------------------------------------------------------------
//! Returns: bool
//! Qualifier: 리메뉴 초기화
//! Parameter: BASE_TreeMenuInfo::Group_Type tree_group : TreeMenuInfoParser.txt 의 Group 번호
//! Parameter: bool is_simple_menu : 하위 메뉴(폴더)를 하나만 열게함
//! Parameter: CCtrlListWZ::fn_CallbackListBoxSellDraw fn : 메뉴를 그릴때 사용할 콜백 함수
//! NULL : 기본 콜백사용(TreeMenuGroup::Callback_TreeRender)
//------------------------------------------------------------------------------
bool Init(BASE_TreeMenuInfo::Group_Type tree_group,
CCtrlListWZ* _list_control,
CCtrlVScrollWZ* _vscroll_control,
bool is_simple_menu,
CCtrlListWZ::fn_CallbackListBoxSellDraw fn);
bool ApplyTreeGroup(BASE_TreeMenuInfo::Group_Type tree_group);
void Release();
//! 트리내용만 지움
void Cleanup();
//------------------------------------------------------------------------------
//! Returns: bool : true : 트리메뉴에서 이벤트가 처리되었을경우
//! Qualifier: 메세지 처리
//! Parameter: SI_MESSAGE * msg
//! Parameter: OUT TreeObject * & tree_object : 메뉴 클릭이 일어 났을때 선택된 메뉴
//------------------------------------------------------------------------------
bool MessageProc(SI_MESSAGE* msg, OUT TreeObject*& tree_object);
void Fill();
TreeObject* CurrectTreeObject();
TreeObject* OverTreeObject();
TreeObject* Find(DWORD menu_index);
TreeObject* Find(BYTE menuidx_1, BYTE menuidx_2, BYTE menuidx_3, BYTE menuidx_4);
void set_menu_height_gab(int val);
bool is_simple_menu() const { return simple_menu_; }
void set_simple_menu(bool val) { simple_menu_ = val; }
TreeMenuGroup::TreeObject& root_menu() { return root_menu_; }
void set_extend_always( bool val) { extend_always_ = val; }
//------------------------------------------------------------------------------
//! Returns: bool
//! Qualifier: 해당 데이터가 있는 리스트 셀을 선택한다.
//! Parameter: TreeObject * tree_object
//------------------------------------------------------------------------------
bool Select(TreeObject* tree_object);
bool Select();
private:
void Cleanup(TreeObject& tree_object);
bool Insert(TreeObject& tree_object, BASE_TreeMenuInfo* info, int menu_depth);
void Fill(TreeObject& tree_object);
TreeObject* Find(TreeObject& tree_object, DWORD menu_index);
//------------------------------------------------------------------------------
//! Returns: TreeObject* : 버튼 클릭이 일어 났을때 선택된 메뉴 리턴
//! Qualifier: 리스트 박스 클릭시 트리메뉴 재구성
//------------------------------------------------------------------------------
bool OnLButtonClick(SI_MESSAGE* msg, OUT TreeObject*& tree_object);
bool OnLButtonDClick(SI_MESSAGE* msg, OUT TreeObject*& tree_object);
//------------------------------------------------------------------------------
//! Qualifier: 자신을 포함한 하위폴더 모두 닫는다.
//! Parameter: TreeObject * tree_object
//------------------------------------------------------------------------------
void Collapse(TreeObject* tree_object);
//------------------------------------------------------------------------------
//! Qualifier: 자신을 포함한 부모폴더 모두 연다.
//! Parameter: TreeObject * tree_object
//------------------------------------------------------------------------------
void Unfold(TreeObject* tree_object);
//! 루트 메뉴
TreeObject root_menu_;
//! 하나의 하위 메뉴만 열리게
bool simple_menu_;
bool extend_always_; // 이미 열려져 있는경우 재 클릭시 접히지 않도록
//! 리스트 박스 셀 그릴 콜백
CCtrlListWZ::fn_CallbackListBoxSellDraw callback_listbox_sell_draw_;
};
#else
// 에러 안나게 인터페이스만 만들자.
#include "TreeMenuInfoParser.h"
#include "ListboxScrollControlProduce.h"
class TreeMenuGroup : public ListboxScrollControlProduce
{
public :
enum DataFlag
{
kDataFlag = (1 << 1),
kDataFlag_Notice = (kDataFlag | 1 << 2),
kDataFlag_IconBlink = (kDataFlag | 1 << 3),
kDataFlag_None = (1<<31),
};
class TreeObject
{
public:
TreeObject() : info(0) {}
void add_data_flag(DataFlag e) { }
void remove_data_flag(DataFlag e) { }
bool is_notice() { return false; }
bool is_icon_blink() { return false; }
BASE_TreeMenuInfo* info;
};
public:
void Release(){}
void Cleanup(){}
bool MessageProc(SI_MESSAGE* msg, OUT TreeObject*& tree_object){return false;}
void Fill(){}
TreeObject* CurrectTreeObject(){return NULL;}
bool ApplyTreeGroup(BASE_TreeMenuInfo::Group_Type tree_group){ return false; }
bool Select(TreeObject* tree_object) { return false; }
bool Select() { return false; }
TreeObject* Find(DWORD menu_index) { return NULL; }
TreeObject* Find(BYTE menuidx_1, BYTE menuidx_2, BYTE menuidx_3, BYTE menuidx_4) { return NULL; }
};
#endif //#ifdef _YMS_TREECONTROL