7 #include "DlgImportCroppingPdf.h" 8 #include "EngaugeAssert.h" 10 #include "MainWindow.h" 11 #include "PdfCropping.h" 12 #include "poppler-qt5.h" 13 #include <QApplication> 14 #include <QGraphicsPixmapItem> 15 #include <QGraphicsScene> 19 #include <QPushButton> 24 #include "ViewPreview.h" 28 int DlgImportCroppingPdf::MINIMUM_DIALOG_WIDTH = 350;
29 int DlgImportCroppingPdf::MINIMUM_PREVIEW_HEIGHT = 200;
30 const int X_TOP_LEFT = 0, Y_TOP_LEFT = 0;
31 const int WIDTH = -1, HEIGHT = -1;
32 const int FIRST_PAGE_1_BASED = 1;
33 const int SMALLEST_DELAY_MS = 500;
37 m_document (document),
38 m_resolution (resolution),
41 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::DlgImportCroppingPdf";
43 setWindowTitle (tr (
"PDF File Import Cropping"));
46 QWidget *subPanel =
new QWidget ();
47 QGridLayout *layout =
new QGridLayout (subPanel);
48 subPanel->setLayout (layout);
53 createPageSpinner (layout, row);
54 createPreview (layout, row);
55 finishPanel (subPanel);
59 layout->setColumnStretch (0, 1);
60 layout->setColumnStretch (1, 0);
61 layout->setColumnStretch (2, 0);
62 layout->setColumnStretch (3, 1);
65 DlgImportCroppingPdf::~DlgImportCroppingPdf()
67 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::~DlgImportCroppingPdf";
70 void DlgImportCroppingPdf::createPageSpinner (QGridLayout *layout,
73 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::createPageSpinner";
75 const int MIN_WIDTH_SPINNER = 90;
77 QLabel *labelPage =
new QLabel (tr (
"Page:"));
78 layout->addWidget (labelPage, row, 1, 1, 1);
80 m_spinPage =
new QSpinBox;
81 m_spinPage->setMinimumWidth (MIN_WIDTH_SPINNER);
82 m_spinPage->setWhatsThis (tr (
"Page number that will be imported"));
83 m_spinPage->setRange (1, m_document.numPages());
84 layout->addWidget (m_spinPage, row++, 2, 1, 1);
85 connect (m_spinPage, SIGNAL (valueChanged (
int)),
this, SLOT (slotPage (
int)));
88 void DlgImportCroppingPdf::createPdfCropping ()
95 void DlgImportCroppingPdf::createPreview (QGridLayout *layout,
98 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::createPreview";
100 QLabel *labelPreview =
new QLabel (tr (
"Preview"));
101 layout->addWidget (labelPreview, row++, 0, 1, 1, Qt::AlignLeft);
103 m_scenePreview =
new QGraphicsScene (
this);
105 ViewPreview::VIEW_ASPECT_RATIO_ONE_TO_ONE,
107 m_viewPreview->setWhatsThis (tr (
"Preview window that shows what part of the image will be imported. " 108 "The image portion inside the rectangular frame will be imported from the currently selected page. " 109 "The frame can be moved and resized by dragging the corner handles."));
110 m_viewPreview->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
111 m_viewPreview->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
112 m_viewPreview->setMinimumHeight (MINIMUM_PREVIEW_HEIGHT);
113 layout->addWidget (m_viewPreview, row++, 0, 1, 4);
116 initializeFrameGeometryAndPixmap ();
117 createPdfCropping ();
120 void DlgImportCroppingPdf::createTimer ()
122 m_timer =
new QTimer;
123 m_timer->setSingleShot (
true);
124 connect (m_timer, SIGNAL (timeout ()),
this, SLOT (slotTimeout ()));
127 void DlgImportCroppingPdf::finishPanel (QWidget *subPanel)
129 const int STRETCH_OFF = 0, STRETCH_ON = 1;
131 QVBoxLayout *panelLayout =
new QVBoxLayout (
this);
133 setMinimumWidth (MINIMUM_DIALOG_WIDTH);
134 setLayout (panelLayout);
136 panelLayout->addWidget (subPanel);
137 panelLayout->setStretch (panelLayout->count () - 1, STRETCH_ON);
139 QWidget *panelButtons =
new QWidget (
this);
140 QHBoxLayout *buttonLayout =
new QHBoxLayout (panelButtons);
142 QHBoxLayout *layoutRightSide =
new QHBoxLayout;
144 QWidget *widgetRightSide =
new QWidget;
145 widgetRightSide->setLayout (layoutRightSide);
146 buttonLayout->addWidget (widgetRightSide);
148 QSpacerItem *spacerExpanding =
new QSpacerItem (40, 5, QSizePolicy::Expanding, QSizePolicy::Expanding);
149 layoutRightSide->addItem (spacerExpanding);
151 m_btnOk =
new QPushButton (tr (
"Ok"));
152 layoutRightSide->addWidget (m_btnOk, 0, Qt::AlignRight);
153 connect (m_btnOk, SIGNAL (released ()),
this, SLOT (slotOk ()));
155 QSpacerItem *spacerFixed =
new QSpacerItem (40, 5, QSizePolicy::Fixed, QSizePolicy::Fixed);
156 layoutRightSide->addItem (spacerFixed);
158 m_btnCancel =
new QPushButton (tr (
"Cancel"));
159 layoutRightSide->addWidget (m_btnCancel, 0, Qt::AlignRight);
160 connect (m_btnCancel, SIGNAL (released ()),
this, SLOT (slotCancel ()));
162 panelLayout->addWidget (panelButtons, STRETCH_ON);
163 panelLayout->setStretch (panelLayout->count () - 1, STRETCH_OFF);
170 ENGAUGE_ASSERT (m_pdfCropping != 0);
171 QRectF rectFramePixels = m_pdfCropping->
frameRect ();
173 return m_image.copy (rectFramePixels.toRect ());
176 void DlgImportCroppingPdf::initializeFrameGeometryAndPixmap ()
178 m_image = loadImage (FIRST_PAGE_1_BASED);
179 QGraphicsPixmapItem *pixmap =
new QGraphicsPixmapItem (QPixmap::fromImage (m_image));
180 m_scenePreview->addItem (pixmap);
183 m_viewPreview->setSceneRect (pixmap->boundingRect ());
186 QImage DlgImportCroppingPdf::loadImage (
int page1Based)
const 190 int page0Based = page1Based - 1;
191 Page *page = m_document.page (page0Based);
194 image = page->renderToImage (m_resolution,
207 void DlgImportCroppingPdf::saveGeometryToSettings()
211 settings.beginGroup (SETTINGS_GROUP_IMPORT_CROPPING);
212 settings.setValue (SETTINGS_IMPORT_CROPPING_POS, saveGeometry ());
219 settings.beginGroup (SETTINGS_GROUP_IMPORT_CROPPING);
220 if (settings.contains (SETTINGS_IMPORT_CROPPING_POS)) {
223 restoreGeometry (settings.value (SETTINGS_IMPORT_CROPPING_POS).toByteArray ());
227 void DlgImportCroppingPdf::slotCancel ()
229 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::slotCancel";
232 QApplication::restoreOverrideCursor ();
234 setResult (QDialog::Rejected);
235 saveGeometryToSettings();
239 void DlgImportCroppingPdf::slotOk ()
241 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::slotOk";
244 QApplication::restoreOverrideCursor ();
246 setResult (QDialog::Accepted);
247 saveGeometryToSettings();
251 void DlgImportCroppingPdf::slotPage (
int page)
253 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::slotPage" 255 <<
" stepBy=" << m_spinPage->singleStep ();
258 QApplication::setOverrideCursor (Qt::WaitCursor);
260 m_timer->start (SMALLEST_DELAY_MS);
263 void DlgImportCroppingPdf::slotTimeout ()
265 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::slotTimeout";
270 void DlgImportCroppingPdf::updatePreview ()
272 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::updatePreview";
275 m_scenePreview->removeItem (m_pixmap);
278 m_image = loadImage (m_spinPage->value ());
279 m_pixmap =
new QGraphicsPixmapItem (QPixmap::fromImage (m_image));
280 m_scenePreview->addItem (m_pixmap);
283 QApplication::restoreOverrideCursor ();
DlgImportCroppingPdf(const Poppler::Document &document, int resolution)
Single constructor.
QRectF frameRect() const
Frame rectangle selected by user.
Class that modifies QGraphicsView to automatically expand/shrink the view to fit the window...
This class shows a frame around the selected portion of the pdf import preview window.
QImage image() const
Image that was selected. Value is null if loading failed.
virtual void showEvent(QShowEvent *event)
Do preparation before dialog is displayed.