Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/printsupport/widgets/qprintpreviewwidget.cpp |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | - | |||||||||||||
2 | - | |||||||||||||
3 | - | |||||||||||||
4 | - | |||||||||||||
5 | - | |||||||||||||
6 | - | |||||||||||||
7 | namespace { | - | ||||||||||||
8 | class PageItem : public QGraphicsItem | - | ||||||||||||
9 | { | - | ||||||||||||
10 | public: | - | ||||||||||||
11 | PageItem(int _pageNum, const QPicture* _pagePicture, QSize _paperSize, QRect _pageRect) | - | ||||||||||||
12 | : pageNum(_pageNum), pagePicture(_pagePicture), | - | ||||||||||||
13 | paperSize(_paperSize), pageRect(_pageRect) | - | ||||||||||||
14 | { | - | ||||||||||||
15 | qreal border = qMax(paperSize.height(), paperSize.width()) / 25; | - | ||||||||||||
16 | brect = QRectF(QPointF(-border, -border), | - | ||||||||||||
17 | QSizeF(paperSize)+QSizeF(2*border, 2*border)); | - | ||||||||||||
18 | setCacheMode(DeviceCoordinateCache); | - | ||||||||||||
19 | } | - | ||||||||||||
20 | - | |||||||||||||
21 | QRectF boundingRect() const override | - | ||||||||||||
22 | { return brect; } | - | ||||||||||||
23 | - | |||||||||||||
24 | inline int pageNumber() const | - | ||||||||||||
25 | { return pageNum; } | - | ||||||||||||
26 | - | |||||||||||||
27 | void paint(QPainter *painter, const QStyleOptionGraphicsItem *item, QWidget *widget) override; | - | ||||||||||||
28 | - | |||||||||||||
29 | private: | - | ||||||||||||
30 | int pageNum; | - | ||||||||||||
31 | const QPicture* pagePicture; | - | ||||||||||||
32 | QSize paperSize; | - | ||||||||||||
33 | QRect pageRect; | - | ||||||||||||
34 | QRectF brect; | - | ||||||||||||
35 | }; | - | ||||||||||||
36 | - | |||||||||||||
37 | void PageItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) | - | ||||||||||||
38 | { | - | ||||||||||||
39 | (void)widget;; | - | ||||||||||||
40 | QRectF paperRect(0,0, paperSize.width(), paperSize.height()); | - | ||||||||||||
41 | - | |||||||||||||
42 | - | |||||||||||||
43 | painter->setClipRect(option->exposedRect); | - | ||||||||||||
44 | qreal shWidth = paperRect.width()/100; | - | ||||||||||||
45 | QRectF rshadow(paperRect.topRight() + QPointF(0, shWidth), | - | ||||||||||||
46 | paperRect.bottomRight() + QPointF(shWidth, 0)); | - | ||||||||||||
47 | QLinearGradient rgrad(rshadow.topLeft(), rshadow.topRight()); | - | ||||||||||||
48 | rgrad.setColorAt(0.0, QColor(0,0,0,255)); | - | ||||||||||||
49 | rgrad.setColorAt(1.0, QColor(0,0,0,0)); | - | ||||||||||||
50 | painter->fillRect(rshadow, QBrush(rgrad)); | - | ||||||||||||
51 | QRectF bshadow(paperRect.bottomLeft() + QPointF(shWidth, 0), | - | ||||||||||||
52 | paperRect.bottomRight() + QPointF(0, shWidth)); | - | ||||||||||||
53 | QLinearGradient bgrad(bshadow.topLeft(), bshadow.bottomLeft()); | - | ||||||||||||
54 | bgrad.setColorAt(0.0, QColor(0,0,0,255)); | - | ||||||||||||
55 | bgrad.setColorAt(1.0, QColor(0,0,0,0)); | - | ||||||||||||
56 | painter->fillRect(bshadow, QBrush(bgrad)); | - | ||||||||||||
57 | QRectF cshadow(paperRect.bottomRight(), | - | ||||||||||||
58 | paperRect.bottomRight() + QPointF(shWidth, shWidth)); | - | ||||||||||||
59 | QRadialGradient cgrad(cshadow.topLeft(), shWidth, cshadow.topLeft()); | - | ||||||||||||
60 | cgrad.setColorAt(0.0, QColor(0,0,0,255)); | - | ||||||||||||
61 | cgrad.setColorAt(1.0, QColor(0,0,0,0)); | - | ||||||||||||
62 | painter->fillRect(cshadow, QBrush(cgrad)); | - | ||||||||||||
63 | - | |||||||||||||
64 | painter->setClipRect(paperRect & option->exposedRect); | - | ||||||||||||
65 | painter->fillRect(paperRect, Qt::white); | - | ||||||||||||
66 | if (!pagePicture) | - | ||||||||||||
67 | return; | - | ||||||||||||
68 | painter->drawPicture(pageRect.topLeft(), *pagePicture); | - | ||||||||||||
69 | - | |||||||||||||
70 | - | |||||||||||||
71 | QPainterPath path; | - | ||||||||||||
72 | path.addRect(paperRect); | - | ||||||||||||
73 | path.addRect(pageRect); | - | ||||||||||||
74 | painter->setPen(QPen(Qt::NoPen)); | - | ||||||||||||
75 | painter->setBrush(QColor(255, 255, 255, 180)); | - | ||||||||||||
76 | painter->drawPath(path); | - | ||||||||||||
77 | } | - | ||||||||||||
78 | - | |||||||||||||
79 | class GraphicsView : public QGraphicsView | - | ||||||||||||
80 | { | - | ||||||||||||
81 | public: template <typename ThisObject> inline void qt_check_for_QOBJECT_macro(const ThisObject &_q_argument) const { int i = qYouForgotTheQ_OBJECT_Macro(this, &_q_argument); i = i + 1; } | - | ||||||||||||
82 | #pragma GCC diagnostic push | - | ||||||||||||
83 | static const QMetaObject staticMetaObject; virtual const QMetaObject *metaObject() const; virtual void *qt_metacast(const char *); virtual int qt_metacall(QMetaObject::Call, int, void **); static inline QString tr(const char *s, const char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } __attribute__ ((__deprecated__)) static inline QString trUtf8(const char *s, const char *c = nullptr, int n = -1) { return staticMetaObject.tr(s, c, n); } private: __attribute__((visibility("hidden"))) static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); | - | ||||||||||||
84 | #pragma GCC diagnostic pop | - | ||||||||||||
85 | struct QPrivateSignal {}; | - | ||||||||||||
86 | public: | - | ||||||||||||
87 | GraphicsView(QWidget* parent = 0) | - | ||||||||||||
88 | : QGraphicsView(parent) | - | ||||||||||||
89 | { | - | ||||||||||||
90 | - | |||||||||||||
91 | - | |||||||||||||
92 | - | |||||||||||||
93 | } | - | ||||||||||||
94 | public : | - | ||||||||||||
95 | void resized(); | - | ||||||||||||
96 | - | |||||||||||||
97 | protected: | - | ||||||||||||
98 | void resizeEvent(QResizeEvent* e) override | - | ||||||||||||
99 | { | - | ||||||||||||
100 | { | - | ||||||||||||
101 | const QSignalBlocker blocker(verticalScrollBar()); | - | ||||||||||||
102 | QGraphicsView::resizeEvent(e); | - | ||||||||||||
103 | } | - | ||||||||||||
104 | resized(); | - | ||||||||||||
105 | } | - | ||||||||||||
106 | - | |||||||||||||
107 | void showEvent(QShowEvent* e) override | - | ||||||||||||
108 | { | - | ||||||||||||
109 | QGraphicsView::showEvent(e); | - | ||||||||||||
110 | resized(); | - | ||||||||||||
111 | } | - | ||||||||||||
112 | }; | - | ||||||||||||
113 | - | |||||||||||||
114 | } | - | ||||||||||||
115 | - | |||||||||||||
116 | class QPrintPreviewWidgetPrivate : public QWidgetPrivate | - | ||||||||||||
117 | { | - | ||||||||||||
118 | inline QPrintPreviewWidget* q_func() { return static_cast<QPrintPreviewWidget *>(q_ptr); } inline const QPrintPreviewWidget* q_func() const { return static_cast<const QPrintPreviewWidget *>(q_ptr); } friend class QPrintPreviewWidget; | - | ||||||||||||
119 | public: | - | ||||||||||||
120 | QPrintPreviewWidgetPrivate() | - | ||||||||||||
121 | : scene(0), curPage(1), | - | ||||||||||||
122 | viewMode(QPrintPreviewWidget::SinglePageView), | - | ||||||||||||
123 | zoomMode(QPrintPreviewWidget::FitInView), | - | ||||||||||||
124 | zoomFactor(1), initialized(false), fitting(true) | - | ||||||||||||
125 | {} | - | ||||||||||||
126 | - | |||||||||||||
127 | - | |||||||||||||
128 | void _q_fit(bool doFitting = false); | - | ||||||||||||
129 | void _q_updateCurrentPage(); | - | ||||||||||||
130 | - | |||||||||||||
131 | void init(); | - | ||||||||||||
132 | void populateScene(); | - | ||||||||||||
133 | void layoutPages(); | - | ||||||||||||
134 | void generatePreview(); | - | ||||||||||||
135 | void setCurrentPage(int pageNumber); | - | ||||||||||||
136 | void zoom(qreal zoom); | - | ||||||||||||
137 | void setZoomFactor(qreal zoomFactor); | - | ||||||||||||
138 | int calcCurrentPage(); | - | ||||||||||||
139 | - | |||||||||||||
140 | GraphicsView *graphicsView; | - | ||||||||||||
141 | QGraphicsScene *scene; | - | ||||||||||||
142 | - | |||||||||||||
143 | int curPage; | - | ||||||||||||
144 | QList<const QPicture *> pictures; | - | ||||||||||||
145 | QList<QGraphicsItem *> pages; | - | ||||||||||||
146 | - | |||||||||||||
147 | QPrintPreviewWidget::ViewMode viewMode; | - | ||||||||||||
148 | QPrintPreviewWidget::ZoomMode zoomMode; | - | ||||||||||||
149 | qreal zoomFactor; | - | ||||||||||||
150 | bool ownPrinter; | - | ||||||||||||
151 | QPrinter* printer; | - | ||||||||||||
152 | bool initialized; | - | ||||||||||||
153 | bool fitting; | - | ||||||||||||
154 | }; | - | ||||||||||||
155 | - | |||||||||||||
156 | void QPrintPreviewWidgetPrivate::_q_fit(bool doFitting) | - | ||||||||||||
157 | { | - | ||||||||||||
158 | QPrintPreviewWidget * const q = q_func(); | - | ||||||||||||
159 | - | |||||||||||||
160 | if (curPage < 1
| 0-4 | ||||||||||||
161 | return; never executed: return; | 0 | ||||||||||||
162 | - | |||||||||||||
163 | if (!doFitting
| 0-4 | ||||||||||||
164 | return; never executed: return; | 0 | ||||||||||||
165 | - | |||||||||||||
166 | if (doFitting
| 0-4 | ||||||||||||
167 | QRect viewRect = graphicsView->viewport()->rect(); | - | ||||||||||||
168 | if (zoomMode == QPrintPreviewWidget::FitInView
| 0 | ||||||||||||
169 | const QList<QGraphicsItem*> containedItems = graphicsView->items(viewRect, Qt::ContainsItemBoundingRect); | - | ||||||||||||
170 | for (QForeachContainer<typename QtPrivate::remove_reference<decltype(containedItems)>::type> _container_((containedItems)); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1)for (QGraphicsItem* item = *_container_.i; _container_.control; _container_.control = 0: containedItems) { | - | ||||||||||||
171 | PageItem* pg = static_cast<PageItem*>(item); | - | ||||||||||||
172 | if (pg->pageNumber() == curPage
| 0 | ||||||||||||
173 | return; never executed: return; | 0 | ||||||||||||
174 | } never executed: end of block | 0 | ||||||||||||
175 | } never executed: end of block | 0 | ||||||||||||
176 | - | |||||||||||||
177 | int newPage = calcCurrentPage(); | - | ||||||||||||
178 | if (newPage != curPage
| 0 | ||||||||||||
179 | curPage = newPage; never executed: curPage = newPage; | 0 | ||||||||||||
180 | } never executed: end of block | 0 | ||||||||||||
181 | - | |||||||||||||
182 | QRectF target = pages.at(curPage-1)->sceneBoundingRect(); | - | ||||||||||||
183 | if (viewMode == QPrintPreviewWidget::FacingPagesView
| 0-4 | ||||||||||||
184 | - | |||||||||||||
185 | if (curPage % 2
| 0 | ||||||||||||
186 | target.setLeft(target.left() - target.width()); never executed: target.setLeft(target.left() - target.width()); | 0 | ||||||||||||
187 | else | - | ||||||||||||
188 | target.setRight(target.right() + target.width()); never executed: target.setRight(target.right() + target.width()); | 0 | ||||||||||||
189 | } else if (viewMode == QPrintPreviewWidget::AllPagesView
| 0-4 | ||||||||||||
190 | target = scene->itemsBoundingRect(); | - | ||||||||||||
191 | } never executed: end of block | 0 | ||||||||||||
192 | - | |||||||||||||
193 | if (zoomMode == QPrintPreviewWidget::FitToWidth
| 0-4 | ||||||||||||
194 | QTransform t; | - | ||||||||||||
195 | qreal scale = graphicsView->viewport()->width() / target.width(); | - | ||||||||||||
196 | t.scale(scale, scale); | - | ||||||||||||
197 | graphicsView->setTransform(t); | - | ||||||||||||
198 | if (doFitting
| 0 | ||||||||||||
199 | QRectF viewSceneRect = graphicsView->viewportTransform().mapRect(graphicsView->viewport()->rect()); | - | ||||||||||||
200 | viewSceneRect.moveTop(target.top()); | - | ||||||||||||
201 | graphicsView->ensureVisible(viewSceneRect); | - | ||||||||||||
202 | } never executed: end of block | 0 | ||||||||||||
203 | } never executed: else {end of block | 0 | ||||||||||||
204 | graphicsView->fitInView(target, Qt::KeepAspectRatio); | - | ||||||||||||
205 | if (zoomMode == QPrintPreviewWidget::FitInView
| 0-4 | ||||||||||||
206 | int step = qRound(graphicsView->matrix().mapRect(target).height()); | - | ||||||||||||
207 | graphicsView->verticalScrollBar()->setSingleStep(step); | - | ||||||||||||
208 | graphicsView->verticalScrollBar()->setPageStep(step); | - | ||||||||||||
209 | } executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||
210 | } executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||
211 | - | |||||||||||||
212 | zoomFactor = graphicsView->transform().m11() * (float(printer->logicalDpiY()) / q->logicalDpiY()); | - | ||||||||||||
213 | q->previewChanged(); | - | ||||||||||||
214 | } executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||
215 | - | |||||||||||||
216 | void QPrintPreviewWidgetPrivate::_q_updateCurrentPage() | - | ||||||||||||
217 | { | - | ||||||||||||
218 | QPrintPreviewWidget * const q = q_func(); | - | ||||||||||||
219 | - | |||||||||||||
220 | if (viewMode == QPrintPreviewWidget::AllPagesView) | - | ||||||||||||
221 | return; | - | ||||||||||||
222 | - | |||||||||||||
223 | int newPage = calcCurrentPage(); | - | ||||||||||||
224 | if (newPage != curPage) { | - | ||||||||||||
225 | curPage = newPage; | - | ||||||||||||
226 | q->previewChanged(); | - | ||||||||||||
227 | } | - | ||||||||||||
228 | } | - | ||||||||||||
229 | - | |||||||||||||
230 | int QPrintPreviewWidgetPrivate::calcCurrentPage() | - | ||||||||||||
231 | { | - | ||||||||||||
232 | int maxArea = 0; | - | ||||||||||||
233 | int newPage = curPage; | - | ||||||||||||
234 | QRect viewRect = graphicsView->viewport()->rect(); | - | ||||||||||||
235 | const QList<QGraphicsItem*> items = graphicsView->items(viewRect); | - | ||||||||||||
236 | for (int i=0; i<auto *item : items.size(); ++i) { | - | ||||||||||||
237 | PageItem* pg = static_cast<PageItem*>(items.at(i));item); | - | ||||||||||||
238 | QRect overlap = graphicsView->mapFromScene(pg->sceneBoundingRect()).boundingRect() & viewRect; | - | ||||||||||||
239 | int area = overlap.width() * overlap.height(); | - | ||||||||||||
240 | if (area > maxArea
| 3-17 | ||||||||||||
241 | maxArea = area; | - | ||||||||||||
242 | newPage = pg->pageNumber(); | - | ||||||||||||
243 | } executed 17 times by 1 test: else if (area == maxAreaend of block Executed by:
| 0-17 | ||||||||||||
244 | newPage = pg->pageNumber(); | - | ||||||||||||
245 | } never executed: end of block | 0 | ||||||||||||
246 | } executed 20 times by 1 test: end of block Executed by:
| 20 | ||||||||||||
247 | return executed 11 times by 1 test: newPage;return newPage; Executed by:
executed 11 times by 1 test: return newPage; Executed by:
| 11 | ||||||||||||
248 | } | - | ||||||||||||
249 | - | |||||||||||||
250 | void QPrintPreviewWidgetPrivate::init() | - | ||||||||||||
251 | { | - | ||||||||||||
252 | QPrintPreviewWidget * const q = q_func(); | - | ||||||||||||
253 | - | |||||||||||||
254 | graphicsView = new GraphicsView; | - | ||||||||||||
255 | graphicsView->setInteractive(false); | - | ||||||||||||
256 | graphicsView->setDragMode(QGraphicsView::ScrollHandDrag); | - | ||||||||||||
257 | graphicsView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate); | - | ||||||||||||
258 | QObject::connect(graphicsView->verticalScrollBar(), qFlagLocation("2""valueChanged(int)" "\0" __FILE__ ":" "315""321"), | - | ||||||||||||
259 | q, qFlagLocation("1""_q_updateCurrentPage()" "\0" __FILE__ ":" "316""322")); | - | ||||||||||||
260 | QObject::connect(graphicsView, qFlagLocation("2""resized()" "\0" __FILE__ ":" "317""323"), q, qFlagLocation("1""_q_fit()" "\0" __FILE__ ":" "317""323")); | - | ||||||||||||
261 | - | |||||||||||||
262 | scene = new QGraphicsScene(graphicsView); | - | ||||||||||||
263 | scene->setBackgroundBrush(Qt::gray); | - | ||||||||||||
264 | graphicsView->setScene(scene); | - | ||||||||||||
265 | - | |||||||||||||
266 | QVBoxLayout *layout = new QVBoxLayout; | - | ||||||||||||
267 | q->setLayout(layout); | - | ||||||||||||
268 | layout->setContentsMargins(0, 0, 0, 0); | - | ||||||||||||
269 | layout->addWidget(graphicsView); | - | ||||||||||||
270 | } | - | ||||||||||||
271 | - | |||||||||||||
272 | void QPrintPreviewWidgetPrivate::populateScene() | - | ||||||||||||
273 | { | - | ||||||||||||
274 | - | |||||||||||||
275 | for (int i = 0; i <auto *page : qAsConst(pages.size(); i++))) | - | ||||||||||||
276 | scene->removeItem(pages.at(i));page); never executed: scene->removeItem(page); | 0 | ||||||||||||
277 | qDeleteAll(pages); | - | ||||||||||||
278 | pages.clear(); | - | ||||||||||||
int numPages = pictures.count(); | ||||||||||||||
279 | - | |||||||||||||
280 | QSize paperSize = printer->pageLayout().fullRectPixels(printer->resolution()).size(); | - | ||||||||||||
281 | QRect pageRect = printer->pageLayout().paintRectPixels(printer->resolution()); | - | ||||||||||||
282 | - | |||||||||||||
283 | for (int ipage = 0; i < numPages1; | - | ||||||||||||
284 | i++)for (auto *picture : qAsConst(pictures)) { | - | ||||||||||||
285 | PageItem* item = new PageItem(i+1page++, picture,pictures.at(i), paperSize, pageRect); | - | ||||||||||||
286 | scene->addItem(item); | - | ||||||||||||
287 | pages.append(item); | - | ||||||||||||
288 | } executed 4 times by 1 test: end of block Executed by:
| 4 | ||||||||||||
289 | } executed 1 time by 1 test: end of block Executed by:
| 1 | ||||||||||||
290 | - | |||||||||||||
291 | void QPrintPreviewWidgetPrivate::layoutPages() | - | ||||||||||||
292 | { | - | ||||||||||||
293 | int numPages = pages.count(); | - | ||||||||||||
294 | if (numPages < 1) | - | ||||||||||||
295 | return; | - | ||||||||||||
296 | - | |||||||||||||
297 | int numPagePlaces = numPages; | - | ||||||||||||
298 | int cols = 1; | - | ||||||||||||
299 | if (viewMode == QPrintPreviewWidget::AllPagesView) { | - | ||||||||||||
300 | if (printer->orientation() == QPrinter::Portrait) | - | ||||||||||||
301 | cols = qCeil(qSqrt((float) numPages)); | - | ||||||||||||
302 | else | - | ||||||||||||
303 | cols = qFloor(qSqrt((float) numPages)); | - | ||||||||||||
304 | cols += cols % 2; | - | ||||||||||||
305 | } | - | ||||||||||||
306 | else if (viewMode == QPrintPreviewWidget::FacingPagesView) { | - | ||||||||||||
307 | cols = 2; | - | ||||||||||||
308 | numPagePlaces += 1; | - | ||||||||||||
309 | } | - | ||||||||||||
310 | int rows = qCeil(qreal(numPagePlaces) / cols); | - | ||||||||||||
311 | - | |||||||||||||
312 | qreal itemWidth = pages.at(0)->boundingRect().width(); | - | ||||||||||||
313 | qreal itemHeight = pages.at(0)->boundingRect().height(); | - | ||||||||||||
314 | int pageNum = 1; | - | ||||||||||||
315 | for (int i = 0; i < rows && pageNum <= numPages; i++) { | - | ||||||||||||
316 | for (int j = 0; j < cols && pageNum <= numPages; j++) { | - | ||||||||||||
317 | if (!i && !j && viewMode == QPrintPreviewWidget::FacingPagesView) { | - | ||||||||||||
318 | - | |||||||||||||
319 | continue; | - | ||||||||||||
320 | } else { | - | ||||||||||||
321 | pages.at(pageNum-1)->setPos(QPointF(j*itemWidth, i*itemHeight)); | - | ||||||||||||
322 | pageNum++; | - | ||||||||||||
323 | } | - | ||||||||||||
324 | } | - | ||||||||||||
325 | } | - | ||||||||||||
326 | scene->setSceneRect(scene->itemsBoundingRect()); | - | ||||||||||||
327 | } | - | ||||||||||||
328 | - | |||||||||||||
329 | void QPrintPreviewWidgetPrivate::generatePreview() | - | ||||||||||||
330 | { | - | ||||||||||||
331 | - | |||||||||||||
332 | - | |||||||||||||
333 | - | |||||||||||||
334 | - | |||||||||||||
335 | - | |||||||||||||
336 | - | |||||||||||||
337 | QPrintPreviewWidget * const q = q_func(); | - | ||||||||||||
338 | printer->d_func()->setPreviewMode(true); | - | ||||||||||||
339 | q->paintRequested(printer); | - | ||||||||||||
340 | printer->d_func()->setPreviewMode(false); | - | ||||||||||||
341 | pictures = printer->d_func()->previewPages(); | - | ||||||||||||
342 | populateScene(); | - | ||||||||||||
343 | layoutPages(); | - | ||||||||||||
344 | curPage = qBound(1, curPage, pages.count()); | - | ||||||||||||
345 | if (fitting) | - | ||||||||||||
346 | _q_fit(); | - | ||||||||||||
347 | q->previewChanged(); | - | ||||||||||||
348 | } | - | ||||||||||||
349 | - | |||||||||||||
350 | void QPrintPreviewWidgetPrivate::setCurrentPage(int pageNumber) | - | ||||||||||||
351 | { | - | ||||||||||||
352 | if (pageNumber < 1 || pageNumber > pages.count()) | - | ||||||||||||
353 | return; | - | ||||||||||||
354 | - | |||||||||||||
355 | int lastPage = curPage; | - | ||||||||||||
356 | curPage = pageNumber; | - | ||||||||||||
357 | - | |||||||||||||
358 | if (lastPage != curPage && lastPage > 0 && lastPage <= pages.count()) { | - | ||||||||||||
359 | if (zoomMode != QPrintPreviewWidget::FitInView) { | - | ||||||||||||
360 | QScrollBar *hsc = graphicsView->horizontalScrollBar(); | - | ||||||||||||
361 | QScrollBar *vsc = graphicsView->verticalScrollBar(); | - | ||||||||||||
362 | QPointF pt = graphicsView->transform().map(pages.at(curPage-1)->pos()); | - | ||||||||||||
363 | vsc->setValue(int(pt.y()) - 10); | - | ||||||||||||
364 | hsc->setValue(int(pt.x()) - 10); | - | ||||||||||||
365 | } else { | - | ||||||||||||
366 | graphicsView->centerOn(pages.at(curPage-1)); | - | ||||||||||||
367 | } | - | ||||||||||||
368 | } | - | ||||||||||||
369 | } | - | ||||||||||||
370 | - | |||||||||||||
371 | void QPrintPreviewWidgetPrivate::zoom(qreal zoom) | - | ||||||||||||
372 | { | - | ||||||||||||
373 | zoomFactor *= zoom; | - | ||||||||||||
374 | graphicsView->scale(zoom, zoom); | - | ||||||||||||
375 | } | - | ||||||||||||
376 | - | |||||||||||||
377 | void QPrintPreviewWidgetPrivate::setZoomFactor(qreal _zoomFactor) | - | ||||||||||||
378 | { | - | ||||||||||||
379 | QPrintPreviewWidget * const q = q_func(); | - | ||||||||||||
380 | zoomFactor = _zoomFactor; | - | ||||||||||||
381 | graphicsView->resetTransform(); | - | ||||||||||||
382 | int dpi_y = q->logicalDpiY(); | - | ||||||||||||
383 | int printer_dpi_y = printer->logicalDpiY(); | - | ||||||||||||
384 | graphicsView->scale(zoomFactor*(dpi_y/float(printer_dpi_y)), | - | ||||||||||||
385 | zoomFactor*(dpi_y/float(printer_dpi_y))); | - | ||||||||||||
386 | } | - | ||||||||||||
387 | QPrintPreviewWidget::QPrintPreviewWidget(QPrinter *printer, QWidget *parent, Qt::WindowFlags flags) | - | ||||||||||||
388 | : QWidget(*new QPrintPreviewWidgetPrivate, parent, flags) | - | ||||||||||||
389 | { | - | ||||||||||||
390 | QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
391 | d->printer = printer; | - | ||||||||||||
392 | d->ownPrinter = false; | - | ||||||||||||
393 | d->init(); | - | ||||||||||||
394 | } | - | ||||||||||||
395 | QPrintPreviewWidget::QPrintPreviewWidget(QWidget *parent, Qt::WindowFlags flags) | - | ||||||||||||
396 | : QWidget(*new QPrintPreviewWidgetPrivate, parent, flags) | - | ||||||||||||
397 | { | - | ||||||||||||
398 | QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
399 | d->printer = new QPrinter; | - | ||||||||||||
400 | d->ownPrinter = true; | - | ||||||||||||
401 | d->init(); | - | ||||||||||||
402 | } | - | ||||||||||||
403 | - | |||||||||||||
404 | - | |||||||||||||
405 | - | |||||||||||||
406 | - | |||||||||||||
407 | - | |||||||||||||
408 | QPrintPreviewWidget::~QPrintPreviewWidget() | - | ||||||||||||
409 | { | - | ||||||||||||
410 | QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
411 | if (d->ownPrinter) | - | ||||||||||||
412 | delete d->printer; | - | ||||||||||||
413 | } | - | ||||||||||||
414 | - | |||||||||||||
415 | - | |||||||||||||
416 | - | |||||||||||||
417 | - | |||||||||||||
418 | QPrintPreviewWidget::ViewMode QPrintPreviewWidget::viewMode() const | - | ||||||||||||
419 | { | - | ||||||||||||
420 | const QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
421 | return d->viewMode; | - | ||||||||||||
422 | } | - | ||||||||||||
423 | - | |||||||||||||
424 | - | |||||||||||||
425 | - | |||||||||||||
426 | - | |||||||||||||
427 | - | |||||||||||||
428 | void QPrintPreviewWidget::setViewMode(ViewMode mode) | - | ||||||||||||
429 | { | - | ||||||||||||
430 | QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
431 | d->viewMode = mode; | - | ||||||||||||
432 | d->layoutPages(); | - | ||||||||||||
433 | if (d->viewMode == AllPagesView) { | - | ||||||||||||
434 | d->graphicsView->fitInView(d->scene->itemsBoundingRect(), Qt::KeepAspectRatio); | - | ||||||||||||
435 | d->fitting = false; | - | ||||||||||||
436 | d->zoomMode = QPrintPreviewWidget::CustomZoom; | - | ||||||||||||
437 | d->zoomFactor = d->graphicsView->transform().m11() * (float(d->printer->logicalDpiY()) / logicalDpiY()); | - | ||||||||||||
438 | previewChanged(); | - | ||||||||||||
439 | } else { | - | ||||||||||||
440 | d->fitting = true; | - | ||||||||||||
441 | d->_q_fit(); | - | ||||||||||||
442 | } | - | ||||||||||||
443 | } | - | ||||||||||||
444 | - | |||||||||||||
445 | - | |||||||||||||
446 | - | |||||||||||||
447 | - | |||||||||||||
448 | - | |||||||||||||
449 | QPrinter::Orientation QPrintPreviewWidget::orientation() const | - | ||||||||||||
450 | { | - | ||||||||||||
451 | const QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
452 | return d->printer->orientation(); | - | ||||||||||||
453 | } | - | ||||||||||||
454 | - | |||||||||||||
455 | - | |||||||||||||
456 | - | |||||||||||||
457 | - | |||||||||||||
458 | - | |||||||||||||
459 | void QPrintPreviewWidget::setOrientation(QPrinter::Orientation orientation) | - | ||||||||||||
460 | { | - | ||||||||||||
461 | QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
462 | d->printer->setOrientation(orientation); | - | ||||||||||||
463 | d->generatePreview(); | - | ||||||||||||
464 | } | - | ||||||||||||
465 | - | |||||||||||||
466 | - | |||||||||||||
467 | - | |||||||||||||
468 | - | |||||||||||||
469 | void QPrintPreviewWidget::print() | - | ||||||||||||
470 | { | - | ||||||||||||
471 | QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
472 | - | |||||||||||||
473 | paintRequested(d->printer); | - | ||||||||||||
474 | } | - | ||||||||||||
475 | - | |||||||||||||
476 | - | |||||||||||||
477 | - | |||||||||||||
478 | - | |||||||||||||
479 | - | |||||||||||||
480 | void QPrintPreviewWidget::zoomIn(qreal factor) | - | ||||||||||||
481 | { | - | ||||||||||||
482 | QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
483 | d->fitting = false; | - | ||||||||||||
484 | d->zoomMode = QPrintPreviewWidget::CustomZoom; | - | ||||||||||||
485 | d->zoom(factor); | - | ||||||||||||
486 | } | - | ||||||||||||
487 | - | |||||||||||||
488 | - | |||||||||||||
489 | - | |||||||||||||
490 | - | |||||||||||||
491 | - | |||||||||||||
492 | void QPrintPreviewWidget::zoomOut(qreal factor) | - | ||||||||||||
493 | { | - | ||||||||||||
494 | QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
495 | d->fitting = false; | - | ||||||||||||
496 | d->zoomMode = QPrintPreviewWidget::CustomZoom; | - | ||||||||||||
497 | d->zoom(1/factor); | - | ||||||||||||
498 | } | - | ||||||||||||
499 | - | |||||||||||||
500 | - | |||||||||||||
501 | - | |||||||||||||
502 | - | |||||||||||||
503 | qreal QPrintPreviewWidget::zoomFactor() const | - | ||||||||||||
504 | { | - | ||||||||||||
505 | const QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
506 | return d->zoomFactor; | - | ||||||||||||
507 | } | - | ||||||||||||
508 | void QPrintPreviewWidget::setZoomFactor(qreal factor) | - | ||||||||||||
509 | { | - | ||||||||||||
510 | QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
511 | d->fitting = false; | - | ||||||||||||
512 | d->zoomMode = QPrintPreviewWidget::CustomZoom; | - | ||||||||||||
513 | d->setZoomFactor(factor); | - | ||||||||||||
514 | } | - | ||||||||||||
515 | - | |||||||||||||
516 | - | |||||||||||||
517 | - | |||||||||||||
518 | - | |||||||||||||
519 | - | |||||||||||||
520 | int QPrintPreviewWidget::pageCount() const | - | ||||||||||||
521 | { | - | ||||||||||||
522 | const QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
523 | return d->pages.size(); | - | ||||||||||||
524 | } | - | ||||||||||||
525 | - | |||||||||||||
526 | - | |||||||||||||
527 | - | |||||||||||||
528 | - | |||||||||||||
529 | int QPrintPreviewWidget::currentPage() const | - | ||||||||||||
530 | { | - | ||||||||||||
531 | const QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
532 | return d->curPage; | - | ||||||||||||
533 | } | - | ||||||||||||
534 | - | |||||||||||||
535 | - | |||||||||||||
536 | - | |||||||||||||
537 | - | |||||||||||||
538 | - | |||||||||||||
539 | void QPrintPreviewWidget::setCurrentPage(int page) | - | ||||||||||||
540 | { | - | ||||||||||||
541 | QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
542 | d->setCurrentPage(page); | - | ||||||||||||
543 | } | - | ||||||||||||
544 | - | |||||||||||||
545 | - | |||||||||||||
546 | - | |||||||||||||
547 | - | |||||||||||||
548 | - | |||||||||||||
549 | void QPrintPreviewWidget::fitToWidth() | - | ||||||||||||
550 | { | - | ||||||||||||
551 | setZoomMode(FitToWidth); | - | ||||||||||||
552 | } | - | ||||||||||||
553 | - | |||||||||||||
554 | - | |||||||||||||
555 | - | |||||||||||||
556 | - | |||||||||||||
557 | - | |||||||||||||
558 | void QPrintPreviewWidget::fitInView() | - | ||||||||||||
559 | { | - | ||||||||||||
560 | setZoomMode(FitInView); | - | ||||||||||||
561 | } | - | ||||||||||||
562 | - | |||||||||||||
563 | - | |||||||||||||
564 | - | |||||||||||||
565 | - | |||||||||||||
566 | - | |||||||||||||
567 | - | |||||||||||||
568 | void QPrintPreviewWidget::setZoomMode(QPrintPreviewWidget::ZoomMode zoomMode) | - | ||||||||||||
569 | { | - | ||||||||||||
570 | QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
571 | d->zoomMode = zoomMode; | - | ||||||||||||
572 | if (d->zoomMode == FitInView || d->zoomMode == FitToWidth) { | - | ||||||||||||
573 | d->fitting = true; | - | ||||||||||||
574 | d->_q_fit(true); | - | ||||||||||||
575 | } else { | - | ||||||||||||
576 | d->fitting = false; | - | ||||||||||||
577 | } | - | ||||||||||||
578 | } | - | ||||||||||||
579 | - | |||||||||||||
580 | - | |||||||||||||
581 | - | |||||||||||||
582 | - | |||||||||||||
583 | - | |||||||||||||
584 | - | |||||||||||||
585 | QPrintPreviewWidget::ZoomMode QPrintPreviewWidget::zoomMode() const | - | ||||||||||||
586 | { | - | ||||||||||||
587 | const QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
588 | return d->zoomMode; | - | ||||||||||||
589 | } | - | ||||||||||||
590 | - | |||||||||||||
591 | - | |||||||||||||
592 | - | |||||||||||||
593 | - | |||||||||||||
594 | - | |||||||||||||
595 | void QPrintPreviewWidget::setLandscapeOrientation() | - | ||||||||||||
596 | { | - | ||||||||||||
597 | setOrientation(QPrinter::Landscape); | - | ||||||||||||
598 | } | - | ||||||||||||
599 | - | |||||||||||||
600 | - | |||||||||||||
601 | - | |||||||||||||
602 | - | |||||||||||||
603 | - | |||||||||||||
604 | void QPrintPreviewWidget::setPortraitOrientation() | - | ||||||||||||
605 | { | - | ||||||||||||
606 | setOrientation(QPrinter::Portrait); | - | ||||||||||||
607 | } | - | ||||||||||||
608 | - | |||||||||||||
609 | - | |||||||||||||
610 | - | |||||||||||||
611 | - | |||||||||||||
612 | - | |||||||||||||
613 | void QPrintPreviewWidget::setSinglePageViewMode() | - | ||||||||||||
614 | { | - | ||||||||||||
615 | setViewMode(SinglePageView); | - | ||||||||||||
616 | } | - | ||||||||||||
617 | - | |||||||||||||
618 | - | |||||||||||||
619 | - | |||||||||||||
620 | - | |||||||||||||
621 | - | |||||||||||||
622 | void QPrintPreviewWidget::setFacingPagesViewMode() | - | ||||||||||||
623 | { | - | ||||||||||||
624 | setViewMode(FacingPagesView); | - | ||||||||||||
625 | } | - | ||||||||||||
626 | - | |||||||||||||
627 | - | |||||||||||||
628 | - | |||||||||||||
629 | - | |||||||||||||
630 | - | |||||||||||||
631 | void QPrintPreviewWidget::setAllPagesViewMode() | - | ||||||||||||
632 | { | - | ||||||||||||
633 | setViewMode(AllPagesView); | - | ||||||||||||
634 | } | - | ||||||||||||
635 | - | |||||||||||||
636 | - | |||||||||||||
637 | - | |||||||||||||
638 | - | |||||||||||||
639 | - | |||||||||||||
640 | - | |||||||||||||
641 | void QPrintPreviewWidget::updatePreview() | - | ||||||||||||
642 | { | - | ||||||||||||
643 | QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
644 | d->initialized = true; | - | ||||||||||||
645 | d->generatePreview(); | - | ||||||||||||
646 | d->graphicsView->updateGeometry(); | - | ||||||||||||
647 | } | - | ||||||||||||
648 | - | |||||||||||||
649 | - | |||||||||||||
650 | - | |||||||||||||
651 | void QPrintPreviewWidget::setVisible(bool visible) | - | ||||||||||||
652 | { | - | ||||||||||||
653 | QPrintPreviewWidgetPrivate * const d = d_func(); | - | ||||||||||||
654 | if (visible && !d->initialized) | - | ||||||||||||
655 | updatePreview(); | - | ||||||||||||
656 | QWidget::setVisible(visible); | - | ||||||||||||
657 | } | - | ||||||||||||
658 | - | |||||||||||||
659 | - | |||||||||||||
Switch to Source code | Preprocessed file |