X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fprocessor_box.cc;h=4448443136a1bf7d4499ff192fbfafdaecacf2a7;hb=3dcb7bf3d3f4eca512c799b5f63fd412e5e3e233;hp=504ad10f3261b475ce75e7f7fffc3cdb0f202787;hpb=dc884716959eac4939db598df9db28aa4809431c;p=ardour.git diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc index 504ad10f32..4448443136 100644 --- a/gtk2_ardour/processor_box.cc +++ b/gtk2_ardour/processor_box.cc @@ -218,11 +218,17 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptrPropertyChanged.connect (name_connection, invalidator (*this), boost::bind (&ProcessorEntry::processor_property_changed, this, _1), gui_context()); _processor->ConfigurationChanged.connect (config_connection, invalidator (*this), boost::bind (&ProcessorEntry::processor_configuration_changed, this, _1, _2), gui_context()); + const uint32_t limit_inline_controls = UIConfiguration::instance().get_max_inline_controls (); + set p = _processor->what_can_be_automated (); for (set::iterator i = p.begin(); i != p.end(); ++i) { std::string label = _processor->describe_parameter (*i); + if (label == X_("hidden")) { + continue; + } + if (boost::dynamic_pointer_cast (_processor)) { label = _("Send"); } else if (boost::dynamic_pointer_cast (_processor)) { @@ -237,6 +243,10 @@ ProcessorEntry::ProcessorEntry (ProcessorBox* parent, boost::shared_ptrbox); } + + if (limit_inline_controls > 0 && _controls.size() >= limit_inline_controls) { + break; + } } setup_tooltip (); @@ -707,6 +717,11 @@ Menu * ProcessorEntry::build_controls_menu () { using namespace Menu_Helpers; + + if (!_plugin_display && _controls.empty ()) { + return NULL; + } + Menu* menu = manage (new Menu); MenuList& items = menu->items (); @@ -715,6 +730,11 @@ ProcessorEntry::build_controls_menu () Gtk::CheckMenuItem* c = dynamic_cast (&items.back ()); c->set_active (_plugin_display->is_visible ()); c->signal_toggled().connect (sigc::mem_fun (*this, &ProcessorEntry::toggle_inline_display_visibility)); + } + + if (_controls.empty ()) { + return menu; + } else { items.push_back (SeparatorElem ()); } @@ -726,9 +746,7 @@ ProcessorEntry::build_controls_menu () MenuElem (_("Hide All Controls"), sigc::mem_fun (*this, &ProcessorEntry::hide_all_controls)) ); - if (!_controls.empty ()) { - items.push_back (SeparatorElem ()); - } + items.push_back (SeparatorElem ()); for (list::iterator i = _controls.begin(); i != _controls.end(); ++i) { items.push_back (CheckMenuElemNoMnemonic ((*i)->name ())); @@ -1568,6 +1586,7 @@ ProcessorEntry::PluginInlineDisplay::PluginInlineDisplay (ProcessorEntry& e, boo : PluginDisplay (p, max_height) , _entry (e) , _scroll (false) + , _given_max_height (max_height) { std::string postfix = string_compose(_("\n%1+double-click to toggle inline-display"), Keyboard::tertiary_modifier_name ()); @@ -1639,11 +1658,15 @@ ProcessorEntry::PluginInlineDisplay::update_height_alloc (uint32_t inline_height } if (shm != _cur_height) { - if (_scroll == sc || _cur_height < shm) { - queue_resize (); + queue_resize (); + if (!_scroll && sc) { + _max_height = shm; + } else { + _max_height = _given_max_height; } _cur_height = shm; } + _scroll = sc; } @@ -2011,7 +2034,43 @@ ProcessorBox::build_possible_aux_menu () return 0; } - if (_route->is_monitor ()) { + if (_route->is_monitor () || _route->is_foldbackbus ()) { + return 0; + } + + using namespace Menu_Helpers; + Menu* menu = manage (new Menu); + MenuList& items = menu->items(); + + for (RouteList::iterator r = rl->begin(); r != rl->end(); ++r) { + if ((*r)->is_master() || (*r)->is_monitor () || *r == _route) { + /* don't allow sending to master or monitor or to self */ + continue; + } + if ((*r)->is_foldbackbus ()) { + continue; + } + if (_route->internal_send_for (*r)) { + /* aux-send to target already exists */ + continue; + } + items.push_back (MenuElemNoMnemonic ((*r)->name(), sigc::bind (sigc::ptr_fun (ProcessorBox::rb_choose_aux), boost::weak_ptr(*r)))); + } + + return menu; +} + +Gtk::Menu* +ProcessorBox::build_possible_listener_menu () +{ + boost::shared_ptr rl = _session->get_routes_with_internal_returns(); + + if (rl->empty()) { + /* No aux sends if there are no busses */ + return 0; + } + + if (_route->is_monitor () || _route->is_foldbackbus ()) { return 0; } @@ -2020,9 +2079,54 @@ ProcessorBox::build_possible_aux_menu () MenuList& items = menu->items(); for (RouteList::iterator r = rl->begin(); r != rl->end(); ++r) { - if (!_route->internal_send_for (*r) && *r != _route) { - items.push_back (MenuElemNoMnemonic ((*r)->name(), sigc::bind (sigc::ptr_fun (ProcessorBox::rb_choose_aux), boost::weak_ptr(*r)))); + if ((*r)->is_master() || (*r)->is_monitor () || *r == _route) { + /* don't allow sending to master or monitor or to self */ + continue; + } + if (!(*r)->is_foldbackbus ()) { + continue; } + if (_route->internal_send_for (*r)) { + /* aux-send to target already exists */ + continue; + } + items.push_back (MenuElemNoMnemonic ((*r)->name(), sigc::bind (sigc::ptr_fun (ProcessorBox::rb_choose_aux), boost::weak_ptr(*r)))); + } + + return menu; +} + +Gtk::Menu* +ProcessorBox::build_possible_remove_listener_menu () +{ + boost::shared_ptr rl = _session->get_routes_with_internal_returns(); + + if (rl->empty()) { + /* No aux sends if there are no busses */ + return 0; + } + + if (_route->is_monitor () || _route->is_foldbackbus ()) { + return 0; + } + + using namespace Menu_Helpers; + Menu* menu = manage (new Menu); + MenuList& items = menu->items(); + + for (RouteList::iterator r = rl->begin(); r != rl->end(); ++r) { + if ((*r)->is_master() || (*r)->is_monitor () || *r == _route) { + /* don't allow sending to master or monitor or to self */ + continue; + } + if (!(*r)->is_foldbackbus ()) { + continue; + } + if (!_route->internal_send_for (*r)) { + /* aux-send to target already exists */ + continue; + } + items.push_back (MenuElemNoMnemonic ((*r)->name(), sigc::bind (sigc::ptr_fun (ProcessorBox::rb_remove_aux), boost::weak_ptr(*r)))); } return menu; @@ -2060,8 +2164,36 @@ ProcessorBox::show_processor_menu (int arg) } } - ActionManager::get_action (X_("ProcessorMenu"), "newinsert")->set_sensitive (!_route->is_monitor ()); - ActionManager::get_action (X_("ProcessorMenu"), "newsend")->set_sensitive (!_route->is_monitor ()); + Gtk::MenuItem* listen_menu_item = dynamic_cast(ActionManager::get_widget("/ProcessorMenu/newlisten")); + + if (listen_menu_item) { + Menu* m = build_possible_listener_menu(); + if (m && !m->items().empty()) { + listen_menu_item->set_submenu (*m); + listen_menu_item->set_sensitive (true); + } else { + /* stupid gtkmm: we need to pass a null reference here */ + gtk_menu_item_set_submenu (listen_menu_item->gobj(), 0); + listen_menu_item->set_sensitive (false); + } + } + + Gtk::MenuItem* remove_listen_menu_item = dynamic_cast(ActionManager::get_widget("/ProcessorMenu/removelisten")); + + if (remove_listen_menu_item) { + Menu* m = build_possible_remove_listener_menu(); + if (m && !m->items().empty()) { + remove_listen_menu_item->set_submenu (*m); + remove_listen_menu_item->set_sensitive (true); + } else { + /* stupid gtkmm: we need to pass a null reference here */ + gtk_menu_item_set_submenu (remove_listen_menu_item->gobj(), 0); + remove_listen_menu_item->set_sensitive (false); + } + } + + ActionManager::get_action (X_("ProcessorMenu"), "newinsert")->set_sensitive (!_route->is_monitor () && !_route->is_foldbackbus ()); + ActionManager::get_action (X_("ProcessorMenu"), "newsend")->set_sensitive (!_route->is_monitor () && !_route->is_foldbackbus ()); ProcessorEntry* single_selection = 0; if (processor_display.selection().size() == 1) { @@ -2292,18 +2424,17 @@ ProcessorBox::processor_button_press_event (GdkEventButton *ev, ProcessorEntry* if (processor && (Keyboard::is_edit_event (ev) || (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS))) { - if (_session->engine().connected()) { - /* XXX giving an error message here is hard, because we may be in the midst of a button press */ - - if (!one_processor_can_be_edited ()) { - return true; - } + if (!one_processor_can_be_edited ()) { + return true; + } + if (!ARDOUR_UI_UTILS::engine_is_running ()) { + return true; + } - if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) { - generic_edit_processor (processor); - } else { - edit_processor (processor); - } + if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) { + generic_edit_processor (processor); + } else { + edit_processor (processor); } ret = true; @@ -2402,8 +2533,10 @@ ProcessorBox::use_plugins (const SelectedPlugins& plugins) else if (boost::dynamic_pointer_cast(processor)->plugin()->has_inline_display() && UIConfiguration::instance().get_prefer_inline_over_gui()) { ; /* only show inline display */ } - else if (_session->engine().connected () && processor_can_be_edited (processor)) { - if ((*p)->has_editor ()) { + else if (processor_can_be_edited (processor)) { + if (!ARDOUR_UI_UTILS::engine_is_running()) { + return true; + } else if ((*p)->has_editor ()) { edit_processor (processor); } else if (boost::dynamic_pointer_cast(processor)->plugin()->parameter_count() > 0) { generic_edit_processor (processor); @@ -2586,7 +2719,29 @@ ProcessorBox::choose_aux (boost::weak_ptr wr) return; } - _session->add_internal_send (target, _placement, _route); + if (target->is_foldbackbus ()) { + _route->add_foldback_send (target); + } else { + _session->add_internal_send (target, _placement, _route); + } +} + +void +ProcessorBox::remove_aux (boost::weak_ptr wr) +{ + if (!_route) { + return; + } + + boost::shared_ptr target = wr.lock(); + + if (!target) { + return; + } + boost::shared_ptr send = _route->internal_send_for (target); + boost::shared_ptr proc = boost::dynamic_pointer_cast (send); + _route->remove_processor (proc); + } void @@ -3508,7 +3663,7 @@ ProcessorBox::get_editor_window (boost::shared_ptr processor, bool us } else if ((send = boost::dynamic_pointer_cast (processor)) != 0) { - if (!_session->engine().connected()) { + if (!ARDOUR_UI_UTILS::engine_is_running ()) { return 0; } @@ -3524,7 +3679,7 @@ ProcessorBox::get_editor_window (boost::shared_ptr processor, bool us return 0; } - if (!_session->engine().connected()) { + if (!ARDOUR_UI_UTILS::engine_is_running ()) { return 0; } @@ -3566,9 +3721,7 @@ ProcessorBox::get_editor_window (boost::shared_ptr processor, bool us } else if ((port_insert = boost::dynamic_pointer_cast (processor)) != 0) { - if (!_session->engine().connected()) { - MessageDialog msg ( _("Not connected to audio engine - no I/O changes are possible")); - msg.run (); + if (!ARDOUR_UI_UTILS::engine_is_running ()) { return 0; } @@ -3625,6 +3778,8 @@ ProcessorBox::register_actions () ActionManager::engine_sensitive_actions.push_back (act); myactions.register_action (processor_box_actions, X_("newaux"), _("New Aux Send ...")); + myactions.register_action (processor_box_actions, X_("newlisten"), _("New Monitor Send ...")); + myactions.register_action (processor_box_actions, X_("removelisten"), _("Remove Monitor Send ...")); myactions.register_action (processor_box_actions, X_("controls"), _("Controls")); myactions.register_action (processor_box_actions, X_("send_options"), _("Send Options")); @@ -3768,6 +3923,16 @@ ProcessorBox::rb_choose_aux (boost::weak_ptr wr) _current_processor_box->choose_aux (wr); } +void +ProcessorBox::rb_remove_aux (boost::weak_ptr wr) +{ + if (_current_processor_box == 0) { + return; + } + + _current_processor_box->remove_aux (wr); +} + void ProcessorBox::rb_clear () { @@ -3924,7 +4089,7 @@ ProcessorBox::edit_processor (boost::shared_ptr processor) if (edit_aux_send (processor)) { return; } - if (!_session->engine().connected()) { + if (!ARDOUR_UI_UTILS::engine_is_running ()) { return; } @@ -3945,7 +4110,7 @@ ProcessorBox::generic_edit_processor (boost::shared_ptr processor) if (edit_aux_send (processor)) { return; } - if (!_session->engine().connected()) { + if (!ARDOUR_UI_UTILS::engine_is_running ()) { return; }