#pragma once #include "../../../helpers/memory/Memory.hpp" #include "../../../helpers/math/Math.hpp" #include "../../../layout/algorithm/TiledAlgorithm.hpp" #include #include #include #include extern "C" { #include #include } namespace Config::Lua { class CConfigManager; } namespace Config::Lua::Layouts { struct SLuaLayoutProvider { CConfigManager* manager = nullptr; lua_State* state = nullptr; std::string name; int tableRef = LUA_NOREF; bool active = true; bool didError = false; }; class CLuaTiledAlgorithm : public Layout::ITiledAlgorithm { public: explicit CLuaTiledAlgorithm(SP provider); virtual ~CLuaTiledAlgorithm() = 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, Layout::eRectCorner corner = Layout::CORNER_NONE); virtual void recalculate(Layout::eRecalculateReason reason = Layout::RECALCULATE_REASON_UNKNOWN); virtual void swapTargets(SP a, SP b); virtual void moveTargetInDirection(SP t, Math::eDirection dir, bool silent); virtual Config::ErrorResult layoutMsg(const std::string_view& sv); virtual std::optional predictSizeForNewTarget(); virtual SP getNextCandidate(SP old); virtual std::optional layoutName() const; private: SP m_provider; std::vector> m_targets; std::vector> liveTargets(); bool callRecalculate(const std::vector>& targets); void applyDefaultGrid(const std::vector>& targets); void reportError(const std::string& message); }; }