X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fredirect_box.cc;h=d9a7eb1aec0ff3266529e78bddc68e55deb27c84;hb=76c25a4a4459b8e550c3c687458d04db0beaee77;hp=f93dfb9433c8fb88cea2982b5e53c0b6ee3b55a7;hpb=5596fe35dffcbbe4c800af5ef9fac15e8cf7e0bf;p=ardour.git diff --git a/gtk2_ardour/redirect_box.cc b/gtk2_ardour/redirect_box.cc index f93dfb9433..d9a7eb1aec 100644 --- a/gtk2_ardour/redirect_box.cc +++ b/gtk2_ardour/redirect_box.cc @@ -19,6 +19,7 @@ */ #include +#include #include @@ -54,7 +55,6 @@ #include "route_redirect_selection.h" #include "mixer_ui.h" #include "actions.h" - #include "plugin_ui.h" #include "send_ui.h" #include "io_selector.h" @@ -63,6 +63,10 @@ #include "i18n.h" +#ifdef HAVE_AUDIOUNIT +#include "au_pluginui.h" +#endif + using namespace sigc; using namespace ARDOUR; using namespace PBD; @@ -133,11 +137,12 @@ RedirectBox::RedirectBox (Placement pcmnt, Session& sess, boost::shared_ptrredirects_changed.connect (mem_fun(*this, &RedirectBox::redisplay_redirects)); + _route->GoingAway.connect (mem_fun (*this, &RedirectBox::route_going_away)); redirect_eventbox.signal_enter_notify_event().connect (bind (sigc::ptr_fun (RedirectBox::enter_box), this)); redirect_display.signal_button_press_event().connect (mem_fun(*this, &RedirectBox::redirect_button_press_event), false); - redirect_display.signal_button_release_event().connect (mem_fun(*this, &RedirectBox::redirect_button_press_event)); + redirect_display.signal_button_release_event().connect (mem_fun(*this, &RedirectBox::redirect_button_release_event)); /* start off as a passthru strip. we'll correct this, if necessary, in update_diskstream_display(). @@ -153,9 +158,16 @@ RedirectBox::~RedirectBox () } void -RedirectBox::object_drop (string type, uint32_t cnt, void** ptr) +RedirectBox::route_going_away () { - if (type != "redirects" || cnt == 0 || ptr == 0) { + /* don't keep updating display as redirects are deleted */ + no_redirect_redisplay = true; +} + +void +RedirectBox::object_drop (string type, uint32_t cnt, const boost::shared_ptr* ptr) +{ + if (type != "redirects" || cnt == 0 || !ptr) { return; } @@ -164,7 +176,7 @@ RedirectBox::object_drop (string type, uint32_t cnt, void** ptr) list > redirects; for (uint32_t n = 0; n < cnt; ++n) { - redirects.push_back (boost::shared_ptr ((Redirect*) ptr[n])); + redirects.push_back (ptr[n]); } paste_redirect_list (redirects); @@ -279,13 +291,8 @@ RedirectBox::redirect_button_press_event (GdkEventButton *ev) } } - - if (redirect && Keyboard::is_delete_event (ev)) { - - Glib::signal_idle().connect (bind (mem_fun(*this, &RedirectBox::idle_delete_redirect), redirect)); - ret = true; - - } else if (redirect && (Keyboard::is_edit_event (ev) || (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS && ev->state == 0))) { + + if (redirect && (Keyboard::is_edit_event (ev) || (ev->button == 1 && ev->type == GDK_2BUTTON_PRESS && ev->state == 0))) { if (_session.engine().connected()) { /* XXX giving an error message here is hard, because we may be in the midst of a button press */ @@ -293,23 +300,50 @@ RedirectBox::redirect_button_press_event (GdkEventButton *ev) } ret = true; + } else if (redirect && ev->button == 1 && selected) { + + // this is purely informational but necessary + RedirectSelected (redirect); // emit + } + + return ret; +} + +bool +RedirectBox::redirect_button_release_event (GdkEventButton *ev) +{ + TreeIter iter; + TreeModel::Path path; + TreeViewColumn* column; + int cellx; + int celly; + boost::shared_ptr redirect; + int ret = false; + + + if (redirect_display.get_path_at_pos ((int)ev->x, (int)ev->y, path, column, cellx, celly)) { + if ((iter = model->get_iter (path))) { + redirect = (*iter)[columns.redirect]; + } + } + + if (redirect && Keyboard::is_delete_event (ev)) { + + Glib::signal_idle().connect (bind (mem_fun(*this, &RedirectBox::idle_delete_redirect), boost::weak_ptr(redirect))); + ret = true; + } else if (Keyboard::is_context_menu_event (ev)) { show_redirect_menu(ev->time); ret = true; - } else if (redirect && ev->button == 2 && ev->state == 0) { + } else if (redirect && ev->button == 2 && ev->state == GDK_BUTTON2_MASK) { redirect->set_active (!redirect->active(), this); ret = true; } - else if (redirect && ev->button == 1 && selected) { - // this is purely informational but necessary - RedirectSelected (redirect); // emit - } - return ret; } @@ -359,7 +393,7 @@ RedirectBox::insert_plugin_chosen (boost::shared_ptr plugin) boost::shared_ptr redirect (new PluginInsert (_session, plugin, _placement)); - redirect->active_changed.connect (mem_fun(*this, &RedirectBox::show_redirect_active)); + redirect->active_changed.connect (bind (mem_fun (*this, &RedirectBox::show_redirect_active_r), boost::weak_ptr(redirect))); uint32_t err_streams; @@ -437,7 +471,7 @@ void RedirectBox::choose_insert () { boost::shared_ptr redirect (new PortInsert (_session, _placement)); - redirect->active_changed.connect (mem_fun(*this, &RedirectBox::show_redirect_active)); + redirect->active_changed.connect (bind (mem_fun(*this, &RedirectBox::show_redirect_active_r), boost::weak_ptr(redirect))); _route->add_redirect (redirect, this); } @@ -453,15 +487,24 @@ RedirectBox::choose_send () IOSelectorWindow *ios = new IOSelectorWindow (_session, send, false, true); ios->show_all (); - ios->selector().Finished.connect (bind (mem_fun(*this, &RedirectBox::send_io_finished), boost::static_pointer_cast(send), ios)); + + boost::shared_ptr r = boost::static_pointer_cast(send); + + ios->selector().Finished.connect (bind (mem_fun(*this, &RedirectBox::send_io_finished), boost::weak_ptr(r), ios)); } void -RedirectBox::send_io_finished (IOSelector::Result r, boost::shared_ptr redirect, IOSelectorWindow* ios) +RedirectBox::send_io_finished (IOSelector::Result r, boost::weak_ptr weak_redirect, IOSelectorWindow* ios) { + boost::shared_ptr redirect (weak_redirect.lock()); + + if (!redirect) { + return; + } + switch (r) { case IOSelector::Cancelled: - // delete redirect; XXX SHAREDPTR HOW TO DESTROY THE REDIRECT ? do we even need to think about it? + // redirect will go away when all shared_ptrs to it vanish break; case IOSelector::Accepted: @@ -480,7 +523,7 @@ RedirectBox::redisplay_redirects (void *src) if (no_redirect_redisplay) { return; } - + ignore_delete = true; model->clear (); ignore_delete = false; @@ -511,16 +554,22 @@ RedirectBox::add_redirect_to_display (boost::shared_ptr redirect) Gtk::TreeModel::Row row = *(model->append()); row[columns.text] = redirect_name (redirect); row[columns.redirect] = redirect; - - show_redirect_active (redirect.get(), this); - redirect_active_connections.push_back (redirect->active_changed.connect (mem_fun(*this, &RedirectBox::show_redirect_active))); - redirect_name_connections.push_back (redirect->name_changed.connect (bind (mem_fun(*this, &RedirectBox::show_redirect_name), redirect))); + show_redirect_active (redirect); + + redirect_active_connections.push_back (redirect->active_changed.connect (bind (mem_fun(*this, &RedirectBox::show_redirect_active_r), boost::weak_ptr(redirect)))); + redirect_name_connections.push_back (redirect->name_changed.connect (bind (mem_fun(*this, &RedirectBox::show_redirect_name), boost::weak_ptr(redirect)))); } string -RedirectBox::redirect_name (boost::shared_ptr redirect) +RedirectBox::redirect_name (boost::weak_ptr weak_redirect) { + boost::shared_ptr redirect (weak_redirect.lock()); + + if (!redirect) { + return string(); + } + boost::shared_ptr send; string name_display; @@ -582,16 +631,28 @@ RedirectBox::build_redirect_tooltip (EventBox& box, string start) } void -RedirectBox::show_redirect_name (void* src, boost::shared_ptr redirect) +RedirectBox::show_redirect_name (void* src, boost::weak_ptr redirect) { ENSURE_GUI_THREAD(bind (mem_fun(*this, &RedirectBox::show_redirect_name), src, redirect)); - show_redirect_active (redirect.get(), src); + show_redirect_active (redirect); } void -RedirectBox::show_redirect_active (Redirect* redirect, void *src) +RedirectBox::show_redirect_active_r (Redirect* r, void *src, boost::weak_ptr weak_redirect) { - ENSURE_GUI_THREAD(bind (mem_fun(*this, &RedirectBox::show_redirect_active), redirect, src)); + show_redirect_active (weak_redirect); +} + +void +RedirectBox::show_redirect_active (boost::weak_ptr weak_redirect) +{ + ENSURE_GUI_THREAD(bind (mem_fun(*this, &RedirectBox::show_redirect_active), weak_redirect)); + + boost::shared_ptr redirect (weak_redirect.lock()); + + if (!redirect) { + return; + } Gtk::TreeModel::Children children = model->children(); Gtk::TreeModel::Children::iterator iter = children.begin(); @@ -600,7 +661,7 @@ RedirectBox::show_redirect_active (Redirect* redirect, void *src) boost::shared_ptr r = (*iter)[columns.redirect]; - if (r.get() == redirect) { + if (r == redirect) { (*iter)[columns.text] = redirect_name (r); if (redirect->active()) { @@ -695,6 +756,7 @@ RedirectBox::cut_redirects () _rr_selection.set (to_be_removed); + no_redirect_redisplay = true; for (vector >::iterator i = to_be_removed.begin(); i != to_be_removed.end(); ++i) { void* gui = (*i)->get_gui (); @@ -709,6 +771,8 @@ RedirectBox::cut_redirects () } } + no_redirect_redisplay = false; + redisplay_redirects (this); } void @@ -731,12 +795,22 @@ RedirectBox::copy_redirects () } gint -RedirectBox::idle_delete_redirect (boost::shared_ptr redirect) +RedirectBox::idle_delete_redirect (boost::weak_ptr weak_redirect) { + boost::shared_ptr redirect (weak_redirect.lock()); + + if (!redirect) { + return false; + } + /* NOT copied to _mixer.selection() */ + no_redirect_redisplay = true; _route->remove_redirect (redirect, this); - return FALSE; + no_redirect_redisplay = false; + redisplay_redirects (this); + + return false; } void @@ -761,7 +835,6 @@ RedirectBox::rename_redirect (boost::shared_ptr redirect) } return; - } void @@ -780,9 +853,12 @@ RedirectBox::cut_redirect (boost::shared_ptr redirect) static_cast(gui)->hide (); } + no_redirect_redisplay = true; if (_route->remove_redirect (redirect, this)) { _rr_selection.remove (redirect); } + no_redirect_redisplay = false; + redisplay_redirects (this); } void @@ -843,8 +919,9 @@ RedirectBox::get_selected_redirects (vector >& redir { vector pathlist = redirect_display.get_selection()->get_selected_rows(); - for (vector::iterator iter = pathlist.begin(); iter != pathlist.end(); ++iter) - redirects.push_back ((*(model->get_iter(*iter)))[columns.redirect]); + for (vector::iterator iter = pathlist.begin(); iter != pathlist.end(); ++iter) { + redirects.push_back ((*(model->get_iter(*iter)))[columns.redirect]); + } } void @@ -919,7 +996,7 @@ RedirectBox::edit_redirect (boost::shared_ptr redirect) if ((insert = boost::dynamic_pointer_cast (redirect)) == 0) { - /* its a send */ + /* it's a send */ if (!_session.engine().connected()) { return; @@ -950,7 +1027,7 @@ RedirectBox::edit_redirect (boost::shared_ptr redirect) } else { - /* its an insert */ + /* it's an insert */ boost::shared_ptr plugin_insert; boost::shared_ptr port_insert; @@ -963,30 +1040,21 @@ RedirectBox::edit_redirect (boost::shared_ptr redirect) PluginUIWindow *plugin_ui; if (plugin_insert->get_gui() == 0) { - - string title; - string maker = plugin_insert->plugin()->maker(); - string::size_type email_pos; - - if ((email_pos = maker.find_first_of ('<')) != string::npos) { - maker = maker.substr (0, email_pos - 1); - } - - if (maker.length() > 32) { - maker = maker.substr (0, 32); - maker += " ..."; - } - - title = string_compose(_("ardour: %1: %2 (by %3)"), _route->name(), plugin_insert->name(), maker); - + plugin_ui = new PluginUIWindow (plugin_insert); + if (_owner_is_mixer) { ARDOUR_UI::instance()->the_mixer()->ensure_float (*plugin_ui); } else { ARDOUR_UI::instance()->the_editor().ensure_float (*plugin_ui); } - plugin_ui->set_title (title); + + plugin_ui->set_title (generate_redirect_title (plugin_insert)); plugin_insert->set_gui (plugin_ui); + + // change window title when route name is changed + _route->name_changed.connect (bind (mem_fun(*this, &RedirectBox::route_name_changed), plugin_ui, boost::weak_ptr (plugin_insert))); + } else { plugin_ui = reinterpret_cast (plugin_insert->get_gui()); @@ -997,7 +1065,7 @@ RedirectBox::edit_redirect (boost::shared_ptr redirect) } else { plugin_ui->show_all (); } -#ifdef HAVE_COREAUDIO +#ifdef HAVE_AUDIOUNIT } else if (type == ARDOUR::AudioUnit) { AUPluginUI* plugin_ui; if (plugin_insert->get_gui() == 0) { @@ -1064,8 +1132,12 @@ RedirectBox::register_actions () /* new stuff */ ActionManager::register_action (popup_act_grp, X_("newplugin"), _("New Plugin ..."), sigc::ptr_fun (RedirectBox::rb_choose_plugin)); - ActionManager::register_action (popup_act_grp, X_("newinsert"), _("New Insert"), sigc::ptr_fun (RedirectBox::rb_choose_insert)); - ActionManager::register_action (popup_act_grp, X_("newsend"), _("New Send ..."), sigc::ptr_fun (RedirectBox::rb_choose_send)); + + act = ActionManager::register_action (popup_act_grp, X_("newinsert"), _("New Insert"), sigc::ptr_fun (RedirectBox::rb_choose_insert)); + ActionManager::jack_sensitive_actions.push_back (act); + act = ActionManager::register_action (popup_act_grp, X_("newsend"), _("New Send ..."), sigc::ptr_fun (RedirectBox::rb_choose_send)); + ActionManager::jack_sensitive_actions.push_back (act); + ActionManager::register_action (popup_act_grp, X_("clear"), _("Clear"), sigc::ptr_fun (RedirectBox::rb_clear)); /* standard editing stuff */ @@ -1092,6 +1164,8 @@ RedirectBox::register_actions () ActionManager::plugin_selection_sensitive_actions.push_back(act); ActionManager::add_action_group (popup_act_grp); + + } void @@ -1237,3 +1311,31 @@ RedirectBox::rb_edit () _current_redirect_box->for_selected_redirects (&RedirectBox::edit_redirect); } +void +RedirectBox::route_name_changed (void* src, PluginUIWindow* plugin_ui, boost::weak_ptr wpi) +{ + ENSURE_GUI_THREAD(bind (mem_fun (*this, &RedirectBox::route_name_changed), src, plugin_ui, wpi)); + boost::shared_ptr pi (wpi.lock()); + if (pi) { + plugin_ui->set_title (generate_redirect_title (pi)); + } +} + +string +RedirectBox::generate_redirect_title (boost::shared_ptr pi) +{ + string maker = pi->plugin()->maker(); + string::size_type email_pos; + + if ((email_pos = maker.find_first_of ('<')) != string::npos) { + maker = maker.substr (0, email_pos - 1); + } + + if (maker.length() > 32) { + maker = maker.substr (0, 32); + maker += " ..."; + } + + return string_compose(_("ardour: %1: %2 (by %3)"), _route->name(), pi->name(), maker); +} +