X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fprocessor_box.cc;h=e5d479b9ab5434829b00106f762898116af1710c;hb=f0db054a07ecc9d49fede8fcc9175a85c635369f;hp=9c3c7902bb5a4153c5746801a33b9410ba826acc;hpb=44f4b84551d36ef4103d09452768f5ba53e0002c;p=ardour.git diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 9c3c7902bb..e5d479b9ab 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -42,7 +42,6 @@ #include "ardour/amp.h" #include "ardour/ardour.h" -#include "ardour/audio_diskstream.h" #include "ardour/audio_track.h" #include "ardour/audioengine.h" #include "ardour/internal_send.h" @@ -88,6 +87,8 @@ using namespace Gtkmm2ext; ProcessorBox* ProcessorBox::_current_processor_box = 0; RefPtr ProcessorBox::paste_action; +RefPtr ProcessorBox::cut_action; +RefPtr ProcessorBox::rename_action; Glib::RefPtr SendProcessorEntry::_slider; ProcessorEntry::ProcessorEntry (boost::shared_ptr p, Width w) @@ -106,8 +107,8 @@ ProcessorEntry::ProcessorEntry (boost::shared_ptr p, Width w) _active.set_active (_processor->active ()); _active.signal_toggled().connect (sigc::mem_fun (*this, &ProcessorEntry::active_toggled)); - _processor->ActiveChanged.connect (active_connection, boost::bind (&ProcessorEntry::processor_active_changed, this), gui_context()); - _processor->PropertyChanged.connect (name_connection, ui_bind (&ProcessorEntry::processor_property_changed, this, _1), gui_context()); + _processor->ActiveChanged.connect (active_connection, invalidator (*this), boost::bind (&ProcessorEntry::processor_active_changed, this), gui_context()); + _processor->PropertyChanged.connect (name_connection, invalidator (*this), ui_bind (&ProcessorEntry::processor_property_changed, this, _1), gui_context()); } EventBox& @@ -176,10 +177,6 @@ ProcessorEntry::name () const boost::shared_ptr send; string name_display; - if (!_processor->active()) { - name_display = " ("; - } - if ((send = boost::dynamic_pointer_cast (_processor)) != 0 && !boost::dynamic_pointer_cast(_processor)) { @@ -213,10 +210,6 @@ ProcessorEntry::name () const } - if (!_processor->active()) { - name_display += ')'; - } - return name_display; } @@ -231,7 +224,7 @@ SendProcessorEntry::SendProcessorEntry (boost::shared_ptr s, Width w) _vbox.pack_start (_fader); _adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &SendProcessorEntry::gain_adjusted)); - _send->amp()->gain_control()->Changed.connect (send_gain_connection, boost::bind (&SendProcessorEntry::show_gain, this), gui_context()); + _send->amp()->gain_control()->Changed.connect (send_gain_connection, invalidator (*this), boost::bind (&SendProcessorEntry::show_gain, this), gui_context()); show_gain (); } @@ -328,9 +321,9 @@ ProcessorBox::set_route (boost::shared_ptr r) no_processor_redisplay = false; _route = r; - _route->processors_changed.connect (connections, ui_bind (&ProcessorBox::route_processors_changed, this, _1), gui_context()); - _route->DropReferences.connect (connections, boost::bind (&ProcessorBox::route_going_away, this), gui_context()); - _route->PropertyChanged.connect (connections, ui_bind (&ProcessorBox::route_property_changed, this, _1), gui_context()); + _route->processors_changed.connect (connections, invalidator (*this), ui_bind (&ProcessorBox::route_processors_changed, this, _1), gui_context()); + _route->DropReferences.connect (connections, invalidator (*this), boost::bind (&ProcessorBox::route_going_away, this), gui_context()); + _route->PropertyChanged.connect (connections, invalidator (*this), ui_bind (&ProcessorBox::route_property_changed, this, _1), gui_context()); redisplay_processors (); } @@ -494,6 +487,7 @@ ProcessorBox::show_processor_menu (gint arg) } } + cut_action->set_sensitive (can_cut()); paste_action->set_sensitive (!_rr_selection.processors.empty()); processor_menu->popup (1, arg); @@ -723,6 +717,11 @@ ProcessorBox::selection_changed () { bool sensitive = (processor_display.selection().empty()) ? false : true; ActionManager::set_sensitive (ActionManager::plugin_selection_sensitive_actions, sensitive); + + /* disallow rename for multiple selections and for plugin inserts */ + rename_action->set_sensitive ( + processor_display.selection().size() == 1 && boost::dynamic_pointer_cast (processor_display.selection().front()->processor()) == 0 + ); } void @@ -743,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) { @@ -758,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 { @@ -766,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"), @@ -1054,6 +1057,27 @@ ProcessorBox::rename_processors () } } +bool +ProcessorBox::can_cut () const +{ + vector > sel; + + get_selected_processors (sel); + + /* cut_processors () does not cut inserts */ + + for (vector >::const_iterator i = sel.begin (); i != sel.end (); ++i) { + + if (boost::dynamic_pointer_cast((*i)) != 0 || + (boost::dynamic_pointer_cast((*i)) != 0) || + (boost::dynamic_pointer_cast((*i)) != 0)) { + return true; + } + } + + return false; +} + void ProcessorBox::cut_processors () { @@ -1221,11 +1245,27 @@ ProcessorBox::rename_processor (boost::shared_ptr processor) case Gtk::RESPONSE_ACCEPT: name_prompter.get_result (result); if (result.length()) { - if (_session->route_by_name (result)) { - ARDOUR_UI::instance()->popup_error (_("A track already exists with that name.")); - return; - } - processor->set_name (result); + + int tries = 0; + string test = result; + + while (tries < 100) { + if (_session->io_name_is_legal (test)) { + result = test; + break; + } + tries++; + + test = string_compose ("%1-%2", result, tries); + } + + if (tries < 100) { + processor->set_name (result); + } else { + /* unlikely! */ + ARDOUR_UI::instance()->popup_error + (string_compose (_("At least 100 IO objects exist with a name like %1 - name not changed"), result)); + } } break; } @@ -1282,19 +1322,35 @@ ProcessorBox::paste_processor_state (const XMLNodeList& nlist, boost::shared_ptr XMLNode n (**niter); Send::make_unique (n, *_session); - p.reset (new Send (*_session, _route->mute_master(), n)); + Send* s = new Send (*_session, _route->mute_master()); + if (s->set_state (n, Stateful::loading_state_version)) { + delete s; + return; + } + + p.reset (s); + } else if (type->value() == "return") { XMLNode n (**niter); Return::make_unique (n, *_session); - p.reset (new Return (*_session, **niter)); + Return* r = new Return (*_session); + + if (r->set_state (n, Stateful::loading_state_version)) { + delete r; + return; + } + + p.reset (r); } else { /* XXX its a bit limiting to assume that everything else is a plugin. */ - p.reset (new PluginInsert (*_session, **niter)); + + p.reset (new PluginInsert (*_session)); + p->set_state (**niter, Stateful::current_state_version); } copies.push_back (p); @@ -1333,10 +1389,10 @@ ProcessorBox::deactivate_processor (boost::shared_ptr r) } void -ProcessorBox::get_selected_processors (ProcSelection& processors) +ProcessorBox::get_selected_processors (ProcSelection& processors) const { - list selection = processor_display.selection (); - for (list::iterator i = selection.begin(); i != selection.end(); ++i) { + const list selection = processor_display.selection (); + for (list::const_iterator i = selection.begin(); i != selection.end(); ++i) { processors.push_back ((*i)->processor ()); } } @@ -1551,9 +1607,9 @@ ProcessorBox::register_actions () sigc::ptr_fun (ProcessorBox::rb_clear_post)); /* standard editing stuff */ - act = ActionManager::register_action (popup_act_grp, X_("cut"), _("Cut"), - sigc::ptr_fun (ProcessorBox::rb_cut)); - ActionManager::plugin_selection_sensitive_actions.push_back(act); + cut_action = ActionManager::register_action (popup_act_grp, X_("cut"), _("Cut"), + sigc::ptr_fun (ProcessorBox::rb_cut)); + ActionManager::plugin_selection_sensitive_actions.push_back(cut_action); act = ActionManager::register_action (popup_act_grp, X_("copy"), _("Copy"), sigc::ptr_fun (ProcessorBox::rb_copy)); ActionManager::plugin_selection_sensitive_actions.push_back(act); @@ -1564,9 +1620,8 @@ ProcessorBox::register_actions () paste_action = ActionManager::register_action (popup_act_grp, X_("paste"), _("Paste"), sigc::ptr_fun (ProcessorBox::rb_paste)); - act = ActionManager::register_action (popup_act_grp, X_("rename"), _("Rename"), + rename_action = ActionManager::register_action (popup_act_grp, X_("rename"), _("Rename"), sigc::ptr_fun (ProcessorBox::rb_rename)); - ActionManager::plugin_selection_sensitive_actions.push_back(act); ActionManager::register_action (popup_act_grp, X_("selectall"), _("Select All"), sigc::ptr_fun (ProcessorBox::rb_select_all)); ActionManager::register_action (popup_act_grp, X_("deselectall"), _("Deselect All"),