From 9ae7f9527ace8d0a0b9182876927fa9ecb2162bc Mon Sep 17 00:00:00 2001 From: Alexander Yee Date: Thu, 10 Sep 2026 02:41:31 -0700 Subject: [PATCH] Migrate panels to UiWrapper. --- .../CommonFramework/Panels/PanelSession.h | 10 ++----- .../CommonFramework/Panels/SettingsPanel.cpp | 2 +- .../CommonFramework/Panels/SettingsPanel.h | 4 +-- .../CommonFramework/Panels/UI/PanelWidget.cpp | 14 ++++------ .../CommonFramework/Panels/UI/PanelWidget.h | 21 ++++++++------ .../Panels/UI/SettingsPanelWidget.cpp | 23 +++++---------- .../Panels/UI/SettingsPanelWidget.h | 15 ++++------ .../CommonFramework/Windows/MainWindow.cpp | 5 +++- .../Framework/ComputerProgramSession.cpp | 6 +--- .../Framework/ComputerProgramSession.h | 3 +- .../Framework/ComputerProgramWidget.cpp | 2 ++ .../Framework/ComputerProgramWidget.h | 19 +++++++++---- .../ConsoleInfra/ConsoleSystemSession.cpp | 1 - .../Source/ConsoleInfra/VirtualConsole.cpp | 26 ++++++----------- .../Source/ConsoleInfra/VirtualConsole.h | 18 ++++-------- .../Source/ML/Programs/ML_LabelImages.cpp | 2 +- .../Source/ML/Programs/ML_LabelImages.h | 3 +- .../ML/Programs/ML_LabelImagesWidget.cpp | 28 +++++++++---------- .../Source/ML/Programs/ML_LabelImagesWidget.h | 13 ++++++--- ...ntendoSwitch_MultiSwitchProgramSession.cpp | 6 +--- ...NintendoSwitch_MultiSwitchProgramSession.h | 3 +- ...tendoSwitch_SingleSwitchProgramSession.cpp | 6 +--- ...intendoSwitch_SingleSwitchProgramSession.h | 6 ++-- ...intendoSwitch_MultiSwitchProgramWidget.cpp | 3 ++ .../NintendoSwitch_MultiSwitchProgramWidget.h | 20 +++++++++---- ...ntendoSwitch_SingleSwitchProgramWidget.cpp | 3 ++ ...NintendoSwitch_SingleSwitchProgramWidget.h | 19 +++++++++---- .../Programs/NintendoSwitch_SwitchViewer.cpp | 25 ++++++----------- .../Programs/NintendoSwitch_SwitchViewer.h | 22 ++++++--------- .../Source/StaticRegistrationQt.cpp | 24 ++++++++++++++++ 30 files changed, 179 insertions(+), 173 deletions(-) diff --git a/SerialPrograms/Source/CommonFramework/Panels/PanelSession.h b/SerialPrograms/Source/CommonFramework/Panels/PanelSession.h index 3065bf0dfb..2a56d30a71 100644 --- a/SerialPrograms/Source/CommonFramework/Panels/PanelSession.h +++ b/SerialPrograms/Source/CommonFramework/Panels/PanelSession.h @@ -7,6 +7,7 @@ #ifndef PokemonAutomation_PanelSession_H #define PokemonAutomation_PanelSession_H +#include "Common/Cpp/UiWrapper.h" #include "PanelDescriptor.h" class QWidget; @@ -14,13 +15,12 @@ class QWidget; namespace PokemonAutomation{ class JsonValue; -struct PanelHolder; // Class to represent one instance of a pokemon automation program. // Since programs are listed in the program panels, so this class is called PanelSession. // Its derived classes hold all the program data and program logic. It also calls // `make_widget()` to generate the UI for the program. -class PanelSession{ +class PanelSession : public UiState{ public: explicit PanelSession(const PanelDescriptor& descriptor); virtual ~PanelSession() = default; @@ -31,12 +31,6 @@ class PanelSession{ void validate_resource_list(); -public: - // The implmentation is defined in "UI/PanelWidget.h" to avoid circular dependency - // Returns a UI/PanelWidget.h:PanelWidget - virtual QWidget* make_widget(QWidget& parent); - - public: // Serialization void load_json(); diff --git a/SerialPrograms/Source/CommonFramework/Panels/SettingsPanel.cpp b/SerialPrograms/Source/CommonFramework/Panels/SettingsPanel.cpp index d6c3d39658..a2430cff0b 100644 --- a/SerialPrograms/Source/CommonFramework/Panels/SettingsPanel.cpp +++ b/SerialPrograms/Source/CommonFramework/Panels/SettingsPanel.cpp @@ -12,7 +12,7 @@ namespace PokemonAutomation{ SettingsPanelInstance::SettingsPanelInstance(const PanelDescriptor& descriptor) - : PanelSession(descriptor) + : UiState(descriptor) , m_options(LockMode::LOCK_WHILE_RUNNING) {} diff --git a/SerialPrograms/Source/CommonFramework/Panels/SettingsPanel.h b/SerialPrograms/Source/CommonFramework/Panels/SettingsPanel.h index df33b9633e..1a1977d33d 100644 --- a/SerialPrograms/Source/CommonFramework/Panels/SettingsPanel.h +++ b/SerialPrograms/Source/CommonFramework/Panels/SettingsPanel.h @@ -15,7 +15,7 @@ namespace PokemonAutomation{ -class SettingsPanelInstance : public PanelSession{ +class SettingsPanelInstance : public UiState{ public: SettingsPanelInstance(const PanelDescriptor& descriptor); @@ -23,8 +23,6 @@ class SettingsPanelInstance : public PanelSession{ m_options.add_option(option, std::move(serialization_string)); } - virtual QWidget* make_widget(QWidget& parent) override; - public: // Serialization virtual JsonValue to_json() const override; diff --git a/SerialPrograms/Source/CommonFramework/Panels/UI/PanelWidget.cpp b/SerialPrograms/Source/CommonFramework/Panels/UI/PanelWidget.cpp index 693bad7126..a2fb33fbd9 100644 --- a/SerialPrograms/Source/CommonFramework/Panels/UI/PanelWidget.cpp +++ b/SerialPrograms/Source/CommonFramework/Panels/UI/PanelWidget.cpp @@ -15,27 +15,25 @@ namespace PokemonAutomation{ +template class RegisterUiStateQtWidget; -QWidget* PanelSession::make_widget(QWidget& parent){ - return new PanelWidget(parent, *this); -} PanelWidget::PanelWidget( QWidget& parent, - PanelSession& instance + PanelSession& session ) : QWidget(&parent) - , m_instance(instance) + , m_session(session) {} CollapsibleGroupBox* PanelWidget::make_header(){ return make_panel_header( *this, - m_instance.descriptor().display_name(), - m_instance.descriptor().doc_link(), - m_instance.descriptor().description() + m_session.descriptor().display_name(), + m_session.descriptor().doc_link(), + m_session.descriptor().description() ); } diff --git a/SerialPrograms/Source/CommonFramework/Panels/UI/PanelWidget.h b/SerialPrograms/Source/CommonFramework/Panels/UI/PanelWidget.h index 12929cee44..be6abb1278 100644 --- a/SerialPrograms/Source/CommonFramework/Panels/UI/PanelWidget.h +++ b/SerialPrograms/Source/CommonFramework/Panels/UI/PanelWidget.h @@ -8,7 +8,9 @@ #define PokemonAutomation_PanelWidget_H #include +#include "Common/Qt/UiStateQtWidget.h" #include "CommonFramework/Panels/PanelTools.h" +#include "CommonFramework/Panels/PanelSession.h" namespace PokemonAutomation{ @@ -18,16 +20,19 @@ class CollapsibleGroupBox; // A PanelSession can call make_widget() to create it. // Its derived classes can call make_header() to create a collabspile program header // that shows program title, link to online documentation and others. -class PanelWidget : public QWidget{ +class PanelWidget : public QWidget, public UiComponentQtWidget{ public: - PanelWidget( - QWidget& parent, - PanelSession& instance - ); + using ParentState = PanelSession; + +public: + PanelWidget(QWidget& parent, PanelSession& session); virtual ~PanelWidget() = default; - // return the panel instance - PanelSession& instance(){ return m_instance; } +// PanelSession& session(){ return m_session; } + + virtual QWidget& widget() override{ + return *this; + } protected: // Generate a collapsible UI element that shows the program panel header. @@ -35,7 +40,7 @@ class PanelWidget : public QWidget{ virtual CollapsibleGroupBox* make_header(); protected: - PanelSession& m_instance; + PanelSession& m_session; }; diff --git a/SerialPrograms/Source/CommonFramework/Panels/UI/SettingsPanelWidget.cpp b/SerialPrograms/Source/CommonFramework/Panels/UI/SettingsPanelWidget.cpp index 72268cb77a..f21bddb79d 100644 --- a/SerialPrograms/Source/CommonFramework/Panels/UI/SettingsPanelWidget.cpp +++ b/SerialPrograms/Source/CommonFramework/Panels/UI/SettingsPanelWidget.cpp @@ -16,26 +16,17 @@ namespace PokemonAutomation{ -QWidget* SettingsPanelInstance::make_widget(QWidget& parent){ - return SettingsPanelWidget::make(parent, *this); -} +template class RegisterUiStateQtWidget; + + -SettingsPanelWidget* SettingsPanelWidget::make( - QWidget& parent, - SettingsPanelInstance& instance -){ - SettingsPanelWidget* widget = new SettingsPanelWidget(parent, instance); - widget->construct(); - return widget; -} SettingsPanelWidget::SettingsPanelWidget( QWidget& parent, - SettingsPanelInstance& instance + SettingsPanelInstance& session ) - : PanelWidget(parent, instance) -{} -void SettingsPanelWidget::construct(){ + : PanelWidget(parent, session) +{ QVBoxLayout* layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(make_header()); @@ -54,7 +45,7 @@ QWidget* SettingsPanelWidget::make_options(QWidget& parent){ QVBoxLayout* options_layout = new QVBoxLayout(options_widget); options_layout->setAlignment(Qt::AlignTop); - SettingsPanelInstance& instance = static_cast(m_instance); + SettingsPanelInstance& instance = static_cast(m_session); m_options = static_cast(ConfigWidget::make_from_option(instance.m_options, &parent)); options_layout->addWidget(m_options); options_layout->addStretch(); diff --git a/SerialPrograms/Source/CommonFramework/Panels/UI/SettingsPanelWidget.h b/SerialPrograms/Source/CommonFramework/Panels/UI/SettingsPanelWidget.h index be8b8e2720..1dd9620087 100644 --- a/SerialPrograms/Source/CommonFramework/Panels/UI/SettingsPanelWidget.h +++ b/SerialPrograms/Source/CommonFramework/Panels/UI/SettingsPanelWidget.h @@ -17,21 +17,16 @@ namespace PokemonAutomation{ class BatchWidget; -class SettingsPanelWidget : public PanelWidget{ +class SettingsPanelWidget final : public PanelWidget{ public: - static SettingsPanelWidget* make( - QWidget& parent, - SettingsPanelInstance& instance - ); + using ParentState = SettingsPanelInstance; + +public: + SettingsPanelWidget(QWidget& parent, SettingsPanelInstance& session); void restore_defaults(); private: - SettingsPanelWidget( - QWidget& parent, - SettingsPanelInstance& instance - ); - void construct(); QWidget* make_options(QWidget& parent); QWidget* make_actions(QWidget& parent); diff --git a/SerialPrograms/Source/CommonFramework/Windows/MainWindow.cpp b/SerialPrograms/Source/CommonFramework/Windows/MainWindow.cpp index c7f285e6bb..e10980bcc6 100644 --- a/SerialPrograms/Source/CommonFramework/Windows/MainWindow.cpp +++ b/SerialPrograms/Source/CommonFramework/Windows/MainWindow.cpp @@ -18,6 +18,7 @@ #include "Common/Cpp/Logging/MultiOutputLogger.h" #include "Common/Cpp/Filesystem/Filesystem.h" #include "Common/Cpp/CpuId/CpuId.h" +#include "Common/Qt/UiStateQtWidget.h" #include "CommonFramework/Globals.h" #include "CommonFramework/GlobalAutoPaths.h" #include "CommonFramework/GlobalSettingsPanel.h" @@ -395,7 +396,9 @@ void MainWindow::load_panel( // Make new widget. try{ check_new_version(); - m_current_panel_widget = panel->make_widget(*this); + m_current_panel_widget = &dynamic_cast( + panel->make_ui_component(this).release() + )->widget(); // cout << "load_panel() = " << m_current_panel_widget << endl; m_current_panel_descriptor = std::move(descriptor); m_current_panel = std::move(panel); diff --git a/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramSession.cpp b/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramSession.cpp index 92ed85e718..e44c748f97 100644 --- a/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramSession.cpp +++ b/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramSession.cpp @@ -13,7 +13,6 @@ #include "CommonFramework/Notifications/ProgramInfo.h" #include "CommonFramework/Notifications/ProgramNotifications.h" #include "ComputerProgramSession.h" -#include "ComputerProgramWidget.h" //#include //using std::cout; @@ -23,7 +22,7 @@ namespace PokemonAutomation{ ComputerProgramSession::ComputerProgramSession(const ComputerProgramDescriptor& descriptor) - : PanelSession(descriptor) + : UiState(descriptor) , ProgramSession(descriptor) , m_descriptor(descriptor) , m_instance(descriptor.make_instance()) @@ -60,9 +59,6 @@ JsonValue ComputerProgramSession::to_json() const{ void ComputerProgramSession::load_json(const JsonValue& json){ m_instance->load_json(json); } -QWidget* ComputerProgramSession::make_widget(QWidget& parent){ - return new ComputerProgramWidget(parent, *this); -} void ComputerProgramSession::run_program_instance(ProgramEnvironment& env, CancellableScope& scope){ diff --git a/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramSession.h b/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramSession.h index 742b972719..fb6360a8a8 100644 --- a/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramSession.h +++ b/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramSession.h @@ -27,7 +27,7 @@ class ComputerProgramOption; class ProgramEnvironment; -class ComputerProgramSession final : public PanelSession, public ProgramSession{ +class ComputerProgramSession final : public UiState, public ProgramSession{ public: virtual ~ComputerProgramSession(); ComputerProgramSession(const ComputerProgramDescriptor& descriptor); @@ -50,7 +50,6 @@ class ComputerProgramSession final : public PanelSession, public ProgramSession{ private: virtual JsonValue to_json() const override; virtual void load_json(const JsonValue& json) override; - virtual QWidget* make_widget(QWidget& parent) override; private: diff --git a/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramWidget.cpp b/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramWidget.cpp index 8a8ffb405e..62806d27cd 100644 --- a/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramWidget.cpp +++ b/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramWidget.cpp @@ -23,6 +23,8 @@ namespace PokemonAutomation{ +template class RegisterUiStateQtWidget; + ComputerProgramWidget::~ComputerProgramWidget(){ m_session.remove_listener(*this); diff --git a/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramWidget.h b/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramWidget.h index 71c637a251..1298bb4adf 100644 --- a/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramWidget.h +++ b/SerialPrograms/Source/ComputerPrograms/Framework/ComputerProgramWidget.h @@ -18,6 +18,7 @@ #ifndef PokemonAutomation_ComputerPrograms_ComputerProgramWidget_H #define PokemonAutomation_ComputerPrograms_ComputerProgramWidget_H +#include "Common/Qt/UiStateQtWidget.h" #include "CommonFramework/Panels/UI/PanelElements.h" #include "ComputerPrograms/ComputerProgram.h" #include "ComputerPrograms/Framework/ComputerProgramSession.h" @@ -30,13 +31,21 @@ namespace PokemonAutomation{ -class ComputerProgramWidget : public QWidget, private ProgramSession::Listener{ +class ComputerProgramWidget + : public QWidget + , public UiComponentQtWidget + , private ProgramSession::Listener +{ +public: + using ParentState = ComputerProgramSession; + public: ~ComputerProgramWidget(); - ComputerProgramWidget( - QWidget& parent, - ComputerProgramSession& session - ); + ComputerProgramWidget(QWidget& parent, ComputerProgramSession& session); + + virtual QWidget& widget() override{ + return *this; + } private: virtual void state_change(ProgramState state) override; diff --git a/SerialPrograms/Source/ConsoleInfra/ConsoleSystemSession.cpp b/SerialPrograms/Source/ConsoleInfra/ConsoleSystemSession.cpp index d8d2b92889..82124a9b16 100644 --- a/SerialPrograms/Source/ConsoleInfra/ConsoleSystemSession.cpp +++ b/SerialPrograms/Source/ConsoleInfra/ConsoleSystemSession.cpp @@ -11,7 +11,6 @@ #include "CommonFramework/VideoPipeline/Stats/CpuUtilizationStats.h" #include "CommonFramework/VideoPipeline/Stats/ThreadUtilizationStats.h" #include "Integrations/ProgramTracker.h" -#include "Controllers/NullController.h" #include "ConsoleSystemSession.h" //#include diff --git a/SerialPrograms/Source/ConsoleInfra/VirtualConsole.cpp b/SerialPrograms/Source/ConsoleInfra/VirtualConsole.cpp index dfbf4dc79d..af2f65bfef 100644 --- a/SerialPrograms/Source/ConsoleInfra/VirtualConsole.cpp +++ b/SerialPrograms/Source/ConsoleInfra/VirtualConsole.cpp @@ -11,6 +11,10 @@ #include "VirtualConsole.h" namespace PokemonAutomation{ + +template class RegisterUiStateQtWidget; + + namespace ConsoleInfra{ VirtualConsole_Descriptor::VirtualConsole_Descriptor(size_t controllers) @@ -34,7 +38,7 @@ VirtualConsole_Descriptor::VirtualConsole_Descriptor(size_t controllers) VirtualConsole::VirtualConsole(const VirtualConsole_Descriptor& descriptor) - : PanelSession(descriptor) + : UiState(descriptor) , m_console_options(descriptor.m_controllers, true) {} JsonValue VirtualConsole::to_json() const{ @@ -43,31 +47,19 @@ JsonValue VirtualConsole::to_json() const{ void VirtualConsole::load_json(const JsonValue& json){ m_console_options.load_json(json); } -QWidget* VirtualConsole::make_widget(QWidget& parent){ - return VirtualConsole_Widget::make(parent, *this); -} -VirtualConsole_Widget* VirtualConsole_Widget::make( - QWidget& parent, - VirtualConsole& instance -){ - VirtualConsole_Widget* widget = new VirtualConsole_Widget(parent, instance); - widget->construct(); - return widget; -} VirtualConsole_Widget::~VirtualConsole_Widget(){ delete m_console_widget; } VirtualConsole_Widget::VirtualConsole_Widget( QWidget& parent, - VirtualConsole& instance + VirtualConsole& session ) - : PanelWidget(parent, instance) - , m_session(global_logger_raw(), instance.m_console_options, 0) -{} -void VirtualConsole_Widget::construct(){ + : PanelWidget(parent, session) + , m_session(global_logger_raw(), session.m_console_options, 0) +{ QVBoxLayout* layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(make_header()); diff --git a/SerialPrograms/Source/ConsoleInfra/VirtualConsole.h b/SerialPrograms/Source/ConsoleInfra/VirtualConsole.h index 3af106ab63..219448f9b0 100644 --- a/SerialPrograms/Source/ConsoleInfra/VirtualConsole.h +++ b/SerialPrograms/Source/ConsoleInfra/VirtualConsole.h @@ -40,10 +40,9 @@ class MultiControllerTester_Descriptor : public VirtualConsole_Descriptor{ // The program panel of Virtual Console. // It calls make_widget() to create a VirtualConsole_Widget that holds the UI wideget. -class VirtualConsole : public PanelSession{ +class VirtualConsole : public UiState{ public: VirtualConsole(const VirtualConsole_Descriptor& descriptor); - virtual QWidget* make_widget(QWidget& parent) override; public: // Serialization @@ -59,20 +58,13 @@ class VirtualConsole : public PanelSession{ // The UI of the prgoram Virtual Console -class VirtualConsole_Widget : public PanelWidget{ +class VirtualConsole_Widget final : public PanelWidget{ public: - static VirtualConsole_Widget* make( - QWidget& parent, - VirtualConsole& instance - ); + using ParentState = VirtualConsole; -private: +public: ~VirtualConsole_Widget(); - VirtualConsole_Widget( - QWidget& parent, - VirtualConsole& instance - ); - void construct(); + VirtualConsole_Widget(QWidget& parent, VirtualConsole& session); private: ConsoleSystemSession m_session; diff --git a/SerialPrograms/Source/ML/Programs/ML_LabelImages.cpp b/SerialPrograms/Source/ML/Programs/ML_LabelImages.cpp index 31d721d334..9e8ad03a3d 100644 --- a/SerialPrograms/Source/ML/Programs/ML_LabelImages.cpp +++ b/SerialPrograms/Source/ML/Programs/ML_LabelImages.cpp @@ -56,7 +56,7 @@ IntegerEnumDropdownDatabase create_label_type_database(){ } LabelImages::LabelImages(const LabelImages_Descriptor& descriptor) - : PanelSession(descriptor) + : UiState(descriptor) , m_display_session(m_display_option) , m_options(LockMode::UNLOCK_WHILE_RUNNING) , m_use_gpu_for_sam_anno(PerformanceOptions::instance().ONNX_OPTIONS.USE_GPU) diff --git a/SerialPrograms/Source/ML/Programs/ML_LabelImages.h b/SerialPrograms/Source/ML/Programs/ML_LabelImages.h index 5793caeeb6..1eac933b7b 100644 --- a/SerialPrograms/Source/ML/Programs/ML_LabelImages.h +++ b/SerialPrograms/Source/ML/Programs/ML_LabelImages.h @@ -62,10 +62,9 @@ class LabelImages_Descriptor : public PanelDescriptor{ // Program to annoatation images for training ML models -class LabelImages : public PanelSession, public ConfigOption::Listener { +class LabelImages : public UiState, public ConfigOption::Listener{ public: LabelImages(const LabelImages_Descriptor& descriptor); - virtual QWidget* make_widget(QWidget& parent) override; ~LabelImages(); public: diff --git a/SerialPrograms/Source/ML/Programs/ML_LabelImagesWidget.cpp b/SerialPrograms/Source/ML/Programs/ML_LabelImagesWidget.cpp index 3b40955225..2c1a9e6ae3 100644 --- a/SerialPrograms/Source/ML/Programs/ML_LabelImagesWidget.cpp +++ b/SerialPrograms/Source/ML/Programs/ML_LabelImagesWidget.cpp @@ -32,12 +32,12 @@ using std::endl; namespace PokemonAutomation{ + +template class RegisterUiStateQtWidget; + namespace ML{ -QWidget* LabelImages::make_widget(QWidget& parent){ - return new LabelImages_Widget(parent, *this); -} LabelImages_Widget::~LabelImages_Widget(){ @@ -48,10 +48,10 @@ LabelImages_Widget::~LabelImages_Widget(){ } LabelImages_Widget::LabelImages_Widget( QWidget& parent, - LabelImages& program + LabelImages& session ) - : PanelWidget(parent, program) - , m_program(program) + : PanelWidget(parent, session) + , m_program(session) , m_display_session(m_program.m_display_session) { m_display_session.overlay().add_hid_listener(*this); @@ -115,14 +115,14 @@ LabelImages_Widget::LabelImages_Widget( scroll_layout->addLayout(annotation_row); // add a dropdown menu for user to pick whether to choose from pokemon form label or custom label - ConfigWidget* label_type_widget = ConfigWidget::make_from_option(program.LABEL_TYPE, scroll_inner); + ConfigWidget* label_type_widget = ConfigWidget::make_from_option(session.LABEL_TYPE, scroll_inner); annotation_row->addWidget(&label_type_widget->widget(), 0); - ConfigWidget* pokemon_label_widget = ConfigWidget::make_from_option(program.FORM_LABEL, scroll_inner); + ConfigWidget* pokemon_label_widget = ConfigWidget::make_from_option(session.FORM_LABEL, scroll_inner); annotation_row->addWidget(&pokemon_label_widget->widget(), 2); - ConfigWidget* custom_label_widget = ConfigWidget::make_from_option(program.CUSTOM_SET_LABEL, scroll_inner); + ConfigWidget* custom_label_widget = ConfigWidget::make_from_option(session.CUSTOM_SET_LABEL, scroll_inner); annotation_row->addWidget(&custom_label_widget->widget(), 2); - ConfigWidget* manual_input_label_widget = ConfigWidget::make_from_option(program.MANUAL_LABEL, scroll_inner); + ConfigWidget* manual_input_label_widget = ConfigWidget::make_from_option(session.MANUAL_LABEL, scroll_inner); annotation_row->addWidget(&manual_input_label_widget->widget(), 2); QPushButton* load_custom_set_button = new QPushButton("Load Custom Set", scroll_inner); annotation_row->addWidget(load_custom_set_button, 2); @@ -132,23 +132,23 @@ LabelImages_Widget::LabelImages_Widget( // QHBoxLayout* use_gpu_row = new QHBoxLayout(); // scroll_layout->addLayout(use_gpu_row); - // ConfigWidget* gpu_checkbox_widget = ConfigWidget::make_from_option(program.USE_GPU_FOR_EMBEDDER_SESSION, scroll_inner); + // ConfigWidget* gpu_checkbox_widget = ConfigWidget::make_from_option(session.USE_GPU_FOR_EMBEDDER_SESSION, scroll_inner); // use_gpu_row->addWidget(&gpu_checkbox_widget->widget(), 2); // add Color selection dropdown QHBoxLayout* selected_color_choice_row = new QHBoxLayout(); scroll_layout->addLayout(selected_color_choice_row); - ConfigWidget* selected_color_choice_widget = ConfigWidget::make_from_option(program.SELECTED_ANNO_COLOR, scroll_inner); + ConfigWidget* selected_color_choice_widget = ConfigWidget::make_from_option(session.SELECTED_ANNO_COLOR, scroll_inner); selected_color_choice_row->addWidget(&selected_color_choice_widget->widget(), 2); QHBoxLayout* unselected_color_choice_row = new QHBoxLayout(); scroll_layout->addLayout(unselected_color_choice_row); - ConfigWidget* unselected_color_choice_widget = ConfigWidget::make_from_option(program.UNSELECTED_ANNO_COLOR, scroll_inner); + ConfigWidget* unselected_color_choice_widget = ConfigWidget::make_from_option(session.UNSELECTED_ANNO_COLOR, scroll_inner); unselected_color_choice_row->addWidget(&unselected_color_choice_widget->widget(), 2); QHBoxLayout* current_drawn_box_row = new QHBoxLayout(); scroll_layout->addLayout(current_drawn_box_row); - ConfigWidget* current_drawn_box_widget = ConfigWidget::make_from_option(program.CURRENT_DRAWN_BOX, scroll_inner); + ConfigWidget* current_drawn_box_widget = ConfigWidget::make_from_option(session.CURRENT_DRAWN_BOX, scroll_inner); current_drawn_box_row->addWidget(¤t_drawn_box_widget->widget(), 2); // add compute embedding button diff --git a/SerialPrograms/Source/ML/Programs/ML_LabelImagesWidget.h b/SerialPrograms/Source/ML/Programs/ML_LabelImagesWidget.h index 6db2ed136d..a50f858b49 100644 --- a/SerialPrograms/Source/ML/Programs/ML_LabelImagesWidget.h +++ b/SerialPrograms/Source/ML/Programs/ML_LabelImagesWidget.h @@ -20,6 +20,7 @@ #include "CommonFramework/VideoPipeline/VideoSession.h" #include "CommonFramework/VideoPipeline/VideoOverlay.h" #include "ML/UI/ML_ImageAnnotationDisplayWidget.h" +#include "ML_LabelImages.h" class QLabel; class QPushButton; @@ -41,12 +42,16 @@ class LabelImages_Widget , public CommandReceiver , public VideoDisplayHidListener { +public: + using ParentState = LabelImages; + public: ~LabelImages_Widget(); - LabelImages_Widget( - QWidget& parent, - LabelImages& instance - ); + LabelImages_Widget(QWidget& parent, LabelImages& session); + + virtual QWidget& widget() override{ + return *this; + } // Overwrites ConfigOption::Listener::on_config_value_changed(). virtual void on_config_value_changed(void* object) override; diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.cpp b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.cpp index c551c76294..e88fbc5d61 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.cpp +++ b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.cpp @@ -20,7 +20,6 @@ #include "CommonFramework/Options/Environment/SleepSuppressOption.h" #include "NintendoSwitch/NintendoSwitch_Settings.h" #include "NintendoSwitch_MultiSwitchProgramSession.h" -#include "UI/NintendoSwitch_MultiSwitchProgramWidget.h" namespace PokemonAutomation{ namespace NintendoSwitch{ @@ -40,7 +39,7 @@ void MultiSwitchProgramSession::remove_listener(Listener& listener){ MultiSwitchProgramSession::MultiSwitchProgramSession(const MultiSwitchProgramDescriptor& descriptor) - : PanelSession(descriptor) + : UiState(descriptor) , ProgramSession(descriptor) , m_descriptor(descriptor) , m_system_option( @@ -116,9 +115,6 @@ void MultiSwitchProgramSession::load_json(const JsonValue& json){ } m_instance->load_json(json); } -QWidget* MultiSwitchProgramSession::make_widget(QWidget& parent){ - return new MultiSwitchProgramWidget2(parent, *this); -} diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.h b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.h index e4fafb1dea..1eefea017a 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.h +++ b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.h @@ -27,7 +27,7 @@ class MultiSwitchProgramOption; class MultiSwitchProgramSession final - : public PanelSession + : public UiState , public ProgramSession , private MultiSwitchSystemSession::Listener { @@ -65,7 +65,6 @@ class MultiSwitchProgramSession final virtual JsonValue to_json() const override; virtual void load_json(const JsonValue& json) override; - virtual QWidget* make_widget(QWidget& parent) override; private: diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SingleSwitchProgramSession.cpp b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SingleSwitchProgramSession.cpp index d021687cd6..ae962ae2cf 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SingleSwitchProgramSession.cpp +++ b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SingleSwitchProgramSession.cpp @@ -20,7 +20,6 @@ #include "CommonFramework/Notifications/ProgramNotifications.h" #include "NintendoSwitch/NintendoSwitch_Settings.h" #include "NintendoSwitch_SingleSwitchProgramSession.h" -#include "UI/NintendoSwitch_SingleSwitchProgramWidget.h" //#include //using std::cout; @@ -33,7 +32,7 @@ namespace NintendoSwitch{ SingleSwitchProgramSession::SingleSwitchProgramSession(const SingleSwitchProgramDescriptor& descriptor) - : PanelSession(descriptor) + : UiState(descriptor) , ProgramSession(descriptor) , m_descriptor(descriptor) , m_system_option(descriptor.allow_commands_while_running()) @@ -288,9 +287,6 @@ void SingleSwitchProgramSession::load_json(const JsonValue& json){ } m_instance->load_json(json); } -QWidget* SingleSwitchProgramSession::make_widget(QWidget& parent){ - return new SingleSwitchProgramWidget2(parent, *this); -} diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SingleSwitchProgramSession.h b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SingleSwitchProgramSession.h index 261e03d466..66812d5580 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SingleSwitchProgramSession.h +++ b/SerialPrograms/Source/NintendoSwitch/Framework/NintendoSwitch_SingleSwitchProgramSession.h @@ -26,7 +26,10 @@ namespace NintendoSwitch{ class SingleSwitchProgramOption; -class SingleSwitchProgramSession final : public PanelSession, public ProgramSession{ +class SingleSwitchProgramSession final + : public UiState + , public ProgramSession +{ public: bool try_shutdown(); ~SingleSwitchProgramSession(); @@ -51,7 +54,6 @@ class SingleSwitchProgramSession final : public PanelSession, public ProgramSess private: virtual JsonValue to_json() const override; virtual void load_json(const JsonValue& json) override; - virtual QWidget* make_widget(QWidget& parent) override; private: diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_MultiSwitchProgramWidget.cpp b/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_MultiSwitchProgramWidget.cpp index 7e7c7b802f..025488b723 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_MultiSwitchProgramWidget.cpp +++ b/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_MultiSwitchProgramWidget.cpp @@ -25,6 +25,9 @@ //using std::endl; namespace PokemonAutomation{ + +template class RegisterUiStateQtWidget; + namespace NintendoSwitch{ diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_MultiSwitchProgramWidget.h b/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_MultiSwitchProgramWidget.h index 2f136184ad..03a8075a62 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_MultiSwitchProgramWidget.h +++ b/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_MultiSwitchProgramWidget.h @@ -18,6 +18,7 @@ #ifndef PokemonAutomation_NintendoSwitch_MultiSwitchProgramWidget_H #define PokemonAutomation_NintendoSwitch_MultiSwitchProgramWidget_H +#include "Common/Qt/UiStateQtWidget.h" #include "CommonFramework/Panels/UI/PanelElements.h" #include "NintendoSwitch/NintendoSwitch_MultiSwitchProgram.h" #include "NintendoSwitch/Framework/NintendoSwitch_MultiSwitchProgramSession.h" @@ -31,13 +32,22 @@ namespace NintendoSwitch{ -class MultiSwitchProgramWidget2 : public QWidget, private ProgramSession::Listener, private MultiSwitchProgramSession::Listener{ +class MultiSwitchProgramWidget2 + : public QWidget + , public UiComponentQtWidget + , private ProgramSession::Listener + , private MultiSwitchProgramSession::Listener +{ +public: + using ParentState = MultiSwitchProgramSession; + public: ~MultiSwitchProgramWidget2(); - MultiSwitchProgramWidget2( - QWidget& parent, - MultiSwitchProgramSession& session - ); + MultiSwitchProgramWidget2(QWidget& parent, MultiSwitchProgramSession& session); + + virtual QWidget& widget() override{ + return *this; + } private: virtual void state_change(ProgramState state) override; diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_SingleSwitchProgramWidget.cpp b/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_SingleSwitchProgramWidget.cpp index 1144ca5777..8ffe37497a 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_SingleSwitchProgramWidget.cpp +++ b/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_SingleSwitchProgramWidget.cpp @@ -25,6 +25,9 @@ //using std::endl; namespace PokemonAutomation{ + +template class RegisterUiStateQtWidget; + namespace NintendoSwitch{ diff --git a/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_SingleSwitchProgramWidget.h b/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_SingleSwitchProgramWidget.h index 17fb749ea8..dbd98138e8 100644 --- a/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_SingleSwitchProgramWidget.h +++ b/SerialPrograms/Source/NintendoSwitch/Framework/UI/NintendoSwitch_SingleSwitchProgramWidget.h @@ -18,6 +18,7 @@ #ifndef PokemonAutomation_NintendoSwitch_SingleSwitchProgramWidget_H #define PokemonAutomation_NintendoSwitch_SingleSwitchProgramWidget_H +#include "Common/Qt/UiStateQtWidget.h" #include "CommonFramework/Panels/UI/PanelElements.h" #include "NintendoSwitch/NintendoSwitch_SingleSwitchProgram.h" #include "NintendoSwitch/Framework/NintendoSwitch_SingleSwitchProgramSession.h" @@ -30,13 +31,21 @@ namespace NintendoSwitch{ -class SingleSwitchProgramWidget2 : public QWidget, private ProgramSession::Listener{ +class SingleSwitchProgramWidget2 + : public QWidget + , public UiComponentQtWidget + , private ProgramSession::Listener +{ +public: + using ParentState = SingleSwitchProgramSession; + public: ~SingleSwitchProgramWidget2(); - SingleSwitchProgramWidget2( - QWidget& parent, - SingleSwitchProgramSession& session - ); + SingleSwitchProgramWidget2(QWidget& parent, SingleSwitchProgramSession& session); + + virtual QWidget& widget() override{ + return *this; + } private: virtual void state_change(ProgramState state) override; diff --git a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.cpp b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.cpp index 26913c0645..23fe398e60 100644 --- a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.cpp +++ b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.cpp @@ -12,6 +12,9 @@ #include "NintendoSwitch_SwitchViewer.h" namespace PokemonAutomation{ + +template class RegisterUiStateQtWidget; + namespace NintendoSwitch{ @@ -28,7 +31,7 @@ SwitchViewer_Descriptor::SwitchViewer_Descriptor() SwitchViewer::SwitchViewer(const SwitchViewer_Descriptor& descriptor) - : PanelSession(descriptor) + : UiState(descriptor) , m_switches( AllowCommandsWhenRunning::DISABLE_COMMANDS, 1, 4, 1 @@ -40,31 +43,19 @@ JsonValue SwitchViewer::to_json() const{ void SwitchViewer::load_json(const JsonValue& json){ m_switches.load_json(json); } -QWidget* SwitchViewer::make_widget(QWidget& parent){ - return SwitchViewer_Widget::make(parent, *this); -} -SwitchViewer_Widget* SwitchViewer_Widget::make( - QWidget& parent, - SwitchViewer& instance -){ - SwitchViewer_Widget* widget = new SwitchViewer_Widget(parent, instance); - widget->construct(); - return widget; -} SwitchViewer_Widget::~SwitchViewer_Widget(){ delete m_switches; } SwitchViewer_Widget::SwitchViewer_Widget( QWidget& parent, - SwitchViewer& instance + SwitchViewer& session ) - : PanelWidget(parent, instance) - , m_session(instance.m_switches, 0) -{} -void SwitchViewer_Widget::construct(){ + : PanelWidget(parent, session) + , m_session(session.m_switches, 0) +{ QVBoxLayout* layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(make_header()); diff --git a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.h b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.h index f670e1edde..419ba10320 100644 --- a/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.h +++ b/SerialPrograms/Source/NintendoSwitch/Programs/NintendoSwitch_SwitchViewer.h @@ -23,10 +23,9 @@ class SwitchViewer_Descriptor : public PanelDescriptor{ -class SwitchViewer : public PanelSession{ +class SwitchViewer : public UiState{ public: SwitchViewer(const SwitchViewer_Descriptor& descriptor); - virtual QWidget* make_widget(QWidget& parent) override; public: // Serialization @@ -41,20 +40,17 @@ class SwitchViewer : public PanelSession{ -class SwitchViewer_Widget : public PanelWidget{ +class SwitchViewer_Widget final : public PanelWidget{ public: - static SwitchViewer_Widget* make( - QWidget& parent, - SwitchViewer& instance - ); + using ParentState = SwitchViewer; -private: +public: ~SwitchViewer_Widget(); - SwitchViewer_Widget( - QWidget& parent, - SwitchViewer& instance - ); - void construct(); + SwitchViewer_Widget(QWidget& parent, SwitchViewer& session); + + virtual QWidget& widget() override{ + return *this; + } private: MultiSwitchSystemSession m_session; diff --git a/SerialPrograms/Source/StaticRegistrationQt.cpp b/SerialPrograms/Source/StaticRegistrationQt.cpp index 1bb76bf5e7..8150aae888 100644 --- a/SerialPrograms/Source/StaticRegistrationQt.cpp +++ b/SerialPrograms/Source/StaticRegistrationQt.cpp @@ -35,6 +35,8 @@ // Common Framework #include "CommonFramework/Options/QtWidget/LabelCellWidget.h" #include "CommonFramework/Notifications/EventNotificationWidget.h" +#include "CommonFramework/Panels/UI/PanelWidget.h" +#include "CommonFramework/Panels/UI/SettingsPanelWidget.h" // Resource Download #include "CommonFramework/ResourceDownload/SettingsResourceDownloadWidget.h" @@ -44,6 +46,12 @@ #include "CommonTools/Options/QtWidgets/ScreenWatchWidget.h" #include "CommonTools/Options/QtWidgets/LanguageOCRWidget.h" +// ML +#include "ML/Programs/ML_LabelImagesWidget.h" + +// Computer Programs +#include "ComputerPrograms/Framework/ComputerProgramWidget.h" + // Controllers //#include "Controllers/NullControllerWidget.h" #include "Controllers/ControllerSelectorWidget.h" @@ -52,10 +60,14 @@ // Consoles #include "ConsoleInfra/ConsoleSystemWidget.h" +#include "ConsoleInfra/VirtualConsole.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" // Pokemon LA @@ -107,6 +119,8 @@ void register_all_statics(){ // Common Framework RegisterUiStateQtWidget(); RegisterUiStateQtWidget(); + RegisterUiStateQtWidget(); + RegisterUiStateQtWidget(); // Resource Download RegisterUiStateQtWidget(); @@ -122,6 +136,12 @@ void register_all_statics(){ RegisterUiStateQtWidget(); RegisterUiStateQtWidget(); + // ML + RegisterUiStateQtWidget(); + + // Computer Programs + RegisterUiStateQtWidget(); + // Controllers // RegisterUiStateQtWidget(); RegisterUiStateQtWidget(); @@ -130,10 +150,14 @@ void register_all_statics(){ // Consoles RegisterUiStateQtWidget(); + RegisterUiStateQtWidget(); // Nintendo Switch RegisterUiStateQtWidget(); RegisterUiStateQtWidget(); + RegisterUiStateQtWidget(); + RegisterUiStateQtWidget(); + RegisterUiStateQtWidget(); RegisterUiStateQtWidget(); // Pokemon LA