void RGraphicsView::setOffset(const RVector& offset, bool regen) { RVector o = offset; if (!o.isSane()) { o = RVector(0,0); } // 20111024: avoid overflows with weird behaviour when using track pad: if (RSettings::getLimitZoomAndScroll()) { if (offset.x < -1.0e8 || offset.x > 1.0e8) { o.x = 0.0; } if (offset.y < -1.0e8 || offset.y > 1.0e8) { o.y = 0.0; } } this->offset = o; // offset in pixels: //RVector ov(RMath::mround(offset.x*factor), RMath::mround(offset.y*factor)); ////ov = RVector(RMath::mround(ov.x), RMath::mround(ov.y)); ////this->offset = mapFromView(ov); //this->offset = RVector(ov.x/factor, ov.y/factor); if (regen) { regenerate(); if (scene!=NULL) { // notify actions about zoom change: scene->getDocumentInterface().zoomChangeEvent(*this); } } //viewportChangeEvent(); }
void REventHandler::drawSnapLabel(QPainter* painter, const RVector& pos, const RVector& posRestriction, const QString& text) { RVector p = graphicsView->mapToView(pos); RVector pr = RVector::invalid; if (posRestriction.isValid()) { pr = graphicsView->mapToView(posRestriction); } RColor color = RSettings::getColor("GraphicsViewColors/TextLabelColor", RColor(249,198,31)); painter->setPen(color); QFont font = RSettings::getSnapLabelFont(); font.setPointSizeF(font.pointSizeF()*graphicsView->getDevicePixelRatio()); QFontMetrics fm(font); painter->setFont(font); int offset = 5 * graphicsView->getDevicePixelRatio(); if (!text.isEmpty()) { painter->drawText( p.x + offset, p.y + offset, fm.width(text)+10, fm.height()+10, Qt::AlignHCenter | Qt::AlignVCenter, text, NULL); } painter->drawEllipse(p.x-offset, p.y-offset, offset*2, offset*2); // restriction position: if (pr.isSane()) { painter->drawLine(pr.x, pr.y-offset, pr.x+offset, pr.y); painter->drawLine(pr.x+offset, pr.y, pr.x, pr.y+offset); painter->drawLine(pr.x, pr.y+offset, pr.x-offset, pr.y); painter->drawLine(pr.x-offset, pr.y, pr.x, pr.y-offset); } // display distance/angle: int display = RSettings::getIntValue("DisplaySettings/DisplayDistanceAngle", 0); if (display == 0) { return; } RDocumentInterface* di = graphicsView->getDocumentInterface(); RDocument* doc = graphicsView->getDocument(); RVector relativeZero = di->getRelativeZero(); double dist, angle; if (posRestriction.isSane()) { dist = relativeZero.getDistanceTo(posRestriction); angle = relativeZero.getAngleTo(posRestriction); } else { dist = relativeZero.getDistanceTo(pos); angle = relativeZero.getAngleTo(pos); } int lp = doc->getLinearPrecision(); QString distStr = RUnit::doubleToString(dist, lp); angle = RMath::rad2deg(angle); int ap = doc->getAnglePrecision(); QString angStr = RUnit::doubleToString(angle, ap); QString sep = RSettings::getStringValue("Input/PolarCoordinateSeparator", "<"); color = RSettings::getColor("GraphicsViewColors/MeasurementToolsColor", RColor(155,220,112)); painter->setPen(color); QString displayText; switch (display) { case 0: displayText = ""; break; case 1: displayText = distStr + sep + angStr + QChar(0x00b0); break; case 2: displayText = distStr; break; case 3: displayText = angStr + QChar(0x00b0); break; default: displayText = ""; } if (!displayText.isEmpty()) { painter->drawText( p.x + offset, p.y - 3*offset - fm.height(), fm.width(displayText)+10, fm.height()+10, Qt::AlignHCenter | Qt::AlignVCenter, displayText, NULL); } }