2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include <gtkmm/table.h>
24 #include <gtkmm/button.h>
25 #include <gtkmm/notebook.h>
26 #include <gtkmm/ctree.h>
28 #include <ardour/plugin_manager.h>
29 #include <ardour/plugin.h>
30 #include <ardour/configuration.h>
32 #include "ardour_ui.h"
33 #include "plugin_selector.h"
34 #include "gui_thread.h"
38 using namespace ARDOUR;
40 static const gchar *i_titles[] = {
41 N_("Available LADSPA plugins"),
49 static const gchar *vst_titles[] = {
50 N_("Available VST plugins"),
57 static const gchar *o_titles[] = {
62 PluginSelector::PluginSelector (PluginManager *mgr)
63 : ArdourDialog ("plugin selector"),
64 ladspa_display (_input_refiller, this, internationalize (i_titles), false, true),
66 vst_display (_vst_refiller, this, internationalize (vst_titles), false, true),
68 o_selector (_output_refiller, this, internationalize (o_titles), false, true)
70 set_position (Gtk::WIN_POS_MOUSE);
71 set_name ("PluginSelectorWindow");
72 set_title (_("ardour: plugins"));
74 add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
81 Gtk::Button *btn_add = manage(new Gtk::Button(_("Add")));
82 ARDOUR_UI::instance()->tooltips().set_tip(*btn_add, _("Add a plugin to the effect list"));
83 Gtk::Button *btn_remove = manage(new Gtk::Button(_("Remove")));
84 ARDOUR_UI::instance()->tooltips().set_tip(*btn_remove, _("Remove a plugin from the effect list"));
85 Gtk::Button *btn_ok = manage(new Gtk::Button(_("OK")));
86 Gtk::Button *btn_cancel = manage(new Gtk::Button(_("Cancel")));
88 Gtk::Button *btn_update = manage(new Gtk::Button(_("Update")));
89 ARDOUR_UI::instance()->tooltips().set_tip(*btn_update, _("Update available plugins"));
91 btn_ok->set_name("PluginSelectorButton");
92 btn_cancel->set_name("PluginSelectorButton");
93 btn_add->set_name("PluginSelectorButton");
94 btn_remove->set_name("PluginSelectorButton");
96 Gtk::Table* table = manage(new Gtk::Table(7, 10));
97 table->set_size_request(750, 500);
98 table->attach(notebook, 0, 7, 0, 5);
100 table->attach(*btn_add, 1, 2, 5, 6, Gtk::FILL, 0, 5, 5);
101 table->attach(*btn_remove, 3, 4, 5, 6, Gtk::FILL, 0, 5, 5);
102 table->attach(*btn_update, 5, 6, 5, 6, Gtk::FILL, 0, 5, 5);
104 table->attach(o_selector, 0, 7, 7, 9);
105 table->attach(*btn_ok, 1, 3, 9, 10, Gtk::FILL, 0, 5, 5);
106 table->attach(*btn_cancel, 3, 4, 9, 10, Gtk::FILL, 0, 5, 5);
109 using namespace Gtk::Notebook_Helpers;
110 notebook.pages().push_back (TabElem (ladspa_display, _("LADSPA")));
112 if (Config->get_use_vst()) {
113 notebook.pages().push_back (TabElem (vst_display, _("VST")));
117 table->set_name("PluginSelectorTable");
118 //ladspa_display.set_name("PluginSelectorDisplay");
119 ladspa_display.clist().set_name("PluginSelectorList");
120 o_selector.clist().set_name("PluginSelectorList");
122 ladspa_display.clist().column_titles_active();
123 ladspa_display.clist().column(0).set_auto_resize (false);
124 ladspa_display.clist().column(0).set_width(470);
126 ladspa_display.clist().column(1).set_auto_resize (true);
127 o_selector.clist().column(0).set_auto_resize (true);
129 ladspa_display.selection_made.connect (slot(*this, &PluginSelector::i_plugin_selected));
130 ladspa_display.choice_made.connect(slot(*this, &PluginSelector::i_plugin_chosen));
131 ladspa_display.clist().click_column.connect(bind (slot(*this, &PluginSelector::column_clicked), ladspa_display.clist().gobj()));
133 if (Config->get_use_vst()) {
134 vst_display.selection_made.connect (slot(*this, &PluginSelector::i_plugin_selected));
135 vst_display.choice_made.connect(slot(*this, &PluginSelector::i_plugin_chosen));
136 vst_display.clist().click_column.connect(bind (slot(*this, &PluginSelector::column_clicked), vst_display.clist().gobj()));
139 o_selector.selection_made.connect(slot(*this, &PluginSelector::o_plugin_selected));
140 o_selector.choice_made.connect(slot(*this,&PluginSelector::o_plugin_chosen));
141 btn_update-.signal_clicked().connect (slot(*this, &PluginSelector::btn_update_clicked));
142 btn_add->clicked.connect(slot(*this, &PluginSelector::btn_add_clicked));
143 btn_remove->clicked.connect(slot(*this, &PluginSelector::btn_remove_clicked));
144 btn_ok->clicked.connect(slot(*this, &PluginSelector::btn_ok_clicked));
145 btn_cancel->clicked.connect(slot(*this,&PluginSelector::btn_cancel_clicked));
146 delete_event.connect (slot (*this, &PluginSelector::wm_close));
151 PluginSelector::set_session (Session* s)
153 ENSURE_GUI_THREAD(bind (slot (*this, &PluginSelector::set_session), s));
158 session->going_away.connect (bind (slot (*this, &PluginSelector::set_session), static_cast<Session*> (0)));
163 PluginSelector::_input_refiller (Gtk::CList &list, void *arg)
165 ((PluginSelector *) arg)->input_refiller (list);
169 PluginSelector::_output_refiller (Gtk::CList &list, void *arg)
171 ((PluginSelector *) arg)->output_refiller (list);
174 int compare(const void *left, const void *right)
176 return strcmp(*((char**)left), *((char**)right));
180 PluginSelector::input_refiller (Gtk::CList &clist)
182 const gchar *rowdata[4];
184 list<PluginInfo *> &plugs = manager->ladspa_plugin_info ();
185 list<PluginInfo *>::iterator i;
186 char ibuf[16], obuf[16];
188 // Insert into GTK list
189 for (row = 0, i=plugs.begin(); i != plugs.end(); ++i, ++row) {
190 rowdata[0] = (*i)->name.c_str();
191 rowdata[1] = (*i)->category.c_str();
193 snprintf (ibuf, sizeof(ibuf)-1, "%d", (*i)->n_inputs);
194 snprintf (obuf, sizeof(obuf)-1, "%d", (*i)->n_outputs);
198 clist.insert_row (row, rowdata);
199 clist.rows().back().set_data (*i);
202 clist.set_sort_column (0);
209 PluginSelector::_vst_refiller (Gtk::CList &list, void *arg)
211 ((PluginSelector *) arg)->vst_refiller (list);
215 PluginSelector::vst_refiller (Gtk::CList &clist)
217 const gchar *rowdata[3];
219 list<PluginInfo *> &plugs = manager->vst_plugin_info ();
220 list<PluginInfo *>::iterator i;
221 char ibuf[16], obuf[16];
223 if (!Config->get_use_vst()) {
227 // Insert into GTK list
229 for (row = 0, i = plugs.begin(); i != plugs.end(); ++i, ++row) {
230 rowdata[0] = (*i)->name.c_str();
232 snprintf (ibuf, sizeof(ibuf)-1, "%d", (*i)->n_inputs);
233 snprintf (obuf, sizeof(obuf)-1, "%d", (*i)->n_outputs);
237 clist.insert_row (row, rowdata);
238 clist.rows().back().set_data (*i);
241 clist.set_sort_column (0);
247 PluginSelector::output_refiller (Gtk::CList &clist)
249 const gchar *rowdata[2];
251 list<PluginInfo*>::iterator i;
253 // Insert into GTK list
255 for (row = 0, i = added_plugins.begin(); i != added_plugins.end(); ++i, ++row){
256 rowdata[0] = (*i)->name.c_str();
257 clist.insert_row (row, rowdata);
258 clist.rows().back().set_data (*i);
263 PluginSelector::i_plugin_chosen (Gtkmm2ext::Selector *selector,
264 Gtkmm2ext::SelectionResult *res)
267 // get text for name column (0)
268 i_selected_plug = static_cast<PluginInfo*> (selector->clist().row(res->row).get_data());
269 //i_selected_plug = *res->text;
276 PluginSelector::i_plugin_selected (Gtkmm2ext::Selector *selector,
277 Gtkmm2ext::SelectionResult *res)
280 added_plugins.push_back (static_cast<PluginInfo*> (selector->clist().row(res->row).get_data()));
281 //added_plugins.push_back(*(res->text));
287 PluginSelector::o_plugin_chosen (Gtkmm2ext::Selector *selector,
288 Gtkmm2ext::SelectionResult *res)
290 if (res && res->text) {
291 o_selected_plug = res->row;
293 o_selected_plug = -1;
299 PluginSelector::o_plugin_selected (Gtkmm2ext::Selector *selector,
300 Gtkmm2ext::SelectionResult *res)
302 if(res && res->text){
304 list<PluginInfo*>::iterator i = added_plugins.begin();
305 while (row < res->row){
309 added_plugins.erase(i);
311 o_selected_plug = -1;
316 PluginSelector::use_plugin (PluginInfo* pi)
318 list<PluginInfo *>::iterator i;
320 if (pi == 0 || session == 0) {
324 Plugin *plugin = manager->load (*session, pi);
327 PluginCreated (plugin);
332 PluginSelector::btn_add_clicked()
334 if (i_selected_plug) {
335 added_plugins.push_back (i_selected_plug);
341 PluginSelector::btn_remove_clicked()
343 if (o_selected_plug > -1){
345 list<PluginInfo*>::iterator i = added_plugins.begin();
346 while(row < o_selected_plug){
350 added_plugins.erase(i);
352 o_selected_plug = -1;
356 // Adds a plugin, and closes the window.
358 PluginSelector::btn_ok_clicked()
360 using namespace Gtk::CList_Helpers;
362 list<PluginInfo*>::iterator i;
364 for (i = added_plugins.begin(); i != added_plugins.end(); ++i){
369 added_plugins.clear();
372 o_selected_plug = -1;
374 SelectionList s_list = ladspa_display.clist().selection();
375 SelectionList::iterator s = s_list.begin();
376 if (s != s_list.end()) {
381 SelectionList v_list = vst_display.clist().selection();
382 SelectionList::iterator v = v_list.begin();
383 if (v != v_list.end()) {
390 PluginSelector::btn_cancel_clicked()
393 added_plugins.clear();
396 o_selected_plug = -1;
400 PluginSelector::btn_update_clicked()
403 ladspa_display.rescan ();
407 PluginSelector::wm_close(GdkEventAny* ev)
409 btn_cancel_clicked();
414 PluginSelector::column_clicked (int column, GtkCList* clist)
416 gtk_clist_set_sort_column (clist, column);
417 gtk_clist_sort (clist);