summaryrefslogtreecommitdiffstats
path: root/src/mainwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mainwindow.cpp')
-rw-r--r--src/mainwindow.cpp277
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();
+
+}
+
+