diff options
Diffstat (limited to 'arts/tools/midimanagerview.cpp')
-rw-r--r-- | arts/tools/midimanagerview.cpp | 260 |
1 files changed, 260 insertions, 0 deletions
diff --git a/arts/tools/midimanagerview.cpp b/arts/tools/midimanagerview.cpp new file mode 100644 index 00000000..764f4ee5 --- /dev/null +++ b/arts/tools/midimanagerview.cpp @@ -0,0 +1,260 @@ +/* + + Copyright (C) 2000 Stefan Westerfeld + stefan@space.twc.de + + 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + Permission is also granted to link this program with the Qt + library, treating Qt like a library that normally accompanies the + operating system kernel, whether or not that is in fact the case. + + */ + +#include "midimanagerview.h" +#define protected public +#include "midimanagerwidget.h" +#undef protected +#include <qpushbutton.h> +#include <qlistbox.h> +#include <qlayout.h> +#include <qpainter.h> +#include <stdio.h> +#include <kaction.h> +#include <klocale.h> +#include <kiconloader.h> +#include <soundserver.h> +#include "artsmidi.h" +#include "artsmodules.h" +#include "midiportdlg.h" +#include "midiinstdlg.h" + +#include <kstdaction.h> + +using namespace Arts; +using namespace std; + +/* quick hack as long as the sound server doesn't support environments */ +Arts::Environment::Container defaultEnvironment() +{ + Arts::SimpleSoundServer server = Reference("global:Arts_SimpleSoundServer"); + Arts::Environment::Container d = + Arts::DynamicCast(server._getChild("defaultEnvironment")); + + if(d.isNull()) + { + d = Arts::DynamicCast( + server.createObject("Arts::Environment::Container")); + server._addChild(d,"defaultEnvironment"); + } + return d; +} + +class MidiManagerItem : public QListBoxText { +public: + MidiClientInfo info; + + MidiManagerItem(const MidiClientInfo &info) :info(info) + { + } + QString text () const { + return QString::fromUtf8(info.title.c_str()); + } + +}; + +class ConnectionWidget : public QWidget { +public: + MidiManagerView *v; + ConnectionWidget(MidiManagerView *v, QWidget *parent) : QWidget(parent), v(v) + { + } + void paintEvent(QPaintEvent * /*event*/) + { + QPainter painter; + painter.begin(this); +// painter.fillRect(event->rect(),white); + + unsigned int in; + for(in = 0; in < v->widget->inputsListBox->count(); in++) + { + vector<long>::iterator conn; + MidiManagerItem *item = (MidiManagerItem *)v->widget->inputsListBox->item(in); + for(conn = item->info.connections.begin(); + conn != item->info.connections.end(); conn++) + { + MidiManagerItem *outitem = v->itemMap[*conn]; + QRect r1 = v->widget->inputsListBox->itemRect(item); + QRect r2 = v->widget->outputsListBox->itemRect(outitem); + + if(r1.height() > 0 && r2.height() > 0) + { + painter.drawLine(0,(r1.top()+r1.bottom()) / 2, + width(), (r2.top()+r2.bottom())/2); + } + } + } + painter.end(); + } +}; + +MidiManagerView::MidiManagerView() + : manager(Reference("global:Arts_MidiManager")) +{ + QTimer *updatetimer = new QTimer(this); + updatetimer->start(5000); + connect(updatetimer,SIGNAL(timeout()),this,SLOT(updateLists())); + + widget = new MidiManagerWidget(this); + setCentralWidget(widget); + setCaption(i18n("MIDI Manager")); + setIcon( MainBarIcon( "artsfftscope", 32 ) ); + + (void)new KAction(i18n("&System MIDI Port (OSS)"), 0, this, SLOT(addOSSMidiPort()), + actionCollection(), "add_oss_midi_port"); + (void)new KAction(i18n("&aRts Synthesis MIDI Output"), 0, this, + SLOT(addArtsMidiOutput()), actionCollection(), "add_arts_midi_output"); + + (void) KStdAction::quit( this, SLOT(close()), actionCollection()); + connect(widget->connectButton,SIGNAL(clicked()), this, SLOT(slotConnect())); + connect(widget->disconnectButton,SIGNAL(clicked()), this, SLOT(slotDisconnect())); + + connectionWidget = new ConnectionWidget(this, widget->connectionFrame); + connectionWidget->setMinimumSize(60,10); + widget->connectionFrameLayout->addWidget( connectionWidget, 0, 0 ); + + updateLists(); + createGUI( "artsmidimanagerview.rc"); + show(); + setCaption(i18n("MIDI Manager")); + setIcon( MainBarIcon( "artsfftscope", 32 ) ); +} + +void MidiManagerView::closeEvent(QCloseEvent *e) +{ + e->accept(); + emit closed(); +} + +void MidiManagerView::updateLists() +{ + vector<MidiClientInfo> *clients = manager.clients(); + vector<MidiClientInfo>::iterator i; + +// keep selection over updating + MidiManagerItem *src = + (MidiManagerItem *)widget->inputsListBox->item(widget->inputsListBox->currentItem()); + MidiManagerItem *dest = + (MidiManagerItem *)widget->outputsListBox->item(widget->outputsListBox->currentItem()); + + long srcID = src?src->info.ID:0; + long destID = dest?dest->info.ID:0; + +// clear everything, and rebuild + itemMap.clear(); + widget->inputsListBox->clear(); + widget->outputsListBox->clear(); + for(i = clients->begin(); i != clients->end(); i++) + { + QListBox *box; + if(i->direction == mcdPlay) + box = widget->inputsListBox; + else + box = widget->outputsListBox; + + MidiManagerItem *item = new MidiManagerItem(*i); + itemMap[item->info.ID] = item; + box->insertItem(item); + } + delete clients; + +// restore selection + if(srcID && itemMap[srcID]) + widget->inputsListBox->setSelected(itemMap[srcID],true); + if(destID && itemMap[destID]) + widget->outputsListBox->setSelected(itemMap[destID],true); + connectionWidget->repaint(); +} + +void MidiManagerView::slotConnect() +{ + MidiManagerItem *src = + (MidiManagerItem *)widget->inputsListBox->item(widget->inputsListBox->currentItem()); + MidiManagerItem *dest = + (MidiManagerItem *)widget->outputsListBox->item(widget->outputsListBox->currentItem()); + if(src && dest) + { + manager.connect(src->info.ID,dest->info.ID); + updateLists(); + } +} + +void MidiManagerView::slotDisconnect() +{ + MidiManagerItem *src = + (MidiManagerItem *)widget->inputsListBox->item(widget->inputsListBox->currentItem()); + MidiManagerItem *dest = + (MidiManagerItem *)widget->outputsListBox->item(widget->outputsListBox->currentItem()); + if(src && dest) + { + manager.disconnect(src->info.ID,dest->info.ID); + updateLists(); + } +} + +void MidiManagerView::addOSSMidiPort() +{ + //lukas: no i18n here, QDialog's CTOR doesn't know about QString + //lukas: can't use that with const char *, i18n()'ed in the dialog itself + MidiPortDlg *dlg = new MidiPortDlg(0,"/dev/midi","OSS Midi Port"); + + if(dlg->exec()) + { + SoundServer s = Reference("global:Arts_SoundServer"); + if(!s.isNull()) + { + RawMidiPort p = DynamicCast(s.createObject("Arts::RawMidiPort")); + p.device(dlg->device()); + if(p.open()) + p._addChild(p,"avoid_delete"); + } + } + delete dlg; +} + +void MidiManagerView::addArtsMidiOutput() +{ + MidiInstDlg *dlg = new MidiInstDlg(0); + + if(dlg->exec()) + { + SoundServer s = Reference("global:Arts_SoundServer"); + if(!s.isNull()) + { + /* + Synth_MIDI_TEST t + = DynamicCast(s.createObject("Arts::Synth_MIDI_TEST")); + t.filename(dlg->filename().data()); + t.start(); + t._addChild(t,"avoid_delete"); + */ + Environment::InstrumentItem item = DynamicCast( + defaultEnvironment().createItem("Arts::Environment::InstrumentItem")); + if(!item.isNull()) + item.filename(dlg->filename().data()); + } + } +} +#include "midimanagerview.moc" |