Magic_Game/Easy2D/Object/MouseNode.cpp

176 lines
2.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "..\easy2d.h"
#include "..\e2dobj.h"
MouseNode::MouseNode() :
m_bBlock(true),
m_bTarget(false),
m_ClickCallback([]() {}),
m_OnMouseInCallback([]() {}),
m_OnMouseOutCallback([]() {}),
m_OnSelectCallback([]() {}),
m_OnUnselectCallback([]() {})
{
}
MouseNode::~MouseNode()
{
}
bool MouseNode::_exec(bool active)
{
// 若 display 属性为 false退出函数
if (!m_bDisplay)
{
return false;
}
// 若画面已取得焦点,重置按钮属性并退出
if (!active)
{
reset();
return false;
}
// 判断节点当前的状态
// 若节点未取得焦点,则重新判断节点状态
if (!m_bTarget)
{
// 若鼠标位置在节点所在的矩形区域中
if (_isMouseIn())
{
// 状态设为 MOUSEIN
_setStatus(MOUSEIN);
// 若此时按下鼠标左键
if (MouseMsg::isOnLButtonDown())
{
m_bTarget = true; // 取得焦点标记
_setStatus(SELECTED); // 状态设为 SELECTED
}
// 若节点阻塞鼠标消息,则取得画面焦点
if (m_bBlock) return true;
}
else
{
reset(); // 恢复默认状态
}
}
else
{
// 节点取得焦点时鼠标左键抬起
if (MouseMsg::isOnLButtonUp())
{
// 若左键抬起时鼠标仍在节点内
if (_isMouseIn())
{
m_ClickCallback(); // 执行回调函数
}
reset(); // 恢复默认状态
}
// 若节点阻塞鼠标消息,则取得画面焦点
if (m_bBlock) return true;
}
return false;
}
void MouseNode::_onDraw()
{
// 节点是否显示
if (!m_bDisplay)
{
return;
}
// 节点是否被选中
if (m_eStatus == SELECTED)
{
_onSelected();
}
else
{
// 鼠标是否在节点上
if (m_eStatus == MOUSEIN)
{
_onMouseIn();
}
else
{
_onNormal();
}
}
}
bool MouseNode::_isMouseIn()
{
return isPointIn(MouseMsg::getPos());
}
void MouseNode::_setStatus(Status status)
{
if (m_eStatus != status)
{
// 退出某个状态的回调函数
if (m_eStatus == MOUSEIN)
{
m_OnMouseOutCallback();
}
else if (m_eStatus == SELECTED)
{
m_OnUnselectCallback();
}
// 进入某个状态的回调函数
if (status == MOUSEIN)
{
m_OnMouseInCallback();
}
else if (status == SELECTED)
{
m_OnSelectCallback();
}
m_eStatus = status;
}
}
bool MouseNode::isMouseIn()
{
return m_eStatus == MOUSEIN || m_eStatus == SELECTED;
}
bool MouseNode::isSelected()
{
return m_eStatus == SELECTED;
}
void MouseNode::setClickedCallback(const CLICK_CALLBACK & callback)
{
m_ClickCallback = callback;
}
void MouseNode::setMouseInCallback(const CLICK_CALLBACK & callback)
{
m_OnMouseInCallback = callback;
}
void MouseNode::setMouseOutCallback(const CLICK_CALLBACK & callback)
{
m_OnMouseOutCallback = callback;
}
void MouseNode::setSelectCallback(const CLICK_CALLBACK & callback)
{
m_OnSelectCallback = callback;
}
void MouseNode::setUnselectCallback(const CLICK_CALLBACK & callback)
{
m_OnUnselectCallback = callback;
}
void MouseNode::reset()
{
m_bTarget = false; // 失去焦点标记
_setStatus(NORMAL); // 恢复默认状态
}
void MouseNode::setBlock(bool block)
{
m_bBlock = block;
}