From afcdcfc8d13945f3862cd5dae4c2101b4ae04db8 Mon Sep 17 00:00:00 2001 From: Alexander Yee Date: Sun, 13 Sep 2026 03:57:20 -0700 Subject: [PATCH 1/4] MultiConsolePanel --- Common/Cpp/EarlyShutdown.h | 3 + .../CommonFramework/Panels/OptionsPanel.h | 5 + .../Source/GameConsole/ConsolePanel.h | 5 +- .../Source/GameConsole/ConsoleSystemSession.h | 7 +- .../Source/GameConsole/MultiConsolePanel.cpp | 112 +++++++++++++ .../Source/GameConsole/MultiConsolePanel.h | 153 ++++++++++++++++++ .../GameConsole/MultiConsolePanelSession.cpp | 70 ++++++++ .../GameConsole/MultiConsolePanelSession.h | 57 +++++++ .../GameConsole/MultiConsoleSystemOption.cpp | 9 +- .../GameConsole/MultiConsoleSystemOption.h | 14 +- .../GameConsole/MultiConsoleSystemSession.cpp | 25 ++- .../GameConsole/MultiConsoleSystemSession.h | 34 ++-- .../{BoxDraw.cpp => GameConsole_BoxDraw.cpp} | 2 +- .../{BoxDraw.h => GameConsole_BoxDraw.h} | 0 .../Panels/GameConsole_SwitchViewer.h | 40 +++++ ...Console.h => GameConsole_VirtualConsole.h} | 0 .../GameConsole/UI/ConsolePanelWidget.cpp | 20 +-- .../GameConsole/UI/ConsolePanelWidget.h | 5 - .../UI/MultiConsolePanelWidget.cpp | 106 ++++++++++++ .../GameConsole/UI/MultiConsolePanelWidget.h | 40 +++++ .../NintendoSwitch_MultiSwitchSystemOption.h | 8 +- .../NintendoSwitch/NintendoSwitch_Panels.cpp | 9 +- .../Programs/NintendoSwitch_SwitchViewer.cpp | 81 ---------- .../Programs/NintendoSwitch_SwitchViewer.h | 62 ------- .../Source/StaticRegistrationQt.cpp | 4 +- SerialPrograms/cmake/SourceFiles.cmake | 15 +- 26 files changed, 676 insertions(+), 210 deletions(-) create mode 100644 SerialPrograms/Source/GameConsole/MultiConsolePanel.cpp create mode 100644 SerialPrograms/Source/GameConsole/MultiConsolePanel.h create mode 100644 SerialPrograms/Source/GameConsole/MultiConsolePanelSession.cpp create mode 100644 SerialPrograms/Source/GameConsole/MultiConsolePanelSession.h rename SerialPrograms/Source/GameConsole/Panels/{BoxDraw.cpp => GameConsole_BoxDraw.cpp} (89%) rename SerialPrograms/Source/GameConsole/Panels/{BoxDraw.h => GameConsole_BoxDraw.h} (100%) create mode 100644 SerialPrograms/Source/GameConsole/Panels/GameConsole_SwitchViewer.h rename SerialPrograms/Source/GameConsole/Panels/{VirtualConsole.h => GameConsole_VirtualConsole.h} (100%) create mode 100644 SerialPrograms/Source/GameConsole/UI/MultiConsolePanelWidget.cpp create mode 100644 SerialPrograms/Source/GameConsole/UI/MultiConsolePanelWidget.h delete mode 100644 SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.cpp delete mode 100644 SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.h diff --git a/Common/Cpp/EarlyShutdown.h b/Common/Cpp/EarlyShutdown.h index d161800c62..ebfca6a947 100644 --- a/Common/Cpp/EarlyShutdown.h +++ b/Common/Cpp/EarlyShutdown.h @@ -35,6 +35,9 @@ void blocking_shutdown( } +struct TryShutdownable{ + virtual bool try_shutdown() noexcept = 0; +}; } diff --git a/SerialPrograms/Source/CommonFramework/Panels/OptionsPanel.h b/SerialPrograms/Source/CommonFramework/Panels/OptionsPanel.h index 88640dddfe..68daa5df18 100644 --- a/SerialPrograms/Source/CommonFramework/Panels/OptionsPanel.h +++ b/SerialPrograms/Source/CommonFramework/Panels/OptionsPanel.h @@ -2,6 +2,11 @@ * * From: https://github.com/PokemonAutomation/ * + * ConsolePanel is a panel with: + * - Has options. + * - Has no console. + * - Cannot be run. + * */ #ifndef PokemonAutomation_OptionsPanel_H diff --git a/SerialPrograms/Source/GameConsole/ConsolePanel.h b/SerialPrograms/Source/GameConsole/ConsolePanel.h index 85a411a340..b2d222f27f 100644 --- a/SerialPrograms/Source/GameConsole/ConsolePanel.h +++ b/SerialPrograms/Source/GameConsole/ConsolePanel.h @@ -2,7 +2,10 @@ * * From: https://github.com/PokemonAutomation/ * - * ConsolePanel is a panel with a console and options. It cannot be run. + * ConsolePanel is a panel with: + * - Has options. + * - Has a console. + * - Cannot be run. * */ diff --git a/SerialPrograms/Source/GameConsole/ConsoleSystemSession.h b/SerialPrograms/Source/GameConsole/ConsoleSystemSession.h index 07860fd182..2de1cf43c4 100644 --- a/SerialPrograms/Source/GameConsole/ConsoleSystemSession.h +++ b/SerialPrograms/Source/GameConsole/ConsoleSystemSession.h @@ -20,8 +20,9 @@ #ifndef PokemonAutomation_GameConsole_ConsoleSystemSession_H #define PokemonAutomation_GameConsole_ConsoleSystemSession_H -#include "Common/Cpp/Logging/TaggedLogger.h" #include "Common/Cpp/UiWrapper.h" +#include "Common/Cpp/EarlyShutdown.h" +#include "Common/Cpp/Logging/TaggedLogger.h" #include "CommonFramework/AudioPipeline/AudioSession.h" #include "CommonFramework/VideoPipeline/VideoSession.h" #include "CommonFramework/VideoPipeline/VideoOverlaySession.h" @@ -40,6 +41,7 @@ namespace GameConsole{ class ConsoleSystemSession : public UiState + , public TryShutdownable , public TrackableConsole , private VideoDisplayHidListener , private ControllerInputListener @@ -60,8 +62,9 @@ class ConsoleSystemSession public: - virtual bool try_shutdown() noexcept; + virtual bool try_shutdown() noexcept override; virtual ~ConsoleSystemSession(); + ConsoleSystemSession( Logger& logger, ConsoleSystemOption& option, diff --git a/SerialPrograms/Source/GameConsole/MultiConsolePanel.cpp b/SerialPrograms/Source/GameConsole/MultiConsolePanel.cpp new file mode 100644 index 0000000000..7540cee1f7 --- /dev/null +++ b/SerialPrograms/Source/GameConsole/MultiConsolePanel.cpp @@ -0,0 +1,112 @@ +/* Multi-Console Panel + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#include "Common/Cpp/Logging/GlobalLogger.h" +#include "ConsoleSystemSession.h" +#include "MultiConsolePanelSession.h" +#include "MultiConsolePanel.h" + +namespace PokemonAutomation{ +namespace GameConsole{ + + +MultiConsolePanelDescriptor::MultiConsolePanelDescriptor( + Color color, + std::string identifier, + std::string category, std::string display_name, + std::string doc_link, + std::string description, + PanelDeprecation deprecation, + size_t min_consoles, + size_t max_consoles, + size_t default_consoles, + bool restore_defaults_button +) + : MultiConsolePanelDescriptor( + color, + std::move(identifier), + std::move(category), std::move(display_name), + std::move(doc_link), + std::move(description), + deprecation, + min_consoles, + max_consoles, + default_consoles, + restore_defaults_button, + [](size_t console_index){ + return std::make_unique(1); + }, + [](ConsoleSystemOption& option, size_t console_index){ + return std::make_unique( + global_logger_raw(), + option, + true, + console_index, + std::nullopt + ); + } + ) +{} +MultiConsolePanelDescriptor::MultiConsolePanelDescriptor( + Color color, + std::string identifier, + std::string category, std::string display_name, + std::string doc_link, + std::string description, + PanelDeprecation deprecation, + size_t min_consoles, + size_t max_consoles, + size_t default_consoles, + bool restore_defaults_button, + OptionFactory option_factory, + SessionFactory session_factory +) + : PanelDescriptor( + color, + std::move(identifier), + std::move(category), std::move(display_name), + std::move(doc_link), + std::move(description), + deprecation + ) + , m_restore_defaults_button(restore_defaults_button) + , m_min_consoles(min_consoles) + , m_max_consoles(max_consoles) + , m_default_consoles(default_consoles) + , m_option_factory(std::move(option_factory)) + , m_session_factory(std::move(session_factory)) +{} +std::unique_ptr MultiConsolePanelDescriptor::make_panel() const{ + return std::make_unique(*this); +} + + + +MultiConsolePanelInstance::MultiConsolePanelInstance() + : m_options(LockMode::UNLOCK_WHILE_RUNNING) +{} + +void MultiConsolePanelInstance::add_option(ConfigOption& option, std::string serialization_string){ + m_options.add_option(option, std::move(serialization_string)); +} + +std::string MultiConsolePanelInstance::check_validity() const{ + return m_options.check_validity(); +} +void MultiConsolePanelInstance::restore_defaults(){ + return m_options.restore_defaults(); +} +JsonValue MultiConsolePanelInstance::to_json() const{ + return m_options.to_json(); +} +void MultiConsolePanelInstance::load_json(const JsonValue& json){ + m_options.load_json(json); +} + + + +} +} diff --git a/SerialPrograms/Source/GameConsole/MultiConsolePanel.h b/SerialPrograms/Source/GameConsole/MultiConsolePanel.h new file mode 100644 index 0000000000..f5d18758e0 --- /dev/null +++ b/SerialPrograms/Source/GameConsole/MultiConsolePanel.h @@ -0,0 +1,153 @@ +/* Multi-Console Panel + * + * From: https://github.com/PokemonAutomation/ + * + * ConsolePanel is a panel with: + * - Has options. + * - Has multiple consoles. + * - Cannot be run. + * + */ + +#ifndef PokemonAutomation_GameConsole_MultiConsolePanel_H +#define PokemonAutomation_GameConsole_MultiConsolePanel_H + +#include +#include "Common/Cpp/Options/BatchOption.h" +#include "CommonFramework/Panels/PanelDescriptor.h" + +namespace PokemonAutomation{ +namespace GameConsole{ + +class ConsoleSystemOption; +class ConsoleSystemSession; +class MultiConsoleSystemSession; +class MultiConsolePanelInstance; + + + +class MultiConsolePanelDescriptor : public PanelDescriptor{ +public: + using OptionFactory = std::function< + std::unique_ptr( + size_t console_index + ) + >; + using SessionFactory = std::function< + std::unique_ptr( + ConsoleSystemOption& option, + size_t console_index + ) + >; + + MultiConsolePanelDescriptor( + Color color, + std::string identifier, + std::string category, std::string display_name, + std::string doc_link, + std::string description, + PanelDeprecation deprecation, + size_t min_consoles, + size_t max_consoles, + size_t default_consoles, + bool restore_defaults_button = true + ); + MultiConsolePanelDescriptor( + Color color, + std::string identifier, + std::string category, std::string display_name, + std::string doc_link, + std::string description, + PanelDeprecation deprecation, + size_t min_consoles, + size_t max_consoles, + size_t default_consoles, + bool restore_defaults_button, + OptionFactory option_factory, + SessionFactory session_factory + ); + + bool restore_defaults_button() const{ return m_restore_defaults_button; } + size_t min_consoles() const{ return m_min_consoles; } + size_t max_consoles() const{ return m_max_consoles; } + size_t default_consoles() const{ return m_default_consoles; } + + const OptionFactory& option_factory() const{ return m_option_factory; } + const SessionFactory& session_factory() const{ return m_session_factory; } + + size_t num_controllers(size_t index) const{ return m_num_controllers[index]; } + + virtual std::unique_ptr make_panel() const override; + virtual std::unique_ptr make_instance(MultiConsoleSystemSession& system) const = 0; + + +private: + const bool m_restore_defaults_button; + size_t m_min_consoles; + size_t m_max_consoles; + size_t m_default_consoles; + std::vector m_num_controllers; + + OptionFactory m_option_factory; + SessionFactory m_session_factory; +}; + + + + +class MultiConsolePanelInstance{ +public: + virtual ~MultiConsolePanelInstance() = default; + MultiConsolePanelInstance(const MultiConsolePanelInstance&) = delete; + void operator=(const MultiConsolePanelInstance&) = delete; + + +public: + MultiConsolePanelInstance(); + + +public: + // Serialization + + virtual std::string check_validity() const; + virtual void restore_defaults(); + virtual JsonValue to_json() const; + virtual void load_json(const JsonValue& json); + + +protected: + friend class MultiConsolePanelSession; + + BatchOption m_options; + void add_option(ConfigOption& option, std::string serialization_string); + +}; + + + + +template +class MultiConsolePanelWrapper : public Descriptor{ +public: + virtual std::unique_ptr make_instance( + MultiConsoleSystemSession& system + ) const override{ + if constexpr (std::is_constructible_v){ + return std::make_unique(system); + }else{ + return std::make_unique(); + } + } +}; + +template +std::unique_ptr make_MultiConsolePanel(){ + return std::make_unique>(); +} + + + + +} +} +#endif diff --git a/SerialPrograms/Source/GameConsole/MultiConsolePanelSession.cpp b/SerialPrograms/Source/GameConsole/MultiConsolePanelSession.cpp new file mode 100644 index 0000000000..0f16d2dcb9 --- /dev/null +++ b/SerialPrograms/Source/GameConsole/MultiConsolePanelSession.cpp @@ -0,0 +1,70 @@ +/* Multi-Console Panel Session + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#include "Common/Cpp/EarlyShutdown.h" +#include "Common/Cpp/Logging/GlobalLogger.h" +#include "Common/Cpp/Json/JsonValue.h" +#include "Common/Cpp/Json/JsonObject.h" +#include "CommonFramework/Logging/Logger.h" +#include "MultiConsolePanelSession.h" + +namespace PokemonAutomation{ +namespace GameConsole{ + + + +bool MultiConsolePanelSession::try_shutdown(){ + return m_system.try_shutdown(); +} +MultiConsolePanelSession::~MultiConsolePanelSession(){ + blocking_shutdown( + global_logger_tagged(), + "ConsolePanelSession", + [this]{ return try_shutdown(); } + ); +} +MultiConsolePanelSession::MultiConsolePanelSession(const MultiConsolePanelDescriptor& descriptor) + : UiState(descriptor) + , m_descriptor(descriptor) + , m_system_option( + descriptor.min_consoles(), + descriptor.max_consoles(), + descriptor.default_consoles(), + descriptor.option_factory() + ) + , m_system(m_system_option, descriptor.session_factory()) + , m_instance(descriptor.make_instance(m_system)) +{} + +ConfigOption& MultiConsolePanelSession::options(){ + return m_instance->m_options; +} + + +void MultiConsolePanelSession::restore_defaults(){ + m_instance->restore_defaults(); +} +JsonValue MultiConsolePanelSession::to_json() const{ + JsonObject obj = std::move(*m_instance->to_json().to_object()); + obj["ConsoleSetup"] = m_system_option.to_json(); + return obj; +} +void MultiConsolePanelSession::load_json(const JsonValue& json){ + const JsonObject* obj = json.to_object(); + if (obj == nullptr){ + return; + } + const JsonValue* value = obj->get_value("ConsoleSetup"); + if (value){ + m_system.load_json(*value); + } + m_instance->load_json(json); +} + + + +} +} diff --git a/SerialPrograms/Source/GameConsole/MultiConsolePanelSession.h b/SerialPrograms/Source/GameConsole/MultiConsolePanelSession.h new file mode 100644 index 0000000000..16c703f590 --- /dev/null +++ b/SerialPrograms/Source/GameConsole/MultiConsolePanelSession.h @@ -0,0 +1,57 @@ +/* Multi-Console Panel Session + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#ifndef PokemonAutomation_GameConsole_MultiConsolePanelSession_H +#define PokemonAutomation_GameConsole_MultiConsolePanelSession_H + +#include "CommonFramework/Panels/PanelSession.h" +#include "MultiConsoleSystemSession.h" +#include "MultiConsolePanel.h" + +namespace PokemonAutomation{ +namespace GameConsole{ + + + +class MultiConsolePanelSession final : public UiState{ +public: + bool try_shutdown(); + ~MultiConsolePanelSession(); + MultiConsolePanelSession(const MultiConsolePanelDescriptor& descriptor); + + +public: + const MultiConsolePanelDescriptor& descriptor() const{ return m_descriptor; } + + Logger& logger(){ return m_system.logger(); } + MultiConsoleSystemSession& system(){ return m_system; } + ConfigOption& options(); + + +public: + // Serialization + + void restore_defaults(); + virtual JsonValue to_json() const override; + virtual void load_json(const JsonValue& json) override; + + +private: + const MultiConsolePanelDescriptor& m_descriptor; + + MultiConsoleSystemOption m_system_option; + MultiConsoleSystemSession m_system; + + std::unique_ptr m_instance; +}; + + + + + +} +} +#endif diff --git a/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.cpp b/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.cpp index 6d93c83a39..e4991845ec 100644 --- a/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.cpp +++ b/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.cpp @@ -22,7 +22,7 @@ MultiConsoleSystemOption::MultiConsoleSystemOption( size_t min_consoles, size_t max_consoles, size_t consoles, - std::function()> factory + const OptionFactory& option_factory ) : m_min_consoles(std::max(min_consoles, (size_t)1)) , m_max_consoles(std::min(max_consoles, (size_t)MAX_CONSOLES)) @@ -30,7 +30,7 @@ MultiConsoleSystemOption::MultiConsoleSystemOption( , m_consoles(m_max_consoles) { for (size_t c = 0; c < m_max_consoles; c++){ - m_consoles.emplace_back(factory()); + m_consoles.emplace_back(option_factory(c)); } consoles = std::max(consoles, m_min_consoles); consoles = std::min(consoles, m_max_consoles); @@ -40,9 +40,9 @@ MultiConsoleSystemOption::MultiConsoleSystemOption( size_t min_consoles, size_t max_consoles, const JsonValue& json, - std::function()> factory + const OptionFactory& option_factory ) - : MultiConsoleSystemOption(min_consoles, max_consoles, 0, std::move(factory)) + : MultiConsoleSystemOption(min_consoles, max_consoles, 0, option_factory) { MultiConsoleSystemOption::load_json(json); } @@ -78,7 +78,6 @@ void MultiConsoleSystemOption::load_json(const JsonValue& json){ for (; c < stop; c++){ m_consoles[c]->load_json((*array)[c]); } - m_active_consoles = c; } } } diff --git a/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.h b/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.h index 638cefdf33..5ebe1950cb 100644 --- a/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.h +++ b/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.h @@ -21,11 +21,21 @@ class MultiConsoleSystemOption{ public: virtual ~MultiConsoleSystemOption(); + + using OptionFactory = std::function< + std::unique_ptr( + size_t console_index + ) + >; + + // Construct the multi-console option. + // By default it constructs the generic console. But you can inject your + // own factory for your own custom subclass. MultiConsoleSystemOption( size_t min_consoles, size_t max_consoles, size_t consoles, - std::function()> factory = []{ + const OptionFactory& option_factory = [](size_t console_index){ return std::make_unique(1); } ); @@ -33,7 +43,7 @@ class MultiConsoleSystemOption{ size_t min_consoles, size_t max_consoles, const JsonValue& json, - std::function()> factory = []{ + const OptionFactory& option_factory = [](size_t console_index){ return std::make_unique(1); } ); diff --git a/SerialPrograms/Source/GameConsole/MultiConsoleSystemSession.cpp b/SerialPrograms/Source/GameConsole/MultiConsoleSystemSession.cpp index f2a967eabe..78e9ecb924 100644 --- a/SerialPrograms/Source/GameConsole/MultiConsoleSystemSession.cpp +++ b/SerialPrograms/Source/GameConsole/MultiConsoleSystemSession.cpp @@ -25,7 +25,7 @@ void MultiConsoleSystemSession::remove_listener(Listener& listener){ m_listeners.remove(listener); } -bool MultiConsoleSystemSession::try_shutdown(){ +bool MultiConsoleSystemSession::try_shutdown() noexcept{ bool success = true; for (std::unique_ptr& console : m_consoles){ success &= console->try_shutdown(); @@ -34,9 +34,9 @@ bool MultiConsoleSystemSession::try_shutdown(){ } MultiConsoleSystemSession::~MultiConsoleSystemSession(){ blocking_shutdown( - global_logger_tagged(), + m_logger, "MultiConsoleSystemSession", - [this]{ return try_shutdown(); } + [this]{ return MultiConsoleSystemSession::try_shutdown(); } ); } @@ -60,21 +60,18 @@ MultiConsoleSystemSession::MultiConsoleSystemSession( {} MultiConsoleSystemSession::MultiConsoleSystemSession( MultiConsoleSystemOption& option, - std::function< - std::unique_ptr( - ConsoleSystemOption& option, - size_t console_index - ) - > factory + SessionFactory session_factory ) - : m_option(option) + : m_logger(global_logger_tagged()) + , m_option(option) , m_consoles(option.active_consoles()) - , m_factory(std::move(factory)) + , m_session_factory(std::move(session_factory)) { size_t count = option.active_consoles(); for (size_t c = 0; c < count; c++){ - m_consoles.emplace_back(m_factory(option[c], c)); + m_consoles.emplace_back(m_session_factory(option[c], c)); } +// cout << "MultiConsoleSystemSession(): count = " << count << endl; } void MultiConsoleSystemSession::lock_controllers(const std::string& reason){ @@ -130,7 +127,7 @@ void MultiConsoleSystemSession::set_active_consoles(size_t count){ m_consoles.reset(count); m_option.resize(count); for (size_t c = 0; c < count; c++){ - m_consoles.emplace_back(m_factory(m_option[c], c)); + m_consoles.emplace_back(m_session_factory(m_option[c], c)); } } @@ -144,11 +141,11 @@ JsonValue MultiConsoleSystemSession::to_json() const{ return m_option.to_json(); } void MultiConsoleSystemSession::load_json(const JsonValue& json){ -// cout << "MultiConsoleSystemSession::load_json()" << endl; { std::lock_guard lg(m_state_lock); m_option.load_json(json); } +// cout << "MultiConsoleSystemSession::load_json(): " << m_option.active_consoles() << endl; set_active_consoles(m_option.active_consoles()); } diff --git a/SerialPrograms/Source/GameConsole/MultiConsoleSystemSession.h b/SerialPrograms/Source/GameConsole/MultiConsoleSystemSession.h index 3747d4e547..fd95a71e3f 100644 --- a/SerialPrograms/Source/GameConsole/MultiConsoleSystemSession.h +++ b/SerialPrograms/Source/GameConsole/MultiConsoleSystemSession.h @@ -17,7 +17,10 @@ namespace PokemonAutomation{ namespace GameConsole{ -class MultiConsoleSystemSession : public UiState{ +class MultiConsoleSystemSession + : public UiState + , public TryShutdownable +{ public: struct Listener{ // Called when the console count is locked or unlocked. @@ -38,9 +41,19 @@ class MultiConsoleSystemSession : public UiState{ public: - bool try_shutdown(); + virtual bool try_shutdown() noexcept override; virtual ~MultiConsoleSystemSession(); + using SessionFactory = std::function< + std::unique_ptr( + ConsoleSystemOption& option, + size_t console_index + ) + >; + + // Construct the multi-console session. + // By default it constructs the generic console. But you can inject your + // own factory for your own custom subclass. MultiConsoleSystemSession( MultiConsoleSystemOption& option, bool allow_commands_while_locked, @@ -48,16 +61,13 @@ class MultiConsoleSystemSession : public UiState{ ); MultiConsoleSystemSession( MultiConsoleSystemOption& option, - std::function< - std::unique_ptr( - ConsoleSystemOption& option, - size_t console_index - ) - > factory + SessionFactory session_factory ); public: + Logger& logger(){ return m_logger; } + // These are not thread-safe with "resize()". size_t min_consoles() const{ return m_option.min_consoles(); } size_t max_consoles() const{ return m_option.max_consoles(); } @@ -85,17 +95,13 @@ class MultiConsoleSystemSession : public UiState{ private: + Logger& m_logger; MultiConsoleSystemOption& m_option; Mutex m_resize_lock; FixedLimitVector> m_consoles; - std::function< - std::unique_ptr( - ConsoleSystemOption& option, - size_t console_index - ) - > m_factory; + SessionFactory m_session_factory; // Listeners who are currently locking the console count. // It is not safe to change the console count if this is not zero. diff --git a/SerialPrograms/Source/GameConsole/Panels/BoxDraw.cpp b/SerialPrograms/Source/GameConsole/Panels/GameConsole_BoxDraw.cpp similarity index 89% rename from SerialPrograms/Source/GameConsole/Panels/BoxDraw.cpp rename to SerialPrograms/Source/GameConsole/Panels/GameConsole_BoxDraw.cpp index 0498b6738f..9f3710958a 100644 --- a/SerialPrograms/Source/GameConsole/Panels/BoxDraw.cpp +++ b/SerialPrograms/Source/GameConsole/Panels/GameConsole_BoxDraw.cpp @@ -5,7 +5,7 @@ */ #include "GameConsole/ConsoleSystemSession.h" -#include "BoxDraw.h" +#include "GameConsole_BoxDraw.h" //#include //using std::cout; diff --git a/SerialPrograms/Source/GameConsole/Panels/BoxDraw.h b/SerialPrograms/Source/GameConsole/Panels/GameConsole_BoxDraw.h similarity index 100% rename from SerialPrograms/Source/GameConsole/Panels/BoxDraw.h rename to SerialPrograms/Source/GameConsole/Panels/GameConsole_BoxDraw.h diff --git a/SerialPrograms/Source/GameConsole/Panels/GameConsole_SwitchViewer.h b/SerialPrograms/Source/GameConsole/Panels/GameConsole_SwitchViewer.h new file mode 100644 index 0000000000..5d1fb059eb --- /dev/null +++ b/SerialPrograms/Source/GameConsole/Panels/GameConsole_SwitchViewer.h @@ -0,0 +1,40 @@ +/* Multi-Console Viewer + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#ifndef PokemonAutomation_GameConsole_MultiConsoleViewer_H +#define PokemonAutomation_GameConsole_MultiConsoleViewer_H + +#include "GameConsole/MultiConsolePanel.h" + +namespace PokemonAutomation{ +namespace GameConsole{ + + + +class MultiConsoleViewer_Descriptor : public MultiConsolePanelDescriptor{ +public: + MultiConsoleViewer_Descriptor() + : MultiConsolePanelDescriptor( + Color(), + "GameConsole:MultiConsoleViewer", + "Game Console", + "Multi-Console Viewer", + "Programs/NintendoSwitch/SwitchViewer.html", + "View multiple consoles simultaneously. Use this to figure out your camera/audio/controller mappings.", + PanelDeprecation::NOT_DEPRECATED, + 1, 4, 2, + false + ) + {} +}; + + + + + +} +} +#endif diff --git a/SerialPrograms/Source/GameConsole/Panels/VirtualConsole.h b/SerialPrograms/Source/GameConsole/Panels/GameConsole_VirtualConsole.h similarity index 100% rename from SerialPrograms/Source/GameConsole/Panels/VirtualConsole.h rename to SerialPrograms/Source/GameConsole/Panels/GameConsole_VirtualConsole.h diff --git a/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.cpp b/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.cpp index 1708a0e928..3fc4d222c1 100644 --- a/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.cpp +++ b/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.cpp @@ -4,6 +4,7 @@ * */ +#include #include #include #include @@ -34,8 +35,8 @@ ConsolePanelWidget::ConsolePanelWidget( : QWidget(&parent) , m_session(session) { - m_layout = new QVBoxLayout(this); - m_layout->setContentsMargins(0, 0, 0, 0); + QVBoxLayout* layout = new QVBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); const ConsolePanelDescriptor& descriptor = session.descriptor(); @@ -45,12 +46,11 @@ ConsolePanelWidget::ConsolePanelWidget( descriptor.doc_link(), descriptor.description() ); - m_layout->addWidget(header); - + layout->addWidget(header); { QScrollArea* scroll_outer = new QScrollArea(this); - m_layout->addWidget(scroll_outer); + layout->addWidget(scroll_outer); scroll_outer->setWidgetResizable(true); QWidget* scroll_inner = new QWidget(scroll_outer); @@ -59,11 +59,11 @@ ConsolePanelWidget::ConsolePanelWidget( scroll_layout->setAlignment(Qt::AlignTop); UiWrapper wrapper = m_session.system().make_ui_component(this); - m_system = dynamic_cast(wrapper.release()); - scroll_layout->addWidget(m_system); + QWidget* system = dynamic_cast(wrapper.release()); + scroll_layout->addWidget(system); - m_options = ConfigWidget::make_from_option(session.options(), this); - scroll_layout->addWidget(&m_options->widget()); + ConfigWidget* options = ConfigWidget::make_from_option(session.options(), this); + scroll_layout->addWidget(&options->widget()); scroll_layout->addStretch(1); } @@ -95,7 +95,7 @@ ConsolePanelWidget::ConsolePanelWidget( } } ); - m_layout->addWidget(actions_widget); + layout->addWidget(actions_widget); } } diff --git a/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.h b/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.h index 56671dfe71..fe29d6119e 100644 --- a/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.h +++ b/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.h @@ -8,7 +8,6 @@ #define PokemonAutomation_GameConsole_ConsolePanelWidget_H #include -#include #include "Common/Qt/UiStateQtWidget.h" #include "GameConsole/ConsolePanel.h" #include "GameConsole/ConsolePanelSession.h" @@ -31,10 +30,6 @@ class ConsolePanelWidget : public QWidget, public UiComponentQtWidget{ private: ConsolePanelSession& m_session; - QVBoxLayout* m_layout; - QWidget* m_system; - ConfigWidget* m_options; -// RunnablePanelActionBar* m_actions_bar; }; diff --git a/SerialPrograms/Source/GameConsole/UI/MultiConsolePanelWidget.cpp b/SerialPrograms/Source/GameConsole/UI/MultiConsolePanelWidget.cpp new file mode 100644 index 0000000000..1ad4adfd10 --- /dev/null +++ b/SerialPrograms/Source/GameConsole/UI/MultiConsolePanelWidget.cpp @@ -0,0 +1,106 @@ +/* Multi-Console Panel Widget + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#include +#include +#include +#include +#include "Common/Qt/ShutdownWithEvents.h" +#include "Common/Qt/Options/ConfigWidget.h" +#include "CommonFramework/Panels/UI/PanelElements.h" +#include "MultiConsolePanelWidget.h" + +namespace PokemonAutomation{ + +template class RegisterUiStateQtWidget; + +namespace GameConsole{ + + + +MultiConsolePanelWidget::~MultiConsolePanelWidget(){ + shutdown_with_events( + m_session.logger(), + "MultiConsolePanelWidget", + [this]{ return m_session.try_shutdown(); } + ); +} +MultiConsolePanelWidget::MultiConsolePanelWidget( + QWidget& parent, + MultiConsolePanelSession& session +) + : QWidget(&parent) + , m_session(session) +{ + QVBoxLayout* layout = new QVBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + + const MultiConsolePanelDescriptor& descriptor = session.descriptor(); + + CollapsibleGroupBox* header = make_panel_header( + *this, + descriptor.display_name(), + descriptor.doc_link(), + descriptor.description() + ); + layout->addWidget(header); + + { + QScrollArea* scroll_outer = new QScrollArea(this); + layout->addWidget(scroll_outer); + scroll_outer->setWidgetResizable(true); + + QWidget* scroll_inner = new QWidget(scroll_outer); + scroll_outer->setWidget(scroll_inner); + QVBoxLayout* scroll_layout = new QVBoxLayout(scroll_inner); + scroll_layout->setAlignment(Qt::AlignTop); + + UiWrapper wrapper = m_session.system().make_ui_component(this); + QWidget* system = dynamic_cast(wrapper.release()); + scroll_layout->addWidget(system); + + ConfigWidget* options = ConfigWidget::make_from_option(session.options(), this); + scroll_layout->addWidget(&options->widget()); + + scroll_layout->addStretch(1); + } + + if (session.descriptor().restore_defaults_button()){ + QGroupBox* actions_widget = new QGroupBox("Actions", &parent); + + QHBoxLayout* action_layout = new QHBoxLayout(actions_widget); +// action_layout->setContentsMargins(0, 0, 0, 0); + QPushButton* default_button = new QPushButton("Restore Defaults", actions_widget); + { + action_layout->addWidget(default_button, 1); + QFont font = default_button->font(); + font.setPointSize(16); + default_button->setFont(font); + } + + connect( + default_button, &QPushButton::clicked, + this, [this](bool){ + QMessageBox::StandardButton button = QMessageBox::question( + nullptr, + "Restore Defaults", + "Are you sure you wish to restore settings back to defaults? This will wipe the current settings.", + QMessageBox::Ok | QMessageBox::Cancel + ); + if (button == QMessageBox::Ok){ + m_session.restore_defaults(); + } + } + ); + layout->addWidget(actions_widget); + } +} + + + + +} +} diff --git a/SerialPrograms/Source/GameConsole/UI/MultiConsolePanelWidget.h b/SerialPrograms/Source/GameConsole/UI/MultiConsolePanelWidget.h new file mode 100644 index 0000000000..c567206066 --- /dev/null +++ b/SerialPrograms/Source/GameConsole/UI/MultiConsolePanelWidget.h @@ -0,0 +1,40 @@ +/* Multi-Console Panel Widget + * + * From: https://github.com/PokemonAutomation/ + * + */ + +#ifndef PokemonAutomation_GameConsole_MultiConsolePanelWidget_H +#define PokemonAutomation_GameConsole_MultiConsolePanelWidget_H + +#include +#include "Common/Qt/UiStateQtWidget.h" +#include "GameConsole/MultiConsolePanel.h" +#include "GameConsole/MultiConsolePanelSession.h" + +namespace PokemonAutomation{ +namespace GameConsole{ + + +class MultiConsolePanelWidget : public QWidget, public UiComponentQtWidget{ +public: + using ParentState = MultiConsolePanelSession; + +public: + ~MultiConsolePanelWidget(); + MultiConsolePanelWidget(QWidget& parent, MultiConsolePanelSession& session); + + virtual QWidget& widget() override{ + return *this; + } + +private: + MultiConsolePanelSession& m_session; +}; + + + + +} +} +#endif diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.h b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.h index 22e8bd84fd..a7a3239eeb 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.h +++ b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.h @@ -31,7 +31,9 @@ class MultiSwitchSystemOption final : public GameConsole::MultiConsoleSystemOpti min_consoles, max_consoles, consoles, - []{ return std::make_unique(); } + [](size_t console_index){ + return std::make_unique(); + } ) {} MultiSwitchSystemOption( @@ -43,7 +45,9 @@ class MultiSwitchSystemOption final : public GameConsole::MultiConsoleSystemOpti min_consoles, max_consoles, json, - []{ return std::make_unique(); } + [](size_t console_index){ + return std::make_unique(); + } ) {} diff --git a/SerialPrograms/Source/NintendoSwitch/NintendoSwitch_Panels.cpp b/SerialPrograms/Source/NintendoSwitch/NintendoSwitch_Panels.cpp index d24bff6208..2d141ae07a 100644 --- a/SerialPrograms/Source/NintendoSwitch/NintendoSwitch_Panels.cpp +++ b/SerialPrograms/Source/NintendoSwitch/NintendoSwitch_Panels.cpp @@ -11,9 +11,9 @@ #include "NintendoSwitch_SettingsPanel.h" -#include "GameConsole/Panels/VirtualConsole.h" -#include "GameConsole/Panels/BoxDraw.h" -#include "Programs/NintendoSwitch_SwitchViewer.h" +#include "GameConsole/Panels/GameConsole_VirtualConsole.h" +#include "GameConsole/Panels/GameConsole_BoxDraw.h" +#include "GameConsole/Panels/GameConsole_SwitchViewer.h" #include "Programs/NintendoSwitch_TurboA.h" #include "Programs/NintendoSwitch_TurboButton.h" @@ -62,7 +62,8 @@ std::vector PanelListFactory::make_panels() const{ ret.emplace_back("---- Virtual Consoles ----"); ret.emplace_back(GameConsole::make_ConsolePanel()); ret.emplace_back(GameConsole::make_ConsolePanel()); - ret.emplace_back(make_panel()); + ret.emplace_back(GameConsole::make_MultiConsolePanel()); +// ret.emplace_back(make_panel()); ret.emplace_back("---- Programs ----"); ret.emplace_back(make_single_switch_program()); diff --git a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.cpp b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.cpp deleted file mode 100644 index c926b0c858..0000000000 --- a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/* Multi-Video Test - * - * From: https://github.com/PokemonAutomation/ - * - */ - -#include -#include -#include "Common/Cpp/Json/JsonValue.h" -#include "Common/Qt/UiStateQtWidget.h" -#include "Common/Qt/CollapsibleGroupBox.h" -#include "NintendoSwitch_SwitchViewer.h" - -namespace PokemonAutomation{ - -template class RegisterUiStateQtWidget; - -namespace NintendoSwitch{ - - -SwitchViewer_Descriptor::SwitchViewer_Descriptor() - : PanelDescriptor( - Color(), - "NintendoSwitch:SwitchViewer", - "Nintendo Switch", "Switch Viewer", - "Programs/NintendoSwitch/SwitchViewer.html", - "View status information from one or more running programs." - ) -{} - - - -SwitchViewer::SwitchViewer(const SwitchViewer_Descriptor& descriptor) - : UiState(descriptor) - , m_option(1, 4, 1) - , m_session(m_option, true) -{} -JsonValue SwitchViewer::to_json() const{ - return m_session.to_json(); -} -void SwitchViewer::load_json(const JsonValue& json){ - m_session.load_json(json); -} - - - -SwitchViewer_Widget::~SwitchViewer_Widget(){ -} -SwitchViewer_Widget::SwitchViewer_Widget( - QWidget& parent, - SwitchViewer& session -) - : PanelWidget(parent, session) -{ - QVBoxLayout* layout = new QVBoxLayout(this); - layout->setContentsMargins(0, 0, 0, 0); - layout->addWidget(make_header()); - - QScrollArea* scroll_outer = new QScrollArea(this); - layout->addWidget(scroll_outer); - scroll_outer->setWidgetResizable(true); - - QWidget* scroll_inner = new QWidget(scroll_outer); - scroll_outer->setWidget(scroll_inner); - QVBoxLayout* scroll_layout = new QVBoxLayout(scroll_inner); - scroll_layout->setAlignment(Qt::AlignTop); - - UiWrapper wrapper = session.m_session.make_ui_component(this); - scroll_layout->addWidget(dynamic_cast(wrapper.release())); - scroll_layout->addStretch(1); -} - - - - - - - - -} -} diff --git a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.h b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.h deleted file mode 100644 index 37239fbe0a..0000000000 --- a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Multi-Video Test - * - * From: https://github.com/PokemonAutomation/ - * - */ - -#ifndef PokemonAutomation_NintendoSwitch_SwitchViewer_H -#define PokemonAutomation_NintendoSwitch_SwitchViewer_H - -#include "CommonFramework/Panels/PanelSession.h" -#include "CommonFramework/Panels/UI/PanelWidget.h" -#include "GameConsole/MultiConsoleSystemSession.h" - -namespace PokemonAutomation{ -namespace NintendoSwitch{ - - -class SwitchViewer_Descriptor : public PanelDescriptor{ -public: - SwitchViewer_Descriptor(); -}; - - - -class SwitchViewer : public UiState{ -public: - SwitchViewer(const SwitchViewer_Descriptor& descriptor); - -public: - // Serialization - virtual JsonValue to_json() const override; - virtual void load_json(const JsonValue& json) override; - -private: - friend class SwitchViewer_Widget; - - GameConsole::MultiConsoleSystemOption m_option; - GameConsole::MultiConsoleSystemSession m_session; -}; - - - -class SwitchViewer_Widget final : public PanelWidget{ -public: - using ParentState = SwitchViewer; - -public: - ~SwitchViewer_Widget(); - SwitchViewer_Widget(QWidget& parent, SwitchViewer& session); - - virtual QWidget& widget() override{ - return *this; - } -}; - - - - - -} -} -#endif diff --git a/SerialPrograms/Source/StaticRegistrationQt.cpp b/SerialPrograms/Source/StaticRegistrationQt.cpp index 1637417ab8..76332c23c2 100644 --- a/SerialPrograms/Source/StaticRegistrationQt.cpp +++ b/SerialPrograms/Source/StaticRegistrationQt.cpp @@ -62,11 +62,11 @@ #include "GameConsole/UI/ConsoleSystemWidget.h" #include "GameConsole/UI/ConsolePanelWidget.h" #include "GameConsole/UI/MultiConsoleSystemWidget.h" +#include "GameConsole/UI/MultiConsolePanelWidget.h" // Nintendo Switch #include "NintendoSwitch/Controllers/SysbotBase/SysbotBase_SelectorWidget.h" #include "NintendoSwitch/Framework/UI/NintendoSwitch_SwitchSystemWidget.h" -#include "NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.h" #include "NintendoSwitch/Framework/UI/NintendoSwitch_SingleSwitchProgramWidget.h" #include "NintendoSwitch/Framework/UI/NintendoSwitch_MultiSwitchProgramWidget.h" #include "NintendoSwitch/Options/UI/NintendoSwitch_FriendCodeListWidget.h" @@ -153,11 +153,11 @@ void register_all_statics(){ RegisterUiStateQtWidget(); RegisterUiStateQtWidget(); RegisterUiStateQtWidget(); + RegisterUiStateQtWidget(); // Nintendo Switch RegisterUiStateQtWidget(); RegisterUiStateQtWidget(); - RegisterUiStateQtWidget(); RegisterUiStateQtWidget(); RegisterUiStateQtWidget(); RegisterUiStateQtWidget(); diff --git a/SerialPrograms/cmake/SourceFiles.cmake b/SerialPrograms/cmake/SourceFiles.cmake index dac3999197..ecfdeb7553 100644 --- a/SerialPrograms/cmake/SourceFiles.cmake +++ b/SerialPrograms/cmake/SourceFiles.cmake @@ -925,19 +925,26 @@ file(GLOB LIBRARY_SOURCES Source/GameConsole/ConsoleSystemOption.h Source/GameConsole/ConsoleSystemSession.cpp Source/GameConsole/ConsoleSystemSession.h + Source/GameConsole/MultiConsolePanel.cpp + Source/GameConsole/MultiConsolePanel.h + Source/GameConsole/MultiConsolePanelSession.cpp + Source/GameConsole/MultiConsolePanelSession.h Source/GameConsole/MultiConsoleSystemOption.cpp Source/GameConsole/MultiConsoleSystemOption.h Source/GameConsole/MultiConsoleSystemSession.cpp Source/GameConsole/MultiConsoleSystemSession.h - Source/GameConsole/Panels/BoxDraw.cpp - Source/GameConsole/Panels/BoxDraw.h - Source/GameConsole/Panels/VirtualConsole.h + Source/GameConsole/Panels/GameConsole_BoxDraw.cpp + Source/GameConsole/Panels/GameConsole_BoxDraw.h + Source/GameConsole/Panels/GameConsole_SwitchViewer.h + Source/GameConsole/Panels/GameConsole_VirtualConsole.h Source/GameConsole/UI/CommandRowWidget.cpp Source/GameConsole/UI/CommandRowWidget.h Source/GameConsole/UI/ConsolePanelWidget.cpp Source/GameConsole/UI/ConsolePanelWidget.h Source/GameConsole/UI/ConsoleSystemWidget.cpp Source/GameConsole/UI/ConsoleSystemWidget.h + Source/GameConsole/UI/MultiConsolePanelWidget.cpp + Source/GameConsole/UI/MultiConsolePanelWidget.h Source/GameConsole/UI/MultiConsoleSystemWidget.cpp Source/GameConsole/UI/MultiConsoleSystemWidget.h Source/Kernels/AbsFFT/Kernels_AbsFFT.cpp @@ -1294,8 +1301,6 @@ file(GLOB LIBRARY_SOURCES Source/NintendoSwitch/Programs/NintendoSwitch_RecordKeyboardController.h Source/NintendoSwitch/Programs/NintendoSwitch_SnapshotDumper.cpp Source/NintendoSwitch/Programs/NintendoSwitch_SnapshotDumper.h - Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.cpp - Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.h Source/NintendoSwitch/Programs/NintendoSwitch_TurboA.cpp Source/NintendoSwitch/Programs/NintendoSwitch_TurboA.h Source/NintendoSwitch/Programs/NintendoSwitch_TurboButton.cpp From 849be46978f063ceedc641e949ae3e151718d4a8 Mon Sep 17 00:00:00 2001 From: Alexander Yee Date: Sun, 13 Sep 2026 04:08:37 -0700 Subject: [PATCH 2/4] minor --- .../Framework/NintendoSwitch_SwitchSystemSession.cpp | 8 +++----- .../Framework/NintendoSwitch_SwitchSystemSession.h | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemSession.cpp b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemSession.cpp index ae80cba4ca..b55037fecd 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemSession.cpp +++ b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemSession.cpp @@ -34,19 +34,17 @@ SwitchSystemSession::SwitchSystemSession( SwitchSystemOption& option, bool allow_commands_while_locked, size_t console_number, - std::optional program_id + std::optional program_tracking_id ) : UiState( global_logger_raw(), option, allow_commands_while_locked, console_number, - std::nullopt + program_tracking_id ) , m_option(option) -{ - m_console_id = ProgramTracker::instance().add_console(program_id, *this); -} +{} diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemSession.h b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemSession.h index b8de6a95a3..a2cdbdd3cb 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemSession.h +++ b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemSession.h @@ -39,7 +39,7 @@ class SwitchSystemSession final : public UiState program_id + std::optional program_tracking_id ); From 08a5f3e9bf69da9f331b06dadf8b96ce2a1c8a94 Mon Sep 17 00:00:00 2001 From: Alexander Yee Date: Sun, 13 Sep 2026 04:09:39 -0700 Subject: [PATCH 3/4] Version # --- SerialPrograms/Source/CommonFramework/Globals.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SerialPrograms/Source/CommonFramework/Globals.cpp b/SerialPrograms/Source/CommonFramework/Globals.cpp index a81117d8ab..361a05a583 100644 --- a/SerialPrograms/Source/CommonFramework/Globals.cpp +++ b/SerialPrograms/Source/CommonFramework/Globals.cpp @@ -31,7 +31,7 @@ namespace PokemonAutomation{ #endif #ifndef PA_VERSION_PATCH -#define PA_VERSION_PATCH 5 +#define PA_VERSION_PATCH 6 #endif const bool IS_BETA_VERSION = PA_IS_BETA; From f2ee912d7ea04048752261241656c5b5707cb1db Mon Sep 17 00:00:00 2001 From: Alexander Yee Date: Sun, 13 Sep 2026 04:40:37 -0700 Subject: [PATCH 4/4] Hide infra inside folder. --- .../Source/GameConsole/ConsolePanel.cpp | 2 +- .../{ => Framework}/ConsolePanelSession.cpp | 0 .../{ => Framework}/ConsolePanelSession.h | 2 +- .../{ => Framework}/ConsoleSystemOption.cpp | 2 +- .../{ => Framework}/ConsoleSystemOption.h | 0 .../{ => Framework}/ConsoleSystemSession.cpp | 0 .../{ => Framework}/ConsoleSystemSession.h | 0 .../MultiConsolePanelSession.cpp | 0 .../MultiConsolePanelSession.h | 2 +- .../MultiConsoleSystemOption.cpp | 0 .../MultiConsoleSystemOption.h | 0 .../MultiConsoleSystemSession.cpp | 0 .../MultiConsoleSystemSession.h | 2 +- .../Source/GameConsole/MultiConsolePanel.cpp | 4 ++-- .../Panels/GameConsole_BoxDraw.cpp | 2 +- .../Source/GameConsole/UI/CommandRowWidget.h | 2 +- .../GameConsole/UI/ConsolePanelWidget.h | 2 +- .../GameConsole/UI/ConsoleSystemWidget.h | 2 +- .../GameConsole/UI/MultiConsolePanelWidget.h | 2 +- .../GameConsole/UI/MultiConsoleSystemWidget.h | 2 +- .../DevPrograms/WaterfillTemplateMaker.cpp | 3 +-- .../NintendoSwitch_MultiSwitchSystemOption.h | 2 +- .../NintendoSwitch_MultiSwitchSystemSession.h | 2 +- .../NintendoSwitch_SwitchSystemOption.h | 2 +- .../NintendoSwitch_SwitchSystemSession.h | 2 +- .../NintendoSwitch_ConsoleHandle.cpp | 2 +- SerialPrograms/cmake/SourceFiles.cmake | 24 +++++++++---------- 27 files changed, 31 insertions(+), 32 deletions(-) rename SerialPrograms/Source/GameConsole/{ => Framework}/ConsolePanelSession.cpp (100%) rename SerialPrograms/Source/GameConsole/{ => Framework}/ConsolePanelSession.h (92%) rename SerialPrograms/Source/GameConsole/{ => Framework}/ConsoleSystemOption.cpp (94%) rename SerialPrograms/Source/GameConsole/{ => Framework}/ConsoleSystemOption.h (100%) rename SerialPrograms/Source/GameConsole/{ => Framework}/ConsoleSystemSession.cpp (100%) rename SerialPrograms/Source/GameConsole/{ => Framework}/ConsoleSystemSession.h (100%) rename SerialPrograms/Source/GameConsole/{ => Framework}/MultiConsolePanelSession.cpp (100%) rename SerialPrograms/Source/GameConsole/{ => Framework}/MultiConsolePanelSession.h (92%) rename SerialPrograms/Source/GameConsole/{ => Framework}/MultiConsoleSystemOption.cpp (100%) rename SerialPrograms/Source/GameConsole/{ => Framework}/MultiConsoleSystemOption.h (100%) rename SerialPrograms/Source/GameConsole/{ => Framework}/MultiConsoleSystemSession.cpp (100%) rename SerialPrograms/Source/GameConsole/{ => Framework}/MultiConsoleSystemSession.h (95%) diff --git a/SerialPrograms/Source/GameConsole/ConsolePanel.cpp b/SerialPrograms/Source/GameConsole/ConsolePanel.cpp index 4b52c0d76d..c369918707 100644 --- a/SerialPrograms/Source/GameConsole/ConsolePanel.cpp +++ b/SerialPrograms/Source/GameConsole/ConsolePanel.cpp @@ -5,8 +5,8 @@ */ #include "Common/Cpp/Json/JsonValue.h" +#include "Framework/ConsolePanelSession.h" #include "ConsolePanel.h" -#include "ConsolePanelSession.h" namespace PokemonAutomation{ namespace GameConsole{ diff --git a/SerialPrograms/Source/GameConsole/ConsolePanelSession.cpp b/SerialPrograms/Source/GameConsole/Framework/ConsolePanelSession.cpp similarity index 100% rename from SerialPrograms/Source/GameConsole/ConsolePanelSession.cpp rename to SerialPrograms/Source/GameConsole/Framework/ConsolePanelSession.cpp diff --git a/SerialPrograms/Source/GameConsole/ConsolePanelSession.h b/SerialPrograms/Source/GameConsole/Framework/ConsolePanelSession.h similarity index 92% rename from SerialPrograms/Source/GameConsole/ConsolePanelSession.h rename to SerialPrograms/Source/GameConsole/Framework/ConsolePanelSession.h index a56d037c63..a03b6dcaa6 100644 --- a/SerialPrograms/Source/GameConsole/ConsolePanelSession.h +++ b/SerialPrograms/Source/GameConsole/Framework/ConsolePanelSession.h @@ -8,8 +8,8 @@ #define PokemonAutomation_GameConsole_ConsolePanelSession_H #include "CommonFramework/Panels/PanelSession.h" +#include "GameConsole/ConsolePanel.h" #include "ConsoleSystemSession.h" -#include "ConsolePanel.h" namespace PokemonAutomation{ namespace GameConsole{ diff --git a/SerialPrograms/Source/GameConsole/ConsoleSystemOption.cpp b/SerialPrograms/Source/GameConsole/Framework/ConsoleSystemOption.cpp similarity index 94% rename from SerialPrograms/Source/GameConsole/ConsoleSystemOption.cpp rename to SerialPrograms/Source/GameConsole/Framework/ConsoleSystemOption.cpp index f69e4a4961..59986023eb 100644 --- a/SerialPrograms/Source/GameConsole/ConsoleSystemOption.cpp +++ b/SerialPrograms/Source/GameConsole/Framework/ConsoleSystemOption.cpp @@ -9,7 +9,7 @@ #include "Common/Cpp/Json/JsonArray.h" #include "Common/Cpp/Json/JsonObject.h" #include "Common/Cpp/Containers/FixedLimitVector.tpp" -#include "GameConsole/ConsoleSystemOption.h" +#include "GameConsole/Framework/ConsoleSystemOption.h" namespace PokemonAutomation{ namespace GameConsole{ diff --git a/SerialPrograms/Source/GameConsole/ConsoleSystemOption.h b/SerialPrograms/Source/GameConsole/Framework/ConsoleSystemOption.h similarity index 100% rename from SerialPrograms/Source/GameConsole/ConsoleSystemOption.h rename to SerialPrograms/Source/GameConsole/Framework/ConsoleSystemOption.h diff --git a/SerialPrograms/Source/GameConsole/ConsoleSystemSession.cpp b/SerialPrograms/Source/GameConsole/Framework/ConsoleSystemSession.cpp similarity index 100% rename from SerialPrograms/Source/GameConsole/ConsoleSystemSession.cpp rename to SerialPrograms/Source/GameConsole/Framework/ConsoleSystemSession.cpp diff --git a/SerialPrograms/Source/GameConsole/ConsoleSystemSession.h b/SerialPrograms/Source/GameConsole/Framework/ConsoleSystemSession.h similarity index 100% rename from SerialPrograms/Source/GameConsole/ConsoleSystemSession.h rename to SerialPrograms/Source/GameConsole/Framework/ConsoleSystemSession.h diff --git a/SerialPrograms/Source/GameConsole/MultiConsolePanelSession.cpp b/SerialPrograms/Source/GameConsole/Framework/MultiConsolePanelSession.cpp similarity index 100% rename from SerialPrograms/Source/GameConsole/MultiConsolePanelSession.cpp rename to SerialPrograms/Source/GameConsole/Framework/MultiConsolePanelSession.cpp diff --git a/SerialPrograms/Source/GameConsole/MultiConsolePanelSession.h b/SerialPrograms/Source/GameConsole/Framework/MultiConsolePanelSession.h similarity index 92% rename from SerialPrograms/Source/GameConsole/MultiConsolePanelSession.h rename to SerialPrograms/Source/GameConsole/Framework/MultiConsolePanelSession.h index 16c703f590..c0824b3e5d 100644 --- a/SerialPrograms/Source/GameConsole/MultiConsolePanelSession.h +++ b/SerialPrograms/Source/GameConsole/Framework/MultiConsolePanelSession.h @@ -9,7 +9,7 @@ #include "CommonFramework/Panels/PanelSession.h" #include "MultiConsoleSystemSession.h" -#include "MultiConsolePanel.h" +#include "GameConsole/MultiConsolePanel.h" namespace PokemonAutomation{ namespace GameConsole{ diff --git a/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.cpp b/SerialPrograms/Source/GameConsole/Framework/MultiConsoleSystemOption.cpp similarity index 100% rename from SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.cpp rename to SerialPrograms/Source/GameConsole/Framework/MultiConsoleSystemOption.cpp diff --git a/SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.h b/SerialPrograms/Source/GameConsole/Framework/MultiConsoleSystemOption.h similarity index 100% rename from SerialPrograms/Source/GameConsole/MultiConsoleSystemOption.h rename to SerialPrograms/Source/GameConsole/Framework/MultiConsoleSystemOption.h diff --git a/SerialPrograms/Source/GameConsole/MultiConsoleSystemSession.cpp b/SerialPrograms/Source/GameConsole/Framework/MultiConsoleSystemSession.cpp similarity index 100% rename from SerialPrograms/Source/GameConsole/MultiConsoleSystemSession.cpp rename to SerialPrograms/Source/GameConsole/Framework/MultiConsoleSystemSession.cpp diff --git a/SerialPrograms/Source/GameConsole/MultiConsoleSystemSession.h b/SerialPrograms/Source/GameConsole/Framework/MultiConsoleSystemSession.h similarity index 95% rename from SerialPrograms/Source/GameConsole/MultiConsoleSystemSession.h rename to SerialPrograms/Source/GameConsole/Framework/MultiConsoleSystemSession.h index fd95a71e3f..940ce0b25d 100644 --- a/SerialPrograms/Source/GameConsole/MultiConsoleSystemSession.h +++ b/SerialPrograms/Source/GameConsole/Framework/MultiConsoleSystemSession.h @@ -10,7 +10,7 @@ #include "Common/Cpp/ListenerSet.h" #include "Common/Cpp/UiWrapper.h" #include "Common/Cpp/Containers/FixedLimitVector.h" -#include "GameConsole/ConsoleSystemSession.h" +#include "ConsoleSystemSession.h" #include "MultiConsoleSystemOption.h" namespace PokemonAutomation{ diff --git a/SerialPrograms/Source/GameConsole/MultiConsolePanel.cpp b/SerialPrograms/Source/GameConsole/MultiConsolePanel.cpp index 7540cee1f7..20f2816a74 100644 --- a/SerialPrograms/Source/GameConsole/MultiConsolePanel.cpp +++ b/SerialPrograms/Source/GameConsole/MultiConsolePanel.cpp @@ -5,8 +5,8 @@ */ #include "Common/Cpp/Logging/GlobalLogger.h" -#include "ConsoleSystemSession.h" -#include "MultiConsolePanelSession.h" +#include "Framework/ConsoleSystemSession.h" +#include "Framework/MultiConsolePanelSession.h" #include "MultiConsolePanel.h" namespace PokemonAutomation{ diff --git a/SerialPrograms/Source/GameConsole/Panels/GameConsole_BoxDraw.cpp b/SerialPrograms/Source/GameConsole/Panels/GameConsole_BoxDraw.cpp index 9f3710958a..ec2386f3c9 100644 --- a/SerialPrograms/Source/GameConsole/Panels/GameConsole_BoxDraw.cpp +++ b/SerialPrograms/Source/GameConsole/Panels/GameConsole_BoxDraw.cpp @@ -4,7 +4,7 @@ * */ -#include "GameConsole/ConsoleSystemSession.h" +#include "GameConsole/Framework/ConsoleSystemSession.h" #include "GameConsole_BoxDraw.h" //#include diff --git a/SerialPrograms/Source/GameConsole/UI/CommandRowWidget.h b/SerialPrograms/Source/GameConsole/UI/CommandRowWidget.h index becd2a8fc2..8f606107ca 100644 --- a/SerialPrograms/Source/GameConsole/UI/CommandRowWidget.h +++ b/SerialPrograms/Source/GameConsole/UI/CommandRowWidget.h @@ -13,7 +13,7 @@ #include #include "Common/Qt/CheckboxDropdown.h" #include "CommonFramework/VideoPipeline/VideoOverlaySession.h" -#include "GameConsole/ConsoleSystemSession.h" +#include "GameConsole/Framework/ConsoleSystemSession.h" namespace PokemonAutomation{ namespace GameConsole{ diff --git a/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.h b/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.h index fe29d6119e..5847871376 100644 --- a/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.h +++ b/SerialPrograms/Source/GameConsole/UI/ConsolePanelWidget.h @@ -9,8 +9,8 @@ #include #include "Common/Qt/UiStateQtWidget.h" +#include "GameConsole/Framework/ConsolePanelSession.h" #include "GameConsole/ConsolePanel.h" -#include "GameConsole/ConsolePanelSession.h" namespace PokemonAutomation{ namespace GameConsole{ diff --git a/SerialPrograms/Source/GameConsole/UI/ConsoleSystemWidget.h b/SerialPrograms/Source/GameConsole/UI/ConsoleSystemWidget.h index 8c5aee905e..77edbd1e54 100644 --- a/SerialPrograms/Source/GameConsole/UI/ConsoleSystemWidget.h +++ b/SerialPrograms/Source/GameConsole/UI/ConsoleSystemWidget.h @@ -15,7 +15,7 @@ #include "CommonFramework/AudioPipeline/UI/AudioDisplayWidget.h" #include "CommonFramework/VideoPipeline/UI/VideoSourceSelectorWidget.h" #include "CommonFramework/VideoPipeline/UI/VideoDisplayWidget.h" -#include "GameConsole/ConsoleSystemSession.h" +#include "GameConsole/Framework/ConsoleSystemSession.h" namespace PokemonAutomation{ namespace GameConsole{ diff --git a/SerialPrograms/Source/GameConsole/UI/MultiConsolePanelWidget.h b/SerialPrograms/Source/GameConsole/UI/MultiConsolePanelWidget.h index c567206066..dc889e85de 100644 --- a/SerialPrograms/Source/GameConsole/UI/MultiConsolePanelWidget.h +++ b/SerialPrograms/Source/GameConsole/UI/MultiConsolePanelWidget.h @@ -9,8 +9,8 @@ #include #include "Common/Qt/UiStateQtWidget.h" +#include "GameConsole/Framework/MultiConsolePanelSession.h" #include "GameConsole/MultiConsolePanel.h" -#include "GameConsole/MultiConsolePanelSession.h" namespace PokemonAutomation{ namespace GameConsole{ diff --git a/SerialPrograms/Source/GameConsole/UI/MultiConsoleSystemWidget.h b/SerialPrograms/Source/GameConsole/UI/MultiConsoleSystemWidget.h index 8a778fe9e4..801123762f 100644 --- a/SerialPrograms/Source/GameConsole/UI/MultiConsoleSystemWidget.h +++ b/SerialPrograms/Source/GameConsole/UI/MultiConsoleSystemWidget.h @@ -10,7 +10,7 @@ #include #include #include "Common/Qt/UiStateQtWidget.h" -#include "GameConsole/MultiConsoleSystemSession.h" +#include "GameConsole/Framework/MultiConsoleSystemSession.h" namespace PokemonAutomation{ namespace GameConsole{ diff --git a/SerialPrograms/Source/NintendoSwitch/DevPrograms/WaterfillTemplateMaker.cpp b/SerialPrograms/Source/NintendoSwitch/DevPrograms/WaterfillTemplateMaker.cpp index abb0d9129b..8c9a2b08dd 100644 --- a/SerialPrograms/Source/NintendoSwitch/DevPrograms/WaterfillTemplateMaker.cpp +++ b/SerialPrograms/Source/NintendoSwitch/DevPrograms/WaterfillTemplateMaker.cpp @@ -4,12 +4,11 @@ * */ -#include "Common/Cpp/ScopeExit.h" #include "Kernels/Waterfill/Kernels_Waterfill_Session.h" #include "CommonFramework/Logging/Logger.h" #include "CommonFramework/VideoPipeline/VideoFeed.h" #include "CommonTools/Images/BinaryImage_FilterRgb32.h" -#include "GameConsole/ConsoleSystemSession.h" +#include "GameConsole/Framework/ConsoleSystemSession.h" #include "WaterfillTemplateMaker.h" //#include diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.h b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.h index a7a3239eeb..c163a569e0 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.h +++ b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemOption.h @@ -13,7 +13,7 @@ #ifndef PokemonAutomationn_NintendoSwitch_MultiSwitchSystemOption_H #define PokemonAutomationn_NintendoSwitch_MultiSwitchSystemOption_H -#include "GameConsole/MultiConsoleSystemOption.h" +#include "GameConsole/Framework/MultiConsoleSystemOption.h" #include "NintendoSwitch_SwitchSystemOption.h" namespace PokemonAutomation{ diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemSession.h b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemSession.h index 71f224c1f5..15bf1e7376 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemSession.h +++ b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchSystemSession.h @@ -15,7 +15,7 @@ #ifndef PokemonAutomationn_NintendoSwitch_MultiSwitchSystemSession_H #define PokemonAutomationn_NintendoSwitch_MultiSwitchSystemSession_H -#include "GameConsole/MultiConsoleSystemSession.h" +#include "GameConsole/Framework/MultiConsoleSystemSession.h" #include "NintendoSwitch_SwitchSystemSession.h" #include "NintendoSwitch_MultiSwitchSystemOption.h" diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemOption.h b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemOption.h index 56ac3f390c..f88c411f52 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemOption.h +++ b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemOption.h @@ -16,7 +16,7 @@ #define PokemonAutomation_NintendoSwitch_SwitchSystemOption_H #include "CommonFramework/Panels/ProgramDescriptor.h" -#include "GameConsole/ConsoleSystemOption.h" +#include "GameConsole/Framework/ConsoleSystemOption.h" #include "NintendoSwitch/Options/NintendoSwitch_ModelType.h" namespace PokemonAutomation{ diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemSession.h b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemSession.h index a2cdbdd3cb..2cbb7b831d 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemSession.h +++ b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SwitchSystemSession.h @@ -20,7 +20,7 @@ #ifndef PokemonAutomation_NintendoSwitch_SwitchSystemSession_H #define PokemonAutomation_NintendoSwitch_SwitchSystemSession_H -#include "GameConsole/ConsoleSystemSession.h" +#include "GameConsole/Framework/ConsoleSystemSession.h" #include "NintendoSwitch_SwitchSystemOption.h" namespace PokemonAutomation{ diff --git a/SerialPrograms/Source/NintendoSwitch/NintendoSwitch_ConsoleHandle.cpp b/SerialPrograms/Source/NintendoSwitch/NintendoSwitch_ConsoleHandle.cpp index 28243c3041..80ed988245 100644 --- a/SerialPrograms/Source/NintendoSwitch/NintendoSwitch_ConsoleHandle.cpp +++ b/SerialPrograms/Source/NintendoSwitch/NintendoSwitch_ConsoleHandle.cpp @@ -7,7 +7,7 @@ #include "CommonFramework/Tools/GlobalThreadPools.h" #include "CommonFramework/VideoPipeline/VideoOverlay.h" #include "CommonFramework/VideoPipeline/Stats/ThreadUtilizationStats.h" -#include "GameConsole/ConsoleSystemSession.h" +#include "GameConsole/Framework/ConsoleSystemSession.h" #include "NintendoSwitch_ConsoleHandle.h" //#include diff --git a/SerialPrograms/cmake/SourceFiles.cmake b/SerialPrograms/cmake/SourceFiles.cmake index ecfdeb7553..57b540c515 100644 --- a/SerialPrograms/cmake/SourceFiles.cmake +++ b/SerialPrograms/cmake/SourceFiles.cmake @@ -919,20 +919,20 @@ file(GLOB LIBRARY_SOURCES Source/Integrations/ProgramTracker.h Source/GameConsole/ConsolePanel.cpp Source/GameConsole/ConsolePanel.h - Source/GameConsole/ConsolePanelSession.cpp - Source/GameConsole/ConsolePanelSession.h - Source/GameConsole/ConsoleSystemOption.cpp - Source/GameConsole/ConsoleSystemOption.h - Source/GameConsole/ConsoleSystemSession.cpp - Source/GameConsole/ConsoleSystemSession.h + Source/GameConsole/Framework/ConsolePanelSession.cpp + Source/GameConsole/Framework/ConsolePanelSession.h + Source/GameConsole/Framework/ConsoleSystemOption.cpp + Source/GameConsole/Framework/ConsoleSystemOption.h + Source/GameConsole/Framework/ConsoleSystemSession.cpp + Source/GameConsole/Framework/ConsoleSystemSession.h + Source/GameConsole/Framework/MultiConsolePanelSession.cpp + Source/GameConsole/Framework/MultiConsolePanelSession.h + Source/GameConsole/Framework/MultiConsoleSystemOption.cpp + Source/GameConsole/Framework/MultiConsoleSystemOption.h + Source/GameConsole/Framework/MultiConsoleSystemSession.cpp + Source/GameConsole/Framework/MultiConsoleSystemSession.h Source/GameConsole/MultiConsolePanel.cpp Source/GameConsole/MultiConsolePanel.h - Source/GameConsole/MultiConsolePanelSession.cpp - Source/GameConsole/MultiConsolePanelSession.h - Source/GameConsole/MultiConsoleSystemOption.cpp - Source/GameConsole/MultiConsoleSystemOption.h - Source/GameConsole/MultiConsoleSystemSession.cpp - Source/GameConsole/MultiConsoleSystemSession.h Source/GameConsole/Panels/GameConsole_BoxDraw.cpp Source/GameConsole/Panels/GameConsole_BoxDraw.h Source/GameConsole/Panels/GameConsole_SwitchViewer.h