230 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			230 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include "..\e2dnode.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->anchor(_anchorX, _anchorY);					\
 | |
| 			this->addChild(New);								\
 | |
| 		}														\
 | |
| 		Old = New;												\
 | |
| 		_updateStatus();										\
 | |
| 		_updateVisible();										\
 | |
| 	}															\
 | |
| 
 | |
| 
 | |
| e2d::ToggleButton::ToggleButton()
 | |
| 	: Button()
 | |
| 	, _checked(true)
 | |
| 	, _normalOn(nullptr)
 | |
| 	, _mouseoverOn(nullptr)
 | |
| 	, _selectedOn(nullptr)
 | |
| 	, _disabledOn(nullptr)
 | |
| 	, _normalOff(nullptr)
 | |
| 	, _mouseoverOff(nullptr)
 | |
| 	, _selectedOff(nullptr)
 | |
| 	, _disabledOff(nullptr)
 | |
| {
 | |
| }
 | |
| 
 | |
| e2d::ToggleButton::ToggleButton(Node * toggleOnNormal, Node * toggleOffNormal, const Function& func)
 | |
| 	: Button()
 | |
| 	, _checked(true)
 | |
| 	, _normalOn(nullptr)
 | |
| 	, _mouseoverOn(nullptr)
 | |
| 	, _selectedOn(nullptr)
 | |
| 	, _disabledOn(nullptr)
 | |
| 	, _normalOff(nullptr)
 | |
| 	, _mouseoverOff(nullptr)
 | |
| 	, _selectedOff(nullptr)
 | |
| 	, _disabledOff(nullptr)
 | |
| {
 | |
| 	this->normal(toggleOnNormal);
 | |
| 	this->normalOff(toggleOffNormal);
 | |
| 	this->clickCallback(func);
 | |
| }
 | |
| 
 | |
| e2d::ToggleButton::ToggleButton(Node * toggleOnNormal, Node * toggleOffNormal, Node * toggleOnSelected, Node * toggleOffSelected, const Function& func)
 | |
| 	: Button()
 | |
| 	, _checked(true)
 | |
| 	, _normalOn(nullptr)
 | |
| 	, _mouseoverOn(nullptr)
 | |
| 	, _selectedOn(nullptr)
 | |
| 	, _disabledOn(nullptr)
 | |
| 	, _normalOff(nullptr)
 | |
| 	, _mouseoverOff(nullptr)
 | |
| 	, _selectedOff(nullptr)
 | |
| 	, _disabledOff(nullptr)
 | |
| {
 | |
| 	this->normal(toggleOnNormal);
 | |
| 	this->normalOff(toggleOffNormal);
 | |
| 	this->selected(toggleOnSelected);
 | |
| 	this->selectedOff(toggleOffSelected);
 | |
| 	this->clickCallback(func);
 | |
| }
 | |
| 
 | |
| e2d::ToggleButton::ToggleButton(Node * toggleOnNormal, Node * toggleOffNormal, Node * toggleOnMouseOver, Node * toggleOffMouseOver, Node * toggleOnSelected, Node * toggleOffSelected, const Function& func)
 | |
| 	: Button()
 | |
| 	, _checked(true)
 | |
| 	, _normalOn(nullptr)
 | |
| 	, _mouseoverOn(nullptr)
 | |
| 	, _selectedOn(nullptr)
 | |
| 	, _disabledOn(nullptr)
 | |
| 	, _normalOff(nullptr)
 | |
| 	, _mouseoverOff(nullptr)
 | |
| 	, _selectedOff(nullptr)
 | |
| 	, _disabledOff(nullptr)
 | |
| {
 | |
| 	this->normal(toggleOnNormal);
 | |
| 	this->normalOff(toggleOffNormal);
 | |
| 	this->mouseover(toggleOnMouseOver);
 | |
| 	this->mouseOverOff(toggleOffMouseOver);
 | |
| 	this->selected(toggleOnSelected);
 | |
| 	this->selectedOff(toggleOffSelected);
 | |
| 	this->clickCallback(func);
 | |
| }
 | |
| 
 | |
| e2d::ToggleButton::ToggleButton(Node * toggleOnNormal, Node * toggleOffNormal, Node * toggleOnMouseOver, Node * toggleOffMouseOver, Node * toggleOnSelected, Node * toggleOffSelected, Node * toggleOnDisabled, Node * toggleOffDisabled, const Function& func)
 | |
| 	: Button()
 | |
| 	, _checked(true)
 | |
| 	, _normalOff(nullptr)
 | |
| 	, _mouseoverOff(nullptr)
 | |
| 	, _selectedOff(nullptr)
 | |
| 	, _disabledOff(nullptr)
 | |
| {
 | |
| 	this->normal(toggleOnNormal);
 | |
| 	this->normalOff(toggleOffNormal);
 | |
| 	this->mouseover(toggleOnMouseOver);
 | |
| 	this->mouseOverOff(toggleOffMouseOver);
 | |
| 	this->selected(toggleOnSelected);
 | |
| 	this->selectedOff(toggleOffSelected);
 | |
| 	this->disabled(toggleOnDisabled);
 | |
| 	this->disabledOff(toggleOffDisabled);
 | |
| 	this->clickCallback(func);
 | |
| }
 | |
