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>
16 #include <QGridLayout>
20 #include <QPushButton>
25 #include "ViewPreview.h"
27 using namespace Poppler;
29 int DlgImportCroppingPdf::MINIMUM_DIALOG_WIDTH = 350;
30 int DlgImportCroppingPdf::MINIMUM_PREVIEW_HEIGHT = 200;
31 const int X_TOP_LEFT = 0, Y_TOP_LEFT = 0;
32 const int WIDTH = -1, HEIGHT = -1;
33 const int FIRST_PAGE_1_BASED = 1;
34 const int SMALLEST_DELAY_MS = 500;
38 m_document (document),
39 m_resolution (resolution),
42 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::DlgImportCroppingPdf";
44 setWindowTitle (tr (
"PDF File Import Cropping"));
47 QWidget *subPanel =
new QWidget ();
48 QGridLayout *layout =
new QGridLayout (subPanel);
49 subPanel->setLayout (layout);
54 createPageSpinner (layout, row);
55 createPreview (layout, row);
56 finishPanel (subPanel);
60 layout->setColumnStretch (0, 1);
61 layout->setColumnStretch (1, 0);
62 layout->setColumnStretch (2, 0);
63 layout->setColumnStretch (3, 1);
66 DlgImportCroppingPdf::~DlgImportCroppingPdf()
68 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::~DlgImportCroppingPdf";
71 void DlgImportCroppingPdf::createPageSpinner (QGridLayout *layout,
74 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::createPageSpinner";
76 const int MIN_WIDTH_SPINNER = 90;
78 QLabel *labelPage =
new QLabel (QString (
"%1:").arg (tr (
"Page")));
79 layout->addWidget (labelPage, row, 1, 1, 1);
81 m_spinPage =
new QSpinBox;
82 m_spinPage->setMinimumWidth (MIN_WIDTH_SPINNER);
83 m_spinPage->setWhatsThis (tr (
"Page number that will be imported"));
84 m_spinPage->setRange (1, m_document.numPages());
85 layout->addWidget (m_spinPage, row++, 2, 1, 1);
86 connect (m_spinPage, SIGNAL (valueChanged (
int)),
this, SLOT (slotPage (
int)));
89 void DlgImportCroppingPdf::createPdfCropping ()
96 void DlgImportCroppingPdf::createPreview (QGridLayout *layout,
99 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::createPreview";
101 QLabel *labelPreview =
new QLabel (tr (
"Preview"));
102 layout->addWidget (labelPreview, row++, 0, 1, 1, Qt::AlignLeft);
104 m_scenePreview =
new QGraphicsScene (
this);
106 ViewPreview::VIEW_ASPECT_RATIO_ONE_TO_ONE,
108 m_viewPreview->setWhatsThis (tr (
"Preview window that shows what part of the image will be imported. "
109 "The image portion inside the rectangular frame will be imported from the currently selected page. "
110 "The frame can be moved and resized by dragging the corner handles."));
111 m_viewPreview->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
112 m_viewPreview->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
113 m_viewPreview->setMinimumHeight (MINIMUM_PREVIEW_HEIGHT);
114 layout->addWidget (m_viewPreview, row++, 0, 1, 4);
117 initializeFrameGeometryAndPixmap ();
118 createPdfCropping ();
121 void DlgImportCroppingPdf::createTimer ()
123 m_timer =
new QTimer;
124 m_timer->setSingleShot (
true);
125 connect (m_timer, SIGNAL (timeout ()),
this, SLOT (slotTimeout ()));
128 void DlgImportCroppingPdf::finishPanel (QWidget *subPanel)
130 const int STRETCH_OFF = 0, STRETCH_ON = 1;
132 QVBoxLayout *panelLayout =
new QVBoxLayout (
this);
134 setMinimumWidth (MINIMUM_DIALOG_WIDTH);
135 setLayout (panelLayout);
137 panelLayout->addWidget (subPanel);
138 panelLayout->setStretch (panelLayout->count () - 1, STRETCH_ON);
140 QWidget *panelButtons =
new QWidget (
this);
141 QHBoxLayout *buttonLayout =
new QHBoxLayout (panelButtons);
143 QHBoxLayout *layoutRightSide =
new QHBoxLayout;
145 QWidget *widgetRightSide =
new QWidget;
146 widgetRightSide->setLayout (layoutRightSide);
147 buttonLayout->addWidget (widgetRightSide);
149 QSpacerItem *spacerExpanding =
new QSpacerItem (40, 5, QSizePolicy::Expanding, QSizePolicy::Expanding);
150 layoutRightSide->addItem (spacerExpanding);
152 m_btnOk =
new QPushButton (tr (
"Ok"));
153 layoutRightSide->addWidget (m_btnOk, 0, Qt::AlignRight);
154 connect (m_btnOk, SIGNAL (released ()),
this, SLOT (slotOk ()));
156 QSpacerItem *spacerFixed =
new QSpacerItem (40, 5, QSizePolicy::Fixed, QSizePolicy::Fixed);
157 layoutRightSide->addItem (spacerFixed);
159 m_btnCancel =
new QPushButton (tr (
"Cancel"));
160 layoutRightSide->addWidget (m_btnCancel, 0, Qt::AlignRight);
161 connect (m_btnCancel, SIGNAL (released ()),
this, SLOT (slotCancel ()));
163 panelLayout->addWidget (panelButtons, STRETCH_ON);
164 panelLayout->setStretch (panelLayout->count () - 1, STRETCH_OFF);
171 ENGAUGE_ASSERT (m_pdfCropping != 0);
172 QRectF rectFramePixels = m_pdfCropping->
frameRect ();
174 return m_image.copy (rectFramePixels.toRect ());
177 void DlgImportCroppingPdf::initializeFrameGeometryAndPixmap ()
179 m_image = loadImage (FIRST_PAGE_1_BASED);
180 QGraphicsPixmapItem *pixmap =
new QGraphicsPixmapItem (QPixmap::fromImage (m_image));
181 m_scenePreview->addItem (pixmap);
184 m_viewPreview->setSceneRect (pixmap->boundingRect ());
187 QImage DlgImportCroppingPdf::loadImage (
int page1Based)
const
191 int page0Based = page1Based - 1;
192 Page *page = m_document.page (page0Based);
195 image = page->renderToImage (m_resolution,
208 void DlgImportCroppingPdf::saveGeometryToSettings()
212 settings.beginGroup (SETTINGS_GROUP_IMPORT_CROPPING);
213 settings.setValue (SETTINGS_IMPORT_CROPPING_POS, saveGeometry ());
220 settings.beginGroup (SETTINGS_GROUP_IMPORT_CROPPING);
221 if (settings.contains (SETTINGS_IMPORT_CROPPING_POS)) {
224 restoreGeometry (settings.value (SETTINGS_IMPORT_CROPPING_POS).toByteArray ());
228 void DlgImportCroppingPdf::slotCancel ()
230 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::slotCancel";
233 QApplication::restoreOverrideCursor ();
235 setResult (QDialog::Rejected);
236 saveGeometryToSettings();
240 void DlgImportCroppingPdf::slotOk ()
242 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::slotOk";
245 QApplication::restoreOverrideCursor ();
247 setResult (QDialog::Accepted);
248 saveGeometryToSettings();
252 void DlgImportCroppingPdf::slotPage (
int page)
254 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::slotPage"
256 <<
" stepBy=" << m_spinPage->singleStep ();
259 QApplication::setOverrideCursor (Qt::WaitCursor);
261 m_timer->start (SMALLEST_DELAY_MS);
264 void DlgImportCroppingPdf::slotTimeout ()
266 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::slotTimeout";
271 void DlgImportCroppingPdf::updatePreview ()
273 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgImportCroppingPdf::updatePreview";
276 m_scenePreview->removeItem (m_pixmap);
279 m_image = loadImage (m_spinPage->value ());
280 m_pixmap =
new QGraphicsPixmapItem (QPixmap::fromImage (m_image));
281 m_scenePreview->addItem (m_pixmap);
284 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.
virtual void showEvent(QShowEvent *event)
Do preparation before dialog is displayed.
QImage image() const
Image that was selected. Value is null if loading failed.