aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui/controls
diff options
context:
space:
mode:
author杨宇千 <crupest@outlook.com>2019-08-11 01:09:49 +0800
committer杨宇千 <crupest@outlook.com>2019-08-11 01:09:49 +0800
commit0e35b2c022599bca2df61488945f07e4d6b4eb35 (patch)
tree71daef6f9725a250b9fcaf97fdecc9bdf46bd6e3 /include/cru/ui/controls
parent9eed31954c14f2d60c906adb5b49b58fbee4ff7f (diff)
downloadcru-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.hpp79
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