From 808a0cbc8d47f2c77fc69f2ad850d2e91dc9ca21 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Tue, 19 Jul 2022 09:55:42 -0400 Subject: Use a uniform interface for changing settings in the UI --- src/Configuration.cpp | 2 +- src/Configuration.hpp | 17 +++++++++++++ src/Patchage.cpp | 68 +++++++++++++++++++++++---------------------------- src/Patchage.hpp | 5 ---- src/Reactor.cpp | 26 ++++++++++++++++++++ src/Reactor.hpp | 1 + 6 files changed, 76 insertions(+), 43 deletions(-) (limited to 'src') diff --git a/src/Configuration.cpp b/src/Configuration.cpp index 44b61d0..4597c37 100644 --- a/src/Configuration.cpp +++ b/src/Configuration.cpp @@ -34,7 +34,7 @@ Configuration::Configuration(std::function on_change) std::get(_settings).value = Coord{960.0, 540.0}; std::get(_settings).value = 1.0f; -#ifdef PATCHAGE_USE_LIGHT_THEME +#if PATCHAGE_USE_LIGHT_THEME _port_colors[static_cast(PortType::jack_audio)] = _default_port_colors[static_cast(PortType::jack_audio)] = 0xA4BC8CFF; diff --git a/src/Configuration.hpp b/src/Configuration.hpp index 6a59076..770a240 100644 --- a/src/Configuration.hpp +++ b/src/Configuration.hpp @@ -63,6 +63,23 @@ public: } } + // Set a global configuration setting + template + void set_setting(S new_setting) + { + set(new_setting.value); + } + + // Set a global port color setting + void set_setting(setting::PortColor new_setting) + { + auto& color = _port_colors[static_cast(new_setting.type)]; + + if (color != new_setting.color) { + set_port_color(new_setting.type, new_setting.color); + } + } + // Get a global configuration setting template const decltype(S::value) get() const diff --git a/src/Patchage.cpp b/src/Patchage.cpp index 122aae2..6d6c13e 100644 --- a/src/Patchage.cpp +++ b/src/Patchage.cpp @@ -86,6 +86,7 @@ PATCHAGE_RESTORE_WARNINGS #include #include #include +#include #include #include @@ -155,6 +156,13 @@ port_order(const GanvPort* a, const GanvPort* b, void*) return 0; } +template +void +on_setting_toggled(Reactor* const reactor, const Gtk::CheckMenuItem* const item) +{ + (*reactor)(action::ChangeSetting{{S{item->get_active()}}}); +} + } // namespace #define INIT_WIDGET(x) x(_xml, (#x) + 1) @@ -242,18 +250,35 @@ Patchage::Patchage(Options options) sigc::mem_fun(this, &Patchage::on_export_image)); _menu_view_refresh->signal_activate().connect(sigc::bind( sigc::mem_fun(this, &Patchage::on_menu_action), Action{action::Refresh{}})); + _menu_view_human_names->signal_activate().connect( - sigc::mem_fun(this, &Patchage::on_view_human_names)); + sigc::bind(sigc::ptr_fun(&on_setting_toggled), + &_reactor, + _menu_view_human_names.get())); + _menu_view_sort_ports->signal_activate().connect( - sigc::mem_fun(this, &Patchage::on_view_sort_ports)); + sigc::bind(sigc::ptr_fun(&on_setting_toggled), + &_reactor, + _menu_view_sort_ports.get())); + _menu_view_arrange->signal_activate().connect( sigc::mem_fun(this, &Patchage::on_arrange)); + _menu_view_sprung_layout->signal_activate().connect( - sigc::mem_fun(this, &Patchage::on_sprung_layout_toggled)); + sigc::bind(sigc::ptr_fun(&on_setting_toggled), + &_reactor, + _menu_view_sprung_layout.get())); + _menu_view_messages->signal_activate().connect( - sigc::mem_fun(this, &Patchage::on_view_messages)); + sigc::bind(sigc::ptr_fun(&on_setting_toggled), + &_reactor, + _menu_view_messages.get())); + _menu_view_toolbar->signal_activate().connect( - sigc::mem_fun(this, &Patchage::on_view_toolbar)); + sigc::bind(sigc::ptr_fun(&on_setting_toggled), + &_reactor, + _menu_view_toolbar.get())); + _menu_help_about->signal_activate().connect( sigc::mem_fun(this, &Patchage::on_help_about)); @@ -757,12 +782,6 @@ Patchage::on_arrange() } } -void -Patchage::on_sprung_layout_toggled() -{ - _conf.set(_menu_view_sprung_layout->get_active()); -} - void Patchage::on_help_about() { @@ -770,23 +789,10 @@ Patchage::on_help_about() _about_win->hide(); } -void -Patchage::on_view_human_names() -{ - _conf.set(_menu_view_human_names->get_active()); -} - -void -Patchage::on_view_sort_ports() -{ - _conf.set(_menu_view_sort_ports->get_active()); - _reactor(action::Refresh{}); -} - void Patchage::on_legend_color_change(PortType id, const std::string&, uint32_t rgba) { - _conf.set_port_color(id, rgba); + _reactor(action::ChangeSetting{{setting::PortColor{id, rgba}}}); } void @@ -872,18 +878,6 @@ Patchage::on_export_image() } } -void -Patchage::on_view_messages() -{ - _conf.set(_menu_view_messages->get_active()); -} - -void -Patchage::on_view_toolbar() -{ - _conf.set(_menu_view_toolbar->get_active()); -} - bool Patchage::on_scroll(GdkEventScroll*) { diff --git a/src/Patchage.hpp b/src/Patchage.hpp index f5462ce..6f70620 100644 --- a/src/Patchage.hpp +++ b/src/Patchage.hpp @@ -114,15 +114,10 @@ protected: void on_conf_change(const Setting& setting); void on_arrange(); - void on_sprung_layout_toggled(); void on_help_about(); void on_quit(); void on_export_image(); - void on_view_messages(); - void on_view_toolbar(); void on_store_positions(); - void on_view_human_names(); - void on_view_sort_ports(); void on_legend_color_change(PortType id, const std::string& label, diff --git a/src/Reactor.cpp b/src/Reactor.cpp index 02eb108..f72086d 100644 --- a/src/Reactor.cpp +++ b/src/Reactor.cpp @@ -31,6 +31,25 @@ PATCHAGE_RESTORE_WARNINGS namespace patchage { +class SettingVisitor +{ +public: + using result_type = void; ///< For boost::apply_visitor + + explicit SettingVisitor(Configuration& conf) + : _conf{conf} + {} + + template + void operator()(const S& setting) const + { + _conf.set_setting(setting); + } + +private: + Configuration& _conf; +}; + inline std::ostream& operator<<(std::ostream& os, const ClientType type) { @@ -54,6 +73,13 @@ Reactor::Reactor(Configuration& conf, , _log{log} {} +void +Reactor::operator()(const action::ChangeSetting& action) +{ + SettingVisitor visitor{_conf}; + boost::apply_visitor(visitor, action.setting); +} + void Reactor::operator()(const action::ConnectPorts& action) { diff --git a/src/Reactor.hpp b/src/Reactor.hpp index 4d92793..b053fed 100644 --- a/src/Reactor.hpp +++ b/src/Reactor.hpp @@ -40,6 +40,7 @@ public: ~Reactor() = default; + void operator()(const action::ChangeSetting& action); void operator()(const action::ConnectPorts& action); void operator()(const action::DecreaseFontSize& action); void operator()(const action::DisconnectClient& action); -- cgit v1.2.1