#pragma once #include "Widget.hpp" #include namespace tp { // FIXME : desperately needs refactor class UpdateManager { friend DebugManager; public: UpdateManager() = default; void scheduleUpdate(Widget* widget, const char* reason); void lockFocus(Widget* widget); void freeFocus(Widget* widget); [[nodiscard]] bool isPendingUpdates() const { return !mTriggeredWidgets.empty(); } void processWidgets(Widget* root, EventHandler& eventHandler); void clean(); void updateTreeToProcess(Widget* root); void handleFocusChanges(Widget* active, Widget* prevActive); Widget* findFocusWidget(Widget* root, EventHandler& events); void findMouseFocusWidget(Widget* iter, Widget** focus, const Vec2F& pointer); static void getWidgetPath(Widget* widget, std::vector& out); void processActiveTree(Widget* iter, EventHandler& events, Vec2F pos); void processFocusItems(EventHandler& events); Widget* getFocusWidget() { return mInFocusWidget; } bool canRemoveWidget(Widget* widget) const; void removeWidget(Widget* widget); private: static void procWidget(Widget* widget, EventHandler& events, bool withEvents = false); private: std::map mTriggeredWidgets; Widget* mInFocusWidget = nullptr; List mFocusLockStack; private: int mDebugWidgetsToProcess = 0; }; }