diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.cpp b/src/Mod/TechDraw/Gui/MDIViewPage.cpp index 15467bc1d1..6278a304ef 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.cpp +++ b/src/Mod/TechDraw/Gui/MDIViewPage.cpp @@ -288,9 +288,9 @@ void MDIViewPage::printPdf() Gui::WaitCursor wc; std::string utf8Content = fn.toUtf8().constData(); - m_scene->setExporting(true); + m_scene->setExportingPdf(true); printPdf(utf8Content); - m_scene->setExporting(false); + m_scene->setExportingPdf(false); } void MDIViewPage::printPdf(std::string file) diff --git a/src/Mod/TechDraw/Gui/QGIRichAnno.cpp b/src/Mod/TechDraw/Gui/QGIRichAnno.cpp index 6890195794..97bb07fe1a 100644 --- a/src/Mod/TechDraw/Gui/QGIRichAnno.cpp +++ b/src/Mod/TechDraw/Gui/QGIRichAnno.cpp @@ -54,7 +54,7 @@ using namespace TechDrawGui; //************************************************************** QGIRichAnno::QGIRichAnno() : - m_isExporting(false), m_hasHover(false) + m_isExportingPdf(false), m_isExportingSvg(false), m_hasHover(false) { setHandlesChildEvents(false); setAcceptHoverEvents(false); @@ -78,18 +78,6 @@ QGIRichAnno::QGIRichAnno() : } -//void QGIRichAnno::select(bool state) -//{ -// setSelected(state); -// draw(); -//} - -//void QGIRichAnno::hover(bool state) -//{ -// m_hasHover = state; -// draw(); -//} - void QGIRichAnno::updateView(bool update) { // Base::Console().Message("QGIRA::updateView() - %s\n", getViewName()); @@ -149,66 +137,57 @@ void QGIRichAnno::setTextItem() TechDraw::DrawRichAnno* annoFeat = getFeature(); QString inHtml = QString::fromUtf8(annoFeat->AnnoText.getValue()); - //don't do this multiplication if exporting to SVG as other apps interpret - //font sizes differently from QGraphicsTextItem (?) - if (!getExporting()) { - //convert point font sizes to (Rez, mm) font sizes - QRegularExpression rxFontSize(QString::fromUtf8("font-size:([0-9]*)pt;")); - QRegularExpressionMatch match; - double mmPerPoint = 0.353; - double sizeConvert = Rez::getRezFactor() * mmPerPoint; - int pos = 0; - QStringList findList; - QStringList replList; - while ((pos = inHtml.indexOf(rxFontSize, pos, &match)) != -1) { - QString found = match.captured(0); - findList << found; - QString qsOldSize = match.captured(1); + QRegularExpression rxFontSize(QString::fromUtf8("font-size:([0-9]*)pt;")); + QRegularExpressionMatch match; + double mmPerPoint = 0.353; // 25.4 mm/in / 72 points/inch + double sceneUnitsPerPoint = Rez::getRezFactor() * mmPerPoint; // scene units per point: 3.53 + int pos = 0; + QStringList findList; + QStringList replList; + while ((pos = inHtml.indexOf(rxFontSize, pos, &match)) != -1) { + QString found = match.captured(0); + findList << found; + QString qsOldSize = match.captured(1); - QString repl = found; - double newSize = qsOldSize.toDouble(); - newSize = newSize * sizeConvert; - QString qsNewSize = QString::number(newSize, 'f', 2); - repl.replace(qsOldSize, qsNewSize); - replList << repl; - pos += match.capturedLength(); - } - QString outHtml = inHtml; - int iRepl = 0; - //TODO: check list for duplicates? - for ( ; iRepl < findList.size(); iRepl++) { - outHtml = outHtml.replace(findList[iRepl], replList[iRepl]); - } + QString repl = found; + double newSize = qsOldSize.toDouble(); - m_text->setTextWidth(Rez::guiX(annoFeat->MaxWidth.getValue())); - m_text->setHtml(outHtml); -// setLineSpacing(50); //this has no effect on the display?! -// m_text->update(); - - if (annoFeat->ShowFrame.getValue()) { - QRectF r = m_text->boundingRect().adjusted(1, 1,-1, -1); - m_rect->setPen(rectPen()); - m_rect->setBrush(Qt::NoBrush); - m_rect->setRect(r); - m_rect->show(); + // The font size in the QGraphicsTextItem html is interpreted differently + // in svg rendering compared to the screen or pdf? The calculation for + // screen/pdf makes sense (scene units) and mm/point makes sense for svg + // but the requirement to divide by 2 is a mystery. + if (getExportingSvg()) { + newSize = newSize / ( 2.0 * mmPerPoint); } else { - m_rect->hide(); + newSize = newSize * sceneUnitsPerPoint; } + QString qsNewSize = QString::number(newSize, 'f', 2); + repl.replace(qsOldSize, qsNewSize); + replList << repl; + pos += match.capturedLength(); + } + QString outHtml = inHtml; + int iRepl = 0; + //TODO: check list for duplicates? + for ( ; iRepl < findList.size(); iRepl++) { + outHtml = outHtml.replace(findList[iRepl], replList[iRepl]); + } + + m_text->setTextWidth(Rez::guiX(annoFeat->MaxWidth.getValue())); + m_text->setHtml(outHtml); + if (getExportingSvg()) { + // lines are correctly spaced on screen or in pdf, but svg needs this + setLineSpacing(100); + } + + if (annoFeat->ShowFrame.getValue()) { + QRectF r = m_text->boundingRect().adjusted(1, 1,-1, -1); + m_rect->setPen(rectPen()); + m_rect->setBrush(Qt::NoBrush); + m_rect->setRect(r); + m_rect->show(); } else { - // don't force line wrap & strip formatting that doesn't export well! - double realWidth = m_text->boundingRect().width(); - m_text->setTextWidth(realWidth); - - QFont f = prefFont(); - double ptSize = prefPointSize(); - f.setPointSizeF(ptSize); - m_text->setFont(f); - - QString plainText = QTextDocumentFragment::fromHtml( inHtml ).toPlainText(); - m_text->setPlainText(plainText); - setLineSpacing(100); //this doesn't appear in the generated Svg, but does space the lines! m_rect->hide(); - m_rect->update(); } m_text->centerAt(0.0, 0.0); @@ -218,25 +197,16 @@ void QGIRichAnno::setTextItem() void QGIRichAnno::setLineSpacing(int lineSpacing) { //this line spacing should be px, but seems to be %? in any event, it does - //space out the lines. + //space out the lines QTextBlock block = m_text->document()->begin(); for (; block.isValid(); block = block.next()) { QTextCursor tc = QTextCursor(block); QTextBlockFormat fmt = block.blockFormat(); -// fmt.setTopMargin(lineSpacing); //no effect??? fmt.setBottomMargin(lineSpacing); //spaces out the lines! tc.setBlockFormat(fmt); -// } } } -//void QGIRichAnno::drawBorder() -//{ -//////Leaders have no border! -//// QGIView::drawBorder(); //good for debugging -//} - - TechDraw::DrawRichAnno* QGIRichAnno::getFeature() { TechDraw::DrawRichAnno* result = @@ -286,17 +256,6 @@ QFont QGIRichAnno::prefFont() return PreferencesGui::labelFontQFont(); } -double QGIRichAnno::prefPointSize() -{ -// Base::Console().Message("QGIRA::prefPointSize()\n"); - double fontSize = Preferences::dimFontSizeMM(); - //this conversion is only approximate. the factor changes for different fonts. -// double mmToPts = 2.83; //theoretical value - double mmToPts = 2.00; //practical value. seems to be reasonable for common fonts. - - return round(fontSize * mmToPts); -} - void QGIRichAnno::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event) { Q_UNUSED(event); diff --git a/src/Mod/TechDraw/Gui/QGIRichAnno.h b/src/Mod/TechDraw/Gui/QGIRichAnno.h index 3e4499d032..517bc1602c 100644 --- a/src/Mod/TechDraw/Gui/QGIRichAnno.h +++ b/src/Mod/TechDraw/Gui/QGIRichAnno.h @@ -74,25 +74,20 @@ public: virtual TechDraw::DrawRichAnno* getFeature(void); QPen rectPen() const; - void setExporting(bool b) { m_isExporting = b; } - bool getExporting(void) { return m_isExporting; } - - -public Q_SLOTS: -/* void textDragging(void);*/ -/* void textDragFinished(void);*/ -/* void hover(bool state);*/ -/* void select(bool state);*/ + void setExportingPdf(bool b) { m_isExportingPdf = b; } + bool getExportingPdf(void) { return m_isExportingPdf; } + void setExportingSvg(bool b) { m_isExportingSvg = b; } + bool getExportingSvg(void) { return m_isExportingSvg; } protected: virtual void draw() override; void setLineSpacing(int lineSpacing); - double prefPointSize(void); QFont prefFont(void); virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override; - bool m_isExporting; + bool m_isExportingPdf; + bool m_isExportingSvg; QGCustomText* m_text; bool m_hasHover; QGCustomRect* m_rect; diff --git a/src/Mod/TechDraw/Gui/QGSPage.cpp b/src/Mod/TechDraw/Gui/QGSPage.cpp index 346830b101..501e060a77 100644 --- a/src/Mod/TechDraw/Gui/QGSPage.cpp +++ b/src/Mod/TechDraw/Gui/QGSPage.cpp @@ -1051,7 +1051,7 @@ void QGSPage::redraw1View(TechDraw::DrawView* dView) } } -void QGSPage::setExporting(bool enable) +void QGSPage::setExportingPdf(bool enable) { QList sceneItems = items(); std::vector dvps; @@ -1063,7 +1063,7 @@ void QGSPage::setExporting(bool enable) dvps.push_back(qgiPart); } if (qgiRTA) { - qgiRTA->setExporting(enable); + qgiRTA->setExportingPdf(enable); } } for (auto& v : dvps) { @@ -1071,6 +1071,19 @@ void QGSPage::setExporting(bool enable) } } +// RichTextAnno needs to know when it is rendering an Svg as the font size +// is handled differently in Svg compared to the screen or Pdf. +void QGSPage::setExportingSvg(bool enable) +{ + QList sceneItems = items(); + for (auto& qgi : sceneItems) { + QGIRichAnno* qgiRTA = dynamic_cast(qgi); + if (qgiRTA) { + qgiRTA->setExportingSvg(enable); + } + } +} + void QGSPage::saveSvg(QString filename) { // TODO: We only have m_vpPage because constructor gets passed a view provider... @@ -1106,7 +1119,7 @@ void QGSPage::saveSvg(QString filename) bool saveState = m_vpPage->getFrameState(); m_vpPage->setFrameState(false); m_vpPage->setTemplateMarkers(false); - setExporting(true); + setExportingSvg(true); // Here we temporarily hide the page template, because Qt would otherwise convert the SVG template // texts into series of paths, making the later document edits practically unfeasible. @@ -1119,7 +1132,6 @@ void QGSPage::saveSvg(QString filename) } refreshViews(); - // viewport()->repaint(); double width = Rez::guiX(page->getPageWidth()); double height = Rez::guiX(page->getPageHeight()); @@ -1135,13 +1147,12 @@ void QGSPage::saveSvg(QString filename) m_vpPage->setFrameState(saveState); m_vpPage->setTemplateMarkers(saveState); - setExporting(false); + setExportingSvg(false); if (templateVisible && svgTemplate) { svgTemplate->show(); } refreshViews(); - // viewport()->repaint(); temporaryFile.close(); postProcessXml(temporaryFile, filename, pageName); diff --git a/src/Mod/TechDraw/Gui/QGSPage.h b/src/Mod/TechDraw/Gui/QGSPage.h index 99f7249656..63794b4b14 100644 --- a/src/Mod/TechDraw/Gui/QGSPage.h +++ b/src/Mod/TechDraw/Gui/QGSPage.h @@ -132,7 +132,8 @@ public: TechDraw::DrawPage* getDrawPage(); - void setExporting(bool enable); + void setExportingPdf(bool enable); + void setExportingSvg(bool enable); virtual void refreshViews(); /// Renders the page to SVG with filename. diff --git a/src/Mod/TechDraw/Gui/QGVPage.h b/src/Mod/TechDraw/Gui/QGVPage.h index 780d845821..7fa5ca5433 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.h +++ b/src/Mod/TechDraw/Gui/QGVPage.h @@ -97,8 +97,6 @@ public: TechDraw::DrawPage* getDrawPage(); - void setExporting(bool enable); - void makeGrid(int width, int height, double step); void showGrid(bool state) { m_showGrid = state; } void updateViewport() { viewport()->repaint(); }