ardour/gtk2_ardour/plugin_selector.cc

419 lines
11 KiB
C++
Raw Normal View History

/*
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, Gtk::FILL, 5, 5);
table->attach(*btn_remove, 3, 4, 5, 6, Gtk::FILL, Gtk::FILL, 5, 5);
table->attach(*btn_update, 5, 6, 5, 6, Gtk::FILL, Gtk::FILL, 5, 5);
table->attach(o_selector, 0, 7, 7, 9);
table->attach(*btn_ok, 1, 3, 9, 10, Gtk::FILL, Gtk::FILL, 5, 5);
table->attach(*btn_cancel, 3, 4, 9, 10, Gtk::FILL, Gtk::FILL, 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->signal_clicked().connect(mem_fun(*this, &PluginSelector::btn_remove_clicked));
btn_ok->signal_clicked().connect(mem_fun(*this, &PluginSelector::btn_ok_clicked));
btn_cancel->signal_clicked().connect(mem_fun(*this,&PluginSelector::btn_cancel_clicked));
signal_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);
}