mirror of
https://github.com/PancakeTAS/lsfg-vk.git
synced 2025-10-30 07:01:10 +00:00
add error gui
This commit is contained in:
parent
a457ef5aff
commit
b5ca50d3d8
6 changed files with 116 additions and 6 deletions
3
.gitmodules
vendored
3
.gitmodules
vendored
|
|
@ -7,3 +7,6 @@
|
||||||
[submodule "thirdparty/toml11"]
|
[submodule "thirdparty/toml11"]
|
||||||
path = thirdparty/toml11
|
path = thirdparty/toml11
|
||||||
url = https://github.com/ToruNiina/toml11
|
url = https://github.com/ToruNiina/toml11
|
||||||
|
[submodule "thirdparty/raylib"]
|
||||||
|
path = thirdparty/raylib
|
||||||
|
url = https://github.com/raysan5/raylib
|
||||||
|
|
|
||||||
|
|
@ -12,14 +12,16 @@ endif()
|
||||||
# subprojects
|
# subprojects
|
||||||
add_compile_options(-fPIC
|
add_compile_options(-fPIC
|
||||||
-Wno-deprecated-declarations
|
-Wno-deprecated-declarations
|
||||||
-Wno-unused-template)
|
-Wno-unused-template
|
||||||
|
-Wno-tautological-compare
|
||||||
|
-Wno-undef)
|
||||||
|
|
||||||
add_subdirectory(thirdparty/dxbc EXCLUDE_FROM_ALL)
|
add_subdirectory(thirdparty/dxbc EXCLUDE_FROM_ALL)
|
||||||
add_subdirectory(thirdparty/pe-parse/pe-parser-library EXCLUDE_FROM_ALL)
|
add_subdirectory(thirdparty/pe-parse/pe-parser-library EXCLUDE_FROM_ALL)
|
||||||
add_subdirectory(thirdparty/toml11 EXCLUDE_FROM_ALL)
|
add_subdirectory(thirdparty/toml11 EXCLUDE_FROM_ALL)
|
||||||
|
add_subdirectory(thirdparty/raylib EXCLUDE_FROM_ALL)
|
||||||
add_subdirectory(framegen)
|
add_subdirectory(framegen)
|
||||||
|
|
||||||
|
|
||||||
# main project
|
# main project
|
||||||
project(lsfg-vk
|
project(lsfg-vk
|
||||||
VERSION 0.0.1
|
VERSION 0.0.1
|
||||||
|
|
@ -43,7 +45,8 @@ set_target_properties(lsfg-vk PROPERTIES
|
||||||
target_include_directories(lsfg-vk
|
target_include_directories(lsfg-vk
|
||||||
PRIVATE include)
|
PRIVATE include)
|
||||||
target_link_libraries(lsfg-vk PRIVATE
|
target_link_libraries(lsfg-vk PRIVATE
|
||||||
lsfg-vk-framegen pe-parse dxbc toml11 vulkan)
|
pe-parse dxbc toml11 raylib
|
||||||
|
lsfg-vk-framegen vulkan)
|
||||||
|
|
||||||
get_target_property(TOML11_INCLUDE_DIRS toml11 INTERFACE_INCLUDE_DIRECTORIES)
|
get_target_property(TOML11_INCLUDE_DIRS toml11 INTERFACE_INCLUDE_DIRECTORIES)
|
||||||
target_include_directories(lsfg-vk SYSTEM PRIVATE ${TOML11_INCLUDE_DIRS})
|
target_include_directories(lsfg-vk SYSTEM PRIVATE ${TOML11_INCLUDE_DIRS})
|
||||||
|
|
|
||||||
14
include/utils/gui.hpp
Normal file
14
include/utils/gui.hpp
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace Utils {
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Display error gui and exit
|
||||||
|
///
|
||||||
|
/// @param message The error message to display in the GUI.
|
||||||
|
///
|
||||||
|
[[noreturn]] void showErrorGui(const std::string& message);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
#include "config/config.hpp"
|
#include "config/config.hpp"
|
||||||
#include "extract/extract.hpp"
|
#include "extract/extract.hpp"
|
||||||
#include "utils/benchmark.hpp"
|
#include "utils/benchmark.hpp"
|
||||||
|
#include "utils/gui.hpp"
|
||||||
#include "utils/utils.hpp"
|
#include "utils/utils.hpp"
|
||||||
|
|
||||||
#include <exception>
|
#include <exception>
|
||||||
|
|
@ -20,7 +21,7 @@ namespace {
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
std::cerr << "lsfg-vk: An error occured while trying to parse the configuration, exiting:\n";
|
std::cerr << "lsfg-vk: An error occured while trying to parse the configuration, exiting:\n";
|
||||||
std::cerr << "- " << e.what() << '\n';
|
std::cerr << "- " << e.what() << '\n';
|
||||||
exit(0);
|
Utils::showErrorGui(e.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string name = Utils::getProcessName();
|
const std::string name = Utils::getProcessName();
|
||||||
|
|
@ -29,7 +30,7 @@ namespace {
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
std::cerr << "lsfg-vk: The configuration for " << name << " is invalid, exiting:\n";
|
std::cerr << "lsfg-vk: The configuration for " << name << " is invalid, exiting:\n";
|
||||||
std::cerr << e.what() << '\n';
|
std::cerr << e.what() << '\n';
|
||||||
exit(0);
|
Utils::showErrorGui(e.what());
|
||||||
}
|
}
|
||||||
|
|
||||||
// exit silently if not enabled
|
// exit silently if not enabled
|
||||||
|
|
@ -62,7 +63,7 @@ namespace {
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
std::cerr << "lsfg-vk: An error occurred while trying to extract the shaders, exiting:\n";
|
std::cerr << "lsfg-vk: An error occurred while trying to extract the shaders, exiting:\n";
|
||||||
std::cerr << "- " << e.what() << '\n';
|
std::cerr << "- " << e.what() << '\n';
|
||||||
exit(0);
|
Utils::showErrorGui(e.what());
|
||||||
}
|
}
|
||||||
std::cerr << "lsfg-vk: Shaders extracted successfully.\n";
|
std::cerr << "lsfg-vk: Shaders extracted successfully.\n";
|
||||||
|
|
||||||
|
|
@ -94,6 +95,7 @@ namespace {
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
std::cerr << "lsfg-vk: An error occurred while trying to parse the resolution, exiting:\n";
|
std::cerr << "lsfg-vk: An error occurred while trying to parse the resolution, exiting:\n";
|
||||||
std::cerr << "- " << e.what() << '\n';
|
std::cerr << "- " << e.what() << '\n';
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::thread benchmark([width, height]() {
|
std::thread benchmark([width, height]() {
|
||||||
|
|
@ -102,6 +104,7 @@ namespace {
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
std::cerr << "lsfg-vk: An error occurred during the benchmark:\n";
|
std::cerr << "lsfg-vk: An error occurred during the benchmark:\n";
|
||||||
std::cerr << "- " << e.what() << '\n';
|
std::cerr << "- " << e.what() << '\n';
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
benchmark.detach();
|
benchmark.detach();
|
||||||
|
|
|
||||||
86
src/utils/gui.cpp
Normal file
86
src/utils/gui.cpp
Normal file
|
|
@ -0,0 +1,86 @@
|
||||||
|
#include "utils/gui.hpp"
|
||||||
|
|
||||||
|
#include <raylib.h>
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstddef>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
using namespace Utils;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
void DrawCenteredText(const std::string& message, int y, Color color) {
|
||||||
|
const int textWidth = MeasureText(message.c_str(), 20);
|
||||||
|
DrawText(message.c_str(), (GetScreenWidth() - textWidth) / 2, y, 20, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
int DrawTextBox(std::string message, int x, int y, int width, bool draw) {
|
||||||
|
while (!message.empty()) {
|
||||||
|
std::string current = message;
|
||||||
|
|
||||||
|
// take one line at a time
|
||||||
|
const size_t pos = current.find('\n');
|
||||||
|
if (pos != std::string::npos)
|
||||||
|
current = current.substr(0, pos);
|
||||||
|
|
||||||
|
// if too long, remove word or character
|
||||||
|
while (MeasureText(message.c_str(), 20) > width) {
|
||||||
|
const size_t pos = current.find_last_of(' ');
|
||||||
|
if (pos == std::string::npos)
|
||||||
|
current = current.substr(0, current.size() - 1);
|
||||||
|
else
|
||||||
|
current = current.substr(0, pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove the current line from the message text
|
||||||
|
message = message.substr(current.size());
|
||||||
|
while (message.starts_with(' '))
|
||||||
|
message = message.substr(1); // remove leading space
|
||||||
|
while (message.starts_with('\n'))
|
||||||
|
message = message.substr(1); // remove leading newline
|
||||||
|
|
||||||
|
// draw the current line
|
||||||
|
if (draw) DrawText(current.c_str(), x, y, 20, Color { 198, 173, 173, 255 });
|
||||||
|
y += 25; // move down for the next line
|
||||||
|
}
|
||||||
|
return y; // return height of the text box
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Utils::showErrorGui(const std::string& message) {
|
||||||
|
const int height = DrawTextBox(message, 10, 60, 780, false);
|
||||||
|
InitWindow(800, height + 80, "lsfg-vk - Error");
|
||||||
|
|
||||||
|
SetTargetFPS(24); // cinema frame rate lol
|
||||||
|
|
||||||
|
while (!WindowShouldClose()) {
|
||||||
|
BeginDrawing();
|
||||||
|
|
||||||
|
ClearBackground(Color{ 58, 23, 32, 255 });
|
||||||
|
DrawCenteredText("lsfg-vk encountered an error", 10, Color{ 225, 115, 115, 255 });
|
||||||
|
DrawLine(10, 35, 790, 35, Color{ 218, 87, 87, 255 });
|
||||||
|
DrawTextBox(message, 10, 60, 780, true);
|
||||||
|
|
||||||
|
const bool hover = GetMouseY() > height + 30
|
||||||
|
&& GetMouseY() < height + 70
|
||||||
|
&& GetMouseX() > 10
|
||||||
|
&& GetMouseX() < 790;
|
||||||
|
if (hover) {
|
||||||
|
DrawRectangleLines(10, height + 30, 780, 40, Color{ 250, 170, 151, 255 });
|
||||||
|
DrawCenteredText("Press Escape or click here to close", height + 40, Color{ 253, 180, 170, 255 });
|
||||||
|
} else {
|
||||||
|
DrawRectangleLines(10, height + 30, 780, 40, Color{ 218, 87, 87, 255 });
|
||||||
|
DrawCenteredText("Press Escape or click here to close", height + 40, Color{ 225, 115, 115, 255 });
|
||||||
|
}
|
||||||
|
|
||||||
|
EndDrawing();
|
||||||
|
|
||||||
|
if (hover && IsMouseButtonPressed(MOUSE_BUTTON_LEFT))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseWindow();
|
||||||
|
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
1
thirdparty/raylib
vendored
Submodule
1
thirdparty/raylib
vendored
Submodule
|
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 78a06990c7c55ace00a8e6c5afe983457304e645
|
||||||
Loading…
Add table
Reference in a new issue