Magic_Game/core/components/ToggleButton.cpp

220 lines
5.3 KiB
C++
Raw Normal View History

2018-09-05 13:17:07 +08:00
#include "..\e2dcomponent.h"
2018-07-25 16:44:22 +08:00
#define SAFE_SET(pointer, func, ...) if (pointer) { pointer->##func(__VA_ARGS__); }
#define SET_BUTTON_NODE(Old, New) \
if (New != Old) \
{ \
2018-09-04 22:42:34 +08:00
if (Old) this->RemoveChild(Old); \
2018-07-25 16:44:22 +08:00
if (New) \
{ \
2018-09-04 22:42:34 +08:00
New->SetAnchor(anchor_.x, anchor_.y); \
this->AddChild(New); \
2018-07-25 16:44:22 +08:00
} \
Old = New; \
2018-09-04 22:42:34 +08:00
UpdateStatus(); \
UpdateVisible(); \
2018-07-25 16:44:22 +08:00
} \
2018-05-22 22:29:42 +08:00
e2d::ToggleButton::ToggleButton()
: Button()
2018-09-04 22:42:34 +08:00
, checked_(true)
, normal_on_(nullptr)
, mouseover_on_(nullptr)
, selected_on_(nullptr)
, disabled_on_(nullptr)
, normal_off_(nullptr)
, mouseover_off_(nullptr)
, selected_off_(nullptr)
, disabled_off_(nullptr)
{
}
2018-09-04 22:42:34 +08:00
e2d::ToggleButton::ToggleButton(Node * normal_on, Node * normal_off, const Function& func)
: Button()
2018-09-04 22:42:34 +08:00
, checked_(true)
, normal_on_(nullptr)
, mouseover_on_(nullptr)
, selected_on_(nullptr)
, disabled_on_(nullptr)
, normal_off_(nullptr)
, mouseover_off_(nullptr)
, selected_off_(nullptr)
, disabled_off_(nullptr)
{
this->SetNormal(normal_on);
this->SetNormalOff(normal_off);
this->SetCallbackOnClick(func);
}
e2d::ToggleButton::ToggleButton(Node * normal_on, Node * normal_off, Node * selected_on, Node * selected_off, const Function& func)
: Button()
2018-09-04 22:42:34 +08:00
, checked_(true)
, normal_on_(nullptr)
, mouseover_on_(nullptr)
, selected_on_(nullptr)
, disabled_on_(nullptr)
, normal_off_(nullptr)
, mouseover_off_(nullptr)
, selected_off_(nullptr)
, disabled_off_(nullptr)
{
this->SetNormal(normal_on);
this->SetNormalOff(normal_off);
this->SetSelected(selected_on);
this->SetSelectedOff(selected_off);
this->SetCallbackOnClick(func);
}
e2d::ToggleButton::ToggleButton(Node * normal_on, Node * normal_off, Node * mouseover_on, Node * mouseover_off, Node * selected_on, Node * selected_off, const Function& func)
: Button()
2018-09-04 22:42:34 +08:00
, checked_(true)
, normal_on_(nullptr)
, mouseover_on_(nullptr)
, selected_on_(nullptr)
, disabled_on_(nullptr)
, normal_off_(nullptr)
, mouseover_off_(nullptr)
, selected_off_(nullptr)
, disabled_off_(nullptr)
{
this->SetNormal(normal_on);
this->SetNormalOff(normal_off);
this->SetMouseOver(mouseover_on);
this->SetMouseOverOff(mouseover_off);
this->SetSelected(selected_on);
this->SetSelectedOff(selected_off);
this->SetCallbackOnClick(func);
}
e2d::ToggleButton::ToggleButton(Node * normal_on, Node * normal_off, Node * mouseover_on, Node * mouseover_off, Node * selected_on, Node * selected_off, Node * disabled_on, Node * disabled_off, const Function& func)
: Button()
2018-09-04 22:42:34 +08:00
, checked_(true)
, normal_off_(nullptr)
, mouseover_off_(nullptr)
, selected_off_(nullptr)
, disabled_off_(nullptr)
{
2018-09-04 22:42:34 +08:00
this->SetNormal(normal_on);
this->SetNormalOff(normal_off);
this->SetMouseOver(mouseover_on);
this->SetMouseOverOff(mouseover_off);
this->SetSelected(selected_on);
this->SetSelectedOff(selected_off);
this->SetDisabled(disabled_on);
this->SetDisabledOff(disabled_off);
this->SetCallbackOnClick(func);
}
2018-09-04 22:42:34 +08:00
bool e2d::ToggleButton::IsChecked() const
{
2018-09-04 22:42:34 +08:00
return checked_;
}
2018-09-04 22:42:34 +08:00
void e2d::ToggleButton::SetChecked(bool checked)
{
2018-09-04 22:42:34 +08:00
if (checked_ != checked)
{
2018-09-04 22:42:34 +08:00
checked_ = checked;
UpdateStatus();
UpdateVisible();
}
}
2018-09-04 22:42:34 +08:00
void e2d::ToggleButton::SetNormal(Node * normal)
{
2018-09-04 22:42:34 +08:00
SET_BUTTON_NODE(normal_on_, normal);
if (normal)
{
2018-09-04 22:42:34 +08:00
this->SetSize(normal->GetWidth(), normal->GetHeight());
}
}
2018-09-04 22:42:34 +08:00
void e2d::ToggleButton::SetMouseOver(Node * mouseover)
{
2018-09-04 22:42:34 +08:00
SET_BUTTON_NODE(mouseover_on_, mouseover);
}
2018-09-04 22:42:34 +08:00
void e2d::ToggleButton::SetSelected(Node * selected)
{
2018-09-04 22:42:34 +08:00
SET_BUTTON_NODE(selected_on_, selected);
}
2018-09-04 22:42:34 +08:00
void e2d::ToggleButton::SetDisabled(Node * disabled)
{
2018-09-04 22:42:34 +08:00
SET_BUTTON_NODE(disabled_on_, disabled);
}
2018-09-04 22:42:34 +08:00
void e2d::ToggleButton::SetNormalOff(Node * normal)
{
2018-09-04 22:42:34 +08:00
SET_BUTTON_NODE(normal_off_, normal);
}
2018-09-04 22:42:34 +08:00
void e2d::ToggleButton::SetMouseOverOff(Node * mouseover)
{
2018-09-04 22:42:34 +08:00
SET_BUTTON_NODE(mouseover_off_, mouseover);
}
2018-09-04 22:42:34 +08:00
void e2d::ToggleButton::SetSelectedOff(Node * selected)
{
2018-09-04 22:42:34 +08:00
SET_BUTTON_NODE(selected_off_, selected);
}
2018-09-04 22:42:34 +08:00
void e2d::ToggleButton::SetDisabledOff(Node * disabled)
{
2018-09-04 22:42:34 +08:00
SET_BUTTON_NODE(disabled_off_, disabled);
}
2018-09-04 22:42:34 +08:00
void e2d::ToggleButton::SetAnchor(float anchor_x, float anchor_y)
2018-07-28 20:48:25 +08:00
{
2018-09-04 22:42:34 +08:00
Node::SetAnchor(anchor_x, anchor_y);
SAFE_SET(normal_on_, SetAnchor, anchor_x, anchor_y);
SAFE_SET(mouseover_on_, SetAnchor, anchor_x, anchor_y);
SAFE_SET(selected_on_, SetAnchor, anchor_x, anchor_y);
SAFE_SET(disabled_on_, SetAnchor, anchor_x, anchor_y);
SAFE_SET(normal_off_, SetAnchor, anchor_x, anchor_y);
SAFE_SET(mouseover_off_, SetAnchor, anchor_x, anchor_y);
SAFE_SET(selected_off_, SetAnchor, anchor_x, anchor_y);
SAFE_SET(disabled_off_, SetAnchor, anchor_x, anchor_y);
2018-07-28 20:48:25 +08:00
}
2018-09-04 22:42:34 +08:00
void e2d::ToggleButton::UpdateStatus()
2018-02-04 21:24:27 +08:00
{
2018-09-04 22:42:34 +08:00
if (checked_)
{
2018-09-04 22:42:34 +08:00
normal_ = normal_on_;
mouseover_ = mouseover_on_;
selected_ = selected_on_;
disabled_ = disabled_on_;
SAFE_SET(normal_off_, SetVisible, false);
SAFE_SET(mouseover_off_, SetVisible, false);
SAFE_SET(selected_off_, SetVisible, false);
SAFE_SET(disabled_off_, SetVisible, false);
}
else
{
2018-09-04 22:42:34 +08:00
normal_ = normal_off_;
mouseover_ = mouseover_off_;
selected_ = selected_off_;
disabled_ = disabled_off_;
SAFE_SET(normal_on_, SetVisible, false);
SAFE_SET(mouseover_on_, SetVisible, false);
SAFE_SET(selected_on_, SetVisible, false);
SAFE_SET(disabled_on_, SetVisible, false);
}
}
2018-09-04 22:42:34 +08:00
void e2d::ToggleButton::OnClick()
{
2018-09-04 22:42:34 +08:00
checked_ = !checked_;
UpdateStatus();
2018-09-04 22:42:34 +08:00
if (callback_)
{
2018-09-04 22:42:34 +08:00
callback_();
}
}