7 #include "CmdMediator.h" 8 #include "CmdSettingsSegments.h" 9 #include "DlgSettingsSegments.h" 10 #include "EngaugeAssert.h" 11 #include "GeometryWindow.h" 13 #include "MainWindow.h" 14 #include "PointStyle.h" 17 #include <QGridLayout> 18 #include <QGraphicsScene> 23 #include "SegmentFactory.h" 24 #include "ViewPreview.h" 26 const int MINIMUM_HEIGHT = 540;
27 const int MIN_LENGTH_MIN = 1;
28 const int MIN_LENGTH_MAX = 10000;
29 const int POINT_SEPARATION_MIN = 5;
30 const int POINT_SEPARATION_MAX = 10000;
32 const int IMAGE_WIDTH = 400;
33 const int IMAGE_HEIGHT = 350;
35 const double TWOPI = 2.0 * 3.1415926535;
37 const double BRUSH_WIDTH = 2.0;
41 "DlgSettingsSegments",
45 m_modelSegmentsBefore (0),
46 m_modelSegmentsAfter (0),
49 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsSegments::DlgSettingsSegments";
55 DlgSettingsSegments::~DlgSettingsSegments()
57 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsSegments::~DlgSettingsSegments";
60 void DlgSettingsSegments::clearPoints ()
62 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsSegments::clearPoints";
64 QList<GraphicsPoint*>::iterator itrP;
65 for (itrP = m_points.begin(); itrP != m_points.end(); itrP++) {
73 void DlgSettingsSegments::createControls (QGridLayout *layout,
76 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsSegments::createControls";
78 QLabel *labelMinLength =
new QLabel(tr (
"Minimum length (points):"));
79 layout->addWidget(labelMinLength, row, 1);
81 m_spinMinLength =
new QSpinBox;
82 m_spinMinLength->setRange (MIN_LENGTH_MIN, MIN_LENGTH_MAX);
83 m_spinMinLength->setWhatsThis (tr (
"Select a minimum number of points in a segment.\n\n" 84 "Only segments with more points will be created.\n\n" 85 "This value should be as large as possible to reduce memory usage. This value has " 87 connect (m_spinMinLength, SIGNAL (valueChanged (
const QString &)),
this, SLOT (slotMinLength (
const QString &)));
88 layout->addWidget(m_spinMinLength, row++, 2);
90 QLabel *labelPointSeparation =
new QLabel(tr (
"Point separation (pixels):"));
91 layout->addWidget (labelPointSeparation, row, 1);
93 m_spinPointSeparation =
new QSpinBox;
94 m_spinPointSeparation->setRange (POINT_SEPARATION_MIN, POINT_SEPARATION_MAX);
95 m_spinPointSeparation->setWhatsThis (tr (
"Select a point separation in pixels.\n\n" 96 "Successive points added to a segment will be separated by this number of pixels. " 97 "If Fill Corners is enabled, then additional points will be inserted at corners so some points " 99 "This value has a lower limit"));
100 connect (m_spinPointSeparation, SIGNAL (valueChanged (
const QString &)),
this, SLOT (slotPointSeparation (
const QString &)));
101 layout->addWidget (m_spinPointSeparation, row++, 2);
103 QLabel *labelFillCorners =
new QLabel (tr (
"Fill corners:"));
104 layout->addWidget (labelFillCorners, row, 1);
106 m_chkFillCorners =
new QCheckBox;
107 m_chkFillCorners->setWhatsThis (tr (
"Fill corners.\n\n" 108 "In addition to the points placed at regular intervals, this option causes a point to be " 109 "placed at each corner. This option can capture important information in piecewise linear graphs, " 110 "but gradually curving graphs may not benefit from the additional points"));
111 connect (m_chkFillCorners, SIGNAL (stateChanged (
int)),
this, SLOT (slotFillCorners (
int)));
112 layout->addWidget (m_chkFillCorners, row++, 2);
114 QLabel *labelLineWidth =
new QLabel(tr (
"Line width:"));
115 layout->addWidget (labelLineWidth, row, 1);
117 m_spinLineWidth =
new QSpinBox;
118 m_spinLineWidth->setWhatsThis (tr (
"Select a size for the lines drawn along a segment"));
119 m_spinLineWidth->setMinimum(1);
120 connect (m_spinLineWidth, SIGNAL (valueChanged (
int)),
this, SLOT (slotLineWidth (
int)));
121 layout->addWidget (m_spinLineWidth, row++, 2);
123 QLabel *labelLineColor =
new QLabel(tr (
"Line color:"));
124 layout->addWidget (labelLineColor, row, 1);
126 m_cmbLineColor =
new QComboBox;
127 m_cmbLineColor->setWhatsThis (tr (
"Select a color for the lines drawn along a segment"));
129 connect (m_cmbLineColor, SIGNAL (activated (
const QString &)),
this, SLOT (slotLineColor (
const QString &)));
130 layout->addWidget (m_cmbLineColor, row++, 2);
137 void DlgSettingsSegments::createPreview (QGridLayout *layout,
140 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsSegments::createPreview";
142 QLabel *labelPreview =
new QLabel (tr (
"Preview"));
143 layout->addWidget (labelPreview, row++, 0, 1, 4);
145 m_scenePreview =
new QGraphicsScene (
this);
147 ViewPreview::VIEW_ASPECT_RATIO_VARIABLE,
149 m_viewPreview->setWhatsThis (tr (
"Preview window shows the shortest line that can be segment filled, " 150 "and the effects of current settings on segments and points generated by segment fill"));
151 m_viewPreview->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
152 m_viewPreview->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
155 layout->addWidget (m_viewPreview, row++, 0, 1, 4);
158 QImage DlgSettingsSegments::createPreviewImage ()
const 160 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsSegments::createPreviewImage";
162 QImage image (IMAGE_WIDTH,
164 QImage::Format_RGB32);
165 image.fill (Qt::white);
166 QPainter painter (&image);
167 painter.setRenderHint(QPainter::Antialiasing);
168 painter.setPen (QPen (QBrush (Qt::black), BRUSH_WIDTH));
170 int margin = IMAGE_WIDTH / 15;
171 int yCenter = IMAGE_HEIGHT / 2;
172 int yHeight = IMAGE_HEIGHT / 4;
173 int x, y, xLast, yLast;
178 int xStart = margin, xEnd = IMAGE_WIDTH / 2 - margin;
179 for (x = xStart; x < xEnd; x++) {
180 double s = (double) (x - xStart) / (double) (xEnd - xStart);
181 int y = yCenter - yHeight * qSin (TWOPI * s);
184 painter.drawLine (xLast, yLast, x, y);
193 xStart = IMAGE_WIDTH / 2 + margin, xEnd = IMAGE_WIDTH - margin;
194 for (x = xStart; x < xEnd; x++) {
195 double s = (double) (x - xStart) / (double) (xEnd - xStart);
197 y = yCenter - yHeight * (4.0 * s);
198 }
else if (s < 0.75) {
199 y = yCenter - yHeight * (1.0 - 4.0 * (s - 0.25));
201 y = yCenter + yHeight * (1.0 - 4 * (s - 0.75));
205 painter.drawLine (xLast, yLast, x, y);
217 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsSegments::createSubPanel";
219 QWidget *subPanel =
new QWidget ();
220 QGridLayout *layout =
new QGridLayout (subPanel);
221 subPanel->setLayout (layout);
223 layout->setColumnStretch (0, 1);
224 layout->setColumnStretch (1, 0);
225 layout->setColumnStretch (2, 0);
226 layout->setColumnStretch (3, 1);
229 createControls(layout, row);
230 createPreview (layout, row);
231 QPixmap pixmap = QPixmap::fromImage (createPreviewImage());
232 m_scenePreview->addPixmap (pixmap);
239 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsSegments::handleOk";
243 *m_modelSegmentsBefore,
244 *m_modelSegmentsAfter);
252 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsSegments::load";
260 if (m_modelSegmentsBefore != 0) {
261 delete m_modelSegmentsBefore;
263 if (m_modelSegmentsAfter != 0) {
264 delete m_modelSegmentsAfter;
272 ENGAUGE_ASSERT (MIN_LENGTH_MIN <= m_modelSegmentsAfter->minLength ());
273 ENGAUGE_ASSERT (MIN_LENGTH_MAX >= m_modelSegmentsAfter->
minLength ());
274 ENGAUGE_ASSERT (POINT_SEPARATION_MIN <= m_modelSegmentsAfter->pointSeparation());
275 ENGAUGE_ASSERT (POINT_SEPARATION_MAX >= m_modelSegmentsAfter->
pointSeparation());
278 m_spinPointSeparation->setValue (m_modelSegmentsAfter->
pointSeparation());
279 m_spinMinLength->setValue (m_modelSegmentsAfter->
minLength());
280 m_chkFillCorners->setChecked (m_modelSegmentsAfter->
fillCorners ());
281 m_spinLineWidth->setValue (m_modelSegmentsAfter->
lineWidth());
283 int indexLineColor = m_cmbLineColor->findData(QVariant (m_modelSegmentsAfter->
lineColor()));
284 ENGAUGE_ASSERT (indexLineColor >= 0);
285 m_cmbLineColor->setCurrentIndex(indexLineColor);
298 setMinimumHeight (MINIMUM_HEIGHT);
302 void DlgSettingsSegments::slotFillCorners (
int state)
304 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsSegments::slotFillCorner";
311 void DlgSettingsSegments::slotLineColor (
const QString &)
313 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsSegments::slotLineColor";
315 m_modelSegmentsAfter->
setLineColor((ColorPalette) m_cmbLineColor->currentData().toInt());
320 void DlgSettingsSegments::slotLineWidth (
int lineWidth)
322 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsSegments::slotLineWidth";
329 void DlgSettingsSegments::slotMinLength (
const QString &minLength)
331 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsSegments::slotMinLength";
333 m_modelSegmentsAfter->
setMinLength(minLength.toDouble());
338 void DlgSettingsSegments::slotPointSeparation (
const QString &pointSeparation)
340 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsSegments::slotPointSeparation";
347 void DlgSettingsSegments::updateControls()
352 void DlgSettingsSegments::updatePreview()
354 LOG4CPP_INFO_S ((*mainCat)) <<
"DlgSettingsSegments::updatePreview" 355 <<
" loading=" << (m_loading ?
"true" :
"false");
357 const QString ARBITRARY_IDENTIFIER (
"");
358 const QColor COLOR (Qt::blue);
359 const int RADIUS = 5;
372 *m_modelSegmentsAfter,
376 QList<Segment*>::iterator itrS;
377 for (itrS = m_segments.begin(); itrS != m_segments.end(); itrS++) {
387 QPolygonF polygon = pointStyle.
polygon();
388 QList<QPoint> points = segmentFactory.
fillPoints (*m_modelSegmentsAfter,
390 QList<QPoint>::iterator itrP;
391 for (itrP = points.begin(); itrP != points.end(); itrP++) {
394 ARBITRARY_IDENTIFIER,
399 NULL_GEOMETRY_WINDOW);
401 m_points.push_back (graphicsPoint);
virtual void setSmallDialogs(bool smallDialogs)
If false then dialogs have a minimum size so all controls are visible.
double pointSeparation() const
Get method for point separation.
void setLineColor(ColorPalette lineColor)
Set method for line color.
void setMinLength(double minLength)
Set method for min length.
double lineWidth() const
Get method for line width.
void setCmdMediator(CmdMediator &cmdMediator)
Store CmdMediator for easy access by the leaf class.
double minLength() const
Get method for min length.
bool fillCorners() const
Get method for fill corners.
Window that displays the geometry information, as a table, for the current curve. ...
QList< QPoint > fillPoints(const DocumentModelSegments &modelSegments, QList< Segment *> segments)
Return segment fill points for all segments, for previewing.
void finishPanel(QWidget *subPanel, int minimumWidth=MINIMUM_DIALOG_WIDTH, int minimumHeightOrZero=0)
Add Ok and Cancel buttons to subpanel to get the whole dialog.
void makeSegments(const QImage &imageFiltered, const DocumentModelSegments &modelSegments, QList< Segment *> &segments, bool useDlg=true)
Main entry point for creating all Segments for the filtered image.
virtual void load(CmdMediator &cmdMediator)
Load settings from Document.
void setLineWidth(double lineWidth)
Set method for line width.
QPolygonF polygon() const
Return the polygon for creating a QGraphicsPolygonItem. The size is determined by the radius...
Factory class for Segment objects.
void slotHover(bool hover)
Slot for hover enter/leave events in the associated SegmentLines.
Class that modifies QGraphicsView to automatically expand/shrink the view to fit the window...
void setFillCorners(bool fillCorners)
Set method for fill corners.
Details for a specific Point.
void clearSegments(QList< Segment *> &segments)
Remove the segments created by makeSegments.
Selectable piecewise-defined line that follows a filtered line in the image.
Graphics item for drawing a circular or polygonal Point.
static int MINIMUM_PREVIEW_HEIGHT
Dialog layout constant that guarantees preview has sufficent room.
Command for DlgSettingsSegments.
void enableOk(bool enable)
Let leaf subclass control the Ok button.
ColorPalette lineColor() const
Get method for line color.
void populateColorComboWithTransparent(QComboBox &combo)
Add colors in color palette to combobox, with transparent entry at end.
DlgSettingsSegments(MainWindow &mainWindow)
Single constructor.
Model for DlgSettingsSegments and CmdSettingsSegments.
Abstract base class for all Settings dialogs.
virtual void handleOk()
Process slotOk.
virtual QWidget * createSubPanel()
Create dialog-specific panel to which base class will add Ok and Cancel buttons.
void setPointSeparation(double pointSeparation)
Set method for point separation.
MainWindow & mainWindow()
Get method for MainWindow.
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 createOptionalSaveDefault(QHBoxLayout *layout)
Let subclass define an optional Save As Default button.