Blame qlo10k1/src/routingwidget_new.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 <qfiledialog.h>
Packit 427e91
#include <qmessagebox.h>
Packit 427e91
#include <qpopupmenu.h>
Packit 427e91
Packit 427e91
#include "app_global.h"
Packit 427e91
#include "routingwidget.h"
Packit 427e91
#include "structure_io.h"
Packit 427e91
#include "structure_link.h"
Packit 427e91
#include "newiodialog.h"
Packit 427e91
#include "loadpatchdialog.h"
Packit 427e91
#include "transformpatchdialog.h"
Packit 427e91
Packit 427e91
extern QString gLastFileDir;
Packit 427e91
Packit 427e91
RSItemBaseWithType *RoutingWidget::createNewIO(EditMode em)
Packit 427e91
{
Packit 427e91
	// show io dialog
Packit 427e91
	NewIODlg::DlgType t = NewIODlg::FX;
Packit 427e91
	
Packit 427e91
	switch (em)
Packit 427e91
	{
Packit 427e91
		case FX:
Packit 427e91
			t = NewIODlg::FX;
Packit 427e91
			break;
Packit 427e91
		case In:
Packit 427e91
			t = NewIODlg::In;
Packit 427e91
			break;
Packit 427e91
		case Out:
Packit 427e91
			t = NewIODlg::Out;
Packit 427e91
			break;
Packit 427e91
		default:
Packit 427e91
			break;
Packit 427e91
	}
Packit 427e91
	
Packit 427e91
	NewIODlg d(structure, t);
Packit 427e91
Packit 427e91
	int err;
Packit 427e91
	err = d.init();
Packit 427e91
	if(err < 0)
Packit 427e91
	{
Packit 427e91
		QMessageBox::critical(0, APP_NAME, QString("Error creating new IO dialog\n(ld10k1 error:%1)").arg(structure->errorStr(err)));
Packit 427e91
		return NULL;
Packit 427e91
	}
Packit 427e91
	
Packit 427e91
	if (d.exec() ==  QDialog::Accepted)
Packit 427e91
		return d.getNewIO();
Packit 427e91
	else
Packit 427e91
		return NULL;
Packit 427e91
}
Packit 427e91
Packit 427e91
RSItemBaseWithType *RoutingWidget::createNewPatch()
Packit 427e91
{
Packit 427e91
	QFileDialog *fd = new QFileDialog(this, "file dialog", TRUE);
Packit 427e91
	fd->setMode(QFileDialog::ExistingFile);
Packit 427e91
	QStringList filterlist;
Packit 427e91
	filterlist << QString( "as10k1 Patch files (*.bin *.as10k1 *.emu10k1)" );
Packit 427e91
	filterlist << QString( "ld10k1 Native effect files (*.ld10k1)" );
Packit 427e91
	filterlist << QString( "All Files (*)" );
Packit 427e91
	QString filters = filterlist.join( ";;" );
Packit 427e91
	fd->setFilters( filters );
Packit 427e91
	fd->setDir(gLastFileDir);
Packit 427e91
	
Packit 427e91
	fd->setCaption("Load patch");
Packit 427e91
Packit 427e91
	StrPatch *loaded = NULL;
Packit 427e91
	int err;
Packit 427e91
					
Packit 427e91
	QString fileName;
Packit 427e91
	if ( fd->exec() == QDialog::Accepted )
Packit 427e91
	{
Packit 427e91
        	fileName = fd->selectedFile();
Packit 427e91
		gLastFileDir = fd->dirPath();
Packit 427e91
		delete fd;
Packit 427e91
		
Packit 427e91
		LD10k1File *ldfile = NULL;
Packit 427e91
		if ((err = LD10k1File::LoadFromFile(fileName, &ldfile)) < 0) 
Packit 427e91
		{
Packit 427e91
			EMU10k1File *emufile = NULL;
Packit 427e91
			if ((err = EMU10k1File::LoadFromFile(fileName, &emufile)) < 0) 
Packit 427e91
			{
Packit 427e91
				QMessageBox::critical(0, APP_NAME, QString("Couldn't load patch\n(ld10k1 error:%1)").arg(structure->errorStr(err)));
Packit 427e91
				return NULL;
Packit 427e91
			}
Packit 427e91
			else
Packit 427e91
			{
Packit 427e91
				TransformPatchDlg d(fileName, emufile);
Packit 427e91
				if (d.exec() == QDialog::Accepted)
Packit 427e91
				{
Packit 427e91
					if ((err = d.transformFile(&ldfile)) < 0)
Packit 427e91
					{
Packit 427e91
						QMessageBox::critical(0, APP_NAME, QString("Couldn't transform patch\n(ld10k1 error:%1)").arg(structure->errorStr(err)));
Packit 427e91
						delete emufile;
Packit 427e91
						return NULL;
Packit 427e91
					}
Packit 427e91
					delete emufile;
Packit 427e91
				}
Packit 427e91
				else
Packit 427e91
				{
Packit 427e91
					delete emufile;
Packit 427e91
					return NULL;
Packit 427e91
				}
Packit 427e91
			}
Packit 427e91
		}
Packit 427e91
		
Packit 427e91
		LoadPatchDlg d(structure, fileName, ldfile);
Packit 427e91
Packit 427e91
		if (d.exec() == QDialog::Accepted)
Packit 427e91
		{
Packit 427e91
			// and now convert to loader
Packit 427e91
			StrPatch *loaded = NULL;
Packit 427e91
			if ((err = structure->load(ldfile, d.whereLoad(), &loaded)) < 0) {
Packit 427e91
				QMessageBox::critical(0, APP_NAME, QString("Couldn't load patch\n(ld10k1 error:%1)").arg(structure->errorStr(err)));
Packit 427e91
				delete ldfile;
Packit 427e91
				return NULL;
Packit 427e91
			}
Packit 427e91
			else
Packit 427e91
			{
Packit 427e91
				loaded->calcSize();
Packit 427e91
				loaded->updateContents(this->drawing, getZoomLevel());
Packit 427e91
			}
Packit 427e91
		}
Packit 427e91
		delete ldfile;		
Packit 427e91
	}
Packit 427e91
	return loaded;
Packit 427e91
}
Packit 427e91
Packit 427e91
void RoutingWidget::startLinkDrag(int xp, int yp)
Packit 427e91
{
Packit 427e91
	// find patch under - only on patch can start drag
Packit 427e91
	
Packit 427e91
	RSItemBaseWithType *item = NULL;
Packit 427e91
	
Packit 427e91
	for(item = structure->UsedItems.first(); item; item = structure->UsedItems.next())
Packit 427e91
	{
Packit 427e91
		if (item->containsPoint(xp, yp) && item->type() == RSItemBaseWithType::Patch)
Packit 427e91
		{
Packit 427e91
			// I have patch - find io
Packit 427e91
			RSItemIO *pio = ((StrPatch *)item)->getIOAtPoint(xp, yp);
Packit 427e91
			if (pio)
Packit 427e91
			{
Packit 427e91
				drawing->startLinkDrag(pio, xp, yp);
Packit 427e91
				return;
Packit 427e91
			}
Packit 427e91
		}
Packit 427e91
	}
Packit 427e91
}
Packit 427e91
Packit 427e91
void RoutingDrawWidget::connectLinkDrag(int xp, int yp, int mxp, int myp)
Packit 427e91
{
Packit 427e91
	RoutingWidget *parent = (RoutingWidget *)parentWidget();
Packit 427e91
	StrGlobal *structure = parent->getStructure();
Packit 427e91
	
Packit 427e91
	if (!structure)
Packit 427e91
		return;
Packit 427e91
		
Packit 427e91
	RSItemBaseWithType *item = NULL;
Packit 427e91
	
Packit 427e91
	for(item = structure->UsedItems.first(); item; item = structure->UsedItems.next())
Packit 427e91
	{
Packit 427e91
		if (item->containsPoint(xp, yp))
Packit 427e91
		{
Packit 427e91
			// I have patch - find io
Packit 427e91
			RSItemIO *pio = NULL;
Packit 427e91
			if (item->type() == RSItemBaseWithType::Patch)
Packit 427e91
				pio = ((StrPatch *)item)->getIOAtPoint(xp, yp);
Packit 427e91
			else if (item->type() == RSItemBaseWithType::In)
Packit 427e91
				pio = ((StrInput *)item)->getIO(true, 0);
Packit 427e91
			else if (item->type() == RSItemBaseWithType::Out)
Packit 427e91
				pio = ((StrInput *)item)->getIO(false, 0);
Packit 427e91
			else if (item->type() == RSItemBaseWithType::FX)
Packit 427e91
				pio = ((StrFX *)item)->getIO(true, 0);
Packit 427e91
			
Packit 427e91
			
Packit 427e91
			if (pio)
Packit 427e91
			{
Packit 427e91
				// check if connecting in to out or out to in
Packit 427e91
				if (pio->isOutput() != linkStart->isOutput())
Packit 427e91
				{
Packit 427e91
					if (pio->getConnectedTo() == linkStart->getConnectedTo() && pio->getConnectedTo() && linkStart->getConnectedTo())
Packit 427e91
						return;
Packit 427e91
						
Packit 427e91
					if (pio->getOwner() == linkStart->getOwner())
Packit 427e91
						return;
Packit 427e91
						
Packit 427e91
					QPopupMenu *contextMenu = new QPopupMenu();
Packit 427e91
					enum Action {Normal, SimpleMulti, Simple, Multi};
Packit 427e91
					
Packit 427e91
					contextMenu->insertItem(tr("&Normal"), Normal);
Packit 427e91
					contextMenu->insertItem(tr("&Multi"), Multi);
Packit 427e91
					if (((RSItemBaseWithType *)pio->getOwner())->type() == RSItemBaseWithType::Patch)
Packit 427e91
						contextMenu->insertItem(tr("S&imple"), Simple);
Packit 427e91
					contextMenu->insertItem(tr("&Simple + Multi"), SimpleMulti);
Packit 427e91
										
Packit 427e91
					
Packit 427e91
					int id  = contextMenu->exec(QPoint(mxp, myp));
Packit 427e91
					if (id < 0)
Packit 427e91
						return;
Packit 427e91
					
Packit 427e91
					int conn_id;
Packit 427e91
					int err;
Packit 427e91
					
Packit 427e91
					QValueList <int> actIds;
Packit 427e91
					
Packit 427e91
					actIds.clear();
Packit 427e91
					
Packit 427e91
					StrLink *linkTo = pio->getConnectedTo();
Packit 427e91
					if (linkTo && actIds.findIndex(linkTo->id()) < 0)
Packit 427e91
						actIds.append(linkTo->id());
Packit 427e91
					
Packit 427e91
					StrLink *linkFrom = linkStart->getConnectedTo();
Packit 427e91
					if (linkFrom && actIds.findIndex(linkFrom->id()) < 0)
Packit 427e91
						actIds.append(linkFrom->id());
Packit 427e91
						
Packit 427e91
					if (id == Normal && linkTo && ((RSItemBaseWithType *)pio->getOwner())->type() != RSItemBaseWithType::Patch)
Packit 427e91
					{
Packit 427e91
						if ((err = structure->deleteOneLink(linkTo)) < 0)
Packit 427e91
							QMessageBox::critical(0, APP_NAME, QString("Couldn't disconnect !\n(ld10k1 error:%1)").arg(structure->errorStr(err)));
Packit 427e91
					}
Packit 427e91
					
Packit 427e91
					if ((err = structure->conAdd(id != Simple && id != Normal,
Packit 427e91
						 id != Multi && id != Normal,
Packit 427e91
						 linkStart, pio, &conn_id)) < 0)
Packit 427e91
						 QMessageBox::critical(0, APP_NAME, QString("Couldn't connect !\n(ld10k1 error:%1)").arg(structure->errorStr(err)));
Packit 427e91
					else
Packit 427e91
					{
Packit 427e91
						if (actIds.findIndex(conn_id) < 0)
Packit 427e91
							actIds.append(conn_id);
Packit 427e91
							
Packit 427e91
						if (linkFrom)
Packit 427e91
							linkFrom->updateContents(this, parent->getZoomLevel());
Packit 427e91
						if (linkTo)
Packit 427e91
							linkTo->updateContents(this, parent->getZoomLevel());
Packit 427e91
						
Packit 427e91
						for (unsigned int i = 0; i < actIds.count(); i++)
Packit 427e91
						{
Packit 427e91
							StrLink *link = NULL;
Packit 427e91
							int aid = actIds[i];
Packit 427e91
							if ((err = structure->actualizeLink(aid, &link)) < 0 && aid == conn_id)
Packit 427e91
								QMessageBox::critical(0, APP_NAME, QString("Couldn't actualize link !\n(ld10k1 error:%1)").arg(structure->errorStr(err)));
Packit 427e91
								
Packit 427e91
							if (link)
Packit 427e91
							{
Packit 427e91
								if (!link->isValid())
Packit 427e91
									structure->destroyLink(link);
Packit 427e91
								else
Packit 427e91
								{
Packit 427e91
									//wasn't error
Packit 427e91
									link->calcSize();
Packit 427e91
									link->updateContents(this, parent->getZoomLevel());
Packit 427e91
								}
Packit 427e91
							}							
Packit 427e91
						}
Packit 427e91
						
Packit 427e91
						stopLinkDrag();
Packit 427e91
						//parent->modeNormalClicked();
Packit 427e91
					}
Packit 427e91
					
Packit 427e91
					delete contextMenu;
Packit 427e91
					
Packit 427e91
					return;
Packit 427e91
				}
Packit 427e91
				return;
Packit 427e91
			}
Packit 427e91
		}
Packit 427e91
	}
Packit 427e91
}
Packit 427e91
Packit 427e91
void RoutingDrawWidget::deleteAllSelected()
Packit 427e91
{
Packit 427e91
	// through all selected
Packit 427e91
	RoutingWidget *parent = (RoutingWidget *)parentWidget();
Packit 427e91
	StrGlobal *structure = parent->getStructure();
Packit 427e91
	
Packit 427e91
	int err;
Packit 427e91
	
Packit 427e91
	if (!structure)
Packit 427e91
		return;
Packit 427e91
	
Packit 427e91
	if ((err = structure->deleteAllSelected()) < 0)
Packit 427e91
		QMessageBox::critical(0, APP_NAME, QString("Couldn't delete selected items !\n(ld10k1 error:%1)").arg(structure->errorStr(err)));
Packit 427e91
	
Packit 427e91
	this->updateContents();
Packit 427e91
}