mirror of https://github.com/JakubMelka/PDF4QT.git
Bugfix: Text selection
This commit is contained in:
parent
a6ce36a00c
commit
9b9734ffd1
|
@ -338,12 +338,16 @@ PDFTextSelection PDFTextLayout::createTextSelection(PDFInteger pageIndex, const
|
||||||
QRectF rect(xMin, yMin, xMax - xMin, yMax - yMin);
|
QRectF rect(xMin, yMin, xMax - xMin, yMax - yMin);
|
||||||
QPainterPath rectPath;
|
QPainterPath rectPath;
|
||||||
rectPath.addRect(rect);
|
rectPath.addRect(rect);
|
||||||
QPainterPath intersectionPath = block.getBoundingBox().intersected(rectPath);
|
const QPainterPath& boundingBoxPath = block.getBoundingBox();
|
||||||
|
QPainterPath intersectionPath = boundingBoxPath.intersected(rectPath);
|
||||||
if (!intersectionPath.isEmpty())
|
if (!intersectionPath.isEmpty())
|
||||||
{
|
{
|
||||||
QRectF intersectionRect = intersectionPath.boundingRect();
|
QRectF intersectionRect = intersectionPath.boundingRect();
|
||||||
Q_ASSERT(intersectionRect.isValid());
|
Q_ASSERT(intersectionRect.isValid());
|
||||||
|
|
||||||
|
bool isTopPointAboveText = false;
|
||||||
|
bool isBottomPointBelowText = false;
|
||||||
|
|
||||||
const PDFTextLines& lines = block.getLines();
|
const PDFTextLines& lines = block.getLines();
|
||||||
auto itLineA = std::find_if(lines.cbegin(), lines.cend(), [pointA](const PDFTextLine& line) { return line.getBoundingBox().contains(pointA); });
|
auto itLineA = std::find_if(lines.cbegin(), lines.cend(), [pointA](const PDFTextLine& line) { return line.getBoundingBox().contains(pointA); });
|
||||||
auto itLineB = std::find_if(lines.cbegin(), lines.cend(), [pointB](const PDFTextLine& line) { return line.getBoundingBox().contains(pointB); });
|
auto itLineB = std::find_if(lines.cbegin(), lines.cend(), [pointB](const PDFTextLine& line) { return line.getBoundingBox().contains(pointB); });
|
||||||
|
@ -361,10 +365,24 @@ PDFTextSelection PDFTextLayout::createTextSelection(PDFInteger pageIndex, const
|
||||||
{
|
{
|
||||||
// Otherwise points are not in the same line. Then start point will be
|
// Otherwise points are not in the same line. Then start point will be
|
||||||
// point top of the second point. Bottom point will mark end of selection.
|
// point top of the second point. Bottom point will mark end of selection.
|
||||||
if (pointA.y() > pointB.y())
|
if (pointA.y() < pointB.y())
|
||||||
{
|
{
|
||||||
std::swap(pointA, pointB);
|
std::swap(pointA, pointB);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QRectF rect = boundingBoxPath.controlPointRect();
|
||||||
|
|
||||||
|
// If start point is above the text block, move start point to the left.
|
||||||
|
if (rect.bottom() < pointA.y())
|
||||||
|
{
|
||||||
|
pointA.setX(rect.left());
|
||||||
|
isTopPointAboveText = true;
|
||||||
|
}
|
||||||
|
if (rect.top() > pointB.y())
|
||||||
|
{
|
||||||
|
pointB.setX(rect.right());
|
||||||
|
isBottomPointBelowText = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now, we have pointA as start point and pointB as end point. We must found
|
// Now, we have pointA as start point and pointB as end point. We must found
|
||||||
|
@ -409,6 +427,22 @@ PDFTextSelection PDFTextLayout::createTextSelection(PDFInteger pageIndex, const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isTopPointAboveText && !lines.empty())
|
||||||
|
{
|
||||||
|
ptrA.pageIndex = pageIndex;
|
||||||
|
ptrA.blockIndex = blockId;
|
||||||
|
ptrA.lineIndex = 0;
|
||||||
|
ptrA.characterIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isBottomPointBelowText && !lines.empty())
|
||||||
|
{
|
||||||
|
ptrB.pageIndex = pageIndex;
|
||||||
|
ptrB.blockIndex = blockId;
|
||||||
|
ptrB.lineIndex = lines.size() - 1;
|
||||||
|
ptrB.characterIndex = lines.back().getCharacters().size() - 1;
|
||||||
|
}
|
||||||
|
|
||||||
// If we have filled the pointers, add them to the selection
|
// If we have filled the pointers, add them to the selection
|
||||||
if (ptrA.isValid() && ptrB.isValid())
|
if (ptrA.isValid() && ptrB.isValid())
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue