diff options
-rw-r--r-- | gtk2_ardour/mixer_ui.cc | 7 | ||||
-rw-r--r-- | gtk2_ardour/plugin_selector.cc | 31 | ||||
-rw-r--r-- | gtk2_ardour/plugin_selector.h | 3 | ||||
-rw-r--r-- | libs/ardour/ardour/plugin_manager.h | 3 | ||||
-rw-r--r-- | libs/ardour/plugin_manager.cc | 2 |
5 files changed, 34 insertions, 12 deletions
diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 0d3f42c1d5..9d918d4e3b 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -63,7 +63,6 @@ using PBD::atoi; Mixer_UI::Mixer_UI () : Window (Gtk::WINDOW_TOPLEVEL) - , _plugin_selector (0) { session = 0; _strip_width = Config->get_default_narrow_ms() ? Narrow : Wide; @@ -252,6 +251,8 @@ Mixer_UI::Mixer_UI () group_display.show(); auto_rebinding = FALSE; + + _plugin_selector = new PluginSelector (PluginManager::the_manager ()); } Mixer_UI::~Mixer_UI () @@ -1554,9 +1555,5 @@ Mixer_UI::set_route_group_activation (RouteGroup* g, bool a) PluginSelector* Mixer_UI::plugin_selector() { - if (!_plugin_selector) { - _plugin_selector = new PluginSelector (PluginManager::the_manager()); - _plugin_selector->set_session (session); - } return _plugin_selector; } diff --git a/gtk2_ardour/plugin_selector.cc b/gtk2_ardour/plugin_selector.cc index f50c97e417..cf43422f4f 100644 --- a/gtk2_ardour/plugin_selector.cc +++ b/gtk2_ardour/plugin_selector.cc @@ -70,10 +70,14 @@ PluginSelector::PluginSelector (PluginManager *mgr) set_name ("PluginSelectorWindow"); add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK); + _plugin_menu = 0; manager = mgr; session = 0; in_row_change = false; + manager->PluginListChanged.connect (mem_fun (*this, &PluginSelector::build_plugin_menu)); + 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 @@ -189,6 +193,11 @@ PluginSelector::PluginSelector (PluginManager *mgr) refill (); } +PluginSelector::~PluginSelector () +{ + delete _plugin_menu; +} + void PluginSelector::row_clicked(GdkEventButton* event) { @@ -562,10 +571,16 @@ struct PluginMenuCompareByCategory { } }; -/** @return a Gtk::manage()d 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()); @@ -581,10 +596,12 @@ PluginSelector::plugin_menu() using namespace Menu_Helpers; - Menu* menu = manage (new Menu()); - menu->set_name("ArdourContextMenu"); - - MenuList& items = menu->items(); + delete _plugin_menu; + + _plugin_menu = new Menu; + _plugin_menu->set_name("ArdourContextMenu"); + + MenuList& items = _plugin_menu->items(); items.clear (); Gtk::Menu* favs = create_favs_menu(all_plugs); @@ -598,8 +615,6 @@ PluginSelector::plugin_menu() Menu* by_category = create_by_category_menu(all_plugs); items.push_back (MenuElem (_("By Category"), *manage (by_category))); - - return menu; } Gtk::Menu* @@ -742,6 +757,8 @@ PluginSelector::favorite_changed (const Glib::ustring& path) manager->set_status (pi->type, pi->unique_id, status); manager->save_statuses (); + + build_plugin_menu (); } in_row_change = false; } diff --git a/gtk2_ardour/plugin_selector.h b/gtk2_ardour/plugin_selector.h index 824fbf8207..06e746853f 100644 --- a/gtk2_ardour/plugin_selector.h +++ b/gtk2_ardour/plugin_selector.h @@ -37,6 +37,7 @@ class PluginSelector : public ArdourDialog { public: PluginSelector (ARDOUR::PluginManager *); + ~PluginSelector (); void set_interested_object (PluginInterestedObject&); @@ -114,6 +115,7 @@ class PluginSelector : public ArdourDialog void vst_refiller (const std::string&); void au_refiller (const std::string&); + Gtk::Menu* _plugin_menu; ARDOUR::PluginManager *manager; void row_clicked(GdkEventButton *); @@ -136,6 +138,7 @@ class PluginSelector : public ArdourDialog Gtk::Menu* create_favs_menu (ARDOUR::PluginInfoList&); Gtk::Menu* create_by_creator_menu (ARDOUR::PluginInfoList&); Gtk::Menu* create_by_category_menu (ARDOUR::PluginInfoList&); + void build_plugin_menu (); }; #endif // __ardour_plugin_selector_h__ diff --git a/libs/ardour/ardour/plugin_manager.h b/libs/ardour/ardour/plugin_manager.h index 779e26e915..0a056b574a 100644 --- a/libs/ardour/ardour/plugin_manager.h +++ b/libs/ardour/ardour/plugin_manager.h @@ -69,6 +69,9 @@ class PluginManager : public boost::noncopyable { void set_status (ARDOUR::PluginType type, std::string unique_id, PluginStatusType status); PluginStatusType get_status (const PluginInfoPtr&); + /** plugins were added to or removed from one of the PluginInfoLists */ + sigc::signal<void> PluginListChanged; + private: struct PluginStatus { ARDOUR::PluginType type; diff --git a/libs/ardour/plugin_manager.cc b/libs/ardour/plugin_manager.cc index 22e649e03e..9b5898ddb9 100644 --- a/libs/ardour/plugin_manager.cc +++ b/libs/ardour/plugin_manager.cc @@ -156,6 +156,8 @@ PluginManager::refresh () #ifdef HAVE_AUDIOUNITS au_refresh (); #endif + + PluginListChanged (); /* EMIT SIGNAL */ } void |