Blame qlo10k1/src/connectionwizard.cpp

Packit 427e91
/*
Packit 427e91
 *  qlo10k1 - GUI frontend for ld10k1
Packit 427e91
 *
Packit 427e91
 *  Copyright (c) 2004 by Peter Zubaj
Packit 427e91
 *
Packit 427e91
 *   This program is free software; you can redistribute it and/or modify
Packit 427e91
 *   it under the terms of the GNU General Public License as published by
Packit 427e91
 *   the Free Software Foundation; either version 2 of the License, or
Packit 427e91
 *   (at your option) any later version.
Packit 427e91
 *
Packit 427e91
 *   This program is distributed in the hope that it will be useful,
Packit 427e91
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 427e91
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 427e91
 *   GNU General Public License for more details.
Packit 427e91
 *
Packit 427e91
 *   You should have received a copy of the GNU General Public License
Packit 427e91
 *   along with this program; if not, write to the Free Software
Packit 427e91
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Packit 427e91
 *
Packit 427e91
 */
Packit 427e91
 
Packit 427e91
#include <qradiobutton.h>
Packit 427e91
#include <qpushbutton.h>
Packit 427e91
#include <qcheckbox.h>
Packit 427e91
#include <qlistbox.h>
Packit 427e91
Packit 427e91
#include "structure_patch.h"
Packit 427e91
#include "structure_io.h"
Packit 427e91
#include "connectionwizard.h"
Packit 427e91
Packit 427e91
ConnectionWizard::ConnectionWizard(bool o, StrGlobal *g, RouteInfo *r)
Packit 427e91
	: ConnectionWizardBase()
