20 #include "gtk2ardour-config.h"
28 #include <gtkmm/table.h>
29 #include <gtkmm/stock.h>
30 #include <gtkmm/button.h>
31 #include <gtkmm/notebook.h>
39 #include "ardour/utils.h"
55 N_(
"Category contains"),
56 N_(
"Author contains"),
57 N_(
"Library contains"),
65 , filter_button (Stock::CLEAR)
69 set_name (
"PluginSelectorWindow");
70 add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
100 CellRendererToggle* fav_cell =
dynamic_cast<CellRendererToggle*
>(
plugin_display.get_column_cell_renderer (0));
101 fav_cell->property_activatable() =
true;
102 fav_cell->property_radio() =
true;
105 CellRendererToggle* hidden_cell =
dynamic_cast<CellRendererToggle*
>(
plugin_display.get_column_cell_renderer (1));
106 hidden_cell->property_activatable() =
true;
107 hidden_cell->property_radio() =
true;
111 scroller.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
120 for (
int i = 0; i <=8; i++) {
122 column->set_sort_column(i);
126 ascroller.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
128 btn_add = manage(
new Gtk::Button(Stock::ADD));
130 btn_add->set_sensitive (
false);
131 btn_remove = manage(
new Gtk::Button(Stock::REMOVE));
134 Gtk::Button *btn_update = manage(
new Gtk::Button(Stock::REFRESH));
137 btn_add->set_name(
"PluginSelectorButton");
140 Gtk::Table* table = manage(
new Gtk::Table(7, 11));
141 table->set_size_request(750, 500);
142 table->attach(
scroller, 0, 7, 0, 5);
144 HBox* filter_box = manage (
new HBox);
148 filter_mode.set_active_text (filter_strings.front());
150 filter_box->pack_start (
filter_mode,
false,
false);
163 table->attach (*filter_box, 0, 7, 5, 6, FILL|EXPAND, FILL, 5, 5);
165 table->attach(*
btn_add, 1, 2, 6, 7, FILL, FILL, 5, 5);
166 table->attach(*
btn_remove, 3, 4, 6, 7, FILL, FILL, 5, 5);
167 table->attach(*btn_update, 5, 6, 6, 7, FILL, FILL, 5, 5);
171 add_button (Stock::CLOSE, RESPONSE_CLOSE);
172 add_button (
_(
"Insert Plugin(s)"), RESPONSE_APPLY);
173 set_default_response (RESPONSE_APPLY);
174 set_response_sensitive (RESPONSE_APPLY,
false);
175 get_vbox()->pack_start (*table);
177 table->set_name(
"PluginSelectorTable");
209 if (event->type == GDK_2BUTTON_PRESS)
219 if (mode ==
_(
"Favorites only")) {
223 if (mode ==
_(
"Hidden only")) {
227 if (!filterstr.empty()) {
229 if (mode ==
_(
"Name contains")) {
230 compstr = info->
name;
231 }
else if (mode ==
_(
"Category contains")) {
233 }
else if (mode ==
_(
"Type contains")) {
235 switch (info->
type) {
237 compstr =
X_(
"LADSPA");
240 compstr =
X_(
"AudioUnit");
249 compstr =
X_(
"LXVST");
253 }
else if (mode ==
_(
"Author contains")) {
255 }
else if (mode ==
_(
"Library contains")) {
256 compstr = info->
path;
259 if (compstr.empty()) {
263 transform (compstr.begin(), compstr.end(), compstr.begin(), ::toupper);
265 if (compstr.find (filterstr) != string::npos) {
279 transform (filterstr.begin(), filterstr.end(), filterstr.begin(), ::toupper);
285 std::string filterstr;
307 for (PluginInfoList::const_iterator i = plugs.begin(); i != plugs.end(); ++i) {
318 string creator = (*i)->creator;
319 string::size_type pos = 0;
322 #ifdef PLATFORM_WINDOWS
323 while (pos < creator.length() && creator[pos] > -2 && creator[pos] < 256 && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
325 while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
329 if (creator.length()<2 || pos<3)
332 creator = creator.substr (0, pos);
336 if ((*i)->reconfigurable_io ()) {
342 snprintf (buf,
sizeof(buf),
"%d", (*i)->n_inputs.n_audio());
344 snprintf (buf,
sizeof(buf),
"%d", (*i)->n_inputs.n_midi());
347 snprintf (buf,
sizeof(buf),
"%d", (*i)->n_outputs.n_audio());
349 snprintf (buf,
sizeof(buf),
"%d", (*i)->n_outputs.n_midi());
373 #ifdef WINDOWS_VST_SUPPORT
379 #ifdef WINDOWS_VST_SUPPORT
380 refiller (manager.windows_vst_plugin_info(), filterstr,
"VST");
392 refiller (manager.lxvst_plugin_info(), filterstr,
"LXVST");
397 #ifdef AUDIOUNIT_SUPPORT
403 #ifdef AUDIOUNIT_SUPPORT
404 refiller (manager.au_plugin_info(), filterstr,
"AU");
423 TreeModel::Row newrow = *(
amodel->append());
433 if (!
amodel->children().empty()) {
434 set_response_sensitive (RESPONSE_APPLY,
true);
441 TreeModel::iterator iter =
added_list.get_selection()->get_selected();
444 if (
amodel->children().empty()) {
445 set_response_sensitive (RESPONSE_APPLY,
false);
461 btn_add->set_sensitive (
false);
468 if (
added_list.get_selection()->count_selected_rows() != 0) {
479 TreeModel::Children::iterator i;
486 r = (ResponseType) Dialog::run ();
490 for (i =
amodel->children().begin(); i !=
amodel->children().end(); ++i) {
494 plugins.push_back (p);
496 MessageDialog msg (
string_compose (
_(
"The plugin \"%1\" could not be loaded\n\nSee the Log window for more details (maybe)"), pp->
name));
537 if (mode ==
_(
"Favorites only") || mode ==
_(
"Hidden only")) {
561 }
else if (cmp == 0) {
579 }
else if (cmp == 0) {
597 }
else if (cmp == 0) {
620 #ifdef WINDOWS_VST_SUPPORT
626 #ifdef AUDIOUNIT_SUPPORT
633 using namespace Menu_Helpers;
644 items.push_back (MenuElem (
_(
"Favorites"), *manage (favs)));
647 items.push_back (SeparatorElem ());
650 items.push_back (MenuElem (
_(
"By Creator"), *manage (by_creator)));
653 items.push_back (MenuElem (
_(
"By Category"), *manage (by_category)));
659 using namespace Menu_Helpers;
661 Menu* favs =
new Menu();
662 favs->set_name(
"ArdourContextMenu");
665 all_plugs.sort (cmp_by_name);
667 for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) {
670 elem.get_child()->set_use_underline (
false);
671 favs->items().push_back (elem);
680 using namespace Menu_Helpers;
682 typedef std::map<std::string,Gtk::Menu*> SubmenuMap;
683 SubmenuMap creator_submenu_map;
685 Menu* by_creator =
new Menu();
686 by_creator->set_name(
"ArdourContextMenu");
688 MenuList& by_creator_items = by_creator->items();
690 all_plugs.sort (cmp_by_creator);
692 for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) {
696 string creator = (*i)->creator;
699 string::size_type pos = 0;
700 #ifdef PLATFORM_WINDOWS
701 while (pos < creator.length() && creator[pos]>(-2) && creator[pos]<256 && (isprint (creator[pos]))) ++pos;
703 while (pos < creator.length() && (isalnum (creator[pos]) || isspace (creator[pos]))) ++pos;
707 if (creator.length() != pos) {
711 creator =
"Unknown?";
713 creator = creator.substr (0, pos);
716 SubmenuMap::iterator x;
718 if ((x = creator_submenu_map.find (creator)) != creator_submenu_map.end()) {
721 submenu =
new Gtk::Menu;
722 by_creator_items.push_back (MenuElem (creator, *manage (submenu)));
723 creator_submenu_map.insert (pair<std::string,Menu*> (creator, submenu));
724 submenu->set_name(
"ArdourContextMenu");
727 elem.get_child()->set_use_underline (
false);
728 submenu->items().push_back (elem);
736 using namespace Menu_Helpers;
738 typedef std::map<std::string,Gtk::Menu*> SubmenuMap;
739 SubmenuMap category_submenu_map;
741 Menu* by_category =
new Menu();
742 by_category->set_name(
"ArdourContextMenu");
744 MenuList& by_category_items = by_category->items();
746 all_plugs.sort (cmp_by_category);
748 for (PluginInfoList::const_iterator i = all_plugs.begin(); i != all_plugs.end(); ++i) {
752 string category = (*i)->category;
754 SubmenuMap::iterator x;
756 if ((x = category_submenu_map.find (category)) != category_submenu_map.end()) {
759 submenu =
new Gtk::Menu;
760 by_category_items.push_back (MenuElem (category, *manage (submenu)));
761 category_submenu_map.insert (pair<std::string,Menu*> (category, submenu));
762 submenu->set_name(
"ArdourContextMenu");
765 elem.get_child()->set_use_underline (
false);
766 submenu->items().push_back (elem);
778 plugins.push_back (p);
796 TreeModel::iterator iter =
plugin_model->get_iter (path);
832 TreeModel::iterator iter =
plugin_model->get_iter (path);
void added_list_selection_changed()
Gtk::TreeModelColumn< bool > hidden
ARDOUR::PluginManager & manager
Gtk::TreeModelColumn< std::string > audio_outs
void filter_mode_changed()
Gtk::Menu * plugin_menu()
LIBARDOUR_API PBD::PropertyDescriptor< bool > hidden
void vst_refiller(const std::string &)
void refiller(const ARDOUR::PluginInfoList &plugs, const ::std::string &filterstr, const char *type)
Gtk::ComboBoxText filter_mode
bool show_this_plugin(const ARDOUR::PluginInfoPtr &, const std::string &)
void added_row_clicked(GdkEventButton *event)
static ARDOUR_UI * instance()
void favorite_changed(const std::string &path)
ARDOUR::PluginInfoList & windows_vst_plugin_info()
void hidden_changed(const std::string &path)
void set_status(ARDOUR::PluginType type, std::string unique_id, PluginStatusType status)
void set_interested_object(PluginInterestedObject &)
LIBGTKMM2EXT_API void set_popdown_strings(Gtk::ComboBoxText &, const std::vector< std::string > &)
void filter_entry_changed()
void ladspa_refiller(const std::string &)
ARDOUR::PluginInfoList & lv2_plugin_info()
Gtk::TreeModelColumn< std::string > midi_ins
std::vector< ARDOUR::PluginPtr > SelectedPlugins
PluginSelector(ARDOUR::PluginManager &)
void plugin_chosen_from_menu(const ARDOUR::PluginInfoPtr &)
Gtk::Menu * create_by_category_menu(ARDOUR::PluginInfoList &)
boost::shared_ptr< Plugin > PluginPtr
virtual PluginPtr load(Session &session)=0
PBD::Signal0< void > PluginListChanged
void lv2_refiller(const std::string &)
void lxvst_refiller(const std::string &)
ARDOUR::PluginInfoList & ladspa_plugin_info()
PBD::ScopedConnectionList plugin_list_changed_connection
Gtk::TreeModelColumn< std::string > midi_outs
void display_selection_changed()
LIBARDOUR_API int cmp_nocase_utf8(const std::string &s1, const std::string &s2)
PluginInterestedObject * interested_object
Gtk::ScrolledWindow ascroller
virtual bool use_plugins(const SelectedPlugins &)=0
void btn_update_clicked()
void filter_button_clicked()
LIBPBD_API Transmitter info
LIBARDOUR_API uint64_t LV2
ARDOUR::PluginPtr load_plugin(ARDOUR::PluginInfoPtr)
void row_activated(Gtk::TreeModel::Path path, Gtk::TreeViewColumn *col)
Gtk::TreeView plugin_display
void set_tip(Gtk::Widget &w, const gchar *tip)
Gtk::TreeModelColumn< std::string > category
static const char * _filter_mode_strings[]
Gtk::TreeModelColumn< std::string > audio_ins
ARDOUR::PluginInfoList & au_plugin_info()
void au_refiller(const std::string &)
Gtk::TreeModelColumn< std::string > creator
ARDOUR::PluginInfoList & lxvst_plugin_info()
Gtk::TreeModelColumn< std::string > name
Gtk::Button filter_button
Gtk::TreeModelColumn< bool > favorite
Gtk::Menu * create_favs_menu(ARDOUR::PluginInfoList &)
Glib::RefPtr< Gtk::ListStore > plugin_model
Glib::RefPtr< Gtk::ListStore > amodel
Gtk::ScrolledWindow scroller
Gtk::TreeModelColumn< std::string > type_name
void btn_remove_clicked()
std::list< PluginInfoPtr > PluginInfoList
Gtk::Menu * create_by_creator_menu(ARDOUR::PluginInfoList &)
void setup_filter_string(std::string &)
PluginColumns plugin_columns
Gtk::TreeModelColumn< ARDOUR::PluginInfoPtr > plugin
Gtk::TreeModelColumn< ARDOUR::PluginInfoPtr > plugin
ARDOUR::Session * _session
std::string string_compose(const std::string &fmt, const T1 &o1)
Gtk::TreeModelColumn< std::string > text
PluginStatusType get_status(const PluginInfoPtr &)
void refresh(bool cache_only=false)