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

619 lines
12 KiB
C++

#include "stdafx.h"
#include "stdafx.h"
#include "ArenaMenuSystem.h"
#include "CommonUtil.h"
//#include "KUIControl.h"
#include "SStringDB.h"
#define ARENA_MENU_ITEM_HEIGHT 21
struct sFoldFunctor
{
template <typename T>
void operator ()(T* t)
{
t->fold();
}
};
template <typename TYPE, typename T>
void safeStlPointerDelete(T& t)
{
TYPE::iterator it = t.begin();
for (; it != t.end(); ++it)
{
SAFE_DELETE(*it);
}
t.clear();
}
sArenaMenuItemControl::sArenaMenuItemControl(KUIControl* control, int offsetY) : m_offsetY(offsetY)
{
m_control = control;
if (m_control)
{
m_control->SetEnableColor("<#ffffff>");
m_control->SetDisableColor("<#a0a0a0>");
m_control->SetEnableOption(true);
}
}
sArenaMenuItem::~sArenaMenuItem()
{
m_controlList.clear();
}
void sArenaMenuItem::addControl(KUIControl* control, int offsetY)
{
m_controlList.push_back(sArenaMenuItemControl(control, offsetY));
}
void sArenaMenuItem::fold()
{
setShow(false);
}
void sArenaMenuItem::unFold(int y)
{
struct sItemControlUnFoldFunctor
{
sItemControlUnFoldFunctor(int y) : m_y(y) {}
void operator ()(sArenaMenuItemControl& itemControl)
{
int x = itemControl.m_control->GetRect().left;
itemControl.m_control->SetShow(true);
itemControl.m_control->MovePos(x, m_y + itemControl.m_offsetY);
}
int m_y;
};
std::for_each(m_controlList.begin(), m_controlList.end(), sItemControlUnFoldFunctor(y));
}
void sArenaMenuItem::setShow(bool show)
{
struct sItemControlVisibleFunctor
{
sItemControlVisibleFunctor(bool show) : m_show(show) {}
void operator ()(sArenaMenuItemControl& itemControl)
{
itemControl.m_control->SetShow(m_show);
}
bool m_show;
};
std::for_each(m_controlList.begin(), m_controlList.end(), sItemControlVisibleFunctor(show));
}
void sArenaMenuItem::setEnable(bool enable)
{
struct sItemControlEnableFunctor
{
sItemControlEnableFunctor(bool enable) : m_enable(enable) {}
void operator ()(sArenaMenuItemControl& itemControl)
{
if (m_enable)
itemControl.m_control->Enable();
else
itemControl.m_control->Disable();
}
bool m_enable;
};
std::for_each(m_controlList.begin(), m_controlList.end(), sItemControlEnableFunctor(enable));
}
void sArenaMenuItem::move(int y)
{
struct sItemControlMoveFunctor
{
sItemControlMoveFunctor(int y) : m_y(y) {}
void operator ()(sArenaMenuItemControl& itemControl)
{
int x = itemControl.m_control->GetRect().left;
itemControl.m_control->MovePos(x, m_y + itemControl.m_offsetY);
}
int m_y;
};
std::for_each(m_controlList.begin(), m_controlList.end(), sItemControlMoveFunctor(y));
}
sArenaSubMenu::~sArenaSubMenu()
{
SAFE_DELETE(m_item);
}
void sArenaSubMenu::setItem(sArenaMenuItem* item)
{
SAFE_DELETE(m_item);
m_item = item;
}
void sArenaSubMenu::fold()
{
if (NULL == m_item)
{
assert(!m_item && "m_item is null");
return ;
}
m_item->fold();
}
void sArenaSubMenu::unFold(int y)
{
if (NULL == m_item)
{
assert(!m_item && "m_item is null");
return ;
}
m_item->unFold(y);
}
void sArenaSubMenu::setEnable(bool enable)
{
if (NULL == m_item)
{
assert(!m_item && "m_item is null");
return ;
}
m_item->setEnable(enable);
}
char const* sArenaSubMenu::getName()
{
if (0 > m_nameId)
return "";
return S(m_nameId);
}
sArenaMainMenu::sArenaMainMenu() : m_isSelect(false),
m_isFold(false),
m_foldButton(NULL),
m_selectNameControl(NULL),
m_nextMainMenu(NULL),
m_selectSubMenuId(-1)
{
}
sArenaMainMenu::~sArenaMainMenu()
{
safeStlPointerDelete<std::vector<sArenaSubMenu*> >(m_subMenuList);
}
void sArenaMainMenu::setFoldButton(KUIWnd* control)
{
assert(!control && "fold button control is null");
m_foldButton = dynamicCast<KUIControl*>(control);
}
void sArenaMainMenu::addSubMenu(SUIWnd* wnd, int subMenuId, char const* basisControlId, int tooltipStringId, int selectNameStringId, int itemCount, ...)
{
/// sub menu
sArenaSubMenu* subMenu = new sArenaSubMenu;
subMenu->setNameId(selectNameStringId);
subMenu->setId(subMenuId);
KUIControl* basisControl = dynamicCast<KUIControl*>(wnd->GetChild(basisControlId));
int basisY = basisControl->GetRect().top;
if (0 <= tooltipStringId)
basisControl->SetTooltip(S(tooltipStringId));
/// item
sArenaMenuItem* item = new sArenaMenuItem;
va_list args;
va_start(args, itemCount);
for (int i = 0; i < itemCount; ++i)
{
KUIControl* control = dynamicCast<KUIControl*>(wnd->GetChild(va_arg(args, char*)));
control->SetEnableColor("<#ffffff>");
control->SetDisableColor("<#a0a0a0>");
int offsetY = control->GetRect().top - basisY;
item->addControl(control, offsetY);
}
va_end(args);
subMenu->setItem(item);
addSubMenu(subMenu);
}
void sArenaMainMenu::addSubMenu(sArenaSubMenu* subMenu)
{
m_subMenuList.push_back(subMenu);
}
void sArenaMainMenu::addItemControl(SUIWnd* wnd, char const* basisControlId, int selectStatus, int itemCount, ...)
{
KUIWnd* basisControl = wnd->GetChild(basisControlId);
int basisY = basisControl->GetRect().top;
va_list args;
va_start(args, itemCount);
for (int i = 0; i < itemCount; ++i)
{
KUIControl* control = dynamicCast<KUIControl*>(wnd->GetChild(va_arg(args, char*)));
addItemControl(control, basisY, selectStatus);
}
va_end(args);
}
void sArenaMainMenu::addItemControl(KUIControl* control, int basisY, int selectStatus)
{
int offsetY = control->GetRect().top - basisY;
m_item[selectStatus].addControl(control, offsetY);
}
void sArenaMainMenu::unfold(int& y)
{
m_isFold = false;
itemUnFold(y);
subMenuUnFold(y);
checkFoldButtonStatus();
}
void sArenaMainMenu::itemUnFold(int& y)
{
for (int i = 0; i < MAX_ITEM; ++i)
{
/// show = true가 되면 안되기 때문에 move를 호출해 준다
m_item[i].move(y);
}
y += ARENA_MENU_ITEM_HEIGHT;
}
void sArenaMainMenu::subMenuUnFold(int &y)
{
std::vector<sArenaSubMenu*>::iterator it = m_subMenuList.begin();
for (; it != m_subMenuList.end(); ++it)
{
(*it)->unFold(y);
y += ARENA_MENU_ITEM_HEIGHT;
}
}
void sArenaMainMenu::fold(int& y)
{
m_isFold = true;
itemFold(y);
subMenuFold();
checkFoldButtonStatus();
}
void sArenaMainMenu::itemFold(int& y)
{
/// 이동되고 보여야 되기 때문에 fold()가 아니고 move를 호출 한다.
for (int i = 0; i < MAX_ITEM; ++i)
{
m_item[i].move(y);
}
y += ARENA_MENU_ITEM_HEIGHT;
}
void sArenaMainMenu::subMenuFold()
{
std::for_each(m_subMenuList.begin(), m_subMenuList.end(), sFoldFunctor());
}
void sArenaMainMenu::checkFoldButtonStatus()
{
char const* aniName;
bool enable;
int tooltipId;
if (m_isSelect)
{
tooltipId = 2377;
enable = true;
aniName = "common_button_copper_left";
}
else
{
if (m_isFold)
{
tooltipId = 2375;
enable = true;
aniName = "common_button_copper_unfold";
}
else
{
tooltipId = 2376;
enable = false;
aniName = "common_button_copper_fold";
}
}
m_foldButton->SetAniName(aniName);
m_foldButton->SetTooltip(S(tooltipId));
setEnableFold(enable);
}
void sArenaMainMenu::setSelect(int subMenuId, bool select)
{
m_isSelect = select;
setSelectSubMenuId(subMenuId);
setSelectSubMenuName(subMenuId);
if (m_isSelect)
{
m_item[SELECT_ITEM].setShow(true);
m_item[NONSELECT_ITEM].setShow(false);
}
else
{
m_item[SELECT_ITEM].setShow(false);
m_item[NONSELECT_ITEM].setShow(true);
}
checkFoldButtonStatus();
}
void sArenaMainMenu::setEnableSubMenu(int subMenuId, bool enable)
{
sArenaSubMenu* subMenu = getSubMenu(subMenuId);
if (!subMenu)
return ;
subMenu->setEnable(enable);
}
void sArenaMainMenu::syncFoldButtonAniName()
{
char const* aniName = NULL;
if (m_isSelect)
{
aniName = "common_button_copper_left";
}
else
{
if (m_isFold)
{
aniName = "common_button_copper_fold";
}
else
{
aniName = "common_button_copper_unfold";
}
}
assert(!aniName && "aniname is null");
m_foldButton->SetAniName(aniName);
}
void sArenaMainMenu::setEnableFold(bool enable)
{
if (enable)
m_foldButton->Enable();
else
m_foldButton->Disable();
}
void sArenaMainMenu::setSelectSubMenuName(int subMenuId)
{
sArenaSubMenu* subMenu = getSubMenu(subMenuId);
if (!subMenu)
return ;
if (!m_selectNameControl)
{
assert(0 && "m_selectNameControl is null");
return ;
}
std::string name = "<font:font_01><size:9><#898989><b><right>";
name += subMenu->getName();
m_selectNameControl->SetCaption(name.c_str());
}
sArenaSubMenu* sArenaMainMenu::getSubMenu(int subMenuId)
{
if (0 > subMenuId)
return NULL;
int subMenuSize = (int)m_subMenuList.size();
if (subMenuSize <= subMenuId)
{
assert(0 && "failed getSubMenu : invalid sub menui id");
return NULL;
}
for (int i = 0; i < subMenuSize; ++i)
{
if (m_subMenuList[i]->getId() == subMenuId)
return m_subMenuList[i];
}
return NULL;
}
sArenaMenuSystem::~sArenaMenuSystem()
{
safeStlPointerDelete<std::list<sArenaMainMenu*> >(m_mainMenuList);
}
void sArenaMenuSystem::addMainMenu(sArenaMainMenu* mainMenu)
{
if (!m_mainMenuList.empty())
{
m_mainMenuList.back()->setNextMainMenu(mainMenu);
}
m_mainMenuList.push_back(mainMenu);
}
void sArenaMenuSystem::unfold(int mainMenuId)
{
int y = getBasisY();
std::list<sArenaMainMenu*>::iterator it = m_mainMenuList.begin();
for (; it != m_mainMenuList.end(); ++it)
{
sArenaMainMenu* mainMenu = *it;
if (mainMenu->getId() == mainMenuId)
{
mainMenu->unfold(y);
}
else
{
mainMenu->fold(y);
}
}
}
void sArenaMenuSystem::allFold()
{
int y = getBasisY();
std::list<sArenaMainMenu*>::iterator it = m_mainMenuList.begin();
for (; it != m_mainMenuList.end(); ++it)
{
(*it)->fold(y);
}
}
void sArenaMenuSystem::setEnableFold(int mainMenuId, bool enable)
{
sArenaMainMenu* mainMenu = findMainMenu(mainMenuId);
if (NULL == mainMenu)
return ;
mainMenu->setEnableFold(enable);
}
void sArenaMenuSystem::setSelect(int mainMenuId, int subMenuId, bool select)
{
sArenaMainMenu* mainMenu = findMainMenu(mainMenuId);
if (NULL == mainMenu)
return ;
mainMenu->setSelect(subMenuId, select);
}
void sArenaMenuSystem::setSelectMenuItem(int mainMenuId, int subMenuId, bool& _isAllSelected)
{
setSelect(mainMenuId, subMenuId, true);
if (isAllSelected())
{
_isAllSelected = true;
allFold();
}
else
{
_isAllSelected = false;
setNextUnFold(mainMenuId);
}
}
void sArenaMenuSystem::setEnableMenuItem(int mainMenuId, int subMenuId, bool enable)
{
sArenaMainMenu* mainMenu = findMainMenu(mainMenuId);
if (NULL == mainMenu)
return ;
mainMenu->setEnableSubMenu(subMenuId, enable);
}
void sArenaMenuSystem::setNextUnFold(int mainMenuId)
{
sArenaMainMenu* mainMenu = findMainMenu(mainMenuId);
if (NULL == mainMenu)
return ;
sArenaMainMenu* nextMainMenu = mainMenu->getNextMainMenu();
if (nextMainMenu)
{
if (nextMainMenu->isSelected())
{
setUnSelectedToUnFold();
}
else
{
unfold(nextMainMenu->getId());
}
}
else
{
setUnSelectedToUnFold();
}
}
void sArenaMenuSystem::setUnSelectedToUnFold()
{
std::list<sArenaMainMenu*>::iterator it = m_mainMenuList.begin();
for (; it != m_mainMenuList.end(); ++it)
{
sArenaMainMenu* mainMenu = *it;
if (!mainMenu->isSelected())
{
unfold(mainMenu->getId());
return ;
}
}
}
sArenaMainMenu* sArenaMenuSystem::findMainMenu(int mainMenuId) const
{
std::list<sArenaMainMenu*>::const_iterator it = m_mainMenuList.begin();
for (; it != m_mainMenuList.end(); ++it)
{
sArenaMainMenu* mainMenu = *it;
if (mainMenu->getId() == mainMenuId)
{
return mainMenu;
}
}
assert(0 && "failed find main menu");
return NULL;
}
bool sArenaMenuSystem::isAllSelected() const
{
std::list<sArenaMainMenu*>::const_iterator it = m_mainMenuList.begin();
for (; it != m_mainMenuList.end(); ++it)
{
if (!(*it)->isSelected())
return false;
}
return true;
}
bool sArenaMenuSystem::isSelected(int mainMenuId) const
{
sArenaMainMenu* mainMenu = findMainMenu(mainMenuId);
if (NULL == mainMenu)
return false;
return mainMenu->isSelected();
}
void sArenaMenuSystem::initMenu(int unfoldMainMenuId)
{
int y = getBasisY();
std::list<sArenaMainMenu*>::iterator it = m_mainMenuList.begin();
for (; it != m_mainMenuList.end(); ++it)
{
sArenaMainMenu* mainMenu = *it;
if (mainMenu->getId() == unfoldMainMenuId)
{
mainMenu->unfold(y);
}
else
{
mainMenu->fold(y);
}
mainMenu->setSelect(-1, false);
}
}
int sArenaMenuSystem::getBasisY() const
{
if (!m_basisYControl)
{
assert(!m_basisYControl && "m_basisYControl is null");
return 0;
}
return m_basisYControl->GetRect().top;
}
int sArenaMenuSystem::getSelectSubMenuId(int mainMenuId) const
{
sArenaMainMenu* mainMenu = findMainMenu(mainMenuId);
if (NULL == mainMenu)
return -1;
return mainMenu->getSelectSubMenuId();
}