QtPrintSupport: use CUPS defaults for UNIX print dialog

Update printer defaults in UNIX print dialog when printer
is changed.

Task-number: QTBUG-23037
Task-number: QTBUG-6239
Task-number: QTBUG-15351
Task-number: QTBUG-19233
Task-number: QTBUG-22036

Change-Id: Ib03635035211bd69b5b23da20ffd2c03ac318a1a
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
This commit is contained in:
Teemu Katajisto 2012-08-22 12:09:21 +03:00 committed by The Qt Project
parent 69de617761
commit be6e270d12
3 changed files with 181 additions and 293 deletions

View File

@ -58,7 +58,6 @@
# include <private/qcups_p.h> # include <private/qcups_p.h>
#endif #endif
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
QSizeF qt_printerPaperSize(QPrinter::Orientation, QPrinter::PaperSize, QPrinter::Unit, int); QSizeF qt_printerPaperSize(QPrinter::Orientation, QPrinter::PaperSize, QPrinter::Unit, int);
@ -224,26 +223,14 @@ public:
void init(); void init();
QPageSetupWidget *widget; QPageSetupWidget *widget;
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
QCUPSSupport *cups;
#endif
}; };
QUnixPageSetupDialogPrivate::QUnixPageSetupDialogPrivate(QPrinter *printer) : QPageSetupDialogPrivate(printer) QUnixPageSetupDialogPrivate::QUnixPageSetupDialogPrivate(QPrinter *printer) : QPageSetupDialogPrivate(printer)
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
, cups(0)
#endif
{ {
} }
QUnixPageSetupDialogPrivate::~QUnixPageSetupDialogPrivate() QUnixPageSetupDialogPrivate::~QUnixPageSetupDialogPrivate()
{ {
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
if (cups) {
delete cups;
cups = 0;
}
#endif
} }
void QUnixPageSetupDialogPrivate::init() void QUnixPageSetupDialogPrivate::init()
@ -252,14 +239,6 @@ void QUnixPageSetupDialogPrivate::init()
widget = new QPageSetupWidget(q); widget = new QPageSetupWidget(q);
widget->setPrinter(printer); widget->setPrinter(printer);
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
if (printer->outputFormat() == QPrinter::NativeFormat && QCUPSSupport::isAvailable()) {
cups = new QCUPSSupport;
widget->selectPrinter(cups);
} else {
cups = 0;
}
#endif
QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Ok QDialogButtonBox *buttons = new QDialogButtonBox(QDialogButtonBox::Ok
| QDialogButtonBox::Cancel, | QDialogButtonBox::Cancel,
@ -276,7 +255,7 @@ QPageSetupWidget::QPageSetupWidget(QWidget *parent)
: QWidget(parent), : QWidget(parent),
m_printer(0), m_printer(0),
m_blockSignals(false), m_blockSignals(false),
m_cups(0) m_cups(false)
{ {
widget.setupUi(this); widget.setupUi(this);
@ -365,29 +344,22 @@ void QPageSetupWidget::setupPrinter() const
ps = val.toInt(); ps = val.toInt();
} }
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) #if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
else if (m_cups && QCUPSSupport::isAvailable() && m_cups->currentPPD()) { else if (val.type() == QVariant::ByteArray) {
QByteArray cupsPageSize = val.toByteArray(); for (int papersize = 0; papersize < QPrinter::NPageSize; ++papersize) {
QPrintEngine *engine = m_printer->printEngine(); QPdf::PaperSize size = QPdf::paperSize(QPrinter::PaperSize(papersize));
engine->setProperty(PPK_CupsStringPageSize, QString::fromLatin1(cupsPageSize)); if (size.width == m_paperSize.width() && size.height == m_paperSize.height()) {
engine->setProperty(PPK_CupsOptions, m_cups->options()); ps = static_cast<QPrinter::PaperSize>(papersize);
QRect pageRect = m_cups->pageRect(cupsPageSize);
engine->setProperty(PPK_CupsPageRect, pageRect);
QRect paperRect = m_cups->paperRect(cupsPageSize);
engine->setProperty(PPK_CupsPaperRect, paperRect);
for(ps = 0; ps < QPrinter::NPageSize; ++ps) {
QPdf::PaperSize size = QPdf::paperSize(QPrinter::PaperSize(ps));
if (size.width == paperRect.width() && size.height == paperRect.height())
break; break;
}
} }
} }
#endif #endif
if (ps == QPrinter::Custom) if (ps == QPrinter::Custom) {
m_printer->setPaperSize(sizeForOrientation(orientation, m_paperSize), QPrinter::Point); m_printer->setPaperSize(sizeForOrientation(orientation, m_paperSize), QPrinter::Point);
else }
else {
m_printer->setPaperSize(static_cast<QPrinter::PaperSize>(ps)); m_printer->setPaperSize(static_cast<QPrinter::PaperSize>(ps));
}
#ifdef PSD_ENABLE_PAPERSOURCE #ifdef PSD_ENABLE_PAPERSOURCE
m_printer->setPaperSource((QPrinter::PaperSource)widget.paperSource->currentIndex()); m_printer->setPaperSource((QPrinter::PaperSource)widget.paperSource->currentIndex());
@ -396,13 +368,14 @@ void QPageSetupWidget::setupPrinter() const
} }
void QPageSetupWidget::selectPrinter(QCUPSSupport *cups) void QPageSetupWidget::selectPrinter()
{ {
m_cups = cups;
widget.paperSize->clear(); widget.paperSize->clear();
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) #if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
if (m_cups && QCUPSSupport::isAvailable()) { if (QCUPSSupport::isAvailable()) {
const ppd_option_t* pageSizes = m_cups->pageSizes(); m_cups = true;
QCUPSSupport cups;
const ppd_option_t* pageSizes = cups.pageSizes();
const int numChoices = pageSizes ? pageSizes->num_choices : 0; const int numChoices = pageSizes ? pageSizes->num_choices : 0;
int cupsDefaultSize = 0; int cupsDefaultSize = 0;
@ -412,13 +385,11 @@ void QPageSetupWidget::selectPrinter(QCUPSSupport *cups)
widget.paperSize->addItem(QString::fromLocal8Bit(pageSizes->choices[i].text), QByteArray(pageSizes->choices[i].choice)); widget.paperSize->addItem(QString::fromLocal8Bit(pageSizes->choices[i].text), QByteArray(pageSizes->choices[i].choice));
if (static_cast<int>(pageSizes->choices[i].marked) == 1) if (static_cast<int>(pageSizes->choices[i].marked) == 1)
cupsDefaultSize = i; cupsDefaultSize = i;
if (m_printer->d_func()->hasUserSetPageSize) { QRect cupsPaperSize = cups.paperRect(pageSizes->choices[i].choice);
QRect cupsPaperSize = m_cups->paperRect(pageSizes->choices[i].choice); QSize diff = cupsPaperSize.size() - qtPreferredSize;
QSize diff = cupsPaperSize.size() - qtPreferredSize; if (qAbs(diff.width()) < 5 && qAbs(diff.height()) < 5) {
if (qAbs(diff.width()) < 5 && qAbs(diff.height()) < 5) { widget.paperSize->setCurrentIndex(i);
widget.paperSize->setCurrentIndex(i); preferredSizeMatched = true;
preferredSizeMatched = true;
}
} }
} }
if (!preferredSizeMatched) if (!preferredSizeMatched)
@ -427,15 +398,16 @@ void QPageSetupWidget::selectPrinter(QCUPSSupport *cups)
m_printer->getPageMargins(&m_leftMargin, &m_topMargin, &m_rightMargin, &m_bottomMargin, QPrinter::Point); m_printer->getPageMargins(&m_leftMargin, &m_topMargin, &m_rightMargin, &m_bottomMargin, QPrinter::Point);
} else { } else {
QByteArray cupsPaperSizeChoice = widget.paperSize->itemData(widget.paperSize->currentIndex()).toByteArray(); QByteArray cupsPaperSizeChoice = widget.paperSize->itemData(widget.paperSize->currentIndex()).toByteArray();
QRect paper = m_cups->paperRect(cupsPaperSizeChoice); QRect paper = cups.paperRect(cupsPaperSizeChoice);
QRect content = m_cups->pageRect(cupsPaperSizeChoice); QRect content = cups.pageRect(cupsPaperSizeChoice);
m_leftMargin = content.x() - paper.x(); m_leftMargin = content.x() - paper.x();
m_topMargin = content.y() - paper.y(); m_topMargin = content.y() - paper.y();
m_rightMargin = paper.right() - content.right(); m_rightMargin = paper.right() - content.right();
m_bottomMargin = paper.bottom() - content.bottom(); m_bottomMargin = paper.bottom() - content.bottom();
} }
} } else
m_cups = false;
#endif #endif
if (widget.paperSize->count() == 0) { if (widget.paperSize->count() == 0) {
populatePaperSizes(widget.paperSize); populatePaperSizes(widget.paperSize);
@ -445,19 +417,17 @@ void QPageSetupWidget::selectPrinter(QCUPSSupport *cups)
unitChanged(widget.unit->currentIndex()); unitChanged(widget.unit->currentIndex());
m_pagePreview->setMargins(m_leftMargin, m_topMargin, m_rightMargin, m_bottomMargin); m_pagePreview->setMargins(m_leftMargin, m_topMargin, m_rightMargin, m_bottomMargin);
// setup printer here the first time
setupPrinter();
} }
void QPageSetupWidget::selectPdfPsPrinter(const QPrinter *p) void QPageSetupWidget::selectPdfPsPrinter(const QPrinter *p)
{ {
m_cups = 0; m_cups = false;
widget.paperSize->clear(); widget.paperSize->clear();
populatePaperSizes(widget.paperSize); populatePaperSizes(widget.paperSize);
widget.paperSize->setCurrentIndex(widget.paperSize->findData(p->paperSize())); widget.paperSize->setCurrentIndex(widget.paperSize->findData(p->paperSize()));
m_leftMargin = 90;
m_topMargin = 72;
m_bottomMargin = 72;
m_rightMargin = 90;
unitChanged(widget.unit->currentIndex()); unitChanged(widget.unit->currentIndex());
m_pagePreview->setMargins(m_leftMargin, m_topMargin, m_rightMargin, m_bottomMargin); m_pagePreview->setMargins(m_leftMargin, m_topMargin, m_rightMargin, m_bottomMargin);
} }
@ -482,7 +452,7 @@ void QPageSetupWidget::_q_paperSizeChanged()
bool custom = size == QPrinter::Custom; bool custom = size == QPrinter::Custom;
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) #if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
custom = custom ? !m_cups : custom; custom = custom ? m_cups : custom;
#endif #endif
widget.paperWidth->setEnabled(custom); widget.paperWidth->setEnabled(custom);
@ -496,9 +466,10 @@ void QPageSetupWidget::_q_paperSizeChanged()
} else { } else {
Q_ASSERT(m_printer); Q_ASSERT(m_printer);
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) #if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
if (m_cups) { // combobox is filled with cups based data if (m_cups && QCUPSSupport::isAvailable()) { // combobox is filled with cups based data
QCUPSSupport cups;
QByteArray cupsPageSize = widget.paperSize->itemData(widget.paperSize->currentIndex()).toByteArray(); QByteArray cupsPageSize = widget.paperSize->itemData(widget.paperSize->currentIndex()).toByteArray();
m_paperSize = m_cups->paperRect(cupsPageSize).size(); m_paperSize = cups.paperRect(cupsPageSize).size();
if (orientation == QPrinter::Landscape) if (orientation == QPrinter::Landscape)
m_paperSize = QSizeF(m_paperSize.height(), m_paperSize.width()); // swap m_paperSize = QSizeF(m_paperSize.height(), m_paperSize.width()); // swap
} }

