void RelationshipView::configureDescriptor(void) { QLineF lin; QPolygonF pol; BaseRelationship *base_rel=this->getSourceObject(); Relationship *rel=dynamic_cast<Relationship *>(base_rel); unsigned rel_type=base_rel->getRelationshipType(); float x, y, x1, y1, factor=font_config[ParsersAttributes::GLOBAL].font().pointSizeF()/DEFAULT_FONT_SIZE; QPen pen; QPointF pnt; vector<QPointF> points=base_rel->getPoints(); QColor line_color=base_rel->getCustomColor(); QGraphicsPolygonItem *pol_item=nullptr; //Configuring the relationship descriptor color if(base_rel->getCustomColor()!=Qt::transparent) //Using custom color pen.setColor(base_rel->getCustomColor()); else //Using the default color pen=BaseObjectView::getBorderStyle(ParsersAttributes::RELATIONSHIP); if(rel_type==BaseRelationship::RELATIONSHIP_DEP) pen.setStyle(Qt::DashLine); descriptor->setPen(pen); if(line_color!=Qt::transparent) { QColor colors[2]; QLinearGradient grad; BaseObjectView::getFillStyle(ParsersAttributes::RELATIONSHIP, colors[0], colors[1]); for(unsigned i=0; i < 2; i++) { colors[i].setRed((colors[i].red() + line_color.red() + 255)/3); colors[i].setGreen((colors[i].green() + line_color.green() + 255)/3); colors[i].setBlue((colors[i].blue() + line_color.blue() + 255)/3); grad.setColorAt(i, colors[i]); } grad.setCoordinateMode(QGradient::ObjectBoundingMode);; descriptor->setBrush(grad); } else descriptor->setBrush(BaseObjectView::getFillStyle(ParsersAttributes::RELATIONSHIP)); if(rel_type==BaseRelationship::RELATIONSHIP_DEP || rel_type==BaseRelationship::RELATIONSHIP_GEN) { pol.append(QPointF(0,0)); pol.append(QPointF(21,13)); pol.append(QPointF(0,26)); pol.append(QPointF(0,13)); } else { pol.append(QPointF(13,0)); pol.append(QPointF(26,13)); pol.append(QPointF(13,26)); pol.append(QPointF(0,13)); } //Resizes the polygon according the font factor if(factor!=1.0f) this->resizePolygon(pol, pol.boundingRect().width() * factor , pol.boundingRect().height() * factor); if(base_rel->isSelfRelationship()) pnt=points.at(points.size()/2); else { lin=lines.at(lines.size()/2)->line(); if(rel && rel->isIdentifier()) pnt=lin.p1(); else { pnt.setX((lin.p1().x() + lin.p2().x()) / 2.0f); pnt.setY((lin.p1().y() + lin.p2().y()) / 2.0f); } descriptor->setRotation(-lin.angle()); obj_selection->setRotation(-lin.angle()); obj_shadow->setRotation(-lin.angle()); } x=x1=pnt.x() - (pol.boundingRect().width()/2.0f); y=y1=pnt.y() - (pol.boundingRect().height()/2.0f); protected_icon->setPos(x + ((pol.boundingRect().width()/2.0f) * 0.60f), y + ((pol.boundingRect().height()/2.0f) * 0.55f)); configureSQLDisabledInfo(); x1+=6 * HORIZ_SPACING; y1-=3 * VERT_SPACING; sql_disabled_box->setPos(x1, y1); sql_disabled_txt->setPos(x1 + HORIZ_SPACING, y1 + VERT_SPACING); descriptor->setPolygon(pol); descriptor->setTransformOriginPoint(descriptor->boundingRect().center()); descriptor->setPos(x, y); pol_item=dynamic_cast<QGraphicsPolygonItem *>(obj_selection); pol_item->setPolygon(pol); pol_item->setTransformOriginPoint(obj_selection->boundingRect().center()); pol_item->setPos(x,y); pol_item->setBrush(this->getFillStyle(ParsersAttributes::OBJ_SELECTION)); pol_item->setPen(this->getBorderStyle(ParsersAttributes::OBJ_SELECTION)); pol_item=dynamic_cast<QGraphicsPolygonItem *>(obj_shadow); pol_item->setPolygon(pol); pol_item->setTransformOriginPoint(obj_shadow->boundingRect().center()); pol_item->setPos(x + 2.5f, y + 3.5f); pol_item->setPen(Qt::NoPen); pol_item->setBrush(QColor(50,50,50,60)); this->configureAttributes(); this->configurePositionInfo(); }
void CanvasMode_EditArc::applyValues(double start, double end, double height, double width) { PageItem *currItem = m_doc->m_Selection->itemAt(0); QRectF oldR = currItem->getBoundingRect().adjusted(-5, -5, 10, 10); PageItem_Arc *item = currItem->asArc(); QTransform bb; bb.scale(height / width, 1.0); QLineF inp = QLineF(QPointF(width / 2.0, height / 2.0), QPointF(width, height / 2.0)); inp.setAngle(start); QLineF res = bb.map(inp); inp.setAngle(end); QLineF ena = bb.map(inp); m_startAngle = res.angle(); m_endAngle = ena.angle(); double nSweep = m_endAngle - m_startAngle; if (nSweep < 0) nSweep += 360; double oldX = currItem->xPos(); double oldY = currItem->yPos(); double newX = oldX + m_centerPoint.x() - (width / 2.0); double newY = oldY + m_centerPoint.y() - (height / 2.0); item->setXYPos(newX, newY, true); FPointArray old = item->PoLine; QPainterPath pp; pp.moveTo(width / 2.0, height / 2.0); pp.arcTo(QRectF(0, 0, width, height), m_startAngle, nSweep); pp.closeSubpath(); currItem->PoLine.fromQPainterPath(pp, true); FPoint wh = getMaxClipF(&currItem->PoLine); currItem->setWidthHeight(wh.x(),wh.y()); m_doc->adjustItemSize(currItem); currItem->OldB2 = currItem->width(); currItem->OldH2 = currItem->height(); if (UndoManager::undoEnabled()) { ScItemState<QPair<FPointArray, FPointArray> > *ss = new ScItemState<QPair<FPointArray, FPointArray> >(Um::EditArc,"",Um::IPolygon); ss->set("ARC"); ss->set("OLD_WIDTH",item->arcWidth); ss->set("NEW_WIDTH",width); ss->set("OLD_XPOS",oldX); ss->set("OLD_YPOS",oldY); ss->set("OLD_HEIGHT",item->arcHeight); ss->set("NEW_HEIGHT",height); ss->set("OLD_START",item->arcStartAngle); ss->set("NEW_START",m_startAngle); ss->set("OLD_SWEEP",item->arcSweepAngle); ss->set("NEW_SWEEP",nSweep); ss->setItem(qMakePair(old,item->PoLine)); ss->set("NEW_XPOS",item->xPos()); ss->set("NEW_YPOS",item->yPos()); undoManager->action(currItem,ss); } item->arcStartAngle = m_startAngle; item->arcSweepAngle = nSweep; item->arcWidth = width; item->arcHeight = height; m_startPoint = currItem->PoLine.pointQF(2); m_endPoint = currItem->PoLine.pointQF(currItem->PoLine.size() - 4); m_centerPoint = currItem->PoLine.pointQF(0); m_widthPoint = QPointF(m_centerPoint.x() - item->arcWidth / 2.0, m_centerPoint.y()); m_heightPoint = QPointF(m_centerPoint.x(), m_centerPoint.y() - item->arcHeight / 2.0); m_doc->setRedrawBounding(currItem); QRectF newR(currItem->getBoundingRect()); m_doc->regionsChanged()->update(newR.united(oldR)); // QTransform itemMatrix = currItem->getTransform(); // m_doc->regionsChanged()->update(itemMatrix.mapRect(QRectF(0, 0, currItem->width(), currItem->height())).adjusted(-currItem->width() / 2.0, -currItem->height() / 2.0, currItem->width(), currItem->height())); }
QPolygonF UBGeometryUtils::arcToPolygon(const QLineF& startRadius, qreal spanAngleInDegrees, qreal width) { qreal startAngleInDegrees = - startRadius.angle(); if (startAngleInDegrees > 180) startAngleInDegrees -= 360; else if (startAngleInDegrees < -180) startAngleInDegrees += 360; qreal radiusLength = startRadius.length(); qreal angle = 2 * asin(width / (2 * radiusLength)) * 180 / PI; bool overlap = abs(spanAngleInDegrees) > 360 - angle; if (overlap) spanAngleInDegrees = spanAngleInDegrees < 0 ? -360 : 360; qreal endAngleInDegrees = startAngleInDegrees + spanAngleInDegrees; qreal innerRadius = radiusLength - width / 2; QRectF innerSquare( startRadius.p1().x() - innerRadius, startRadius.p1().y() - innerRadius, 2 * innerRadius, 2 * innerRadius); qreal outerRadius = radiusLength + width / 2; QRectF outerSquare( startRadius.p1().x() - outerRadius, startRadius.p1().y() - outerRadius, 2 * outerRadius, 2 * outerRadius); QRectF startSquare( startRadius.p2().x() - width / 2, startRadius.p2().y() - width / 2, width, width); QRectF endSquare( startRadius.p1().x() + radiusLength * cos(endAngleInDegrees * PI / 180.0) - width / 2, startRadius.p1().y() + radiusLength * sin(endAngleInDegrees * PI / 180.0) - width / 2, width, width); QPainterPath painterPath( QPointF( startRadius.p1().x() + innerRadius * cos(startAngleInDegrees * PI / 180.0), startRadius.p1().y() + innerRadius * sin(startAngleInDegrees * PI / 180.0))); startAngleInDegrees = - startAngleInDegrees; endAngleInDegrees = - endAngleInDegrees; spanAngleInDegrees = - spanAngleInDegrees; if (overlap) { painterPath.addEllipse(outerSquare); QPainterPath innerPainterPath; innerPainterPath.addEllipse(innerSquare); painterPath = painterPath.subtracted(innerPainterPath); } else { painterPath.arcTo(innerSquare, startAngleInDegrees, spanAngleInDegrees); painterPath.arcTo(endSquare, 180.0 + endAngleInDegrees, spanAngleInDegrees > 0 ? -180.0 : 180.0); painterPath.arcTo(outerSquare, endAngleInDegrees, - spanAngleInDegrees); painterPath.arcTo(startSquare, startAngleInDegrees, spanAngleInDegrees > 0 ? -180.0 : 180.0); painterPath.closeSubpath(); } return painterPath.toFillPolygon(); }
void PolygonObject::updateRubber(QPainter* painter) { int rubberMode = objectRubberMode(); if(rubberMode == OBJ_RUBBER_POLYGON) { setObjectPos(objectRubberPoint("POLYGON_POINT_0")); bool ok = false; QString numStr = objectRubberText("POLYGON_NUM_POINTS"); if(numStr.isNull()) return; int num = numStr.toInt(&ok); if(!ok) return; QString appendStr; QPainterPath rubberPath; rubberPath.moveTo(mapFromScene(objectRubberPoint("POLYGON_POINT_0"))); for(int i = 1; i <= num; i++) { appendStr = "POLYGON_POINT_" + QString().setNum(i); QPointF appendPoint = mapFromScene(objectRubberPoint(appendStr)); rubberPath.lineTo(appendPoint); } //rubberPath.lineTo(0,0); updatePath(rubberPath); //Ensure the path isn't updated until the number of points is changed again setObjectRubberText("POLYGON_NUM_POINTS", QString()); } else if(rubberMode == OBJ_RUBBER_POLYGON_INSCRIBE) { setObjectPos(objectRubberPoint("POLYGON_CENTER")); quint16 numSides = objectRubberPoint("POLYGON_NUM_SIDES").x(); QPointF inscribePoint = mapFromScene(objectRubberPoint("POLYGON_INSCRIBE_POINT")); QLineF inscribeLine = QLineF(QPointF(0,0), inscribePoint); qreal inscribeAngle = inscribeLine.angle(); qreal inscribeInc = 360.0/numSides; if(painter) drawRubberLine(inscribeLine, painter, VIEW_COLOR_CROSSHAIR); QPainterPath inscribePath; //First Point inscribePath.moveTo(inscribePoint); //Remaining Points for(int i = 1; i < numSides; i++) { inscribeLine.setAngle(inscribeAngle + inscribeInc*i); inscribePath.lineTo(inscribeLine.p2()); } updatePath(inscribePath); } else if(rubberMode == OBJ_RUBBER_POLYGON_CIRCUMSCRIBE) { setObjectPos(objectRubberPoint("POLYGON_CENTER")); quint16 numSides = objectRubberPoint("POLYGON_NUM_SIDES").x(); QPointF circumscribePoint = mapFromScene(objectRubberPoint("POLYGON_CIRCUMSCRIBE_POINT")); QLineF circumscribeLine = QLineF(QPointF(0,0), circumscribePoint); qreal circumscribeAngle = circumscribeLine.angle(); qreal circumscribeInc = 360.0/numSides; if(painter) drawRubberLine(circumscribeLine, painter, VIEW_COLOR_CROSSHAIR); QPainterPath circumscribePath; //First Point QLineF prev(circumscribeLine.p2(), QPointF(0,0)); prev = prev.normalVector(); circumscribeLine.setAngle(circumscribeAngle + circumscribeInc); QLineF perp(circumscribeLine.p2(), QPointF(0,0)); perp = perp.normalVector(); QPointF iPoint; perp.intersect(prev, &iPoint); circumscribePath.moveTo(iPoint); //Remaining Points for(int i = 2; i <= numSides; i++) { prev = perp; circumscribeLine.setAngle(circumscribeAngle + circumscribeInc*i); perp = QLineF(circumscribeLine.p2(), QPointF(0,0)); perp = perp.normalVector(); perp.intersect(prev, &iPoint); circumscribePath.lineTo(iPoint); } updatePath(circumscribePath); } else if(rubberMode == OBJ_RUBBER_GRIP) { if(painter) { int elemCount = normalPath.elementCount(); QPointF gripPoint = objectRubberPoint("GRIP_POINT"); if(gripIndex == -1) gripIndex = findIndex(gripPoint); if(gripIndex == -1) return; int m = 0; int n = 0; if(!gripIndex) { m = elemCount-1; n = 1; } else if(gripIndex == elemCount-1) { m = elemCount-2; n = 0; } else { m = gripIndex-1; n = gripIndex+1; } QPainterPath::Element em = normalPath.elementAt(m); QPainterPath::Element en = normalPath.elementAt(n); QPointF emPoint = QPointF(em.x, em.y); QPointF enPoint = QPointF(en.x, en.y); painter->drawLine(emPoint, mapFromScene(objectRubberPoint(QString()))); painter->drawLine(enPoint, mapFromScene(objectRubberPoint(QString()))); QLineF rubLine(mapFromScene(gripPoint), mapFromScene(objectRubberPoint(QString()))); drawRubberLine(rubLine, painter, VIEW_COLOR_CROSSHAIR); } } }