#include "../../TiledAlgorithm.hpp" namespace Layout { class CAlgorithm; } namespace Layout::Tiled { struct SDwindleNodeData { WP pParent; bool isNode = false; WP pTarget; std::array, 2> children = {}; WP self; bool splitTop = false; // for preserve_split CBox box = {0}; float splitRatio = 1.f; bool valid = true; bool ignoreFullscreenChecks = false; // For list lookup bool operator==(const SDwindleNodeData& rhs) const { return pTarget.lock() == rhs.pTarget.lock() && box == rhs.box && pParent == rhs.pParent && children[0] == rhs.children[0] && children[1] == rhs.children[1]; } void recalcSizePosRecursive(bool force = false, bool horizontalOverride = false, bool verticalOverride = false); }; 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(eRecalculateReason reason = RECALCULATE_REASON_UNKNOWN); virtual SP getNextCandidate(SP old); virtual Config::ErrorResult 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); SP getNodeFromWindow(PHLWINDOW w); 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); void calculateWorkspace(); SP getNodeFromTarget(SP); 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; }; };