1// Copyright (C) 2014 John Layt <jlayt@kde.org>
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qplatformprintdevice.h"
5
6#include "qprintdevice_p.h"
7
8#include <QtCore/qcoreapplication.h>
9#include <QtGui/qpagelayout.h>
10
11QT_BEGIN_NAMESPACE
12
13#ifndef QT_NO_PRINTER
14
15QPlatformPrintDevice::QPlatformPrintDevice(const QString &id)
16 : m_id(id),
17 m_isRemote(false),
18 m_supportsMultipleCopies(false),
19 m_supportsCollateCopies(false),
20 m_havePageSizes(false),
21 m_supportsCustomPageSizes(false),
22 m_haveResolutions(false),
23 m_haveInputSlots(false),
24 m_haveOutputBins(false),
25 m_haveDuplexModes(false),
26 m_haveColorModes(false)
27#if QT_CONFIG(mimetype)
28 , m_haveMimeTypes(false)
29#endif
30{
31}
32
33QPlatformPrintDevice::~QPlatformPrintDevice()
34{
35}
36
37QString QPlatformPrintDevice::id() const
38{
39 return m_id;
40}
41
42QString QPlatformPrintDevice::name() const
43{
44 return m_name;
45}
46
47QString QPlatformPrintDevice::location() const
48{
49 return m_location;
50}
51
52QString QPlatformPrintDevice::makeAndModel() const
53{
54 return m_makeAndModel;
55}
56
57bool QPlatformPrintDevice::isValid() const
58{
59 return false;
60}
61
62bool QPlatformPrintDevice::isDefault() const
63{
64 return false;
65}
66
67bool QPlatformPrintDevice::isRemote() const
68{
69 return m_isRemote;
70}
71
72bool QPlatformPrintDevice::isValidPageLayout(const QPageLayout &layout, int resolution) const
73{
74 // Check the page size is supported
75 if (!supportedPageSize(pageSize: layout.pageSize()).isValid())
76 return false;
77
78 // In fullpage mode, margins outside the printable area are valid
79 if (layout.mode() == QPageLayout::FullPageMode)
80 return true;
81
82 // Check the margins are valid
83 QMarginsF pointMargins = layout.margins(units: QPageLayout::Point);
84 QMarginsF printMargins = printableMargins(pageSize: layout.pageSize(), orientation: layout.orientation(), resolution);
85 return pointMargins.left() >= printMargins.left()
86 && pointMargins.right() >= printMargins.right()
87 && pointMargins.top() >= printMargins.top()
88 && pointMargins.bottom() >= printMargins.bottom();
89}
90
91QPrint::DeviceState QPlatformPrintDevice::state() const
92{
93 return QPrint::Error;
94}
95
96bool QPlatformPrintDevice::supportsMultipleCopies() const
97{
98 return m_supportsMultipleCopies;
99}
100
101bool QPlatformPrintDevice::supportsCollateCopies() const
102{
103 return m_supportsCollateCopies;
104}
105
106void QPlatformPrintDevice::loadPageSizes() const
107{
108}
109
110QPageSize QPlatformPrintDevice::defaultPageSize() const
111{
112 return QPageSize();
113}
114
115QList<QPageSize> QPlatformPrintDevice::supportedPageSizes() const
116{
117 if (!m_havePageSizes)
118 loadPageSizes();
119 return m_pageSizes;
120}
121
122QPageSize QPlatformPrintDevice::supportedPageSize(const QPageSize &pageSize) const
123{
124 if (!pageSize.isValid())
125 return QPageSize();
126
127 if (!m_havePageSizes)
128 loadPageSizes();
129
130 // First try match on name and id for case where printer defines same size twice with different names
131 // e.g. Windows defines DMPAPER_11X17 and DMPAPER_TABLOID with names "11x17" and "Tabloid", but both
132 // map to QPageSize::Tabloid / PPD Key "Tabloid" / ANSI B Tabloid
133 if (pageSize.id() != QPageSize::Custom) {
134 for (const QPageSize &ps : std::as_const(t&: m_pageSizes)) {
135 if (ps.id() == pageSize.id() && ps.name() == pageSize.name())
136 return ps;
137 }
138 }
139
140 // Next try match on id only if not custom
141 if (pageSize.id() != QPageSize::Custom) {
142 for (const QPageSize &ps : std::as_const(t&: m_pageSizes)) {
143 if (ps.id() == pageSize.id())
144 return ps;
145 }
146 }
147
148 // Next try a match on size, in case it's a custom with a different name
149 return supportedPageSizeMatch(pageSize);
150}
151
152QPageSize QPlatformPrintDevice::supportedPageSize(QPageSize::PageSizeId pageSizeId) const
153{
154 if (!m_havePageSizes)
155 loadPageSizes();
156
157 for (const QPageSize &ps : std::as_const(t&: m_pageSizes)) {
158 if (ps.id() == pageSizeId)
159 return ps;
160 }
161
162 // If no supported page size found, try use a custom size instead if supported
163 return supportedPageSizeMatch(pageSize: QPageSize(pageSizeId));
164}
165
166QPageSize QPlatformPrintDevice::supportedPageSize(const QString &pageName) const
167{
168 if (!m_havePageSizes)
169 loadPageSizes();
170
171 for (const QPageSize &ps : std::as_const(t&: m_pageSizes)) {
172 if (ps.name() == pageName)
173 return ps;
174 }
175
176 return QPageSize();
177}
178
179QPageSize QPlatformPrintDevice::supportedPageSize(const QSize &sizePoints) const
180{
181 if (!m_havePageSizes)
182 loadPageSizes();
183
184 // Try to find a supported page size based on fuzzy-matched point size
185 return supportedPageSizeMatch(pageSize: QPageSize(sizePoints));
186}
187
188QPageSize QPlatformPrintDevice::supportedPageSize(const QSizeF &size, QPageSize::Unit units) const
189{
190 if (!m_havePageSizes)
191 loadPageSizes();
192
193 // Try to find a supported page size based on fuzzy-matched unit size
194 return supportedPageSizeMatch(pageSize: QPageSize(size, units));
195}
196
197QPageSize QPlatformPrintDevice::supportedPageSizeMatch(const QPageSize &pageSize) const
198{
199 // If it's a known page size, just return itself
200 if (m_pageSizes.contains(t: pageSize))
201 return pageSize;
202
203 // Try to find a supported page size based on point size
204 for (const QPageSize &ps : std::as_const(t&: m_pageSizes)) {
205 if (ps.sizePoints() == pageSize.sizePoints())
206 return ps;
207 }
208 return QPageSize();
209}
210
211bool QPlatformPrintDevice::supportsCustomPageSizes() const
212{
213 return m_supportsCustomPageSizes;
214}
215
216QSize QPlatformPrintDevice::minimumPhysicalPageSize() const
217{
218 return m_minimumPhysicalPageSize;
219}
220
221QSize QPlatformPrintDevice::maximumPhysicalPageSize() const
222{
223 return m_maximumPhysicalPageSize;
224}
225
226QMarginsF QPlatformPrintDevice::printableMargins(const QPageSize &pageSize,
227 QPageLayout::Orientation orientation,
228 int resolution) const
229{
230 Q_UNUSED(pageSize);
231 Q_UNUSED(orientation);
232 Q_UNUSED(resolution);
233 return QMarginsF(0, 0, 0, 0);
234}
235
236void QPlatformPrintDevice::loadResolutions() const
237{
238}
239
240int QPlatformPrintDevice::defaultResolution() const
241{
242 return 0;
243}
244
245QList<int> QPlatformPrintDevice::supportedResolutions() const
246{
247 if (!m_haveResolutions)
248 loadResolutions();
249 return m_resolutions;
250}
251
252void QPlatformPrintDevice::loadInputSlots() const
253{
254}
255
256QPrint::InputSlot QPlatformPrintDevice::defaultInputSlot() const
257{
258 QPrint::InputSlot input;
259 input.key = QByteArrayLiteral("Auto");
260 input.name = QCoreApplication::translate(context: "Print Device Input Slot", key: "Automatic");
261 input.id = QPrint::Auto;
262 return input;
263}
264
265QList<QPrint::InputSlot> QPlatformPrintDevice::supportedInputSlots() const
266{
267 if (!m_haveInputSlots)
268 loadInputSlots();
269 return m_inputSlots;
270}
271
272void QPlatformPrintDevice::loadOutputBins() const
273{
274}
275
276QPrint::OutputBin QPlatformPrintDevice::defaultOutputBin() const
277{
278 QPrint::OutputBin output;
279 output.key = QByteArrayLiteral("Auto");
280 output.name = QCoreApplication::translate(context: "Print Device Output Bin", key: "Automatic");
281 output.id = QPrint::AutoOutputBin;
282 return output;
283}
284
285QList<QPrint::OutputBin> QPlatformPrintDevice::supportedOutputBins() const
286{
287 if (!m_haveOutputBins)
288 loadOutputBins();
289 return m_outputBins;
290}
291
292void QPlatformPrintDevice::loadDuplexModes() const
293{
294}
295
296QPrint::DuplexMode QPlatformPrintDevice::defaultDuplexMode() const
297{
298 return QPrint::DuplexNone;
299}
300
301QList<QPrint::DuplexMode> QPlatformPrintDevice::supportedDuplexModes() const
302{
303 if (!m_haveDuplexModes)
304 loadDuplexModes();
305 return m_duplexModes;
306}
307
308void QPlatformPrintDevice::loadColorModes() const
309{
310}
311
312QPrint::ColorMode QPlatformPrintDevice::defaultColorMode() const
313{
314 return QPrint::GrayScale;
315}
316
317QList<QPrint::ColorMode> QPlatformPrintDevice::supportedColorModes() const
318{
319 if (!m_haveColorModes)
320 loadColorModes();
321 return m_colorModes;
322}
323
324#if QT_CONFIG(mimetype)
325void QPlatformPrintDevice::loadMimeTypes() const
326{
327}
328#endif // mimetype
329
330QVariant QPlatformPrintDevice::property(QPrintDevice::PrintDevicePropertyKey key) const
331{
332 Q_UNUSED(key);
333
334 return QVariant();
335}
336
337bool QPlatformPrintDevice::setProperty(QPrintDevice::PrintDevicePropertyKey key, const QVariant &value)
338{
339 Q_UNUSED(key);
340 Q_UNUSED(value);
341
342 return false;
343}
344
345bool QPlatformPrintDevice::isFeatureAvailable(QPrintDevice::PrintDevicePropertyKey key, const QVariant &params) const
346{
347 Q_UNUSED(key);
348 Q_UNUSED(params);
349
350 return false;
351}
352
353#if QT_CONFIG(mimetype)
354QList<QMimeType> QPlatformPrintDevice::supportedMimeTypes() const
355{
356 if (!m_haveMimeTypes)
357 loadMimeTypes();
358 return m_mimeTypes;
359}
360#endif // mimetype
361
362QPageSize QPlatformPrintDevice::createPageSize(const QString &key, const QSize &size, const QString &localizedName)
363{
364 return QPageSize(key, size, localizedName);
365}
366
367QPageSize QPlatformPrintDevice::createPageSize(int windowsId, const QSize &size, const QString &localizedName)
368{
369 return QPageSize(windowsId, size, localizedName);
370}
371
372#endif // QT_NO_PRINTER
373
374QT_END_NAMESPACE
375

Provided by KDAB

Privacy Policy
Start learning QML with our Intro Training
Find out more

source code of qtbase/src/printsupport/kernel/qplatformprintdevice.cpp