allow to en/disable shade and LED meter style
[ardour.git] / gtk2_ardour / plugin_selector.cc
index c2f81f4981b10d3ad8b28da51faf5dcd88b5d757..81adf40896669fb753d96d983de55aca21e66cfd 100644 (file)
@@ -37,8 +37,6 @@
 
 #include "ardour/plugin_manager.h"
 #include "ardour/plugin.h"
-#include "ardour/configuration.h"
-#include "ardour/session.h"
 
 #include "ardour_ui.h"
 #include "plugin_selector.h"
@@ -62,19 +60,21 @@ 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
@@ -82,7 +82,7 @@ PluginSelector::PluginSelector (PluginManager *mgr)
           related to "hidden"
        */
        plugin_display.append_column (_("Fav"), plugin_columns.favorite);
-       plugin_display.append_column (_("Hid"), plugin_columns.hidden);
+       plugin_display.append_column (_("Hide"), plugin_columns.hidden);
        plugin_display.append_column (_("Available Plugins"), plugin_columns.name);
        plugin_display.append_column (_("Type"), plugin_columns.type_name);
        plugin_display.append_column (_("Category"), plugin_columns.category);
@@ -99,12 +99,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 +125,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 +150,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,35 +178,27 @@ 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_row_activated().connect_notify (sigc::mem_fun(*this, &PluginSelector::row_activated));
+       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_activated(Gtk::TreeModel::Path, Gtk::TreeViewColumn*)
 {
-       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)));
-       }
+       btn_add_clicked();
 }
 
 bool
@@ -216,11 +208,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()) {
@@ -241,9 +233,12 @@ PluginSelector::show_this_plugin (const PluginInfoPtr& info, const std::string&
                        case LV2:
                                compstr = X_("LV2");
                                break;
-                       case VST:
+                       case Windows_VST:
                                compstr = X_("VST");
                                break;
+                       case LXVST:
+                               compstr = X_("LXVST");
+                               break;
                        }
 
                } else if (mode == _("Author contains")) {
@@ -289,6 +284,7 @@ PluginSelector::refill ()
        ladspa_refiller (filterstr);
        lv2_refiller (filterstr);
        vst_refiller (filterstr);
+       lxvst_refiller (filterstr);
        au_refiller (filterstr);
 
        in_row_change = false;
@@ -304,8 +300,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;
@@ -320,15 +316,22 @@ PluginSelector::refiller (const PluginInfoList& plugs, const::std::string& filte
 
                        newrow[plugin_columns.creator] = creator;
 
-                       snprintf (buf, sizeof(buf), "%d", (*i)->n_inputs.n_audio());
-                       newrow[plugin_columns.audio_ins] = buf;
-                       snprintf (buf, sizeof(buf), "%d", (*i)->n_inputs.n_midi());
-                       newrow[plugin_columns.midi_ins] = buf;
-
-                       snprintf (buf, sizeof(buf), "%d", (*i)->n_outputs.n_audio());
-                       newrow[plugin_columns.audio_outs] = buf;
-                       snprintf (buf, sizeof(buf), "%d", (*i)->n_outputs.n_midi());
-                       newrow[plugin_columns.midi_outs] = buf;
+                       if ((*i)->reconfigurable_io ()) {
+                               newrow[plugin_columns.audio_ins] = _("variable");
+                               newrow[plugin_columns.midi_ins] = _("variable");
+                               newrow[plugin_columns.audio_outs] = _("variable");
+                               newrow[plugin_columns.midi_outs] = _("variable");
+                       } else {
+                               snprintf (buf, sizeof(buf), "%d", (*i)->n_inputs.n_audio());
+                               newrow[plugin_columns.audio_ins] = buf;
+                               snprintf (buf, sizeof(buf), "%d", (*i)->n_inputs.n_midi());
+                               newrow[plugin_columns.midi_ins] = buf;
+                               
+                               snprintf (buf, sizeof(buf), "%d", (*i)->n_outputs.n_audio());
+                               newrow[plugin_columns.audio_outs] = buf;
+                               snprintf (buf, sizeof(buf), "%d", (*i)->n_outputs.n_midi());
+                               newrow[plugin_columns.midi_outs] = buf;
+                       }
 
                        newrow[plugin_columns.plugin] = *i;
                }
@@ -338,49 +341,61 @@ 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
 }
 
 void
-#ifdef VST_SUPPORT
+#ifdef WINDOWS_VST_SUPPORT
 PluginSelector::vst_refiller (const std::string& filterstr)
 #else
 PluginSelector::vst_refiller (const std::string&)
 #endif
 {
-#ifdef VST_SUPPORT
-       refiller (manager->vst_plugin_info(), filterstr, "VST");
+#ifdef WINDOWS_VST_SUPPORT
+       refiller (manager.windows_vst_plugin_info(), filterstr, "VST");
 #endif
 }
 
 void
-#ifdef HAVE_AUDIOUNITS
+#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 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 +432,7 @@ PluginSelector::btn_remove_clicked()
 void
 PluginSelector::btn_update_clicked()
 {
-       manager->refresh ();
+       manager.refresh ();
        refill();
 }
 
@@ -446,29 +461,39 @@ PluginSelector::run ()
 {
        ResponseType r;
        TreeModel::Children::iterator i;
-       SelectedPlugins plugins;
 
-       r = (ResponseType) Dialog::run ();
+       bool finish = false;
+
+       while (!finish) {
 
-       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);
+               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 +588,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());
-#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.ladspa_plugin_info().begin(), manager.ladspa_plugin_info().end());
+#ifdef WINDOWS_VST_SUPPORT
+       all_plugs.insert (all_plugs.end(), manager.windows_vst_plugin_info().begin(), manager.windows_vst_plugin_info().end());
 #endif
-#ifdef HAVE_AUDIOUNITS
-       all_plugs.insert (all_plugs.end(), manager->au_plugin_info().begin(), manager->au_plugin_info().end());
+#ifdef LXVST_SUPPORT
+       all_plugs.insert (all_plugs.end(), manager.lxvst_plugin_info().begin(), manager.lxvst_plugin_info().end());
 #endif
-#ifdef HAVE_SLV2
-       all_plugs.insert (all_plugs.end(), manager->lv2_plugin_info().begin(), manager->lv2_plugin_info().end());
+#ifdef AUDIOUNIT_SUPPORT
+       all_plugs.insert (all_plugs.end(), manager.au_plugin_info().begin(), manager.au_plugin_info().end());
+#endif
+#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;
 
-       MenuList& items = _menu->items();
+       _plugin_menu = manage (new Menu);
+       _plugin_menu->set_name("ArdourContextMenu");
+
+       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 +649,10 @@ 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) {
+                       MenuElem elem ((*i)->name, (sigc::bind (sigc::mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)));
+                       elem.get_child()->set_use_underline (false);
+                       favs->items().push_back (elem);
                }
        }
        return favs;
@@ -628,7 +663,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 +675,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 +690,13 @@ 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))));
+               MenuElem elem ((*i)->name, (sigc::bind (sigc::mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)));
+               elem.get_child()->set_use_underline (false);
+               submenu->items().push_back (elem);
        }
        return by_creator;
 }
@@ -669,7 +706,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 +718,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 +728,13 @@ 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))));
+               MenuElem elem ((*i)->name, (sigc::bind (sigc::mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i)));
+               elem.get_child()->set_use_underline (false);
+               submenu->items().push_back (elem);
        }
        return by_category;
 }
@@ -715,7 +754,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 +780,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 +816,11 @@ 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 ();
+               build_plugin_menu ();
        }
        in_row_change = false;
 }