Added Popup system
This commit is contained in:
parent
16db021aaa
commit
c3ce41307a
32
imgui.ini
32
imgui.ini
@ -10,24 +10,24 @@ Collapsed=1
|
||||
|
||||
[Window][WindowOverViewport_11111111]
|
||||
Pos=0,19
|
||||
Size=1920,1158
|
||||
Size=1280,701
|
||||
Collapsed=0
|
||||
|
||||
[Window][Inspector]
|
||||
Pos=1553,19
|
||||
Size=367,659
|
||||
Pos=913,19
|
||||
Size=367,202
|
||||
Collapsed=0
|
||||
DockId=0x00000018,0
|
||||
|
||||
[Window][Scene Tree]
|
||||
Pos=0,19
|
||||
Size=342,579
|
||||
Size=342,350
|
||||
Collapsed=0
|
||||
DockId=0x0000000F,0
|
||||
|
||||
[Window][Viewport]
|
||||
Pos=344,19
|
||||
Size=1207,659
|
||||
Size=567,202
|
||||
Collapsed=0
|
||||
DockId=0x00000017,0
|
||||
|
||||
@ -36,14 +36,14 @@ Size=1280,19
|
||||
Collapsed=0
|
||||
|
||||
[Window][Performance Info]
|
||||
Pos=1606,680
|
||||
Size=314,497
|
||||
Pos=1094,223
|
||||
Size=186,497
|
||||
Collapsed=0
|
||||
DockId=0x00000016,0
|
||||
|
||||
[Window][Console]
|
||||
Pos=344,680
|
||||
Size=1206,273
|
||||
Pos=344,223
|
||||
Size=715,273
|
||||
Collapsed=0
|
||||
DockId=0x00000013,0
|
||||
|
||||
@ -54,8 +54,8 @@ Collapsed=0
|
||||
DockId=0x00000017,1
|
||||
|
||||
[Window][Profiler]
|
||||
Pos=344,955
|
||||
Size=1206,222
|
||||
Pos=344,498
|
||||
Size=715,222
|
||||
Collapsed=0
|
||||
DockId=0x00000014,0
|
||||
|
||||
@ -112,8 +112,8 @@ Collapsed=0
|
||||
DockId=0x0000000E,0
|
||||
|
||||
[Window][Audio Output]
|
||||
Pos=1552,680
|
||||
Size=52,497
|
||||
Pos=1061,223
|
||||
Size=31,497
|
||||
Collapsed=0
|
||||
DockId=0x00000012,0
|
||||
|
||||
@ -124,13 +124,13 @@ Collapsed=0
|
||||
DockId=0x0000000D,0
|
||||
|
||||
[Window][Resources]
|
||||
Pos=0,600
|
||||
Size=342,577
|
||||
Pos=0,371
|
||||
Size=342,349
|
||||
Collapsed=0
|
||||
DockId=0x00000010,0
|
||||
|
||||
[Docking][Data]
|
||||
DockSpace ID=0x11111111 Window=0x1BBC0F80 Pos=0,19 Size=1920,1158 Split=X
|
||||
DockSpace ID=0x11111111 Window=0x1BBC0F80 Pos=0,19 Size=1280,701 Split=X
|
||||
DockNode ID=0x00000005 Parent=0x11111111 SizeRef=989,1158 Split=X
|
||||
DockNode ID=0x00000001 Parent=0x00000005 SizeRef=342,701 Split=Y Selected=0x12EF0F59
|
||||
DockNode ID=0x00000003 Parent=0x00000001 SizeRef=342,637 Split=Y Selected=0x12EF0F59
|
||||
|
@ -1,4 +1,2 @@
|
||||
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -Isrc/vendor/xxhash -Isrc/vendor/miniaudio -Isrc/vendor/imguizmo -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\core\audio\AudioEngine.cpp -o src\build\core\audio\AudioEngine.o
|
||||
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -Isrc/vendor/xxhash -Isrc/vendor/miniaudio -Isrc/vendor/imguizmo -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\core\utils\EngineConfig.cpp -o src\build\core\utils\EngineConfig.o
|
||||
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -Isrc/vendor/xxhash -Isrc/vendor/miniaudio -Isrc/vendor/imguizmo -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\Engine.cpp -o src\build\Engine.o
|
||||
[LINK] g++ src\build\Engine.o src\build\main.o src\build\Renderer.o src\build\Components\AnimationComponent.o src\build\Components\AudioPlayerComponent.o src\build\Components\CameraComponent.o src\build\Components\LightComponent.o src\build\Components\ParticleComponent.o src\build\Components\PhysicsComponent.o src\build\Components\ScriptComponent.o src\build\Components\SpriteComponent.o src\build\Components\TextComonent.o src\build\Components\TilemapComponent.o src\build\core\audio\AudioEngine.o src\build\core\utils\AssetManager.o src\build\core\utils\EngineConfig.o src\build\core\utils\ExceptionHandler.o src\build\core\utils\FileDialog.o src\build\core\utils\input.o src\build\core\utils\LoadingWindow.o src\build\core\utils\Logging.o src\build\core\utils\Profiler.o src\build\core\utils\Texture.o src\build\core\utils\utils.o src\build\editor\windows\AssetBrowser.o src\build\editor\windows\AudioInfo.o src\build\editor\windows\Inspector.o src\build\Entitys\Object.o src\build\utils\GameObjectsList.o src\build\utils\Shader.o src\build\utils\UID.o src\build\lapi.o src\build\lauxlib.o src\build\lbaselib.o src\build\lcode.o src\build\lcorolib.o src\build\lctype.o src\build\ldblib.o src\build\ldebug.o src\build\ldo.o src\build\ldump.o src\build\lfunc.o src\build\lgc.o src\build\linit.o src\build\liolib.o src\build\llex.o src\build\lmathlib.o src\build\lmem.o src\build\loadlib.o src\build\lobject.o src\build\lopcodes.o src\build\loslib.o src\build\lparser.o src\build\lstate.o src\build\lstring.o src\build\lstrlib.o src\build\ltable.o src\build\ltablib.o src\build\ltm.o src\build\lua.o src\build\luac.o src\build\lundump.o src\build\lutf8lib.o src\build\lvm.o src\build\lzio.o src\build\imgui.o src\build\imgui_demo.o src\build\imgui_draw.o src\build\imgui_impl_glfw.o src\build\imgui_impl_opengl3.o src\build\imgui_tables.o src\build\imgui_widgets.o src\build\aabb.o src\build\arena_allocator.o src\build\array.o src\build\bitset.o src\build\body.o src\build\broad_phase.o src\build\constraint_graph.o src\build\contact.o src\build\contact_solver.o src\build\core.o src\build\distance.o src\build\distance_joint.o src\build\dynamic_tree.o src\build\geometry.o src\build\hull.o src\build\id_pool.o src\build\island.o src\build\joint.o src\build\manifold.o src\build\math_functions.o src\build\motor_joint.o src\build\mouse_joint.o src\build\mover.o src\build\prismatic_joint.o src\build\revolute_joint.o src\build\sensor.o src\build\shape.o src\build\solver.o src\build\solver_set.o src\build\table.o src\build\timer.o src\build\types.o src\build\weld_joint.o src\build\wheel_joint.o src\build\world.o src\build\xxhash.o src\build\miniaudio.o src\build\ImGuizmo.o -o src\build\app.exe -LC:\msys64\mingw64\lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -lyaml-cpp -lcomdlg32 -lssl -lcrypto -ldbghelp
|
||||
[COMPILE] g++ -std=c++20 -Wall -g -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -Isrc/vendor/box2d -Isrc/vendor/xxhash -Isrc/vendor/miniaudio -Isrc/vendor/imguizmo -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\core\utils\Popup.cpp -o src\build\core\utils\Popup.o
|
||||
[LINK] g++ src\build\Engine.o src\build\main.o src\build\Renderer.o src\build\Components\AnimationComponent.o src\build\Components\AudioPlayerComponent.o src\build\Components\CameraComponent.o src\build\Components\LightComponent.o src\build\Components\ParticleComponent.o src\build\Components\PhysicsComponent.o src\build\Components\ScriptComponent.o src\build\Components\SpriteComponent.o src\build\Components\TextComonent.o src\build\Components\TilemapComponent.o src\build\core\audio\AudioEngine.o src\build\core\utils\AssetManager.o src\build\core\utils\EngineConfig.o src\build\core\utils\ExceptionHandler.o src\build\core\utils\FileDialog.o src\build\core\utils\input.o src\build\core\utils\LoadingWindow.o src\build\core\utils\Logging.o src\build\core\utils\Popup.o src\build\core\utils\Profiler.o src\build\core\utils\Texture.o src\build\core\utils\utils.o src\build\editor\windows\AssetBrowser.o src\build\editor\windows\AudioInfo.o src\build\editor\windows\Inspector.o src\build\Entitys\Object.o src\build\utils\GameObjectsList.o src\build\utils\Shader.o src\build\utils\UID.o src\build\lapi.o src\build\lauxlib.o src\build\lbaselib.o src\build\lcode.o src\build\lcorolib.o src\build\lctype.o src\build\ldblib.o src\build\ldebug.o src\build\ldo.o src\build\ldump.o src\build\lfunc.o src\build\lgc.o src\build\linit.o src\build\liolib.o src\build\llex.o src\build\lmathlib.o src\build\lmem.o src\build\loadlib.o src\build\lobject.o src\build\lopcodes.o src\build\loslib.o src\build\lparser.o src\build\lstate.o src\build\lstring.o src\build\lstrlib.o src\build\ltable.o src\build\ltablib.o src\build\ltm.o src\build\lua.o src\build\luac.o src\build\lundump.o src\build\lutf8lib.o src\build\lvm.o src\build\lzio.o src\build\imgui.o src\build\imgui_demo.o src\build\imgui_draw.o src\build\imgui_impl_glfw.o src\build\imgui_impl_opengl3.o src\build\imgui_tables.o src\build\imgui_widgets.o src\build\aabb.o src\build\arena_allocator.o src\build\array.o src\build\bitset.o src\build\body.o src\build\broad_phase.o src\build\constraint_graph.o src\build\contact.o src\build\contact_solver.o src\build\core.o src\build\distance.o src\build\distance_joint.o src\build\dynamic_tree.o src\build\geometry.o src\build\hull.o src\build\id_pool.o src\build\island.o src\build\joint.o src\build\manifold.o src\build\math_functions.o src\build\motor_joint.o src\build\mouse_joint.o src\build\mover.o src\build\prismatic_joint.o src\build\revolute_joint.o src\build\sensor.o src\build\shape.o src\build\solver.o src\build\solver_set.o src\build\table.o src\build\timer.o src\build\types.o src\build\weld_joint.o src\build\wheel_joint.o src\build\world.o src\build\xxhash.o src\build\miniaudio.o src\build\ImGuizmo.o -o src\build\app.exe -LC:\msys64\mingw64\lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -lyaml-cpp -lcomdlg32 -lssl -lcrypto -ldbghelp
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -756,6 +756,10 @@ void Engine::Run()
|
||||
{
|
||||
ImGui::Checkbox("Enable Lighting", &g_engineConfig.settings.lighting_enabled);
|
||||
ImGui::Checkbox("Enable Gizmos", &g_engineConfig.settings.draw_gizmos);
|
||||
if (ImGui::BeginMenu("Defaults"))
|
||||
{
|
||||
ImGui::Checkbox("Prompt Outdated Scenes", &g_engineConfig.settings.ignore_invalid_versions_popups);
|
||||
}
|
||||
if (ImGui::BeginMenu("Profiling"))
|
||||
{
|
||||
ImGui::Text("Note: Slow");
|
||||
@ -1487,6 +1491,8 @@ void Engine::SaveScene(const std::string &path)
|
||||
|
||||
void Engine::LoadScene(const std::string &path)
|
||||
{
|
||||
|
||||
bool legacyLoad = false;
|
||||
Logger::LogDebug("[LoadScene] Reading Scene File.");
|
||||
YAML::Node root = YAML::LoadFile(path);
|
||||
|
||||
@ -1504,12 +1510,43 @@ void Engine::LoadScene(const std::string &path)
|
||||
return;
|
||||
}
|
||||
|
||||
std::string loadedVersion = root["engine_version"].as<std::string>();
|
||||
std::string expectedVersion = g_engineConfig.version;
|
||||
|
||||
|
||||
if (root["engine_version"].as<std::string>() != g_engineConfig.version)
|
||||
if (loadedVersion != expectedVersion)
|
||||
{
|
||||
Logger::LogError("[LoadScene] Version mismatch! Expected %s, got %s", g_engineConfig.version.c_str(), root["engine_version"].as<std::string>().c_str());
|
||||
|
||||
Logger::LogWarning("[LoadScene] Version mismatch! Expected %s, got %s",
|
||||
expectedVersion.c_str(), loadedVersion.c_str());
|
||||
|
||||
if (!g_engineConfig.settings.ignore_invalid_versions_popups)
|
||||
{
|
||||
loadingUI.Destroy(); // Close visual loading before blocking popup
|
||||
|
||||
int result = Popup::Show("Version Mismatch",
|
||||
"Scene was created with engine version: " + loadedVersion +
|
||||
"\nExpected: " + expectedVersion +
|
||||
"\n\nLoad anyway?",
|
||||
{Popup::Option("Yes", 1),
|
||||
Popup::Option("Yes (Don't Ask Again)", 2),
|
||||
Popup::Option("No", 0)});
|
||||
|
||||
if (result == 0)
|
||||
{
|
||||
Logger::LogInfo("[LoadScene] User cancelled scene load.");
|
||||
return;
|
||||
}
|
||||
if (result == 2)
|
||||
{
|
||||
g_engineConfig.settings.ignore_invalid_versions_popups = true;
|
||||
}
|
||||
|
||||
loadingUI.Create("Loading Scene (Legacy Recovery)");
|
||||
loadingUI.Update("Attempting Recovery", "Loading scene with fallback...", 0.02f);
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger::LogInfo("[LoadScene] Version mismatch ignored due to user setting.");
|
||||
}
|
||||
}
|
||||
|
||||
if (!VerifySceneHash(root))
|
||||
@ -1549,12 +1586,21 @@ void Engine::LoadScene(const std::string &path)
|
||||
float progress = 0.1f + (0.75f * (objectIndex / static_cast<float>(std::max(1, totalObjects))));
|
||||
loadingUI.Update(currentStep, currentDetail, progress);
|
||||
|
||||
auto obj = std::make_shared<Object>(objName);
|
||||
obj->Load(node);
|
||||
objects.push_back(obj);
|
||||
try
|
||||
{
|
||||
auto obj = std::make_shared<Object>(objName);
|
||||
obj->Load(node);
|
||||
objects.push_back(obj);
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
Logger::LogWarning("[LoadScene] Failed to load object '%s': %s", objName.c_str(), e.what());
|
||||
}
|
||||
|
||||
objectIndex++;
|
||||
}
|
||||
|
||||
// Color correction settings
|
||||
if (root["color_correction"])
|
||||
{
|
||||
Logger::LogVerbose("[LoadScene] Loading Color Correction Attributes");
|
||||
@ -1581,6 +1627,7 @@ void Engine::LoadScene(const std::string &path)
|
||||
}
|
||||
}
|
||||
|
||||
// Finalize
|
||||
currentStep = "Done";
|
||||
currentDetail = "Finalizing load...";
|
||||
loadingUI.Update(currentStep, currentDetail, 1.0f);
|
||||
|
@ -12,7 +12,7 @@
|
||||
//! Macro Fuckery my Gz
|
||||
|
||||
EngineConfig g_engineConfig{
|
||||
.version = "0.8.1",
|
||||
.version = "0.8.2",
|
||||
.gl_version = "430",
|
||||
.gl_maxLight = 512,
|
||||
.settings = UserSettings{}
|
||||
|
@ -12,7 +12,8 @@
|
||||
USER_SETTING(show_asset_window, bool, false) \
|
||||
USER_SETTING(profile_gpu, bool, false) \
|
||||
USER_SETTING(show_performance_window, bool, false) \
|
||||
USER_SETTING(show_audio_window, bool, false)
|
||||
USER_SETTING(show_audio_window, bool, false) \
|
||||
USER_SETTING(ignore_invalid_versions_popups, bool, false)
|
||||
|
||||
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
#include <windows.h>
|
||||
#include <string>
|
||||
#include "Popup.h"
|
||||
|
||||
class LoadingWindow {
|
||||
public:
|
||||
|
137
src/src/core/utils/Popup.cpp
Normal file
137
src/src/core/utils/Popup.cpp
Normal file
@ -0,0 +1,137 @@
|
||||
#include "Popup.h"
|
||||
#include <windows.h>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
struct PopupContext
|
||||
{
|
||||
std::string message;
|
||||
std::vector<Popup::Option> options;
|
||||
int result = -1;
|
||||
};
|
||||
|
||||
static PopupContext *g_ctx = nullptr;
|
||||
static const char *CLASS_NAME = "PopupWindowClass";
|
||||
|
||||
LRESULT CALLBACK PopupWndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch (msg)
|
||||
{
|
||||
case WM_CREATE:
|
||||
{
|
||||
|
||||
RECT textRect = {20, 20, 360 + 20, 200};
|
||||
HFONT font = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
|
||||
HDC hdc = GetDC(hwnd);
|
||||
SelectObject(hdc, font);
|
||||
DrawTextA(hdc, g_ctx->message.c_str(), -1, &textRect, DT_WORDBREAK | DT_CALCRECT);
|
||||
ReleaseDC(hwnd, hdc);
|
||||
|
||||
// Add padding
|
||||
int textHeight = textRect.bottom - textRect.top + 8;
|
||||
|
||||
HWND label = CreateWindowA("STATIC", g_ctx->message.c_str(),
|
||||
WS_CHILD | WS_VISIBLE | SS_LEFT | SS_NOPREFIX,
|
||||
20, 20, 360, textHeight,
|
||||
hwnd, nullptr, nullptr, nullptr);
|
||||
SendMessage(label, WM_SETFONT, (WPARAM)font, TRUE);
|
||||
|
||||
int btnW = 120, btnH = 28, spacing = 10;
|
||||
int totalW = (int)g_ctx->options.size() * btnW + ((int)g_ctx->options.size() - 1) * spacing;
|
||||
int x = (400 - totalW) / 2;
|
||||
|
||||
for (int i = 0; i < (int)g_ctx->options.size(); ++i)
|
||||
{
|
||||
HWND btn = CreateWindowA("BUTTON", g_ctx->options[i].label.c_str(),
|
||||
WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
|
||||
x + i * (btnW + spacing), 100, btnW, btnH,
|
||||
hwnd, (HMENU)(1000 + i), GetModuleHandle(nullptr), nullptr);
|
||||
SendMessage(btn, WM_SETFONT, (WPARAM)font, TRUE);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case WM_COMMAND:
|
||||
{
|
||||
int id = LOWORD(wParam);
|
||||
if (id >= 1000)
|
||||
{
|
||||
int index = id - 1000;
|
||||
if (index >= 0 && index < (int)g_ctx->options.size())
|
||||
{
|
||||
g_ctx->result = g_ctx->options[index].returnValue;
|
||||
DestroyWindow(hwnd);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case WM_CLOSE:
|
||||
DestroyWindow(hwnd);
|
||||
break;
|
||||
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
}
|
||||
|
||||
return DefWindowProc(hwnd, msg, wParam, lParam);
|
||||
}
|
||||
|
||||
int Popup::Show(const std::string &title,
|
||||
const std::string &message,
|
||||
const std::vector<Option> &options)
|
||||
{
|
||||
if (options.size() <= 2)
|
||||
{
|
||||
if (options.size() == 1 && options[0].label == "OK")
|
||||
{
|
||||
MessageBoxA(nullptr, message.c_str(), title.c_str(), MB_OK | MB_ICONINFORMATION);
|
||||
return options[0].returnValue;
|
||||
}
|
||||
if ((options[0].label == "Yes" && options[1].label == "No") ||
|
||||
(options[0].label == "No" && options[1].label == "Yes"))
|
||||
{
|
||||
int result = MessageBoxA(nullptr, message.c_str(), title.c_str(), MB_YESNO | MB_ICONQUESTION);
|
||||
return (result == IDYES) ? (options[0].label == "Yes" ? options[0].returnValue : options[1].returnValue)
|
||||
: (options[0].label == "No" ? options[0].returnValue : options[1].returnValue);
|
||||
}
|
||||
}
|
||||
|
||||
// For 3+ options, use custom window
|
||||
static bool registered = false;
|
||||
if (!registered)
|
||||
{
|
||||
WNDCLASSA wc = {};
|
||||
wc.lpfnWndProc = PopupWndProc;
|
||||
wc.hInstance = GetModuleHandle(nullptr);
|
||||
wc.lpszClassName = CLASS_NAME;
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
|
||||
RegisterClassA(&wc);
|
||||
registered = true;
|
||||
}
|
||||
|
||||
PopupContext context = {message, options, -1};
|
||||
g_ctx = &context;
|
||||
|
||||
HWND hwnd = CreateWindowExA(
|
||||
WS_EX_DLGMODALFRAME,
|
||||
CLASS_NAME,
|
||||
title.c_str(),
|
||||
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU,
|
||||
CW_USEDEFAULT, CW_USEDEFAULT, 400, 180,
|
||||
nullptr, nullptr, GetModuleHandle(nullptr), nullptr);
|
||||
|
||||
ShowWindow(hwnd, SW_SHOW);
|
||||
UpdateWindow(hwnd);
|
||||
|
||||
MSG msg;
|
||||
while (IsWindow(hwnd) && GetMessage(&msg, nullptr, 0, 0))
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
return context.result;
|
||||
}
|
25
src/src/core/utils/Popup.h
Normal file
25
src/src/core/utils/Popup.h
Normal file
@ -0,0 +1,25 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <optional>
|
||||
|
||||
class Popup {
|
||||
public:
|
||||
struct Option {
|
||||
std::string label;
|
||||
int returnValue;
|
||||
|
||||
static int nextID;
|
||||
|
||||
|
||||
Option(const std::string& label, int value)
|
||||
: label(label), returnValue(value) {}
|
||||
};
|
||||
|
||||
// Yes/No message box (native)
|
||||
static bool AskYesNo(const std::string& title, const std::string& message);
|
||||
|
||||
static int Show(const std::string& title,
|
||||
const std::string& message,
|
||||
const std::vector<Option>& options = { Option("OK", 1) });
|
||||
};
|
Loading…
Reference in New Issue
Block a user