Unravel Engine C++ Reference
Loading...
Searching...
No Matches
layout_manager.cpp
Go to the documentation of this file.
1#include "layout_manager.h"
2
3#include <imgui/imgui.h>
4#include <imgui/imgui_internal.h>
5
6#include <logging/logging.h>
7
8#include <fstream>
9#include <sstream>
10
11namespace unravel
12{
13
14void layout_manager::init(const fs::path& layouts_directory)
15{
16 layouts_directory_ = layouts_directory;
17
18 fs::error_code err;
19 fs::create_directories(layouts_directory_, err);
20
21 load_presets_from_disk();
22}
23
24void layout_manager::save_preset(const std::string& name)
25{
26 size_t ini_size = 0;
27 const char* ini_data = ImGui::SaveIniSettingsToMemory(&ini_size);
28 if(!ini_data || ini_size == 0)
29 {
30 APPLOG_WARNING("Failed to capture current layout for preset '{}'", name);
31 return;
32 }
33
34 std::string data(ini_data, ini_size);
35 presets_[name] = data;
36 save_preset_to_disk(name, data);
37
38 APPLOG_INFO("Layout preset '{}' saved", name);
39}
40
41void layout_manager::load_preset(const std::string& name)
42{
43 auto it = presets_.find(name);
44 if(it == presets_.end())
45 {
46 APPLOG_WARNING("Layout preset '{}' not found", name);
47 return;
48 }
49
50 ImGui::ClearIniSettings();
51 ImGui::LoadIniSettingsFromMemory(it->second.c_str(), it->second.size());
52 ImGui::MarkIniSettingsDirty();
53
54 APPLOG_INFO("Layout preset '{}' loaded", name);
55}
56
57void layout_manager::delete_preset(const std::string& name)
58{
59 auto it = presets_.find(name);
60 if(it == presets_.end())
61 {
62 return;
63 }
64
65 presets_.erase(it);
66 delete_preset_from_disk(name);
67
68 APPLOG_INFO("Layout preset '{}' deleted", name);
69}
70
72{
73 ImGui::ClearIniSettings();
74
75 // Force ImGui to mark settings as dirty so it saves the fresh state.
76 // Don't reset SettingsLoaded - that would reload the old ini from disk.
77 ImGui::MarkIniSettingsDirty();
78
79 APPLOG_INFO("Layout reset to default");
80}
81
82auto layout_manager::get_preset_names() const -> std::vector<std::string>
83{
84 std::vector<std::string> names;
85 names.reserve(presets_.size());
86 for(const auto& [name, data] : presets_)
87 {
88 names.push_back(name);
89 }
90 return names;
91}
92
93auto layout_manager::has_preset(const std::string& name) const -> bool
94{
95 return presets_.contains(name);
96}
97
98auto layout_manager::get_layouts_directory() const -> const fs::path&
99{
100 return layouts_directory_;
101}
102
103void layout_manager::load_presets_from_disk()
104{
105 fs::error_code err;
106 if(!fs::exists(layouts_directory_, err))
107 {
108 return;
109 }
110
111 for(const auto& entry : fs::directory_iterator(layouts_directory_, err))
112 {
113 if(!entry.is_regular_file())
114 {
115 continue;
116 }
117
118 const auto& path = entry.path();
119 if(path.extension() != ".ini")
120 {
121 continue;
122 }
123
124 std::ifstream file(path.string(), std::ios::binary);
125 if(!file.is_open())
126 {
127 continue;
128 }
129
130 std::ostringstream ss;
131 ss << file.rdbuf();
132 std::string data = ss.str();
133
134 if(!data.empty())
135 {
136 auto name = path.stem().string();
137 presets_[name] = std::move(data);
138 }
139 }
140}
141
142void layout_manager::save_preset_to_disk(const std::string& name, const std::string& ini_data)
143{
144 auto path = get_preset_path(name);
145
146 std::ofstream file(path.string(), std::ios::binary | std::ios::trunc);
147 if(!file.is_open())
148 {
149 APPLOG_WARNING("Failed to save layout preset '{}' to disk", name);
150 return;
151 }
152
153 file.write(ini_data.data(), std::streamsize(ini_data.size()));
154}
155
156void layout_manager::delete_preset_from_disk(const std::string& name)
157{
158 auto path = get_preset_path(name);
159 fs::error_code err;
160 fs::remove(path, err);
161}
162
163auto layout_manager::get_preset_path(const std::string& name) const -> fs::path
164{
165 return layouts_directory_ / (name + ".ini");
166}
167
168} // namespace unravel
void save_preset(const std::string &name)
auto has_preset(const std::string &name) const -> bool
void init(const fs::path &layouts_directory)
auto get_preset_names() const -> std::vector< std::string >
void load_preset(const std::string &name)
void delete_preset(const std::string &name)
auto get_layouts_directory() const -> const fs::path &
std::string name
Definition hub.cpp:33
#define APPLOG_WARNING(...)
Definition logging.h:19
#define APPLOG_INFO(...)
Definition logging.h:18
Definition cache.hpp:11
Hash specialization for batch_key to enable use in std::unordered_map.