summaryrefslogtreecommitdiffhomepage
path: root/editor/imgui-inspect.cpp
blob: 3b17c10602a5284e80fac77a82106e92ba772d74 (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
#include "app.hpp"
#include "compat/format.hpp"
#include "inspect.hpp"
#include "main/clickable.hpp"
#include "floormat/main.hpp"
#include "src/world.hpp"
#include "src/anim-atlas.hpp"
#include "imgui-raii.hpp"
#include "chunk.inl"
#include "loader/loader.hpp"

namespace floormat {

using namespace floormat::imgui;

void app::draw_inspector()
{
    auto b = push_id("inspector");
    auto& w = M->world();

    constexpr auto max_inspectors = 4; // todo change later to 32
    if (auto size = inspectors.size(); size > max_inspectors)
    {
        auto end = inspectors.begin() + (std::ptrdiff_t)size - max_inspectors;
        inspectors.erase(inspectors.begin(), end);
    }

    const auto dpi = M->dpi_scale();

    for (auto i = inspectors.size()-1; i != -1_uz; i--)
    {
        auto [ch, pos, target] = inspectors[i];
        auto [c, t] = w[{ch, pos}];
        auto s = t.scenery();

        if (!s)
        {
            inspectors.erase(inspectors.begin() + (int)i);
            continue;
        }

        char buf[128];
        snformat(buf, "i-{}-{}x{}-{}x{}"_cf, (int)target, ch.x, ch.y, (int)pos.x, (int)pos.y);

        auto b1 = push_id(buf);
        ImGui::SetNextWindowSize({300*dpi[0], 0});
        auto name = loader.strip_prefix(s.atlas->name());
        snformat(buf, "{} ({}x{} -> {}x{})"_cf, name, ch.x, ch.y, (int)pos.x, (int)pos.y);
        bool is_open = true;
        if (auto b2 = begin_window(buf, &is_open))
            c.with_scenery_bbox_update(s.index(), [&] { return entities::inspect_type(s); });
        else if (!is_open)
            inspectors.erase(inspectors.begin() + (int)i);
    }
}

} // namespace floormat