X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fplugin_selector.cc;h=71036b72da10f9d762aaaac34fbaebc390f97b11;hb=e3d9a971a735174687067cb7d7b9419c7ecbb114;hp=c2f81f4981b10d3ad8b28da51faf5dcd88b5d757;hpb=b5f7ae45bda38031f354ea1643ebc1cc22018907;p=ardour.git diff --git a/gtk2_ardour/plugin_selector.cc b/gtk2_ardour/plugin_selector.cc index c2f81f4981..71036b72da 100644 --- a/gtk2_ardour/plugin_selector.cc +++ b/gtk2_ardour/plugin_selector.cc @@ -62,19 +62,22 @@ static const char* _filter_mode_strings[] = { 0 }; -PluginSelector::PluginSelector (PluginManager *mgr) - : ArdourDialog (_("ardour: plugins"), true, false), - filter_button (Stock::CLEAR) +PluginSelector::PluginSelector (PluginManager& mgr) + : ArdourDialog (_("Plugin Manager"), true, false) + , filter_button (Stock::CLEAR) + , manager (mgr) + { set_position (Gtk::WIN_POS_MOUSE); set_name ("PluginSelectorWindow"); add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK); - manager = mgr; - session = 0; - _menu = 0; + _plugin_menu = 0; in_row_change = false; + manager.PluginListChanged.connect (plugin_list_changed_connection, invalidator (*this), boost::bind (&PluginSelector::build_plugin_menu, this), gui_context()); + build_plugin_menu (); + plugin_model = Gtk::ListStore::create (plugin_columns); plugin_display.set_model (plugin_model); /* XXX translators: try to convert "Fav" into a short term @@ -99,12 +102,12 @@ PluginSelector::PluginSelector (PluginManager *mgr) CellRendererToggle* fav_cell = dynamic_cast(plugin_display.get_column_cell_renderer (0)); fav_cell->property_activatable() = true; fav_cell->property_radio() = true; - fav_cell->signal_toggled().connect (mem_fun (*this, &PluginSelector::favorite_changed)); + fav_cell->signal_toggled().connect (sigc::mem_fun (*this, &PluginSelector::favorite_changed)); CellRendererToggle* hidden_cell = dynamic_cast(plugin_display.get_column_cell_renderer (1)); hidden_cell->property_activatable() = true; hidden_cell->property_radio() = true; - hidden_cell->signal_toggled().connect (mem_fun (*this, &PluginSelector::hidden_changed)); + hidden_cell->signal_toggled().connect (sigc::mem_fun (*this, &PluginSelector::hidden_changed)); scroller.set_border_width(10); scroller.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); @@ -125,13 +128,13 @@ PluginSelector::PluginSelector (PluginManager *mgr) ascroller.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); ascroller.add(added_list); btn_add = manage(new Gtk::Button(Stock::ADD)); - ARDOUR_UI::instance()->tooltips().set_tip(*btn_add, _("Add a plugin to the effect list")); + ARDOUR_UI::instance()->set_tip(*btn_add, _("Add a plugin to the effect list")); btn_add->set_sensitive (false); btn_remove = manage(new Gtk::Button(Stock::REMOVE)); btn_remove->set_sensitive (false); - ARDOUR_UI::instance()->tooltips().set_tip(*btn_remove, _("Remove a plugin from the effect list")); + ARDOUR_UI::instance()->set_tip(*btn_remove, _("Remove a plugin from the effect list")); Gtk::Button *btn_update = manage(new Gtk::Button(Stock::REFRESH)); - ARDOUR_UI::instance()->tooltips().set_tip(*btn_update, _("Update available plugins")); + ARDOUR_UI::instance()->set_tip(*btn_update, _("Update available plugins")); btn_add->set_name("PluginSelectorButton"); btn_remove->set_name("PluginSelectorButton"); @@ -150,9 +153,9 @@ PluginSelector::PluginSelector (PluginManager *mgr) filter_box->pack_start (filter_entry, true, true); filter_box->pack_start (filter_button, false, false); - filter_entry.signal_changed().connect (mem_fun (*this, &PluginSelector::filter_entry_changed)); - filter_button.signal_clicked().connect (mem_fun (*this, &PluginSelector::filter_button_clicked)); - filter_mode.signal_changed().connect (mem_fun (*this, &PluginSelector::filter_mode_changed)); + filter_entry.signal_changed().connect (sigc::mem_fun (*this, &PluginSelector::filter_entry_changed)); + filter_button.signal_clicked().connect (sigc::mem_fun (*this, &PluginSelector::filter_button_clicked)); + filter_mode.signal_changed().connect (sigc::mem_fun (*this, &PluginSelector::filter_mode_changed)); filter_box->show (); filter_mode.show (); @@ -178,34 +181,28 @@ PluginSelector::PluginSelector (PluginManager *mgr) //plugin_display.set_name("PluginSelectorList"); added_list.set_name("PluginSelectorList"); - plugin_display.signal_button_press_event().connect_notify (mem_fun(*this, &PluginSelector::row_clicked)); - plugin_display.get_selection()->signal_changed().connect (mem_fun(*this, &PluginSelector::display_selection_changed)); + plugin_display.signal_button_press_event().connect_notify (sigc::mem_fun(*this, &PluginSelector::row_clicked)); + plugin_display.get_selection()->signal_changed().connect (sigc::mem_fun(*this, &PluginSelector::display_selection_changed)); plugin_display.grab_focus(); - btn_update->signal_clicked().connect (mem_fun(*this, &PluginSelector::btn_update_clicked)); - btn_add->signal_clicked().connect(mem_fun(*this, &PluginSelector::btn_add_clicked)); - btn_remove->signal_clicked().connect(mem_fun(*this, &PluginSelector::btn_remove_clicked)); - added_list.get_selection()->signal_changed().connect (mem_fun(*this, &PluginSelector::added_list_selection_changed)); + btn_update->signal_clicked().connect (sigc::mem_fun(*this, &PluginSelector::btn_update_clicked)); + btn_add->signal_clicked().connect(sigc::mem_fun(*this, &PluginSelector::btn_add_clicked)); + btn_remove->signal_clicked().connect(sigc::mem_fun(*this, &PluginSelector::btn_remove_clicked)); + added_list.get_selection()->signal_changed().connect (sigc::mem_fun(*this, &PluginSelector::added_list_selection_changed)); refill (); } -void -PluginSelector::row_clicked(GdkEventButton* event) +PluginSelector::~PluginSelector () { - if (event->type == GDK_2BUTTON_PRESS) - btn_add_clicked(); + delete _plugin_menu; } void -PluginSelector::set_session (Session* s) +PluginSelector::row_clicked(GdkEventButton* event) { - ENSURE_GUI_THREAD(bind (mem_fun(*this, &PluginSelector::set_session), s)); - - session = s; - - if (session) { - session->GoingAway.connect (bind (mem_fun(*this, &PluginSelector::set_session), static_cast (0))); + if (event->type == GDK_2BUTTON_PRESS) { + btn_add_clicked(); } } @@ -216,11 +213,11 @@ PluginSelector::show_this_plugin (const PluginInfoPtr& info, const std::string& std::string mode = filter_mode.get_active_text (); if (mode == _("Favorites only")) { - return manager->get_status (info) == PluginManager::Favorite; + return manager.get_status (info) == PluginManager::Favorite; } if (mode == _("Hidden only")) { - return manager->get_status (info) == PluginManager::Hidden; + return manager.get_status (info) == PluginManager::Hidden; } if (!filterstr.empty()) { @@ -244,6 +241,9 @@ PluginSelector::show_this_plugin (const PluginInfoPtr& info, const std::string& case VST: compstr = X_("VST"); break; + case LXVST: + compstr = X_("LXVST"); + break; } } else if (mode == _("Author contains")) { @@ -289,6 +289,7 @@ PluginSelector::refill () ladspa_refiller (filterstr); lv2_refiller (filterstr); vst_refiller (filterstr); + lxvst_refiller (filterstr); au_refiller (filterstr); in_row_change = false; @@ -304,8 +305,8 @@ PluginSelector::refiller (const PluginInfoList& plugs, const::std::string& filte if (show_this_plugin (*i, filterstr)) { TreeModel::Row newrow = *(plugin_model->append()); - newrow[plugin_columns.favorite] = (manager->get_status (*i) == PluginManager::Favorite); - newrow[plugin_columns.hidden] = (manager->get_status (*i) == PluginManager::Hidden); + newrow[plugin_columns.favorite] = (manager.get_status (*i) == PluginManager::Favorite); + newrow[plugin_columns.hidden] = (manager.get_status (*i) == PluginManager::Hidden); newrow[plugin_columns.name] = (*i)->name; newrow[plugin_columns.type_name] = type; newrow[plugin_columns.category] = (*i)->category; @@ -338,14 +339,14 @@ PluginSelector::refiller (const PluginInfoList& plugs, const::std::string& filte void PluginSelector::ladspa_refiller (const std::string& filterstr) { - refiller (manager->ladspa_plugin_info(), filterstr, "LADSPA"); + refiller (manager.ladspa_plugin_info(), filterstr, "LADSPA"); } void PluginSelector::lv2_refiller (const std::string& filterstr) { -#ifdef HAVE_SLV2 - refiller (manager->lv2_plugin_info(), filterstr, "LV2"); +#ifdef LV2_SUPPORT + refiller (manager.lv2_plugin_info(), filterstr, "LV2"); #endif } @@ -357,30 +358,42 @@ PluginSelector::vst_refiller (const std::string&) #endif { #ifdef VST_SUPPORT - refiller (manager->vst_plugin_info(), filterstr, "VST"); + refiller (manager.vst_plugin_info(), filterstr, "VST"); +#endif +} + +void +#ifdef LXVST_SUPPORT +PluginSelector::lxvst_refiller (const std::string& filterstr) +#else +PluginSelector::lxvst_refiller (const std::string&) +#endif +{ +#ifdef LXVST_SUPPORT + refiller (manager.lxvst_plugin_info(), filterstr, "LXVST"); #endif } void -#ifdef HAVE_AUDIOUNITS +#ifdef AUDIOUNIT_SUPPORT PluginSelector::au_refiller (const std::string& filterstr) #else PluginSelector::au_refiller (const std::string&) #endif { -#ifdef HAVE_AUDIOUNITS - refiller (manager->au_plugin_info(), filterstr, "AU"); +#ifdef AUDIOUNIT_SUPPORT + refiller (manager.au_plugin_info(), filterstr, "AU"); #endif } PluginPtr PluginSelector::load_plugin (PluginInfoPtr pi) { - if (session == 0) { + if (_session == 0) { return PluginPtr(); } - return pi->load (*session); + return pi->load (*_session); } void @@ -417,7 +430,7 @@ PluginSelector::btn_remove_clicked() void PluginSelector::btn_update_clicked() { - manager->refresh (); + manager.refresh (); refill(); } @@ -446,29 +459,39 @@ PluginSelector::run () { ResponseType r; TreeModel::Children::iterator i; - SelectedPlugins plugins; - r = (ResponseType) Dialog::run (); + bool finish = false; - 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); + while (!finish) { + + 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); + } else { + MessageDialog msg (string_compose (_("The plugin \"%1\" could not be loaded\n\nSee the Log window for more details (maybe)"), pp->name)); + msg.run (); + } } - } - if (interested_object && !plugins.empty()) { - interested_object->use_plugins (plugins); - } + if (interested_object && !plugins.empty()) { + finish = !interested_object->use_plugins (plugins); + } - break; + break; - default: - break; + default: + finish = true; + break; + } } + hide(); amodel->clear(); interested_object = 0; @@ -563,45 +586,53 @@ struct PluginMenuCompareByCategory { } }; -Gtk::Menu& +/** @return Plugin menu. The caller should not delete it */ +Gtk::Menu* PluginSelector::plugin_menu() +{ + return _plugin_menu; +} + +void +PluginSelector::build_plugin_menu () { PluginInfoList all_plugs; - all_plugs.insert (all_plugs.end(), manager->ladspa_plugin_info().begin(), manager->ladspa_plugin_info().end()); + all_plugs.insert (all_plugs.end(), manager.ladspa_plugin_info().begin(), manager.ladspa_plugin_info().end()); #ifdef VST_SUPPORT - all_plugs.insert (all_plugs.end(), manager->vst_plugin_info().begin(), manager->vst_plugin_info().end()); + all_plugs.insert (all_plugs.end(), manager.vst_plugin_info().begin(), manager.vst_plugin_info().end()); +#endif +#ifdef LXVST_SUPPORT + all_plugs.insert (all_plugs.end(), manager.lxvst_plugin_info().begin(), manager.lxvst_plugin_info().end()); #endif -#ifdef HAVE_AUDIOUNITS - all_plugs.insert (all_plugs.end(), manager->au_plugin_info().begin(), manager->au_plugin_info().end()); +#ifdef AUDIOUNIT_SUPPORT + all_plugs.insert (all_plugs.end(), manager.au_plugin_info().begin(), manager.au_plugin_info().end()); #endif -#ifdef HAVE_SLV2 - all_plugs.insert (all_plugs.end(), manager->lv2_plugin_info().begin(), manager->lv2_plugin_info().end()); +#ifdef LV2_SUPPORT + all_plugs.insert (all_plugs.end(), manager.lv2_plugin_info().begin(), manager.lv2_plugin_info().end()); #endif using namespace Menu_Helpers; - if (!_menu) { - _menu = new Menu(); - _menu->set_name("ArdourContextMenu"); - } + delete _plugin_menu; + + _plugin_menu = manage (new Menu); + _plugin_menu->set_name("ArdourContextMenu"); - MenuList& items = _menu->items(); + MenuList& items = _plugin_menu->items(); items.clear (); Gtk::Menu* favs = create_favs_menu(all_plugs); - items.push_back (MenuElem (_("Favorites"), *favs)); + items.push_back (MenuElem (_("Favorites"), *manage (favs))); - items.push_back (MenuElem (_("Plugin Manager"), mem_fun (*this, &PluginSelector::show_manager))); + items.push_back (MenuElem (_("Plugin Manager..."), sigc::mem_fun (*this, &PluginSelector::show_manager))); items.push_back (SeparatorElem ()); Menu* by_creator = create_by_creator_menu(all_plugs); - items.push_back (MenuElem (_("By Creator"), *by_creator)); + items.push_back (MenuElem (_("By Creator"), *manage (by_creator))); Menu* by_category = create_by_category_menu(all_plugs); - items.push_back (MenuElem (_("By Category"), *by_category)); - - return *_menu; + items.push_back (MenuElem (_("By Category"), *manage (by_category))); } Gtk::Menu* @@ -616,8 +647,8 @@ PluginSelector::create_favs_menu (PluginInfoList& all_plugs) all_plugs.sort (cmp_by_name); for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) { - if (manager->get_status (*i) == PluginManager::Favorite) { - favs->items().push_back (MenuElem ((*i)->name, (bind (mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)))); + if (manager.get_status (*i) == PluginManager::Favorite) { + favs->items().push_back (MenuElem ((*i)->name, (sigc::bind (sigc::mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)))); } } return favs; @@ -628,7 +659,7 @@ PluginSelector::create_by_creator_menu (ARDOUR::PluginInfoList& all_plugs) { using namespace Menu_Helpers; - typedef std::map SubmenuMap; + typedef std::map SubmenuMap; SubmenuMap creator_submenu_map; Menu* by_creator = new Menu(); @@ -640,7 +671,7 @@ PluginSelector::create_by_creator_menu (ARDOUR::PluginInfoList& all_plugs) for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) { - if (manager->get_status (*i) == PluginManager::Hidden) continue; + if (manager.get_status (*i) == PluginManager::Hidden) continue; string creator = (*i)->creator; @@ -655,11 +686,11 @@ PluginSelector::create_by_creator_menu (ARDOUR::PluginInfoList& all_plugs) submenu = x->second; } else { submenu = new Gtk::Menu; - by_creator_items.push_back (MenuElem (creator, *submenu)); - creator_submenu_map.insert (pair (creator, submenu)); + by_creator_items.push_back (MenuElem (creator, *manage (submenu))); + creator_submenu_map.insert (pair (creator, submenu)); submenu->set_name("ArdourContextMenu"); } - submenu->items().push_back (MenuElem ((*i)->name, (bind (mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)))); + submenu->items().push_back (MenuElem ((*i)->name, (sigc::bind (sigc::mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)))); } return by_creator; } @@ -669,7 +700,7 @@ PluginSelector::create_by_category_menu (ARDOUR::PluginInfoList& all_plugs) { using namespace Menu_Helpers; - typedef std::map SubmenuMap; + typedef std::map SubmenuMap; SubmenuMap category_submenu_map; Menu* by_category = new Menu(); @@ -681,7 +712,7 @@ PluginSelector::create_by_category_menu (ARDOUR::PluginInfoList& all_plugs) for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) { - if (manager->get_status (*i) == PluginManager::Hidden) continue; + if (manager.get_status (*i) == PluginManager::Hidden) continue; string category = (*i)->category; @@ -691,11 +722,11 @@ PluginSelector::create_by_category_menu (ARDOUR::PluginInfoList& all_plugs) submenu = x->second; } else { submenu = new Gtk::Menu; - by_category_items.push_back (MenuElem (category, *submenu)); - category_submenu_map.insert (pair (category, submenu)); + by_category_items.push_back (MenuElem (category, *manage (submenu))); + category_submenu_map.insert (pair (category, submenu)); submenu->set_name("ArdourContextMenu"); } - submenu->items().push_back (MenuElem ((*i)->name, (bind (mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)))); + submenu->items().push_back (MenuElem ((*i)->name, (sigc::bind (sigc::mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)))); } return by_category; } @@ -715,7 +746,7 @@ PluginSelector::plugin_chosen_from_menu (const PluginInfoPtr& pi) } void -PluginSelector::favorite_changed (const Glib::ustring& path) +PluginSelector::favorite_changed (const std::string& path) { PluginInfoPtr pi; @@ -741,15 +772,17 @@ PluginSelector::favorite_changed (const Glib::ustring& path) pi = (*iter)[plugin_columns.plugin]; - manager->set_status (pi->type, pi->unique_id, status); + manager.set_status (pi->type, pi->unique_id, status); + + manager.save_statuses (); - manager->save_statuses (); + build_plugin_menu (); } in_row_change = false; } void -PluginSelector::hidden_changed (const Glib::ustring& path) +PluginSelector::hidden_changed (const std::string& path) { PluginInfoPtr pi; @@ -775,9 +808,9 @@ PluginSelector::hidden_changed (const Glib::ustring& path) pi = (*iter)[plugin_columns.plugin]; - manager->set_status (pi->type, pi->unique_id, status); + manager.set_status (pi->type, pi->unique_id, status); - manager->save_statuses (); + manager.save_statuses (); } in_row_change = false; }