00001
00002
00003
00004
00005
00006
00007 #include "DlgImportCroppingPdf.h"
00008 #include "EngaugeAssert.h"
00009 #include "Logger.h"
00010 #include "MainWindow.h"
00011 #include "PdfCropping.h"
00012 #include "poppler-qt5.h"
00013 #include <QApplication>
00014 #include <QGraphicsPixmapItem>
00015 #include <QGraphicsScene>
00016 #include <QImage>
00017 #include <QLabel>
00018 #include <QLayout>
00019 #include <QPushButton>
00020 #include <QSettings>
00021 #include <QSpinBox>
00022 #include <QTimer>
00023 #include "Settings.h"
00024 #include "ViewPreview.h"
00025
00026 using namespace Poppler;
00027
00028 int DlgImportCroppingPdf::MINIMUM_DIALOG_WIDTH = 350;
00029 int DlgImportCroppingPdf::MINIMUM_PREVIEW_HEIGHT = 200;
00030 const int X_TOP_LEFT = 0, Y_TOP_LEFT = 0;
00031 const int WIDTH = -1, HEIGHT = -1;
00032 const int FIRST_PAGE_1_BASED = 1;
00033 const int SMALLEST_DELAY_MS = 500;
00034
00035 DlgImportCroppingPdf::DlgImportCroppingPdf(const Poppler::Document &document,
00036 int resolution) :
00037 m_document (document),
00038 m_resolution (resolution),
00039 m_pixmap (0)
00040 {
00041 LOG4CPP_INFO_S ((*mainCat)) << "DlgImportCroppingPdf::DlgImportCroppingPdf";
00042
00043 setWindowTitle (tr ("PDF File Import Cropping"));
00044 setModal (true);
00045
00046 QWidget *subPanel = new QWidget ();
00047 QGridLayout *layout = new QGridLayout (subPanel);
00048 subPanel->setLayout (layout);
00049
00050 int row = 0;
00051
00052 createTimer ();
00053 createPageSpinner (layout, row);
00054 createPreview (layout, row);
00055 finishPanel (subPanel);
00056 updatePreview ();
00057
00058
00059 layout->setColumnStretch (0, 1);
00060 layout->setColumnStretch (1, 0);
00061 layout->setColumnStretch (2, 0);
00062 layout->setColumnStretch (3, 1);
00063 }
00064
00065 DlgImportCroppingPdf::~DlgImportCroppingPdf()
00066 {
00067 LOG4CPP_INFO_S ((*mainCat)) << "DlgImportCroppingPdf::~DlgImportCroppingPdf";
00068 }
00069
00070 void DlgImportCroppingPdf::createPageSpinner (QGridLayout *layout,
00071 int &row)
00072 {
00073 LOG4CPP_INFO_S ((*mainCat)) << "DlgImportCroppingPdf::createPageSpinner";
00074
00075 const int MIN_WIDTH_SPINNER = 90;
00076
00077 QLabel *labelPage = new QLabel (tr ("Page:"));
00078 layout->addWidget (labelPage, row, 1, 1, 1);
00079
00080 m_spinPage = new QSpinBox;
00081 m_spinPage->setMinimumWidth (MIN_WIDTH_SPINNER);
00082 m_spinPage->setWhatsThis (tr ("Page number that will be imported"));
00083 m_spinPage->setRange (1, m_document.numPages());
00084 layout->addWidget (m_spinPage, row++, 2, 1, 1);
00085 connect (m_spinPage, SIGNAL (valueChanged (int)), this, SLOT (slotPage (int)));
00086 }
00087
00088 void DlgImportCroppingPdf::createPdfCropping ()
00089 {
00090
00091 m_pdfCropping = new PdfCropping (*m_scenePreview,
00092 *m_viewPreview);
00093 }
00094
00095 void DlgImportCroppingPdf::createPreview (QGridLayout *layout,
00096 int &row)
00097 {
00098 LOG4CPP_INFO_S ((*mainCat)) << "DlgImportCroppingPdf::createPreview";
00099
00100 QLabel *labelPreview = new QLabel (tr ("Preview"));
00101 layout->addWidget (labelPreview, row++, 0, 1, 1, Qt::AlignLeft);
00102
00103 m_scenePreview = new QGraphicsScene (this);
00104 m_viewPreview = new ViewPreview (m_scenePreview,
00105 ViewPreview::VIEW_ASPECT_RATIO_ONE_TO_ONE,
00106 this);
00107 m_viewPreview->setWhatsThis (tr ("Preview window that shows what part of the image will be imported. "
00108 "The image portion inside the rectangular frame will be imported from the currently selected page. "
00109 "The frame can be moved and resized by dragging the corner handles."));
00110 m_viewPreview->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
00111 m_viewPreview->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
00112 m_viewPreview->setMinimumHeight (MINIMUM_PREVIEW_HEIGHT);
00113 layout->addWidget (m_viewPreview, row++, 0, 1, 4);
00114
00115
00116 initializeFrameGeometryAndPixmap ();
00117 createPdfCropping ();
00118 }
00119
00120 void DlgImportCroppingPdf::createTimer ()
00121 {
00122 m_timer = new QTimer;
00123 m_timer->setSingleShot (true);
00124 connect (m_timer, SIGNAL (timeout ()), this, SLOT (slotTimeout ()));
00125 }
00126
00127 void DlgImportCroppingPdf::finishPanel (QWidget *subPanel)
00128 {
00129 const int STRETCH_OFF = 0, STRETCH_ON = 1;
00130
00131 QVBoxLayout *panelLayout = new QVBoxLayout (this);
00132
00133 setMinimumWidth (MINIMUM_DIALOG_WIDTH);
00134 setLayout (panelLayout);
00135
00136 panelLayout->addWidget (subPanel);
00137 panelLayout->setStretch (panelLayout->count () - 1, STRETCH_ON);
00138
00139 QWidget *panelButtons = new QWidget (this);
00140 QHBoxLayout *buttonLayout = new QHBoxLayout (panelButtons);
00141
00142 QHBoxLayout *layoutRightSide = new QHBoxLayout;
00143
00144 QWidget *widgetRightSide = new QWidget;
00145 widgetRightSide->setLayout (layoutRightSide);
00146 buttonLayout->addWidget (widgetRightSide);
00147
00148 QSpacerItem *spacerExpanding = new QSpacerItem (40, 5, QSizePolicy::Expanding, QSizePolicy::Expanding);
00149 layoutRightSide->addItem (spacerExpanding);
00150
00151 m_btnOk = new QPushButton (tr ("Ok"));
00152 layoutRightSide->addWidget (m_btnOk, 0, Qt::AlignRight);
00153 connect (m_btnOk, SIGNAL (released ()), this, SLOT (slotOk ()));
00154
00155 QSpacerItem *spacerFixed = new QSpacerItem (40, 5, QSizePolicy::Fixed, QSizePolicy::Fixed);
00156 layoutRightSide->addItem (spacerFixed);
00157
00158 m_btnCancel = new QPushButton (tr ("Cancel"));
00159 layoutRightSide->addWidget (m_btnCancel, 0, Qt::AlignRight);
00160 connect (m_btnCancel, SIGNAL (released ()), this, SLOT (slotCancel ()));
00161
00162 panelLayout->addWidget (panelButtons, STRETCH_ON);
00163 panelLayout->setStretch (panelLayout->count () - 1, STRETCH_OFF);
00164 }
00165
00166 QImage DlgImportCroppingPdf::image () const
00167 {
00168
00169
00170 ENGAUGE_ASSERT (m_pdfCropping != 0);
00171 QRectF rectFramePixels = m_pdfCropping->frameRect ();
00172
00173 return m_image.copy (rectFramePixels.toRect ());
00174 }
00175
00176 void DlgImportCroppingPdf::initializeFrameGeometryAndPixmap ()
00177 {
00178 m_image = loadImage (FIRST_PAGE_1_BASED);
00179 QGraphicsPixmapItem *pixmap = new QGraphicsPixmapItem (QPixmap::fromImage (m_image));
00180 m_scenePreview->addItem (pixmap);
00181
00182
00183 m_viewPreview->setSceneRect (pixmap->boundingRect ());
00184 }
00185
00186 QImage DlgImportCroppingPdf::loadImage (int page1Based) const
00187 {
00188 QImage image;
00189
00190 int page0Based = page1Based - 1;
00191 Page *page = m_document.page (page0Based);
00192 if (page != 0) {
00193
00194 image = page->renderToImage (m_resolution,
00195 m_resolution,
00196 X_TOP_LEFT,
00197 Y_TOP_LEFT,
00198 WIDTH,
00199 HEIGHT);
00200
00201 delete page;
00202 }
00203
00204 return image;
00205 }
00206
00207 void DlgImportCroppingPdf::saveGeometryToSettings()
00208 {
00209
00210 QSettings settings;
00211 settings.beginGroup (SETTINGS_GROUP_IMPORT_CROPPING);
00212 settings.setValue (SETTINGS_IMPORT_CROPPING_POS, saveGeometry ());
00213 settings.endGroup();
00214 }
00215
00216 void DlgImportCroppingPdf::showEvent (QShowEvent * )
00217 {
00218 QSettings settings;
00219 settings.beginGroup (SETTINGS_GROUP_IMPORT_CROPPING);
00220 if (settings.contains (SETTINGS_IMPORT_CROPPING_POS)) {
00221
00222
00223 restoreGeometry (settings.value (SETTINGS_IMPORT_CROPPING_POS).toByteArray ());
00224 }
00225 }
00226
00227 void DlgImportCroppingPdf::slotCancel ()
00228 {
00229 LOG4CPP_INFO_S ((*mainCat)) << "DlgImportCroppingPdf::slotCancel";
00230
00231
00232 QApplication::restoreOverrideCursor ();
00233
00234 setResult (QDialog::Rejected);
00235 saveGeometryToSettings();
00236 hide();
00237 }
00238
00239 void DlgImportCroppingPdf::slotOk ()
00240 {
00241 LOG4CPP_INFO_S ((*mainCat)) << "DlgImportCroppingPdf::slotOk";
00242
00243
00244 QApplication::restoreOverrideCursor ();
00245
00246 setResult (QDialog::Accepted);
00247 saveGeometryToSettings();
00248 hide();
00249 }
00250
00251 void DlgImportCroppingPdf::slotPage (int page)
00252 {
00253 LOG4CPP_INFO_S ((*mainCat)) << "DlgImportCroppingPdf::slotPage"
00254 << " page=" << page
00255 << " stepBy=" << m_spinPage->singleStep ();
00256
00257
00258 QApplication::setOverrideCursor (Qt::WaitCursor);
00259
00260 m_timer->start (SMALLEST_DELAY_MS);
00261 }
00262
00263 void DlgImportCroppingPdf::slotTimeout ()
00264 {
00265 LOG4CPP_INFO_S ((*mainCat)) << "DlgImportCroppingPdf::slotTimeout";
00266
00267 updatePreview ();
00268 }
00269
00270 void DlgImportCroppingPdf::updatePreview ()
00271 {
00272 LOG4CPP_INFO_S ((*mainCat)) << "DlgImportCroppingPdf::updatePreview";
00273
00274 if (m_pixmap != 0) {
00275 m_scenePreview->removeItem (m_pixmap);
00276 }
00277
00278 m_image = loadImage (m_spinPage->value ());
00279 m_pixmap = new QGraphicsPixmapItem (QPixmap::fromImage (m_image));
00280 m_scenePreview->addItem (m_pixmap);
00281
00282
00283 QApplication::restoreOverrideCursor ();
00284 }