aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui/control.hpp
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2019-04-04 17:12:25 +0800
committercrupest <crupest@outlook.com>2019-04-04 17:12:25 +0800
commita410e2048db6f5ef6fb50e401a59b4b98b979050 (patch)
tree500680c63b074e8c3eefd756fd6a1d0f41840c1a /include/cru/ui/control.hpp
parentfcaf471275a67d718887430ee63a53890915c4c7 (diff)
downloadcru-a410e2048db6f5ef6fb50e401a59b4b98b979050.tar.gz
cru-a410e2048db6f5ef6fb50e401a59b4b98b979050.tar.bz2
cru-a410e2048db6f5ef6fb50e401a59b4b98b979050.zip
...
Diffstat (limited to 'include/cru/ui/control.hpp')
-rw-r--r--include/cru/ui/control.hpp137
1 files changed, 137 insertions, 0 deletions
diff --git a/include/cru/ui/control.hpp b/include/cru/ui/control.hpp
new file mode 100644
index 00000000..684af2f0
--- /dev/null
+++ b/include/cru/ui/control.hpp
@@ -0,0 +1,137 @@
+#pragma once
+#include "cru/common/base.hpp"
+
+#include "cru/platform/basic_types.hpp"
+#include "event/ui_event.hpp"
+
+#include <string_view>
+#include <vector>
+
+namespace cru::ui {
+class Window;
+namespace render {
+class RenderObject;
+} // namespace render
+
+class Control : public Object {
+ friend class Window;
+
+ protected:
+ Control() = default;
+
+ public:
+ Control(const Control& other) = delete;
+ Control(Control&& other) = delete;
+ Control& operator=(const Control& other) = delete;
+ Control& operator=(Control&& other) = delete;
+ ~Control() override = default;
+
+ public:
+ virtual std::wstring_view GetControlType() const = 0;
+
+ //*************** region: tree ***************
+ public:
+ // Get the window if attached, otherwise, return nullptr.
+ Window* GetWindow() const { return window_; }
+
+ Control* GetParent() const { return parent_; }
+
+ virtual const std::vector<Control*>& GetChildren() const = 0;
+
+ // Traverse the tree rooted the control including itself.
+ void TraverseDescendants(const std::function<void(Control*)>& predicate);
+
+ void _SetParent(Control* parent);
+ void _SetDescendantWindow(Window* window);
+
+ private:
+ static void _TraverseDescendants(
+ Control* control, const std::function<void(Control*)>& predicate);
+
+ public:
+ virtual render::RenderObject* GetRenderObject() const = 0;
+
+ //*************** region: focus ***************
+ public:
+ bool RequestFocus();
+
+ bool HasFocus();
+
+ //*************** region: events ***************
+ public:
+ // Raised when mouse enter the control.
+ event::RoutedEvent<event::MouseEventArgs>* MouseEnterEvent() {
+ return &mouse_enter_event_;
+ }
+ // Raised when mouse is leave the control.
+ event::RoutedEvent<event::MouseEventArgs>* MouseLeaveEvent() {
+ return &mouse_leave_event_;
+ }
+ // Raised when mouse is move in the control.
+ event::RoutedEvent<event::MouseEventArgs>* MouseMoveEvent() {
+ return &mouse_move_event_;
+ }
+ // Raised when a mouse button is pressed in the control.
+ event::RoutedEvent<event::MouseButtonEventArgs>* MouseDownEvent() {
+ return &mouse_down_event_;
+ }
+ // Raised when a mouse button is released in the control.
+ event::RoutedEvent<event::MouseButtonEventArgs>* MouseUpEvent() {
+ return &mouse_up_event_;
+ }
+ // Raised when a mouse button is pressed in the control and released in the
+ // control with mouse not leaving it between two operations.
+ event::RoutedEvent<event::MouseButtonEventArgs>* MouseClickEvent() {
+ return &mouse_click_event_;
+ }
+ event::RoutedEvent<event::MouseWheelEventArgs>* MouseWheelEvent() {
+ return &mouse_wheel_event_;
+ }
+ event::RoutedEvent<event::KeyEventArgs>* KeyDownEvent() {
+ return &key_down_event_;
+ }
+ event::RoutedEvent<event::KeyEventArgs>* KeyUpEvent() {
+ return &key_up_event_;
+ }
+ // event::RoutedEvent<event::CharEventArgs>* CharEvent() {
+ // return &char_event_;
+ // }
+ event::RoutedEvent<event::FocusChangeEventArgs>* GainFocusEvent() {
+ return &gain_focus_event_;
+ }
+ event::RoutedEvent<event::FocusChangeEventArgs>* LoseFocusEvent() {
+ return &lose_focus_event_;
+ }
+
+ private:
+ event::RoutedEvent<event::MouseEventArgs> mouse_enter_event_;
+ event::RoutedEvent<event::MouseEventArgs> mouse_leave_event_;
+ event::RoutedEvent<event::MouseEventArgs> mouse_move_event_;
+ event::RoutedEvent<event::MouseButtonEventArgs> mouse_down_event_;
+ event::RoutedEvent<event::MouseButtonEventArgs> mouse_up_event_;
+ event::RoutedEvent<event::MouseButtonEventArgs> mouse_click_event_;
+ event::RoutedEvent<event::MouseWheelEventArgs> mouse_wheel_event_;
+
+ event::RoutedEvent<event::KeyEventArgs> key_down_event_;
+ event::RoutedEvent<event::KeyEventArgs> key_up_event_;
+ // event::RoutedEvent<event::CharEventArgs> char_event_;
+
+ event::RoutedEvent<event::FocusChangeEventArgs> gain_focus_event_;
+ event::RoutedEvent<event::FocusChangeEventArgs> lose_focus_event_;
+
+ //*************** region: tree ***************
+ protected:
+ virtual void OnParentChanged(Control* old_parent, Control* new_parent);
+ virtual void OnAttachToWindow(Window* window);
+ virtual void OnDetachToWindow(Window* window);
+
+ //*************** region: additional mouse event ***************
+ protected:
+ virtual void OnMouseClickBegin(platform::MouseButton button);
+ virtual void OnMouseClickEnd(platform::MouseButton button);
+
+ private:
+ Window* window_ = nullptr;
+ Control* parent_ = nullptr;
+};
+} // namespace cru::ui