summaryrefslogtreecommitdiff
path: root/src/config/lua/layout/LuaLayoutProvider.hpp
blob: 4e223670c5dca25ce076f522f8a9e4534dd6f6ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#pragma once

#include "../../../helpers/memory/Memory.hpp"
#include "../../../helpers/math/Math.hpp"
#include "../../../layout/algorithm/TiledAlgorithm.hpp"

#include <optional>
#include <string>
#include <string_view>
#include <vector>

extern "C" {
#include <lua.h>
#include <lauxlib.h>
}

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<SLuaLayoutProvider> provider);
        virtual ~CLuaTiledAlgorithm() = default;

        virtual void                       newTarget(SP<Layout::ITarget> target);
        virtual void                       movedTarget(SP<Layout::ITarget> target, std::optional<Vector2D> focalPoint = std::nullopt);
        virtual void                       removeTarget(SP<Layout::ITarget> target);
        virtual void                       resizeTarget(const Vector2D& Δ, SP<Layout::ITarget> target, Layout::eRectCorner corner = Layout::CORNER_NONE);
        virtual void                       recalculate();
        virtual void                       swapTargets(SP<Layout::ITarget> a, SP<Layout::ITarget> b);
        virtual void                       moveTargetInDirection(SP<Layout::ITarget> t, Math::eDirection dir, bool silent);
        virtual Config::ErrorResult        layoutMsg(const std::string_view& sv);
        virtual std::optional<Vector2D>    predictSizeForNewTarget();
        virtual SP<Layout::ITarget>        getNextCandidate(SP<Layout::ITarget> old);
        virtual std::optional<std::string> layoutName() const;

      private:
        SP<SLuaLayoutProvider>           m_provider;
        std::vector<WP<Layout::ITarget>> m_targets;

        std::vector<SP<Layout::ITarget>> liveTargets();
        bool                             callRecalculate(const std::vector<SP<Layout::ITarget>>& targets);
        void                             applyDefaultGrid(const std::vector<SP<Layout::ITarget>>& targets);
        void                             reportError(const std::string& message);
    };

}