1 /*
2     Copyright © 2008-13 Qtrac Ltd. All rights reserved.
3     This program or module is free software: you can redistribute it
4     and/or modify it under the terms of the GNU General Public License
5     as published by the Free Software Foundation, either version 2 of
6     the License, or (at your option) any later version. This program is
7     distributed in the hope that it will be useful, but WITHOUT ANY
8     WARRANTY; without even the implied warranty of MERCHANTABILITY or
9     FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
10     for more details.
11 */
12 
13 #include "saveform.hpp"
14 #include <QDialogButtonBox>
15 #include <QFileDialog>
16 #include <QFormLayout>
17 #include <QGroupBox>
18 #include <QImageWriter>
19 #include <QLabel>
20 #include <QLineEdit>
21 #include <QPushButton>
22 #include <QRadioButton>
23 #include <QVBoxLayout>
24 
25 
SaveForm(const QString & path,QString * filename,bool * saveAll,SavePages * savePages,QWidget * parent)26 SaveForm::SaveForm(const QString &path, QString *filename, bool *saveAll,
27         SavePages *savePages, QWidget *parent)
28     : QDialog(parent), m_path(path), m_filename(filename),
29       m_saveAll(saveAll), m_savePages(savePages)
30 {
31     createWidgets();
32     createLayout();
33     createConnections();
34 
35     updateUi();
36     setWindowTitle(tr("DiffPDF — Save As"));
37 }
38 
39 
createWidgets()40 void SaveForm::createWidgets()
41 {
42     saveGroupBox = new QGroupBox(tr("Pairs"));
43     saveCurrentRadioButton = new QRadioButton(tr("Current &Page Pair"));
44     saveAllRadioButton = new QRadioButton(tr("&All Page Pairs"));
45     if (*m_saveAll)
46         saveAllRadioButton->setChecked(true);
47     else
48         saveCurrentRadioButton->setChecked(true);
49     pagesGroupBox = new QGroupBox(tr("Pages"));
50     leftPagesRadioButton = new QRadioButton(tr("File #&1's Pages"));
51     rightPagesRadioButton = new QRadioButton(tr("File #&2's Pages"));
52     bothPagesRadioButton = new QRadioButton(tr("&Both Files' Pages"));
53     if (*m_savePages == SaveLeftPages)
54         leftPagesRadioButton->setChecked(true);
55     else if (*m_savePages == SaveRightPages)
56         rightPagesRadioButton->setChecked(true);
57     else // m_savePages == SaveBothPages
58         bothPagesRadioButton->setChecked(true);
59     filenameLabel = new QLabel(tr("&Filename:"));
60     filenameLineEdit = new QLineEdit;
61     filenameLineEdit->setText(*m_filename);
62     filenameLabel->setBuddy(filenameLineEdit);
63     chooseFileButton = new QPushButton(tr("B&rowse..."));
64     buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|
65                                      QDialogButtonBox::Cancel);
66 }
67 
68 
createLayout()69 void SaveForm::createLayout()
70 {
71     QHBoxLayout *saveLayout = new QHBoxLayout;
72     saveLayout->addWidget(saveCurrentRadioButton);
73     saveLayout->addWidget(saveAllRadioButton);
74     saveLayout->addStretch();
75     saveGroupBox->setLayout(saveLayout);
76     QHBoxLayout *pagesLayout = new QHBoxLayout;
77     pagesLayout->addWidget(leftPagesRadioButton);
78     pagesLayout->addWidget(rightPagesRadioButton);
79     pagesLayout->addWidget(bothPagesRadioButton);
80     pagesGroupBox->setLayout(pagesLayout);
81     QHBoxLayout *filenameLayout = new QHBoxLayout;
82     filenameLayout->addWidget(filenameLabel);
83     filenameLayout->addWidget(filenameLineEdit);
84     filenameLayout->addWidget(chooseFileButton);
85     QVBoxLayout *layout = new QVBoxLayout;
86     layout->addWidget(saveGroupBox);
87     layout->addWidget(pagesGroupBox);
88     layout->addLayout(filenameLayout);
89     layout->addStretch();
90     layout->addWidget(buttonBox);
91     setLayout(layout);
92 }
93 
94 
createConnections()95 void SaveForm::createConnections()
96 {
97     connect(chooseFileButton, SIGNAL(clicked()), this, SLOT(chooseFile()));
98     connect(filenameLineEdit, SIGNAL(textChanged(const QString&)),
99             this, SLOT(updateUi()));
100     connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
101     connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
102 }
103 
104 
updateUi()105 void SaveForm::updateUi()
106 {
107     buttonBox->button(QDialogButtonBox::Ok)->setEnabled(
108             !filenameLineEdit->text().isEmpty());
109 }
110 
111 
chooseFile()112 void SaveForm::chooseFile()
113 {
114     QList<QByteArray> formats = QImageWriter::supportedImageFormats();
115     QStringList suffixes;
116     foreach (const QByteArray &format, formats)
117         suffixes << "*." + QString(format.toLower());
118     QString filename = QFileDialog::getSaveFileName(this,
119             tr("DiffPDF — Browse"), m_path,
120             tr("PDF files (*.pdf);;Image files (%1)")
121             .arg(suffixes.join(" ")));
122     if (!filename.isEmpty()) {
123         filenameLineEdit->setText(filename);
124         buttonBox->button(QDialogButtonBox::Ok)->setFocus();
125     }
126 }
127 
128 
accept()129 void SaveForm::accept()
130 {
131     *m_filename = filenameLineEdit->text();
132     if (!m_filename->contains("."))
133         *m_filename += ".pdf";
134     *m_saveAll = saveAllRadioButton->isChecked();
135     if (leftPagesRadioButton->isChecked())
136         *m_savePages = SaveLeftPages;
137     else if (rightPagesRadioButton->isChecked())
138         *m_savePages = SaveRightPages;
139     else // bothPagesRadioButton->isChecked()
140         *m_savePages = SaveBothPages;
141     QDialog::accept();
142 }
143