d38e2213d7
git-svn-id: svn://localhost/trunk/ardour2@29 d708f5d6-7413-0410-9779-e7cbd77b26cf
419 lines
10 KiB
C++
419 lines
10 KiB
C++
/*
|
|
Copyright (C) 2000 Paul Davis
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
*/
|
|
|
|
#include <cstdio>
|
|
#include <lrdf.h>
|
|
|
|
#include <gtkmm/table.h>
|
|
#include <gtkmm/button.h>
|
|
#include <gtkmm/notebook.h>
|
|
#include <gtkmm/ctree.h>
|
|
|
|
#include <ardour/plugin_manager.h>
|
|
#include <ardour/plugin.h>
|
|
#include <ardour/configuration.h>
|
|
|
|
#include "ardour_ui.h"
|
|
#include "plugin_selector.h"
|
|
#include "gui_thread.h"
|
|
|
|
#include "i18n.h"
|
|
|
|
using namespace ARDOUR;
|
|
|
|
static const gchar *i_titles[] = {
|
|
N_("Available LADSPA plugins"),
|
|
N_("Type"),
|
|
N_("# Inputs"),
|
|
N_("# Outputs"),
|
|
0
|
|
};
|
|
|
|
#ifdef VST_SUPPORT
|
|
static const gchar *vst_titles[] = {
|
|
N_("Available VST plugins"),
|
|
N_("# Inputs"),
|
|
N_("# Outputs"),
|
|
0
|
|
};
|
|
#endif
|
|
|
|
static const gchar *o_titles[] = {
|
|
N_("To be added"),
|
|
0
|
|
};
|
|
|
|
PluginSelector::PluginSelector (PluginManager *mgr)
|
|
: ArdourDialog ("plugin selector"),
|
|
ladspa_display (_input_refiller, this, internationalize (i_titles), false, true),
|
|
#ifdef VST_SUPPORT
|
|
vst_display (_vst_refiller, this, internationalize (vst_titles), false, true),
|
|
#endif
|
|
o_selector (_output_refiller, this, internationalize (o_titles), false, true)
|
|
{
|
|
set_position (Gtk::WIN_POS_MOUSE);
|
|
set_name ("PluginSelectorWindow");
|
|
set_title (_("ardour: plugins"));
|
|
set_modal(true);
|
|
add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
|
|
|
|
manager = mgr;
|
|
session = 0;
|
|
o_selected_plug = -1;
|
|
i_selected_plug = 0;
|
|
|
|
Gtk::Button *btn_add = manage(new Gtk::Button(_("Add")));
|
|
ARDOUR_UI::instance()->tooltips().set_tip(*btn_add, _("Add a plugin to the effect list"));
|
|
Gtk::Button *btn_remove = manage(new Gtk::Button(_("Remove")));
|
|
ARDOUR_UI::instance()->tooltips().set_tip(*btn_remove, _("Remove a plugin from the effect list"));
|
|
Gtk::Button *btn_ok = manage(new Gtk::Button(_("OK")));
|
|
Gtk::Button *btn_cancel = manage(new Gtk::Button(_("Cancel")));
|
|
|
|
Gtk::Button *btn_update = manage(new Gtk::Button(_("Update")));
|
|
ARDOUR_UI::instance()->tooltips().set_tip(*btn_update, _("Update available plugins"));
|
|
|
|
btn_ok->set_name("PluginSelectorButton");
|
|
btn_cancel->set_name("PluginSelectorButton");
|
|
btn_add->set_name("PluginSelectorButton");
|
|
btn_remove->set_name("PluginSelectorButton");
|
|
|
|
Gtk::Table* table = manage(new Gtk::Table(7, 10));
|
|
table->set_size_request(750, 500);
|
|
table->attach(notebook, 0, 7, 0, 5);
|
|
|
|
table->attach(*btn_add, 1, 2, 5, 6, Gtk::FILL, 0, 5, 5);
|
|
table->attach(*btn_remove, 3, 4, 5, 6, Gtk::FILL, 0, 5, 5);
|
|
table->attach(*btn_update, 5, 6, 5, 6, Gtk::FILL, 0, 5, 5);
|
|
|
|
table->attach(o_selector, 0, 7, 7, 9);
|
|
table->attach(*btn_ok, 1, 3, 9, 10, Gtk::FILL, 0, 5, 5);
|
|
table->attach(*btn_cancel, 3, 4, 9, 10, Gtk::FILL, 0, 5, 5);
|
|
add (*table);
|
|
|
|
using namespace Gtk::Notebook_Helpers;
|
|
notebook.pages().push_back (TabElem (ladspa_display, _("LADSPA")));
|
|
#ifdef VST_SUPPORT
|
|
if (Config->get_use_vst()) {
|
|
notebook.pages().push_back (TabElem (vst_display, _("VST")));
|
|
}
|
|
#endif
|
|
|
|
table->set_name("PluginSelectorTable");
|
|
//ladspa_display.set_name("PluginSelectorDisplay");
|
|
ladspa_display.clist().set_name("PluginSelectorList");
|
|
o_selector.clist().set_name("PluginSelectorList");
|
|
|
|
ladspa_display.clist().column_titles_active();
|
|
ladspa_display.clist().column(0).set_auto_resize (false);
|
|
ladspa_display.clist().column(0).set_width(470);
|
|
|
|
ladspa_display.clist().column(1).set_auto_resize (true);
|
|
o_selector.clist().column(0).set_auto_resize (true);
|
|
|
|
ladspa_display.selection_made.connect (mem_fun(*this, &PluginSelector::i_plugin_selected));
|
|
ladspa_display.choice_made.connect(mem_fun(*this, &PluginSelector::i_plugin_chosen));
|
|
ladspa_display.clist().click_column.connect(bind (mem_fun(*this, &PluginSelector::column_clicked), ladspa_display.clist().gobj()));
|
|
#ifdef VST_SUPPORT
|
|
if (Config->get_use_vst()) {
|
|
vst_display.selection_made.connect (mem_fun(*this, &PluginSelector::i_plugin_selected));
|
|
vst_display.choice_made.connect(mem_fun(*this, &PluginSelector::i_plugin_chosen));
|
|
vst_display.clist().click_column.connect(bind (mem_fun(*this, &PluginSelector::column_clicked), vst_display.clist().gobj()));
|
|
}
|
|
#endif
|
|
o_selector.selection_made.connect(mem_fun(*this, &PluginSelector::o_plugin_selected));
|
|
o_selector.choice_made.connect(mem_fun(*this,&PluginSelector::o_plugin_chosen));
|
|
btn_update-.signal_clicked().connect (mem_fun(*this, &PluginSelector::btn_update_clicked));
|
|
btn_add->clicked.connect(mem_fun(*this, &PluginSelector::btn_add_clicked));
|
|
btn_remove->clicked.connect(mem_fun(*this, &PluginSelector::btn_remove_clicked));
|
|
btn_ok->clicked.connect(mem_fun(*this, &PluginSelector::btn_ok_clicked));
|
|
btn_cancel->clicked.connect(mem_fun(*this,&PluginSelector::btn_cancel_clicked));
|
|
delete_event.connect (mem_fun(*this, &PluginSelector::wm_close));
|
|
|
|
}
|
|
|
|
void
|
|
PluginSelector::set_session (Session* s)
|
|
{
|
|
ENSURE_GUI_THREAD(bind (mem_fun(*this, &PluginSelector::set_session), s));
|
|
|
|
session = s;
|
|
|
|
if (session) {
|
|
session->going_away.connect (bind (mem_fun(*this, &PluginSelector::set_session), static_cast<Session*> (0)));
|
|
}
|
|
}
|
|
|
|
void
|
|
PluginSelector::_input_refiller (Gtk::CList &list, void *arg)
|
|
{
|
|
((PluginSelector *) arg)->input_refiller (list);
|
|
}
|
|
|
|
void
|
|
PluginSelector::_output_refiller (Gtk::CList &list, void *arg)
|
|
{
|
|
((PluginSelector *) arg)->output_refiller (list);
|
|
}
|
|
|
|
int compare(const void *left, const void *right)
|
|
{
|
|
return strcmp(*((char**)left), *((char**)right));
|
|
}
|
|
|
|
void
|
|
PluginSelector::input_refiller (Gtk::CList &clist)
|
|
{
|
|
const gchar *rowdata[4];
|
|
guint row;
|
|
list<PluginInfo *> &plugs = manager->ladspa_plugin_info ();
|
|
list<PluginInfo *>::iterator i;
|
|
char ibuf[16], obuf[16];
|
|
|
|
// Insert into GTK list
|
|
for (row = 0, i=plugs.begin(); i != plugs.end(); ++i, ++row) {
|
|
rowdata[0] = (*i)->name.c_str();
|
|
rowdata[1] = (*i)->category.c_str();
|
|
|
|
snprintf (ibuf, sizeof(ibuf)-1, "%d", (*i)->n_inputs);
|
|
snprintf (obuf, sizeof(obuf)-1, "%d", (*i)->n_outputs);
|
|
rowdata[2] = ibuf;
|
|
rowdata[3] = obuf;
|
|
|
|
clist.insert_row (row, rowdata);
|
|
clist.rows().back().set_data (*i);
|
|
}
|
|
|
|
clist.set_sort_column (0);
|
|
clist.sort ();
|
|
}
|
|
|
|
#ifdef VST_SUPPORT
|
|
|
|
void
|
|
PluginSelector::_vst_refiller (Gtk::CList &list, void *arg)
|
|
{
|
|
((PluginSelector *) arg)->vst_refiller (list);
|
|
}
|
|
|
|
void
|
|
PluginSelector::vst_refiller (Gtk::CList &clist)
|
|
{
|
|
const gchar *rowdata[3];
|
|
guint row;
|
|
list<PluginInfo *> &plugs = manager->vst_plugin_info ();
|
|
list<PluginInfo *>::iterator i;
|
|
char ibuf[16], obuf[16];
|
|
|
|
if (!Config->get_use_vst()) {
|
|
return;
|
|
}
|
|
|
|
// Insert into GTK list
|
|
|
|
for (row = 0, i = plugs.begin(); i != plugs.end(); ++i, ++row) {
|
|
rowdata[0] = (*i)->name.c_str();
|
|
|
|
snprintf (ibuf, sizeof(ibuf)-1, "%d", (*i)->n_inputs);
|
|
snprintf (obuf, sizeof(obuf)-1, "%d", (*i)->n_outputs);
|
|
rowdata[1] = ibuf;
|
|
rowdata[2] = obuf;
|
|
|
|
clist.insert_row (row, rowdata);
|
|
clist.rows().back().set_data (*i);
|
|
}
|
|
|
|
clist.set_sort_column (0);
|
|
clist.sort ();
|
|
}
|
|
#endif
|
|
|
|
void
|
|
PluginSelector::output_refiller (Gtk::CList &clist)
|
|
{
|
|
const gchar *rowdata[2];
|
|
guint row;
|
|
list<PluginInfo*>::iterator i;
|
|
|
|
// Insert into GTK list
|
|
|
|
for (row = 0, i = added_plugins.begin(); i != added_plugins.end(); ++i, ++row){
|
|
rowdata[0] = (*i)->name.c_str();
|
|
clist.insert_row (row, rowdata);
|
|
clist.rows().back().set_data (*i);
|
|
}
|
|
}
|
|
|
|
void
|
|
PluginSelector::i_plugin_chosen (Gtkmm2ext::Selector *selector,
|
|
Gtkmm2ext::SelectionResult *res)
|
|
{
|
|
if (res) {
|
|
// get text for name column (0)
|
|
i_selected_plug = static_cast<PluginInfo*> (selector->clist().row(res->row).get_data());
|
|
//i_selected_plug = *res->text;
|
|
} else {
|
|
i_selected_plug = 0;
|
|
}
|
|
}
|
|
|
|
void
|
|
PluginSelector::i_plugin_selected (Gtkmm2ext::Selector *selector,
|
|
Gtkmm2ext::SelectionResult *res)
|
|
{
|
|
if (res) {
|
|
added_plugins.push_back (static_cast<PluginInfo*> (selector->clist().row(res->row).get_data()));
|
|
//added_plugins.push_back(*(res->text));
|
|
o_selector.rescan();
|
|
}
|
|
}
|
|
|
|
void
|
|
PluginSelector::o_plugin_chosen (Gtkmm2ext::Selector *selector,
|
|
Gtkmm2ext::SelectionResult *res)
|
|
{
|
|
if (res && res->text) {
|
|
o_selected_plug = res->row;
|
|
} else {
|
|
o_selected_plug = -1;
|
|
}
|
|
|
|
}
|
|
|
|
void
|
|
PluginSelector::o_plugin_selected (Gtkmm2ext::Selector *selector,
|
|
Gtkmm2ext::SelectionResult *res)
|
|
{
|
|
if(res && res->text){
|
|
gint row = 0;
|
|
list<PluginInfo*>::iterator i = added_plugins.begin();
|
|
while (row < res->row){
|
|
i++;
|
|
row++;
|
|
}
|
|
added_plugins.erase(i);
|
|
o_selector.rescan();
|
|
o_selected_plug = -1;
|
|
}
|
|
}
|
|
|
|
void
|
|
PluginSelector::use_plugin (PluginInfo* pi)
|
|
{
|
|
list<PluginInfo *>::iterator i;
|
|
|
|
if (pi == 0 || session == 0) {
|
|
return;
|
|
}
|
|
|
|
Plugin *plugin = manager->load (*session, pi);
|
|
|
|
if (plugin) {
|
|
PluginCreated (plugin);
|
|
}
|
|
}
|
|
|
|
void
|
|
PluginSelector::btn_add_clicked()
|
|
{
|
|
if (i_selected_plug) {
|
|
added_plugins.push_back (i_selected_plug);
|
|
o_selector.rescan();
|
|
}
|
|
}
|
|
|
|
void
|
|
PluginSelector::btn_remove_clicked()
|
|
{
|
|
if (o_selected_plug > -1){
|
|
gint row = 0;
|
|
list<PluginInfo*>::iterator i = added_plugins.begin();
|
|
while(row < o_selected_plug){
|
|
i++;
|
|
row++;
|
|
}
|
|
added_plugins.erase(i);
|
|
o_selector.rescan();
|
|
o_selected_plug = -1;
|
|
}
|
|
}
|
|
|
|
// Adds a plugin, and closes the window.
|
|
void
|
|
PluginSelector::btn_ok_clicked()
|
|
{
|
|
using namespace Gtk::CList_Helpers;
|
|
|
|
list<PluginInfo*>::iterator i;
|
|
|
|
for (i = added_plugins.begin(); i != added_plugins.end(); ++i){
|
|
use_plugin (*i);
|
|
}
|
|
|
|
hide();
|
|
added_plugins.clear();
|
|
o_selector.rescan();
|
|
i_selected_plug = 0;
|
|
o_selected_plug = -1;
|
|
|
|
SelectionList s_list = ladspa_display.clist().selection();
|
|
SelectionList::iterator s = s_list.begin();
|
|
if (s != s_list.end()) {
|
|
(*s).unselect();
|
|
}
|
|
|
|
#ifdef VST_SUPPORT
|
|
SelectionList v_list = vst_display.clist().selection();
|
|
SelectionList::iterator v = v_list.begin();
|
|
if (v != v_list.end()) {
|
|
(*v).unselect();
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void
|
|
PluginSelector::btn_cancel_clicked()
|
|
{
|
|
hide();
|
|
added_plugins.clear();
|
|
o_selector.rescan();
|
|
i_selected_plug = 0;
|
|
o_selected_plug = -1;
|
|
}
|
|
|
|
void
|
|
PluginSelector::btn_update_clicked()
|
|
{
|
|
manager->refresh ();
|
|
ladspa_display.rescan ();
|
|
}
|
|
|
|
gint
|
|
PluginSelector::wm_close(GdkEventAny* ev)
|
|
{
|
|
btn_cancel_clicked();
|
|
return TRUE;
|
|
}
|
|
|
|
void
|
|
PluginSelector::column_clicked (int column, GtkCList* clist)
|
|
{
|
|
gtk_clist_set_sort_column (clist, column);
|
|
gtk_clist_sort (clist);
|
|
}
|