38
39
#include "settings.h"
40
41
#include "rendertask.h"
47
using namespace qpdfview;
49
const qreal proxyPadding = 2.0;
51
bool modifiersUseMouseButton(Settings* settings, Qt::MouseButton mouseButton)
53
return ((settings->pageItem().copyToClipboardModifiers() | settings->pageItem().addAnnotationModifiers()) & mouseButton) != 0;
45
61
Settings* PageItem::s_settings = 0;
47
QCache< PageItem*, QPixmap > PageItem::s_cache;
49
63
PageItem::PageItem(Model::Page* page, int index, bool presentationMode, QGraphicsItem* parent) : QGraphicsObject(parent),
68
m_presentationMode(presentationMode),
73
m_rubberBandMode(ModifiersMode),
56
75
m_annotationOverlay(),
57
76
m_formFieldOverlay(),
58
m_presentationMode(presentationMode),
59
m_invertColors(false),
61
m_rubberBandMode(ModifiersMode),
65
m_devicePixelRatio(1.0),
67
m_rotation(RotateBy0),
69
79
m_normalizedTransform(),
76
83
if(s_settings == 0)
78
85
s_settings = Settings::instance();
81
s_cache.setMaxCost(s_settings->pageItem().cacheSize());
83
88
setAcceptHoverEvents(true);
85
m_renderTask = new RenderTask(this);
87
connect(m_renderTask, SIGNAL(finished()), SLOT(on_renderTask_finished()));
88
connect(m_renderTask, SIGNAL(imageReady(int,int,qreal,qreal,Rotation,bool,bool,QImage)), SLOT(on_renderTask_imageReady(int,int,qreal,qreal,Rotation,bool,bool,QImage)));
93
m_size = m_page->size();
90
setFlag(QGraphicsItem::ItemUsesExtendedStyleOption, s_settings->pageItem().useTiling());
91
setFlag(QGraphicsItem::ItemClipsToShape, s_settings->pageItem().trimMargins());
93
if(!s_settings->pageItem().useTiling())
95
TileItem* tile = new TileItem(this);
97
m_tileItems.resize(1);
98
m_tileItems.squeeze();
100
m_tileItems.replace(0, tile);
95
103
QTimer::singleShot(0, this, SLOT(loadInteractiveElements()));
115
120
QRectF PageItem::boundingRect() const
117
return m_boundingRect;
122
if(m_cropRect.isNull())
124
return m_boundingRect;
129
boundingRect.setLeft(m_boundingRect.left() + m_cropRect.left() * m_boundingRect.width());
130
boundingRect.setTop(m_boundingRect.top() + m_cropRect.top() * m_boundingRect.height());
131
boundingRect.setWidth(m_cropRect.width() * m_boundingRect.width());
132
boundingRect.setHeight(m_cropRect.height() * m_boundingRect.height());
120
void PageItem::paint(QPainter* painter, const QStyleOptionGraphicsItem*, QWidget*)
137
void PageItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget*)
122
paintPage(painter, cachedPixmap());
139
paintPage(painter, option->exposedRect);
124
141
paintLinks(painter);
125
142
paintFormFields(painter);
128
145
paintRubberBand(painter);
131
void PageItem::setInvertColors(bool invertColors)
133
m_invertColors = invertColors;
148
qreal PageItem::displayedWidth() const
150
const qreal cropWidth = m_cropRect.isNull() ? 1.0 : m_cropRect.width();
151
const qreal cropHeight = m_cropRect.isNull() ? 1.0 : m_cropRect.height();
153
switch(m_renderParam.rotation)
158
return m_renderParam.resolution.resolutionX / 72.0 * cropWidth * m_size.width();
161
return m_renderParam.resolution.resolutionX / 72.0 * cropHeight * m_size.height();
165
qreal PageItem::displayedHeight() const
167
const qreal cropHeight = m_cropRect.isNull() ? 1.0 : m_cropRect.height();
168
const qreal cropWidth = m_cropRect.isNull() ? 1.0 : m_cropRect.width();
170
switch(m_renderParam.rotation)
175
return m_renderParam.resolution.resolutionY / 72.0 * cropHeight * m_size.height();
178
return m_renderParam.resolution.resolutionY / 72.0 * cropWidth * m_size.width();
138
182
void PageItem::setHighlights(const QList< QRectF >& highlights)
202
251
void PageItem::setRotation(Rotation rotation)
204
if(m_rotation != rotation && rotation >= 0 && rotation < NumberOfRotations)
253
if(m_renderParam.rotation != rotation && rotation >= 0 && rotation < NumberOfRotations)
208
m_rotation = rotation;
257
m_renderParam.rotation = rotation;
210
259
prepareGeometryChange();
211
260
prepareGeometry();
215
void PageItem::refresh()
217
m_renderTask->cancel();
219
if(s_settings->pageItem().keepObsoletePixmaps() && s_cache.contains(this))
221
m_obsoletePixmap = *s_cache.object(this);
222
m_obsoleteTopLeft = m_boundingRect.topLeft();
223
m_obsoleteTransform = m_transform.inverted();
226
m_pixmap = QPixmap();
227
s_cache.remove(this);
264
void PageItem::setInvertColors(bool invertColors)
266
if(m_renderParam.invertColors != invertColors)
270
m_renderParam.invertColors = invertColors;
275
void PageItem::refresh(bool keepObsoletePixmaps, bool dropCachedPixmaps)
277
if(!s_settings->pageItem().useTiling())
279
m_tileItems.first()->refresh(keepObsoletePixmaps);
283
foreach(TileItem* tile, m_tileItems)
285
tile->refresh(keepObsoletePixmaps);
289
if(!keepObsoletePixmaps)
291
m_cropRect = QRectF();
294
if(dropCachedPixmaps)
296
TileItem::dropCachedPixmaps(this);
232
void PageItem::startRender(bool prefetch)
302
int PageItem::startRender(bool prefetch)
234
if(prefetch && s_cache.contains(this))
239
if(!m_renderTask->isRunning())
241
m_renderTask->start(m_page, m_resolutionX, m_resolutionY, effectiveDevicePixelRatio(), m_scaleFactor, m_rotation, m_invertColors, prefetch);
306
if(!s_settings->pageItem().useTiling())
308
cost += m_tileItems.first()->startRender(prefetch);
312
foreach(TileItem* tile, m_tileItems)
314
cost += tile->startRender(prefetch);
245
321
void PageItem::cancelRender()
247
m_renderTask->cancel();
249
m_pixmap = QPixmap();
250
m_obsoletePixmap = QPixmap();
253
void PageItem::on_renderTask_finished()
258
void PageItem::on_renderTask_imageReady(int resolutionX, int resolutionY, qreal devicePixelRatio, qreal scaleFactor, Rotation rotation, bool invertColors, bool prefetch, QImage image)
260
if(m_resolutionX != resolutionX || m_resolutionY != resolutionY
261
|| !qFuzzyCompare(effectiveDevicePixelRatio(), devicePixelRatio)
262
|| !qFuzzyCompare(m_scaleFactor, scaleFactor) || m_rotation != rotation
263
|| m_invertColors != invertColors)
272
const qreal extent = qMin(0.1 * m_boundingRect.width(), 0.1 * m_boundingRect.height());
273
const QRectF rect(0.01 * m_boundingRect.width(), 0.01 * m_boundingRect.height(), extent, extent);
275
image = QImage(qFloor(0.01 * m_boundingRect.width() + extent), qFloor(0.01 * m_boundingRect.height() + extent), QImage::Format_ARGB32);
276
image.fill(Qt::transparent);
278
QPainter painter(&image);
279
s_settings->pageItem().errorIcon().paint(&painter, rect.toRect());
284
QPixmap* pixmap = new QPixmap(QPixmap::fromImage(image));
286
int cost = pixmap->width() * pixmap->height() * pixmap->depth() / 8;
287
s_cache.insert(this, pixmap, cost);
323
if(!s_settings->pageItem().useTiling())
325
m_tileItems.first()->cancelRender();
291
if(!m_renderTask->wasCanceled())
329
foreach(TileItem* tile, m_tileItems)
293
m_pixmap = QPixmap::fromImage(image);
331
tile->cancelRender();
297
m_obsoletePixmap = QPixmap();
300
336
void PageItem::showAnnotationOverlay(Model::Annotation* selectedAnnotation)
432
468
void PageItem::mousePressEvent(QGraphicsSceneMouseEvent* event)
470
const Qt::KeyboardModifiers copyToClipboardModifiers = s_settings->pageItem().copyToClipboardModifiers();
471
const Qt::KeyboardModifiers addAnnotationModifiers = s_settings->pageItem().addAnnotationModifiers();
473
const bool copyToClipboardModifiersActive = event->modifiers() == copyToClipboardModifiers || ((event->buttons() & copyToClipboardModifiers) != 0);
474
const bool addAnnotationModifiersActive = event->modifiers() == addAnnotationModifiers || ((event->buttons() & addAnnotationModifiers) != 0);
436
478
if(m_rubberBandMode == ModifiersMode && !m_presentationMode
437
&& (event->modifiers() == Qt::NoModifier
438
|| event->modifiers() == s_settings->pageItem().copyToClipboardModifiers()
439
|| event->modifiers() == s_settings->pageItem().addAnnotationModifiers())
479
&& (event->modifiers() == Qt::NoModifier || copyToClipboardModifiersActive || addAnnotationModifiersActive)
440
480
&& (event->button() == Qt::LeftButton || event->button() == Qt::MidButton))
442
482
setCursor(Qt::CrossCursor);
444
if(event->modifiers() == s_settings->pageItem().copyToClipboardModifiers() && event->button() == Qt::LeftButton)
484
if(copyToClipboardModifiersActive && event->button() == Qt::LeftButton)
446
486
m_rubberBandMode = CopyToClipboardMode;
448
else if(event->modifiers() == s_settings->pageItem().addAnnotationModifiers() && event->button() == Qt::LeftButton)
488
else if(addAnnotationModifiersActive && event->button() == Qt::LeftButton)
450
490
m_rubberBandMode = AddAnnotationMode;
716
void PageItem::updateCropRect()
720
if(!s_settings->pageItem().useTiling())
722
cropRect = m_tileItems.first()->cropRect();
726
foreach(TileItem* tile, m_tileItems)
728
const QRect& tileRect = tile->rect();
729
const QRectF& tileCropRect = tile->cropRect();
731
if(tileCropRect.isNull())
737
const qreal left = (tileRect.left() + tileCropRect.left() * tileRect.width()) / m_boundingRect.width();
738
const qreal top = (tileRect.top() + tileCropRect.top() * tileRect.height()) / m_boundingRect.height();
739
const qreal width = tileCropRect.width() * tileRect.width() / m_boundingRect.width();
740
const qreal height = tileCropRect.height() * tileRect.height() / m_boundingRect.height();
742
cropRect = cropRect.united(QRectF(left, top, width, height));
746
if(m_cropRect.isNull() && !cropRect.isNull())
748
m_cropRect = cropRect;
750
prepareGeometryChange();
751
emit cropRectChanged();
657
755
void PageItem::copyToClipboard(const QPoint& screenPos)
661
const QAction* copyTextAction = menu.addAction(tr("Copy &text"));
662
QAction* useTextAsSelectionAction = menu.addAction(tr("Use text as &selection"));
759
QAction* copyTextAction = menu.addAction(tr("Copy &text"));
760
QAction* selectTextAction = menu.addAction(tr("&Select text"));
663
761
const QAction* copyImageAction = menu.addAction(tr("Copy &image"));
664
762
const QAction* saveImageToFileAction = menu.addAction(tr("Save image to &file..."));
666
useTextAsSelectionAction->setVisible(QApplication::clipboard()->supportsSelection());
764
const QString text = m_page->text(m_transform.inverted().mapRect(m_rubberBand));
766
copyTextAction->setVisible(!text.isEmpty());
767
selectTextAction->setVisible(!text.isEmpty() && QApplication::clipboard()->supportsSelection());
668
769
const QAction* action = menu.exec(screenPos);
670
if(action == copyTextAction || action == useTextAsSelectionAction)
771
if(action == copyTextAction || action == selectTextAction)
672
const QString text = m_page->text(m_transform.inverted().mapRect(m_rubberBand));
676
if(action == copyTextAction)
678
QApplication::clipboard()->setText(text);
682
QApplication::clipboard()->setText(text, QClipboard::Selection);
773
if(action == copyTextAction)
775
QApplication::clipboard()->setText(text);
779
QApplication::clipboard()->setText(text, QClipboard::Selection);
686
782
else if(action == copyImageAction || action == saveImageToFileAction)
688
784
const QRect rect = m_rubberBand.translated(-m_boundingRect.topLeft()).toRect();
689
const QImage image = s_cache.contains(this) ? s_cache.object(this)->copy(rect).toImage() : m_page->render(m_resolutionX * m_scaleFactor, m_scaleFactor * m_resolutionY, m_rotation, rect);
785
const QImage image = m_page->render(m_renderParam.resolution.resolutionX * m_renderParam.scaleFactor,
786
m_renderParam.resolution.resolutionY * m_renderParam.scaleFactor,
787
m_renderParam.rotation, rect);
691
789
if(!image.isNull())
750
void PageItem::removeAnnotation(Model::Annotation* annotation, const QPoint& screenPos)
848
void PageItem::showLinkContextMenu(Model::Link* link, const QPoint& screenPos)
854
const QAction* copyLinkAddressAction = menu.addAction(tr("&Copy link address"));
855
QAction* selectLinkAddressAction = menu.addAction(tr("&Select link address"));
857
selectLinkAddressAction->setVisible(QApplication::clipboard()->supportsSelection());
859
const QAction* action = menu.exec(screenPos);
861
if(action == copyLinkAddressAction)
863
QApplication::clipboard()->setText(link->urlOrFileName);
865
else if(action == selectLinkAddressAction)
867
QApplication::clipboard()->setText(link->urlOrFileName, QClipboard::Selection);
872
void PageItem::showAnnotationContextMenu(Model::Annotation* annotation, const QPoint& screenPos)
752
874
if(m_page->canAddAndRemoveAnnotations())
904
width /= m_scaleFactor;
905
height /= m_scaleFactor;
1025
width /= m_renderParam.scaleFactor;
1026
height /= m_renderParam.scaleFactor;
907
proxy->setScale(m_scaleFactor);
1028
proxy->setScale(m_renderParam.scaleFactor);
909
1030
proxy->setGeometry(QRectF(x - proxyPadding, y - proxyPadding, width + proxyPadding, height + proxyPadding));
912
qreal PageItem::effectiveDevicePixelRatio()
914
#if QT_VERSION >= QT_VERSION_CHECK(5,1,0)
916
return s_settings->pageItem().useDevicePixelRatio() ? m_devicePixelRatio : 1.0;
925
1033
void PageItem::prepareGeometry()
927
1035
m_transform.reset();
928
m_normalizedTransform.reset();
1037
m_transform.scale(m_renderParam.resolution.resolutionX * m_renderParam.scaleFactor / 72.0,
1038
m_renderParam.resolution.resolutionY * m_renderParam.scaleFactor / 72.0);
1040
switch(m_renderParam.rotation)
935
1045
case RotateBy90:
936
1046
m_transform.rotate(90.0);
937
m_normalizedTransform.rotate(90.0);
939
1048
case RotateBy180:
940
1049
m_transform.rotate(180.0);
941
m_normalizedTransform.rotate(180.0);
943
1051
case RotateBy270:
944
1052
m_transform.rotate(270.0);
945
m_normalizedTransform.rotate(270.0);
954
m_transform.scale(m_scaleFactor * m_resolutionX / 72.0, m_scaleFactor * m_resolutionY / 72.0);
955
m_normalizedTransform.scale(m_scaleFactor * m_resolutionX / 72.0 * m_size.width(), m_scaleFactor * m_resolutionY / 72.0 * m_size.height());
959
m_transform.scale(m_scaleFactor * m_resolutionY / 72.0, m_scaleFactor * m_resolutionX / 72.0);
960
m_normalizedTransform.scale(m_scaleFactor * m_resolutionY / 72.0 * m_size.width(), m_scaleFactor * m_resolutionX / 72.0 * m_size.height());
1056
m_normalizedTransform = m_transform;
1057
m_normalizedTransform.scale(m_size.width(), m_size.height());
964
1060
m_boundingRect = m_transform.mapRect(QRectF(QPointF(), m_size));
966
1062
m_boundingRect.setWidth(qRound(m_boundingRect.width()));
967
1063
m_boundingRect.setHeight(qRound(m_boundingRect.height()));
969
1068
updateAnnotationOverlay();
970
1069
updateFormFieldOverlay();
973
QPixmap PageItem::cachedPixmap()
1072
void PageItem::prepareTiling()
977
if(s_cache.contains(this))
979
pixmap = *s_cache.object(this);
983
if(!m_pixmap.isNull())
986
m_pixmap = QPixmap();
988
int cost = pixmap.width() * pixmap.height() * pixmap.depth() / 8;
989
s_cache.insert(this, new QPixmap(pixmap), cost);
1074
if(!s_settings->pageItem().useTiling())
1076
m_tileItems.first()->setRect(QRect(0, 0, m_boundingRect.width(), m_boundingRect.height()));
1082
const qreal pageWidth = m_boundingRect.width();
1083
const qreal pageHeight = m_boundingRect.height();
1085
const int tileSize = s_settings->pageItem().tileSize();
1087
int tileWidth = pageWidth < pageHeight ? tileSize * pageWidth / pageHeight : tileSize;
1088
int tileHeight = pageHeight < pageWidth ? tileSize * pageHeight / pageWidth : tileSize;
1090
const int columnCount = qCeil(pageWidth / tileWidth);
1091
const int rowCount = qCeil(pageHeight / tileHeight);
1093
tileWidth = qCeil(pageWidth / columnCount);
1094
tileHeight = qCeil(pageHeight / rowCount);
1097
const int newCount = columnCount * rowCount;
1098
const int oldCount = m_tileItems.count();
1100
for(int index = newCount; index < oldCount; ++index)
1102
m_tileItems.at(index)->deleteAfterRender();
1105
m_tileItems.resize(newCount);
1107
for(int index = oldCount; index < newCount; ++index)
1109
m_tileItems.replace(index, new TileItem(this));
1112
if(oldCount != newCount)
1114
foreach(TileItem* tile, m_tileItems)
1116
tile->dropObsoletePixmap();
1121
for(int column = 0; column < columnCount; ++column)
1123
for(int row = 0; row < rowCount; ++row)
1125
const int left = column > 0 ? column * tileWidth : 0.0;
1126
const int top = row > 0 ? row * tileHeight : 0.0;
1128
const int width = column < (columnCount - 1) ? tileWidth : pageWidth - left;
1129
const int height = row < (rowCount - 1) ? tileHeight : pageHeight - top;
1131
m_tileItems.at(column * rowCount + row)->setRect(QRect(left, top, width, height));
1000
void PageItem::paintPage(QPainter* painter, const QPixmap& pixmap) const
1136
void PageItem::paintPage(QPainter* painter, const QRectF& exposedRect) const
1002
1138
if(s_settings->pageItem().decoratePages() && !m_presentationMode)
1004
1142
QColor paperColor = s_settings->pageItem().paperColor();
1144
if(m_renderParam.invertColors)
1008
1146
paperColor.setRgb(~paperColor.rgb());
1011
1149
painter->fillRect(m_boundingRect, QBrush(paperColor));
1014
if(!pixmap.isNull())
1016
painter->drawPixmap(m_boundingRect.topLeft(), pixmap);
1018
else if(!m_obsoletePixmap.isNull())
1022
painter->setTransform(m_obsoleteTransform, true);
1023
painter->setTransform(m_transform, true);
1025
painter->drawPixmap(m_obsoleteTopLeft, m_obsoletePixmap);
1154
if(!s_settings->pageItem().useTiling())
1156
m_tileItems.first()->paint(painter, m_boundingRect.topLeft());
1033
const qreal extent = qMin(0.1 * m_boundingRect.width(), 0.1 * m_boundingRect.height());
1034
const QRectF rect(m_boundingRect.left() + 0.01 * m_boundingRect.width(), m_boundingRect.top() + 0.01 * m_boundingRect.height(), extent, extent);
1036
s_settings->pageItem().progressIcon().paint(painter, rect.toRect());
1160
const QRectF& translatedExposedRect = exposedRect.translated(-m_boundingRect.topLeft());
1162
foreach(TileItem* tile, m_tileItems)
1164
if(translatedExposedRect.intersects(tile->rect()))
1166
tile->paint(painter, m_boundingRect.topLeft());
1170
tile->cancelRender();
1039
1175
if(s_settings->pageItem().decoratePages() && !m_presentationMode)
1041
painter->drawRect(m_boundingRect);
1179
if(!s_settings->pageItem().trimMargins())
1181
painter->drawRect(m_boundingRect);
1187
painter->setClipping(false);
1189
painter->drawRect(boundingRect());
1116
ThumbnailItem::ThumbnailItem(Model::Page* page, int index, QGraphicsItem* parent) : PageItem(page, index, false, parent),
1117
#if QT_VERSION >= QT_VERSION_CHECK(4,7,0)
1118
m_text(QString::number(index + 1)),
1119
#endif // QT_VERSION
1122
setAcceptHoverEvents(false);
1125
QRectF ThumbnailItem::boundingRect() const
1127
#if QT_VERSION >= QT_VERSION_CHECK(4,7,0)
1129
return PageItem::boundingRect().adjusted(0.0, 0.0, 0.0, 2.0 * m_text.size().height());
1133
return PageItem::boundingRect().adjusted(0.0, 0.0, 0.0, 2.0 * QFontMetrics(QFont()).height());
1135
#endif // QT_VERSION
1138
void ThumbnailItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
1140
PageItem::paint(painter, option, widget);
1142
const QRectF boundingRect = PageItem::boundingRect();
1144
#if QT_VERSION >= QT_VERSION_CHECK(4,7,0)
1146
const QSizeF textSize = m_text.size();
1148
QPointF pos = boundingRect.bottomLeft();
1149
pos.rx() += 0.5 * (boundingRect.width() - textSize.width());
1150
pos.ry() += 0.5 * textSize.height();
1152
painter->drawStaticText(pos, m_text);
1156
const QString text = QString::number(index() + 1);
1157
const QFontMetrics fontMetrics = QFontMetrics(QFont());
1159
QPointF pos = boundingRect.bottomLeft();
1160
pos.rx() += 0.5 * (boundingRect.width() - fontMetrics.width(text));
1161
pos.ry() += fontMetrics.height();
1163
painter->drawText(pos, text);
1165
#endif // QT_VERSION
1171
painter->setCompositionMode(QPainter::CompositionMode_Multiply);
1172
painter->fillRect(boundingRect, widget->palette().highlight());
1178
void ThumbnailItem::setCurrent(bool current)
1180
if(m_current != current)
1182
m_current = current;
1188
void ThumbnailItem::mousePressEvent(QGraphicsSceneMouseEvent* event)
1190
if(event->modifiers() == Qt::NoModifier
1191
&& (event->button() == Qt::LeftButton || event->button() == Qt::MidButton))
1193
emit linkClicked(event->button() == Qt::MidButton, index() + 1);
1202
void ThumbnailItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent*)
1206
void ThumbnailItem::mouseMoveEvent(QGraphicsSceneMouseEvent*)
1210
void ThumbnailItem::mouseReleaseEvent(QGraphicsSceneMouseEvent*)
1214
void ThumbnailItem::contextMenuEvent(QGraphicsSceneContextMenuEvent*)
1218
void ThumbnailItem::loadInteractiveElements()
1220
const qreal width = size().width() / 72.0 * 25.4;
1221
const qreal height = size().height() / 72.0 * 25.4;
1223
const qreal longEdge = qMax(width, height);
1224
const qreal shortEdge = qMin(width, height);
1228
if(qAbs(longEdge - 279.4) <= 1.0 && qAbs(shortEdge - 215.9) <= 1.0)
1230
paperSize = QLatin1String(" (Letter)");
1234
qreal longEdgeA = 1189.0;
1235
qreal shortEdgeA = 841.0;
1237
qreal longEdgeB = 1414.0;
1238
qreal shortEdgeB = 1000.0;
1240
for(int i = 0; i <= 10; ++i)
1242
if(qAbs(longEdge - longEdgeA) <= 1.0 && qAbs(shortEdge - shortEdgeA) <= 1.0)
1244
paperSize = QString(" (A%1)").arg(i);
1247
else if(qAbs(longEdge - longEdgeB) <= 1.0 && qAbs(shortEdge - shortEdgeB) <= 1.0)
1249
paperSize = QString(" (B%1)").arg(i);
1253
longEdgeA = shortEdgeA;
1254
shortEdgeA /= qSqrt(2.0);
1256
longEdgeB = shortEdgeB;
1257
shortEdgeB /= qSqrt(2.0);
1261
setToolTip(QString("%1 mm x %2 mm%3").arg(width, 0, 'f', 1).arg(height, 0, 'f', 1).arg(paperSize));