#pragma once

#include <vector>

#include <QRect>

// 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<QRect>& occupiedRects) = 0;
};
