summaryrefslogtreecommitdiff
path: root/gtk2_ardour/generic_pluginui.cc
diff options
context:
space:
mode:
authorJulien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr>2016-07-28 19:43:43 +0200
committerJulien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr>2016-07-28 23:19:08 +0200
commit63bbcf968a11a3d6e89a6983d7bb810f487d63c1 (patch)
tree5bf12399b8953d75608b32561d9e19ff646baad8 /gtk2_ardour/generic_pluginui.cc
parent1d173bc84fb36f73be2bc9d58251ac110e4148eb (diff)
GenericUI: only connect one PropertyChanged callback
The code connected the callback to the PropertyChanged signal from the plugin once per filepath control created. Should the plugin have several files to open, this would be at best wasteful and at worst racy. Connect the callback a single time, since the same callback handles all property updates that we're interested in. Also rename the methods, members and typedefs so that it's clear what the code is trying to do.
Diffstat (limited to 'gtk2_ardour/generic_pluginui.cc')
-rw-r--r--gtk2_ardour/generic_pluginui.cc31
1 files changed, 19 insertions, 12 deletions
diff --git a/gtk2_ardour/generic_pluginui.cc b/gtk2_ardour/generic_pluginui.cc
index 316c7a1f0f..68bb429dbf 100644
--- a/gtk2_ardour/generic_pluginui.cc
+++ b/gtk2_ardour/generic_pluginui.cc
@@ -150,6 +150,14 @@ GenericPluginUI::GenericPluginUI (boost::shared_ptr<PluginInsert> pi, bool scrol
prefheight = 0;
build ();
+
+ /* Listen for property changes that are not notified normally because
+ * AutomationControl has only support for numeric values currently.
+ * The only case is Variant::PATH for now */
+ plugin->PropertyChanged.connect(*this, invalidator(*this),
+ boost::bind(&GenericPluginUI::path_property_changed, this, _1, _2),
+ gui_context());
+
main_contents.show ();
}
@@ -719,16 +727,15 @@ GenericPluginUI::build_control_ui (const Evoral::Parameter& param,
control_ui->pack_start (*control_ui->file_button, true, true);
}
- // Connect signals (TODO: do this via the Control)
+ // Monitor changes from the user.
control_ui->file_button->signal_file_set().connect(
- sigc::bind(sigc::mem_fun(*this, &GenericPluginUI::set_property),
+ sigc::bind(sigc::mem_fun(*this, &GenericPluginUI::set_path_property),
desc, control_ui->file_button));
- plugin->PropertyChanged.connect(*this, invalidator(*this),
- boost::bind(&GenericPluginUI::property_changed, this, _1, _2),
- gui_context());
- _property_controls.insert(std::make_pair(desc.key, control_ui->file_button));
- control_ui->file_button = control_ui->file_button;
+ /* Add the filebutton control to a map so that we can update it when
+ * the corresponding property changes. This doesn't go through the usual
+ * AutomationControls, because they don't support non-numeric values. */
+ _filepath_controls.insert(std::make_pair(desc.key, control_ui->file_button));
return control_ui;
}
@@ -1068,17 +1075,17 @@ GenericPluginUI::output_update ()
}
void
-GenericPluginUI::set_property (const ParameterDescriptor& desc,
- Gtk::FileChooserButton* widget)
+GenericPluginUI::set_path_property (const ParameterDescriptor& desc,
+ Gtk::FileChooserButton* widget)
{
plugin->set_property(desc.key, Variant(Variant::PATH, widget->get_filename()));
}
void
-GenericPluginUI::property_changed (uint32_t key, const Variant& value)
+GenericPluginUI::path_property_changed (uint32_t key, const Variant& value)
{
- PropertyControls::iterator c = _property_controls.find(key);
- if (c != _property_controls.end()) {
+ FilePathControls::iterator c = _filepath_controls.find(key);
+ if (c != _filepath_controls.end()) {
c->second->set_filename(value.get_path());
} else {
std::cerr << "warning: property change for property with no control" << std::endl;