00001 #include "mainwindow.h"
00002 #include "ui_mainwindow.h"
00003 #include "common.h"
00004 #include <QFileDialog>
00005 #include <QProcess>
00006 #include <poppler-qt4.h>
00007 #include <QImageWriter>
00008 #include <QLibraryInfo>
00009 #include <QActionGroup>
00010
00011
00012 #define ZOOM_SCALE 1.189207115002721027
00013
00014 MainWindow::MainWindow(QWidget *parent) :
00015 QMainWindow(parent),
00016 ui(new Ui::MainWindow)
00017
00018 {
00019 ui->setupUi(this);
00020 ui->thumbnailsView->setScene(&thumbnailScene);
00021 pageNum = new QLineEdit();
00022 pageNum->setValidator(&doc.pageRange);
00023 pageNum->setMaximumWidth(50);
00024 pageNum->setAlignment(Qt::AlignHCenter);
00025 ui->mainToolBar->insertWidget(ui->actionNext_Page, pageNum);
00026 zoomPercent = new QLineEdit();
00027 zoomPercent->setMaximumWidth(50);
00028 zoomPercent->setAlignment(Qt::AlignHCenter);
00029 ui->mainToolBar->insertWidget(ui->actionZoom_Out, zoomPercent);
00030 ui->actionViewPageImage->setChecked(true);
00031
00032
00033 QActionGroup* toolGroup = new QActionGroup(this);
00034 toolGroup->addAction(ui->actionSelect);
00035 toolGroup->addAction(ui->actionBox);
00036 toolGroup->addAction(ui->actionPan);
00037
00038 ui->graphicsView->setScene(&pdfScene);
00039 connect(&doc, SIGNAL(rendered(int, QImage)),
00040 &pdfScene, SLOT(image(int, QImage)));
00041 connect(&doc, SIGNAL(pageText(QList<Poppler::TextBox*>)),
00042 &pdfScene, SLOT(pageText(QList<Poppler::TextBox*>)));
00044
00045
00046
00047
00048
00049
00050 connect(&doc, SIGNAL(pageChanged(QString)),
00051 pageNum, SLOT(setText(QString)));
00052 connect(&doc, SIGNAL(pageChanged(int)),
00053 &thumbnailScene, SLOT(currentPage(int)));
00054 connect(pageNum, SIGNAL(returnPressed()), this, SLOT(renderPage()));
00055 connect(&doc, SIGNAL(numPages(int)),
00056 &thumbnailScene, SLOT(resize(int)));
00057 connect(&doc, SIGNAL(thumbnail(int, QImage, QString)),
00058 &thumbnailScene, SLOT(add(int, QImage, QString)));
00059 connect(&thumbnailScene, SIGNAL(selectionChanged()),
00060 this, SLOT(selectionChanged()));
00061 connect(&thumbnailScene, SIGNAL(statusMessage(QString, int)),
00062 ui->statusBar, SLOT(showMessage(QString, int)));
00063 connect(&thumbnailScene, SIGNAL(statusClear()),
00064 ui->statusBar, SLOT(clearMessage()));
00065 connect(&pdfScene, SIGNAL(cursorPos(QPointF)),
00066 this, SLOT(cursorMoved(QPointF)));
00067 ui->actionSelect->setChecked(true);
00068 zoomChanged();
00069 }
00070
00071 MainWindow::~MainWindow()
00072 {
00073 delete ui;
00074 }
00075
00076 void MainWindow::open(QString fpath)
00077 {
00078 doc.openPDF(fpath);
00079 thumbnailScene.layout();
00080 }
00081
00082 void MainWindow::on_actionOpen_PDF_triggered()
00083 {
00084 QString fpath = QFileDialog::getOpenFileName(this,
00085 tr("Open PDF"), "", tr("PDF (*.pdf)"));
00086 if (fpath.isEmpty())
00087 return;
00088 open(fpath);
00089 }
00090
00091 void MainWindow::on_actionPrevious_Page_triggered()
00092 {
00093 doc.page(doc.page() - 1);
00094 }
00095
00096 void MainWindow::on_actionNext_Page_triggered()
00097 {
00098 doc.page(doc.page() + 1);
00099 }
00100
00101 void MainWindow::renderPage()
00102 {
00103 doc.page(pageNum->text().toInt());
00104 }
00105
00106 void MainWindow::selectionChanged()
00107 {
00108 QList<QGraphicsItem *> sel = thumbnailScene.selectedItems();
00109 if (sel.size() > 0)
00110 doc.page(((ThumbnailItem*)sel.first())->pageIdx);
00111 }
00112
00113 void MainWindow::on_actionSave_triggered()
00114 {
00115 QString fileName = QFileDialog::getSaveFileName(this,
00116 tr("Save as..."), "", "*.pdf");
00117
00118
00119
00120
00121
00122
00123
00124 Poppler::PDFConverter* conv = doc.pdf->pdfConverter();
00125 conv->setOutputFileName (fileName);
00126 conv->convert();
00127 }
00128
00129 void MainWindow::on_actionPan_toggled(bool checked)
00130 {
00131 if (checked)
00132 {
00133 pdfScene.setTool(NULL);
00134 ui->graphicsView->setDragMode(QGraphicsView::ScrollHandDrag);
00135 }
00136 }
00137
00138 void MainWindow::on_actionSelect_toggled(bool checked)
00139 {
00140 if (checked)
00141 pdfScene.selectTool->activate();
00142 }
00143
00144 void MainWindow::on_actionBox_toggled(bool checked)
00145 {
00146 if (checked)
00147 pdfScene.boxTool->activate();
00148 }
00149
00150 void MainWindow::cursorMoved(QPointF pos)
00151 {
00152 ui->statusBar->showMessage(QString("%1, %2").arg(pos.x()).arg(pos.y()));
00153 }
00154
00155 void MainWindow::zoomChanged()
00156 {
00157 zoomPercent->setText(QString("%1%")
00158 .arg(ui->graphicsView->matrix().m11() * 100.0, 0, 'f', 0));
00159 }
00160
00161 void MainWindow::on_actionExport_triggered()
00162 {
00163 qDebug("plugin path:\n %s",
00164 QLibraryInfo::location(QLibraryInfo::PluginsPath).toAscii().constData());
00165 QList<QByteArray> fmts = QImageWriter::supportedImageFormats();
00166 QStringList fmtStrings;
00167 qDebug("supported image formats for writing:");
00168 foreach(QByteArray f, fmts)
00169 {
00170 qDebug(" %s", f.constData());
00171 fmtStrings << QString("*.%1").arg(QString(f));
00172 }
00173 QString filter(tr("Images (%1)"));
00174 QString fileName = QFileDialog::getSaveFileName(this,
00175 tr("Export Page Image"), "", filter.arg(fmtStrings.join(" ")));
00176 QImageWriter wr(fileName);
00177 qDebug("can write to %s? %d", fileName.toUtf8().constData(), wr.canWrite());
00178 QImage image = pdfScene.image();
00179 QFileInfo fi(fileName);
00180 if (fi.suffix() == "gif" || fi.suffix() == "png")
00181 {
00183 image = image.convertToFormat(QImage::Format_Indexed8, Qt::ThresholdDither);
00184 }
00185 if (!doc.plainText().isEmpty())
00186 wr.setText("", doc.plainText());
00187 if (!wr.write(image))
00188 qCritical() << "error" << wr.error() << ": " << wr.errorString();
00189 }
00190
00191 void MainWindow::on_actionZoom_In_triggered()
00192 {
00193 ui->graphicsView->scale(ZOOM_SCALE, ZOOM_SCALE);
00196 zoomChanged();
00197 }
00198
00199 void MainWindow::on_actionZoom_Out_triggered()
00200 {
00201 ui->graphicsView->scale(1 / ZOOM_SCALE, 1 / ZOOM_SCALE);
00202 zoomChanged();
00203 }
00204
00205 void MainWindow::on_actionZoom_100_triggered()
00206 {
00207 ui->graphicsView->scale(1.0 / ui->graphicsView->matrix().m11(),
00208 1.0 / ui->graphicsView->matrix().m11());
00209 zoomChanged();
00210 }
00211
00212 void MainWindow::on_actionZoom_25_triggered()
00213 {
00214 ui->graphicsView->scale(0.25 / ui->graphicsView->matrix().m11(),
00215 0.25 / ui->graphicsView->matrix().m11());
00216 zoomChanged();
00217 }
00218
00219
00220 void MainWindow::on_actionZoom_to_Fit_triggered()
00221 {
00222 qreal scale = (ui->graphicsView->height() - 10) / pdfScene.height();
00223 qreal scalew = (ui->graphicsView->width() - 10) / pdfScene.width();
00224 if (scalew < scale)
00225 scale = scalew;
00226 ui->graphicsView->scale(scale / ui->graphicsView->matrix().m11(),
00227 scale / ui->graphicsView->matrix().m11());
00228 zoomChanged();
00229 }
00230
00231 void MainWindow::on_actionZoom_Width_triggered()
00232 {
00233 qreal scale = (ui->graphicsView->width() - 10) / pdfScene.width();
00234 ui->graphicsView->scale(scale / ui->graphicsView->matrix().m11(),
00235 scale / ui->graphicsView->matrix().m11());
00236 zoomChanged();
00237 }
00238
00239
00240 void MainWindow::on_actionViewPageImage_toggled(bool v)
00241 {
00242 pdfScene.setImageVisible(v);
00243 }
00244
00245 void MainWindow::on_actionViewPageText_toggled(bool v)
00246 {
00247 pdfScene.setTextVisible(v);
00248 }