subsurface/qt-ui/printdialog.cpp
Dirk Hohndel f9ceff009b Clean up the header files
Lots and lots and lots of header files were being included without being
needed. This attempts to clean some of that crud up.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-01-18 21:25:59 +12:00

158 lines
5.2 KiB
C++

#include "printdialog.h"
#include "printoptions.h"
#include "printlayout.h"
#include "mainwindow.h"
#include <QProgressBar>
#include <QPrintPreviewDialog>
#include <QPrintDialog>
#include <QShortcut>
#include <QSettings>
#if QT_VERSION >= 0x050300
#include <QMarginsF>
#endif
#define SETTINGS_GROUP "PrintDialog"
PrintDialog::PrintDialog(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f)
{
// check if the options were previously stored in the settings; if not use some defaults.
QSettings s;
bool stored = s.childGroups().contains(SETTINGS_GROUP);
if (!stored) {
printOptions.type = print_options::PRETTY;
printOptions.print_selected = true;
printOptions.color_selected = true;
printOptions.notes_up = false;
printOptions.landscape = false;
memset(printOptions.margins, 0, sizeof(printOptions.margins));
} else {
s.beginGroup(SETTINGS_GROUP);
printOptions.type = (print_options::print_type)s.value("type").toInt();
printOptions.print_selected = s.value("print_selected").toBool();
printOptions.color_selected = s.value("color_selected").toBool();
printOptions.notes_up = s.value("notes_up").toBool();
printOptions.landscape = s.value("landscape").toBool();
printOptions.margins[0] = s.value("margin_left").toInt();
printOptions.margins[1] = s.value("margin_top").toInt();
printOptions.margins[2] = s.value("margin_right").toInt();
printOptions.margins[3] = s.value("margin_bottom").toInt();
printer.setOrientation((QPrinter::Orientation)printOptions.landscape);
#if QT_VERSION >= 0x050300
QMarginsF margins;
margins.setLeft(printOptions.margins[0]);
margins.setTop(printOptions.margins[1]);
margins.setRight(printOptions.margins[2]);
margins.setBottom(printOptions.margins[3]);
printer.setPageMargins(margins, QPageLayout::Millimeter);
#else
printer.setPageMargins(
printOptions.margins[0],
printOptions.margins[1],
printOptions.margins[2],
printOptions.margins[3],
QPrinter::Millimeter
);
#endif
}
// create a print layout and pass the printer and options
printLayout = new PrintLayout(this, &printer, &printOptions);
// create a print options object and pass our options struct
optionsWidget = new PrintOptions(this, &printOptions);
QVBoxLayout *layout = new QVBoxLayout(this);
setLayout(layout);
layout->addWidget(optionsWidget);
progressBar = new QProgressBar();
connect(printLayout, SIGNAL(signalProgress(int)), progressBar, SLOT(setValue(int)));
progressBar->setMinimum(0);
progressBar->setMaximum(100);
progressBar->setValue(0);
progressBar->setTextVisible(false);
layout->addWidget(progressBar);
QHBoxLayout *hLayout = new QHBoxLayout();
layout->addLayout(hLayout);
QPushButton *printButton = new QPushButton(tr("P&rint"));
connect(printButton, SIGNAL(clicked(bool)), this, SLOT(printClicked()));
QPushButton *previewButton = new QPushButton(tr("&Preview"));
connect(previewButton, SIGNAL(clicked(bool)), this, SLOT(previewClicked()));
QDialogButtonBox *buttonBox = new QDialogButtonBox;
buttonBox->addButton(QDialogButtonBox::Cancel);
buttonBox->addButton(printButton, QDialogButtonBox::AcceptRole);
buttonBox->addButton(previewButton, QDialogButtonBox::ActionRole);
connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
hLayout->addWidget(buttonBox);
setWindowTitle(tr("Print"));
setWindowIcon(QIcon(":subsurface-icon"));
QShortcut *close = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_W), this);
connect(close, SIGNAL(activated()), this, SLOT(close()));
QShortcut *quit = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Q), this);
connect(quit, SIGNAL(activated()), parent, SLOT(close()));
// seems to be the most reliable way to track for all sorts of dialog disposal.
connect(this, SIGNAL(finished(int)), this, SLOT(onFinished()));
}
void PrintDialog::onFinished()
{
// save the settings
QSettings s;
s.beginGroup(SETTINGS_GROUP);
s.setValue("type", printOptions.type);
s.setValue("print_selected", printOptions.print_selected);
s.setValue("color_selected", printOptions.color_selected);
s.setValue("notes_up", printOptions.notes_up);
#if QT_VERSION >= 0x050300
s.setValue("landscape", (bool)printer.pageLayout().orientation());
QMarginsF margins = printer.pageLayout().margins(QPageLayout::Millimeter);
s.setValue("margin_left", margins.left());
s.setValue("margin_top", margins.top());
s.setValue("margin_right", margins.right());
s.setValue("margin_bottom", margins.bottom());
#else
s.setValue("landscape", (bool)printer.orientation());
qreal left, top, right, bottom;
printer.getPageMargins(&left, &top, &right, &bottom, QPrinter::Millimeter);
s.setValue("margin_left", (int)left);
s.setValue("margin_top", (int)top);
s.setValue("margin_right", (int)right);
s.setValue("margin_bottom", (int)bottom);
#endif
}
void PrintDialog::previewClicked(void)
{
QPrintPreviewDialog previewDialog(&printer, this, Qt::Window
| Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint
| Qt::WindowTitleHint);
connect(&previewDialog, SIGNAL(paintRequested(QPrinter *)), this, SLOT(onPaintRequested(QPrinter *)));
previewDialog.exec();
}
void PrintDialog::printClicked(void)
{
QPrintDialog printDialog(&printer, this);
if (printDialog.exec() == QDialog::Accepted){
printLayout->print();
close();
}
}
void PrintDialog::onPaintRequested(QPrinter *printerPtr)
{
printLayout->print();
}