#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_(); } }