[deploy] update button component

This commit is contained in:
Nomango 2020-09-30 18:22:18 +08:00
parent 3693ff7604
commit 321ea81c89
2 changed files with 83 additions and 95 deletions

View File

@ -25,32 +25,17 @@
namespace kiwano
{
Button::Button(const Callback& click)
: Button(click, nullptr, nullptr, nullptr)
{
}
Button::Button(const Callback& click, const Callback& pressed, const Callback& mouse_over, const Callback& mouse_out)
: status_(Status::Normal)
, click_callback_(click)
, pressed_callback_(pressed)
, mouse_over_callback_(mouse_over)
, mouse_out_callback_(mouse_out)
{
SetName("__KGE_BUTTON__");
}
Button::Button()
ButtonBase::ButtonBase()
: status_(Status::Normal)
{
SetName("__KGE_BUTTON__");
}
Button::~Button()
ButtonBase::~ButtonBase()
{
}
void Button::SetStatus(Status status)
void ButtonBase::SetStatus(Status status)
{
if (status_ != status)
{
@ -58,10 +43,8 @@ void Button::SetStatus(Status status)
if (status == Status::Normal)
{
OnEvent(Event::MouseOut);
Application::GetInstance().GetWindow()->SetCursor(CursorType::Arrow);
if (mouse_out_callback_)
mouse_out_callback_(this, GetBoundActor());
}
else if (status == Status::Hover)
{
@ -69,21 +52,19 @@ void Button::SetStatus(Status status)
if (old_status != Status::Pressed)
{
if (mouse_over_callback_)
mouse_over_callback_(this, GetBoundActor());
OnEvent(Event::MouseOver);
}
}
else if (status == Status::Pressed)
{
if (pressed_callback_)
pressed_callback_(this, GetBoundActor());
OnEvent(Event::Pressed);
}
status_ = status;
}
}
void Button::InitComponent(Actor* actor)
void ButtonBase::InitComponent(Actor* actor)
{
Component::InitComponent(actor);
if (actor)
@ -92,12 +73,12 @@ void Button::InitComponent(Actor* actor)
}
}
void Button::DestroyComponent()
void ButtonBase::DestroyComponent()
{
Component::DestroyComponent();
}
void Button::HandleEvent(Event* evt)
void ButtonBase::HandleEvent(kiwano::Event* evt)
{
if (evt->IsType<MouseHoverEvent>())
{
@ -117,8 +98,22 @@ void Button::HandleEvent(Event* evt)
}
else if (evt->IsType<MouseClickEvent>())
{
if (click_callback_)
click_callback_(this, GetBoundActor());
OnEvent(Event::Click);
}
}
Button::Button() {}
Button::Button(const Callback& cb)
{
SetCallback(cb);
}
void Button::OnEvent(Event evt)
{
if (cb_)
{
cb_(this, evt);
}
}

View File

@ -33,62 +33,43 @@ KGE_DECLARE_SMART_PTR(Button);
/**
* \~chinese
* @brief
* @brief
*/
class KGE_API Button : public Component
class KGE_API ButtonBase : public Component
{
public:
/// \~chinese
/// @brief 按钮回调函数
using Callback = Function<void(Button* /* self */, Actor* /* target */)>;
/// @brief 按钮事件
enum class Event
{
Click, ///< 被点击
Pressed, ///< 被按下
MouseOver, ///< 鼠标浮于按钮上
MouseOut, ///< 鼠标从按钮上移出
};
/// \~chinese
/// @brief 创建按钮
/// @param click 按钮点击回调函数
Button(const Callback& click);
/// \~chinese
/// @brief 创建按钮
/// @param click 按钮点击回调函数
/// @param pressed 按钮按下回调函数
/// @param mouse_over 按钮移入回调函数
/// @param mouse_out 按钮移出回调函数
Button(const Callback& click, const Callback& pressed, const Callback& mouse_over, const Callback& mouse_out);
Button();
virtual ~Button();
/// \~chinese
/// @brief 设置按钮点击后的回调函数
void SetClickCallback(const Callback& func);
/// \~chinese
/// @brief 设置按钮被按下时的回调函数
void SetPressedCallback(const Callback& func);
/// \~chinese
/// @brief 设置鼠标移入按钮时的回调函数
void SetMouseOverCallback(const Callback& func);
/// \~chinese
/// @brief 设置鼠标移出按钮时的回调函数
void SetMouseOutCallback(const Callback& func);
protected:
/// \~chinese
/// @brief 按钮状态
enum class Status
{
Normal, ///< 普通
Hover, ///< 鼠标在按钮内
Pressed ///< 被按下
Normal, ///< 普通
Hover, ///< 鼠标在按钮内
Pressed, ///< 被按下
};
ButtonBase();
virtual ~ButtonBase();
/// \~chinese
/// @brief 按钮事件发生时
virtual void OnEvent(Event evt) = 0;
/// \~chinese
/// @brief 获取按钮状态
Status GetStatus() const;
protected:
/// \~chinese
/// @brief 设置按钮状态
void SetStatus(Status status);
@ -103,39 +84,51 @@ protected:
/// \~chinese
/// @brief 处理角色事件
void HandleEvent(Event* evt) override;
void HandleEvent(kiwano::Event* evt) override;
private:
Status status_;
Callback click_callback_;
Callback pressed_callback_;
Callback mouse_over_callback_;
Callback mouse_out_callback_;
Status status_;
};
/**
* \~chinese
* @brief
*/
class KGE_API Button : public ButtonBase
{
public:
/// \~chinese
/// @brief 按钮回调函数
using Callback = Function<void(Button* /* self */, Event /* evt */)>;
Button();
/// \~chinese
/// @brief 创建按钮
/// @param cb 按钮回调函数
Button(const Callback& cb);
/// \~chinese
/// @brief 设置按钮回调函数
/// @param cb 按钮回调函数
void SetCallback(const Callback& cb);
/// \~chinese
/// @brief 按钮状态变化时
void OnEvent(Event evt) override;
private:
Callback cb_;
};
/** @} */
inline void Button::SetClickCallback(const Callback& func)
inline void Button::SetCallback(const Callback& cb)
{
click_callback_ = func;
cb_ = cb;
}
inline void Button::SetPressedCallback(const Callback& func)
{
pressed_callback_ = func;
}
inline void Button::SetMouseOverCallback(const Callback& func)
{
mouse_over_callback_ = func;
}
inline void Button::SetMouseOutCallback(const Callback& func)
{
mouse_out_callback_ = func;
}
inline Button::Status Button::GetStatus() const
inline ButtonBase::Status ButtonBase::GetStatus() const
{
return status_;
}