diff options
Diffstat (limited to 'src/ui/controls')
-rw-r--r-- | src/ui/controls/button.cpp | 84 | ||||
-rw-r--r-- | src/ui/controls/flex_layout.cpp | 5 | ||||
-rw-r--r-- | src/ui/controls/text_block.cpp | 1 |
3 files changed, 67 insertions, 23 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 diff --git a/src/ui/controls/flex_layout.cpp b/src/ui/controls/flex_layout.cpp index 3b70c98c..340710cc 100644 --- a/src/ui/controls/flex_layout.cpp +++ b/src/ui/controls/flex_layout.cpp @@ -5,7 +5,10 @@ namespace cru::ui::controls { using render::FlexLayoutRenderObject; -FlexLayout::FlexLayout() { render_object_.reset(new FlexLayoutRenderObject()); } +FlexLayout::FlexLayout() { + render_object_.reset(new FlexLayoutRenderObject()); + render_object_->SetAttachedControl(this); +} render::RenderObject* FlexLayout::GetRenderObject() const { return render_object_.get(); diff --git a/src/ui/controls/text_block.cpp b/src/ui/controls/text_block.cpp index 55d83acc..71903981 100644 --- a/src/ui/controls/text_block.cpp +++ b/src/ui/controls/text_block.cpp @@ -13,6 +13,7 @@ TextBlock::TextBlock() { new TextRenderObject(predefined_resources->text_block_text_brush, predefined_resources->text_block_font, predefined_resources->text_block_selection_brush)); + render_object_->SetAttachedControl(this); } render::RenderObject* TextBlock::GetRenderObject() const { |