Refactor window management and renderer integration for improved structure
- Replaced platform backend references with a dedicated Window class for better encapsulation of window and audio device management. - Updated various files to include the new window header, enhancing clarity and reducing dependencies on the platform backend. - Removed obsolete platform backend code to streamline the codebase and improve maintainability. - Refactored controller and editor classes to utilize the new window management system, ensuring consistent handling of window creation and rendering.
This commit is contained in:
@@ -2,15 +2,9 @@
|
||||
|
||||
#include <SDL.h>
|
||||
|
||||
#include <filesystem>
|
||||
#include <memory>
|
||||
|
||||
#include "absl/status/status.h"
|
||||
#include "absl/strings/str_format.h"
|
||||
#include "app/core/platform/file_dialog.h"
|
||||
#include "app/core/platform/font_loader.h"
|
||||
#include "app/core/window.h"
|
||||
#include "app/editor/editor_manager.h"
|
||||
#include "app/gui/style.h"
|
||||
#include "imgui/backends/imgui_impl_sdl2.h"
|
||||
#include "imgui/backends/imgui_impl_sdlrenderer2.h"
|
||||
#include "imgui/imgui.h"
|
||||
@@ -18,39 +12,10 @@
|
||||
namespace yaze {
|
||||
namespace core {
|
||||
|
||||
namespace {
|
||||
// Helper function to draw the main window without docking enabled
|
||||
// Should be followed by ImGui::End() to close the window
|
||||
void DrawBasicWindow() {
|
||||
constexpr ImGuiWindowFlags kMainEditorFlags =
|
||||
ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse |
|
||||
ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_MenuBar |
|
||||
ImGuiWindowFlags_NoBringToFrontOnFocus | ImGuiWindowFlags_NoTitleBar;
|
||||
|
||||
const ImGuiIO &io = ImGui::GetIO();
|
||||
ImGui_ImplSDLRenderer2_NewFrame();
|
||||
ImGui_ImplSDL2_NewFrame();
|
||||
ImGui::NewFrame();
|
||||
ImGui::SetNextWindowPos(gui::kZeroPos);
|
||||
ImVec2 dimensions(io.DisplaySize.x, io.DisplaySize.y);
|
||||
ImGui::SetNextWindowSize(dimensions, ImGuiCond_Always);
|
||||
|
||||
if (!ImGui::Begin("##YazeMain", nullptr, kMainEditorFlags)) {
|
||||
ImGui::End();
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
absl::Status Controller::OnEntry(std::string filename) {
|
||||
RETURN_IF_ERROR(CreateWindow())
|
||||
RETURN_IF_ERROR(CreateRenderer())
|
||||
RETURN_IF_ERROR(CreateGuiContext())
|
||||
backend_.init_audio();
|
||||
// cast to Sdl2backend to access audio buffer and device
|
||||
auto &sdl2_backend = static_cast<Sdl2Backend &>(backend_);
|
||||
editor_manager_.emulator().set_audio_buffer(
|
||||
sdl2_backend.audio_buffer().get());
|
||||
editor_manager_.emulator().set_audio_device_id(sdl2_backend.audio_device());
|
||||
RETURN_IF_ERROR(CreateWindow(window_, SDL_WINDOW_RESIZABLE));
|
||||
editor_manager_.emulator().set_audio_buffer(window_.audio_buffer_.get());
|
||||
editor_manager_.emulator().set_audio_device_id(window_.audio_device_);
|
||||
Initialize(filename);
|
||||
return absl::OkStatus();
|
||||
}
|
||||
@@ -156,96 +121,7 @@ void Controller::DoRender() const {
|
||||
}
|
||||
|
||||
void Controller::OnExit() {
|
||||
backend_.shutdown_audio();
|
||||
ImGui_ImplSDLRenderer2_Shutdown();
|
||||
ImGui_ImplSDL2_Shutdown();
|
||||
ImGui::DestroyContext();
|
||||
SDL_Quit();
|
||||
}
|
||||
|
||||
absl::Status Controller::CreateWindow() {
|
||||
auto sdl_flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER;
|
||||
|
||||
if (SDL_Init(sdl_flags) != 0) {
|
||||
return absl::InternalError(
|
||||
absl::StrFormat("SDL_Init: %s\n", SDL_GetError()));
|
||||
}
|
||||
|
||||
SDL_DisplayMode display_mode;
|
||||
SDL_GetCurrentDisplayMode(0, &display_mode);
|
||||
int screen_width = display_mode.w * 0.8;
|
||||
int screen_height = display_mode.h * 0.8;
|
||||
|
||||
window_ = std::unique_ptr<SDL_Window, core::SDL_Deleter>(
|
||||
SDL_CreateWindow("Yet Another Zelda3 Editor", // window title
|
||||
SDL_WINDOWPOS_UNDEFINED, // initial x position
|
||||
SDL_WINDOWPOS_UNDEFINED, // initial y position
|
||||
screen_width, // width, in pixels
|
||||
screen_height, // height, in pixels
|
||||
SDL_WINDOW_RESIZABLE),
|
||||
core::SDL_Deleter());
|
||||
if (window_ == nullptr) {
|
||||
return absl::InternalError(
|
||||
absl::StrFormat("SDL_CreateWindow: %s\n", SDL_GetError()));
|
||||
}
|
||||
|
||||
return absl::OkStatus();
|
||||
}
|
||||
|
||||
absl::Status Controller::CreateRenderer() {
|
||||
return Renderer::Get().CreateRenderer(window_.get());
|
||||
}
|
||||
|
||||
absl::Status Controller::CreateGuiContext() {
|
||||
IMGUI_CHECKVERSION();
|
||||
ImGui::CreateContext();
|
||||
|
||||
ImGuiIO &io = ImGui::GetIO();
|
||||
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
|
||||
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;
|
||||
|
||||
// Initialize ImGui based on the backend
|
||||
ImGui_ImplSDL2_InitForSDLRenderer(window_.get(),
|
||||
Renderer::Get().renderer());
|
||||
ImGui_ImplSDLRenderer2_Init(Renderer::Get().renderer());
|
||||
|
||||
RETURN_IF_ERROR(LoadPackageFonts());
|
||||
|
||||
// Set the default style
|
||||
gui::ColorsYaze();
|
||||
|
||||
// Build a new ImGui frame
|
||||
backend_.new_frame();
|
||||
|
||||
return absl::OkStatus();
|
||||
}
|
||||
|
||||
absl::Status Controller::LoadConfigFiles() {
|
||||
// Create and load a dotfile for the application
|
||||
// This will store the user's preferences and settings
|
||||
std::string config_directory = GetConfigDirectory();
|
||||
|
||||
// Create the directory if it doesn't exist
|
||||
if (!std::filesystem::exists(config_directory)) {
|
||||
if (!std::filesystem::create_directory(config_directory)) {
|
||||
return absl::InternalError(absl::StrFormat(
|
||||
"Failed to create config directory %s", config_directory));
|
||||
}
|
||||
}
|
||||
|
||||
// Check if the config file exists
|
||||
std::string config_file = config_directory + "yaze.cfg";
|
||||
if (!std::filesystem::exists(config_file)) {
|
||||
// Create the file if it doesn't exist
|
||||
std::ofstream file(config_file);
|
||||
if (!file.is_open()) {
|
||||
return absl::InternalError(
|
||||
absl::StrFormat("Failed to create config file %s", config_file));
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
|
||||
return absl::OkStatus();
|
||||
PRINT_IF_ERROR(ShutdownWindow(window_));
|
||||
}
|
||||
|
||||
} // namespace core
|
||||
|
||||
Reference in New Issue
Block a user