#include "../../TiledAlgorithm.hpp" namespace Layout { class CAlgorithm; } namespace Layout::Tiled { struct SDwindleNodeData; class CDwindleAlgorithm : public ITiledAlgorithm { public: CDwindleAlgorithm() = default; virtual ~CDwindleAlgorithm() = default; virtual void newTarget(SP target); virtual void movedTarget(SP target, std::optional focalPoint = std::nullopt); virtual void removeTarget(SP target); virtual void resizeTarget(const Vector2D& Δ, SP target, eRectCorner corner = CORNER_NONE); virtual void recalculate(); virtual SP getNextCandidate(SP old); virtual std::expected layoutMsg(const std::string_view& sv); virtual std::optional predictSizeForNewTarget(); virtual void swapTargets(SP a, SP b); virtual void moveTargetInDirection(SP t, Math::eDirection dir, bool silent); private: std::vector> m_dwindleNodesData; struct { bool started = false; bool pseudo = false; bool xExtent = false; bool yExtent = false; } m_pseudoDragFlags; std::optional m_overrideFocalPoint; // for onWindowCreatedTiling. void addTarget(SP target, bool newTarget = true); void calculateWorkspace(); SP getNodeFromTarget(SP); SP getNodeFromWindow(PHLWINDOW w); int getNodes(); SP getFirstNode(); SP getClosestNode(const Vector2D&, SP skip = nullptr); SP getMasterNode(); bool toggleSplit(SP); bool swapSplit(SP); void rotateSplit(SP, int angle = 90); bool moveToRoot(SP, bool stable = true); Math::eDirection m_overrideDirection = Math::DIRECTION_DEFAULT; }; };