summaryrefslogblamecommitdiffstats
path: root/PrinterGUI/PrinterGUI_SRC/mainwindow.cpp
blob: 03e74e9615403cc1a058614c4b12d764566923e5 (plain) (tree)






















































































































































































































                                                                                                               
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <pwd.h>



MainWindow::MainWindow(char *argv, QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    file(argv)
{
    // 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);
        }

    // 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);
        system(cmd.toAscii());
    }

    // 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());

    // Quit with code 0
    QCoreApplication::instance()->quit();
}