From 04367ead7027e9f0359d24681f5cc0dd916b934d Mon Sep 17 00:00:00 2001 From: 杨宇千 Date: Mon, 12 Aug 2019 01:03:02 +0800 Subject: ... --- src/ui/controls/button.cpp | 84 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 22 deletions(-) (limited to 'src/ui/controls/button.cpp') diff --git a/src/ui/controls/button.cpp b/src/ui/controls/button.cpp index 618371fb..42a08e33 100644 --- a/src/ui/controls/button.cpp +++ b/src/ui/controls/button.cpp @@ -1,17 +1,60 @@ #include "cru/ui/controls/button.hpp" +#include +#include "cru/platform/graph/brush.hpp" +#include "cru/platform/graph/graph_factory.hpp" +#include "cru/platform/native/native_window.hpp" #include "cru/ui/render/border_render_object.hpp" #include "cru/ui/ui_manager.hpp" +#include "cru/ui/window.hpp" namespace cru::ui::controls { -Button::Button() { - const auto predefined_resource = - UiManager::GetInstance()->GetPredefineResources(); - render_object_.reset(new render::BorderRenderObject( - predefined_resource->button_normal_border_brush)); +Button::Button() : click_detector_(this) { + // const auto predefined_resource = + // UiManager::GetInstance()->GetPredefineResources(); + + const auto factory = platform::graph::GraphFactory::GetInstance(); + border_style_.normal.brush = std::shared_ptr( + factory->CreateSolidColorBrush(Color::FromHex(0x00bfff))); + border_style_.hover.brush = std::shared_ptr( + factory->CreateSolidColorBrush(Color::FromHex(0x47d1ff))); + border_style_.press.brush = std::shared_ptr( + factory->CreateSolidColorBrush(Color::FromHex(0x91e4ff))); + + border_style_.normal.thickness = border_style_.hover.thickness = + border_style_.press.thickness = Thickness{3}; + + border_style_.normal.corner_radius = border_style_.hover.corner_radius = + border_style_.press.corner_radius = render::CornerRadius{Point{10, 5}}; + + render_object_.reset( + new render::BorderRenderObject(border_style_.normal.brush)); + render_object_->SetAttachedControl(this); render_object_->SetEnabled(true); - render_object_->SetBorderWidth(Thickness{3}); - render_object_->SetCornerRadius(render::CornerRadius{Point{10, 5}}); + render_object_->SetStyle(border_style_.normal); + + MouseEnterEvent()->Direct()->AddHandler([this](event::MouseEventArgs& args) { + if (click_detector_.GetPressingButton() & trigger_button_) { + SetState(ButtonState::Press); + } else { + SetState(ButtonState::Hover); + } + }); + + MouseLeaveEvent()->Direct()->AddHandler( + [this](event::MouseEventArgs& args) { SetState(ButtonState::Normal); }); + + click_detector_.ClickBeginEvent()->AddHandler([this](MouseButton button) { + if (button & trigger_button_) { + SetState(ButtonState::Press); + } + }); + + click_detector_.ClickEndEvent()->AddHandler([this](MouseButton button) { + if (button & trigger_button_) { + SetState(ButtonState::Normal); + } + }); } render::RenderObject* Button::GetRenderObject() const { @@ -24,21 +67,18 @@ void Button::OnChildChanged(Control* old_child, Control* new_child) { render_object_->AddChild(new_child->GetRenderObject(), 0); } -void Button::OnMouseClickBegin(platform::native::MouseButton button) { - if (button & trigger_button_) { - SetState(ButtonState::Press); - //TODO! - } -} - -void Button::OnMouseClickEnd(platform::native::MouseButton button) { - if (button & trigger_button_) { - SetState(ButtonState::Normal); - //TODO! - } -} - void Button::OnStateChange(ButtonState oldState, ButtonState newState) { - + switch (newState) { + case ButtonState::Normal: + render_object_->SetStyle(border_style_.normal); + break; + case ButtonState::Hover: + render_object_->SetStyle(border_style_.hover); + break; + case ButtonState::Press: + render_object_->SetStyle(border_style_.press); + break; + } + GetWindow()->GetNativeWindow()->Repaint(); } } // namespace cru::ui::controls -- cgit v1.2.3