Engauge Digitizer 2
Loading...
Searching...
No Matches
DlgImportCroppingNonPdf.cpp
Go to the documentation of this file.
1/******************************************************************************************************
2 * (C) 2014 markummitchell@github.com. This file is part of Engauge Digitizer, which is released *
3 * under GNU General Public License version 2 (GPLv2) or (at your option) any later version. See file *
4 * LICENSE or go to gnu.org/licenses for details. Distribution requires prior written permission. *
5 ******************************************************************************************************/
6
8#include "EngaugeAssert.h"
9#include "Logger.h"
10#include "MainWindow.h"
11#include "NonPdfCropping.h"
12#include <QApplication>
13#include <QGraphicsPixmapItem>
14#include <QGraphicsScene>
15#include <QImage>
16#include <QLabel>
17#include <QLayout>
18#include <QPushButton>
19#include <QSettings>
20#include <QSpinBox>
21#include <QTimer>
22#include "Settings.h"
23#include "ViewPreview.h"
24
25int DlgImportCroppingNonPdf::MINIMUM_DIALOG_WIDTH = 350;
26int DlgImportCroppingNonPdf::MINIMUM_PREVIEW_HEIGHT = 200;
27
29 m_fileName (fileName),
30 m_pixmap (nullptr),
31 m_nonPdfCropping (nullptr)
32{
33 LOG4CPP_INFO_S ((*mainCat)) << "DlgImportCroppingNonPdf::DlgImportCroppingNonPdf";
34
35 setWindowTitle (tr ("Image File Import Cropping"));
36 setModal (true);
37
38 QWidget *subPanel = new QWidget ();
39 QGridLayout *layout = new QGridLayout (subPanel);
40 subPanel->setLayout (layout);
41
42 int row = 0;
43
44 createPreview (layout, row);
45 finishPanel (subPanel);
46 updatePreview ();
47
48 // Bring the two middle columns together
49 layout->setColumnStretch (0, 1);
50 layout->setColumnStretch (1, 0);
51 layout->setColumnStretch (2, 0);
52 layout->setColumnStretch (3, 1);
53}
54
56{
57 LOG4CPP_INFO_S ((*mainCat)) << "DlgImportCroppingNonPdf::~DlgImportCroppingNonPdf";
58
59 delete m_nonPdfCropping;
60}
61
62void DlgImportCroppingNonPdf::createNonPdfCropping ()
63{
64 // Create frame that shows what will be included, and what will be excluded, during the import
65 m_nonPdfCropping = new NonPdfCropping (*m_scenePreview,
66 *m_viewPreview);
67}
68
69void DlgImportCroppingNonPdf::createPreview (QGridLayout *layout,
70 int &row)
71{
72 LOG4CPP_INFO_S ((*mainCat)) << "DlgImportCroppingNonPdf::createPreview";
73
74 QLabel *labelPreview = new QLabel (tr ("Preview"));
75 layout->addWidget (labelPreview, row++, 0, 1, 1, Qt::AlignLeft);
76
77 m_scenePreview = new QGraphicsScene (this);
78 m_viewPreview = new ViewPreview (m_scenePreview,
80 this);
81 m_viewPreview->setWhatsThis (tr ("Preview window that shows what part of the image will be imported. "
82 "The image portion inside the rectangular frame will be imported from the currently selected page. "
83 "The frame can be moved and resized by dragging the corner handles."));
84 m_viewPreview->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
85 m_viewPreview->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
86 m_viewPreview->setMinimumHeight (MINIMUM_PREVIEW_HEIGHT);
87 layout->addWidget (m_viewPreview, row++, 0, 1, 4);
88
89 // More preview initialization
90 initializeFrameGeometryAndPixmap (); // Before first call to updatePreview
91 createNonPdfCropping ();
92}
93
94void DlgImportCroppingNonPdf::finishPanel (QWidget *subPanel)
95{
96 const int STRETCH_OFF = 0, STRETCH_ON = 1;
97
98 QVBoxLayout *panelLayout = new QVBoxLayout (this);
99
100 setMinimumWidth (MINIMUM_DIALOG_WIDTH);
101 setLayout (panelLayout);
102
103 panelLayout->addWidget (subPanel);
104 panelLayout->setStretch (panelLayout->count () - 1, STRETCH_ON);
105
106 QWidget *panelButtons = new QWidget (this);
107 QHBoxLayout *buttonLayout = new QHBoxLayout (panelButtons);
108
109 QHBoxLayout *layoutRightSide = new QHBoxLayout;
110
111 QWidget *widgetRightSide = new QWidget;
112 widgetRightSide->setLayout (layoutRightSide);
113 buttonLayout->addWidget (widgetRightSide);
114
115 QSpacerItem *spacerExpanding = new QSpacerItem (40, 5, QSizePolicy::Expanding, QSizePolicy::Expanding);
116 layoutRightSide->addItem (spacerExpanding);
117
118 m_btnOk = new QPushButton (tr ("Ok"));
119 layoutRightSide->addWidget (m_btnOk, 0, Qt::AlignRight);
120 connect (m_btnOk, SIGNAL (released ()), this, SLOT (slotOk ()));
121
122 QSpacerItem *spacerFixed = new QSpacerItem (40, 5, QSizePolicy::Fixed, QSizePolicy::Fixed);
123 layoutRightSide->addItem (spacerFixed);
124
125 m_btnCancel = new QPushButton (tr ("Cancel"));
126 layoutRightSide->addWidget (m_btnCancel, 0, Qt::AlignRight);
127 connect (m_btnCancel, SIGNAL (released ()), this, SLOT (slotCancel ()));
128
129 panelLayout->addWidget (panelButtons, STRETCH_ON);
130 panelLayout->setStretch (panelLayout->count () - 1, STRETCH_OFF);
131}
132
134{
135 // If the entire page was to be returned, then this method would simply return m_image. However, only the framed
136 // portion is to be returned
137 ENGAUGE_CHECK_PTR (m_nonPdfCropping);
138 QRectF rectFramePixels = m_nonPdfCropping->frameRect ();
139
140 return m_image.copy (rectFramePixels.toRect ());
141}
142
143void DlgImportCroppingNonPdf::initializeFrameGeometryAndPixmap ()
144{
145 m_image = loadImage ();
146 QGraphicsPixmapItem *pixmap = new QGraphicsPixmapItem (QPixmap::fromImage (m_image));
147 m_scenePreview->addItem (pixmap);
148
149 // Force resize so image fills preview area. We do this only once initially for speed
150 m_viewPreview->setSceneRect (pixmap->boundingRect ());
151}
152
153QImage DlgImportCroppingNonPdf::loadImage () const
154{
155 QImage image;
156 image.load (m_fileName);
157
158 return image;
159}
160
161void DlgImportCroppingNonPdf::saveGeometryToSettings()
162{
163 // Store the settings for use by showEvent
164 QSettings settings (SETTINGS_ENGAUGE, SETTINGS_DIGITIZER);
165 settings.beginGroup (SETTINGS_GROUP_IMPORT_CROPPING);
166 settings.setValue (SETTINGS_IMPORT_CROPPING_POS, saveGeometry ());
167 settings.endGroup();
168}
169
170void DlgImportCroppingNonPdf::showEvent (QShowEvent * /* event */)
171{
172 QSettings settings (SETTINGS_ENGAUGE, SETTINGS_DIGITIZER);
173 settings.beginGroup (SETTINGS_GROUP_IMPORT_CROPPING);
174 if (settings.contains (SETTINGS_IMPORT_CROPPING_POS)) {
175
176 // Restore the settings that were stored by the last call to saveGeometryToSettings
177 restoreGeometry (settings.value (SETTINGS_IMPORT_CROPPING_POS).toByteArray ());
178 }
179 settings.endGroup ();
180}
181
182void DlgImportCroppingNonPdf::slotCancel ()
183{
184 LOG4CPP_INFO_S ((*mainCat)) << "DlgImportCroppingNonPdf::slotCancel";
185
186 // Restore cursor in case updatePreview has not already completed and then restored it
187 QApplication::restoreOverrideCursor ();
188
189 setResult (QDialog::Rejected);
190 saveGeometryToSettings();
191 hide();
192}
193
194void DlgImportCroppingNonPdf::slotOk ()
195{
196 LOG4CPP_INFO_S ((*mainCat)) << "DlgImportCroppingNonPdf::slotOk";
197
198 // Restore cursor in case updatePreview has not already completed and then restored it
199 QApplication::restoreOverrideCursor ();
200
201 setResult (QDialog::Accepted);
202 saveGeometryToSettings();
203 hide();
204}
205
206void DlgImportCroppingNonPdf::updatePreview ()
207{
208 LOG4CPP_INFO_S ((*mainCat)) << "DlgImportCroppingNonPdf::updatePreview";
209
210 if (m_pixmap != nullptr) {
211 m_scenePreview->removeItem (m_pixmap);
212 }
213
214 m_image = loadImage ();
215 m_pixmap = new QGraphicsPixmapItem (QPixmap::fromImage (m_image));
216 m_scenePreview->addItem (m_pixmap);
217
218 // Calculations for preview updating are now over
219 QApplication::restoreOverrideCursor ();
220}
#define ENGAUGE_CHECK_PTR(ptr)
#endif
log4cpp::Category * mainCat
Definition Logger.cpp:14
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.
DlgImportCroppingNonPdf(const QString &fileName)
Single constructor.
This class shows a frame around the selected portion of the 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,...
Definition ViewPreview.h:15
@ VIEW_ASPECT_RATIO_ONE_TO_ONE
Definition ViewPreview.h:23
#define LOG4CPP_INFO_S(logger)
Definition convenience.h:18