mirror of
https://github.com/HarbourMasters/Shipwright
synced 2026-05-24 23:31:34 -04:00
b26f2b21da
* Add `SohModalWindow` and `SohModal`. Runs as window, always "visible", but not drawing if no popups are registered. Adds error catching for save file corruption (malformed json) that renames the file in question to prevent future loading issues and uses `SohModalWindow` to inform the user of the error. * Apply suggestions from code review --------- Co-authored-by: briaguya <70942617+briaguya-ai@users.noreply.github.com>
54 lines
2.0 KiB
C++
54 lines
2.0 KiB
C++
#include "SohModals.h"
|
|
#include "ImGui/imgui.h"
|
|
#include <vector>
|
|
#include <string>
|
|
#include <libultraship/bridge.h>
|
|
#include <libultraship/libultraship.h>
|
|
#include "UIWidgets.hpp"
|
|
#include "OTRGlobals.h"
|
|
#include "z64.h"
|
|
|
|
extern "C" PlayState* gPlayState;
|
|
struct SohModal {
|
|
std::string title_;
|
|
std::string message_;
|
|
std::string button1_;
|
|
std::string button2_;
|
|
std::function<void()> button1callback_;
|
|
std::function<void()> button2callback_;
|
|
};
|
|
std::vector<SohModal> modals;
|
|
|
|
void SohModalWindow::DrawElement() {
|
|
if (modals.size() > 0) {
|
|
SohModal curModal = modals.at(0);
|
|
if (!ImGui::IsPopupOpen(curModal.title_.c_str())) {
|
|
ImGui::OpenPopup(curModal.title_.c_str());
|
|
}
|
|
if (ImGui::BeginPopupModal(curModal.title_.c_str(), NULL, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings)) {
|
|
ImGui::Text(curModal.message_.c_str());
|
|
if (ImGui::Button(curModal.button1_.c_str())) {
|
|
if (curModal.button1callback_ != nullptr) {
|
|
curModal.button1callback_();
|
|
}
|
|
ImGui::CloseCurrentPopup();
|
|
modals.erase(modals.begin());
|
|
}
|
|
ImGui::SameLine();
|
|
if (curModal.button2_ != "") {
|
|
if (ImGui::Button(curModal.button2_.c_str())) {
|
|
if (curModal.button2callback_ != nullptr) {
|
|
curModal.button2callback_();
|
|
}
|
|
ImGui::CloseCurrentPopup();
|
|
modals.erase(modals.begin());
|
|
}
|
|
}
|
|
}
|
|
ImGui::EndPopup();
|
|
}
|
|
}
|
|
|
|
void SohModalWindow::RegisterPopup(std::string title, std::string message, std::string button1, std::string button2, std::function<void()> button1callback, std::function<void()> button2callback) {
|
|
modals.push_back({ title, message, button1, button2, button1callback, button2callback });
|
|
} |