diff options
author | David Robillard <d@drobilla.net> | 2022-07-19 09:55:42 -0400 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2022-07-20 10:35:32 -0400 |
commit | 808a0cbc8d47f2c77fc69f2ad850d2e91dc9ca21 (patch) | |
tree | 1aae618f7f8fb79bf5a405e740dfb6a6bfbe7d23 | |
parent | 2f6bec60c6bd0f4bac2a8a5f47b1994b65ed7ed0 (diff) | |
download | patchage-808a0cbc8d47f2c77fc69f2ad850d2e91dc9ca21.tar.gz patchage-808a0cbc8d47f2c77fc69f2ad850d2e91dc9ca21.tar.bz2 patchage-808a0cbc8d47f2c77fc69f2ad850d2e91dc9ca21.zip |
Use a uniform interface for changing settings in the UI
-rw-r--r-- | src/Configuration.cpp | 2 | ||||
-rw-r--r-- | src/Configuration.hpp | 17 | ||||
-rw-r--r-- | src/Patchage.cpp | 68 | ||||
-rw-r--r-- | src/Patchage.hpp | 5 | ||||
-rw-r--r-- | src/Reactor.cpp | 26 | ||||
-rw-r--r-- | src/Reactor.hpp | 1 |
6 files changed, 76 insertions, 43 deletions
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<void(const Setting&)> on_change) std::get<setting::WindowSize>(_settings).value = Coord{960.0, 540.0}; std::get<setting::Zoom>(_settings).value = 1.0f; -#ifdef PATCHAGE_USE_LIGHT_THEME +#if PATCHAGE_USE_LIGHT_THEME _port_colors[static_cast<unsigned>(PortType::jack_audio)] = _default_port_colors[static_cast<unsigned>(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<class S> + void set_setting(S new_setting) + { + set<S>(new_setting.value); + } + + // Set a global port color setting + void set_setting(setting::PortColor new_setting) + { + auto& color = _port_colors[static_cast<unsigned>(new_setting.type)]; + + if (color != new_setting.color) { + set_port_color(new_setting.type, new_setting.color); + } + } + // Get a global configuration setting template<class S> 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 <gtkmm/window.h> #include <sigc++/adaptors/bind.h> #include <sigc++/functors/mem_fun.h> +#include <sigc++/functors/ptr_fun.h> #include <sigc++/signal.h> #include <algorithm> @@ -155,6 +156,13 @@ port_order(const GanvPort* a, const GanvPort* b, void*) return 0; } +template<class S> +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<setting::HumanNames>), + &_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<setting::SortedPorts>), + &_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<setting::SprungLayout>), + &_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<setting::MessagesVisible>), + &_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<setting::ToolbarVisible>), + &_reactor, + _menu_view_toolbar.get())); + _menu_help_about->signal_activate().connect( sigc::mem_fun(this, &Patchage::on_help_about)); @@ -758,12 +783,6 @@ Patchage::on_arrange() } void -Patchage::on_sprung_layout_toggled() -{ - _conf.set<setting::SprungLayout>(_menu_view_sprung_layout->get_active()); -} - -void Patchage::on_help_about() { _about_win->run(); @@ -771,22 +790,9 @@ Patchage::on_help_about() } void -Patchage::on_view_human_names() -{ - _conf.set<setting::HumanNames>(_menu_view_human_names->get_active()); -} - -void -Patchage::on_view_sort_ports() -{ - _conf.set<setting::SortedPorts>(_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<setting::MessagesVisible>(_menu_view_messages->get_active()); -} - -void -Patchage::on_view_toolbar() -{ - _conf.set<setting::ToolbarVisible>(_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<class S> + void operator()(const S& setting) const + { + _conf.set_setting(setting); + } + +private: + Configuration& _conf; +}; + inline std::ostream& operator<<(std::ostream& os, const ClientType type) { @@ -55,6 +74,13 @@ Reactor::Reactor(Configuration& conf, {} void +Reactor::operator()(const action::ChangeSetting& action) +{ + SettingVisitor visitor{_conf}; + boost::apply_visitor(visitor, action.setting); +} + +void Reactor::operator()(const action::ConnectPorts& action) { if (action.tail.type() == action.head.type()) { 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); |