mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-19 00:41:43 +00:00
163 lines
4.6 KiB
C++
163 lines
4.6 KiB
C++
// Copyright (c) FIRST and other WPILib contributors.
|
|
// Open Source Software; you can modify and/or share it under the terms of
|
|
// the WPILib BSD license file in the root directory of this project.
|
|
|
|
#include "glass/support/IniSaverInfo.h"
|
|
|
|
#include <cstdio>
|
|
#include <cstring>
|
|
|
|
#include <imgui_internal.h>
|
|
#include <wpi/SmallString.h>
|
|
|
|
using namespace glass;
|
|
|
|
void NameInfo::SetName(const wpi::Twine& name) {
|
|
wpi::SmallString<64> nameBuf;
|
|
auto nameStr = name.toStringRef(nameBuf);
|
|
size_t len = (std::min)(nameStr.size(), sizeof(m_name) - 1);
|
|
std::memcpy(m_name, nameStr.data(), len);
|
|
m_name[len] = '\0';
|
|
}
|
|
|
|
void NameInfo::GetName(char* buf, size_t size, const char* defaultName) const {
|
|
if (m_name[0] != '\0') {
|
|
std::snprintf(buf, size, "%s", m_name);
|
|
} else {
|
|
std::snprintf(buf, size, "%s", defaultName);
|
|
}
|
|
}
|
|
|
|
void NameInfo::GetName(char* buf, size_t size, const char* defaultName,
|
|
int index) const {
|
|
if (m_name[0] != '\0') {
|
|
std::snprintf(buf, size, "%s [%d]", m_name, index);
|
|
} else {
|
|
std::snprintf(buf, size, "%s[%d]", defaultName, index);
|
|
}
|
|
}
|
|
|
|
void NameInfo::GetName(char* buf, size_t size, const char* defaultName,
|
|
int index, int index2) const {
|
|
if (m_name[0] != '\0') {
|
|
std::snprintf(buf, size, "%s [%d,%d]", m_name, index, index2);
|
|
} else {
|
|
std::snprintf(buf, size, "%s[%d,%d]", defaultName, index, index2);
|
|
}
|
|
}
|
|
|
|
void NameInfo::GetLabel(char* buf, size_t size, const char* defaultName) const {
|
|
if (m_name[0] != '\0') {
|
|
std::snprintf(buf, size, "%s###Name%s", m_name, defaultName);
|
|
} else {
|
|
std::snprintf(buf, size, "%s###Name%s", defaultName, defaultName);
|
|
}
|
|
}
|
|
|
|
void NameInfo::GetLabel(char* buf, size_t size, const char* defaultName,
|
|
int index) const {
|
|
if (m_name[0] != '\0') {
|
|
std::snprintf(buf, size, "%s [%d]###Name%d", m_name, index, index);
|
|
} else {
|
|
std::snprintf(buf, size, "%s[%d]###Name%d", defaultName, index, index);
|
|
}
|
|
}
|
|
|
|
void NameInfo::GetLabel(char* buf, size_t size, const char* defaultName,
|
|
int index, int index2) const {
|
|
if (m_name[0] != '\0') {
|
|
std::snprintf(buf, size, "%s [%d,%d]###Name%d", m_name, index, index2,
|
|
index);
|
|
} else {
|
|
std::snprintf(buf, size, "%s[%d,%d]###Name%d", defaultName, index, index2,
|
|
index);
|
|
}
|
|
}
|
|
|
|
bool NameInfo::ReadIni(wpi::StringRef name, wpi::StringRef value) {
|
|
if (name != "name") return false;
|
|
size_t len = (std::min)(value.size(), sizeof(m_name) - 1);
|
|
std::memcpy(m_name, value.data(), len);
|
|
m_name[len] = '\0';
|
|
return true;
|
|
}
|
|
|
|
void NameInfo::WriteIni(ImGuiTextBuffer* out) {
|
|
out->appendf("name=%s\n", m_name);
|
|
}
|
|
|
|
void NameInfo::PushEditNameId(int index) {
|
|
char id[64];
|
|
std::snprintf(id, sizeof(id), "Name%d", index);
|
|
ImGui::PushID(id);
|
|
}
|
|
|
|
void NameInfo::PushEditNameId(const char* name) {
|
|
char id[128];
|
|
std::snprintf(id, sizeof(id), "Name%s", name);
|
|
ImGui::PushID(id);
|
|
}
|
|
|
|
bool NameInfo::PopupEditName(int index) {
|
|
bool rv = false;
|
|
char id[64];
|
|
std::snprintf(id, sizeof(id), "Name%d", index);
|
|
if (ImGui::BeginPopupContextItem(id)) {
|
|
ImGui::Text("Edit name:");
|
|
if (InputTextName("##edit")) {
|
|
rv = true;
|
|
}
|
|
if (ImGui::Button("Close") || ImGui::IsKeyPressedMap(ImGuiKey_Enter) ||
|
|
ImGui::IsKeyPressedMap(ImGuiKey_KeyPadEnter)) {
|
|
ImGui::CloseCurrentPopup();
|
|
}
|
|
ImGui::EndPopup();
|
|
}
|
|
return rv;
|
|
}
|
|
|
|
bool NameInfo::PopupEditName(const char* name) {
|
|
bool rv = false;
|
|
char id[128];
|
|
std::snprintf(id, sizeof(id), "Name%s", name);
|
|
if (ImGui::BeginPopupContextItem(id)) {
|
|
ImGui::Text("Edit name:");
|
|
if (InputTextName("##edit")) {
|
|
rv = true;
|
|
}
|
|
if (ImGui::Button("Close") || ImGui::IsKeyPressedMap(ImGuiKey_Enter) ||
|
|
ImGui::IsKeyPressedMap(ImGuiKey_KeyPadEnter)) {
|
|
ImGui::CloseCurrentPopup();
|
|
}
|
|
ImGui::EndPopup();
|
|
}
|
|
return rv;
|
|
}
|
|
|
|
bool NameInfo::InputTextName(const char* label_id, ImGuiInputTextFlags flags) {
|
|
return ImGui::InputText(label_id, m_name, sizeof(m_name), flags);
|
|
}
|
|
|
|
bool OpenInfo::ReadIni(wpi::StringRef name, wpi::StringRef value) {
|
|
if (name != "open") return false;
|
|
int num;
|
|
if (value.getAsInteger(10, num)) return true;
|
|
m_open = num;
|
|
return true;
|
|
}
|
|
|
|
void OpenInfo::WriteIni(ImGuiTextBuffer* out) {
|
|
out->appendf("open=%d\n", m_open ? 1 : 0);
|
|
}
|
|
|
|
bool NameOpenInfo::ReadIni(wpi::StringRef name, wpi::StringRef value) {
|
|
if (NameInfo::ReadIni(name, value)) return true;
|
|
if (OpenInfo::ReadIni(name, value)) return true;
|
|
return false;
|
|
}
|
|
|
|
void NameOpenInfo::WriteIni(ImGuiTextBuffer* out) {
|
|
NameInfo::WriteIni(out);
|
|
OpenInfo::WriteIni(out);
|
|
}
|