From 9a2dbcab7e820c63aac55ba08dc120a56986efac Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 13 May 2014 14:08:05 +0200 Subject: 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 Reviewed-by: Andy Shaw --- .../printsupport/windows/qwindowsprintdevice.cpp | 1 + src/printsupport/kernel/qprintengine_win.cpp | 48 ++++++++++++++-------- tests/manual/dialogs/printdialogpanel.cpp | 11 ++++- tests/manual/dialogs/printdialogpanel.ui | 18 ++++++-- 4 files changed, 57 insertions(+), 21 deletions(-) diff --git a/src/plugins/printsupport/windows/qwindowsprintdevice.cpp b/src/plugins/printsupport/windows/qwindowsprintdevice.cpp index 1b55937ec7..2c75ab7016 100644 --- a/src/plugins/printsupport/windows/qwindowsprintdevice.cpp +++ b/src/plugins/printsupport/windows/qwindowsprintdevice.cpp @@ -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; } diff --git a/src/printsupport/kernel/qprintengine_win.cpp b/src/printsupport/kernel/qprintengine_win.cpp index 52b67d162b..427af13edf 100644 --- a/src/printsupport/kernel/qprintengine_win.cpp +++ b/src/printsupport/kernel/qprintengine_win.cpp @@ -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 &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 &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,14 +1132,12 @@ 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; - d->doReinit(); - break; - } - } + const QList 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; } @@ -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 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 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; } diff --git a/tests/manual/dialogs/printdialogpanel.cpp b/tests/manual/dialogs/printdialogpanel.cpp index 1a18f94406..e316486fcf 100644 --- a/tests/manual/dialogs/printdialogpanel.cpp +++ b/tests/manual/dialogs/printdialogpanel.cpp @@ -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 diff --git a/tests/manual/dialogs/printdialogpanel.ui b/tests/manual/dialogs/printdialogpanel.ui index 2f0fe606a3..f4bab6fd9a 100644 --- a/tests/manual/dialogs/printdialogpanel.ui +++ b/tests/manual/dialogs/printdialogpanel.ui @@ -527,24 +527,24 @@ - + Color Mode: - + - + Resolution: - + @@ -584,6 +584,16 @@ + + + + Available Paper Sources: + + + + + + -- cgit v1.2.3