spicetools/overlay/windows/eadev.cpp

117 lines
4.0 KiB
C++

#include "eadev.h"
#include "avs/automap.h"
#include "util/fileutils.h"
#include "overlay/imgui/extensions.h"
namespace overlay::windows {
EADevWindow::EADevWindow(SpiceOverlay *overlay) : Window(overlay) {
this->title = "EA-Dev";
this->init_size = ImVec2(
ImGui::GetIO().DisplaySize.x * 0.8f,
ImGui::GetIO().DisplaySize.y * 0.8f);
this->size_min = ImVec2(250, 200);
this->init_pos = ImVec2(
ImGui::GetIO().DisplaySize.x / 2 - this->init_size.x / 2,
ImGui::GetIO().DisplaySize.y / 2 - this->init_size.y / 2);
this->active = true;
// read existing automap contents from file
if (avs::automap::DUMP_FILENAME.length() > 0) {
auto contents = fileutils::text_read(avs::automap::DUMP_FILENAME);
if (contents.length() > 0) {
this->automap_hook(this, contents.c_str());
}
}
// add hook for receiving automap messages
avs::automap::hook_add(automap_hook, this);
}
EADevWindow::~EADevWindow() {
avs::automap::hook_remove(automap_hook, this);
}
void EADevWindow::build_content() {
// automap
ImGui::SetNextItemOpen(true, ImGuiCond_Once);
if (ImGui::CollapsingHeader("Automap")) {
// enable checkbox
if (ImGui::Checkbox("Enabled", &avs::automap::ENABLED)) {
if (avs::automap::ENABLED) {
avs::automap::enable();
} else {
avs::automap::disable();
}
}
ImGui::SameLine();
ImGui::HelpMarker("Enable this module.");
// dump checkbox
ImGui::Checkbox("Dump", &avs::automap::DUMP);
if (avs::automap::DUMP_FILENAME.length() > 0) {
ImGui::SameLine();
ImGui::Text("- %s", avs::automap::DUMP_FILENAME.c_str());
}
ImGui::SameLine();
ImGui::HelpMarker("Dump all destroyed props to file.");
// json checkbox
ImGui::Checkbox("JSON", &avs::automap::JSON);
ImGui::SameLine();
ImGui::HelpMarker("Output in JSON instead of XML.");
// patch checkbox
ImGui::Checkbox("Patch", &avs::automap::PATCH);
ImGui::SameLine();
ImGui::HelpMarker("Try to dynamically add all non-existing nodes which are being accessed. (WIP)");
// network checkbox
ImGui::Checkbox("Network Only", &avs::automap::RESTRICT_NETWORK);
ImGui::SameLine();
ImGui::HelpMarker("Restrict functionality to calls/responses.");
// autoscroll checkbox
ImGui::Checkbox("Auto-Scroll", &this->automap_autoscroll);
ImGui::SameLine();
ImGui::HelpMarker("Automatically scroll to bottom.");
// clear button
if (!this->automap_data.empty()) {
ImGui::SameLine();
if (ImGui::Button("Clear")) {
this->automap_data.clear();
}
}
// log view
ImGui::Separator();
ImGui::BeginChild("scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_HorizontalScrollbar);
for (size_t i = 0; i < automap_data.size(); i++) {
ImGui::PushStyleColor(ImGuiCol_Text, (i % 2) == 0
? ImVec4(1.0f, 0.7f, 0.7f, 1.f)
: ImVec4(0.7f, 1.0f, 0.7f, 1.f));
ImGui::TextUnformatted(automap_data[i].c_str());
ImGui::PopStyleColor();
}
if (this->automap_scroll_to_bottom) {
this->automap_scroll_to_bottom = false;
ImGui::SetScrollHereY(1.f);
}
ImGui::EndChild();
}
}
void EADevWindow::automap_hook(void *user, const char *data) {
auto This = (EADevWindow*) user;
This->automap_data.emplace_back(std::string(data));
if (This->automap_autoscroll) {
This->automap_scroll_to_bottom = true;
}
}
}