| 
 | |
| bool e2d::ToggleButton::checked() const
 | |
| {
 | |
| 	return _checked;
 | |
| }
 | |
| 
 | |
| e2d::ToggleButton& e2d::ToggleButton::checked(bool checked)
 | |
| {
 | |
| 	if (_checked != checked)
 | |
| 	{
 | |
| 		_checked = checked;
 | |
| 		_updateStatus();
 | |
| 		_updateVisible();
 | |
| 	}
 | |
| 	return *this;
 | |
| }
 | |
| 
 | |
| e2d::ToggleButton& e2d::ToggleButton::normal(Node * normal)
 | |
| {
 | |
| 	SET_BUTTON_NODE(_normalOn, normal);
 | |
| 	if (normal)
 | |
| 	{
 | |
| 		this->size(normal->width(), normal->height());
 | |
| 	}
 | |
| 	return *this;
 | |
| }
 | |
| 
 | |
| e2d::ToggleButton& e2d::ToggleButton::mouseover(Node * mouseover)
 | |
| {
 | |
| 	SET_BUTTON_NODE(_mouseoverOn, mouseover);
 | |
| 	return *this;
 | |
| }
 | |
| 
 | |
| e2d::ToggleButton& e2d::ToggleButton::selected(Node * selected)
 | |
| {
 | |
| 	SET_BUTTON_NODE(_selectedOn, selected);
 | |
| 	return *this;
 | |
| }
 | |
| 
 | |
| e2d::ToggleButton& e2d::ToggleButton::disabled(Node * disabled)
 | |
| {
 | |
| 	SET_BUTTON_NODE(_disabledOn, disabled);
 | |
| 	return *this;
 | |
| }
 | |
| 
 | |
| e2d::ToggleButton& e2d::ToggleButton::normalOff(Node * normal)
 | |
| {
 | |
| 	SET_BUTTON_NODE(_normalOff, normal);
 | |
| 	return *this;
 | |
| }
 | |
| 
 | |
| e2d::ToggleButton& e2d::ToggleButton::mouseOverOff(Node * mouseover)
 | |
| {
 | |
| 	SET_BUTTON_NODE(_mouseoverOff, mouseover);
 | |
| 	return *this;
 | |
| }
 | |
| 
 | |
| e2d::ToggleButton& e2d::ToggleButton::selectedOff(Node * selected)
 | |
| {
 | |
| 	SET_BUTTON_NODE(_selectedOff, selected);
 | |
| 	return *this;
 | |
| }
 | |
| 
 | |
| e2d::ToggleButton& e2d::ToggleButton::disabledOff(Node * disabled)
 | |
| {
 | |
| 	SET_BUTTON_NODE(_disabledOff, disabled);
 | |
| 	return *this;
 | |
| }
 | |
| 
 | |
| e2d::ToggleButton& e2d::ToggleButton::anchor(float anchorX, float anchorY)
 | |
| {
 | |
| 	Node::anchor(anchorX, anchorY);
 | |
| 	SAFE_SET(_normalOn, anchor, anchorX, anchorY);
 | |
| 	SAFE_SET(_mouseoverOn, anchor, anchorX, anchorY);
 | |
| 	SAFE_SET(_selectedOn, anchor, anchorX, anchorY);
 | |
| 	SAFE_SET(_disabledOn, anchor, anchorX, anchorY);
 | |
| 	SAFE_SET(_normalOff, anchor, anchorX, anchorY);
 | |
| 	SAFE_SET(_mouseoverOff, anchor, anchorX, anchorY);
 | |
| 	SAFE_SET(_selectedOff, anchor, anchorX, anchorY);
 | |
| 	SAFE_SET(_disabledOff, anchor, anchorX, anchorY);
 | |
| 	return *this;
 | |
| }
 | |
| 
 | |
| void e2d::ToggleButton::_updateStatus()
 | |
| {
 | |
| 	if (_checked)
 | |
| 	{
 | |
| 		_normal = _normalOn;
 | |
| 		_mouseover = _mouseoverOn;
 | |
| 		_selected = _selectedOn;
 | |
| 		_disabled = _disabledOn;
 | |
| 
 | |
| 		SAFE_SET(_normalOff, visible, false);
 | |
| 		SAFE_SET(_mouseoverOff, visible, false);
 | |
| 		SAFE_SET(_selectedOff, visible, false);
 | |
| 		SAFE_SET(_disabledOff, visible, false);
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 		_normal = _normalOff;
 | |
| 		_mouseover = _mouseoverOff;
 | |
| 		_selected = _selectedOff;
 | |
| 		_disabled = _disabledOff;
 | |
| 
 | |
| 		SAFE_SET(_normalOn, visible, false);
 | |
| 		SAFE_SET(_mouseoverOn, visible, false);
 | |
| 		SAFE_SET(_selectedOn, visible, false);
 | |
| 		SAFE_SET(_disabledOn, visible, false);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void e2d::ToggleButton::_runCallback()
 | |
| {
 | |
| 	_checked = !_checked;
 | |
| 	_updateStatus();
 | |
| 
 | |
| 	if (_func)
 | |
| 	{
 | |
| 		_func();
 | |
| 	}
 | |
| }
 |