25#include <QApplication>
30#include <QDoubleSpinBox>
31#include <QGraphicsLineItem>
32#include <QGraphicsScene>
54 "DlgSettingsGuideline",
56 m_scenePreviewActive (nullptr),
57 m_viewPreviewActive (nullptr),
58 m_scenePreviewInactive (nullptr),
59 m_viewPreviewInactive (nullptr),
60 m_itemGuidelineXTActive (nullptr),
61 m_itemGuidelineYActive (nullptr),
62 m_itemGuidelineRActive (nullptr),
63 m_itemCentipedeXTActive (nullptr),
64 m_itemCentipedeYActive (nullptr),
65 m_itemCentipedeRActive (nullptr),
66 m_itemCentipedeCircleActive (nullptr),
67 m_itemGuidelineXTInactive (nullptr),
68 m_itemGuidelineYInactive (nullptr),
69 m_itemGuidelineRInactive (nullptr),
70 m_modelGuidelineBefore (nullptr),
71 m_modelGuidelineAfter (nullptr)
85void DlgSettingsGuideline::createCircle ()
87 m_itemCentipedeCircleActive =
new QGraphicsEllipseItem ();
89 m_itemCentipedeCircleActive->setPen (QPen (Qt::black, 1, Qt::DotLine));
91 m_scenePreviewActive->addItem (m_itemCentipedeCircleActive);
94void DlgSettingsGuideline::createControls (QGridLayout *layout,
104 QLabel *labelPointRadius =
new QLabel (QString (
"%1:").arg (tr (
"Creation circle radius")));
105 layout->addWidget (labelPointRadius, row, 1);
107 m_spinCreationCircleRadius =
new QSpinBox;
108 m_spinCreationCircleRadius->setWhatsThis (tr (
"Select a radius, in pixels, for the points"));
109 m_spinCreationCircleRadius->setMinimum (1);
110 connect (m_spinCreationCircleRadius, SIGNAL (valueChanged (
int)),
this, SLOT (slotCreationCircleRadius (
int)));
111 layout->addWidget (m_spinCreationCircleRadius, row++, 2);
113 QLabel *labelGuidelineColor =
new QLabel (QString (
"%1:").arg (tr (
"Guideline color")));
114 layout->addWidget (labelGuidelineColor, row, 1);
116 m_lineColor =
new QComboBox;
117 m_lineColor->setWhatsThis (tr (
"Guidelines Color\n\n"
118 "Set the color of the guidelines that can be dragged from the edges of the scene, and used "
121 connect (m_lineColor, SIGNAL (activated (
const QString &)),
this, SLOT (slotLineColor (
const QString &)));
122 layout->addWidget (m_lineColor, row++, 2);
124 QLabel *labelLineWidthActive =
new QLabel(QString (
"%1:").arg (tr (
"Active Line width")));
125 layout->addWidget (labelLineWidthActive, row, 1);
127 m_spinLineWidthActive =
new QSpinBox;
128 m_spinLineWidthActive->setWhatsThis (tr (
"Select a size for the guidelines when active"));
129 m_spinLineWidthActive->setMinimum(1);
130 connect (m_spinLineWidthActive, SIGNAL (valueChanged (
int)),
this, SLOT (slotLineWidthActive (
int)));
131 layout->addWidget (m_spinLineWidthActive, row++, 2);
133 QLabel *labelLineWidthInactive =
new QLabel(QString (
"%1:").arg (tr (
"Inactive Line width")));
134 layout->addWidget (labelLineWidthInactive, row, 1);
136 m_spinLineWidthInactive =
new QSpinBox;
137 m_spinLineWidthInactive->setWhatsThis (tr (
"Select a size for the guidelines when inactive"));
138 m_spinLineWidthInactive->setMinimum(1);
139 connect (m_spinLineWidthInactive, SIGNAL (valueChanged (
int)),
this, SLOT (slotLineWidthInactive (
int)));
140 layout->addWidget (m_spinLineWidthInactive, row++, 2);
143void DlgSettingsGuideline::createLines ()
150 createLinesCartesian();
156void DlgSettingsGuideline::createLinesCartesian ()
158 m_itemGuidelineXTActive =
new QGraphicsLineItem ();
159 m_itemGuidelineYActive =
new QGraphicsLineItem ();
160 m_itemGuidelineXTInactive =
new QGraphicsLineItem ();
161 m_itemGuidelineYInactive =
new QGraphicsLineItem ();
163 m_scenePreviewActive->addItem (m_itemGuidelineXTActive);
164 m_scenePreviewActive->addItem (m_itemGuidelineYActive);
165 m_scenePreviewInactive->addItem (m_itemGuidelineXTInactive);
166 m_scenePreviewInactive->addItem (m_itemGuidelineYInactive);
168 m_itemCentipedeXTActive =
new QGraphicsLineItem ();
169 m_itemCentipedeYActive =
new QGraphicsLineItem ();
171 m_scenePreviewActive->addItem (m_itemCentipedeXTActive);
172 m_scenePreviewActive->addItem (m_itemCentipedeYActive);
175void DlgSettingsGuideline::createLinesPolar ()
177 m_itemGuidelineXTActive =
new QGraphicsLineItem ();
178 m_itemGuidelineRActive =
new QGraphicsEllipseItem ();
179 m_itemGuidelineXTInactive =
new QGraphicsLineItem ();
180 m_itemGuidelineRInactive =
new QGraphicsEllipseItem ();
182 m_scenePreviewActive->addItem (m_itemGuidelineXTActive);
183 m_scenePreviewActive->addItem (m_itemGuidelineRActive);
184 m_scenePreviewInactive->addItem (m_itemGuidelineXTInactive);
185 m_scenePreviewInactive->addItem (m_itemGuidelineRInactive);
187 m_itemCentipedeXTActive =
new QGraphicsLineItem();
188 m_itemCentipedeRActive =
new GraphicsArcItem ();
190 m_scenePreviewActive->addItem (m_itemCentipedeXTActive);
191 m_scenePreviewActive->addItem (m_itemCentipedeRActive);
199void DlgSettingsGuideline::createPreview (QGridLayout *layout,
int &row)
205 QGridLayout *layout5050 =
new QGridLayout();
206 QWidget *widget =
new QWidget();
207 widget->setLayout (layout5050);
211 QLabel *labelPreviewActive =
new QLabel (tr (
"Active Preview"));
212 layout5050->addWidget (labelPreviewActive, row5050, 0, 1, 2);
214 QLabel *labelPreviewInactive =
new QLabel (tr (
"Inactive Preview"));
215 layout5050->addWidget (labelPreviewInactive, row5050++, 2, 1, 2);
217 m_scenePreviewActive =
new QGraphicsScene (
this);
218 m_viewPreviewActive =
new ViewPreview (m_scenePreviewActive,
221 m_viewPreviewActive->setWhatsThis (tr (
"Preview window that shows how current settings affect the active guidelines."));
222 m_viewPreviewActive->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
223 m_viewPreviewActive->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
226 m_viewPreviewActive->setRenderHint(QPainter::Antialiasing);
228 layout5050->addWidget (m_viewPreviewActive, row5050, 0, 1, 2);
230 m_scenePreviewInactive =
new QGraphicsScene (
this);
231 m_viewPreviewInactive =
new ViewPreview (m_scenePreviewInactive,
234 m_viewPreviewInactive->setWhatsThis (tr (
"Preview window that shows how current settings affect the inactive guidelines."));
235 m_viewPreviewInactive->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
236 m_viewPreviewInactive->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
239 m_viewPreviewInactive->setRenderHint(QPainter::Antialiasing);
241 layout5050->addWidget (m_viewPreviewInactive, row5050++, 2, 1, 2);
243 layout->addWidget (widget, row++, 0, 1, 4);
250 QWidget *subPanel =
new QWidget ();
251 QGridLayout *layout =
new QGridLayout (subPanel);
252 subPanel->setLayout (layout);
254 layout->setColumnStretch(0, 1);
255 layout->setColumnStretch(1, 0);
256 layout->setColumnStretch(2, 0);
257 layout->setColumnStretch(3, 1);
260 createControls (layout, row);
261 createPreview (layout, row);
272 *m_modelGuidelineBefore,
273 *m_modelGuidelineAfter);
286 delete m_modelGuidelineBefore;
287 delete m_modelGuidelineAfter;
294 m_spinCreationCircleRadius->setValue (qFloor (m_modelGuidelineAfter->creationCircleRadius ()));
295 int indexColor = m_lineColor->findData(QVariant(m_modelGuidelineAfter->lineColor()));
297 m_lineColor->setCurrentIndex(indexColor);
298 m_spinLineWidthActive->setValue (qFloor (m_modelGuidelineAfter->lineWidthActive ()));
299 m_spinLineWidthInactive->setValue (qFloor (m_modelGuidelineAfter->lineWidthInactive ()));
301 removeOldWidgetsActive();
302 removeOldWidgetsInactive();
310void DlgSettingsGuideline::loadImages (
CmdMediator &cmdMediator)
315 m_scenePreviewActive->clear();
316 m_scenePreviewInactive->clear();
320 QPixmap::fromImage (imagePreviewActive));
324 QPixmap::fromImage (imagePreviewInactive));
327double DlgSettingsGuideline::radiusOfClosestSide (
const QPointF &posLeft,
328 const QPointF &posRight,
329 const QPointF &posTop,
330 const QPointF &posBottom)
const
333 QPointF posLeftGraph, posRightGraph, posTopGraph, posBottomGraph;
343 return qMin (qMin (qMin (posLeftGraph.y(), posRightGraph.y()), posTopGraph.y()), posBottomGraph.y());
346void DlgSettingsGuideline::removeOldWidgetsActive ()
348 delete m_itemGuidelineXTActive;
349 delete m_itemGuidelineYActive;
350 delete m_itemGuidelineRActive;
351 delete m_itemCentipedeXTActive;
352 delete m_itemCentipedeYActive;
353 delete m_itemCentipedeRActive;
354 delete m_itemCentipedeCircleActive;
356 m_itemGuidelineXTActive =
nullptr;
357 m_itemGuidelineYActive =
nullptr;
358 m_itemGuidelineRActive =
nullptr;
359 m_itemCentipedeXTActive =
nullptr;
360 m_itemCentipedeYActive =
nullptr;
361 m_itemCentipedeRActive =
nullptr;
362 m_itemCentipedeCircleActive =
nullptr;
365void DlgSettingsGuideline::removeOldWidgetsInactive ()
367 delete m_itemGuidelineXTInactive;
368 delete m_itemGuidelineYInactive;
369 delete m_itemGuidelineRInactive;
371 m_itemGuidelineXTInactive =
nullptr;
372 m_itemGuidelineYInactive =
nullptr;
373 m_itemGuidelineRInactive =
nullptr;
383void DlgSettingsGuideline::safeSetEllipseGeometry (QGraphicsEllipseItem *ellipse,
384 const QRectF &rectBounding,
385 double angleRotation,
390 ellipse->setRect (rectBounding);
393 ellipse->setRotation (-1.0 * qRadiansToDegrees (angleRotation));
394 ellipse->setTransformOriginPoint (rectBounding.x() + rectBounding.width() / 2.0,
395 rectBounding.y() + rectBounding.height() / 2.0);
399void DlgSettingsGuideline::safeSetEllipseStyle (QGraphicsEllipseItem *ellipse,
408void DlgSettingsGuideline::safeSetLine (QGraphicsLineItem *item,
409 const QPointF &posStart,
410 const QPointF &posStop)
const
413 item->setLine (QLineF (posStart,
418void DlgSettingsGuideline::safeSetLineStyle (QGraphicsLineItem *line,
427void DlgSettingsGuideline::safeSetPos (QGraphicsEllipseItem *ellipse,
431 ellipse->setPos (pos);
435void DlgSettingsGuideline::safeSetRect (QGraphicsEllipseItem *ellipse,
439 ellipse->setRect (rect);
443void DlgSettingsGuideline::safeSetRotation (QGraphicsEllipseItem *ellipse,
447 ellipse->setRotation (angle);
451void DlgSettingsGuideline::slotCreationCircleRadius (
int radius)
455 m_modelGuidelineAfter->setCreationCircleRadius (radius);
460void DlgSettingsGuideline::slotLineColor (QString
const &)
464 m_modelGuidelineAfter->setLineColor(
static_cast<ColorPalette> (m_lineColor->currentData().toInt()));
469void DlgSettingsGuideline::slotLineWidthActive (
int lineWidth)
473 m_modelGuidelineAfter->setLineWidthActive (lineWidth);
478void DlgSettingsGuideline::slotLineWidthInactive (
int lineWidth)
482 m_modelGuidelineAfter->setLineWidthInactive (lineWidth);
487void DlgSettingsGuideline::slotWhatsThis ()
489 QWhatsThis::enterWhatsThisMode();
492void DlgSettingsGuideline::updateControls ()
497void DlgSettingsGuideline::updatePreview()
502 updatePreviewGeometry ();
503 updatePreviewStyle ();
506void DlgSettingsGuideline::updatePreviewGeometry()
511 QPointF posGraphTL, posGraphTR, posGraphBL, posGraphBR;
521 double xMin = qMin (qMin (qMin (posGraphTL.x(), posGraphTR.x()), posGraphBL.x()), posGraphBR.x());
522 double yMin = qMin (qMin (qMin (posGraphTL.y(), posGraphTR.y()), posGraphBL.y()), posGraphBR.y());
523 double xMax = qMax (qMax (qMax (posGraphTL.x(), posGraphTR.x()), posGraphBL.x()), posGraphBR.x());
524 double yMax = qMax (qMax (qMax (posGraphTL.y(), posGraphTR.y()), posGraphBL.y()), posGraphBR.y());
529 QPointF posClickScreen;
530 updatePreviewGeometryGuidelineCartesian (width,
537 updatePreviewGeometryCirclePolar (posClickScreen);
538 updatePreviewGeometryCentipedeCartesian (posClickScreen,
547 QPointF posClickScreen;
548 QPointF posOriginScreen = updatePreviewGeometryGuidelinePolar (width,
551 updatePreviewGeometryCirclePolar (posClickScreen);
552 updatePreviewGeometryCentipedePolar (posOriginScreen,
558void DlgSettingsGuideline::updatePreviewGeometryCentipedeCartesian (
const QPointF &posClickScreen,
564 CentipedeEndpointsCartesian endpoints (*m_modelGuidelineAfter,
568 QPointF posStartX = endpoints.posScreenConstantXForLowY (m_modelGuidelineAfter->creationCircleRadius());
569 QPointF posStopX = endpoints.posScreenConstantXForHighY (m_modelGuidelineAfter->creationCircleRadius());
570 QPointF posStartY = endpoints.posScreenConstantYForLowX (m_modelGuidelineAfter->creationCircleRadius());
571 QPointF posStopY = endpoints.posScreenConstantYForHighX (m_modelGuidelineAfter->creationCircleRadius());
573 safeSetLine (m_itemCentipedeXTActive,
576 safeSetLine (m_itemCentipedeYActive,
581void DlgSettingsGuideline::updatePreviewGeometryCentipedePolar (
const QPointF &posOriginScreen,
582 const QPointF &posClickScreen)
584 CentipedeEndpointsPolar endpoints (
cmdMediator().document().modelCoords(),
585 *m_modelGuidelineAfter,
591 QPointF posRadialLow, posRadialHigh;
592 endpoints.posScreenConstantTForRHighLow (m_modelGuidelineAfter->creationCircleRadius(),
597 QPointF posClickGraph;
600 double rGraph = posClickGraph.y();
603 QPointF posScreen0, posScreen90;
610 double angleRotation;
612 CentipedeDebugPolar debugPolar;
613 endpoints.ellipseScreenConstantRForTHighLowAngles (
mainWindow().transformation(),
620 QPointF posTangentialLow, posTangentialHigh;
621 endpoints.posScreenConstantRHighLow (m_modelGuidelineAfter->creationCircleRadius(),
625 debugPolar.
display (*m_scenePreviewActive,
639void DlgSettingsGuideline::updatePreviewGeometryCirclePolar (
const QPointF &posClickScreen)
641 safeSetRect (m_itemCentipedeCircleActive,
642 QRectF (posClickScreen.x() - m_modelGuidelineAfter->creationCircleRadius(),
643 posClickScreen.y() - m_modelGuidelineAfter->creationCircleRadius(),
644 2 * m_modelGuidelineAfter->creationCircleRadius(),
645 2 * m_modelGuidelineAfter->creationCircleRadius()));
648void DlgSettingsGuideline::updatePreviewGeometryGuidelineCartesian (
double width,
650 QPointF &posClickScreen,
658 posClickScreen = QPointF (0.75 * width,
662 double xMid = (xMin + xMax) / 2.0;
663 double yMid = (yMin + yMax) / 2.0;
665 QPointF posLeft, posRight, posTop, posBottom;
675 safeSetLine (m_itemGuidelineXTActive,
678 safeSetLine (m_itemGuidelineYActive,
681 safeSetLine (m_itemGuidelineXTInactive,
684 safeSetLine (m_itemGuidelineYInactive,
689QPointF DlgSettingsGuideline::updatePreviewGeometryGuidelinePolar (
double width,
691 QPointF &posClickScreen)
696 QPointF posCenter, posLeft (0, height / 2), posRight (width, height / 2), posTop (width / 2, 0), posBottom (width / 2, height);
700 double rReference = radiusOfClosestSide (posLeft,
705 GuidelineProjectorConstantT projectorT;
706 GuidelineProjectorConstantR projectorR;
708 m_viewPreviewActive->sceneRect(),
711 m_viewPreviewActive->sceneRect (),
714 double a = ellipseParameters.
a();
715 double b = ellipseParameters.
b();
718 double angleClickScreen = M_PI / 2.0;
723 safeSetLine (m_itemGuidelineXTActive,
726 safeSetRect (m_itemGuidelineRActive,
727 QRectF (- QPointF (a, b),
729 safeSetRotation (m_itemGuidelineRActive,
730 -1.0 * qRadiansToDegrees (angleClickScreen));
731 safeSetPos (m_itemGuidelineRActive,
733 safeSetLine (m_itemGuidelineXTInactive,
736 safeSetRect (m_itemGuidelineRInactive,
737 QRectF (- QPointF (a, b),
739 safeSetRotation (m_itemGuidelineRInactive,
740 -1.0 * qRadiansToDegrees (angleClickScreen));
741 safeSetPos (m_itemGuidelineRInactive,
747void DlgSettingsGuideline::updatePreviewStyle ()
750 safeSetLineStyle (m_itemGuidelineXTActive,
751 m_modelGuidelineAfter->lineWidthActive());
752 safeSetLineStyle (m_itemGuidelineYActive,
753 m_modelGuidelineAfter->lineWidthActive());
754 safeSetEllipseStyle (m_itemGuidelineRActive,
755 m_modelGuidelineAfter->lineWidthActive());
756 safeSetLineStyle (m_itemGuidelineXTInactive,
757 m_modelGuidelineAfter->lineWidthInactive());
758 safeSetLineStyle (m_itemGuidelineYInactive,
759 m_modelGuidelineAfter->lineWidthInactive());
760 safeSetEllipseStyle (m_itemGuidelineRInactive,
761 m_modelGuidelineAfter->lineWidthInactive());
763 safeSetLineStyle (m_itemCentipedeXTActive,
764 m_modelGuidelineAfter->lineWidthActive());
765 safeSetLineStyle (m_itemCentipedeYActive,
766 m_modelGuidelineAfter->lineWidthActive());
767 safeSetEllipseStyle (m_itemCentipedeRActive,
768 m_modelGuidelineAfter->lineWidthActive());
const int MINIMUM_PREVIEW_WIDTH
const int MINIMUM_DIALOG_WIDTH_GUIDELINES
const double RADIANS_TO_TICS
#define ENGAUGE_ASSERT(cond)
Drop in replacement for Q_ASSERT.
QColor ColorPaletteToQColor(ColorPalette color)
log4cpp::Category * mainCat
void display(QGraphicsScene &scene, const DocumentModelCoords &modelCoords, const Transformation &transformation)
Display member variable values on scene.
Command for DlgSettingsGuideline.
DlgSettingsAbstractBase(const QString &title, const QString &dialogName, MainWindow &mainWindow)
Single constructor.
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.
CmdMediator & cmdMediator()
Provide access to Document information wrapped inside CmdMediator.
void createWhatsThis(QGridLayout *layout, ButtonWhatsThis *button, int row, int column)
Create a WhatsThis button in a grid layout.
void populateColorComboWithoutTransparent(QComboBox &combo)
Add colors in color palette to combobox, without transparent entry at end.
void addPixmap(QGraphicsScene &scene, const QPixmap &pixmap)
Adds pixmap to the scene.
void enableOk(bool enable)
Let leaf subclass control the Ok button.
static int MINIMUM_PREVIEW_HEIGHT
Dialog layout constant that guarantees preview has sufficent room.
MainWindow & mainWindow()
Get method for MainWindow.
virtual ~DlgSettingsGuideline()
virtual void setSmallDialogs(bool smallDialogs)
If false then dialogs have a minimum size so all controls are visible.
DlgSettingsGuideline(MainWindow &mainWindow)
Single constructor.
virtual QWidget * createSubPanel()
Create dialog-specific panel to which base class will add Ok and Cancel buttons.
virtual void createOptionalSaveDefault(QHBoxLayout *layout)
Let subclass define an optional Save As Default button.
virtual void load(CmdMediator &cmdMediator)
Load settings from Document.
virtual void handleOk()
Process slotOk.
Model for managing the coordinate values corresponding Guidelines.
QPixmap pixmap() const
Return the image that is being digitized.
double b() const
Get method for b.
double a() const
Get method for a.
EllipseParameters fromCoordinateR(const Transformation &transformation, const QRectF &sceneRect, double rGraph)
Return line through y in graph coordinates.
QLineF fromCoordinateT(const Transformation &transformation, const QRectF &sceneRect, double tGraph)
Return line through theta in graph coordinates.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
GraphicsScene & scene()
Scene container for the QImage and QGraphicsItems.
Transformation transformation() const
Return read-only copy of transformation.
Class that modifies QGraphicsView to automatically expand/shrink the view to fit the window,...
@ VIEW_ASPECT_RATIO_VARIABLE
#define LOG4CPP_INFO_S(logger)