correct length for BBT "off" clock state; use bold font for nudge clock
[ardour.git] / gtk2_ardour / plugin_selector.cc
index c2f81f4981b10d3ad8b28da51faf5dcd88b5d757..71036b72da10f9d762aaaac34fbaebc390f97b11 100644 (file)
@@ -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<CellRendererToggle*>(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<CellRendererToggle*>(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<Session*> (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<Glib::ustring,Gtk::Menu*> SubmenuMap;
+       typedef std::map<std::string,Gtk::Menu*> 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<Glib::ustring,Menu*> (creator, submenu));
+                       by_creator_items.push_back (MenuElem (creator, *manage (submenu)));
+                       creator_submenu_map.insert (pair<std::string,Menu*> (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<Glib::ustring,Gtk::Menu*> SubmenuMap;
+       typedef std::map<std::string,Gtk::Menu*> 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<Glib::ustring,Menu*> (category, submenu));
+                       by_category_items.push_back (MenuElem (category, *manage (submenu)));
+                       category_submenu_map.insert (pair<std::string,Menu*> (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;
 }