Packit 427e91
{
Packit 427e91
	out = o;
Packit 427e91
	global = g;
Packit 427e91
	route = *r;
Packit 427e91
	rptr = r;
Packit 427e91
	
Packit 427e91
	rtype = None;
Packit 427e91
	pto = NULL;
Packit 427e91
	
Packit 427e91
	RSItemIO *io = r->getToIO();
Packit 427e91
	
Packit 427e91
	if (io)
Packit 427e91
	{
Packit 427e91
		RSItemBaseWithType *owner = (RSItemBaseWithType *)io->getOwner();
Packit 427e91
		switch (owner->type())
Packit 427e91
		{
Packit 427e91
			case RSItemBaseWithType::In:
Packit 427e91
				rtype = In;
Packit 427e91
				break;
Packit 427e91
			case RSItemBaseWithType::Out:
Packit 427e91
				rtype = Out;
Packit 427e91
				break;
Packit 427e91
			case RSItemBaseWithType::FX:
Packit 427e91
				rtype = FX;
Packit 427e91
				break;
Packit 427e91
			case RSItemBaseWithType::Patch:
Packit 427e91
				if (io->isOutput())
Packit 427e91
					rtype = POut;
Packit 427e91
				else
Packit 427e91
					rtype = PIn;
Packit 427e91
				pto = (StrPatch *)owner;
Packit 427e91
				break;
Packit 427e91
			default:
Packit 427e91
				break;
Packit 427e91
		}
Packit 427e91
	}
Packit 427e91
Packit 427e91
	if (!out)
Packit 427e91
	{
Packit 427e91
		rbOutput->hide();
Packit 427e91
	}
Packit 427e91
	else
Packit 427e91
	{
Packit 427e91
		rbFX->hide();
Packit 427e91
		rbInput->hide();
Packit 427e91
	}
Packit 427e91
	
Packit 427e91
	StrPatch *patch;
Packit 427e91
	
Packit 427e91
	lbPatch->clear();
Packit 427e91
	for(patch = global->Patches.first(); patch; patch = global->Patches.next() )
Packit 427e91
	{
Packit 427e91
		lbPatch->insertItem(patch->name());
Packit 427e91
		patchList.append(patch);
Packit 427e91
	}
Packit 427e91
	
Packit 427e91
	connect(rbNone, SIGNAL(clicked()), this, SLOT(noneClicked()));
Packit 427e91
	connect(rbFX, SIGNAL(clicked()), this, SLOT(fxClicked()));
Packit 427e91
	connect(rbInput, SIGNAL(clicked()), this, SLOT(inClicked()));
Packit 427e91
	connect(rbOutput, SIGNAL(clicked()), this, SLOT(outClicked()));
Packit 427e91
	connect(rbPatch, SIGNAL(clicked()), this, SLOT(patchClicked()));
Packit 427e91
	
Packit 427e91
	connect(lbPatch, SIGNAL(clicked(QListBoxItem *)), this, SLOT(patchListClicked(QListBoxItem *)));
Packit 427e91
	connect(lbEnd, SIGNAL(clicked(QListBoxItem *)), this, SLOT(endListClicked(QListBoxItem *)));
Packit 427e91
	
Packit 427e91
	connect(finishButton(), SIGNAL(clicked()), this, SLOT(finishClicked()));
Packit 427e91
	
Packit 427e91
	connect(this, SIGNAL(selected(const QString &)), this, SLOT(selected(const QString &)));
Packit 427e91
	helpButton()->hide();
Packit 427e91
	
Packit 427e91
	setFinishEnabled(pageType, true);
Packit 427e91
	setNextEnabled(pageType, true);
Packit 427e91
	setFinishEnabled(pagePatch, true);
Packit 427e91
	setNextEnabled(pagePatch, true);
Packit 427e91
	setFinishEnabled(pageEnd, true);
Packit 427e91
	setNextEnabled(pageEnd, true);
Packit 427e91
}
Packit 427e91
Packit 427e91
void ConnectionWizard::setState(bool patch, bool end, bool back, bool next, bool finish)
Packit 427e91
{
Packit 427e91
	setAppropriate(pagePatch, patch ? true : false);
Packit 427e91
	setAppropriate(pageEnd, end ? true : false);
Packit 427e91
	
Packit 427e91
	backButton()->setEnabled(back ? true : false);
Packit 427e91
	nextButton()->setEnabled(next ? true : false);
Packit 427e91
	finishButton()->setEnabled(finish ? true : false);
Packit 427e91
}
Packit 427e91
Packit 427e91
void ConnectionWizard::loadEnd(IOType iotype)
Packit 427e91
{
Packit 427e91
	lbEnd->clear();
Packit 427e91
	ios.clear();
Packit 427e91
	
Packit 427e91
	if (iotype == In)
Packit 427e91
	{
Packit 427e91
		for (int i = 0; i < (int)global->Inputs.count(); i++)
Packit 427e91
		{
Packit 427e91
			StrInput *io = global->Inputs.at(i);
Packit 427e91
			ios.append(io->getIO(false, 0));
Packit 427e91
			lbEnd->insertItem(io->name());
Packit 427e91
		}
Packit 427e91
	}
Packit 427e91
	else if (iotype == Out)
Packit 427e91
	{
Packit 427e91
		for (int i = 0; i < (int)global->Outputs.count(); i++)
Packit 427e91
		{
Packit 427e91
			StrOutput *io = global->Outputs.at(i);
Packit 427e91
			ios.append(io->getIO(true, 0));
Packit 427e91
			lbEnd->insertItem(io->name());
Packit 427e91
		}
Packit 427e91
	}
Packit 427e91
	else if (iotype == FX)
Packit 427e91
	{
Packit 427e91
		for (int i = 0; i < (int)global->FXs.count(); i++)
Packit 427e91
		{
Packit 427e91
			StrFX *io = global->FXs.at(i);
Packit 427e91
			ios.append(io->getIO(false, 0));
Packit 427e91
			lbEnd->insertItem(io->name());
Packit 427e91
		}
Packit 427e91
	}
Packit 427e91
}
Packit 427e91
Packit 427e91
void ConnectionWizard::noneClicked()
Packit 427e91
{
Packit 427e91
	setState(false, false, false, false, true);
Packit 427e91
	if (rtype != ConnectionWizard::None)
Packit 427e91
	{
Packit 427e91
		rtype = ConnectionWizard::None;
Packit 427e91
		pto = NULL;
Packit 427e91
	}
Packit 427e91
}
Packit 427e91
Packit 427e91
Packit 427e91
void ConnectionWizard::fxClicked()
Packit 427e91
{
Packit 427e91
	setState(false, true, false, true, false);
Packit 427e91
	if (rtype != ConnectionWizard::FX)
Packit 427e91
	{
Packit 427e91
		rtype = ConnectionWizard::FX;
Packit 427e91
		pto = NULL;
Packit 427e91
	}
Packit 427e91
}
Packit 427e91
Packit 427e91
void ConnectionWizard::inClicked()
Packit 427e91
{
Packit 427e91
	setState(false, true, false, true, false);
Packit 427e91
	if (rtype != ConnectionWizard::In)
Packit 427e91
	{
Packit 427e91
		rtype = ConnectionWizard::In;
Packit 427e91
		pto = NULL;
Packit 427e91
	}
Packit 427e91
}
Packit 427e91
Packit 427e91
void ConnectionWizard::outClicked()
Packit 427e91
{
Packit 427e91
	setState(false, true, false, true, false);
Packit 427e91
	if (rtype != ConnectionWizard::Out) 
Packit 427e91
	{
Packit 427e91
		rtype = ConnectionWizard::Out;
Packit 427e91
		pto = NULL;
Packit 427e91
	}
Packit 427e91
}
Packit 427e91
Packit 427e91
void ConnectionWizard::patchClicked()
Packit 427e91
{
Packit 427e91
	setState(true, true, false, true, false);
Packit 427e91
	if (rtype != ConnectionWizard::PIn && rtype != ConnectionWizard::POut)
Packit 427e91
	{
Packit 427e91
		if (out)
Packit 427e91
			rtype = ConnectionWizard::PIn;
Packit 427e91
		else
Packit 427e91
			rtype = ConnectionWizard::POut;
Packit 427e91
		pto = NULL;
Packit 427e91
	}
Packit 427e91
}
Packit 427e91
Packit 427e91
void ConnectionWizard::selected(const QString &page)
Packit 427e91
{
Packit 427e91
	if (page == "Connection target")
Packit 427e91
	{
Packit 427e91
		switch (rtype)
Packit 427e91
		{
Packit 427e91
			case None:
Packit 427e91
				rbNone->setChecked(true);
Packit 427e91
				setState(false, false, false, false, true);
Packit 427e91
				break;
Packit 427e91
			case FX:
Packit 427e91
				rbFX->setChecked(true);
Packit 427e91
				setState(false, true, false, true, false);
Packit 427e91
				break;
Packit 427e91
			case In:
Packit 427e91
				rbInput->setChecked(true);
Packit 427e91
				setState(false, true, false, true, false);
Packit 427e91
				break;
Packit 427e91
			case Out:
Packit 427e91
				rbOutput->setChecked(true);
Packit 427e91
				setState(false, true, false, true, false);
Packit 427e91
				break;
Packit 427e91
			case PIn:
Packit 427e91
			case POut:
Packit 427e91
				rbPatch->setChecked(true);
Packit 427e91
				setState(true, true, false, true, false);
Packit 427e91
				break;
Packit 427e91
		}
Packit 427e91
	}
Packit 427e91
	else if (page == "Patch")
Packit 427e91
	{
Packit 427e91
		finishButton()->setEnabled(false);
Packit 427e91
		if (pto)
Packit 427e91
		{
Packit 427e91
			// find patch
Packit 427e91
			lbPatch->setCurrentItem(patchList.find(pto));
Packit 427e91
			nextButton()->setEnabled(true);
Packit 427e91
		}
Packit 427e91
		else
Packit 427e91
		{
Packit 427e91
			QListBoxItem *si = lbPatch->selectedItem();
Packit 427e91
			if (si)
Packit 427e91
				lbPatch->setSelected(si, false);
Packit 427e91
			lbPatch->setCurrentItem(-1);
Packit 427e91
			nextButton()->setEnabled(false);
Packit 427e91
		}
Packit 427e91
Packit 427e91
		cbMulti->setChecked(route.getMulti());
Packit 427e91
		cbSimple->setChecked(route.getSimple());
Packit 427e91
	}
Packit 427e91
	else if (page == "End")
Packit 427e91
	{
Packit 427e91
		nextButton()->setEnabled(false);
Packit 427e91
		switch (rtype)
Packit 427e91
		{
Packit 427e91
			case None:
Packit 427e91
				break;
Packit 427e91
			case FX:
Packit 427e91
			case In:
Packit 427e91
			case Out:
Packit 427e91
				loadEnd(rtype);
Packit 427e91
				break;
Packit 427e91
			case PIn:
Packit 427e91
			case POut:
Packit 427e91
				// load patch in or out
Packit 427e91
				ios.clear();
Packit 427e91
				lbEnd->clear();
Packit 427e91
Packit 427e91
				for (int i = 0; i < (int)pto->getMaxIOIdx(out); i++)
Packit 427e91
				{
Packit 427e91
					RSItemIO *io = pto->getIO(out, i);
Packit 427e91
					if (io)
Packit 427e91
					{
Packit 427e91
						ios.append(io);
Packit 427e91
						lbEnd->insertItem(io->getDesc());
Packit 427e91
					}
Packit 427e91
				}
Packit 427e91
				
Packit 427e91
				route.setMulti(cbMulti->isChecked());
Packit 427e91
				route.setSimple(cbSimple->isChecked());
Packit 427e91
				break;
Packit 427e91
		}
Packit 427e91
Packit 427e91
		if (route.getToIO())
Packit 427e91
		{
Packit 427e91
			lbEnd->setCurrentItem(ios.find(route.getToIO()));
Packit 427e91
			finishButton()->setEnabled(true);
Packit 427e91
		}
Packit 427e91
		else
Packit 427e91
		{
Packit 427e91
			QListBoxItem *si = lbEnd->selectedItem();
Packit 427e91
			if (si)
Packit 427e91
				lbEnd->setSelected(si, false);
Packit 427e91
			lbEnd->setCurrentItem(-1);
Packit 427e91
			finishButton()->setEnabled(false);
Packit 427e91
		}
Packit 427e91
	}
Packit 427e91
}
Packit 427e91
Packit 427e91
void ConnectionWizard::patchListClicked(QListBoxItem *item)
Packit 427e91
{
Packit 427e91
	pto = patchList.at(lbPatch->index(item));
Packit 427e91
	route.setToIO(NULL);
Packit 427e91
	nextButton()->setEnabled(true);
Packit 427e91
}
Packit 427e91
Packit 427e91
void ConnectionWizard::endListClicked(QListBoxItem *item)
Packit 427e91
{
Packit 427e91
	route.setToIO(ios.at(lbEnd->index(item)));
Packit 427e91
	finishButton()->setEnabled(true);
Packit 427e91
}
Packit 427e91
Packit 427e91
void ConnectionWizard::finishClicked()
Packit 427e91
{
Packit 427e91
	*rptr = route;
Packit 427e91
}