#pragma once #include "../../helpers/math/Math.hpp" #include "../../helpers/math/Direction.hpp" #include "../../helpers/memory/Memory.hpp" #include "../LayoutManager.hpp" #include namespace Layout { class ITarget; class CAlgorithm; class IModeAlgorithm { public: virtual ~IModeAlgorithm() = default; // a completely new target virtual void newTarget(SP target) = 0; // a target moved into the algorithm (from another) virtual void movedTarget(SP target, std::optional focalPoint = std::nullopt) = 0; // a target removed virtual void removeTarget(SP target) = 0; // a target is being resized by a delta. Corner none likely means not interactive virtual void resizeTarget(const Vector2D& Δ, SP target, eRectCorner corner = CORNER_NONE) = 0; // recalculate layout virtual void recalculate() = 0; // swap targets virtual void swapTargets(SP a, SP b) = 0; // move a target in a given direction virtual void moveTargetInDirection(SP t, Math::eDirection dir, bool silent) = 0; // optional: handle layout messages virtual std::expected layoutMsg(const std::string_view& sv); // optional: predict new window's size virtual std::optional predictSizeForNewTarget(); protected: IModeAlgorithm() = default; WP m_parent; friend class Layout::CAlgorithm; }; }