void MainWindow::documentExport(void) { Canvas *currCanvas = canvas(); QString currFilename = currCanvas->filename(); currFilename.chop(4); if (currFilename.isEmpty()) { // Determine the working directory. QSettings settings; QString workingDir(QDir::homePath()); QVariant workingDirSetting = settings.value("workingDirectory"); if (workingDirSetting.isValid()) { workingDir = workingDirSetting.toString(); } currFilename = workingDir + "/untitled"; } QString filename = QFileDialog::getSaveFileName(this, tr("Export Diagram"), currFilename, tr("SVG (*.svg);;PDF (*.pdf);;Postscript (*.ps)")); if (filename.isEmpty()) { return; } QRectF pageRect = currCanvas->pageRect(); if (pageRect.size().isEmpty()) { // There is no page set, so use a page equal to diagram bounds double padding = 10; pageRect = expandRect(diagramBoundingRect(currCanvas->items()), padding); } QFileInfo file(filename); if (file.suffix() == "svg") { QSvgGenerator generator; generator.setFileName(filename); QRectF targetRect(QPointF(0, 0), currCanvas->sceneRect().size()); QPointF topLeft = pageRect.topLeft() - currCanvas->sceneRect().topLeft(); QRectF viewbox(topLeft, pageRect.size()); generator.setSize(viewbox.size().toSize()); generator.setViewBox(viewbox); generator.setTitle(QFileInfo(filename).fileName()); generator.setDescription(tr("This file was exported from Dunnart. " "http://www.dunnart.org/")); QPainter painter; if (painter.begin(&generator)) { painter.setRenderHint(QPainter::Antialiasing); currCanvas->setRenderingForPrinting(true); currCanvas->render(&painter, targetRect, currCanvas->sceneRect(), Qt::IgnoreAspectRatio); currCanvas->setRenderingForPrinting(false); painter.end(); } else { qDebug("Export SVG painter failed to begin."); } } else { // Use QPrinter for PDF and PS. QPrinter printer; printer.setOutputFileName(filename); printer.setPaperSize(pageRect.size(), QPrinter::Millimeter); QPainter painter; if (painter.begin(&printer)) { painter.setRenderHint(QPainter::Antialiasing); currCanvas->setRenderingForPrinting(true); currCanvas->render(&painter, QRectF(), expandRect(pageRect, -3), Qt::IgnoreAspectRatio); currCanvas->setRenderingForPrinting(false); } else { qDebug("Export PDF/PS painter failed to begin."); } } }
void paintEvent(QPaintEvent *event) { Q_UNUSED (event) // XXX Maybe we should cache this and recompute separately for // transform changes, shape movement and viewport changes? // Draw a white background. QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(Qt::white); painter.setBrush(Qt::white); QRectF drawingRect = QRectF(0, 0, width(), height()); painter.drawRect(drawingRect); if (m_canvasview == NULL) { return; } // Compute the diagram bounds. Canvas *canvas = m_canvasview->canvas(); QRectF diagramBounds = diagramBoundingRect(canvas->items()); double buffer = 50; diagramBounds.adjust(-buffer, -buffer, buffer, buffer); // Compute the scale to with the drawing into the overview rect. qreal xscale = drawingRect.width() / diagramBounds.width(); qreal yscale = drawingRect.height() / diagramBounds.height(); // Choose the smallest of the two scale values. qreal scale = std::min(xscale, yscale); // Scale uniformly, and transform to center in the overview. QTransform scaleTransform = QTransform::fromScale(scale, scale); QRectF targetRect = scaleTransform.mapRect(diagramBounds); QPointF diff = drawingRect.center() - targetRect.center(); m_transform = QTransform(); m_transform.translate(diff.x(), diff.y()); m_transform.scale(scale, scale); // Draw edges in overview for each connector on the canvas. painter.setPen(QColor(0, 0, 0, 100)); QList<CanvasItem *> items = canvas->items(); for (int i = 0; i < items.count(); ++i) { Connector *connector = dynamic_cast<Connector *> (items.at(i)); if (connector) { QPair<ShapeObj *, ShapeObj *> endShapes = connector->getAttachedShapes(); if (!endShapes.first || !endShapes.second) { continue; } QLineF line(endShapes.first->centrePos(), endShapes.second->centrePos()); painter.drawLine(m_transform.map(line)); } } // Draw Rectangles in overview for each shape on the canvas. painter.setPen(Qt::black); painter.setBrush(Qt::darkGray); QRectF shapeRect; for (int i = 0; i < items.count(); ++i) { ShapeObj *shape = dynamic_cast<ShapeObj *> (items.at(i)); if (shape) { shapeRect.setSize(shape->size()); shapeRect.moveCenter(shape->centrePos()); painter.drawRect(m_transform.mapRect(shapeRect)); } } // Show where the visible viewport is (by making everything // outside this have a light grey overlay). QColor grey(0, 0, 0, 60); painter.setPen(QPen(Qt::transparent)); painter.setBrush(QBrush(grey)); QRectF viewRect = m_transform.mapRect(m_canvasview->viewportRect()); QPolygon polygon = QPolygon(drawingRect.toRect()).subtracted( QPolygon(viewRect.toRect())); painter.drawPolygon(polygon); }