View File

@ -73,7 +73,7 @@ public:
void setPrinter(QPrinter *printer); void setPrinter(QPrinter *printer);
/// copy information from the widget and apply that to the printer. /// copy information from the widget and apply that to the printer.
void setupPrinter() const; void setupPrinter() const;
void selectPrinter(QCUPSSupport *m_cups); void selectPrinter();
void selectPdfPsPrinter(const QPrinter *p); void selectPdfPsPrinter(const QPrinter *p);
private slots: private slots:
@ -96,7 +96,7 @@ private:
QSizeF m_paperSize; QSizeF m_paperSize;
qreal m_currentMultiplier; qreal m_currentMultiplier;
bool m_blockSignals; bool m_blockSignals;
QCUPSSupport *m_cups; bool m_cups;
}; };
QT_END_NAMESPACE QT_END_NAMESPACE

View File

@ -52,6 +52,7 @@
#include <QtWidgets/qfilesystemmodel.h> #include <QtWidgets/qfilesystemmodel.h>
#include <QtWidgets/qstyleditemdelegate.h> #include <QtWidgets/qstyleditemdelegate.h>
#include <QtPrintSupport/qprinter.h> #include <QtPrintSupport/qprinter.h>
#include <QtPrintSupport/qprinterinfo.h>
#include <private/qprintengine_pdf_p.h> #include <private/qprintengine_pdf_p.h>
#include <QtWidgets/qdialogbuttonbox.h> #include <QtWidgets/qdialogbuttonbox.h>
@ -113,10 +114,6 @@ public:
QPrintPropertiesDialog(QAbstractPrintDialog *parent = 0); QPrintPropertiesDialog(QAbstractPrintDialog *parent = 0);
~QPrintPropertiesDialog(); ~QPrintPropertiesDialog();
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
void setCups(QCUPSSupport *cups) { m_cups = cups; }
#endif
void selectPrinter(); void selectPrinter();
void selectPdfPsPrinter(const QPrinter *p); void selectPdfPsPrinter(const QPrinter *p);
@ -130,9 +127,6 @@ protected:
private: private:
Ui::QPrintPropertiesWidget widget; Ui::QPrintPropertiesWidget widget;
QDialogButtonBox *m_buttons; QDialogButtonBox *m_buttons;
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
QCUPSSupport *m_cups;
#endif
}; };
class QUnixPrintWidgetPrivate; class QUnixPrintWidgetPrivate;
@ -158,18 +152,15 @@ private:
class QUnixPrintWidgetPrivate class QUnixPrintWidgetPrivate
{ {
public: public:
QUnixPrintWidgetPrivate(QUnixPrintWidget *q); QUnixPrintWidgetPrivate(QUnixPrintWidget *q, QPrinter *prn);
~QUnixPrintWidgetPrivate(); ~QUnixPrintWidgetPrivate();
/// copy printer properties to the widget /// copy printer properties to the widget
void applyPrinterProperties(QPrinter *p); void applyPrinterProperties();
bool checkFields(); bool checkFields();
void setupPrinter(); void setupPrinter();
void setOptionsPane(QPrintDialogPrivate *pane); void setOptionsPane(QPrintDialogPrivate *pane);
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) void setupPrinterProperties();
void setCupsProperties();
#endif
// slots // slots
void _q_printerChanged(int index); void _q_printerChanged(int index);
void _q_btnPropertiesClicked(); void _q_btnPropertiesClicked();
@ -185,12 +176,7 @@ public:
private: private:
QPrintDialogPrivate *optionsPane; QPrintDialogPrivate *optionsPane;
bool filePrintersAdded; bool filePrintersAdded;
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) bool propertiesDialogShown;
QCUPSSupport* cups;
int cupsPrinterCount;
const cups_dest_t* cupsPrinters;
const ppd_file_t* cupsPPD;
#endif
}; };
class QPrintDialogPrivate : public QAbstractPrintDialogPrivate class QPrintDialogPrivate : public QAbstractPrintDialogPrivate
@ -203,11 +189,9 @@ public:
void init(); void init();
/// copy printer properties to the widget /// copy printer properties to the widget
void applyPrinterProperties(QPrinter *p); void applyPrinterProperties();
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) void selectPrinter();
void selectPrinter(QCUPSSupport *cups);
#endif
void _q_chbPrintLastFirstToggled(bool); void _q_chbPrintLastFirstToggled(bool);
#ifndef QT_NO_MESSAGEBOX #ifndef QT_NO_MESSAGEBOX
@ -242,9 +226,6 @@ public:
QPrintPropertiesDialog::QPrintPropertiesDialog(QAbstractPrintDialog *parent) QPrintPropertiesDialog::QPrintPropertiesDialog(QAbstractPrintDialog *parent)
: QDialog(parent) : QDialog(parent)
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
, m_cups(0)
#endif
{ {
QVBoxLayout *lay = new QVBoxLayout(this); QVBoxLayout *lay = new QVBoxLayout(this);
this->setLayout(lay); this->setLayout(lay);
@ -274,14 +255,7 @@ void QPrintPropertiesDialog::setupPrinter() const
void QPrintPropertiesDialog::selectPrinter() void QPrintPropertiesDialog::selectPrinter()
{ {
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) widget.pageSetup->selectPrinter();
if (m_cups && QCUPSSupport::isAvailable()) {
widget.pageSetup->selectPrinter(m_cups);
} else
#endif
{
widget.pageSetup->selectPrinter(0);
}
} }
void QPrintPropertiesDialog::selectPdfPsPrinter(const QPrinter *p) void QPrintPropertiesDialog::selectPdfPsPrinter(const QPrinter *p)
@ -305,7 +279,6 @@ void QPrintPropertiesDialog::showEvent(QShowEvent* event)
tabs that expands when the Options button is selected. tabs that expands when the Options button is selected.
*/ */
QPrintDialogPrivate::QPrintDialogPrivate() QPrintDialogPrivate::QPrintDialogPrivate()
: top(0), bottom(0), buttons(0), collapseButton(0) : top(0), bottom(0), buttons(0), collapseButton(0)
{ {
@ -319,7 +292,7 @@ void QPrintDialogPrivate::init()
{ {
Q_Q(QPrintDialog); Q_Q(QPrintDialog);
top = new QUnixPrintWidget(0, q); top = new QUnixPrintWidget(q->printer(), q);
bottom = new QWidget(q); bottom = new QWidget(q);
options.setupUi(bottom); options.setupUi(bottom);
options.color->setIconSize(QSize(32, 32)); options.color->setIconSize(QSize(32, 32));
@ -343,10 +316,6 @@ void QPrintDialogPrivate::init()
lay->addWidget(bottom); lay->addWidget(bottom);
lay->addWidget(buttons); lay->addWidget(buttons);
QPrinter* p = q->printer();
applyPrinterProperties(p);
#ifdef QT_NO_MESSAGEBOX #ifdef QT_NO_MESSAGEBOX
QObject::connect(buttons, SIGNAL(accepted()), q, SLOT(accept())); QObject::connect(buttons, SIGNAL(accepted()), q, SLOT(accept()));
#else #else
@ -360,26 +329,73 @@ void QPrintDialogPrivate::init()
QObject::connect(collapseButton, SIGNAL(released()), q, SLOT(_q_collapseOrExpandDialog())); QObject::connect(collapseButton, SIGNAL(released()), q, SLOT(_q_collapseOrExpandDialog()));
} }
void QPrintDialogPrivate::applyPrinterProperties(QPrinter *p) // initialize printer options
void QPrintDialogPrivate::selectPrinter()
{ {
if (p->colorMode() == QPrinter::Color) Q_Q(QPrintDialog);
options.color->setChecked(true); QPrinter *p = q->printer();
else
options.grayscale->setChecked(true);
switch(p->duplex()) { if (p->colorMode() == QPrinter::Color)
case QPrinter::DuplexNone: options.color->setChecked(true);
options.noDuplex->setChecked(true); break; else
case QPrinter::DuplexLongSide: options.grayscale->setChecked(true);
case QPrinter::DuplexAuto:
options.duplexLong->setChecked(true); break; switch (p->duplex()) {
case QPrinter::DuplexShortSide: case QPrinter::DuplexNone:
options.duplexShort->setChecked(true); break; options.noDuplex->setChecked(true); break;
case QPrinter::DuplexLongSide:
case QPrinter::DuplexAuto:
options.duplexLong->setChecked(true); break;
case QPrinter::DuplexShortSide:
options.duplexShort->setChecked(true); break;
}
options.copies->setValue(p->copyCount());
options.collate->setChecked(p->collateCopies());
options.reverse->setChecked(p->pageOrder() == QPrinter::LastPageFirst);
}
void QPrintDialogPrivate::applyPrinterProperties()
{
// apply printer options to property dialog
top->d->applyPrinterProperties();
}
void QPrintDialogPrivate::setupPrinter()
{
Q_Q(QPrintDialog);
QPrinter* p = q->printer();
if (options.duplex->isEnabled()) {
if (options.noDuplex->isChecked())
p->setDuplex(QPrinter::DuplexNone);
else if (options.duplexLong->isChecked())
p->setDuplex(QPrinter::DuplexLongSide);
else
p->setDuplex(QPrinter::DuplexShortSide);
} }
options.copies->setValue(p->copyCount());
options.collate->setChecked(p->collateCopies()); p->setColorMode(options.color->isChecked() ? QPrinter::Color : QPrinter::GrayScale);
options.reverse->setChecked(p->pageOrder() == QPrinter::LastPageFirst);
top->d->applyPrinterProperties(p); // print range
if (options.printAll->isChecked()) {
p->setPrintRange(QPrinter::AllPages);
p->setFromTo(0,0);
} else if (options.printSelection->isChecked()) {
p->setPrintRange(QPrinter::Selection);
p->setFromTo(0,0);
} else if (options.printCurrentPage->isChecked()) {
p->setPrintRange(QPrinter::CurrentPage);
p->setFromTo(0,0);
} else if (options.printRange->isChecked()) {
p->setPrintRange(QPrinter::PageRange);
p->setFromTo(options.from->value(), qMax(options.from->value(), options.to->value()));
}
// copies
p->setCopyCount(options.copies->value());
p->setCollateCopies(options.collate->isChecked());
top->d->setupPrinter();
} }
void QPrintDialogPrivate::_q_chbPrintLastFirstToggled(bool checked) void QPrintDialogPrivate::_q_chbPrintLastFirstToggled(bool checked)
@ -418,43 +434,6 @@ void QPrintDialogPrivate::_q_checkFields()
} }
#endif // QT_NO_MESSAGEBOX #endif // QT_NO_MESSAGEBOX
void QPrintDialogPrivate::setupPrinter()
{
Q_Q(QPrintDialog);
QPrinter* p = q->printer();
if (options.duplex->isEnabled()) {
if (options.noDuplex->isChecked())
p->setDuplex(QPrinter::DuplexNone);
else if (options.duplexLong->isChecked())
p->setDuplex(QPrinter::DuplexLongSide);
else
p->setDuplex(QPrinter::DuplexShortSide);
}
p->setColorMode( options.color->isChecked() ? QPrinter::Color : QPrinter::GrayScale );
// print range
if (options.printAll->isChecked()) {
p->setPrintRange(QPrinter::AllPages);
p->setFromTo(0,0);
} else if (options.printSelection->isChecked()) {
p->setPrintRange(QPrinter::Selection);
p->setFromTo(0,0);
} else if (options.printCurrentPage->isChecked()) {
p->setPrintRange(QPrinter::CurrentPage);
p->setFromTo(0,0);
} else if (options.printRange->isChecked()) {
p->setPrintRange(QPrinter::PageRange);
p->setFromTo(options.from->value(), qMax(options.from->value(), options.to->value()));
}
// copies
p->setCopyCount(options.copies->value());
p->setCollateCopies(options.collate->isChecked());
top->d->setupPrinter();
}
void QPrintDialogPrivate::updateWidgets() void QPrintDialogPrivate::updateWidgets()
{ {
@ -500,9 +479,6 @@ void QPrintDialogPrivate::updateWidgets()
void QPrintDialogPrivate::setTabs(const QList<QWidget*> &tabWidgets) void QPrintDialogPrivate::setTabs(const QList<QWidget*> &tabWidgets)
{ {
while(options.tabs->count() > 2)
delete options.tabs->widget(2);
QList<QWidget*>::ConstIterator iter = tabWidgets.begin(); QList<QWidget*>::ConstIterator iter = tabWidgets.begin();
while(iter != tabWidgets.constEnd()) { while(iter != tabWidgets.constEnd()) {
QWidget *tab = *iter; QWidget *tab = *iter;
@ -511,13 +487,6 @@ void QPrintDialogPrivate::setTabs(const QList<QWidget*> &tabWidgets)
} }
} }
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
void QPrintDialogPrivate::selectPrinter(QCUPSSupport *cups)
{
options.duplex->setEnabled(cups && cups->ppdOption("Duplex"));
}
#endif
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -587,11 +556,9 @@ void QPrintDialog::accept()
/*! \internal /*! \internal
*/ */
QUnixPrintWidgetPrivate::QUnixPrintWidgetPrivate(QUnixPrintWidget *p) QUnixPrintWidgetPrivate::QUnixPrintWidgetPrivate(QUnixPrintWidget *p, QPrinter *prn)
: parent(p), propertiesDialog(0), printer(0), optionsPane(0), filePrintersAdded(false) : parent(p), propertiesDialog(0), printer(prn), optionsPane(0),
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) filePrintersAdded(false), propertiesDialogShown(false)
, cups(0), cupsPrinterCount(0), cupsPrinters(0), cupsPPD(0)
#endif
{ {
q = 0; q = 0;
if (parent) if (parent)
@ -600,30 +567,15 @@ QUnixPrintWidgetPrivate::QUnixPrintWidgetPrivate(QUnixPrintWidget *p)
widget.setupUi(parent); widget.setupUi(parent);
int currentPrinterIndex = 0; int currentPrinterIndex = 0;
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) QList<QPrinterInfo> printers = QPrinterInfo::availablePrinters();
cups = new QCUPSSupport;
if (QCUPSSupport::isAvailable()) {
cupsPPD = cups->currentPPD();
cupsPrinterCount = cups->availablePrintersCount();
cupsPrinters = cups->availablePrinters();
for (int i = 0; i < cupsPrinterCount; ++i) { for (int i = 0; i < printers.size(); ++i) {
QString printerName(QString::fromLocal8Bit(cupsPrinters[i].name)); QPrinterInfo pInfo = printers.at(i);
if (cupsPrinters[i].instance) widget.printers->addItem(pInfo.printerName());
printerName += QLatin1Char('/') + QString::fromLocal8Bit(cupsPrinters[i].instance); if (pInfo.isDefault())
currentPrinterIndex = i;
widget.printers->addItem(printerName);
if (cupsPrinters[i].is_default)
widget.printers->setCurrentIndex(i);
}
// the model depends on valid ppd. so before enabling the
// properties button we make sure the ppd is in fact valid.
if (cupsPrinterCount && cups->currentPPD()) {
widget.properties->setEnabled(true);
}
currentPrinterIndex = cups->currentPrinterIndex();
} }
#endif widget.properties->setEnabled(true);
#if !defined(QT_NO_FILESYSTEMMODEL) && !defined(QT_NO_COMPLETER) #if !defined(QT_NO_FILESYSTEMMODEL) && !defined(QT_NO_COMPLETER)
QFileSystemModel *fsm = new QFileSystemModel(widget.filename); QFileSystemModel *fsm = new QFileSystemModel(widget.filename);
@ -675,9 +627,6 @@ void QUnixPrintWidgetPrivate::updateWidget()
QUnixPrintWidgetPrivate::~QUnixPrintWidgetPrivate() QUnixPrintWidgetPrivate::~QUnixPrintWidgetPrivate()
{ {
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
delete cups;
#endif
} }
void QUnixPrintWidgetPrivate::_q_printerChanged(int index) void QUnixPrintWidgetPrivate::_q_printerChanged(int index)
@ -688,6 +637,13 @@ void QUnixPrintWidgetPrivate::_q_printerChanged(int index)
widget.filename->setEnabled(false); widget.filename->setEnabled(false);
widget.lOutput->setEnabled(false); widget.lOutput->setEnabled(false);
// Reset properties dialog when printer is changed
if (propertiesDialog){
delete propertiesDialog;
propertiesDialog = 0;
propertiesDialogShown = false;
}
if (filePrintersAdded) { if (filePrintersAdded) {
Q_ASSERT(index != printerCount - 2); // separator Q_ASSERT(index != printerCount - 2); // separator
if (index == printerCount - 1) { // PDF if (index == printerCount - 1) { // PDF
@ -696,52 +652,31 @@ void QUnixPrintWidgetPrivate::_q_printerChanged(int index)
widget.properties->setEnabled(true); widget.properties->setEnabled(true);
widget.filename->setEnabled(true); widget.filename->setEnabled(true);
QString filename = widget.filename->text(); QString filename = widget.filename->text();
QString suffix = QFileInfo(filename).suffix();
widget.filename->setText(filename); widget.filename->setText(filename);
widget.lOutput->setEnabled(true); widget.lOutput->setEnabled(true);
if (propertiesDialog)
propertiesDialog->selectPdfPsPrinter(printer);
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
if (optionsPane) if (optionsPane)
optionsPane->selectPrinter(0); optionsPane->selectPrinter();
#endif
return; return;
} }
} }
widget.location->setText(QString()); if (printer) {
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY) QString printerName = widget.printers->itemText(index);
if (QCUPSSupport::isAvailable()) { printer->setPrinterName(printerName);
cups->setCurrentPrinter(index);
const cups_option_t *opt = cups->printerOption(QString::fromLatin1("printer-location")); QPrinterInfo printerInfo = QPrinterInfo::printerInfo(printer->printerName());
QString location; widget.location->setText(printerInfo.location());
if (opt) widget.type->setText(printerInfo.makeAndModel());
location = QString::fromLocal8Bit(opt->value);
widget.location->setText(location);
cupsPPD = cups->currentPPD();
// set printer type line
QString type;
if (cupsPPD)
type = QString::fromLocal8Bit(cupsPPD->manufacturer) + QLatin1String(" - ") + QString::fromLocal8Bit(cupsPPD->modelname);
widget.type->setText(type);
if (propertiesDialog)
propertiesDialog->selectPrinter();
if (optionsPane) if (optionsPane)
optionsPane->selectPrinter(cups); optionsPane->selectPrinter();
} else {
if (optionsPane)
optionsPane->selectPrinter(0);
} }
#endif
} }
void QUnixPrintWidgetPrivate::setOptionsPane(QPrintDialogPrivate *pane) void QUnixPrintWidgetPrivate::setOptionsPane(QPrintDialogPrivate *pane)
{ {
optionsPane = pane; optionsPane = pane;
if (optionsPane) if (optionsPane)
_q_printerChanged(widget.printers->currentIndex()); optionsPane->selectPrinter();
} }
void QUnixPrintWidgetPrivate::_q_btnBrowseClicked() void QUnixPrintWidgetPrivate::_q_btnBrowseClicked()
@ -759,12 +694,11 @@ void QUnixPrintWidgetPrivate::_q_btnBrowseClicked()
} }
} }
void QUnixPrintWidgetPrivate::applyPrinterProperties(QPrinter *p) void QUnixPrintWidgetPrivate::applyPrinterProperties()
{ {
if (p == 0) if (printer == 0)
return; return;
printer = p; if (printer->outputFileName().isEmpty()) {
if (p->outputFileName().isEmpty()) {
QString home = QDir::homePath(); QString home = QDir::homePath();
QString cur = QDir::currentPath(); QString cur = QDir::currentPath();
if (home.at(home.length()-1) != QLatin1Char('/')) if (home.at(home.length()-1) != QLatin1Char('/'))
@ -774,14 +708,14 @@ void QUnixPrintWidgetPrivate::applyPrinterProperties(QPrinter *p)
if (cur.left(home.length()) != home) if (cur.left(home.length()) != home)
cur = home; cur = home;
if (QGuiApplication::platformName() == QLatin1String("xcb")) { if (QGuiApplication::platformName() == QLatin1String("xcb")) {
if (p->docName().isEmpty()) { if (printer->docName().isEmpty()) {
cur += QLatin1String("print.pdf"); cur += QLatin1String("print.pdf");
} else { } else {
QRegExp re(QString::fromLatin1("(.*)\\.\\S+")); QRegExp re(QString::fromLatin1("(.*)\\.\\S+"));
if (re.exactMatch(p->docName())) if (re.exactMatch(printer->docName()))
cur += re.cap(1); cur += re.cap(1);
else else
cur += p->docName(); cur += printer->docName();
cur += QLatin1String(".pdf"); cur += QLatin1String(".pdf");
} }
} // xcb } // xcb
@ -789,11 +723,11 @@ void QUnixPrintWidgetPrivate::applyPrinterProperties(QPrinter *p)
widget.filename->setText(cur); widget.filename->setText(cur);
} }
else else
widget.filename->setText( p->outputFileName() ); widget.filename->setText( printer->outputFileName() );
QString printer = p->printerName(); QString printerName = printer->printerName();
if (!printer.isEmpty()) { if (!printerName.isEmpty()) {
for (int i = 0; i < widget.printers->count(); ++i) { for (int i = 0; i < widget.printers->count(); ++i) {
if (widget.printers->itemText(i) == printer) { if (widget.printers->itemText(i) == printerName) {
widget.printers->setCurrentIndex(i); widget.printers->setCurrentIndex(i);
break; break;
} }
@ -802,7 +736,7 @@ void QUnixPrintWidgetPrivate::applyPrinterProperties(QPrinter *p)
// PDF and PS printers are not added to the dialog yet, we'll handle those cases in QUnixPrintWidgetPrivate::updateWidget // PDF and PS printers are not added to the dialog yet, we'll handle those cases in QUnixPrintWidgetPrivate::updateWidget
if (propertiesDialog) if (propertiesDialog)
propertiesDialog->applyPrinterProperties(p); propertiesDialog->applyPrinterProperties(printer);
} }
#ifndef QT_NO_MESSAGEBOX #ifndef QT_NO_MESSAGEBOX
@ -841,57 +775,41 @@ bool QUnixPrintWidgetPrivate::checkFields()
} }
#endif // QT_NO_MESSAGEBOX #endif // QT_NO_MESSAGEBOX
void QUnixPrintWidgetPrivate::setupPrinterProperties()
{
if (propertiesDialog)
delete propertiesDialog;
propertiesDialog = new QPrintPropertiesDialog(q);
propertiesDialog->setResult(QDialog::Rejected);
propertiesDialogShown = false;
propertiesDialog->applyPrinterProperties(q->printer());
if (q->isOptionEnabled(QPrintDialog::PrintToFile)
&& (widget.printers->currentIndex() == widget.printers->count() - 1)) {// PDF
propertiesDialog->selectPdfPsPrinter(q->printer());
}
else
propertiesDialog->selectPrinter();
}
void QUnixPrintWidgetPrivate::_q_btnPropertiesClicked() void QUnixPrintWidgetPrivate::_q_btnPropertiesClicked()
{ {
if (!propertiesDialog) { if (!propertiesDialog)
propertiesDialog = new QPrintPropertiesDialog(q); setupPrinterProperties();
propertiesDialog->setResult(QDialog::Rejected);
}
if (propertiesDialog->result() == QDialog::Rejected) {
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
propertiesDialog->setCups(cups);
#endif
propertiesDialog->applyPrinterProperties(q->printer());
if (q->isOptionEnabled(QPrintDialog::PrintToFile)
&& (widget.printers->currentIndex() == widget.printers->count() - 1)) // PDF
propertiesDialog->selectPdfPsPrinter(q->printer());
else
propertiesDialog->selectPrinter();
}
propertiesDialog->exec(); propertiesDialog->exec();
if (propertiesDialog->result() == QDialog::Rejected) {
// If properties dialog was rejected the dialog is deleted and
// the properties are set to defaults when printer is setup
delete propertiesDialog;
propertiesDialog = 0;
propertiesDialogShown = false;
} else
// properties dialog was shown and accepted
propertiesDialogShown = true;
} }
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
void QUnixPrintWidgetPrivate::setCupsProperties()
{
if (cups && QCUPSSupport::isAvailable() && cups->pageSizes()) {
QPrintEngine *engine = printer->printEngine();
const ppd_option_t* pageSizes = cups->pageSizes();
QByteArray cupsPageSize;
for (int i = 0; i < pageSizes->num_choices; ++i) {
if (static_cast<int>(pageSizes->choices[i].marked) == 1)
cupsPageSize = pageSizes->choices[i].choice;
}
engine->setProperty(PPK_CupsStringPageSize, QString::fromLatin1(cupsPageSize));
engine->setProperty(PPK_CupsOptions, cups->options());
QRect pageRect = cups->pageRect(cupsPageSize);
engine->setProperty(PPK_CupsPageRect, pageRect);
QRect paperRect = cups->paperRect(cupsPageSize);
engine->setProperty(PPK_CupsPaperRect, paperRect);
for (int ps = 0; ps < QPrinter::NPageSize; ++ps) {
QPdf::PaperSize size = QPdf::paperSize(QPrinter::PaperSize(ps));
if (size.width == paperRect.width() && size.height == paperRect.height())
printer->setPaperSize(static_cast<QPrinter::PaperSize>(ps));
}
}
}
#endif
void QUnixPrintWidgetPrivate::setupPrinter() void QUnixPrintWidgetPrivate::setupPrinter()
{ {
const int printerCount = widget.printers->count(); const int printerCount = widget.printers->count();
@ -911,20 +829,19 @@ void QUnixPrintWidgetPrivate::setupPrinter()
printer->setOutputFileName(QString()); printer->setOutputFileName(QString());
} }
if (propertiesDialog && propertiesDialog->result() == QDialog::Accepted)
propertiesDialog->setupPrinter();
#if !defined(QT_NO_CUPS) && !defined(QT_NO_LIBRARY)
if (!propertiesDialog) if (!propertiesDialog)
setCupsProperties(); setupPrinterProperties();
#endif
if (propertiesDialog->result() == QDialog::Accepted || !propertiesDialogShown)
propertiesDialog->setupPrinter();
} }
/*! \internal /*! \internal
*/ */
QUnixPrintWidget::QUnixPrintWidget(QPrinter *printer, QWidget *parent) QUnixPrintWidget::QUnixPrintWidget(QPrinter *printer, QWidget *parent)
: QWidget(parent), d(new QUnixPrintWidgetPrivate(this)) : QWidget(parent), d(new QUnixPrintWidgetPrivate(this, printer))
{ {
d->applyPrinterProperties(printer); d->applyPrinterProperties();
} }
/*! \internal /*! \internal