summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2022-07-19 09:55:42 -0400
committerDavid Robillard <d@drobilla.net>2022-07-20 10:35:32 -0400
commit808a0cbc8d47f2c77fc69f2ad850d2e91dc9ca21 (patch)
tree1aae618f7f8fb79bf5a405e740dfb6a6bfbe7d23
parent2f6bec60c6bd0f4bac2a8a5f47b1994b65ed7ed0 (diff)
downloadpatchage-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.cpp2
-rw-r--r--src/Configuration.hpp17
-rw-r--r--src/Patchage.cpp68
-rw-r--r--src/Patchage.hpp5
-rw-r--r--src/Reactor.cpp26
-rw-r--r--src/Reactor.hpp1
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);