diff options
| -rw-r--r-- | api/plugin-api.cpp | 9 | ||||
| -rw-r--r-- | api/plugin-api.hpp | 9 | ||||
| -rw-r--r-- | gui/settings.cpp | 110 | ||||
| -rw-r--r-- | gui/settings.hpp | 20 | ||||
| -rw-r--r-- | opentrack/main-window.cpp | 40 | 
5 files changed, 147 insertions, 41 deletions
| diff --git a/api/plugin-api.cpp b/api/plugin-api.cpp index b6de3b16..3bfe9855 100644 --- a/api/plugin-api.cpp +++ b/api/plugin-api.cpp @@ -24,6 +24,9 @@ void BaseDialog::done(int)  }  bool BaseDialog::embeddable() noexcept { return false; } +void BaseDialog::save() {} +void BaseDialog::reload() {} +void BaseDialog::set_buttons_visible(bool x) {}  } // ns plugin_api::detail @@ -38,10 +41,14 @@ IFilter::IFilter() = default;  IFilter::~IFilter() = default;  IFilterDialog::IFilterDialog() = default;  IFilterDialog::~IFilterDialog() = default; +void IFilterDialog::register_filter(IFilter* filter) {} +void IFilterDialog::unregister_filter() {}  IProtocol::IProtocol() = default;  IProtocol::~IProtocol() = default;  IProtocolDialog::IProtocolDialog() = default;  IProtocolDialog::~IProtocolDialog() = default; +void IProtocolDialog::register_protocol(IProtocol* protocol){} +void IProtocolDialog::unregister_protocol() {}  ITracker::ITracker() = default;  ITracker::~ITracker() = default;  bool ITracker::center() { return false; } @@ -49,7 +56,6 @@ ITrackerDialog::ITrackerDialog() = default;  ITrackerDialog::~ITrackerDialog() = default;  void ITrackerDialog::register_tracker(ITracker*) {}  void ITrackerDialog::unregister_tracker() {} -void ITrackerDialog::set_buttons_visible(bool) {}  IExtension::~IExtension() = default;  IExtensionDialog::~IExtensionDialog() = default; @@ -57,7 +63,6 @@ bool module_status::is_ok() const  {      return error.isNull();  } -  module_status_mixin::~module_status_mixin() = default;  module_status::module_status(const QString& error) : error(error) {}  module_status::module_status() = default; diff --git a/api/plugin-api.hpp b/api/plugin-api.hpp index ab43884a..9cc87f82 100644 --- a/api/plugin-api.hpp +++ b/api/plugin-api.hpp @@ -43,6 +43,9 @@ protected:  public:      void closeEvent(QCloseEvent *) override;      virtual bool embeddable() noexcept; +    virtual void set_buttons_visible(bool x);   // XXX TODO remove it once all modules are converted +    virtual void save();                        // XXX HACK should be pure virtual +    virtual void reload();                      // XXX HACK should be pure virtual -sh 20211214  signals:      void closing();  private slots: @@ -216,17 +219,11 @@ struct OTR_API_EXPORT ITrackerDialog : public plugin_api::detail::BaseDialog      virtual void register_tracker(ITracker *tracker);      // received tracker pointer is about to get deleted      virtual void unregister_tracker(); -    virtual void set_buttons_visible(bool x);   // XXX TODO remove it once all modules are converted -    virtual void save();                        // XXX HACK should be pure virtual -    virtual void reload();                      // XXX HACK should be pure virtual -sh 20211214      ITrackerDialog();      ~ITrackerDialog() override;  }; -inline void ITrackerDialog::save() {} -inline void ITrackerDialog::reload() {} -  // call once with your chosen class names in the plugin  #define OPENTRACK_DECLARE_TRACKER(tracker_class, dialog_class, metadata_class) \      OPENTRACK_DECLARE_PLUGIN_INTERNAL(tracker_class, ITracker, metadata_class, dialog_class, ITrackerDialog) diff --git a/gui/settings.cpp b/gui/settings.cpp index 907fe8f3..7d74c762 100644 --- a/gui/settings.cpp +++ b/gui/settings.cpp @@ -47,6 +47,8 @@ void options_dialog::set_disable_translation_state(bool value)  }  options_dialog::options_dialog(std::unique_ptr<ITrackerDialog>& tracker_dialog_, +                               std::unique_ptr<IProtocolDialog>& proto_dialog_, +                               std::unique_ptr<IFilterDialog>& filter_dialog_,                                 std::function<void(bool)> pause_keybindings) :      pause_keybindings(std::move(pause_keybindings))  { @@ -177,6 +179,18 @@ options_dialog::options_dialog(std::unique_ptr<ITrackerDialog>& tracker_dialog_,          tracker_dialog->set_buttons_visible(false);          ui.tabWidget->addTab(tracker_dialog, tr("Tracker"));      } +    if (proto_dialog_ && proto_dialog_->embeddable()) +    { +        proto_dialog = proto_dialog_.release(); +        proto_dialog->set_buttons_visible(false); +        ui.tabWidget->addTab(proto_dialog, tr("Output")); +    } +    if (filter_dialog_ && filter_dialog_->embeddable()) +    { +        filter_dialog = filter_dialog_.release(); +        filter_dialog->set_buttons_visible(false); +        ui.tabWidget->addTab(filter_dialog, tr("Filter")); +    }  }  void options_dialog::bind_key(key_opts& kopts, QLabel* label) @@ -236,23 +250,23 @@ void options_dialog::switch_to_tracker_tab()      if (tracker_dialog)          ui.tabWidget->setCurrentWidget(tracker_dialog);      else -        eval_once(qDebug() << "options: asked for tab widget with old-style widget dialog!"); +        eval_once(qDebug() << "options: asked for tracker tab widget with old-style widget dialog!");  } -void options_dialog::unregister_tracker() +void options_dialog::switch_to_proto_tab()  { -    if (tracker_dialog) -    { -        tracker_dialog->unregister_tracker(); -    } +    if (proto_dialog) +        ui.tabWidget->setCurrentWidget(proto_dialog); +    else +        eval_once(qDebug() << "options: asked for proto tab widget with old-style widget dialog!");  } -void options_dialog::register_tracker(ITracker* t) +void options_dialog::switch_to_filter_tab()  { -    if (tracker_dialog) -    { -        tracker_dialog->register_tracker(t); -    } +    if (filter_dialog) +        ui.tabWidget->setCurrentWidget(filter_dialog); +    else +        eval_once(qDebug() << "options: asked for filter tab widget with old-style widget dialog!");  }  void options_dialog::tracker_module_changed() @@ -266,14 +280,75 @@ void options_dialog::tracker_module_changed()      }  } +void options_dialog::proto_module_changed() +{ +    if (proto_dialog) +    { +        unregister_protocol(); +        reload(); +        delete proto_dialog; +        proto_dialog = nullptr; +    } +} + +void options_dialog::filter_module_changed() +{ +    if (filter_dialog) +    { +        unregister_filter(); +        reload(); +        delete filter_dialog; +        filter_dialog = nullptr; +    } +} + +void options_dialog::register_tracker(ITracker* t) +{ +    if (tracker_dialog) +        tracker_dialog->register_tracker(t); +} + +void options_dialog::unregister_tracker() +{ +    if (tracker_dialog) +        tracker_dialog->unregister_tracker(); +} + +void options_dialog::register_protocol(IProtocol* p) +{ +    if (proto_dialog) +        proto_dialog->register_protocol(p); +} + +void options_dialog::unregister_protocol() +{ +    if (proto_dialog) +        proto_dialog->unregister_protocol(); +} + +void options_dialog::register_filter(IFilter* f) +{ +    if (filter_dialog) +        filter_dialog->register_filter(f); +} + +void options_dialog::unregister_filter() +{ +    if (filter_dialog) +        filter_dialog->unregister_filter(); +} + +using module_list = std::initializer_list<plugin_api::detail::BaseDialog*>; +  void options_dialog::save()  {      main.b->save();      ui.game_detector->save();      set_disable_translation_state(ui.disable_translation->isChecked()); -    if (tracker_dialog) -        tracker_dialog->save(); +    for (auto* dlg : module_list{ tracker_dialog, proto_dialog, filter_dialog }) +        if (dlg) +            dlg->save();  }  void options_dialog::reload() @@ -281,8 +356,9 @@ void options_dialog::reload()      ui.game_detector->revert();      main.b->reload(); -    if (tracker_dialog) -        tracker_dialog->reload(); +    for (auto* dlg : module_list{ tracker_dialog, proto_dialog, filter_dialog }) +        if (dlg) +            dlg->reload();  }  void options_dialog::doOK() @@ -313,4 +389,8 @@ options_dialog::~options_dialog()  {      if (tracker_dialog)          tracker_dialog->unregister_tracker(); +    if (proto_dialog) +        proto_dialog->unregister_protocol(); +    if (filter_dialog) +        filter_dialog->unregister_filter();  } diff --git a/gui/settings.hpp b/gui/settings.hpp index 268ccb73..2cb3492c 100644 --- a/gui/settings.hpp +++ b/gui/settings.hpp @@ -17,13 +17,24 @@ class OTR_GUI_EXPORT options_dialog final : public QDialog  signals:      void closing();  public: -    options_dialog(std::unique_ptr<ITrackerDialog>& tracker_dialog, std::function<void(bool)> pause_keybindings); +    options_dialog(std::unique_ptr<ITrackerDialog>& tracker_dialog_, +                   std::unique_ptr<IProtocolDialog>& proto_dialog_, +                   std::unique_ptr<IFilterDialog>& filter_dialog_, +                   std::function<void(bool)> pause_keybindings);      ~options_dialog() override;      inline bool embeddable() noexcept { return false; }      void switch_to_tracker_tab(); +    void switch_to_proto_tab(); +    void switch_to_filter_tab(); +    void tracker_module_changed(); +    void proto_module_changed(); +    void filter_module_changed();      void register_tracker(ITracker* t);      void unregister_tracker(); -    void tracker_module_changed(); +    void register_protocol(IProtocol* p); +    void unregister_protocol(); +    void register_filter(IFilter* f); +    void unregister_filter();      void save();      void reload();  private: @@ -33,7 +44,10 @@ private:      main_settings main;      std::function<void(bool)> pause_keybindings;      Ui::options_dialog ui; -    ITrackerDialog* tracker_dialog = nullptr; + +    ITrackerDialog*  tracker_dialog = nullptr; +    IProtocolDialog* proto_dialog   = nullptr; +    IFilterDialog*   filter_dialog  = nullptr;  private slots:      void doOK(); diff --git a/opentrack/main-window.cpp b/opentrack/main-window.cpp index d16e7854..f68e1c25 100644 --- a/opentrack/main-window.cpp +++ b/opentrack/main-window.cpp @@ -89,10 +89,10 @@ void main_window::init_dylibs()              this, [this](const QString&) { pTrackerDialog = nullptr; if (options_widget) options_widget->tracker_module_changed(); });      connect(ui.iconcomboProtocol, &QComboBox::currentTextChanged, -            this, [this](const QString&) { pProtocolDialog = nullptr; }); +            this, [this](const QString&) { pProtocolDialog = nullptr; if (options_widget) options_widget->proto_module_changed(); });      connect(ui.iconcomboFilter, &QComboBox::currentTextChanged, -            this, [this](const QString&) { pFilterDialog = nullptr; }); +            this, [this](const QString&) { pFilterDialog = nullptr; if (options_widget) options_widget->filter_module_changed(); });      connect(&m.tracker_dll, value_::value_changed<QString>(),              this, &main_window::save_modules, @@ -409,24 +409,22 @@ void main_window::start_tracker_()      }      if (pTrackerDialog) -    { -        auto* tracker = &*work->libs.pTracker; -        pTrackerDialog->register_tracker(tracker); -    } - -    if (options_widget) -    { -        // XXX TODO other module types -        auto* tracker = &*work->libs.pTracker; -        options_widget->register_tracker(tracker); -    } +        pTrackerDialog->register_tracker(&*work->libs.pTracker); -    if (pFilterDialog) +    if (pFilterDialog && work->libs.pFilter)          pFilterDialog->register_filter(&*work->libs.pFilter);      if (pProtocolDialog)          pProtocolDialog->register_protocol(&*work->libs.pProtocol); +    if (options_widget) +    { +        options_widget->register_tracker(&*work->libs.pTracker); +        options_widget->register_protocol(&*work->libs.pProtocol); +        if (work->libs.pFilter) +            options_widget->register_filter(&*work->libs.pFilter); +    } +      pose_update_timer.start(15);      // NB check valid since SelectedLibraries ctor called @@ -619,6 +617,11 @@ void main_window::show_proto_settings_(bool show)          QObject::connect(&*pProtocolDialog, &IProtocolDialog::closing,                           this, [this] { pProtocolDialog = nullptr; });      } +    else if (show && pFilterDialog && pProtocolDialog->embeddable()) +    { +        show_options_dialog(); +        options_widget->switch_to_proto_tab(); +    }  }  void main_window::show_filter_settings_(bool show) @@ -629,6 +632,11 @@ void main_window::show_filter_settings_(bool show)          QObject::connect(&*pFilterDialog, &IFilterDialog::closing,                           this, [this] { pFilterDialog = nullptr; });      } +    else if (show && pFilterDialog && pFilterDialog->embeddable()) +    { +        show_options_dialog(); +        options_widget->switch_to_filter_tab(); +    }  }  void main_window::show_options_dialog() @@ -637,8 +645,10 @@ void main_window::show_options_dialog()          return;      show_tracker_settings_(false); +    show_proto_settings_(false); +    show_filter_settings_(false); -    if (mk_window(options_widget, true, pTrackerDialog, +    if (mk_window(options_widget, true, pTrackerDialog, pProtocolDialog, pFilterDialog,                    [this](bool flag) { set_keys_enabled(!flag); }))      {          // move shortcuts to a separate bundle and add a migration -sh 20180218 | 
