12#include "poppler-qt5.h"
13#include <QApplication>
14#include <QGraphicsPixmapItem>
15#include <QGraphicsScene>
29int DlgImportCroppingPdf::MINIMUM_DIALOG_WIDTH = 350;
30int DlgImportCroppingPdf::MINIMUM_PREVIEW_HEIGHT = 200;
38 m_document (document),
39 m_resolution (resolution),
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);
71void DlgImportCroppingPdf::createPageSpinner (QGridLayout *layout,
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)));
89void DlgImportCroppingPdf::createPdfCropping ()
96void DlgImportCroppingPdf::createPreview (QGridLayout *layout,
101 QLabel *labelPreview =
new QLabel (tr (
"Preview"));
102 layout->addWidget (labelPreview, row++, 0, 1, 1, Qt::AlignLeft);
104 m_scenePreview =
new QGraphicsScene (
this);
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 ();
121void DlgImportCroppingPdf::createTimer ()
123 m_timer =
new QTimer;
124 m_timer->setSingleShot (
true);
125 connect (m_timer, SIGNAL (timeout ()),
this, SLOT (slotTimeout ()));
128void 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);
172 QRectF rectFramePixels = m_pdfCropping->
frameRect ();
174 return m_image.copy (rectFramePixels.toRect ());
177void DlgImportCroppingPdf::initializeFrameGeometryAndPixmap ()
180 QGraphicsPixmapItem *pixmap =
new QGraphicsPixmapItem (QPixmap::fromImage (m_image));
181 m_scenePreview->addItem (pixmap);
184 m_viewPreview->setSceneRect (pixmap->boundingRect ());
187QImage DlgImportCroppingPdf::loadImage (
int page1Based)
const
191 int page0Based = page1Based - 1;
192 Page *page = m_document.page (page0Based);
193 if (page !=
nullptr) {
195 image = page->renderToImage (m_resolution,
208void DlgImportCroppingPdf::saveGeometryToSettings()
226 settings.endGroup ();
229void DlgImportCroppingPdf::slotCancel ()
234 QApplication::restoreOverrideCursor ();
236 setResult (QDialog::Rejected);
237 saveGeometryToSettings();
241void DlgImportCroppingPdf::slotOk ()
246 QApplication::restoreOverrideCursor ();
248 setResult (QDialog::Accepted);
249 saveGeometryToSettings();
253void DlgImportCroppingPdf::slotPage (
int page)
257 <<
" stepBy=" << m_spinPage->singleStep ();
260 QApplication::setOverrideCursor (Qt::WaitCursor);
265void DlgImportCroppingPdf::slotTimeout ()
272void DlgImportCroppingPdf::updatePreview ()
276 if (m_pixmap !=
nullptr) {
277 m_scenePreview->removeItem (m_pixmap);
280 m_image = loadImage (m_spinPage->value ());
281 m_pixmap =
new QGraphicsPixmapItem (QPixmap::fromImage (m_image));
282 m_scenePreview->addItem (m_pixmap);
285 QApplication::restoreOverrideCursor ();
const int SMALLEST_DELAY_MS
const int FIRST_PAGE_1_BASED
#define ENGAUGE_ASSERT(cond)
Drop in replacement for Q_ASSERT if defined(QT_NO_DEBUG) && !defined(QT_FORCE_ASSERTS) define ENGAUGE...
log4cpp::Category * mainCat
const QString SETTINGS_ENGAUGE
const QString SETTINGS_GROUP_IMPORT_CROPPING
const QString SETTINGS_IMPORT_CROPPING_POS
const QString SETTINGS_DIGITIZER
virtual void showEvent(QShowEvent *event)
Do preparation before dialog is displayed.
QImage image() const
Image that was selected. Value is null if loading failed.
virtual ~DlgImportCroppingPdf()
DlgImportCroppingPdf(const Poppler::Document &document, int resolution)
Single constructor.
This class shows a frame around the selected portion of the pdf import preview window.
QRectF frameRect() const
Frame rectangle selected by user.
Class that modifies QGraphicsView to automatically expand/shrink the view to fit the window,...
@ VIEW_ASPECT_RATIO_ONE_TO_ONE
#define LOG4CPP_INFO_S(logger)