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 (QString (
"%1:").arg (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 (QString (
"%1:").arg (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 (QString (
"%1:").arg (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 (QString (
"%1:").arg (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 delete m_modelPointMatchBefore;
215 delete m_modelPointMatchAfter;
222 ENGAUGE_ASSERT (POINT_SIZE_MIN <= m_modelPointMatchAfter->maxPointSize());
223 ENGAUGE_ASSERT (POINT_SIZE_MAX > m_modelPointMatchAfter->
maxPointSize());
226 m_spinPointSize->setValue(m_modelPointMatchAfter->
maxPointSize());
228 int indexAccepted = m_cmbAcceptedPointColor->findData(QVariant(m_modelPointMatchAfter->
paletteColorAccepted()));
229 ENGAUGE_ASSERT (indexAccepted >= 0);
230 m_cmbAcceptedPointColor->setCurrentIndex(indexAccepted);
232 int indexCandidate = m_cmbCandidatePointColor->findData(QVariant(m_modelPointMatchAfter->
paletteColorCandidate()));
233 ENGAUGE_ASSERT (indexCandidate >= 0);
234 m_cmbCandidatePointColor->setCurrentIndex(indexCandidate);
236 int indexRejected = m_cmbRejectedPointColor->findData(QVariant(m_modelPointMatchAfter->
paletteColorRejected()));
237 ENGAUGE_ASSERT (indexRejected >= 0);
238 m_cmbRejectedPointColor->setCurrentIndex(indexRejected);
243 QGraphicsRectItem *boundary = m_scenePreview->addRect (QRect (0,
247 boundary->setVisible (
false);
256 double DlgSettingsPointMatch::radiusAlongDiagonal ()
const 258 double maxPointSize = m_modelPointMatchAfter->
maxPointSize();
260 return qSqrt (2.0) * maxPointSize / 2.0;
266 setMinimumHeight (MINIMUM_HEIGHT);
270 void DlgSettingsPointMatch::slotAcceptedPointColor (
const QString &)
272 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::slotAcceptedPointColor";
274 m_modelPointMatchAfter->
setPaletteColorAccepted((ColorPalette) m_cmbAcceptedPointColor->currentData().toInt());
280 void DlgSettingsPointMatch::slotCandidatePointColor (
const QString &)
282 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::slotCandidatePointColor";
289 void DlgSettingsPointMatch::slotMaxPointSize (
int maxPointSize)
291 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::slotMaxPointSize";
298 void DlgSettingsPointMatch::slotMouseMove (QPointF pos)
302 pos = boxPositionConstraint (pos);
304 m_circle->setPos (pos);
307 void DlgSettingsPointMatch::slotRejectedPointColor (
const QString &)
309 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsPointMatch::slotRejectedPointColor";
311 m_modelPointMatchAfter->
setPaletteColorRejected((ColorPalette) m_cmbRejectedPointColor->currentData().toInt());
316 void DlgSettingsPointMatch::updateControls()
322 void DlgSettingsPointMatch::updatePreview()
325 double maxPointSize = m_modelPointMatchAfter->
maxPointSize();
327 double xLeft = -1.0 * maxPointSize / 2.0;
328 double yTop = -1.0 * maxPointSize / 2.0;
331 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.