Blame qlo10k1/src/structure_link.cpp

Packit Service b98cfc
/*
Packit Service b98cfc
 *  qlo10k1 - GUI frontend for ld10k1
Packit Service b98cfc
 *
Packit Service b98cfc
 *  Copyright (c) 2004 by Peter Zubaj
Packit Service b98cfc
 *
Packit Service b98cfc
 *   This program is free software; you can redistribute it and/or modify
Packit Service b98cfc
 *   it under the terms of the GNU General Public License as published by
Packit Service b98cfc
 *   the Free Software Foundation; either version 2 of the License, or
Packit Service b98cfc
 *   (at your option) any later version.
Packit Service b98cfc
 *
Packit Service b98cfc
 *   This program is distributed in the hope that it will be useful,
Packit Service b98cfc
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service b98cfc
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service b98cfc
 *   GNU General Public License for more details.
Packit Service b98cfc
 *
Packit Service b98cfc
 *   You should have received a copy of the GNU General Public License
Packit Service b98cfc
 *   along with this program; if not, write to the Free Software
Packit Service b98cfc
 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Packit Service b98cfc
 *
Packit Service b98cfc
 */
Packit Service b98cfc
Packit Service b98cfc
#include <math.h> 
Packit Service b98cfc
#include <qpainter.h>
Packit Service b98cfc
Packit Service b98cfc
#include "structure_link.h"
Packit Service b98cfc
#include "custom_colors.h"
Packit Service b98cfc
Packit Service b98cfc
StrLink::StrLink(int id, LinkType t) 
Packit Service b98cfc
	: RSItemBaseWithType(RSItemBaseWithType::Link)
