Magic_Game/core/Node/ToggleButton.cpp

220 lines
5.3 KiB
C++

#include "..\e2dcomponent.h"
#define SAFE_SET(pointer, func, ...) if (pointer) { pointer->##func(__VA_ARGS__); }
#define SET_BUTTON_NODE(Old, New) \
if (New != Old) \
{ \
if (Old) this->RemoveChild(Old); \
if (New) \
{ \
New->SetAnchor(anchor_.x, anchor_.y); \
this->AddChild(New); \
} \
Old = New; \
UpdateStatus(); \
UpdateVisible(); \
} \
e2d::ToggleButton::ToggleButton()
: Button()
, 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)
{
}
e2d::ToggleButton::ToggleButton(Node * normal_on, Node * normal_off, const Function& func)
: Button()
, 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()
, 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()
, 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()
, checked_(true)
, 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->SetDisabled(disabled_on);
this->SetDisabledOff(disabled_off);
this->SetCallbackOnClick(func);
}
bool e2d::ToggleButton::IsChecked() const
{
return checked_;
}
void e2d::ToggleButton::SetChecked(bool checked)
{
if (checked_ != checked)
{
checked_ = checked;
UpdateStatus();
UpdateVisible();
}
}
void e2d::ToggleButton::SetNormal(Node * normal)
{
SET_BUTTON_NODE(normal_on_, normal);
if (normal)
{
this->SetSize(normal->GetWidth(), normal->GetHeight());
}
}
void e2d::ToggleButton::SetMouseOver(Node * mouseover)
{
SET_BUTTON_NODE(mouseover_on_, mouseover);
}
void e2d::ToggleButton::SetSelected(Node * selected)
{
SET_BUTTON_NODE(selected_on_, selected);
}
void e2d::ToggleButton::SetDisabled(Node * disabled)
{
SET_BUTTON_NODE(disabled_on_, disabled);
}
void e2d::ToggleButton::SetNormalOff(Node * normal)
{
SET_BUTTON_NODE(normal_off_, normal);
}
void e2d::ToggleButton::SetMouseOverOff(Node * mouseover)
{
SET_BUTTON_NODE(mouseover_off_, mouseover);
}
void e2d::ToggleButton::SetSelectedOff(Node * selected)
{
SET_BUTTON_NODE(selected_off_, selected);
}
void e2d::ToggleButton::SetDisabledOff(Node * disabled)
{
SET_BUTTON_NODE(disabled_off_, disabled);
}
void e2d::ToggleButton::SetAnchor(float anchor_x, float anchor_y)
{
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);
}
void e2d::ToggleButton::UpdateStatus()
{
if (checked_)
{
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
{
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);
}
}
void e2d::ToggleButton::OnClick()
{
checked_ = !checked_;
UpdateStatus();
if (callback_)
{
callback_();
}
}