diff options
author | 杨宇千 <crupest@outlook.com> | 2019-08-12 01:03:02 +0800 |
---|---|---|
committer | 杨宇千 <crupest@outlook.com> | 2019-08-12 01:03:02 +0800 |
commit | 04367ead7027e9f0359d24681f5cc0dd916b934d (patch) | |
tree | f2a277ac9d53863c9f4efc8099450138974bdb4d /src/ui/controls/button.cpp | |
parent | 86e776eaebf7c45a269001ca7da0dfafba069d0a (diff) | |
download | cru-04367ead7027e9f0359d24681f5cc0dd916b934d.tar.gz cru-04367ead7027e9f0359d24681f5cc0dd916b934d.tar.bz2 cru-04367ead7027e9f0359d24681f5cc0dd916b934d.zip |
...
Diffstat (limited to 'src/ui/controls/button.cpp')
-rw-r--r-- | src/ui/controls/button.cpp | 84 |
1 files changed, 62 insertions, 22 deletions
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 <memory> +#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<platform::graph::Brush>( + factory->CreateSolidColorBrush(Color::FromHex(0x00bfff))); + border_style_.hover.brush = std::shared_ptr<platform::graph::Brush>( + factory->CreateSolidColorBrush(Color::FromHex(0x47d1ff))); + border_style_.press.brush = std::shared_ptr<platform::graph::Brush>( + 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 |