QPrinter/Windows: Fix handling of native paper source ids.

On Windows, it is possible to pass native Windows paper source
ids >= DMBIN_USER to QPrinter::setPaperSource() and they are
listed by supportedPaperSources().

Task-number: QTBUG-38897
Task-number: QTBUG-38888
Change-Id: I8f1264e80ce5bdddd3873602200b24eabee00502
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Reviewed-by: Andy Shaw <andy.shaw@digia.com>
This commit is contained in:
Friedemann Kleint 2014-05-13 14:08:05 +02:00 committed by The Qt Project
parent d3d8ade87b
commit 9a2dbcab7e
4 changed files with 57 additions and 21 deletions

View File

@ -78,6 +78,7 @@ static QPrint::InputSlot paperBinToInputSlot(int windowsId, const QString &name)
}
slot.key = inputSlotMap[i].key;
slot.id = inputSlotMap[i].id;
slot.windowsId = windowsId;
return slot;
}

View File

@ -1,6 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the QtGui module of the Qt Toolkit.
@ -972,6 +972,24 @@ void QWin32PrintEnginePrivate::doReinit()
}
}
static int indexOfId(const QList<QPrint::InputSlot> &inputSlots, QPrint::InputSlotId id)
{
for (int i = 0; i < inputSlots.size(); ++i) {
if (inputSlots.at(i).id == id)
return i;
}
return -1;
}
static int indexOfWindowsId(const QList<QPrint::InputSlot> &inputSlots, int windowsId)
{
for (int i = 0; i < inputSlots.size(); ++i) {
if (inputSlots.at(i).windowsId == windowsId)
return i;
}
return -1;
}
void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &value)
{
Q_D(QWin32PrintEngine);
@ -1114,16 +1132,14 @@ void QWin32PrintEngine::setProperty(PrintEnginePropertyKey key, const QVariant &
case PPK_PaperSource: {
if (!d->devMode)
break;
QPrint::InputSlotId inputSlotId = QPrint::InputSlotId(value.toInt());
foreach (const QPrint::InputSlot &inputSlot, d->m_printDevice.supportedInputSlots()) {
if (inputSlot.id == inputSlotId) {
d->devMode->dmDefaultSource = inputSlot.windowsId;
const QList<QPrint::InputSlot> inputSlots = d->m_printDevice.supportedInputSlots();
const int paperSource = value.toInt();
const int index = paperSource >= DMBIN_USER ?
indexOfWindowsId(inputSlots, paperSource) : indexOfId(inputSlots, QPrint::InputSlotId(paperSource));
d->devMode->dmDefaultSource = index >= 0 ? inputSlots.at(index).windowsId : DMBIN_AUTO;
d->doReinit();
break;
}
}
break;
}
case PPK_PrinterName: {
QString id = value.toString();
@ -1337,12 +1353,12 @@ QVariant QWin32PrintEngine::property(PrintEnginePropertyKey key) const
if (!d->devMode) {
value = d->m_printDevice.defaultInputSlot().id;
} else {
value = QPrint::Auto;
foreach (const QPrint::InputSlot inputSlot, d->m_printDevice.supportedInputSlots()) {
if (inputSlot.windowsId == d->devMode->dmDefaultSource) {
value = inputSlot.id;
break;
}
if (d->devMode->dmDefaultSource >= DMBIN_USER) {
value = int(d->devMode->dmDefaultSource);
} else {
const QList<QPrint::InputSlot> inputSlots = d->m_printDevice.supportedInputSlots();
const int index = indexOfWindowsId(inputSlots, d->devMode->dmDefaultSource);
value = index >= 0 ? inputSlots.at(index).id : QPrint::Auto;
}
}
break;
@ -1371,7 +1387,7 @@ QVariant QWin32PrintEngine::property(PrintEnginePropertyKey key) const
case PPK_PaperSources: {
QList<QVariant> out;
foreach (const QPrint::InputSlot inputSlot, d->m_printDevice.supportedInputSlots())
out << inputSlot.id;
out << QVariant(inputSlot.id == QPrint::CustomInputSlot ? inputSlot.windowsId : int(inputSlot.id));
value = out;
break;
}

View File

@ -1,6 +1,6 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of the test suite of the Qt Toolkit.
@ -474,6 +474,15 @@ void PrintDialogPanel::retrieveSettings(const QPrinter *printer)
setComboBoxValue(m_panel.m_colorModeCombo, printer->colorMode());
m_panel.m_resolution->setValue(printer->resolution());
#ifdef Q_OS_WIN
QString availPaperSources;
foreach (QPrinter::PaperSource ps, printer->supportedPaperSources())
availPaperSources += QString::number(int(ps)) + QLatin1Char(' ');
m_panel.availPaperSourceLabel->setText(availPaperSources);
#else
m_panel.availPaperSourceLabel->setText(QLatin1String("N/A"));
#endif
#if QT_VERSION >= 0x050300
m_pageLayout = printer->pageLayout();
#else

View File

@ -527,24 +527,24 @@
<item row="7" column="1">
<widget class="QComboBox" name="m_paperSourceCombo"/>
</item>
<item row="8" column="0">
<item row="9" column="0">
<widget class="QLabel" name="label_23">
<property name="text">
<string>Color Mode:</string>
</property>
</widget>
</item>
<item row="8" column="1">
<item row="9" column="1">
<widget class="QComboBox" name="m_colorModeCombo"/>
</item>
<item row="9" column="0">
<item row="10" column="0">
<widget class="QLabel" name="label_28">
<property name="text">
<string>Resolution:</string>
</property>
</widget>
</item>
<item row="9" column="1">
<item row="10" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="QSpinBox" name="m_resolution">
@ -584,6 +584,16 @@
<item row="4" column="1">
<widget class="QComboBox" name="m_pageOrderCombo"/>
</item>
<item row="8" column="0">
<widget class="QLabel" name="availPaperSourceDescLabel">
<property name="text">
<string>Available Paper Sources:</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QLabel" name="availPaperSourceLabel"/>
</item>
</layout>
</widget>
</item>