diff options
Diffstat (limited to 'src/mainwindow.cpp')
-rw-r--r-- | src/mainwindow.cpp | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp new file mode 100644 index 0000000..cc40d5e --- /dev/null +++ b/src/mainwindow.cpp @@ -0,0 +1,277 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include <pwd.h> + + + +MainWindow::MainWindow(char *argv[], QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow), + user(argv[1]), + file(argv[2]) +{ + // Initialize cups + num_dests = cupsGetDests(&dests); + + // Initialize UI + initializeUI(); +} + + + +MainWindow::~MainWindow() +{ + cupsFreeDests(num_dests, dests); + delete ui; +} + + + +void MainWindow::initializeUI() +{ + ui->setupUi(this); + ui->horizontalLayoutButtons->setAlignment(Qt::AlignRight); + + /* Initialize Treeview */ + + ui->printerList->setColumnCount(3); + ui->printerList->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); + + // Rename headers + QStringList h; + h.append("Drucker"); + h.append("Information"); + h.append("Standort"); + ui->printerList->setHeaderLabels(h); + + // Fill treewidget with data from cups dests; + cups_dest_t *dest = dests; + for (int i = num_dests; i>0; ++dest, --i ) + if (dest->instance == NULL) + { + QTreeWidgetItem *wi = new QTreeWidgetItem(); + wi->setText(0, QString(dest->name)); + wi->setText(1, QString(cupsGetOption("printer-info", dest->num_options, dest->options))); + wi->setText(2, QString(cupsGetOption("printer-location", dest->num_options, dest->options))); + ui->printerList->addTopLevelItem(wi); + if (dest->is_default) + ui->printerList->setCurrentItem(wi); + } + + // Resize columns to contents + for (int i = 0; i < 3; ++i) + ui->printerList->resizeColumnToContents(i); + + /* Main Window properties */ + + // Disable close button + this->setWindowFlags(windowFlags() & ~Qt::WindowCloseButtonHint); + // center dialog on screen center + QRect desktopRect = QApplication::desktop()->screenGeometry(this); + this->move( desktopRect.width()/2-this->width()/2, + desktopRect.height()/2-this->height()/2); +} + + + + +void MainWindow::on_printerList_currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) +{ + ui->printerList->setFocus(); + + cups_dest_t *dest =cupsGetNamedDest (CUPS_HTTP_DEFAULT, current->text(0).toAscii(), NULL); + + + /* * Check printer properties (auth, color, duplex, copies) * */ + // get printer capabilities + int res = ::atoi(cupsGetOption("printer-type", + dest->num_options, + dest->options)); + + // Check authentication + if (res & CUPS_PRINTER_AUTHENTICATED) + { + ui->labelUser->setEnabled(true); + ui->labelPass->setEnabled(true); + ui->lineEditUser->setEnabled(true); + ui->lineEditPass->setEnabled(true); + } + else + { + ui->labelUser->setEnabled(false); + ui->labelPass->setEnabled(false); + ui->lineEditUser->setEnabled(false); + ui->lineEditPass->setEnabled(false); + } + + // Check color capabilities + if (res & CUPS_PRINTER_COLOR) + { + ui->comboBoxColor->setEnabled(true); + ui->comboBoxColor->setCurrentIndex(1); + } + else + { + ui->comboBoxColor->setEnabled(false); + ui->comboBoxColor->setCurrentIndex(0); + } + + // Check duplex capabilities + if (res & CUPS_PRINTER_DUPLEX) + { + ui->comboBoxSides->setEnabled(true); + } + else + { + ui->comboBoxSides->setEnabled(false); + ui->comboBoxSides->setCurrentIndex(0); + } + + // Check copy capabilities + if (res & CUPS_PRINTER_COPIES) + { + ui->lineEditCopies->setEnabled(true); + ui->labelCopies->setEnabled(true); + } + else + { + ui->lineEditCopies->setEnabled(false); + ui->lineEditCopies->setText("1"); + ui->labelCopies->setEnabled(false); + } + + // Check availability + if (res & CUPS_PRINTER_REJECTING) + { + ui->buttonPrint->setEnabled(false); + } + else + { + ui->buttonPrint->setEnabled(true); + } +} + + + +void MainWindow::on_buttonCancel_clicked() +{ + // Quit with code 1 + QCoreApplication::instance()->exit(1); +} + + + +void MainWindow::on_buttonPrint_clicked() +{ + QString cmd; + + // Wenn Farbe möglich ist. Aber trotzdem Graustufen gewählt + // Schieb file durch ghostscript + if (ui->comboBoxColor->isEnabled() && ui->comboBoxColor->currentIndex() == 0) + { + // Run ghostscript to make file grayscale + cmd = QString("gs -sDEVICE=psgray -dNOPAUSE -dBATCH -dQUIET -dSAFER -sOutputFile=\"%22\" \"%1\"").arg( + file, + file); + if (system(cmd.toAscii())) + return; // TODO WARN ABOUT MISSED GS JOB + + } + + + + +/* * Print via sysctem command * */ +// // Username, part of whoami source +// register uid_t uid = geteuid(); +// const char *username = getpwuid(uid)->pw_name; +// cmd = QString("lp -U %1").arg(username); +// // Duplex +// if (ui->comboBoxSides->isEnabled()) +// { +// switch (ui->comboBoxSides->currentIndex()){ +// case 0: +// cmd.append(" -o sides=one-sided"); +// break; +// case 1: +// cmd.append(" -o sides=two-sided-long-edge"); +// break; +// case 2: +// cmd.append(" -o sides=two-sided-long-edge"); +// break; +// } +// } +// // Kopien +// if (ui->lineEditCopies->isEnabled()) +// cmd.append(QString(" -n %1").arg(ui->lineEditCopies->text())); +// // Queue +// cmd.append(QString(" -d %1").arg(ui->printerList->currentItem()->text(0))); +// // File +// cmd.append(QString(" -- \"%1\"").arg(file)); +// // Print results to stdout +// QTextStream (stdout, QIODevice::WriteOnly) << cmd; +// // Execute the command +// system(cmd.toAscii()); + + + + + /* * Print via cups lib * */ + + // Username + cupsSetUser(user); + + // Destination / Queue + cups_dest_t *dest = cupsGetDest( + ui->printerList->currentItem()->text(0).toAscii(), + NULL, + num_dests, + dests); + + // Duplex + if (ui->comboBoxSides->isEnabled()) + { + switch (ui->comboBoxSides->currentIndex()){ + case 0: + dest->num_options = cupsAddOption ("Duplex", + "None", + dest->num_options, + &(dest->options)); + break; + case 1: + dest->num_options = cupsAddOption ("Duplex", + "DuplexNoTumble", + dest->num_options, + &(dest->options)); + break; + case 2: + dest->num_options = cupsAddOption ("Duplex", + "DuplexTumble", + dest->num_options, + &(dest->options)); + break; + } + } + + // Kopien + if (ui->lineEditCopies->isEnabled()) + { + dest->num_options = cupsAddOption ("copies", + ui->lineEditCopies->text().toAscii(), + dest->num_options, + &(dest->options)); + } + + // Drucken + if( 0 == cupsPrintFile(dest->name, + file, + NULL, + dest->num_options, + dest->options)) + return; // TODO ERROR OUTPUT + else // Quit with code 0 + QCoreApplication::instance()->quit(); + +} + + |