};
PluginSelector::PluginSelector (PluginManager *mgr)
- : ArdourDialog (_("ardour: plugins"), true, false),
+ : ArdourDialog (_("Plugin Manager"), true, false),
filter_button (Stock::CLEAR)
{
set_position (Gtk::WIN_POS_MOUSE);
set_name ("PluginSelectorWindow");
add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
+ _plugin_menu = 0;
manager = mgr;
- session = 0;
- _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
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);
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");
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 ();
//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();
}
}
PluginPtr
PluginSelector::load_plugin (PluginInfoPtr pi)
{
- if (session == 0) {
+ if (_session == 0) {
return PluginPtr();
}
- return pi->load (*session);
+ return pi->load (*_session);
}
void
{
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);
+ }
}
+ if (interested_object && !plugins.empty()) {
+ finish = !interested_object->use_plugins (plugins);
+ }
+
+ break;
+
+ default:
+ finish = true;
+ break;
}
- if (interested_object && !plugins.empty()) {
- interested_object->use_plugins (plugins);
- }
-
- break;
-
- default:
- break;
}
-
+
+
hide();
amodel->clear();
interested_object = 0;
}
};
-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;
using namespace Menu_Helpers;
- if (!_menu) {
- _menu = new Menu();
- _menu->set_name("ArdourContextMenu");
- }
-
- MenuList& items = _menu->items();
+ delete _plugin_menu;
+
+ _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*
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))));
+ favs->items().push_back (MenuElem ((*i)->name, (sigc::bind (sigc::mem_fun (*this, &PluginSelector::plugin_chosen_from_menu), *i))));
}
}
return favs;
submenu = x->second;
} else {
submenu = new Gtk::Menu;
- by_creator_items.push_back (MenuElem (creator, *submenu));
+ by_creator_items.push_back (MenuElem (creator, *manage (submenu)));
creator_submenu_map.insert (pair<Glib::ustring,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;
}
submenu = x->second;
} else {
submenu = new Gtk::Menu;
- by_category_items.push_back (MenuElem (category, *submenu));
+ by_category_items.push_back (MenuElem (category, *manage (submenu)));
category_submenu_map.insert (pair<Glib::ustring,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;
}
manager->set_status (pi->type, pi->unique_id, status);
manager->save_statuses ();
+
+ build_plugin_menu ();
}
in_row_change = false;
}