Editor plugin: Bugfixing

This commit is contained in:
Jakub Melka
2024-06-09 18:29:38 +02:00
parent f78fb54607
commit b43b4c1874
6 changed files with 80 additions and 17 deletions

View File

@ -193,7 +193,12 @@ bool EditorPlugin::save()
{ {
pdf::PDFDocumentModifier modifier(m_document); pdf::PDFDocumentModifier modifier(m_document);
std::set<pdf::PDFInteger> pageIndices = m_scene.getPageIndices(); std::set<pdf::PDFInteger> pageIndices;
for (const auto& item : m_editedPageContent)
{
pageIndices.insert(item.first);
}
auto elementsByPage = m_scene.getElementsByPage(); auto elementsByPage = m_scene.getElementsByPage();
for (pdf::PDFInteger pageIndex : pageIndices) for (pdf::PDFInteger pageIndex : pageIndices)
{ {
@ -221,6 +226,8 @@ bool EditorPlugin::save()
const pdf::PDFPageContentImageElement* elementImage = element->asElementImage(); const pdf::PDFPageContentImageElement* elementImage = element->asElementImage();
const pdf::PDFPageContentElementTextBox* elementTextBox = element->asElementTextBox(); const pdf::PDFPageContentElementTextBox* elementTextBox = element->asElementTextBox();
// TODO: Impelement all things
if (editedElement) if (editedElement)
{ {
contentStreamBuilder.writeEditedElement(editedElement->getElement()); contentStreamBuilder.writeEditedElement(editedElement->getElement());

View File

@ -357,15 +357,37 @@ void PDFPageContentEditorContentStreamBuilder::writePainterPath(QTextStream& str
case QPainterPath::MoveToElement: case QPainterPath::MoveToElement:
stream << element.x << " " << element.y << " m" << Qt::endl; stream << element.x << " " << element.y << " m" << Qt::endl;
break; break;
case QPainterPath::LineToElement: case QPainterPath::LineToElement:
stream << element.x << " " << element.y << " l" << Qt::endl; stream << element.x << " " << element.y << " l" << Qt::endl;
break; break;
case QPainterPath::CurveToElement: case QPainterPath::CurveToElement:
stream << element.x << " " << element.y << " c" << Qt::endl; stream << element.x << " " << element.y << " ";
++i;
while (i < elementCount)
{
QPainterPath::Element currentElement = path.elementAt(i);
if (currentElement.type == QPainterPath::CurveToDataElement)
{
++i;
stream << currentElement.x << " " << currentElement.y << " ";
}
else
{
--i;
break;
}
}
stream << " c" << Qt::endl;
break; break;
case QPainterPath::CurveToDataElement: case QPainterPath::CurveToDataElement:
stream << element.x << " " << element.y << " "; stream << element.x << " " << element.y << " ";
break; break;
default: default:
break; break;
} }

View File

@ -789,5 +789,4 @@ void PDFEditedPageContentElementText::optimize()
} }
} }
} // namespace pdf } // namespace pdf

View File

@ -166,7 +166,7 @@ void PDFCreatePCElementRectangleTool::drawPage(QPainter* painter,
m_element->setPageIndex(pageIndex); m_element->setPageIndex(pageIndex);
m_element->setRectangle(rectangle); m_element->setRectangle(rectangle);
m_element->drawPage(painter, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); m_element->drawPage(painter, m_scene, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors);
} }
const PDFPageContentElement* PDFCreatePCElementRectangleTool::getElement() const const PDFPageContentElement* PDFCreatePCElementRectangleTool::getElement() const
@ -262,7 +262,7 @@ void PDFCreatePCElementLineTool::drawPage(QPainter* painter,
m_element->setLine(line); m_element->setLine(line);
} }
m_element->drawPage(painter, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); m_element->drawPage(painter, m_scene, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors);
} }
const PDFPageContentElement* PDFCreatePCElementLineTool::getElement() const const PDFPageContentElement* PDFCreatePCElementLineTool::getElement() const
@ -366,7 +366,7 @@ void PDFCreatePCElementImageTool::drawPage(QPainter* painter,
painter->drawRect(rectangle); painter->drawRect(rectangle);
} }
m_element->drawPage(painter, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); m_element->drawPage(painter, m_scene, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors);
} }
const PDFPageContentElement* PDFCreatePCElementImageTool::getElement() const const PDFPageContentElement* PDFCreatePCElementImageTool::getElement() const
@ -556,7 +556,7 @@ void PDFCreatePCElementFreehandCurveTool::drawPage(QPainter* painter,
return; return;
} }
m_element->drawPage(painter, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); m_element->drawPage(painter, m_scene, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors);
} }
const PDFPageContentElement* PDFCreatePCElementFreehandCurveTool::getElement() const const PDFPageContentElement* PDFCreatePCElementFreehandCurveTool::getElement() const

