Skip to content
Kirill-NiK edited this page Dec 4, 2012 · 1 revision
// redraw in rectangular good segment by the second squarize method.
// void specialSquarizeSegment(int /*< The interval's start position in the mLine */, bool /*< change on horizontal-vertical-horizontal */ = true);
// redraw in rectangular good link by the second squarize method
// void specialSquarizeLink();

// TODO: It's alternative squarize methos
void EdgeElement::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
{
	if (SettingsManager::value("SquareLine").toBool() && (event->modifiers() & Qt::AltModifier)
		&& (getPoint(event->pos()) == -1) && !isLoop)
	{
		int start;
		QPainterPath path;
		QPainterPathStroker ps;
		ps.setWidth(kvadratik >> 1);
		for (int i = 0; i < mLine.size() - 1; ++i) {
			path.moveTo(mLine[i]);
			path.lineTo(mLine[i + 1]);
			if (ps.createStroke(path).contains(event->pos())) {
				start = i;
				break;
			}
		}

		if ((start == 0 || start == 1) && mLine.size() == 3) {
			mLine.remove(1);
			QPolygonF newMLine;
			newMLine << mLine.first() << mLine.last();
			mLine = newMLine;
			if (mSrc) {
				prepareGeometryChange();
				mLine.first() = mapFromItem(mSrc, mSrc->portPos(mPortFrom));
			}
			if (mDst) {
				prepareGeometryChange();
				mLine.last() = mapFromItem(mDst, mDst->portPos(mPortTo));
			}
			arrangeSrcAndDst();
			prepareGeometryChange();
			specialSquarizeSegment(0);
		} else if ((start == 0 || start == 1) && mLine.size() > 3) {
			mLine.remove(1);
			if (mSrc) {
				mLine.first() = mapFromItem(mSrc, mSrc->portPos(mPortFrom));
			}
			prepareGeometryChange();
			specialSquarizeSegment(0);
		} else if ((start == mLine.size() - 3 || start == mLine.size() - 2) && mLine.size() > 3) {
			mLine.remove(mLine.size() - 2);
			if (mDst) {
				mLine.last() = mapFromItem(mDst, mDst->portPos(mPortTo));
			}
			prepareGeometryChange();
			specialSquarizeSegment(mLine.size() - 3);
		}
	}
	updateLongestPart();
	update();
}

void EdgeElement::specialSquarizeLink()
{
	prepareGeometryChange();
	for (int i = 0; i < mLine.size(); ++i) {
		specialSquarizeSegment(i);
	}
	delClosePoints();
	updateLongestPart();
	update();
}

void EdgeElement::specialSquarizeSegment(int start, bool xYx)
{
	QPointF middle = (mLine[start] + mLine[start + 1]) / 2;
	if (xYx) {
		mLine.insert(start + 1, QPointF(middle.x(), mLine[start].y()));
		mLine.insert(start + 2, QPointF(middle.x(), mLine[start + 2].y()));
	} else { // yXy
		mLine.insert(start + 1, QPointF(mLine[start].x(), middle.y()));
		mLine.insert(start + 2, QPointF(mLine[start + 2].x(), middle.y()));
	}
}
Clone this wiki locally