diff options
author | 杨宇千 <crupest@outlook.com> | 2019-08-11 01:09:49 +0800 |
---|---|---|
committer | 杨宇千 <crupest@outlook.com> | 2019-08-11 01:09:49 +0800 |
commit | 0e35b2c022599bca2df61488945f07e4d6b4eb35 (patch) | |
tree | 71daef6f9725a250b9fcaf97fdecc9bdf46bd6e3 /include/cru/ui/controls | |
parent | 9eed31954c14f2d60c906adb5b49b58fbee4ff7f (diff) | |
download | cru-0e35b2c022599bca2df61488945f07e4d6b4eb35.tar.gz cru-0e35b2c022599bca2df61488945f07e4d6b4eb35.tar.bz2 cru-0e35b2c022599bca2df61488945f07e4d6b4eb35.zip |
...
Diffstat (limited to 'include/cru/ui/controls')
-rw-r--r-- | include/cru/ui/controls/button.hpp | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/include/cru/ui/controls/button.hpp b/include/cru/ui/controls/button.hpp index 348416c5..648bb6bc 100644 --- a/include/cru/ui/controls/button.hpp +++ b/include/cru/ui/controls/button.hpp @@ -1,6 +1,11 @@ #pragma once #include "../content_control.hpp" +#include "cru/platform/graph/brush.hpp" +#include "cru/platform/native/basic_types.hpp" +#include "cru/ui/base.hpp" +#include "cru/ui/render/border_render_object.hpp" + #include <memory> namespace cru::ui::render { @@ -8,6 +13,24 @@ class BorderRenderObject; } namespace cru::ui::controls { +struct ButtonBorderStyle { + // corresponds to ButtonState::Normal + render::BorderStyle normal; + // corresponds to ButtonState::Hover + render::BorderStyle hover; + // corresponds to ButtonState::Press + render::BorderStyle press; +}; + +enum class ButtonState { + // mouse is not in it + Normal, + // mouse is in it and not pressed + Hover, + // mouse is pressed in it (click begins) + Press +}; + class Button : public ContentControl { public: static constexpr auto control_type = L"Button"; @@ -30,10 +53,66 @@ class Button : public ContentControl { render::RenderObject* GetRenderObject() const override; + public: + render::BorderStyle GetNormalBorderStyle() const { + return border_style_.normal; + } + void SetNormalBorderStyle(render::BorderStyle newStyle) { + border_style_.normal = std::move(newStyle); + } + + render::BorderStyle GetHoverBorderStyle() const { + return border_style_.hover; + } + void SetHoverBorderStyle(render::BorderStyle newStyle) { + border_style_.hover = std::move(newStyle); + } + + render::BorderStyle GetPressBorderStyle() const { + return border_style_.press; + } + void SetPressBorderStyle(render::BorderStyle newStyle) { + border_style_.press = std::move(newStyle); + } + + ButtonBorderStyle GetBorderStyle() const { return border_style_; } + void SetBorderStyle(ButtonBorderStyle newStyle) { + border_style_ = std::move(newStyle); + } + + ButtonState GetState() const { return state_; } + + // Get the trigger mouse button(s). Return value might be a union of Left, + // Middle and Right. + MouseButton GetTriggerButton() const { return trigger_button_; } + // Set the trigger mouse button(s). You can set multiple buttons by passing a + // union of Left, Middle and Right. If you disable a button when user is + // pressing the same one, click will be stopped. + // Default is only Left. + void SetTriggerButton(MouseButton newTrigger); + protected: void OnChildChanged(Control* old_child, Control* new_child) override; + void OnMouseClickBegin(platform::native::MouseButton button) override; + void OnMouseClickEnd(platform::native::MouseButton button) override; + + virtual void OnStateChange(ButtonState oldState, ButtonState newState); + + private: + void SetState(ButtonState newState) { + const auto oldState = state_; + state_ = newState; + OnStateChange(oldState, newState); + } + private: std::shared_ptr<render::BorderRenderObject> render_object_{}; + + ButtonState state_ = ButtonState::Normal; + + MouseButton trigger_button_ = MouseButton::Left; + + ButtonBorderStyle border_style_; }; } // namespace cru::ui::controls |