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"] | ||||
| 	path = thirdparty/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 | ||||
| add_compile_options(-fPIC | ||||
|     -Wno-deprecated-declarations | ||||
|     -Wno-unused-template) | ||||
|     -Wno-unused-template | ||||
|     -Wno-tautological-compare | ||||
|     -Wno-undef) | ||||
| 
 | ||||
| add_subdirectory(thirdparty/dxbc EXCLUDE_FROM_ALL) | ||||
| add_subdirectory(thirdparty/pe-parse/pe-parser-library EXCLUDE_FROM_ALL) | ||||
| add_subdirectory(thirdparty/toml11 EXCLUDE_FROM_ALL) | ||||
| add_subdirectory(thirdparty/raylib EXCLUDE_FROM_ALL) | ||||
| add_subdirectory(framegen) | ||||
| 
 | ||||
| 
 | ||||
| # main project | ||||
| project(lsfg-vk | ||||
|     VERSION 0.0.1 | ||||
|  | @ -43,7 +45,8 @@ set_target_properties(lsfg-vk PROPERTIES | |||
| target_include_directories(lsfg-vk | ||||
|     PRIVATE include) | ||||
| 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) | ||||
| 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 "extract/extract.hpp" | ||||
| #include "utils/benchmark.hpp" | ||||
| #include "utils/gui.hpp" | ||||
| #include "utils/utils.hpp" | ||||
| 
 | ||||
| #include <exception> | ||||
|  | @ -20,7 +21,7 @@ namespace { | |||
|         } catch (const std::exception& e) { | ||||
|             std::cerr << "lsfg-vk: An error occured while trying to parse the configuration, exiting:\n"; | ||||
|             std::cerr << "- " << e.what() << '\n'; | ||||
|             exit(0); | ||||
|             Utils::showErrorGui(e.what()); | ||||
|         } | ||||
| 
 | ||||
|         const std::string name = Utils::getProcessName(); | ||||
|  | @ -29,7 +30,7 @@ namespace { | |||
|         } catch (const std::exception& e) { | ||||
|             std::cerr << "lsfg-vk: The configuration for " << name << " is invalid, exiting:\n"; | ||||
|             std::cerr << e.what() << '\n'; | ||||
|             exit(0); | ||||
|             Utils::showErrorGui(e.what()); | ||||
|         } | ||||
| 
 | ||||
|         // exit silently if not enabled
 | ||||
|  | @ -62,7 +63,7 @@ namespace { | |||
|         } catch (const std::exception& e) { | ||||
|             std::cerr << "lsfg-vk: An error occurred while trying to extract the shaders, exiting:\n"; | ||||
|             std::cerr << "- " << e.what() << '\n'; | ||||
|             exit(0); | ||||
|             Utils::showErrorGui(e.what()); | ||||
|         } | ||||
|         std::cerr << "lsfg-vk: Shaders extracted successfully.\n"; | ||||
| 
 | ||||
|  | @ -94,6 +95,7 @@ namespace { | |||
|         } catch (const std::exception& e) { | ||||
|             std::cerr << "lsfg-vk: An error occurred while trying to parse the resolution, exiting:\n"; | ||||
|             std::cerr << "- " << e.what() << '\n'; | ||||
|             exit(EXIT_FAILURE); | ||||
|         } | ||||
| 
 | ||||
|         std::thread benchmark([width, height]() { | ||||
|  | @ -102,6 +104,7 @@ namespace { | |||
|             } catch (const std::exception& e) { | ||||
|                 std::cerr << "lsfg-vk: An error occurred during the benchmark:\n"; | ||||
|                 std::cerr << "- " << e.what() << '\n'; | ||||
|                 exit(EXIT_FAILURE); | ||||
|             } | ||||
|         }); | ||||
|         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
	
	 PancakeTAS
						PancakeTAS