7 #include "CmdMediator.h" 8 #include "CmdSettingsPointMatch.h" 9 #include "DlgSettingsPointMatch.h" 10 #include "EngaugeAssert.h" 12 #include "MainWindow.h" 14 #include <QGraphicsEllipseItem> 15 #include <QGraphicsPixmapItem> 16 #include <QGraphicsRectItem> 17 #include <QGraphicsScene> 18 #include <QGridLayout> 23 #include "ViewPreview.h" 25 const int MINIMUM_HEIGHT = 480;
26 const int POINT_SIZE_MAX = 1024;
27 const int POINT_SIZE_MIN = 5;
31 "DlgSettingsPointMatch",
36 m_modelPointMatchBefore (0),
37 m_modelPointMatchAfter (0)
39 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::DlgSettingsPointMatch";
45 DlgSettingsPointMatch::~DlgSettingsPointMatch()
47 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::~DlgSettingsPointMatch";
50 QPointF DlgSettingsPointMatch::boxPositionConstraint(
const QPointF &posIn)
52 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::boxPositionConstraint";
54 double radius = radiusAlongDiagonal();
55 double diameter = 2.0 * radius;
59 if (pos.x() - radius < 0) {
63 if (pos.y() - radius < 0) {
67 if (pos.x() + diameter > m_scenePreview->sceneRect().width ()) {
68 pos.setX (m_scenePreview->sceneRect().width() - diameter);
71 if (pos.y() + diameter > m_scenePreview->sceneRect().height ()) {
72 pos.setY (m_scenePreview->sceneRect().height() - diameter);
78 void DlgSettingsPointMatch::createControls (QGridLayout *layout,
81 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::createControls";
83 QLabel *labelPointSize =
new QLabel (tr (
"Maximum point size (pixels):"));
84 layout->addWidget (labelPointSize, row, 1);
86 m_spinPointSize =
new QSpinBox;
87 m_spinPointSize->setWhatsThis (tr (
"Select a maximum point size in pixels.\n\n" 88 "Sample match points must fit within a square box, around the cursor, having width and height " 89 "equal to this maximum.\n\n" 90 "This size is also used to determine if a region of pixels that are on, in the processed image, " 91 "should be ignored since that region is wider or taller than this limit.\n\n" 92 "This value has a lower limit"));
93 m_spinPointSize->setMinimum (POINT_SIZE_MIN);
94 m_spinPointSize->setMaximum (POINT_SIZE_MAX);
95 connect (m_spinPointSize, SIGNAL (valueChanged (
int)),
this, SLOT (slotMaxPointSize (
int)));
96 layout->addWidget (m_spinPointSize, row++, 2);
98 QLabel *labelAcceptedPointColor =
new QLabel (tr (
"Accepted point color:"));
99 layout->addWidget (labelAcceptedPointColor, row, 1);
101 m_cmbAcceptedPointColor =
new QComboBox;
102 m_cmbAcceptedPointColor->setWhatsThis (tr (
"Select a color for matched points that are accepted"));
104 connect (m_cmbAcceptedPointColor, SIGNAL (activated (
const QString &)),
this, SLOT (slotAcceptedPointColor (
const QString &)));
105 layout->addWidget (m_cmbAcceptedPointColor, row++, 2);
107 QLabel *labelRejectedPointColor =
new QLabel (tr (
"Rejected point color:"));
108 layout->addWidget (labelRejectedPointColor, row, 1);
110 m_cmbRejectedPointColor =
new QComboBox;
111 m_cmbRejectedPointColor->setWhatsThis (tr (
"Select a color for matched points that are rejected"));
113 connect (m_cmbRejectedPointColor, SIGNAL (activated (
const QString &)),
this, SLOT (slotRejectedPointColor (
const QString &)));
114 layout->addWidget (m_cmbRejectedPointColor, row++, 2);
116 QLabel *labelCandidatePointColor =
new QLabel (tr (
"Candidate point color:"));
117 layout->addWidget (labelCandidatePointColor, row, 1);
119 m_cmbCandidatePointColor =
new QComboBox;
120 m_cmbCandidatePointColor->setWhatsThis (tr (
"Select a color for the point being decided upon"));
122 connect (m_cmbCandidatePointColor, SIGNAL (activated (
const QString &)),
this, SLOT (slotCandidatePointColor (
const QString &)));
123 layout->addWidget (m_cmbCandidatePointColor, row++, 2);
130 void DlgSettingsPointMatch::createPreview (QGridLayout *layout,
133 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::createPreview";
135 QLabel *labelPreview =
new QLabel (tr (
"Preview"));
136 layout->addWidget (labelPreview, row++, 0, 1, 4);
138 m_scenePreview =
new QGraphicsScene (
this);
140 ViewPreview::VIEW_ASPECT_RATIO_VARIABLE,
142 m_viewPreview->setWhatsThis (tr (
"Preview window shows how current settings affect " 143 "point matching, and how the marked and candidate points are displayed.\n\nThe points are separated " 144 "by the point separation value, and the maximum point size is shown as a box in the center"));
145 m_viewPreview->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
146 m_viewPreview->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
148 connect (m_viewPreview, SIGNAL (signalMouseMove (QPointF)),
this, SLOT (slotMouseMove (QPointF)));
150 layout->addWidget (m_viewPreview, row++, 0, 1, 4);
155 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::createSubPanel";
157 QWidget *subPanel =
new QWidget ();
158 QGridLayout *layout =
new QGridLayout (subPanel);
159 subPanel->setLayout (layout);
161 layout->setColumnStretch(0, 1);
162 layout->setColumnStretch(1, 0);
163 layout->setColumnStretch(2, 0);
164 layout->setColumnStretch(3, 1);
167 createControls (layout, row);
168 createPreview (layout, row);
174 void DlgSettingsPointMatch::createTemplate ()
176 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::createTemplate";
178 QPen pen (QBrush (Qt::black), 0);
180 m_circle =
new QGraphicsEllipseItem;
181 m_circle->setPen (pen);
182 m_circle->setZValue (100);
183 m_scenePreview->addItem (m_circle);
188 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::handleOk";
192 *m_modelPointMatchBefore,
193 *m_modelPointMatchAfter);
199 void DlgSettingsPointMatch::initializeBox ()
201 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::initializeBox";
203 m_circle->setPos (
cmdMediator().document().pixmap().width () / 2.0,
204 cmdMediator().document().pixmap().height () / 2.0);
209 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::load";
214 if (m_modelPointMatchBefore != 0) {
215 delete m_modelPointMatchBefore;
217 if (m_modelPointMatchAfter != 0) {
218 delete m_modelPointMatchAfter;
226 ENGAUGE_ASSERT (POINT_SIZE_MIN <= m_modelPointMatchAfter->maxPointSize());
227 ENGAUGE_ASSERT (POINT_SIZE_MAX > m_modelPointMatchAfter->
maxPointSize());
230 m_spinPointSize->setValue(m_modelPointMatchAfter->
maxPointSize());
232 int indexAccepted = m_cmbAcceptedPointColor->findData(QVariant(m_modelPointMatchAfter->
paletteColorAccepted()));
233 ENGAUGE_ASSERT (indexAccepted >= 0);
234 m_cmbAcceptedPointColor->setCurrentIndex(indexAccepted);
236 int indexCandidate = m_cmbCandidatePointColor->findData(QVariant(m_modelPointMatchAfter->
paletteColorCandidate()));
237 ENGAUGE_ASSERT (indexCandidate >= 0);
238 m_cmbCandidatePointColor->setCurrentIndex(indexCandidate);
240 int indexRejected = m_cmbRejectedPointColor->findData(QVariant(m_modelPointMatchAfter->
paletteColorRejected()));
241 ENGAUGE_ASSERT (indexRejected >= 0);
242 m_cmbRejectedPointColor->setCurrentIndex(indexRejected);
247 QGraphicsRectItem *boundary = m_scenePreview->addRect (QRect (0,
251 boundary->setVisible (
false);
260 double DlgSettingsPointMatch::radiusAlongDiagonal ()
const 262 double maxPointSize = m_modelPointMatchAfter->
maxPointSize();
264 return qSqrt (2.0) * maxPointSize / 2.0;
270 setMinimumHeight (MINIMUM_HEIGHT);
274 void DlgSettingsPointMatch::slotAcceptedPointColor (
const QString &)
276 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::slotAcceptedPointColor";
278 m_modelPointMatchAfter->
setPaletteColorAccepted((ColorPalette) m_cmbAcceptedPointColor->currentData().toInt());
284 void DlgSettingsPointMatch::slotCandidatePointColor (
const QString &)
286 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::slotCandidatePointColor";
293 void DlgSettingsPointMatch::slotMaxPointSize (
int maxPointSize)
295 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::slotMaxPointSize";
302 void DlgSettingsPointMatch::slotMouseMove (QPointF pos)
306 pos = boxPositionConstraint (pos);
308 m_circle->setPos (pos);
311 void DlgSettingsPointMatch::slotRejectedPointColor (
const QString &)
313 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::slotRejectedPointColor";
315 m_modelPointMatchAfter->
setPaletteColorRejected((ColorPalette) m_cmbRejectedPointColor->currentData().toInt());
320 void DlgSettingsPointMatch::updateControls()
326 void DlgSettingsPointMatch::updatePreview()
329 double maxPointSize = m_modelPointMatchAfter->
maxPointSize();
331 double xLeft = -1.0 * maxPointSize / 2.0;
332 double yTop = -1.0 * maxPointSize / 2.0;
335 m_circle->setRect (xLeft,
Model for DlgSettingsPointMatch and CmdSettingsPointMatch.
void setPaletteColorCandidate(ColorPalette paletteColorCandidate)
Set method for candidate color.
void setCmdMediator(CmdMediator &cmdMediator)
Store CmdMediator for easy access by the leaf class.
void finishPanel(QWidget *subPanel, int minimumWidth=MINIMUM_DIALOG_WIDTH, int minimumHeightOrZero=0)
Add Ok and Cancel buttons to subpanel to get the whole dialog.
Command for DlgSettingsPointMatch.
ColorPalette paletteColorCandidate() const
Get method for candidate color.
Class that modifies QGraphicsView to automatically expand/shrink the view to fit the window...
void setMaxPointSize(double maxPointSize)
Set method for max point size.
ColorPalette paletteColorAccepted() const
Get method for accepted color.
void setPaletteColorRejected(ColorPalette paletteColorRejected)
Set method for rejected color.
static int MINIMUM_PREVIEW_HEIGHT
Dialog layout constant that guarantees preview has sufficent room.
virtual void handleOk()
Process slotOk.
void enableOk(bool enable)
Let leaf subclass control the Ok button.
virtual void load(CmdMediator &cmdMediator)
Load settings from Document.
void populateColorComboWithTransparent(QComboBox &combo)
Add colors in color palette to combobox, with transparent entry at end.
Abstract base class for all Settings dialogs.
virtual QWidget * createSubPanel()
Create dialog-specific panel to which base class will add Ok and Cancel buttons.
QPixmap pixmap() const
Return the image that is being digitized.
DlgSettingsPointMatch(MainWindow &mainWindow)
Single constructor.
ColorPalette paletteColorRejected() const
Get method for rejected color.
MainWindow & mainWindow()
Get method for MainWindow.
virtual void createOptionalSaveDefault(QHBoxLayout *layout)
Let subclass define an optional Save As Default button.
double maxPointSize() const
Get method for max point size.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
CmdMediator & cmdMediator()
Provide access to Document information wrapped inside CmdMediator.
virtual void setSmallDialogs(bool smallDialogs)
If false then dialogs have a minimum size so all controls are visible.
void setPaletteColorAccepted(ColorPalette paletteColorAccepted)
Set method for accepted color.