KD Reports API Documentation  2.0
KDReportsImageElement.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** This file is part of the KD Reports library.
4 **
5 ** SPDX-FileCopyrightText: 2007-2022 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
6 **
7 ** SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDAB-KDReports OR LicenseRef-KDAB-KDReports-US
8 **
9 ** Licensees holding valid commercial KD Reports licenses may use this file in
10 ** accordance with the KD Reports Commercial License Agreement provided with
11 ** the Software.
12 **
13 ** Contact info@kdab.com if any conditions of this licensing are not clear to you.
14 **
15 ****************************************************************************/
16 
17 #include "KDReportsImageElement.h"
19 #include "KDReportsReport.h"
20 #include "KDReportsReport_p.h"
21 #include <QDebug>
22 #include <QPainter>
23 #include <QPixmap>
24 #include <QTextDocument>
25 #include <QUrl>
26 
27 class KDReports::ImageElementPrivate
28 {
29 public:
30  ImageElementPrivate()
31  : m_width(0)
32  , m_height(0)
33  , m_fitToPage(false)
34  , m_unit(KDReports::Millimeters)
35  {
36  }
37  QVariant m_pixmap; // pixmap or image, can't use QPixmap directly in threads
38  QSize m_pixmapSize; // = m_pixmap.size()
39 
40  // size in final document, chosen by the user:
41  qreal m_width;
42  qreal m_height;
43  bool m_fitToPage;
44  KDReports::Unit m_unit;
45  QString m_id;
46 };
47 
49  : d(new ImageElementPrivate)
50 {
52 }
53 
55  : d(new ImageElementPrivate)
56 {
57  setImage(image);
58 }
59 
61  : Element(other)
62  , d(new ImageElementPrivate(*other.d))
63 {
64 }
65 
67 {
68  if (&other == this)
69  return *this;
70  Element::operator=(other);
71  *d = *other.d;
72  return *this;
73 }
74 
76 {
77  delete d;
78 }
79 
80 void KDReports::ImageElement::setPixmap(const QPixmap &pixmap)
81 {
82  d->m_pixmap = QVariant::fromValue(pixmap);
83  d->m_pixmapSize = pixmap.size();
84 }
85 
87 {
88  return d->m_pixmap.value<QPixmap>();
89 }
90 
91 void KDReports::ImageElement::setImage(const QImage &image)
92 {
93  d->m_pixmap = QVariant::fromValue(image);
94  d->m_pixmapSize = image.size();
95 }
96 
98 {
99  return d->m_pixmap.value<QImage>();
100 }
101 
103 {
104  d->m_width = width;
105  d->m_unit = unit;
106  d->m_height = 0; // mutually exclusive!
107  d->m_fitToPage = false; // "
108 }
109 
111 {
112  return d->m_width;
113 }
114 
115 void KDReports::ImageElement::setHeight(qreal height, Unit unit)
116 {
117  d->m_height = height;
118  d->m_unit = unit;
119  d->m_width = 0; // mutually exclusive!
120  d->m_fitToPage = false; // "
121 }
122 
124 {
125  return d->m_height;
126 }
127 
129 {
130  d->m_width = 0; // mutually exclusive!
131  d->m_height = 0; // mutually exclusive!
132  d->m_fitToPage = true;
133 }
134 
136 {
137  return d->m_fitToPage;
138 }
139 
141 {
142 #if 0
143  if ( d->m_width && d->m_unit == Millimeters ) {
144  const QSize sz( qRound( mmToPixels( d->m_width.width() ) ),
145  qRound( mmToPixels( d->m_width.height() ) ) );
146  d->m_pixmap = d->m_pixmap.scaled( sz, Qt::KeepAspectRatio, Qt::SmoothTransformation );
147  qDebug() << "ImageElement: m_width (mm) =" << d->m_width << " sz (pixels) =" << sz;
148  }
149 #endif
150 
151  if (d->m_pixmapSize.isNull())
152  return;
153 
154  static int imageNumber = 0;
155  const QString name = QStringLiteral("image%1.png").arg(++imageNumber);
156  builder.currentDocument().addResource(QTextDocument::ImageResource, QUrl(name), d->m_pixmap);
157  builder.currentDocumentData().addResourceName(name);
158 
159  QTextImageFormat imageFormat;
160  imageFormat.setName(name);
161  imageFormat.setWidth(d->m_pixmapSize.width());
162  imageFormat.setHeight(d->m_pixmapSize.height());
163 
164  if (d->m_width) {
165  if (d->m_unit == Millimeters) {
166  const qreal pixelWidth = mmToPixels(d->m_width);
167  const qreal pixelHeight = pixelWidth * imageFormat.height() / imageFormat.width();
168  imageFormat.setWidth(pixelWidth);
169  imageFormat.setHeight(pixelHeight);
170  } else {
171  imageFormat.setProperty(ResizableImageProperty, QString(QLatin1Char('W') + QString::number(d->m_width)));
172  KDReports::TextDocumentData::updatePercentSize(imageFormat, QSizeF(builder.report()->d->textDocumentWidth(), -1 /*unknown*/));
174  }
175  } else if (d->m_height) {
176  if (d->m_unit == Millimeters) {
177  const qreal pixelHeight = qRound(mmToPixels(d->m_height));
178  const qreal pixelWidth = pixelHeight * imageFormat.width() / imageFormat.height();
179  imageFormat.setHeight(pixelHeight);
180  imageFormat.setWidth(pixelWidth);
181  } else {
182  imageFormat.setProperty(ResizableImageProperty, QString(QLatin1Char('H') + QString::number(d->m_height)));
184  // can't calc size yet, will be done at layouting time... hopefully.
185  }
186  } else if (d->m_fitToPage) {
187  imageFormat.setProperty(ResizableImageProperty, QString(QLatin1Char('T')));
189  }
190 
191  QTextCursor &cursor = builder.cursor();
192  cursor.insertImage(imageFormat);
193 }
194 
195 void KDReports::ImageElement::setId(const QString &id)
196 {
197  d->m_id = id;
198 }
199 
201 {
202  return d->m_id;
203 }
204 
206 {
207  return new ImageElement(*this);
208 }
209 
211 {
212  return d->m_unit;
213 }
214 
216 {
217  d->m_unit = unit;
218 }
KDReports::ImageElement::clone
Element * clone() const override
Definition: KDReportsImageElement.cpp:205
KDReports::ReportBuilder
Definition: KDReportsReportBuilder_p.h:41
KDReports::ReportBuilder::currentDocumentData
TextDocumentData & currentDocumentData()
Definition: KDReportsReportBuilder_p.h:69
KDReports::ReportBuilder::report
Report * report()
Definition: KDReportsReportBuilder_p.h:53
KDReports::ImageElement::setFitToPage
void setFitToPage()
Definition: KDReportsImageElement.cpp:128
KDReports::ImageElement::operator=
ImageElement & operator=(const ImageElement &other)
Definition: KDReportsImageElement.cpp:66
KDReports::Millimeters
@ Millimeters
Millimeters (the default)
Definition: KDReportsUnit.h:54
KDReports::TextDocumentData::setHasResizableImages
void setHasResizableImages()
Definition: KDReportsTextDocumentData.cpp:413
KDReports::ImageElement::ImageElement
ImageElement(const QPixmap &pixmap)
Definition: KDReportsImageElement.cpp:48
KDReportsReport_p.h
KDReports::ResizableImageProperty
static const int ResizableImageProperty
Definition: KDReportsLayoutHelper_p.h:58
KDReports::Element
Definition: KDReportsElement.h:39
KDReports::ImageElement::pixmap
QPixmap pixmap() const
Definition: KDReportsImageElement.cpp:86
KDReportsReport.h
KDReports::Element::operator=
Element & operator=(const Element &other)
Definition: KDReportsElement.cpp:36
KDReports::Unit
Unit
Definition: KDReportsUnit.h:39
KDReports::ImageElement::setWidth
void setWidth(qreal width, Unit unit=Millimeters)
Definition: KDReportsImageElement.cpp:102
KDReports::ImageElement::id
QString id() const
Definition: KDReportsImageElement.cpp:200
KDReports::ImageElement::unit
Unit unit() const
Definition: KDReportsImageElement.cpp:210
KDReports::TextDocumentData::updatePercentSize
static void updatePercentSize(QTextImageFormat &format, QSizeF size)
Definition: KDReportsTextDocumentData.cpp:202
KDReports::ImageElement::setId
void setId(const QString &id)
Definition: KDReportsImageElement.cpp:195
KDReportsImageElement.h
KDReports::ImageElement::build
void build(ReportBuilder &) const override
Definition: KDReportsImageElement.cpp:140
KDReports::ReportPrivate::textDocumentWidth
qreal textDocumentWidth() const
Definition: KDReportsReport.cpp:431
KDReports::ImageElement::~ImageElement
~ImageElement() override
Definition: KDReportsImageElement.cpp:75
KDReports::ImageElement::image
QImage image() const
Definition: KDReportsImageElement.cpp:97
KDReports::mmToPixels
KDREPORTS_EXPORT qreal mmToPixels(qreal mm)
Definition: KDReportsLayoutHelper.cpp:23
KDReportsLayoutHelper_p.h
KDReports::ImageElement::width
qreal width() const
Definition: KDReportsImageElement.cpp:110
KDReports::ReportBuilder::cursor
QTextCursor & cursor()
Definition: KDReportsReportBuilder_p.h:48
KDReports::ImageElement::fitToPage
bool fitToPage() const
Definition: KDReportsImageElement.cpp:135
KDReports::TextDocumentData::addResourceName
void addResourceName(const QString &resourceName)
Definition: KDReportsTextDocumentData.cpp:408
KDReports::ImageElement::setHeight
void setHeight(qreal height, Unit unit=Millimeters)
Definition: KDReportsImageElement.cpp:115
KDReports::ImageElement::height
qreal height() const
Definition: KDReportsImageElement.cpp:123
KDReports::ReportBuilder::currentDocument
QTextDocument & currentDocument()
Definition: KDReportsReportBuilder_p.h:71
KDReports::ImageElement
Definition: KDReportsImageElement.h:35
KDReports::ImageElement::setUnit
void setUnit(Unit unit)
Definition: KDReportsImageElement.cpp:215
KDReports
Definition: KDReportsAbstractReportLayout_p.h:30
KDReports::ImageElement::setImage
void setImage(const QImage &image)
Definition: KDReportsImageElement.cpp:91
KDReports::ImageElement::setPixmap
void setPixmap(const QPixmap &pixmap)
Definition: KDReportsImageElement.cpp:80

© 2007-2021 Klarälvdalens Datakonsult AB (KDAB)
"The Qt, C++ and OpenGL Experts"
https://www.kdab.com/
https://www.kdab.com/development-resources/qt-tools/kd-reports/
Generated on Sat Jan 8 2022 02:38:32 for KD Reports API Documentation by doxygen 1.8.17