diff options
Diffstat (limited to 'src/printsupport')
-rw-r--r-- | src/printsupport/dialogs/qprintdialog_unix.cpp | 46 | ||||
-rw-r--r-- | src/printsupport/kernel/qcups_p.h | 1 | ||||
-rw-r--r-- | src/printsupport/kernel/qplatformprintdevice.cpp | 8 | ||||
-rw-r--r-- | src/printsupport/kernel/qplatformprintdevice.h | 1 | ||||
-rw-r--r-- | src/printsupport/kernel/qprintdevice.cpp | 5 | ||||
-rw-r--r-- | src/printsupport/kernel/qprintdevice_p.h | 1 |
6 files changed, 46 insertions, 16 deletions
diff --git a/src/printsupport/dialogs/qprintdialog_unix.cpp b/src/printsupport/dialogs/qprintdialog_unix.cpp index ab38c240e3..22d7dd1eca 100644 --- a/src/printsupport/dialogs/qprintdialog_unix.cpp +++ b/src/printsupport/dialogs/qprintdialog_unix.cpp @@ -271,6 +271,7 @@ public: { } + // These indices are related to ppd_option_t::choices not to childItems int selected; int originallySelected; }; @@ -1466,8 +1467,14 @@ void QPPDOptionsModel::parseOptions(QOptionTreeItem *parent) for (int i = 0; i < group->num_options; ++i) { if (!isBlacklistedOption(group->options[i].keyword)) { QOptionTreeItemOption *opt = new QOptionTreeItemOption(i, &group->options[i], parent); - parent->childItems.append(opt); parseChoices(opt); + + // Don't show options that are actually not options at all + // because they don't give the user any choice + if (opt->childItems.count() > 1) + parent->childItems.append(opt); + else + delete opt; } } } @@ -1477,15 +1484,18 @@ void QPPDOptionsModel::parseChoices(QOptionTreeItemOption *parent) const ppd_option_t *option = static_cast<const ppd_option_t*>(parent->ptr); bool marked = false; for (int i = 0; i < option->num_choices; ++i) { - QOptionTreeItem *choice = new QOptionTreeItem(QOptionTreeItem::Choice, i, &option->choices[i], parent); - if (static_cast<int>(option->choices[i].marked) == 1) { - parent->selected = i; - marked = true; - } else if (!marked && qstrcmp(option->choices[i].choice, option->defchoice) == 0) { - parent->selected = i; + const auto values = QStringList{} << QString::fromLatin1(option->keyword) << QString::fromLatin1(option->choices[i].choice); + if (!m_currentPrintDevice->isFeatureAvailable(PDPK_PpdChoiceIsInstallableConflict, values)) { + QOptionTreeItem *choice = new QOptionTreeItem(QOptionTreeItem::Choice, i, &option->choices[i], parent); + if (static_cast<int>(option->choices[i].marked) == 1) { + parent->selected = i; + marked = true; + } else if (!marked && qstrcmp(option->choices[i].choice, option->defchoice) == 0) { + parent->selected = i; + } + parent->originallySelected = parent->selected; + parent->childItems.append(choice); } - parent->originallySelected = parent->selected; - parent->childItems.append(choice); } } @@ -1627,11 +1637,10 @@ void QPPDOptionsEditor::setEditorData(QWidget *editor, const QModelIndex &index) const QPPDOptionsModel *m = static_cast<const QPPDOptionsModel*>(index.model()); for (auto *childItem : qAsConst(itm->childItems)) { const ppd_choice_t *choice = static_cast<const ppd_choice_t*>(childItem->ptr); - cb->addItem(m->cupsCodec()->toUnicode(choice->text)); + cb->addItem(m->cupsCodec()->toUnicode(choice->text), childItem->index); + if (childItem->index == itm->selected) + cb->setCurrentIndex(cb->count() - 1); } - - if (itm->selected > -1) - cb->setCurrentIndex(itm->selected); } void QPPDOptionsEditor::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const @@ -1639,15 +1648,20 @@ void QPPDOptionsEditor::setModelData(QWidget *editor, QAbstractItemModel *model, QComboBox *cb = static_cast<QComboBox*>(editor); QOptionTreeItemOption *itm = static_cast<QOptionTreeItemOption*>(index.internalPointer()); - if (itm->selected == cb->currentIndex()) + // We can't use cb->currentIndex() to know the index of the option in the choices[] array + // because some of them may not be present in the list because they conflict with the + // installable options so use the index passed on addItem + const int selectedChoiceIndex = cb->currentData().toInt(); + + if (itm->selected == selectedChoiceIndex || selectedChoiceIndex < 0) return; const ppd_option_t *opt = static_cast<const ppd_option_t*>(itm->ptr); QPPDOptionsModel *m = static_cast<QPPDOptionsModel*>(model); - const auto values = QStringList{} << QString::fromLatin1(opt->keyword) << QString::fromLatin1(opt->choices[cb->currentIndex()].choice); + const auto values = QStringList{} << QString::fromLatin1(opt->keyword) << QString::fromLatin1(opt->choices[selectedChoiceIndex].choice); m->currentPrintDevice()->setProperty(PDPK_PpdOption, values); - itm->selected = cb->currentIndex(); + itm->selected = selectedChoiceIndex; m->emitConflictsChanged(); } diff --git a/src/printsupport/kernel/qcups_p.h b/src/printsupport/kernel/qcups_p.h index 0afa7fa12f..da2b087d5b 100644 --- a/src/printsupport/kernel/qcups_p.h +++ b/src/printsupport/kernel/qcups_p.h @@ -73,6 +73,7 @@ QT_BEGIN_NAMESPACE #define PDPK_CupsJobSheets QPrintDevice::PrintDevicePropertyKey(QPrintDevice::PDPK_CustomBase + 3) #define PDPK_CupsJobBilling QPrintDevice::PrintDevicePropertyKey(QPrintDevice::PDPK_CustomBase + 4) #define PDPK_CupsJobHoldUntil QPrintDevice::PrintDevicePropertyKey(QPrintDevice::PDPK_CustomBase + 5) +#define PDPK_PpdChoiceIsInstallableConflict QPrintDevice::PrintDevicePropertyKey(QPrintDevice::PDPK_CustomBase + 6) class Q_PRINTSUPPORT_EXPORT QCUPSSupport { diff --git a/src/printsupport/kernel/qplatformprintdevice.cpp b/src/printsupport/kernel/qplatformprintdevice.cpp index 2f76156a91..8dba402a6e 100644 --- a/src/printsupport/kernel/qplatformprintdevice.cpp +++ b/src/printsupport/kernel/qplatformprintdevice.cpp @@ -396,6 +396,14 @@ bool QPlatformPrintDevice::setProperty(QPrintDevice::PrintDevicePropertyKey key, return false; } +bool QPlatformPrintDevice::isFeatureAvailable(QPrintDevice::PrintDevicePropertyKey key, const QVariant ¶ms) const +{ + Q_UNUSED(key) + Q_UNUSED(params) + + return false; +} + QList<QMimeType> QPlatformPrintDevice::supportedMimeTypes() const { if (!m_haveMimeTypes) diff --git a/src/printsupport/kernel/qplatformprintdevice.h b/src/printsupport/kernel/qplatformprintdevice.h index 8af76464b5..a988518547 100644 --- a/src/printsupport/kernel/qplatformprintdevice.h +++ b/src/printsupport/kernel/qplatformprintdevice.h @@ -123,6 +123,7 @@ public: virtual QVariant property(QPrintDevice::PrintDevicePropertyKey key) const; virtual bool setProperty(QPrintDevice::PrintDevicePropertyKey key, const QVariant &value); + virtual bool isFeatureAvailable(QPrintDevice::PrintDevicePropertyKey key, const QVariant ¶ms) const; #ifndef QT_NO_MIMETYPE virtual QList<QMimeType> supportedMimeTypes() const; diff --git a/src/printsupport/kernel/qprintdevice.cpp b/src/printsupport/kernel/qprintdevice.cpp index 2bc6906364..50fc14169d 100644 --- a/src/printsupport/kernel/qprintdevice.cpp +++ b/src/printsupport/kernel/qprintdevice.cpp @@ -255,6 +255,11 @@ bool QPrintDevice::setProperty(PrintDevicePropertyKey key, const QVariant &value return isValid() ? d->setProperty(key, value) : false; } +bool QPrintDevice::isFeatureAvailable(PrintDevicePropertyKey key, const QVariant ¶ms) const +{ + return isValid() ? d->isFeatureAvailable(key, params) : false; +} + #ifndef QT_NO_MIMETYPE QList<QMimeType> QPrintDevice::supportedMimeTypes() const { diff --git a/src/printsupport/kernel/qprintdevice_p.h b/src/printsupport/kernel/qprintdevice_p.h index 3dff2e54fe..562ccd2057 100644 --- a/src/printsupport/kernel/qprintdevice_p.h +++ b/src/printsupport/kernel/qprintdevice_p.h @@ -137,6 +137,7 @@ public: QVariant property(PrintDevicePropertyKey key) const; bool setProperty(PrintDevicePropertyKey key, const QVariant &value); + bool isFeatureAvailable(PrintDevicePropertyKey key, const QVariant ¶ms) const; #ifndef QT_NO_MIMETYPE QList<QMimeType> supportedMimeTypes() const; |