#pragma once #include "Widget.hpp" namespace tp { class RootWidget { // path from leaf to root of widgets that need to be updated struct ActivePath { struct ActiveNode { Widget* widget = nullptr; Vec2F globalPos; }; Buffer path; }; public: RootWidget() = default; void setRootWidget(Widget* widget); void processFrame(EventHandler* events, const RectF& screenArea); void drawFrame(Canvas& canvas); [[nodiscard]] bool needsUpdate() const; static void setWidgetArea(Widget& widget, const RectF& rect); private: void updateActivePaths(Buffer* activePaths, const Vec2F& pointer); void drawRecursion(Canvas& canvas, Widget* active, const Vec2F& pos); void processPaths(const Buffer& path, EventHandler& events); void clearProcessedFlag(const Buffer& paths); private: Widget* mRoot = nullptr; Buffer mActiveWidgets; Buffer mActivePaths[2]; // current and prev bool mFlipFlop = false; bool mNeedUpdate = false; }; }