#pragma once #include #include // A widget floating over the game world view (REQ-UI-WORLD-SIZE). MainWindow places all // of them in one ordered pass -- build button bar, then controls panel, then selection // panel -- and each places itself into the space the earlier ones have not taken. The // order is the priority the requirements state: the bar never moves for anyone // (REQ-UI-BUILD-BAR), the controls panel steps around the bar (REQ-UI-CONTROLS-PANEL), // and keeping clear of both is the selection panel's job (REQ-UI-SELECTION-PANEL). // // A widget never re-places itself, because what it may take depends on the widgets placed // before it. It instead publishes FloatingLayoutInvalidatedEvent whenever its content or // its visibility changed, and the owner re-runs the whole pass. class FloatingPanel { public: virtual ~FloatingPanel() = default; // Sets this widget's own geometry within viewRect, keeping clear of occupiedRects -- // the geometry of every floating widget already placed in this pass, in the same // coordinates. A widget with nothing to show hides itself and takes no space. virtual void placeIn(const QRect& viewRect, const std::vector& occupiedRects) = 0; };