Magic_Game/core/Node/Button.cpp

305 lines
6.2 KiB
C++
Raw Normal View History

2017-10-21 19:09:31 +08:00
#include "..\enodes.h"
e2d::EButton::EButton()
2018-01-30 16:45:38 +08:00
: m_Callback((const BtnClkCallback &)nullptr)
2017-12-15 21:51:07 +08:00
, m_eStatus(EButton::NORMAL)
, m_bEnable(true)
2017-10-21 19:09:31 +08:00
, m_bIsSelected(false)
, m_pNormal(nullptr)
, m_pMouseover(nullptr)
, m_pSelected(nullptr)
, m_pDisabled(nullptr)
{
}
2018-01-30 16:45:38 +08:00
e2d::EButton::EButton(ENode * normal, const BtnClkCallback & callback)
: m_Callback((const BtnClkCallback &)nullptr)
2017-12-15 21:51:07 +08:00
, m_eStatus(EButton::NORMAL)
, m_bEnable(true)
, m_bIsSelected(false)
, m_pNormal(nullptr)
, m_pMouseover(nullptr)
, m_pSelected(nullptr)
, m_pDisabled(nullptr)
2017-10-21 19:09:31 +08:00
{
this->setNormal(normal);
this->setCallback(callback);
}
2018-01-30 16:45:38 +08:00
e2d::EButton::EButton(ENode * normal, ENode * selected, const BtnClkCallback & callback)
: m_Callback((const BtnClkCallback &)nullptr)
2017-12-15 21:51:07 +08:00
, m_eStatus(EButton::NORMAL)
, m_bEnable(true)
, m_bIsSelected(false)
, m_pNormal(nullptr)
, m_pMouseover(nullptr)
, m_pSelected(nullptr)
, m_pDisabled(nullptr)
2017-10-21 19:09:31 +08:00
{
this->setNormal(normal);
this->setSelected(selected);
this->setCallback(callback);
}
2018-01-30 16:45:38 +08:00
e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, const BtnClkCallback & callback)
: m_Callback((const BtnClkCallback &)nullptr)
2017-12-15 21:51:07 +08:00
, m_eStatus(EButton::NORMAL)
, m_bEnable(true)
, m_bIsSelected(false)
, m_pNormal(nullptr)
, m_pMouseover(nullptr)
, m_pSelected(nullptr)
, m_pDisabled(nullptr)
2017-10-21 19:09:31 +08:00
{
this->setNormal(normal);
this->setMouseOver(mouseover);
this->setSelected(selected);
this->setCallback(callback);
}
2018-01-30 16:45:38 +08:00
e2d::EButton::EButton(ENode * normal, ENode * mouseover, ENode * selected, ENode * disabled, const BtnClkCallback & callback)
: m_Callback((const BtnClkCallback &)nullptr)
2017-12-15 21:51:07 +08:00
, m_eStatus(EButton::NORMAL)
, m_bEnable(true)
, m_bIsSelected(false)
, m_pNormal(nullptr)
, m_pMouseover(nullptr)
, m_pSelected(nullptr)
, m_pDisabled(nullptr)
2017-10-21 19:09:31 +08:00
{
this->setNormal(normal);
this->setMouseOver(mouseover);
this->setSelected(selected);
this->setDisabled(disabled);
this->setCallback(callback);
}
bool e2d::EButton::isEnable() const
{
return m_bEnable;
}
2017-10-21 19:09:31 +08:00
void e2d::EButton::setNormal(ENode * normal)
{
if (normal != m_pNormal)
2017-10-21 19:09:31 +08:00
{
// <20>Ƴ<EFBFBD><C6B3>ɵ<EFBFBD>
2017-10-21 19:09:31 +08:00
if (m_pNormal)
{
this->removeChild(m_pNormal);
}
// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>
if (normal)
{
this->addChild(normal);
2017-12-05 08:31:54 +08:00
normal->setPivot(m_fPivotX, m_fPivotY);
}
2017-10-21 19:09:31 +08:00
m_pNormal = normal;
_updateVisiable();
2017-10-21 19:09:31 +08:00
}
}
void e2d::EButton::setMouseOver(ENode * mouseover)
{
if (mouseover != m_pNormal)
2017-10-21 19:09:31 +08:00
{
// <20>Ƴ<EFBFBD><C6B3>ɵ<EFBFBD>
2017-10-21 19:09:31 +08:00
if (m_pMouseover)
{
this->removeChild(m_pMouseover);
}
// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>
if (mouseover)
{
this->addChild(mouseover);
2017-12-05 08:31:54 +08:00
mouseover->setPivot(m_fPivotX, m_fPivotY);
}
2017-10-21 19:09:31 +08:00
m_pMouseover = mouseover;
_updateVisiable();
2017-10-21 19:09:31 +08:00
}
}
void e2d::EButton::setSelected(ENode * selected)
{
if (selected != m_pNormal)
2017-10-21 19:09:31 +08:00
{
// <20>Ƴ<EFBFBD><C6B3>ɵ<EFBFBD>
2017-10-21 19:09:31 +08:00
if (m_pSelected)
{
this->removeChild(m_pSelected);
}
// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>
if (selected)
{
this->addChild(selected);
2017-12-05 08:31:54 +08:00
selected->setPivot(m_fPivotX, m_fPivotY);
}
2017-10-21 19:09:31 +08:00
m_pSelected = selected;
_updateVisiable();
2017-10-21 19:09:31 +08:00
}
}
void e2d::EButton::setDisabled(ENode * disabled)
{
if (disabled != m_pNormal)
2017-10-21 19:09:31 +08:00
{
// <20>Ƴ<EFBFBD><C6B3>ɵ<EFBFBD>
2017-10-21 19:09:31 +08:00
if (m_pDisabled)
{
this->removeChild(m_pDisabled);
}
// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>
if (disabled)
{
this->addChild(disabled);
2017-12-05 08:31:54 +08:00
disabled->setPivot(m_fPivotX, m_fPivotY);
}
2017-10-21 19:09:31 +08:00
m_pDisabled = disabled;
_updateVisiable();
2017-10-21 19:09:31 +08:00
}
}
void e2d::EButton::setEnable(bool bEnable)
2017-10-21 19:09:31 +08:00
{
if (m_bEnable != bEnable)
{
m_bEnable = bEnable;
_updateVisiable();
}
2017-10-21 19:09:31 +08:00
}
2018-01-30 16:45:38 +08:00
void e2d::EButton::setCallback(const BtnClkCallback & callback)
2017-10-21 19:09:31 +08:00
{
2018-01-30 16:45:38 +08:00
WARN_IF(m_pNormal == nullptr, "EButton cannot work without anything to show. Please set its normal displayed.");
m_Callback = callback;
2017-10-21 19:09:31 +08:00
}
2017-12-05 08:31:54 +08:00
void e2d::EButton::setPivotX(float pivotX)
{
ENode::setPivotX(pivotX);
if (m_pNormal) m_pNormal->setPivotX(pivotX);
if (m_pMouseover) m_pMouseover->setPivotX(pivotX);
if (m_pSelected) m_pSelected->setPivotX(pivotX);
if (m_pDisabled) m_pDisabled->setPivotX(pivotX);
}
void e2d::EButton::setPivotY(float pivotY)
{
ENode::setPivotY(pivotY);
if (m_pNormal) m_pNormal->setPivotY(pivotY);
if (m_pMouseover) m_pMouseover->setPivotY(pivotY);
if (m_pSelected) m_pSelected->setPivotY(pivotY);
if (m_pDisabled) m_pDisabled->setPivotY(pivotY);
}
void e2d::EButton::setPivot(float pivotX, float pivotY)
{
ENode::setPivot(pivotX, pivotY);
if (m_pNormal) m_pNormal->setPivot(pivotX, pivotY);
if (m_pMouseover) m_pMouseover->setPivot(pivotX, pivotY);
if (m_pSelected) m_pSelected->setPivot(pivotX, pivotY);
if (m_pDisabled) m_pDisabled->setPivot(pivotX, pivotY);
}
2018-01-30 16:45:38 +08:00
void e2d::EButton::onUpdate()
2017-12-16 15:49:48 +08:00
{
2018-01-30 16:45:38 +08:00
if (m_bEnable && m_pNormal)
{
ENode * pMouseover = m_pMouseover ? m_pMouseover : m_pNormal;
ENode * pSelected = m_pSelected ? m_pSelected : m_pNormal;
if (EInput::isMouseLButtonRelease())
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̧<EFBFBD><CCA7>ʱ<EFBFBD><CAB1><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ڰ<EFBFBD>ť<EFBFBD>ڲ<EFBFBD>
if (m_bIsSelected &&
pSelected->isPointIn(EInput::getMousePos()))
{
_runCallback();
}
// <20><><EFBFBD><EFBFBD> m_bIsSelected Ϊ false
m_bIsSelected = false;
}
if (EInput::isMouseLButtonPress())
{
if (pMouseover->isPointIn(EInput::getMousePos()))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD><C2A3><EFBFBD>λ<EFBFBD>ڰ<EFBFBD>ť<EFBFBD><C5A5>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_bIsSelected Ϊ true
m_bIsSelected = true;
_setStatus(EButton::SELECTED);
return;
}
}
if (m_bIsSelected && EInput::isMouseLButtonDown())
{
if (pSelected->isPointIn(EInput::getMousePos()))
{
_setStatus(EButton::SELECTED);
return;
}
}
else if (m_pNormal->isPointIn(EInput::getMousePos()))
{
_setStatus(EButton::MOUSEOVER);
return;
}
_setStatus(EButton::NORMAL);
}
2017-12-16 15:49:48 +08:00
}
void e2d::EButton::_setStatus(STATUS status)
2017-10-21 19:09:31 +08:00
{
if (m_eStatus != status)
2017-10-21 19:09:31 +08:00
{
m_eStatus = status;
_updateVisiable();
2017-10-21 19:09:31 +08:00
}
}
2017-10-21 19:09:31 +08:00
void e2d::EButton::_updateVisiable()
{
if (m_pNormal) m_pNormal->setVisiable(false);
if (m_pMouseover) m_pMouseover->setVisiable(false);
if (m_pSelected) m_pSelected->setVisiable(false);
if (m_pDisabled) m_pDisabled->setVisiable(false);
2017-10-21 19:09:31 +08:00
if (m_bEnable)
2017-10-21 19:09:31 +08:00
{
2017-12-15 21:51:07 +08:00
if (m_eStatus == EButton::SELECTED && m_pSelected)
2017-10-21 19:09:31 +08:00
{
m_pSelected->setVisiable(true);
2017-10-21 19:09:31 +08:00
}
2017-12-15 21:51:07 +08:00
else if (m_eStatus == EButton::MOUSEOVER && m_pMouseover)
2017-10-21 19:09:31 +08:00
{
m_pMouseover->setVisiable(true);
2017-10-21 19:09:31 +08:00
}
else
{
if (m_pNormal) m_pNormal->setVisiable(true);
}
}
else
{
if (m_pDisabled)
2017-10-21 19:09:31 +08:00
{
m_pDisabled->setVisiable(true);
2017-10-21 19:09:31 +08:00
}
else
2017-10-21 19:09:31 +08:00
{
if (m_pNormal) m_pNormal->setVisiable(true);
2017-10-21 19:09:31 +08:00
}
}
}
void e2d::EButton::_runCallback()
{
if (m_Callback)
2017-10-21 19:09:31 +08:00
{
m_Callback();
2017-10-21 19:09:31 +08:00
}
}