X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Froute_params_ui.cc;h=76f3d4e264770fffcdfbaf80faafc78a911cfe04;hb=a8f11b6004bfd247dd192ef642bffa0a0b46f80f;hp=d6ec7eab6c6042d3d5c1bbbc06a8958de24ac8d6;hpb=7ff370e79895d7eb293e7214689b791bd98415fb;p=ardour.git diff --git a/gtk2_ardour/route_params_ui.cc b/gtk2_ardour/route_params_ui.cc index d6ec7eab6c..76f3d4e264 100644 --- a/gtk2_ardour/route_params_ui.cc +++ b/gtk2_ardour/route_params_ui.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2000 Paul Davis + Copyright (C) 2000 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -15,68 +15,62 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include +#include -#include +#include #include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include + +#include "ardour/audioengine.h" +#include "ardour/plugin.h" +#include "ardour/plugin_insert.h" +#include "ardour/plugin_manager.h" +#include "ardour/port_insert.h" +#include "ardour/return.h" +#include "ardour/route.h" +#include "ardour/send.h" +#include "ardour/internal_send.h" -#include "route_params_ui.h" +#include "ardour_ui.h" +#include "gui_thread.h" +#include "io_selector.h" #include "keyboard.h" #include "mixer_strip.h" +#include "port_insert_ui.h" #include "plugin_selector.h" -#include "ardour_ui.h" #include "plugin_ui.h" -#include "io_selector.h" +#include "return_ui.h" +#include "route_params_ui.h" #include "send_ui.h" #include "utils.h" -#include "gui_thread.h" #include "i18n.h" using namespace ARDOUR; using namespace PBD; using namespace Gtk; -using namespace sigc; +using namespace Gtkmm2ext; -RouteParams_UI::RouteParams_UI (AudioEngine& eng) - : ArdourDialog ("track/bus inspector"), - engine (eng), - _route(0), +RouteParams_UI::RouteParams_UI () + : ArdourWindow (_("Tracks and Busses")), + latency_apply_button (Stock::APPLY), track_menu(0) { - pre_redirect_box = 0; - post_redirect_box = 0; - _route = 0; - _pre_redirect = 0; - _post_redirect = 0; + insert_box = 0; _input_iosel = 0; _output_iosel = 0; - _active_pre_view = 0; - _active_post_view = 0; - + _active_view = 0; + latency_widget = 0; + using namespace Notebook_Helpers; input_frame.set_shadow_type(Gtk::SHADOW_NONE); output_frame.set_shadow_type(Gtk::SHADOW_NONE); - + latency_frame.set_shadow_type (Gtk::SHADOW_NONE); + notebook.set_show_tabs (true); notebook.set_show_border (true); notebook.set_name ("RouteParamNotebook"); @@ -86,7 +80,7 @@ RouteParams_UI::RouteParams_UI (AudioEngine& eng) // setup the treeview route_display.set_model(route_display_model); - route_display.append_column(_("Tracks/Buses"), route_display_columns.text); + route_display.append_column(_("Tracks/Busses"), route_display_columns.text); route_display.set_name(X_("RouteParamsListDisplay")); route_display.get_selection()->set_mode(Gtk::SELECTION_SINGLE); // default route_display.set_reorderable(false); @@ -94,68 +88,66 @@ RouteParams_UI::RouteParams_UI (AudioEngine& eng) route_display.set_headers_visible(true); route_display.set_headers_clickable(true); + dynamic_cast(route_display.get_column_cell_renderer(0))->property_ellipsize() = Pango::ELLIPSIZE_START; + route_select_scroller.add(route_display); route_select_scroller.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC); - route_select_frame.set_name("RouteSelectBaseFrame"); route_select_frame.set_shadow_type (Gtk::SHADOW_IN); route_select_frame.add(route_select_scroller); list_vpacker.pack_start (route_select_frame, true, true); - + notebook.pages().push_back (TabElem (input_frame, _("Inputs"))); notebook.pages().push_back (TabElem (output_frame, _("Outputs"))); - notebook.pages().push_back (TabElem (pre_redir_hpane, _("Pre-fader Redirects"))); - notebook.pages().push_back (TabElem (post_redir_hpane, _("Post-fader Redirects"))); + notebook.pages().push_back (TabElem (redir_hpane, _("Plugins, Inserts & Sends"))); + notebook.pages().push_back (TabElem (latency_frame, _("Latency"))); notebook.set_name ("InspectorNotebook"); - + title_label.set_name ("RouteParamsTitleLabel"); update_title(); - + + latency_packer.set_spacing (18); + latency_button_box.pack_start (latency_apply_button); + delay_label.set_alignment (0, 0.5); + // changeable area route_param_frame.set_name("RouteParamsBaseFrame"); route_param_frame.set_shadow_type (Gtk::SHADOW_IN); - - + + route_hpacker.pack_start (notebook, true, true); - - + route_vpacker.pack_start (title_label, false, false); route_vpacker.pack_start (route_hpacker, true, true); - + list_hpane.pack1 (list_vpacker); list_hpane.add2 (route_vpacker); list_hpane.set_position(110); - pre_redir_hpane.set_position(110); - post_redir_hpane.set_position(110); - + redir_hpane.set_position(110); + //global_vpacker.pack_start (list_hpane, true, true); //get_vbox()->pack_start (global_vpacker); - get_vbox()->pack_start (list_hpane); - - + add (list_hpane); + + set_name ("RouteParamsWindow"); set_default_size (620,370); - set_title (_("ardour: track/bus inspector")); - set_wmclass (_("ardour_route_parameters"), "Ardour"); + set_wmclass (X_("ardour_route_parameters"), PROGRAM_NAME); // events - route_display.get_selection()->signal_changed().connect(mem_fun(*this, &RouteParams_UI::route_selected)); - route_display.get_column(0)->signal_clicked().connect(mem_fun(*this, &RouteParams_UI::show_track_menu)); + route_display.get_selection()->signal_changed().connect(sigc::mem_fun(*this, &RouteParams_UI::route_selected)); + route_display.get_column(0)->signal_clicked().connect(sigc::mem_fun(*this, &RouteParams_UI::show_track_menu)); add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK|Gdk::BUTTON_RELEASE_MASK); - - _plugin_selector = new PluginSelector (PluginManager::the_manager()); - _plugin_selector->signal_delete_event().connect (bind (ptr_fun (just_hide_it), - static_cast (_plugin_selector))); - - signal_delete_event().connect(bind(ptr_fun(just_hide_it), static_cast(this))); + _plugin_selector = new PluginSelector (PluginManager::instance()); + show_all(); } RouteParams_UI::~RouteParams_UI () @@ -163,42 +155,56 @@ RouteParams_UI::~RouteParams_UI () } void -RouteParams_UI::add_route (Route* route) +RouteParams_UI::add_routes (RouteList& routes) { - ENSURE_GUI_THREAD(bind (mem_fun(*this, &RouteParams_UI::add_route), route)); - - if (route->hidden()) { - return; - } + ENSURE_GUI_THREAD (*this, &RouteParams_UI::add_routes, routes) - TreeModel::Row row = *(route_display_model->append()); - row[route_display_columns.text] = route->name(); - row[route_display_columns.route] = route; + for (RouteList::iterator x = routes.begin(); x != routes.end(); ++x) { + boost::shared_ptr route = (*x); - //route_select_list.rows().back().select (); - - route->name_changed.connect (bind (mem_fun(*this, &RouteParams_UI::route_name_changed), route)); - route->GoingAway.connect (bind (mem_fun(*this, &RouteParams_UI::route_removed), route)); + if (route->is_auditioner()) { + return; + } + + TreeModel::Row row = *(route_display_model->append()); + row[route_display_columns.text] = route->name(); + row[route_display_columns.route] = route; + + //route_select_list.rows().back().select (); + + route->PropertyChanged.connect (*this, invalidator (*this), boost::bind (&RouteParams_UI::route_property_changed, this, _1, boost::weak_ptr(route)), gui_context()); + route->DropReferences.connect (*this, invalidator (*this), boost::bind (&RouteParams_UI::route_removed, this, boost::weak_ptr(route)), gui_context()); + } } void -RouteParams_UI::route_name_changed (void *src, Route *route) +RouteParams_UI::route_property_changed (const PropertyChange& what_changed, boost::weak_ptr wr) { - ENSURE_GUI_THREAD(bind (mem_fun(*this, &RouteParams_UI::route_name_changed), src, route)); + if (!what_changed.contains (ARDOUR::Properties::name)) { + return; + } + + boost::shared_ptr route (wr.lock()); + + if (!route) { + return; + } + + ENSURE_GUI_THREAD (*this, &RouteParams_UI::route_name_changed, wr) bool found = false ; TreeModel::Children rows = route_display_model->children(); for(TreeModel::Children::iterator iter = rows.begin(); iter != rows.end(); ++iter) { - if((*iter)[route_display_columns.route] == route) { + boost::shared_ptr r =(*iter)[route_display_columns.route]; + if (r == route) { (*iter)[route_display_columns.text] = route->name() ; found = true ; break; } } - if(!found) - { + if(!found) { error << _("route display list item for renamed route not found!") << endmsg; } @@ -209,62 +215,101 @@ RouteParams_UI::route_name_changed (void *src, Route *route) } void -RouteParams_UI::setup_redirect_boxes() +RouteParams_UI::setup_processor_boxes() { - if (session && _route) { + if (_session && _route) { // just in case... shouldn't need this - cleanup_redirect_boxes(); - + cleanup_processor_boxes(); + // construct new redirect boxes - pre_redirect_box = new RedirectBox(PreFader, *session, *_route, *_plugin_selector, _rr_selection); - post_redirect_box = new RedirectBox(PostFader, *session, *_route, *_plugin_selector, _rr_selection); + insert_box = new ProcessorBox (_session, boost::bind (&RouteParams_UI::plugin_selector, this), _rr_selection, 0); + insert_box->set_route (_route); - pre_redir_hpane.pack1 (*pre_redirect_box); - post_redir_hpane.pack1 (*post_redirect_box); + redir_hpane.pack1 (*insert_box); - pre_redirect_box->RedirectSelected.connect (bind (mem_fun(*this, &RouteParams_UI::redirect_selected), PreFader)); - pre_redirect_box->RedirectUnselected.connect (bind (mem_fun(*this, &RouteParams_UI::redirect_selected), PreFader)); - post_redirect_box->RedirectSelected.connect (bind (mem_fun(*this, &RouteParams_UI::redirect_selected), PostFader)); - post_redirect_box->RedirectUnselected.connect (bind (mem_fun(*this, &RouteParams_UI::redirect_selected), PostFader)); + insert_box->ProcessorSelected.connect (sigc::mem_fun(*this, &RouteParams_UI::redirect_selected)); + insert_box->ProcessorUnselected.connect (sigc::mem_fun(*this, &RouteParams_UI::redirect_selected)); - pre_redir_hpane.show_all(); - post_redir_hpane.show_all(); + redir_hpane.show_all(); } - } void -RouteParams_UI::cleanup_redirect_boxes() +RouteParams_UI::cleanup_processor_boxes() { - if (pre_redirect_box) { - pre_redir_hpane.remove(*pre_redirect_box); - delete pre_redirect_box; - pre_redirect_box = 0; + if (insert_box) { + redir_hpane.remove(*insert_box); + delete insert_box; + insert_box = 0; } +} + +void +RouteParams_UI::refresh_latency () +{ + if (latency_widget) { + latency_widget->refresh(); - if (post_redirect_box) { - post_redir_hpane.remove(*post_redirect_box); - delete post_redirect_box; - post_redirect_box = 0; + char buf[128]; + snprintf (buf, sizeof (buf), _("Playback delay: %" PRId64 " samples"), _route->initial_delay()); + delay_label.set_text (buf); } } +void +RouteParams_UI::cleanup_latency_frame () +{ + if (latency_widget) { + latency_frame.remove (); + latency_packer.remove (*latency_widget); + latency_packer.remove (latency_button_box); + latency_packer.remove (delay_label); + latency_connections.drop_connections (); + latency_click_connection.disconnect (); + + delete latency_widget; + latency_widget = 0; + + } +} + +void +RouteParams_UI::setup_latency_frame () +{ + latency_widget = new LatencyGUI (*(_route->output()), _session->frame_rate(), AudioEngine::instance()->samples_per_cycle()); + + char buf[128]; + snprintf (buf, sizeof (buf), _("Playback delay: %" PRId64 " samples"), _route->initial_delay()); + delay_label.set_text (buf); + + latency_packer.pack_start (*latency_widget, false, false); + latency_packer.pack_start (latency_button_box, false, false); + latency_packer.pack_start (delay_label); + + latency_click_connection = latency_apply_button.signal_clicked().connect (sigc::mem_fun (*latency_widget, &LatencyGUI::finish)); + _route->signal_latency_changed.connect (latency_connections, invalidator (*this), boost::bind (&RouteParams_UI::refresh_latency, this), gui_context()); + _route->initial_delay_changed.connect (latency_connections, invalidator (*this), boost::bind (&RouteParams_UI::refresh_latency, this), gui_context()); + + latency_frame.add (latency_packer); + latency_frame.show_all (); +} + void RouteParams_UI::setup_io_frames() { cleanup_io_frames(); - + // input - _input_iosel = new IOSelector (*session, *_route, true); - _input_iosel->redisplay (); - input_frame.add (*_input_iosel); + _input_iosel = new IOSelector (this, _session, _route->input()); + _input_iosel->setup (); + input_frame.add (*_input_iosel); input_frame.show_all(); - + // output - _output_iosel = new IOSelector (*session, *_route, false); - _output_iosel->redisplay (); - output_frame.add (*_output_iosel); + _output_iosel = new IOSelector (this, _session, _route->output()); + _output_iosel->setup (); + output_frame.add (*_output_iosel); output_frame.show_all(); } @@ -288,70 +333,52 @@ RouteParams_UI::cleanup_io_frames() } void -RouteParams_UI::cleanup_pre_view (bool stopupdate) +RouteParams_UI::cleanup_view (bool stopupdate) { - if (_active_pre_view) { - PluginUI * plugui = 0; - - if (stopupdate && (plugui = dynamic_cast(_active_pre_view)) != 0) { + if (_active_view) { + GenericPluginUI * plugui = 0; + + if (stopupdate && (plugui = dynamic_cast(_active_view)) != 0) { plugui->stop_updating (0); } - _pre_plugin_conn.disconnect(); - pre_redir_hpane.remove(*_active_pre_view); - delete _active_pre_view; - _active_pre_view = 0; + _processor_going_away_connection.disconnect (); + redir_hpane.remove(*_active_view); + delete _active_view; + _active_view = 0; } } void -RouteParams_UI::cleanup_post_view (bool stopupdate) +RouteParams_UI::route_removed (boost::weak_ptr wr) { - if (_active_post_view) { - PluginUI * plugui = 0; - - if (stopupdate && (plugui = dynamic_cast(_active_post_view)) != 0) { - plugui->stop_updating (0); - } - _post_plugin_conn.disconnect(); - post_redir_hpane.remove(*_active_post_view); - delete _active_post_view; - _active_post_view = 0; + boost::shared_ptr route (wr.lock()); + + if (!route) { + return; } -} - -void -RouteParams_UI::route_removed (Route *route) -{ - ENSURE_GUI_THREAD(bind (mem_fun(*this, &RouteParams_UI::route_removed), route)); - /* - route_select_list.freeze (); - route_select_list.clear (); - session->foreach_route (this, &RouteParams_UI::add_route); - route_select_list.thaw (); - */ + ENSURE_GUI_THREAD (*this, invalidator (*this), &RouteParams_UI::route_removed, wr) TreeModel::Children rows = route_display_model->children(); TreeModel::Children::iterator ri; for(TreeModel::Children::iterator iter = rows.begin(); iter != rows.end(); ++iter) { - if((*iter)[route_display_columns.route] == route) { + boost::shared_ptr r =(*iter)[route_display_columns.route]; + + if (r == route) { route_display_model->erase(iter); break; } } - if (route == _route) - { + if (route == _route) { cleanup_io_frames(); - cleanup_pre_view(); - cleanup_post_view(); - cleanup_redirect_boxes(); - - _route = 0; - _pre_redirect = 0; - _post_redirect = 0; + cleanup_view(); + cleanup_processor_boxes(); + + _route.reset ((Route*) 0); + _processor.reset ((Processor*) 0); update_title(); } } @@ -359,44 +386,39 @@ RouteParams_UI::route_removed (Route *route) void RouteParams_UI::set_session (Session *sess) { - ArdourDialog::set_session (sess); + ArdourWindow::set_session (sess); route_display_model->clear(); + _plugin_selector->set_session (_session); - if (session) { - session->foreach_route (this, &RouteParams_UI::add_route); - session->going_away.connect (mem_fun(*this, &ArdourDialog::session_gone)); - session->RouteAdded.connect (mem_fun(*this, &RouteParams_UI::add_route)); + if (_session) { + boost::shared_ptr r = _session->get_routes(); + add_routes (*r); + _session->RouteAdded.connect (_session_connections, invalidator (*this), boost::bind (&RouteParams_UI::add_routes, this, _1), gui_context()); start_updating (); } else { stop_updating (); } - - //route_select_list.thaw (); - - _plugin_selector->set_session (session); -} +} void -RouteParams_UI::session_gone () +RouteParams_UI::session_going_away () { - ENSURE_GUI_THREAD(mem_fun(*this, &RouteParams_UI::session_gone)); + ENSURE_GUI_THREAD (*this, &RouteParams_UI::session_going_away); + + SessionHandlePtr::session_going_away (); route_display_model->clear(); cleanup_io_frames(); - cleanup_pre_view(); - cleanup_post_view(); - cleanup_redirect_boxes(); + cleanup_view(); + cleanup_processor_boxes(); + cleanup_latency_frame (); - _route = 0; - _pre_redirect = 0; - _post_redirect = 0; + _route.reset ((Route*) 0); + _processor.reset ((Processor*) 0); update_title(); - - ArdourDialog::session_gone(); - } void @@ -404,9 +426,10 @@ RouteParams_UI::route_selected() { Glib::RefPtr selection = route_display.get_selection(); TreeModel::iterator iter = selection->get_selected(); // only used with Gtk::SELECTION_SINGLE + if(iter) { //If anything is selected - Route* route = (*iter)[route_display_columns.route] ; + boost::shared_ptr route = (*iter)[route_display_columns.route] ; if (_route == route) { // do nothing @@ -415,12 +438,11 @@ RouteParams_UI::route_selected() // remove event binding from previously selected if (_route) { - _route_conn.disconnect(); - _route_ds_conn.disconnect(); - cleanup_redirect_boxes(); - cleanup_pre_view(); - cleanup_post_view(); + _route_processors_connection.disconnect (); + cleanup_processor_boxes(); + cleanup_view(); cleanup_io_frames(); + cleanup_latency_frame (); } // update the other panes with the correct info @@ -428,285 +450,177 @@ RouteParams_UI::route_selected() //update_routeinfo (route); setup_io_frames(); - setup_redirect_boxes(); + setup_processor_boxes(); + setup_latency_frame (); - // bind to redirects changed event for this route - _route_conn = route->redirects_changed.connect (mem_fun(*this, &RouteParams_UI::redirects_changed)); + route->processors_changed.connect (_route_processors_connection, invalidator (*this), boost::bind (&RouteParams_UI::processors_changed, this, _1), gui_context()); track_input_label.set_text (_route->name()); update_title(); + } else { // no selection if (_route) { - _route_conn.disconnect(); + _route_processors_connection.disconnect (); // remove from view cleanup_io_frames(); - cleanup_pre_view(); - cleanup_post_view(); - cleanup_redirect_boxes(); + cleanup_view(); + cleanup_processor_boxes(); + cleanup_latency_frame (); - _route = 0; - _pre_redirect = 0; - _post_redirect = 0; + _route.reset ((Route*) 0); + _processor.reset ((Processor*) 0); track_input_label.set_text(_("NO TRACK")); update_title(); } } } -//void -//RouteParams_UI::route_unselected (gint row, gint col, GdkEvent *ev) -//{ -// if (_route) { -// _route_conn.disconnect(); - - // remove from view -// cleanup_io_frames(); -// cleanup_pre_view(); -// cleanup_post_view(); -// cleanup_redirect_boxes(); - -// _route = 0; -// _pre_redirect = 0; -// _post_redirect = 0; -// track_input_label.set_text(_("NO TRACK")); -// update_title(); -// } -//} - void -RouteParams_UI::redirects_changed (void *src) - +RouteParams_UI::processors_changed (RouteProcessorChange) { - ENSURE_GUI_THREAD(bind (mem_fun(*this, &RouteParams_UI::redirects_changed), src)); - -// pre_redirect_list.freeze (); -// pre_redirect_list.clear (); -// post_redirect_list.freeze (); -// post_redirect_list.clear (); -// if (_route) { -// _route->foreach_redirect (this, &RouteParams_UI::add_redirect_to_display); -// } -// pre_redirect_list.thaw (); -// post_redirect_list.thaw (); - - cleanup_pre_view(); - cleanup_post_view(); - - _pre_redirect = 0; - _post_redirect = 0; - //update_title(); -} + cleanup_view(); + _processor.reset ((Processor*) 0); + //update_title(); +} void RouteParams_UI::show_track_menu() { using namespace Menu_Helpers; - + if (track_menu == 0) { track_menu = new Menu; track_menu->set_name ("ArdourContextMenu"); - track_menu->items().push_back - (MenuElem (_("Add Track/Bus"), - mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::add_route))); + track_menu->items().push_back + (MenuElem (_("Add Track or Bus"), + sigc::bind (sigc::mem_fun (*(ARDOUR_UI::instance()), &ARDOUR_UI::add_route), (Gtk::Window*) 0))); } - track_menu->popup (1, 0); + track_menu->popup (1, gtk_get_current_event_time()); } - - void -RouteParams_UI::redirect_selected (ARDOUR::Redirect *redirect, ARDOUR::Placement place) +RouteParams_UI::redirect_selected (boost::shared_ptr proc) { - Insert *insert; - - if ((place == PreFader && _pre_redirect == redirect) - || (place == PostFader && _post_redirect == redirect)){ + boost::shared_ptr send; + boost::shared_ptr retrn; + boost::shared_ptr plugin_insert; + boost::shared_ptr port_insert; + + if ((boost::dynamic_pointer_cast (proc)) != 0) { + cleanup_view(); + _processor.reset ((Processor*) 0); + update_title(); return; - } - - if ((insert = dynamic_cast (redirect)) == 0) { - - Send *send; - - if ((send = dynamic_cast (redirect)) != 0) { - - /* its a send */ - - SendUI *send_ui = new SendUI (*send, *session); - - if (place == PreFader) { - cleanup_pre_view(); - _pre_plugin_conn = send->GoingAway.connect (mem_fun(*this, &RouteParams_UI::redirect_going_away)); - _active_pre_view = send_ui; - - pre_redir_hpane.add2 (*_active_pre_view); - pre_redir_hpane.show_all(); - } - else { - cleanup_post_view(); - _post_plugin_conn = send->GoingAway.connect (mem_fun(*this, &RouteParams_UI::redirect_going_away)); - _active_post_view = send_ui; - - post_redir_hpane.add2 (*_active_post_view); - post_redir_hpane.show_all(); - } - } + } else if ((send = boost::dynamic_pointer_cast (proc)) != 0) { - } else { - /* its an insert, though we don't know what kind yet. */ - - PluginInsert *plugin_insert; - PortInsert *port_insert; - - if ((plugin_insert = dynamic_cast (insert)) != 0) { - - PluginUI *plugin_ui = new PluginUI (session->engine(), *plugin_insert, true); - - if (place == PreFader) { - cleanup_pre_view(); - _pre_plugin_conn = plugin_insert->plugin().GoingAway.connect (bind (mem_fun(*this, &RouteParams_UI::plugin_going_away), PreFader)); - plugin_ui->start_updating (0); - _active_pre_view = plugin_ui; - pre_redir_hpane.pack2 (*_active_pre_view); - pre_redir_hpane.show_all(); - } - else { - cleanup_post_view(); - _post_plugin_conn = plugin_insert->plugin().GoingAway.connect (bind (mem_fun(*this, &RouteParams_UI::plugin_going_away), PostFader)); - plugin_ui->start_updating (0); - _active_post_view = plugin_ui; - post_redir_hpane.pack2 (*_active_post_view); - post_redir_hpane.show_all(); - } - - } else if ((port_insert = dynamic_cast (insert)) != 0) { - - PortInsertUI *portinsert_ui = new PortInsertUI (*session, *port_insert); - - if (place == PreFader) { - cleanup_pre_view(); - _pre_plugin_conn = port_insert->GoingAway.connect (mem_fun(*this, &RouteParams_UI::redirect_going_away)); - _active_pre_view = portinsert_ui; - pre_redir_hpane.pack2 (*_active_pre_view); - portinsert_ui->redisplay(); - pre_redir_hpane.show_all(); - } - else { - cleanup_post_view(); - _post_plugin_conn = port_insert->GoingAway.connect (mem_fun(*this, &RouteParams_UI::redirect_going_away)); - _active_post_view = portinsert_ui; - post_redir_hpane.pack2 (*_active_post_view); - portinsert_ui->redisplay(); - post_redir_hpane.show_all(); - } - } - - } + SendUI *send_ui = new SendUI (this, send, _session); - if (place == PreFader) { - _pre_redirect = redirect; - } - else { - _post_redirect = redirect; - } - - update_title(); - -} + cleanup_view(); + send->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr(proc)), gui_context()); + _active_view = send_ui; -void -RouteParams_UI::redirect_unselected (ARDOUR::Redirect *redirect) -{ - // not called anymore - - if (redirect == _pre_redirect) { - cleanup_pre_view(); - _pre_redirect = 0; - } - else if (redirect == _post_redirect) { - cleanup_post_view(); - _post_redirect = 0; + redir_hpane.add2 (*_active_view); + redir_hpane.show_all(); + + } else if ((retrn = boost::dynamic_pointer_cast (proc)) != 0) { + + ReturnUI *return_ui = new ReturnUI (this, retrn, _session); + + cleanup_view(); + retrn->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr(proc)), gui_context()); + _active_view = return_ui; + + redir_hpane.add2 (*_active_view); + redir_hpane.show_all(); + + } else if ((plugin_insert = boost::dynamic_pointer_cast (proc)) != 0) { + + GenericPluginUI *plugin_ui = new GenericPluginUI (plugin_insert, true); + + cleanup_view(); + plugin_insert->plugin()->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::plugin_going_away, this, PreFader), gui_context()); + plugin_ui->start_updating (0); + _active_view = plugin_ui; + + redir_hpane.pack2 (*_active_view); + redir_hpane.show_all(); + + } else if ((port_insert = boost::dynamic_pointer_cast (proc)) != 0) { + + PortInsertUI *portinsert_ui = new PortInsertUI (this, _session, port_insert); + + cleanup_view(); + port_insert->DropReferences.connect (_processor_going_away_connection, invalidator (*this), boost::bind (&RouteParams_UI::processor_going_away, this, boost::weak_ptr (proc)), gui_context()); + _active_view = portinsert_ui; + + redir_hpane.pack2 (*_active_view); + portinsert_ui->redisplay(); + redir_hpane.show_all(); } -} + _processor = proc; + update_title(); +} void -RouteParams_UI::plugin_going_away (Plugin *plugin, Placement place) +RouteParams_UI::plugin_going_away (Placement place) { - ENSURE_GUI_THREAD(bind (mem_fun(*this, &RouteParams_UI::plugin_going_away), plugin, place)); - + ENSURE_GUI_THREAD (*this, &RouteParams_UI::plugin_going_away, place) + // delete the current view without calling finish if (place == PreFader) { - cleanup_pre_view (false); - _pre_redirect = 0; - } - else { - cleanup_post_view (false); - _post_redirect = 0; + cleanup_view (false); + _processor.reset ((Processor*) 0); } } void -RouteParams_UI::redirect_going_away (ARDOUR::Redirect *plugin) - +RouteParams_UI::processor_going_away (boost::weak_ptr wproc) { - ENSURE_GUI_THREAD(bind (mem_fun(*this, &RouteParams_UI::redirect_going_away), plugin)); - + boost::shared_ptr proc = (wproc.lock()); + + if (!proc) { + return; + } + + ENSURE_GUI_THREAD (*this, &RouteParams_UI::processor_going_away, wproc) + printf ("redirect going away\n"); // delete the current view without calling finish - if (plugin == _pre_redirect) { - cleanup_pre_view (false); - _pre_redirect = 0; - } - else if (plugin == _post_redirect) { - cleanup_post_view (false); - _post_redirect = 0; + if (proc == _processor) { + cleanup_view (false); + _processor.reset ((Processor*) 0); } } - void RouteParams_UI::update_title () { - if (_route) { - string title; + WindowTitle title (_("Tracks and Busses")); + + if (_route) { + title_label.set_text(_route->name()); title += _route->name(); -// title += ": "; - -// if (_redirect && (_current_view == PLUGIN_CONFIG_VIEW || _current_view == SEND_CONFIG_VIEW)) { -// title += _redirect->name(); -// } -// else if (_current_view == INPUT_CONFIG_VIEW) { -// title += _("INPUT"); -// } -// else if (_current_view == OUTPUT_CONFIG_VIEW) { -// title += _("OUTPUT"); -// } - - title_label.set_text(title); - - title = _("ardour: track/bus inspector: ") + title; - set_title(title); + set_title(title.get_string()); + } else { + title_label.set_text(_("No Track or Bus Selected")); + title += _("No Track or Bus Selected"); + set_title(title.get_string()); } - else { - title_label.set_text(_("No Route Selected")); - set_title(_("ardour: track/bus/inspector: no route selected")); - } } - void RouteParams_UI::start_updating () { - update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect - (mem_fun(*this, &RouteParams_UI::update_views)); + update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect + (sigc::mem_fun(*this, &RouteParams_UI::update_views)); } void @@ -720,12 +634,8 @@ RouteParams_UI::update_views () { SendUI *sui; // TODO: only do it if correct tab is showing - - if ((sui = dynamic_cast (_active_pre_view)) != 0) { - sui->update (); - } - if ((sui = dynamic_cast (_active_post_view)) != 0) { + + if ((sui = dynamic_cast (_active_view)) != 0) { sui->update (); } - }