Packit Service b98cfc
{
Packit Service b98cfc
	linkId = id;
Packit Service b98cfc
	type = t;
Packit Service b98cfc
	
Packit Service b98cfc
	for (int i = 0; i < POINTINFO_MAX_CONN_PER_POINT + 1; i++)
Packit Service b98cfc
		routes[i] = NULL;
Packit Service b98cfc
		
Packit Service b98cfc
	useMixPoint = false;
Packit Service b98cfc
	
Packit Service b98cfc
	setSize(0, 0);
Packit Service b98cfc
	RSItemBaseWithType::calcSize();
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
StrLink::~StrLink()
Packit Service b98cfc
{
Packit Service b98cfc
	disconnectAll();
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
void StrLink::setId(int id)
Packit Service b98cfc
{
Packit Service b98cfc
	linkId = id;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
int StrLink::id()
Packit Service b98cfc
{
Packit Service b98cfc
	return linkId;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
void StrLink::setType(LinkType t)
Packit Service b98cfc
{
Packit Service b98cfc
	type = t;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
StrLink::LinkType StrLink::getType()
Packit Service b98cfc
{
Packit Service b98cfc
	return type;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
bool StrLink::isSimple()
Packit Service b98cfc
{
Packit Service b98cfc
	return simple;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
void StrLink::setSimple(bool s)
Packit Service b98cfc
{
Packit Service b98cfc
	simple = s;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
bool StrLink::isMulti()
Packit Service b98cfc
{
Packit Service b98cfc
	return multi;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
void StrLink::setMulti(bool m)
Packit Service b98cfc
{
Packit Service b98cfc
	multi = m;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
int StrLink::findRoute(RSItemIO *r)
Packit Service b98cfc
{
Packit Service b98cfc
	for (int i = 0; i < POINTINFO_MAX_CONN_PER_POINT + 1; i++)
Packit Service b98cfc
	{
Packit Service b98cfc
		if (routes[i] == r)
Packit Service b98cfc
			return i;
Packit Service b98cfc
	}
Packit Service b98cfc
	return -1;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
RSItemIO *StrLink::getRoutePoint(int r)
Packit Service b98cfc
{
Packit Service b98cfc
	if (r >= POINTINFO_MAX_CONN_PER_POINT)
Packit Service b98cfc
		return NULL;
Packit Service b98cfc
	return routes[r];
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
void StrLink::setRoutePoint(int r, RSItemIO *ri)
Packit Service b98cfc
{
Packit Service b98cfc
	if (r >= POINTINFO_MAX_CONN_PER_POINT + 1)
Packit Service b98cfc
		return;
Packit Service b98cfc
	
Packit Service b98cfc
	RSItemIO *tmp = routes[r];
Packit Service b98cfc
	routes[r] = NULL;
Packit Service b98cfc
	if (tmp)
Packit Service b98cfc
		tmp->connectTo(NULL);
Packit Service b98cfc
	
Packit Service b98cfc
	routes[r] = ri;
Packit Service b98cfc
	if (!ri)
Packit Service b98cfc
		routesPoints[r].clear();
Packit Service b98cfc
	if (ri)
Packit Service b98cfc
		ri->connectTo(this);
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
void StrLink::clearRoutesPoints(int r)
Packit Service b98cfc
{
Packit Service b98cfc
	if (r >= POINTINFO_MAX_CONN_PER_POINT + 1)
Packit Service b98cfc
		return;
Packit Service b98cfc
	routesPoints[r].clear();
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
#define LINK_SELECT_WH 7
Packit Service b98cfc
Packit Service b98cfc
void StrLink::setMinMaxPoint(QPoint p, int *minx, int *maxx, int *miny, int *maxy)
Packit Service b98cfc
{
Packit Service b98cfc
	if (p.x() - LINK_SELECT_WH / 2 < *minx)
Packit Service b98cfc
		*minx = p.x() - LINK_SELECT_WH / 2;
Packit Service b98cfc
	if (p.x() + LINK_SELECT_WH > *maxx)
Packit Service b98cfc
		*maxx = p.x() + LINK_SELECT_WH;
Packit Service b98cfc
		
Packit Service b98cfc
	if (p.y() - LINK_SELECT_WH / 2 < *miny)
Packit Service b98cfc
		*miny = p.y() - LINK_SELECT_WH / 2;
Packit Service b98cfc
	if (p.y() + LINK_SELECT_WH > *maxy)
Packit Service b98cfc
		*maxy = p.y() + LINK_SELECT_WH;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
void StrLink::setMinMax()
Packit Service b98cfc
{
Packit Service b98cfc
	int minx = 1000000;
Packit Service b98cfc
	int maxx = -1;
Packit Service b98cfc
	int miny = 1000000;
Packit Service b98cfc
	int maxy = -1;
Packit Service b98cfc
	
Packit Service b98cfc
	int i, j;
Packit Service b98cfc
	
Packit Service b98cfc
	if (useMixPoint)
Packit Service b98cfc
		setMinMaxPoint(mixPoint, &minx, &maxx, &miny, &maxy);
Packit Service b98cfc
		
Packit Service b98cfc
	for (i = 0; i < POINTINFO_MAX_CONN_PER_POINT + 1; i++)
Packit Service b98cfc
	{
Packit Service b98cfc
		if (routes[i])
Packit Service b98cfc
		{
Packit Service b98cfc
			setMinMaxPoint(routesEndPoints[i], &minx, &maxx, &miny, &maxy);
Packit Service b98cfc
			
Packit Service b98cfc
			for (j = 0; j < (int)routesPoints[i].count(); j++)
Packit Service b98cfc
			{
Packit Service b98cfc
				QPoint tmpp = routesPoints[i][j];
Packit Service b98cfc
				setMinMaxPoint(tmpp, &minx, &maxx, &miny, &maxy);
Packit Service b98cfc
			}
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
	
Packit Service b98cfc
	setPosition(minx, miny);
Packit Service b98cfc
	setSize(maxx - minx, maxy - miny);	
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
void StrLink::calcSize()
Packit Service b98cfc
{
Packit Service b98cfc
	int i;
Packit Service b98cfc
	int cnt = 0;
Packit Service b98cfc
	
Packit Service b98cfc
	int ioxp, ioyp;
Packit Service b98cfc
	
Packit Service b98cfc
	for (i = 0; i < POINTINFO_MAX_CONN_PER_POINT + 1; i++)
Packit Service b98cfc
	{
Packit Service b98cfc
		if (routes[i])
Packit Service b98cfc
		{
Packit Service b98cfc
			cnt++;
Packit Service b98cfc
			
Packit Service b98cfc
			((RSItemBaseWithType *)routes[i]->getOwner())->getIOPoint(routes[i], &ioxp, &ioyp);
Packit Service b98cfc
			routesEndPoints[i].setX(ioxp);
Packit Service b98cfc
			routesEndPoints[i].setY(ioyp);
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
	
Packit Service b98cfc
	setMinMax();
Packit Service b98cfc
	
Packit Service b98cfc
	if (cnt <= 2)
Packit Service b98cfc
	{
Packit Service b98cfc
		// not use mixpoint
Packit Service b98cfc
		useMixPoint = false;
Packit Service b98cfc
	}
Packit Service b98cfc
	else
Packit Service b98cfc
	{
Packit Service b98cfc
		// use mixpoint
Packit Service b98cfc
		if (!useMixPoint)
Packit Service b98cfc
		{
Packit Service b98cfc
			mixPoint.setX(x() + width() / 2);
Packit Service b98cfc
			mixPoint.setY(y() + height() / 2);
Packit Service b98cfc
			
Packit Service b98cfc
			useMixPoint = true;
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
void StrLink::draw(DrawingParams *dp)
Packit Service b98cfc
{
Packit Service b98cfc
	int i, j;
Packit Service b98cfc
	for (i = useMixPoint ? 0 : 1; i < POINTINFO_MAX_CONN_PER_POINT + 1; i++)
Packit Service b98cfc
	{
Packit Service b98cfc
		if (routes[i])
Packit Service b98cfc
		{
Packit Service b98cfc
			QPoint fp = routesEndPoints[i];
Packit Service b98cfc
			if (flagSelected())
Packit Service b98cfc
				dp->painter->fillRect(
Packit Service b98cfc
					(int)((fp.x() - LINK_SELECT_WH / 2) * dp->zoomKoef),
Packit Service b98cfc
					(int)((fp.y() - LINK_SELECT_WH / 2) * dp->zoomKoef),
Packit Service b98cfc
					(int)(LINK_SELECT_WH * dp->zoomKoef),
Packit Service b98cfc
					(int)(LINK_SELECT_WH * dp->zoomKoef),
Packit Service b98cfc
					QBrush(BOX_SELECTED_COLOR));
Packit Service b98cfc
					
Packit Service b98cfc
			for (j = 0; j < (int)routesPoints[i].count(); j++)
Packit Service b98cfc
			{
Packit Service b98cfc
				QPoint tmpp = routesPoints[i][j];
Packit Service b98cfc
				if (flagSelected())
Packit Service b98cfc
					dp->painter->fillRect(
Packit Service b98cfc
						(int)((tmpp.x() - LINK_SELECT_WH / 2) * dp->zoomKoef),
Packit Service b98cfc
						(int)((tmpp.y() - LINK_SELECT_WH / 2) * dp->zoomKoef),
Packit Service b98cfc
						(int)(LINK_SELECT_WH * dp->zoomKoef),
Packit Service b98cfc
						(int)(LINK_SELECT_WH * dp->zoomKoef),
Packit Service b98cfc
						QBrush(BOX_SELECTED_COLOR));
Packit Service b98cfc
						
Packit Service b98cfc
				dp->painter->setPen(LINE_PEN);
Packit Service b98cfc
				dp->painter->drawLine((int)(fp.x() * dp->zoomKoef),
Packit Service b98cfc
					(int)(fp.y() * dp->zoomKoef),
Packit Service b98cfc
					(int)(tmpp.x() * dp->zoomKoef),
Packit Service b98cfc
					(int)(tmpp.y() * dp->zoomKoef));
Packit Service b98cfc
				dp->painter->setPen(DEF_PAINTING_PEN);
Packit Service b98cfc
				fp = tmpp;
Packit Service b98cfc
			}
Packit Service b98cfc
			
Packit Service b98cfc
			if (useMixPoint)
Packit Service b98cfc
			{
Packit Service b98cfc
				dp->painter->setPen(LINE_PEN);
Packit Service b98cfc
				dp->painter->drawLine((int)(fp.x() * dp->zoomKoef),
Packit Service b98cfc
					(int)(fp.y() * dp->zoomKoef),
Packit Service b98cfc
					(int)(mixPoint.x() * dp->zoomKoef),
Packit Service b98cfc
					(int)(mixPoint.y() * dp->zoomKoef));
Packit Service b98cfc
				dp->painter->setPen(DEF_PAINTING_PEN);
Packit Service b98cfc
					
Packit Service b98cfc
				if (flagSelected())
Packit Service b98cfc
					dp->painter->fillRect(
Packit Service b98cfc
						(int)((mixPoint.x() - LINK_SELECT_WH / 2) * dp->zoomKoef),
Packit Service b98cfc
						(int)((mixPoint.y() - LINK_SELECT_WH / 2) * dp->zoomKoef),
Packit Service b98cfc
						(int)(LINK_SELECT_WH * dp->zoomKoef),
Packit Service b98cfc
						(int)(LINK_SELECT_WH * dp->zoomKoef),
Packit Service b98cfc
						QBrush(BOX_SELECTED_COLOR));
Packit Service b98cfc
			}
Packit Service b98cfc
			else
Packit Service b98cfc
			{
Packit Service b98cfc
				dp->painter->setPen(LINE_PEN);
Packit Service b98cfc
				dp->painter->drawLine((int)(fp.x() * dp->zoomKoef),
Packit Service b98cfc
					(int)(fp.y() * dp->zoomKoef),
Packit Service b98cfc
					(int)(routesEndPoints[0].x() * dp->zoomKoef),
Packit Service b98cfc
					(int)(routesEndPoints[0].y() * dp->zoomKoef));
Packit Service b98cfc
				dp->painter->setPen(DEF_PAINTING_PEN);
Packit Service b98cfc
				
Packit Service b98cfc
				if (flagSelected())
Packit Service b98cfc
					dp->painter->fillRect(
Packit Service b98cfc
						(int)((routesEndPoints[0].x() - LINK_SELECT_WH / 2) * dp->zoomKoef),
Packit Service b98cfc
						(int)((routesEndPoints[0].y() - LINK_SELECT_WH / 2) * dp->zoomKoef),
Packit Service b98cfc
						(int)(LINK_SELECT_WH * dp->zoomKoef),
Packit Service b98cfc
						(int)(LINK_SELECT_WH * dp->zoomKoef),
Packit Service b98cfc
						QBrush(BOX_SELECTED_COLOR));
Packit Service b98cfc
			}			
Packit Service b98cfc
		}
Packit Service b98cfc
	}	
Packit Service b98cfc
	
Packit Service b98cfc
	if (useMixPoint)
Packit Service b98cfc
	{
Packit Service b98cfc
		dp->painter->drawEllipse((int)((mixPoint.x() - 1) * dp->zoomKoef),
Packit Service b98cfc
					(int)((mixPoint.y() - 1) * dp->zoomKoef),
Packit Service b98cfc
					(int)(3 * dp->zoomKoef),
Packit Service b98cfc
					(int)(3 * dp->zoomKoef));
Packit Service b98cfc
		dp->painter->drawEllipse((int)((mixPoint.x() - 2) * dp->zoomKoef),
Packit Service b98cfc
					(int)((mixPoint.y() - 2) * dp->zoomKoef),
Packit Service b98cfc
					(int)(5 * dp->zoomKoef),
Packit Service b98cfc
					(int)(5 * dp->zoomKoef));
Packit Service b98cfc
		dp->painter->drawEllipse((int)((mixPoint.x() - 3) * dp->zoomKoef),
Packit Service b98cfc
					(int)((mixPoint.y() - 3) * dp->zoomKoef),
Packit Service b98cfc
					(int)(7 * dp->zoomKoef),
Packit Service b98cfc
					(int)(7 * dp->zoomKoef));
Packit Service b98cfc
	}
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
void StrLink::moveRel(int dx, int dy)
Packit Service b98cfc
{
Packit Service b98cfc
	int i;
Packit Service b98cfc
	unsigned int j;
Packit Service b98cfc
	
Packit Service b98cfc
	if (useMixPoint)
Packit Service b98cfc
		moveRelPoint(&mixPoint, dx, dy);
Packit Service b98cfc
		
Packit Service b98cfc
	for (i = 0; i < POINTINFO_MAX_CONN_PER_POINT + 1; i++)
Packit Service b98cfc
	{
Packit Service b98cfc
		if (routes[i])
Packit Service b98cfc
		{
Packit Service b98cfc
			for (j = 0; j < routesPoints[i].count(); j++)
Packit Service b98cfc
			{
Packit Service b98cfc
				QPoint tmpp = routesPoints[i][j];
Packit Service b98cfc
				moveRelPoint(&tmpp, dx, dy);
Packit Service b98cfc
				routesPoints[i][j] = tmpp;
Packit Service b98cfc
			}
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
		
Packit Service b98cfc
	calcSize();
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
void StrLink::moveRelPoint(QPoint *p, int dx, int dy)
Packit Service b98cfc
{
Packit Service b98cfc
	p->setX(p->x() + dx);
Packit Service b98cfc
	p->setY(p->y() + dy);
Packit Service b98cfc
	
Packit Service b98cfc
	if (p->x() < 0)
Packit Service b98cfc
		p->setX(0);
Packit Service b98cfc
	if (p->y() < 0)
Packit Service b98cfc
		p->setY(0);
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
void StrLink::updateOneSegment(QScrollView *sv, int r, float zoom)
Packit Service b98cfc
{
Packit Service b98cfc
	int ioxp;
Packit Service b98cfc
	int ioyp;
Packit Service b98cfc
	
Packit Service b98cfc
	if (r < 0 || r >= POINTINFO_MAX_CONN_PER_POINT + 1)
Packit Service b98cfc
		return; 
Packit Service b98cfc
	
Packit Service b98cfc
	if (routes[r])
Packit Service b98cfc
	{
Packit Service b98cfc
		((RSItemBaseWithType *)routes[r]->getOwner())->getIOPoint(routes[r], &ioxp, &ioyp);
Packit Service b98cfc
		routesEndPoints[r].setX(ioxp);
Packit Service b98cfc
		routesEndPoints[r].setY(ioyp);
Packit Service b98cfc
		setMinMax();
Packit Service b98cfc
		
Packit Service b98cfc
		if (routesPoints[r].count())
Packit Service b98cfc
		{
Packit Service b98cfc
			QPoint rep = routesEndPoints[r];
Packit Service b98cfc
			QPoint rp = routesPoints[r][0];
Packit Service b98cfc
			
Packit Service b98cfc
			QRect rect(QPoint(rep.x(), rep.y()), QPoint(rp.x(), rp.y()));
Packit Service b98cfc
			rect = rect.normalize();
Packit Service b98cfc
			rect.setX(rect.x() - LINK_SELECT_WH);
Packit Service b98cfc
			rect.setY(rect.y() - LINK_SELECT_WH);
Packit Service b98cfc
			rect.setWidth(rect.width() + 2 * LINK_SELECT_WH);
Packit Service b98cfc
			rect.setHeight(rect.height() + 2 * LINK_SELECT_WH);
Packit Service b98cfc
			sv->updateContents((int)(rect.x() * zoom),
Packit Service b98cfc
				(int)(rect.y() * zoom),
Packit Service b98cfc
				(int)(rect.width() * zoom),
Packit Service b98cfc
				(int)(rect.height() * zoom));
Packit Service b98cfc
		}
Packit Service b98cfc
		else
Packit Service b98cfc
		{
Packit Service b98cfc
			if (useMixPoint)
Packit Service b98cfc
			{
Packit Service b98cfc
				QPoint rep = routesEndPoints[r];
Packit Service b98cfc
				QRect rect(QPoint(rep.x(), rep.y()), QPoint(mixPoint.x(), mixPoint.y()));
Packit Service b98cfc
				rect = rect.normalize();
Packit Service b98cfc
				rect.setX(rect.x() - LINK_SELECT_WH);
Packit Service b98cfc
				rect.setY(rect.y() - LINK_SELECT_WH);
Packit Service b98cfc
				rect.setWidth(rect.width() + 2 * LINK_SELECT_WH);
Packit Service b98cfc
				rect.setHeight(rect.height() + 2 * LINK_SELECT_WH);
Packit Service b98cfc
				sv->updateContents((int)(rect.x() * zoom),
Packit Service b98cfc
					(int)(rect.y() * zoom),
Packit Service b98cfc
					(int)(rect.width() * zoom),
Packit Service b98cfc
					(int)(rect.height() * zoom));
Packit Service b98cfc
			}
Packit Service b98cfc
			else
Packit Service b98cfc
				sv->updateContents((int)((x() - LINK_SELECT_WH) * zoom),
Packit Service b98cfc
					(int)((y() - LINK_SELECT_WH) * zoom),
Packit Service b98cfc
					(int)((width() + 2 * LINK_SELECT_WH) * zoom),
Packit Service b98cfc
					(int)((height() + 2 * LINK_SELECT_WH) * zoom));
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
// Determines whether a point is close enough to a another point, within LINK_SELECT_WH.
Packit Service b98cfc
bool StrLink::containsPointPoint(QPoint &p, int xp, int yp)
Packit Service b98cfc
{
Packit Service b98cfc
	QRect r(p.x() - LINK_SELECT_WH / 2, p.y() - LINK_SELECT_WH / 2,
Packit Service b98cfc
		LINK_SELECT_WH + 1, LINK_SELECT_WH + 1);
Packit Service b98cfc
Packit Service b98cfc
	return r.contains(xp, yp);
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
// Determines whether a point is on a line segment.
Packit Service b98cfc
bool StrLink::containsPointSegment(QPoint &p1, QPoint &p2, int xp, int yp)
Packit Service b98cfc
{
Packit Service b98cfc
	QRect r(p1, p2);
Packit Service b98cfc
	if (!r.normalize().contains(xp, yp))
Packit Service b98cfc
		return false;
Packit Service b98cfc
	
Packit Service b98cfc
	float v1 = p2.x() - p1.x();
Packit Service b98cfc
	float v2 = p2.y() - p1.y();
Packit Service b98cfc
	float a = v2;
Packit Service b98cfc
	float b = -v1;
Packit Service b98cfc
	
Packit Service b98cfc
	float c = v1 * p1.y() - v2 * p1.x();
Packit Service b98cfc
	
Packit Service b98cfc
	if (fabs(a * xp + b * yp + c) / sqrt(a * a + b * b) < 4.0)
Packit Service b98cfc
		return true;
Packit Service b98cfc
	else
Packit Service b98cfc
		return false;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
bool StrLink::containsPoint(int xp, int yp)
Packit Service b98cfc
{
Packit Service b98cfc
	int i;
Packit Service b98cfc
	unsigned j;
Packit Service b98cfc
	
Packit Service b98cfc
	if (xp < x() || xp > x() + width() ||
Packit Service b98cfc
		yp < y() || yp > y() + height())
Packit Service b98cfc
		return false;
Packit Service b98cfc
		
Packit Service b98cfc
	if (useMixPoint)
Packit Service b98cfc
	{
Packit Service b98cfc
		if (containsPointPoint(mixPoint, xp, yp))
Packit Service b98cfc
			return true;
Packit Service b98cfc
	}
Packit Service b98cfc
		
Packit Service b98cfc
	for (i = 0; i < POINTINFO_MAX_CONN_PER_POINT + 1; i++)
Packit Service b98cfc
	{
Packit Service b98cfc
		if (routes[i])
Packit Service b98cfc
		{
Packit Service b98cfc
			QPoint fp = routesEndPoints[i];
Packit Service b98cfc
			if (containsPointPoint(fp, xp, yp))
Packit Service b98cfc
				return true;
Packit Service b98cfc
				
Packit Service b98cfc
			for (j = 0; j < routesPoints[i].count(); j++)
Packit Service b98cfc
			{
Packit Service b98cfc
				QPoint tmpp = routesPoints[i][j];
Packit Service b98cfc
				
Packit Service b98cfc
				if (containsPointPoint(tmpp, xp, yp))
Packit Service b98cfc
					return true;
Packit Service b98cfc
			
Packit Service b98cfc
				if (containsPointSegment(fp, tmpp, xp, yp))
Packit Service b98cfc
					return true;
Packit Service b98cfc
				fp = tmpp;
Packit Service b98cfc
			}
Packit Service b98cfc
			
Packit Service b98cfc
			if (useMixPoint)
Packit Service b98cfc
			{
Packit Service b98cfc
				if (containsPointSegment(fp, mixPoint, xp, yp))
Packit Service b98cfc
					return true;
Packit Service b98cfc
			}
Packit Service b98cfc
			else
Packit Service b98cfc
			{
Packit Service b98cfc
				if (containsPointSegment(fp, routesEndPoints[0], xp, yp))
Packit Service b98cfc
					return true;
Packit Service b98cfc
			}
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
	return false;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
bool StrLink::containsHandlePoint(int xp, int yp)
Packit Service b98cfc
{
Packit Service b98cfc
	return getHandlePointNum(xp, yp) >= 0;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
int StrLink::getHandlePointNum(int xp, int yp)
Packit Service b98cfc
{
Packit Service b98cfc
	int i;
Packit Service b98cfc
	unsigned j;
Packit Service b98cfc
	
Packit Service b98cfc
	if (xp < x() || xp > x() + width() ||
Packit Service b98cfc
		yp < y() || yp > y() + height())
Packit Service b98cfc
		return -1;
Packit Service b98cfc
		
Packit Service b98cfc
	if (useMixPoint)
Packit Service b98cfc
	{
Packit Service b98cfc
		if (containsPointPoint(mixPoint, xp, yp))
Packit Service b98cfc
			return 0;
Packit Service b98cfc
	}
Packit Service b98cfc
		
Packit Service b98cfc
	for (i = 0; i < POINTINFO_MAX_CONN_PER_POINT + 1; i++)
Packit Service b98cfc
	{
Packit Service b98cfc
		if (routes[i])
Packit Service b98cfc
		{
Packit Service b98cfc
			for (j = 0; j < routesPoints[i].count(); j++)
Packit Service b98cfc
			{
Packit Service b98cfc
				QPoint tmpp = routesPoints[i][j];
Packit Service b98cfc
				
Packit Service b98cfc
				if (containsPointPoint(tmpp, xp, yp))
Packit Service b98cfc
					return (i + 1) * 256 + j + 1;
Packit Service b98cfc
			}
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
	
Packit Service b98cfc
	return -1;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
void StrLink::moveHandleRel(int num, int dx, int dy)
Packit Service b98cfc
{
Packit Service b98cfc
	int i;
Packit Service b98cfc
	int j;
Packit Service b98cfc
	
Packit Service b98cfc
	if (useMixPoint && num == 0)
Packit Service b98cfc
	{
Packit Service b98cfc
		moveRelPoint(&mixPoint, dx, dy);
Packit Service b98cfc
		setMinMax();
Packit Service b98cfc
		return;
Packit Service b98cfc
	}
Packit Service b98cfc
		
Packit Service b98cfc
	for (i = 0; i < POINTINFO_MAX_CONN_PER_POINT + 1; i++)
Packit Service b98cfc
	{
Packit Service b98cfc
		if (routes[i])
Packit Service b98cfc
		{
Packit Service b98cfc
			for (j = 0; j < (int)routesPoints[i].count(); j++)
Packit Service b98cfc
			{
Packit Service b98cfc
				if (num == (i + 1) * 256 + j + 1)			
Packit Service b98cfc
				{
Packit Service b98cfc
					QPoint tmpp = routesPoints[i][j];
Packit Service b98cfc
					moveRelPoint(&tmpp, dx, dy);
Packit Service b98cfc
					routesPoints[i][j] = tmpp;
Packit Service b98cfc
					setMinMax();
Packit Service b98cfc
					return;
Packit Service b98cfc
				}
Packit Service b98cfc
			}
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
void StrLink::disconnectAll()
Packit Service b98cfc
{
Packit Service b98cfc
	for (int i = 0; i < POINTINFO_MAX_CONN_PER_POINT + 1; i++)
Packit Service b98cfc
	{
Packit Service b98cfc
		if (routes[i])
Packit Service b98cfc
		{
Packit Service b98cfc
			RSItemIO *tmp = routes[i];
Packit Service b98cfc
			routes[i] = NULL;
Packit Service b98cfc
			tmp->connectTo(NULL);
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
bool StrLink::isValid()
Packit Service b98cfc
{
Packit Service b98cfc
	int cnti = 0;
Packit Service b98cfc
	int cnto = 0;
Packit Service b98cfc
	for (int i = 0; i < POINTINFO_MAX_CONN_PER_POINT + 1; i++)
Packit Service b98cfc
	{
Packit Service b98cfc
		if (routes[i])
Packit Service b98cfc
		{
Packit Service b98cfc
			if (routes[i]->isOutput())
Packit Service b98cfc
				cnto++;
Packit Service b98cfc
			else
Packit Service b98cfc
				cnti++;
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
	
Packit Service b98cfc
	if (getType() == LinkNormal)
Packit Service b98cfc
		return cnti + cnto > 1 && (cnti > 0 && cnto > 0);
Packit Service b98cfc
	else
Packit Service b98cfc
		return cnti + cnto > 1;
Packit Service b98cfc
	
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
bool StrLink::addSegmentPoint(int xp, int yp)
Packit Service b98cfc
{
Packit Service b98cfc
	int i;
Packit Service b98cfc
	unsigned j;
Packit Service b98cfc
	
Packit Service b98cfc
	if (xp < x() || xp > x() + width() ||
Packit Service b98cfc
		yp < y() || yp > y() + height())
Packit Service b98cfc
		return false;
Packit Service b98cfc
		
Packit Service b98cfc
	for (i = 0; i < POINTINFO_MAX_CONN_PER_POINT + 1; i++)
Packit Service b98cfc
	{
Packit Service b98cfc
		if (routes[i])
Packit Service b98cfc
		{
Packit Service b98cfc
			QPoint fp = routesEndPoints[i];
Packit Service b98cfc
			for (j = 0; j < routesPoints[i].count(); j++)
Packit Service b98cfc
			{
Packit Service b98cfc
				QPoint tmpp = routesPoints[i][j];
Packit Service b98cfc
				
Packit Service b98cfc
				if (containsPointSegment(fp, tmpp, xp, yp))
Packit Service b98cfc
				{
Packit Service b98cfc
					// add new point
Packit Service b98cfc
					routesPoints[i].insert(routesPoints[i].at(j), QPoint(xp,yp));
Packit Service b98cfc
					return true;
Packit Service b98cfc
				}
Packit Service b98cfc
				fp = tmpp;
Packit Service b98cfc
			}
Packit Service b98cfc
			
Packit Service b98cfc
			if (useMixPoint)
Packit Service b98cfc
			{
Packit Service b98cfc
				if (containsPointSegment(fp, mixPoint, xp, yp))
Packit Service b98cfc
				{
Packit Service b98cfc
					routesPoints[i].append(QPoint(xp,yp));
Packit Service b98cfc
					return true;
Packit Service b98cfc
				}
Packit Service b98cfc
			}
Packit Service b98cfc
			else
Packit Service b98cfc
			{
Packit Service b98cfc
				if (containsPointSegment(fp, routesEndPoints[0], xp, yp))
Packit Service b98cfc
				{
Packit Service b98cfc
					routesPoints[i].append(QPoint(xp,yp));
Packit Service b98cfc
					return true;
Packit Service b98cfc
				}
Packit Service b98cfc
			}
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
	return false;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
bool StrLink::delSegmentPoint(int num)
Packit Service b98cfc
{
Packit Service b98cfc
	if (num <= 0)
Packit Service b98cfc
		return false;
Packit Service b98cfc
		
Packit Service b98cfc
	int r = ((num - 1) / 256) - 1;
Packit Service b98cfc
	int i = ((num - 1) % 256);
Packit Service b98cfc
		
Packit Service b98cfc
	if (routes[r])
Packit Service b98cfc
	{
Packit Service b98cfc
		if (i < (int)routesPoints[r].count())
Packit Service b98cfc
		{
Packit Service b98cfc
			routesPoints[r].remove(routesPoints[r].at(i));
Packit Service b98cfc
			return true;
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
	
Packit Service b98cfc
	return false;
Packit Service b98cfc
}
Packit Service b98cfc
Packit Service b98cfc
// Returns route number which segment containing point leads to, else -1
Packit Service b98cfc
int StrLink::getRouteNumFromPoint(int xp, int yp)
Packit Service b98cfc
{
Packit Service b98cfc
	int i;
Packit Service b98cfc
	unsigned j;
Packit Service b98cfc
	
Packit Service b98cfc
	if (xp < x() || xp > x() + width() ||
Packit Service b98cfc
		yp < y() || yp > y() + height())
Packit Service b98cfc
		return -1;
Packit Service b98cfc
		
Packit Service b98cfc
	if (useMixPoint)
Packit Service b98cfc
	{
Packit Service b98cfc
		if (containsPointPoint(mixPoint, xp, yp))
Packit Service b98cfc
			return -1;
Packit Service b98cfc
	}
Packit Service b98cfc
		
Packit Service b98cfc
	for (i = 0; i < POINTINFO_MAX_CONN_PER_POINT + 1; i++)
Packit Service b98cfc
	{
Packit Service b98cfc
		if (routes[i])
Packit Service b98cfc
		{
Packit Service b98cfc
			QPoint fp = routesEndPoints[i];
Packit Service b98cfc
			if (containsPointPoint(fp, xp, yp))
Packit Service b98cfc
				return i;
Packit Service b98cfc
				
Packit Service b98cfc
			for (j = 0; j < routesPoints[i].count(); j++)
Packit Service b98cfc
			{
Packit Service b98cfc
				QPoint tmpp = routesPoints[i][j];
Packit Service b98cfc
				
Packit Service b98cfc
				if (containsPointPoint(tmpp, xp, yp))
Packit Service b98cfc
					return i;
Packit Service b98cfc
			
Packit Service b98cfc
				if (containsPointSegment(fp, tmpp, xp, yp))
Packit Service b98cfc
					return i;
Packit Service b98cfc
				fp = tmpp;
Packit Service b98cfc
			}
Packit Service b98cfc
			
Packit Service b98cfc
			if (useMixPoint)
Packit Service b98cfc
			{
Packit Service b98cfc
				if (containsPointSegment(fp, mixPoint, xp, yp))
Packit Service b98cfc
					return i;
Packit Service b98cfc
			}
Packit Service b98cfc
			else
Packit Service b98cfc
			{
Packit Service b98cfc
				if (containsPointSegment(fp, routesEndPoints[0], xp, yp))
Packit Service b98cfc
					return i;
Packit Service b98cfc
			}
Packit Service b98cfc
		}
Packit Service b98cfc
	}
Packit Service b98cfc
	return -1;
Packit Service b98cfc
}
Packit Service b98cfc