#pragma once #include "../../Widgets/Widget.h" #include "../../Input/PointerStream.h" #include namespace UI { class InputRouter { private: struct WidgetReference { Widget* pointer = nullptr; std::weak_ptr lifetime; }; WidgetReference rootWidget; WidgetReference hoveredWidget; WidgetReference activeWidget; WidgetReference focusedWidget; bool ancestorConsumedPointer = false; // needs multitouch/pointerstream support static bool IsAlive(const WidgetReference& reference); static void SetReference(WidgetReference& reference, Widget* widget); static void ClearReference(WidgetReference& reference); public: InputRouter(); explicit InputRouter(Widget* root); void SetRootWidget(Widget* root); Widget* GetRootWidget() const; Widget* GetHoveredWidget() const; Widget* GetActiveWidget() const; Widget* GetFocusedWidget() const; void SetFocusedWidget(Widget* widget); void ProcessPointerHover(Point scaledPoint); bool ProcessPointerStream(const std::shared_ptr& stream); }; }