aboutsummaryrefslogtreecommitdiff
path: root/src/ui/controls/button.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/controls/button.cpp')
-rw-r--r--src/ui/controls/button.cpp84
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