Files
IQ.Pilot/iqpilot/tools/cabana/ui/inistate.cc
2026-09-02 16:46:45 -05:00

88 lines
2.7 KiB
C++

#include "tools/cabana/ui/inistate.h"
#include <cstdio>
#include <cstring>
#include "imgui.h"
#include "imgui_internal.h"
#include <GLFW/glfw3.h>
#include "tools/cabana/settings.h"
#include "tools/cabana/ui/util.h"
namespace inistate {
MainWindowState main_window;
namespace {
void *readOpen(ImGuiContext *, ImGuiSettingsHandler *, const char *name) {
return strcmp(name, "MainWindow") == 0 ? (void *)&main_window : nullptr;
}
void readLine(ImGuiContext *, ImGuiSettingsHandler *, void *entry, const char *line) {
auto *state = (MainWindowState *)entry;
int x = 0, y = 0, flag = 0;
float ratio = 0.0f;
if (sscanf(line, "Pos=%d,%d", &x, &y) == 2) {
state->pos[0] = x;
state->pos[1] = y;
} else if (sscanf(line, "Size=%d,%d", &x, &y) == 2) {
state->size[0] = x;
state->size[1] = y;
state->has_geometry = true;
} else if (sscanf(line, "Maximized=%d", &flag) == 1) {
state->maximized = flag != 0;
} else if (sscanf(line, "VideoSplitterRatio=%f", &ratio) == 1) {
state->video_splitter_ratio = ratio;
} else if (sscanf(line, "MessagesVisible=%d", &flag) == 1) {
state->messages_visible = flag != 0;
} else if (sscanf(line, "VideoVisible=%d", &flag) == 1) {
state->video_visible = flag != 0;
}
}
void writeAll(ImGuiContext *, ImGuiSettingsHandler *handler, ImGuiTextBuffer *buf) {
buf->appendf("[%s][MainWindow]\n", handler->TypeName);
if (main_window.has_geometry) {
buf->appendf("Pos=%d,%d\n", main_window.pos[0], main_window.pos[1]);
buf->appendf("Size=%d,%d\n", main_window.size[0], main_window.size[1]);
}
buf->appendf("Maximized=%d\n", main_window.maximized ? 1 : 0);
buf->appendf("VideoSplitterRatio=%.4f\n", main_window.video_splitter_ratio);
buf->appendf("MessagesVisible=%d\n", main_window.messages_visible ? 1 : 0);
buf->appendf("VideoVisible=%d\n", main_window.video_visible ? 1 : 0);
buf->append("\n");
}
}
void addSettingsHandler() {
ImGuiSettingsHandler handler;
handler.TypeName = "Cabana";
handler.TypeHash = ImHashStr("Cabana");
handler.ReadOpenFn = readOpen;
handler.ReadLineFn = readLine;
handler.WriteAllFn = writeAll;
ImGui::AddSettingsHandler(&handler);
}
void load() {
if (!settings.ui_state.empty())
ImGui::LoadIniSettingsFromMemory(settings.ui_state.data(), settings.ui_state.size());
}
void applyWindowGeometry(GLFWwindow *window) {
if (main_window.has_geometry && main_window.size[0] > 0 && main_window.size[1] > 0) {
glfwSetWindowPos(window, main_window.pos[0], main_window.pos[1]);
glfwSetWindowSize(window, main_window.size[0], main_window.size[1]);
}
if (main_window.maximized) glfwMaximizeWindow(window);
}
std::string save() {
return std::string(ImGui::SaveIniSettingsToMemory());
}
}