diff options
author | Carl Hetherington <carl@carlh.net> | 2009-11-16 01:06:33 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2009-11-16 01:06:33 +0000 |
commit | 1e8f2693f7837fce868e0e4e710c6e8aeffb7662 (patch) | |
tree | 9e72fcc1a6e1c162f10d9e0332c006f3b3bb2e8c | |
parent | 0aaa08a3d260539e2c193082d7c1ce2967a8e148 (diff) |
Build plugin menu only when plugins change, and build the first version of it before it is required to ensure that the first processor box popup menu appears fairly quickly.
git-svn-id: svn://localhost/ardour2/branches/3.0@6092 d708f5d6-7413-0410-9779-e7cbd77b26cf
-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 |