#pragma once #ifdef IMGUI_FRONTEND #include #include #include #include #include #include "fsui/fsui.hpp" class Emulator; class PandaFsuiAdapter { public: enum class ClassicUiRequest { None, Return, OpenSettings, }; PandaFsuiAdapter(SDL_Window* window, Emulator& emu); bool initialize(const fsui::FontStack& fonts); void shutdown(bool clear_state); void render(); void consumeCommands(); void setSelectorMode(bool selector_mode); bool isSelectorMode() const; bool hasActiveWindow() const; void openPauseMenu(); void returnToPreviousWindow(); void returnToMainWindow(); void switchToSettings(); std::optional consumeLaunchPath(); bool consumeCloseSelector(); ClassicUiRequest consumeClassicUiRequest(); void setPauseCallback(std::function callback); void setVsyncCallback(std::function callback); void setExitToSelectorCallback(std::function callback); private: struct ParsedMetadata; struct LanguageOption; void syncUiStateFromConfig(); void persistUiState(bool reload); void seedGameListPathsIfNeeded(); std::vector currentScanRoots() const; bool hasSupportedExtension(const std::filesystem::path& path) const; std::vector buildGameList(); std::vector buildSettingsPages(fsui::SettingsScope scope); fsui::CurrentGameInfo buildCurrentGameInfo(); std::vector buildLandingItems(); std::vector buildStartItems(); std::vector buildExitItems(); std::vector buildPauseItems(); std::vector buildGameLaunchOptions(const fsui::GameEntry& entry); std::optional readMetadataForPath(const std::filesystem::path& path) const; fsui::GameEntry buildGameListEntry(const std::filesystem::directory_entry& entry) const; std::filesystem::path defaultCoverDirectory() const; std::filesystem::path findCoverPath(const std::filesystem::path& rom_path, const std::string& title_id) const; std::string currentGameTitle() const; std::string currentGameSubtitle() const; std::string formatPercent(float value) const; std::string formatInteger(int value) const; std::string formatTitleId(std::uint64_t program_id) const; std::vector buildPerformanceOverlayLines() const; std::vector buildSettingsOverlayLines() const; std::vector buildInputOverlayDevices() const; void openFileAndLaunch(); void requestLaunchPath(const std::filesystem::path& path); void requestClassicUi(bool open_settings); void openUnsupportedPrompt(std::string title, std::string message) const; SDL_Window* window = nullptr; Emulator& emu; fsui::UiContext fsuiContext; fsui::UiState uiState; std::vector cachedGameList; std::optional pendingLaunchPath; bool closeSelectorRequested = false; ClassicUiRequest pendingClassicUiRequest = ClassicUiRequest::None; std::function onPauseChange; std::function onVsyncChange; std::function onExitToSelector; }; #endif