forked from qreal/qreal
-
Notifications
You must be signed in to change notification settings - Fork 8
Square2method
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()));
}
}