View File

@ -270,6 +270,7 @@ void PDFPageContentElementRectangle::setRectangle(const QRectF& newRectangle)
} }
void PDFPageContentElementRectangle::drawPage(QPainter* painter, void PDFPageContentElementRectangle::drawPage(QPainter* painter,
const pdf::PDFPageContentScene* scene,
PDFInteger pageIndex, PDFInteger pageIndex,
const PDFPrecompiledPage* compiledPage, const PDFPrecompiledPage* compiledPage,
PDFTextLayoutGetter& layoutGetter, PDFTextLayoutGetter& layoutGetter,
@ -279,6 +280,7 @@ void PDFPageContentElementRectangle::drawPage(QPainter* painter,
Q_UNUSED(compiledPage); Q_UNUSED(compiledPage);
Q_UNUSED(layoutGetter); Q_UNUSED(layoutGetter);
Q_UNUSED(errors); Q_UNUSED(errors);
Q_UNUSED(scene);
if (pageIndex != getPageIndex()) if (pageIndex != getPageIndex())
{ {
@ -663,7 +665,7 @@ void PDFPageContentScene::drawElements(QPainter* painter,
continue; continue;
} }
element->drawPage(painter, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); element->drawPage(painter, this, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors);
} }
} }
@ -977,6 +979,7 @@ PDFPageContentElementLine* PDFPageContentElementLine::clone() const
} }
void PDFPageContentElementLine::drawPage(QPainter* painter, void PDFPageContentElementLine::drawPage(QPainter* painter,
const pdf::PDFPageContentScene* scene,
PDFInteger pageIndex, PDFInteger pageIndex,
const PDFPrecompiledPage* compiledPage, const PDFPrecompiledPage* compiledPage,
PDFTextLayoutGetter& layoutGetter, PDFTextLayoutGetter& layoutGetter,
@ -986,6 +989,7 @@ void PDFPageContentElementLine::drawPage(QPainter* painter,
Q_UNUSED(compiledPage); Q_UNUSED(compiledPage);
Q_UNUSED(layoutGetter); Q_UNUSED(layoutGetter);
Q_UNUSED(errors); Q_UNUSED(errors);
Q_UNUSED(scene);
if (pageIndex != getPageIndex()) if (pageIndex != getPageIndex())
{ {
@ -1159,15 +1163,17 @@ PDFPageContentImageElement* PDFPageContentImageElement::clone() const
} }
void PDFPageContentImageElement::drawPage(QPainter* painter, void PDFPageContentImageElement::drawPage(QPainter* painter,
PDFInteger pageIndex, const pdf::PDFPageContentScene* scene,
const PDFPrecompiledPage* compiledPage, PDFInteger pageIndex,
PDFTextLayoutGetter& layoutGetter, const PDFPrecompiledPage* compiledPage,
const QTransform& pagePointToDevicePointMatrix, PDFTextLayoutGetter& layoutGetter,
QList<PDFRenderError>& errors) const const QTransform& pagePointToDevicePointMatrix,
QList<PDFRenderError>& errors) const
{ {
Q_UNUSED(compiledPage); Q_UNUSED(compiledPage);
Q_UNUSED(layoutGetter); Q_UNUSED(layoutGetter);
Q_UNUSED(errors); Q_UNUSED(errors);
Q_UNUSED(scene);
if (pageIndex != getPageIndex() || !getRectangle().isValid()) if (pageIndex != getPageIndex() || !getRectangle().isValid())
{ {
@ -1286,6 +1292,7 @@ PDFPageContentElementDot* PDFPageContentElementDot::clone() const
} }
void PDFPageContentElementDot::drawPage(QPainter* painter, void PDFPageContentElementDot::drawPage(QPainter* painter,
const pdf::PDFPageContentScene* scene,
PDFInteger pageIndex, PDFInteger pageIndex,
const PDFPrecompiledPage* compiledPage, const PDFPrecompiledPage* compiledPage,
PDFTextLayoutGetter& layoutGetter, PDFTextLayoutGetter& layoutGetter,
@ -1295,6 +1302,7 @@ void PDFPageContentElementDot::drawPage(QPainter* painter,
Q_UNUSED(compiledPage); Q_UNUSED(compiledPage);
Q_UNUSED(layoutGetter); Q_UNUSED(layoutGetter);
Q_UNUSED(errors); Q_UNUSED(errors);
Q_UNUSED(scene);
if (pageIndex != getPageIndex()) if (pageIndex != getPageIndex())
{ {
@ -1374,6 +1382,7 @@ PDFPageContentElementFreehandCurve* PDFPageContentElementFreehandCurve::clone()
} }
void PDFPageContentElementFreehandCurve::drawPage(QPainter* painter, void PDFPageContentElementFreehandCurve::drawPage(QPainter* painter,
const pdf::PDFPageContentScene* scene,
PDFInteger pageIndex, PDFInteger pageIndex,
const PDFPrecompiledPage* compiledPage, const PDFPrecompiledPage* compiledPage,
PDFTextLayoutGetter& layoutGetter, PDFTextLayoutGetter& layoutGetter,
@ -1383,6 +1392,7 @@ void PDFPageContentElementFreehandCurve::drawPage(QPainter* painter,
Q_UNUSED(compiledPage); Q_UNUSED(compiledPage);
Q_UNUSED(layoutGetter); Q_UNUSED(layoutGetter);
Q_UNUSED(errors); Q_UNUSED(errors);
Q_UNUSED(scene);
if (pageIndex != getPageIndex()) if (pageIndex != getPageIndex())
{ {
@ -2334,7 +2344,7 @@ void PDFPageContentElementManipulator::drawPage(QPainter* painter,
for (const auto& manipulatedElement : m_manipulatedElements) for (const auto& manipulatedElement : m_manipulatedElements)
{ {
manipulatedElement->drawPage(painter, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors); manipulatedElement->drawPage(painter, m_scene, pageIndex, compiledPage, layoutGetter, pagePointToDevicePointMatrix, errors);
} }
} }
} }
@ -2399,6 +2409,7 @@ PDFPageContentElementTextBox* PDFPageContentElementTextBox::clone() const
} }
void PDFPageContentElementTextBox::drawPage(QPainter* painter, void PDFPageContentElementTextBox::drawPage(QPainter* painter,
const pdf::PDFPageContentScene* scene,
PDFInteger pageIndex, PDFInteger pageIndex,
const PDFPrecompiledPage* compiledPage, const PDFPrecompiledPage* compiledPage,
PDFTextLayoutGetter& layoutGetter, PDFTextLayoutGetter& layoutGetter,
@ -2408,6 +2419,7 @@ void PDFPageContentElementTextBox::drawPage(QPainter* painter,
Q_UNUSED(compiledPage); Q_UNUSED(compiledPage);
Q_UNUSED(layoutGetter); Q_UNUSED(layoutGetter);
Q_UNUSED(errors); Q_UNUSED(errors);
Q_UNUSED(scene);
if (pageIndex != getPageIndex()) if (pageIndex != getPageIndex())
{ {
@ -2580,6 +2592,7 @@ PDFPageContentElementEdited* PDFPageContentElementEdited::clone() const
} }
void PDFPageContentElementEdited::drawPage(QPainter* painter, void PDFPageContentElementEdited::drawPage(QPainter* painter,
const pdf::PDFPageContentScene* scene,
PDFInteger pageIndex, PDFInteger pageIndex,
const PDFPrecompiledPage* compiledPage, const PDFPrecompiledPage* compiledPage,
PDFTextLayoutGetter& layoutGetter, PDFTextLayoutGetter& layoutGetter,
@ -2593,13 +2606,22 @@ void PDFPageContentElementEdited::drawPage(QPainter* painter,
Q_UNUSED(layoutGetter); Q_UNUSED(layoutGetter);
Q_UNUSED(errors); Q_UNUSED(errors);
QRectF clipRect = m_element->getBoundingBox();
painter->setWorldTransform(QTransform(pagePointToDevicePointMatrix), true); painter->setWorldTransform(QTransform(pagePointToDevicePointMatrix), true);
painter->setPen(Qt::SolidLine); painter->setPen(Qt::SolidLine);
painter->setBrush(Qt::NoBrush); painter->setBrush(Qt::NoBrush);
painter->setFont(QApplication::font()); painter->setFont(QApplication::font());
painter->setRenderHint(QPainter::Antialiasing); painter->setRenderHint(QPainter::Antialiasing);
painter->setClipRect(clipRect, Qt::IntersectClip);
const pdf::PDFPage* page = scene->getDocument()->getCatalog()->getPage(pageIndex);
QRectF mediaBox = page->getMediaBox();
if (mediaBox.isValid())
{
QPainterPath path;
path.addPolygon(mediaBox);
painter->setClipPath(path, Qt::IntersectClip);
}
painter->setTransform(m_element->getTransform(), true); painter->setTransform(m_element->getTransform(), true);
if (const PDFEditedPageContentElementImage* imageElement = m_element->asImage()) if (const PDFEditedPageContentElementImage* imageElement = m_element->asImage())

View File

@ -55,6 +55,7 @@ public:
virtual PDFPageContentElement* clone() const = 0; virtual PDFPageContentElement* clone() const = 0;
virtual void drawPage(QPainter* painter, virtual void drawPage(QPainter* painter,
const PDFPageContentScene* scene,
PDFInteger pageIndex, PDFInteger pageIndex,
const PDFPrecompiledPage* compiledPage, const PDFPrecompiledPage* compiledPage,
PDFTextLayoutGetter& layoutGetter, PDFTextLayoutGetter& layoutGetter,
@ -167,6 +168,7 @@ public:
void setRectangle(const QRectF& newRectangle); void setRectangle(const QRectF& newRectangle);
virtual void drawPage(QPainter* painter, virtual void drawPage(QPainter* painter,
const PDFPageContentScene* scene,
PDFInteger pageIndex, PDFInteger pageIndex,
const PDFPrecompiledPage* compiledPage, const PDFPrecompiledPage* compiledPage,
PDFTextLayoutGetter& layoutGetter, PDFTextLayoutGetter& layoutGetter,
@ -202,6 +204,7 @@ public:
}; };
virtual void drawPage(QPainter* painter, virtual void drawPage(QPainter* painter,
const PDFPageContentScene* scene,
PDFInteger pageIndex, PDFInteger pageIndex,
const PDFPrecompiledPage* compiledPage, const PDFPrecompiledPage* compiledPage,
PDFTextLayoutGetter& layoutGetter, PDFTextLayoutGetter& layoutGetter,
@ -236,6 +239,7 @@ public:
virtual PDFPageContentElementDot* clone() const override; virtual PDFPageContentElementDot* clone() const override;
virtual void drawPage(QPainter* painter, virtual void drawPage(QPainter* painter,
const PDFPageContentScene* scene,
PDFInteger pageIndex, PDFInteger pageIndex,
const PDFPrecompiledPage* compiledPage, const PDFPrecompiledPage* compiledPage,
PDFTextLayoutGetter& layoutGetter, PDFTextLayoutGetter& layoutGetter,
@ -266,6 +270,7 @@ public:
virtual PDFPageContentElementFreehandCurve* clone() const override; virtual PDFPageContentElementFreehandCurve* clone() const override;
virtual void drawPage(QPainter* painter, virtual void drawPage(QPainter* painter,
const PDFPageContentScene* scene,
PDFInteger pageIndex, PDFInteger pageIndex,
const PDFPrecompiledPage* compiledPage, const PDFPrecompiledPage* compiledPage,
PDFTextLayoutGetter& layoutGetter, PDFTextLayoutGetter& layoutGetter,
@ -302,6 +307,7 @@ public:
virtual PDFPageContentImageElement* clone() const override; virtual PDFPageContentImageElement* clone() const override;
virtual void drawPage(QPainter* painter, virtual void drawPage(QPainter* painter,
const PDFPageContentScene* scene,
PDFInteger pageIndex, PDFInteger pageIndex,
const PDFPrecompiledPage* compiledPage, const PDFPrecompiledPage* compiledPage,
PDFTextLayoutGetter& layoutGetter, PDFTextLayoutGetter& layoutGetter,
@ -341,6 +347,7 @@ public:
void setRectangle(const QRectF& newRectangle) { m_rectangle = newRectangle; } void setRectangle(const QRectF& newRectangle) { m_rectangle = newRectangle; }
virtual void drawPage(QPainter* painter, virtual void drawPage(QPainter* painter,
const PDFPageContentScene* scene,
PDFInteger pageIndex, PDFInteger pageIndex,
const PDFPrecompiledPage* compiledPage, const PDFPrecompiledPage* compiledPage,
PDFTextLayoutGetter& layoutGetter, PDFTextLayoutGetter& layoutGetter,
@ -383,7 +390,13 @@ public:
virtual ~PDFPageContentElementEdited(); virtual ~PDFPageContentElementEdited();
virtual PDFPageContentElementEdited* clone() const override; virtual PDFPageContentElementEdited* clone() const override;
virtual void drawPage(QPainter* painter, PDFInteger pageIndex, const PDFPrecompiledPage* compiledPage, PDFTextLayoutGetter& layoutGetter, const QTransform& pagePointToDevicePointMatrix, QList<PDFRenderError>& errors) const override; virtual void drawPage(QPainter* painter,
const PDFPageContentScene* scene,
PDFInteger pageIndex,
const PDFPrecompiledPage* compiledPage,
PDFTextLayoutGetter& layoutGetter,
const QTransform& pagePointToDevicePointMatrix,
QList<PDFRenderError>& errors) const override;
virtual uint getManipulationMode(const QPointF& point, PDFReal snapPointDistanceThreshold) const override; virtual uint getManipulationMode(const QPointF& point, PDFReal snapPointDistanceThreshold) const override;
virtual void performManipulation(uint mode, const QPointF& offset) override; virtual void performManipulation(uint mode, const QPointF& offset) override;
virtual QRectF getBoundingBox() const override; virtual QRectF getBoundingBox() const override;