diff --git a/gtk2_ardour/plugin_interest.h b/gtk2_ardour/plugin_interest.h index 047fe708c0..7661a84d33 100644 --- a/gtk2_ardour/plugin_interest.h +++ b/gtk2_ardour/plugin_interest.h @@ -30,7 +30,7 @@ class PluginInterestedObject { PluginInterestedObject() {} virtual ~PluginInterestedObject() {} - virtual void use_plugins (const SelectedPlugins&) = 0; + virtual bool use_plugins (const SelectedPlugins&) = 0; }; #endif /* __gtkardour_plugin_interest_h__ */ diff --git a/gtk2_ardour/plugin_selector.cc b/gtk2_ardour/plugin_selector.cc index 890c09ede2..7953290b00 100644 --- a/gtk2_ardour/plugin_selector.cc +++ b/gtk2_ardour/plugin_selector.cc @@ -63,7 +63,7 @@ static const char* _filter_mode_strings[] = { }; PluginSelector::PluginSelector (PluginManager *mgr) - : ArdourDialog (_("ardour: plugins"), true, false), + : ArdourDialog (_("Plugin Manager"), true, false), filter_button (Stock::CLEAR) { set_position (Gtk::WIN_POS_MOUSE); @@ -442,29 +442,36 @@ PluginSelector::run () { ResponseType r; TreeModel::Children::iterator i; - SelectedPlugins plugins; - r = (ResponseType) Dialog::run (); + bool finish = false; + + while (!finish) { - switch (r) { - case RESPONSE_APPLY: - for (i = amodel->children().begin(); i != amodel->children().end(); ++i) { - PluginInfoPtr pp = (*i)[acols.plugin]; - PluginPtr p = load_plugin (pp); - if (p) { - plugins.push_back (p); + SelectedPlugins plugins; + r = (ResponseType) Dialog::run (); + + switch (r) { + case RESPONSE_APPLY: + for (i = amodel->children().begin(); i != amodel->children().end(); ++i) { + PluginInfoPtr pp = (*i)[acols.plugin]; + PluginPtr p = load_plugin (pp); + if (p) { + plugins.push_back (p); + } } + if (interested_object && !plugins.empty()) { + finish = !interested_object->use_plugins (plugins); + } + + break; + + default: + finish = true; + break; } - if (interested_object && !plugins.empty()) { - interested_object->use_plugins (plugins); - } - - break; - - default: - break; } - + + hide(); amodel->clear(); interested_object = 0; diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 4b34bd0f68..e5d479b9ab 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -742,7 +742,8 @@ ProcessorBox::choose_plugin () _get_plugin_selector()->set_interested_object (*this); } -void +/** @return true if an error occurred, otherwise false */ +bool ProcessorBox::use_plugins (const SelectedPlugins& plugins) { for (SelectedPlugins::const_iterator p = plugins.begin(); p != plugins.end(); ++p) { @@ -757,6 +758,7 @@ ProcessorBox::use_plugins (const SelectedPlugins& plugins) if (_route->add_processor (processor, _placement, &err_streams)) { weird_plugin_dialog (**p, err_streams); + return true; // XXX SHAREDPTR delete plugin here .. do we even need to care? } else { @@ -765,12 +767,14 @@ ProcessorBox::use_plugins (const SelectedPlugins& plugins) } } } + + return false; } void ProcessorBox::weird_plugin_dialog (Plugin& p, Route::ProcessorStreams streams) { - ArdourDialog dialog (_("ardour: weird plugin dialog")); + ArdourDialog dialog (_("Plugin Incompatibility")); Label label; string text = string_compose(_("You attempted to add the plugin \"%1\" at index %2.\n"), diff --git a/gtk2_ardour/processor_box.h b/gtk2_ardour/processor_box.h index 5c5035c1d2..1e4257d22b 100644 --- a/gtk2_ardour/processor_box.h +++ b/gtk2_ardour/processor_box.h @@ -197,7 +197,7 @@ class ProcessorBox : public Gtk::HBox, public PluginInterestedObject, public ARD void return_io_finished (IOSelector::Result, boost::weak_ptr, IOSelectorWindow*); void choose_insert (); void choose_plugin (); - void use_plugins (const SelectedPlugins&); + bool use_plugins (const SelectedPlugins&); bool no_processor_redisplay;