[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 namespace kiwano
{ {
Button::Button(const Callback& click) ButtonBase::ButtonBase()
: 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()
: status_(Status::Normal) : status_(Status::Normal)
{ {
SetName("__KGE_BUTTON__"); SetName("__KGE_BUTTON__");
} }
Button::~Button() ButtonBase::~ButtonBase()
{ {
} }
void Button::SetStatus(Status status) void ButtonBase::SetStatus(Status status)
{ {
if (status_ != status) if (status_ != status)
{ {
@ -58,10 +43,8 @@ void Button::SetStatus(Status status)
if (status == Status::Normal) if (status == Status::Normal)
{ {
OnEvent(Event::MouseOut);
Application::GetInstance().GetWindow()->SetCursor(CursorType::Arrow); Application::GetInstance().GetWindow()->SetCursor(CursorType::Arrow);
if (mouse_out_callback_)
mouse_out_callback_(this, GetBoundActor());
} }
else if (status == Status::Hover) else if (status == Status::Hover)
{ {
@ -69,21 +52,19 @@ void Button::SetStatus(Status status)
if (old_status != Status::Pressed) if (old_status != Status::Pressed)
{ {
if (mouse_over_callback_) OnEvent(Event::MouseOver);
mouse_over_callback_(this, GetBoundActor());
} }
} }
else if (status == Status::Pressed) else if (status == Status::Pressed)
{ {
if (pressed_callback_) OnEvent(Event::Pressed);
pressed_callback_(this, GetBoundActor());
} }
status_ = status; status_ = status;
} }
} }
void Button::InitComponent(Actor* actor) void ButtonBase::InitComponent(Actor* actor)
{ {
Component::InitComponent(actor); Component::InitComponent(actor);
if (actor) if (actor)
@ -92,12 +73,12 @@ void Button::InitComponent(Actor* actor)
} }
} }
void Button::DestroyComponent() void ButtonBase::DestroyComponent()
{ {
Component::DestroyComponent(); Component::DestroyComponent();
} }
void Button::HandleEvent(Event* evt) void ButtonBase::HandleEvent(kiwano::Event* evt)
{ {
if (evt->IsType<MouseHoverEvent>()) if (evt->IsType<MouseHoverEvent>())
{ {
@ -117,8 +98,22 @@ void Button::HandleEvent(Event* evt)
} }
else if (evt->IsType<MouseClickEvent>()) else if (evt->IsType<MouseClickEvent>())
{ {
if (click_callback_) OnEvent(Event::Click);
click_callback_(this, GetBoundActor()); }
}
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 * \~chinese
* @brief * @brief
*/ */
class KGE_API Button : public Component class KGE_API ButtonBase : public Component
{ {
public: public:
/// \~chinese /// \~chinese
/// @brief 按钮回调函数 /// @brief 按钮事件
using Callback = Function<void(Button* /* self */, Actor* /* target */)>; 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 /// \~chinese
/// @brief 按钮状态 /// @brief 按钮状态
enum class Status enum class Status
{ {
Normal, ///< 普通 Normal, ///< 普通
Hover, ///< 鼠标在按钮内 Hover, ///< 鼠标在按钮内
Pressed ///< 被按下 Pressed, ///< 被按下
}; };
ButtonBase();
virtual ~ButtonBase();
/// \~chinese
/// @brief 按钮事件发生时
virtual void OnEvent(Event evt) = 0;
/// \~chinese /// \~chinese
/// @brief 获取按钮状态 /// @brief 获取按钮状态
Status GetStatus() const; Status GetStatus() const;
protected:
/// \~chinese /// \~chinese
/// @brief 设置按钮状态 /// @brief 设置按钮状态
void SetStatus(Status status); void SetStatus(Status status);
@ -103,39 +84,51 @@ protected:
/// \~chinese /// \~chinese
/// @brief 处理角色事件 /// @brief 处理角色事件
void HandleEvent(Event* evt) override; void HandleEvent(kiwano::Event* evt) override;
private: private:
Status status_; Status status_;
Callback click_callback_; };
Callback pressed_callback_;
Callback mouse_over_callback_; /**
Callback mouse_out_callback_; * \~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) inline ButtonBase::Status ButtonBase::GetStatus() const
{
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
{ {
return status_; return status_;
} }