diff options
Diffstat (limited to 'src/ui/control.cpp')
-rw-r--r-- | src/ui/control.cpp | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/src/ui/control.cpp b/src/ui/control.cpp index 7bd33d84..50628883 100644 --- a/src/ui/control.cpp +++ b/src/ui/control.cpp @@ -1,14 +1,22 @@ #include "cru/ui/control.hpp" #include "cru/platform/native/basic_types.hpp" +#include "cru/platform/native/cursor.hpp" +#include "cru/platform/native/native_window.hpp" +#include "cru/platform/native/ui_applicaition.hpp" #include "cru/ui/base.hpp" #include "cru/ui/event/ui_event.hpp" #include "cru/ui/window.hpp" #include "routed_event_dispatch.hpp" #include <cassert> +#include <memory> namespace cru::ui { +using platform::native::Cursor; +using platform::native::SystemCursor; +using platform::native::UiApplication; + Control::Control() { MouseEnterEvent()->Direct()->AddHandler( [this](event::MouseEventArgs&) { this->is_mouse_over_ = true; }); @@ -69,18 +77,35 @@ bool Control::HasFocus() { return window->GetFocusControl() == this; } -bool Control::CaptureMouse() { - return GetWindow()->CaptureMouseFor(this); -} +bool Control::CaptureMouse() { return GetWindow()->CaptureMouseFor(this); } -bool Control::ReleaseMouse() { - return GetWindow()->CaptureMouseFor(nullptr); -} +bool Control::ReleaseMouse() { return GetWindow()->CaptureMouseFor(nullptr); } bool Control::IsMouseCaptured() { return GetWindow()->GetMouseCaptureControl() == this; } +std::shared_ptr<Cursor> Control::GetCursor() { return cursor_; } + +std::shared_ptr<Cursor> Control::GetInheritedCursor() { + Control* control = this; + while (control != nullptr) { + const auto cursor = control->GetCursor(); + if (cursor != nullptr) return cursor; + control = control->GetParent(); + } + return UiApplication::GetInstance()->GetCursorManager()->GetSystemCursor( + SystemCursor::Arrow); +} + +void Control::SetCursor(std::shared_ptr<Cursor> cursor) { + cursor_ = std::move(cursor); + const auto window = GetWindow(); + if (window != nullptr) { + window->UpdateCursor(); + } +} + void Control::OnParentChanged(Control* old_parent, Control* new_parent) {} void Control::OnAttachToWindow(Window* window) {} |