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]
|
[Window][WindowOverViewport_11111111]
|
||||||
Pos=0,19
|
Pos=0,19
|
||||||
Size=1920,1158
|
Size=1280,701
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
[Window][Inspector]
|
[Window][Inspector]
|
||||||
Pos=1553,19
|
Pos=913,19
|
||||||
Size=367,659
|
Size=367,202
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
DockId=0x00000018,0
|
DockId=0x00000018,0
|
||||||
|
|
||||||
[Window][Scene Tree]
|
[Window][Scene Tree]
|
||||||
Pos=0,19
|
Pos=0,19
|
||||||
Size=342,579
|
Size=342,350
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
DockId=0x0000000F,0
|
DockId=0x0000000F,0
|
||||||
|
|
||||||
[Window][Viewport]
|
[Window][Viewport]
|
||||||
Pos=344,19
|
Pos=344,19
|
||||||
Size=1207,659
|
Size=567,202
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
DockId=0x00000017,0
|
DockId=0x00000017,0
|
||||||
|
|
||||||
@ -36,14 +36,14 @@ Size=1280,19
|
|||||||
Collapsed=0
|
Collapsed=0
|
||||||
|
|
||||||
[Window][Performance Info]
|
[Window][Performance Info]
|
||||||
Pos=1606,680
|
Pos=1094,223
|
||||||
Size=314,497
|
Size=186,497
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
DockId=0x00000016,0
|
DockId=0x00000016,0
|
||||||
|
|
||||||
[Window][Console]
|
[Window][Console]
|
||||||
Pos=344,680
|
Pos=344,223
|
||||||
Size=1206,273
|
Size=715,273
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
DockId=0x00000013,0
|
DockId=0x00000013,0
|
||||||
|
|
||||||
@ -54,8 +54,8 @@ Collapsed=0
|
|||||||
DockId=0x00000017,1
|
DockId=0x00000017,1
|
||||||
|
|
||||||
[Window][Profiler]
|
[Window][Profiler]
|
||||||
Pos=344,955
|
Pos=344,498
|
||||||
Size=1206,222
|
Size=715,222
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
DockId=0x00000014,0
|
DockId=0x00000014,0
|
||||||
|
|
||||||
@ -112,8 +112,8 @@ Collapsed=0
|
|||||||
DockId=0x0000000E,0
|
DockId=0x0000000E,0
|
||||||
|
|
||||||
[Window][Audio Output]
|
[Window][Audio Output]
|
||||||
Pos=1552,680
|
Pos=1061,223
|
||||||
Size=52,497
|
Size=31,497
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
DockId=0x00000012,0
|
DockId=0x00000012,0
|
||||||
|
|
||||||
@ -124,13 +124,13 @@ Collapsed=0
|
|||||||
DockId=0x0000000D,0
|
DockId=0x0000000D,0
|
||||||
|
|
||||||
[Window][Resources]
|
[Window][Resources]
|
||||||
Pos=0,600
|
Pos=0,371
|
||||||
Size=342,577
|
Size=342,349
|
||||||
Collapsed=0
|
Collapsed=0
|
||||||
DockId=0x00000010,0
|
DockId=0x00000010,0
|
||||||
|
|
||||||
[Docking][Data]
|
[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=0x00000005 Parent=0x11111111 SizeRef=989,1158 Split=X
|
||||||
DockNode ID=0x00000001 Parent=0x00000005 SizeRef=342,701 Split=Y Selected=0x12EF0F59
|
DockNode ID=0x00000001 Parent=0x00000005 SizeRef=342,701 Split=Y Selected=0x12EF0F59
|
||||||
DockNode ID=0x00000003 Parent=0x00000001 SizeRef=342,637 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\Popup.cpp -o src\build\core\utils\Popup.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
|
[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
|
||||||
[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
|
|
||||||
|
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 Lighting", &g_engineConfig.settings.lighting_enabled);
|
||||||
ImGui::Checkbox("Enable Gizmos", &g_engineConfig.settings.draw_gizmos);
|
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"))
|
if (ImGui::BeginMenu("Profiling"))
|
||||||
{
|
{
|
||||||
ImGui::Text("Note: Slow");
|
ImGui::Text("Note: Slow");
|
||||||
@ -1487,6 +1491,8 @@ void Engine::SaveScene(const std::string &path)
|
|||||||
|
|
||||||
void Engine::LoadScene(const std::string &path)
|
void Engine::LoadScene(const std::string &path)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
bool legacyLoad = false;
|
||||||
Logger::LogDebug("[LoadScene] Reading Scene File.");
|
Logger::LogDebug("[LoadScene] Reading Scene File.");
|
||||||
YAML::Node root = YAML::LoadFile(path);
|
YAML::Node root = YAML::LoadFile(path);
|
||||||
|
|
||||||
@ -1504,12 +1510,43 @@ void Engine::LoadScene(const std::string &path)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string loadedVersion = root["engine_version"].as<std::string>();
|
||||||
|
std::string expectedVersion = g_engineConfig.version;
|
||||||
|
|
||||||
|
if (loadedVersion != expectedVersion)
|
||||||
if (root["engine_version"].as<std::string>() != g_engineConfig.version)
|
|
||||||
{
|
{
|
||||||
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))
|
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))));
|
float progress = 0.1f + (0.75f * (objectIndex / static_cast<float>(std::max(1, totalObjects))));
|
||||||
loadingUI.Update(currentStep, currentDetail, progress);
|
loadingUI.Update(currentStep, currentDetail, progress);
|
||||||
|
|
||||||
auto obj = std::make_shared<Object>(objName);
|
try
|
||||||
obj->Load(node);
|
{
|
||||||
objects.push_back(obj);
|
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++;
|
objectIndex++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Color correction settings
|
||||||
if (root["color_correction"])
|
if (root["color_correction"])
|
||||||
{
|
{
|
||||||
Logger::LogVerbose("[LoadScene] Loading Color Correction Attributes");
|
Logger::LogVerbose("[LoadScene] Loading Color Correction Attributes");
|
||||||
@ -1581,6 +1627,7 @@ void Engine::LoadScene(const std::string &path)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Finalize
|
||||||
currentStep = "Done";
|
currentStep = "Done";
|
||||||
currentDetail = "Finalizing load...";
|
currentDetail = "Finalizing load...";
|
||||||
loadingUI.Update(currentStep, currentDetail, 1.0f);
|
loadingUI.Update(currentStep, currentDetail, 1.0f);
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
//! Macro Fuckery my Gz
|
//! Macro Fuckery my Gz
|
||||||
|
|
||||||
EngineConfig g_engineConfig{
|
EngineConfig g_engineConfig{
|
||||||
.version = "0.8.1",
|
.version = "0.8.2",
|
||||||
.gl_version = "430",
|
.gl_version = "430",
|
||||||
.gl_maxLight = 512,
|
.gl_maxLight = 512,
|
||||||
.settings = UserSettings{}
|
.settings = UserSettings{}
|
||||||
|
@ -12,7 +12,8 @@
|
|||||||
USER_SETTING(show_asset_window, bool, false) \
|
USER_SETTING(show_asset_window, bool, false) \
|
||||||
USER_SETTING(profile_gpu, bool, false) \
|
USER_SETTING(profile_gpu, bool, false) \
|
||||||
USER_SETTING(show_performance_window, 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
|
#pragma once
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include "Popup.h"
|
||||||
|
|
||||||
class LoadingWindow {
|
class LoadingWindow {
|
||||||
public:
|
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