22#include <QDoubleValidator>
23#include <QGraphicsRectItem>
26#include <QGraphicsScene>
31#include <QRadioButton>
32#include <QStackedWidget>
65const double PI = 3.1415926535;
79 m_btnCartesian (nullptr),
81 m_validatorOriginRadius (nullptr),
84 m_scenePreview (nullptr),
85 m_viewPreview (nullptr),
86 m_modelCoordsBefore (nullptr),
87 m_modelCoordsAfter (nullptr)
101void DlgSettingsCoords::annotateAngles (
const QFont &defaultFont) {
104 for (
int direction = 0; direction < 4; direction++) {
109 switch (thetaUnits) {
113 angle = QString::number (90.0 * direction);
117 angle = QString::number (90.0 * direction);
118 if (direction == 1) {
120 }
else if (direction == 3) {
126 angle = QString::number (100.0 * direction);
131 static QString radiansUnits [] = {
"0",
"PI / 2",
"PI",
"3 * PI / 2"};
133 angle = radiansUnits [direction];
139 static QString turnsUnits [] = {
"0",
"1 / 4",
"1 / 2",
"3 / 4"};
141 angle = turnsUnits [direction];
149 QGraphicsTextItem *textAngle = m_scenePreview->addText (angle);
150 textAngle->setFont (QFont (defaultFont.defaultFamily(),
FONT_SIZE));
158 x =
XCENTER - textAngle->boundingRect().width () / 2.0;
177 textAngle->setPos (x, y);
181void DlgSettingsCoords::annotateRadiusAtOrigin(
const QFont &defaultFont) {
183 QGraphicsTextItem *textRadius = m_scenePreview->addText (m_editOriginRadius->text());
184 textRadius->setFont (QFont (defaultFont.defaultFamily(),
FONT_SIZE));
185 textRadius->setPos (
XCENTER - textRadius->boundingRect().width () / 2.0,
189void DlgSettingsCoords::boundingRectGraph (
CmdMediator &cmdMediator,
191 QPointF &boundingRectGraphMin,
192 QPointF &boundingRectGraphMax)
const
194 CallbackBoundingRects ftor (
cmdMediator.document().documentAxesPointsRequired(),
197 Functor2wRet<const QString &, const Point&, CallbackSearchReturn> ftorWithCallback = functor_ret (ftor,
202 cmdMediator.iterateThroughCurvePointsAxes (ftorWithCallback);
207 cmdMediator.iterateThroughCurvesPointsGraphs (ftorWithCallback);
210 boundingRectGraphMin = ftor.boundingRectGraphMin (isEmpty);
211 boundingRectGraphMax = ftor.boundingRectGraphMax (isEmpty);
214void DlgSettingsCoords::createDateTime (QGridLayout *layout,
219 QLabel *label =
new QLabel(QString (
"%1:").arg (tr (
"Date/Time")));
220 layout->addWidget (label, row, 1);
222 QWidget *widgetCombos =
new QWidget;
223 layout->addWidget (widgetCombos, row++, 2);
224 QHBoxLayout *layoutCombos =
new QHBoxLayout;
225 widgetCombos->setLayout (layoutCombos);
228 m_cmbDate =
new QComboBox;
229 m_cmbDate->setWhatsThis (tr (
"Date format to be used for date values, and date portion of mixed date/time values, "
230 "during input and output.\n\n"
231 "Setting the format to an empty value results in just the time portion appearing in output."));
232 connect (m_cmbDate, SIGNAL (activated (
const QString &)),
this, SLOT (slotDate (
const QString &)));
233 layoutCombos->addWidget (m_cmbDate);
235 m_cmbTime =
new QComboBox;
236 m_cmbTime->setWhatsThis (tr (
"Time format to be used for time values, and time portion of mixed date/time values, "
237 "during input and output.\n\n"
238 "Setting the format to an empty value results in just the date portion appearing in output."));
239 connect (m_cmbTime, SIGNAL (activated (
const QString &)),
this, SLOT (slotTime (
const QString &)));
240 layoutCombos->addWidget (m_cmbTime);
243void DlgSettingsCoords::createGroupCoordsType (QGridLayout *layout,
248 m_boxCoordsType =
new QGroupBox(tr (
"Coordinates Types"));
249 layout->addWidget (m_boxCoordsType, row++, 1, 1, 2);
251 QVBoxLayout *layoutGroup =
new QVBoxLayout (m_boxCoordsType);
253 QString polarButtonText = QString(tr (
"Polar") +
" (") +
THETA + QString(
", " + tr (
"R") +
")");
255 m_btnCartesian =
new QRadioButton (tr (
"Cartesian (X, Y)"), m_boxCoordsType);
256 m_btnCartesian->setWhatsThis (QString(tr(
"Select cartesian coordinates.\n\n"
257 "The X and Y coordinates will be used")));
258 connect (m_btnCartesian, SIGNAL (toggled(
bool)),
this, SLOT (slotCartesianPolar (
bool)));
259 layoutGroup->addWidget (m_btnCartesian);
261 m_btnPolar =
new QRadioButton (polarButtonText, m_boxCoordsType);
262 m_btnPolar->setWhatsThis (QString(tr(
"Select polar coordinates.\n\n"
263 "The Theta and R coordinates will be used.\n\n"
264 "Polar coordinates are not allowed with log scale for Theta")));
265 connect (m_btnPolar, SIGNAL (toggled(
bool)),
this, SLOT (slotCartesianPolar (
bool)));
266 layoutGroup->addWidget (m_btnPolar);
269void DlgSettingsCoords::createGroupXTheta (QGridLayout *layout,
275 layout->addWidget (m_boxXTheta, row, 1, 1, 1);
277 QGridLayout *layoutXTheta =
new QGridLayout (m_boxXTheta);
278 m_boxXTheta->setLayout (layoutXTheta);
281 QLabel *labelScale =
new QLabel (QString (
"%1:").arg (tr (
"Scale")));
282 layoutXTheta->addWidget (labelScale, rowGroup++,
COLUMN_0);
284 m_xThetaLinear =
new QRadioButton (tr (
"Linear"), m_boxXTheta);
285 m_xThetaLinear->setWhatsThis (QString(tr(
"Specifies linear scale for the X or Theta coordinate")));
286 connect (m_xThetaLinear, SIGNAL (released ()),
this, SLOT (slotXThetaLinear()));
287 layoutXTheta->addWidget (m_xThetaLinear, rowGroup++,
COLUMN_0);
289 m_xThetaLog =
new QRadioButton (tr (
"Log"), m_boxXTheta);
290 m_xThetaLog->setWhatsThis (QString(tr(
"Specifies logarithmic scale for the X or Theta coordinate.\n\n"
291 "Log scale is not allowed if there are negative coordinates.\n\n"
292 "Log scale is not allowed for the Theta coordinate.")));
293 connect (m_xThetaLog, SIGNAL (released ()),
this, SLOT (slotXThetaLog()));
294 layoutXTheta->addWidget (m_xThetaLog, rowGroup++,
COLUMN_0);
296 QLabel *labelThetaUnits =
new QLabel(QString (
"%1:").arg (tr (
"Units")));
297 layoutXTheta->addWidget (labelThetaUnits, rowGroup++,
COLUMN_0);
299 m_cmbXThetaUnits =
new QComboBox;
300 connect (m_cmbXThetaUnits, SIGNAL (activated (
const QString &)),
this, SLOT (slotUnitsXTheta(
const QString &)));
301 layoutXTheta->addWidget (m_cmbXThetaUnits, rowGroup++,
COLUMN_0, 1, 2);
304void DlgSettingsCoords::createGroupYRadius (QGridLayout *layout,
310 layout->addWidget (m_boxYRadius, row++, 2, 1, 1);
312 QGridLayout *layoutYRadius =
new QGridLayout (m_boxYRadius);
313 m_boxYRadius->setLayout (layoutYRadius);
316 QLabel *labelScale =
new QLabel (QString (
"%1:").arg (tr (
"Scale")));
317 layoutYRadius->addWidget (labelScale, rowGroup++,
COLUMN_0);
319 m_yRadiusLinear =
new QRadioButton (tr (
"Linear"), m_boxYRadius);
320 m_yRadiusLinear->setWhatsThis (QString(tr(
"Specifies linear scale for the Y or R coordinate")));
321 connect (m_yRadiusLinear, SIGNAL(released()),
this, SLOT (slotYRadiusLinear()));
322 layoutYRadius->addWidget (m_yRadiusLinear, rowGroup,
COLUMN_0);
324 QLabel *labelOriginRadius =
new QLabel(QString (
"%1:").arg (tr (
"Origin radius value")));
325 layoutYRadius->addWidget (labelOriginRadius, rowGroup++,
COLUMN_1);
327 m_yRadiusLog =
new QRadioButton (tr (
"Log"), m_boxYRadius);
328 m_yRadiusLog->setWhatsThis (QString(tr(
"Specifies logarithmic scale for the Y or R coordinate\n\n"
329 "Log scale is not allowed if there are negative coordinates.")));
330 connect (m_yRadiusLog, SIGNAL(released ()),
this, SLOT (slotYRadiusLog ()));
331 layoutYRadius->addWidget (m_yRadiusLog, rowGroup,
COLUMN_0);
333 m_editOriginRadius =
new QLineEdit (m_boxYRadius);
335 m_editOriginRadius->setWhatsThis (QString(tr(
"Specify radius value at origin.\n\n"
336 "Normally the radius at the origin is 0, but a nonzero value may be applied in other cases "
337 "(like when the radial units are decibels).")));
338 connect (m_editOriginRadius, SIGNAL (textChanged (
const QString &)),
this, SLOT (slotPolarOriginRadius(
const QString &)));
339 layoutYRadius->addWidget (m_editOriginRadius, rowGroup++,
COLUMN_1);
341 QLabel *labelUnits =
new QLabel(QString (
"%1:").arg (tr (
"Units")));
342 layoutYRadius->addWidget (labelUnits, rowGroup++,
COLUMN_0);
344 m_cmbYRadiusUnits =
new QComboBox;
345 connect (m_cmbYRadiusUnits, SIGNAL (activated (
const QString &)),
this, SLOT (slotUnitsYRadius(
const QString &)));
346 layoutYRadius->addWidget (m_cmbYRadiusUnits, rowGroup++,
COLUMN_0, 1, 2);
353void DlgSettingsCoords::createPreview (QGridLayout *layout,
358 QLabel *labelPreview =
new QLabel (tr (
"Preview"));
359 layout->addWidget (labelPreview, row++, 0, 1, 4);
361 m_scenePreview =
new QGraphicsScene (
this);
365 m_viewPreview->setWhatsThis (tr (
"Preview window that shows how current settings affect the coordinate system."));
366 m_viewPreview->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
367 m_viewPreview->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
370 layout->addWidget (m_viewPreview, row++, 0, 1, 4);
377 QWidget *subPanel =
new QWidget ();
379 QGridLayout *layout =
new QGridLayout (subPanel);
380 subPanel->setLayout (layout);
382 layout->setColumnStretch(0, 1);
383 layout->setColumnStretch(1, 0);
384 layout->setColumnStretch(2, 0);
385 layout->setColumnStretch(3, 1);
388 createGroupCoordsType(layout, row);
389 createGroupXTheta (layout, row);
390 createGroupYRadius (layout, row);
391 createDateTime (layout, row);
392 createPreview (layout, row);
397void DlgSettingsCoords::drawCartesianLinearX ()
406 line->setPen(QPen (QBrush ((isHighlighted ? Qt::gray : Qt::lightGray)),
408 (isHighlighted ? Qt::SolidLine : Qt::DashLine)));
411 line->setPen(QPen (QBrush (Qt::black),
418void DlgSettingsCoords::drawCartesianLinearY ()
427 line->setPen(QPen (QBrush (isHighlighted ? Qt::gray : Qt::lightGray),
429 (isHighlighted ? Qt::SolidLine : Qt::DashLine)));
432 line->setPen(QPen (QBrush (Qt::black),
439void DlgSettingsCoords::drawCartesianLogX ()
450 line->setPen(QPen (QBrush (isHighlighted ? Qt::gray : Qt::lightGray),
452 (isHighlighted ? Qt::SolidLine : Qt::DashLine)));
455 line->setPen(QPen (QBrush (Qt::black),
462void DlgSettingsCoords::drawCartesianLogY ()
473 line->setPen(QPen (QBrush (isHighlighted ? Qt::gray : Qt::lightGray),
475 (isHighlighted ? Qt::SolidLine : Qt::DashLine)));
478 line->setPen(QPen (QBrush (Qt::black),
485void DlgSettingsCoords::drawPolarLinearRadius ()
491 QGraphicsEllipseItem *line = m_scenePreview->addEllipse (
XCENTER - radius,
496 line->setPen(QPen (QBrush (isHighlighted ? Qt::gray : Qt::lightGray),
498 (isHighlighted ? Qt::SolidLine : Qt::DashLine)));
502void DlgSettingsCoords::drawPolarLogRadius ()
510 QGraphicsEllipseItem *line = m_scenePreview->addEllipse (
XCENTER - radius,
515 line->setPen(QPen (QBrush (isHighlighted ? Qt::gray : Qt::lightGray),
517 (isHighlighted ? Qt::SolidLine : Qt::DashLine)));
521void DlgSettingsCoords::drawPolarTheta ()
532 line->setPen(QPen (QBrush (isHighlighted ? Qt::gray : Qt::lightGray),
534 (isHighlighted ? Qt::SolidLine : Qt::DashLine)));
537 line->setPen(QPen (QBrush (Qt::black),
550 *m_modelCoordsBefore,
551 *m_modelCoordsAfter);
565 QPointF boundingRectGraphMin, boundingRectGraphMax;
568 boundingRectGraphMin,
569 boundingRectGraphMax);
570 bool xThetaGoesNegative = !isEmpty && (boundingRectGraphMin.x() <= 0);
571 bool yRGoesNegative = !isEmpty && (boundingRectGraphMin.y() <= 0);
572 m_xThetaLinear->setEnabled (!xThetaGoesNegative);
573 m_xThetaLog->setEnabled (!xThetaGoesNegative);
574 m_yRadiusLinear->setEnabled (!yRGoesNegative);
575 m_yRadiusLog->setEnabled (!yRGoesNegative);
578 delete m_modelCoordsBefore;
579 delete m_modelCoordsAfter;
587 m_validatorOriginRadius = dlgValidatorFactory.
createWithNonPolar (m_modelCoordsAfter->coordScaleYRadius(),
588 m_modelCoordsAfter->coordUnitsRadius(),
589 m_modelCoordsAfter->coordUnitsDate(),
590 m_modelCoordsAfter->coordUnitsTime(),
592 m_editOriginRadius->setValidator (m_validatorOriginRadius);
593 m_editOriginRadius->setText (QString::number (m_modelCoordsAfter->originRadius ()));
596 m_btnCartesian->setChecked (
true);
598 m_btnPolar->setChecked (
true);
605 m_xThetaLinear->setChecked (m_modelCoordsAfter->coordScaleXTheta() ==
COORD_SCALE_LINEAR);
606 m_xThetaLog->setChecked (m_modelCoordsAfter->coordScaleXTheta() ==
COORD_SCALE_LOG);
607 m_yRadiusLinear->setChecked (m_modelCoordsAfter->coordScaleYRadius() ==
COORD_SCALE_LINEAR);
608 m_yRadiusLog->setChecked (m_modelCoordsAfter->coordScaleYRadius() ==
COORD_SCALE_LOG);
615void DlgSettingsCoords::loadComboBoxDate()
632 int index = m_cmbDate->findData (QVariant (m_modelCoordsAfter->
coordUnitsDate()));
633 m_cmbDate->setCurrentIndex (index);
636void DlgSettingsCoords::loadComboBoxTime()
651 int index = m_cmbTime->findData (QVariant (m_modelCoordsAfter->coordUnitsTime()));
652 m_cmbTime->setCurrentIndex (index);
655void DlgSettingsCoords::loadComboBoxUnitsNonPolar (QComboBox &cmb,
673 cmb.setWhatsThis (QString (tr (
"Numbers have the simplest and most general format.\n\n"
674 "Date and time values have date and/or time components, with dates between 1901 and 2105 on "
675 "64 bit operating systems.\n\n"
676 "Degrees Minutes Seconds (DDD MM SS.S) format uses two integer number for degrees and minutes, and a real number for "
677 "seconds. There are 60 seconds per minute. During input, spaces must be inserted between the three numbers.")));
679 int index = cmb.findData (coordUnits);
680 cmb.setCurrentIndex (index);
683void DlgSettingsCoords::loadComboBoxUnitsPolar (QComboBox &cmb,
707 cmb.setWhatsThis (QString (tr (
"Degrees (DDD.DDDDD) format uses a single real number. One complete revolution is 360 degrees.\n\n"
708 "Degrees Minutes (DDD MM.MMM) format uses one integer number for degrees, and a real number for minutes. There are "
709 "60 minutes per degree. During input, a space must be inserted between the two numbers.\n\n"
710 "Degrees Minutes Seconds (DDD MM SS.S) format uses two integer number for degrees and minutes, and a real number for "
711 "seconds. There are 60 seconds per minute. During input, spaces must be inserted between the three numbers.\n\n"
712 "Gradians format uses a single real number. One complete revolution is 400 gradians.\n\n"
713 "Radians format uses a single real number. One complete revolution is 2*pi radians.\n\n"
714 "Turns format uses a single real number. One complete revolution is one turn.")));
716 int index = cmb.findData (coordUnits);
717 cmb.setCurrentIndex (index);
720void DlgSettingsCoords::resetSceneRectangle ()
727 QGraphicsRectItem *itemPerimeter =
new QGraphicsRectItem(rect);
728 itemPerimeter->setVisible(
false);
729 m_scenePreview->addItem (itemPerimeter);
730 m_viewPreview->centerOn (QPointF (0.0, 0.0));
740void DlgSettingsCoords::slotCartesianPolar (
bool)
744 if (m_btnCartesian->isChecked ()) {
754void DlgSettingsCoords::slotDate(
const QString &)
759 m_modelCoordsAfter->setCoordUnitsDate(coordUnits);
764void DlgSettingsCoords::slotPolarOriginRadius(
const QString &)
768 QString numberText = m_editOriginRadius->text();
770 m_modelCoordsAfter->setOriginRadius(numberText.toDouble ());
775void DlgSettingsCoords::slotTime(
const QString &)
780 m_modelCoordsAfter->setCoordUnitsTime(coordUnits);
785void DlgSettingsCoords::slotUnitsXTheta(
const QString &)
791 m_modelCoordsAfter->setCoordUnitsX(coordUnits);
794 m_modelCoordsAfter->setCoordUnitsTheta(coordUnits);
800void DlgSettingsCoords::slotUnitsYRadius(
const QString &)
806 m_modelCoordsAfter->setCoordUnitsY(coordUnits);
808 m_modelCoordsAfter->setCoordUnitsRadius(coordUnits);
814void DlgSettingsCoords::slotXThetaLinear()
823void DlgSettingsCoords::slotXThetaLog()
832void DlgSettingsCoords::slotYRadiusLinear()
836 delete m_validatorOriginRadius;
838 DlgValidatorFactory dlgValidatorFactory;
840 m_modelCoordsAfter->coordUnitsRadius(),
841 m_modelCoordsAfter->coordUnitsDate(),
842 m_modelCoordsAfter->coordUnitsTime(),
844 m_editOriginRadius->setValidator (m_validatorOriginRadius);
851void DlgSettingsCoords::slotYRadiusLog()
855 delete m_validatorOriginRadius;
857 DlgValidatorFactory dlgValidatorFactory;
859 m_modelCoordsAfter->coordUnitsRadius(),
860 m_modelCoordsAfter->coordUnitsDate(),
861 m_modelCoordsAfter->coordUnitsTime(),
863 m_editOriginRadius->setValidator (m_validatorOriginRadius);
870void DlgSettingsCoords::updateControls ()
874 QString textOriginRadius = m_editOriginRadius->text();
875 int posOriginRadius = 0;
877 bool goodOriginRadius =
true;
878 if (m_editOriginRadius->isEnabled ()) {
881 goodOriginRadius = (m_validatorOriginRadius->validate (textOriginRadius,
882 posOriginRadius) == QValidator::Acceptable);
887 m_boxCoordsType->setEnabled (!m_xThetaLog->isChecked ());
889 m_xThetaLinear->setEnabled (!m_btnPolar->isChecked ());
890 m_xThetaLog->setEnabled (!m_btnPolar->isChecked ());
891 if (m_btnCartesian->isChecked()) {
892 m_yRadiusLinear->setEnabled (
true);
893 m_yRadiusLog->setEnabled (
true);
897 DlgValidatorFactory dlgValidatorFactory;
899 m_modelCoordsAfter->coordUnitsRadius(),
900 m_modelCoordsAfter->coordUnitsDate(),
901 m_modelCoordsAfter->coordUnitsTime(),
903 int posOriginRadiusOther;
904 bool goodOriginRadiusOther = (dlg->
validate (textOriginRadius, posOriginRadiusOther) == QValidator::Acceptable);
908 m_yRadiusLinear->setEnabled (goodOriginRadius && goodOriginRadiusOther);
909 m_yRadiusLog->setEnabled (goodOriginRadius && goodOriginRadiusOther);
911 m_editOriginRadius->setEnabled (m_btnPolar->isChecked ());
913 QString captionXTheta = (m_btnCartesian->isChecked () ?
915 THETA) + QString (
" %1")
916 .arg (tr (
"Coordinates"));
917 QString captionYRadius = (m_btnCartesian->isChecked () ?
919 QString (tr (
"R"))) + QString (
" %1")
920 .arg (tr (
"Coordinates"));
922 if (m_boxXTheta->title() != captionXTheta) {
923 m_boxXTheta->setTitle (captionXTheta);
926 if (m_boxYRadius->title () != captionYRadius) {
927 m_boxYRadius->setTitle (captionYRadius);
931 if (m_btnCartesian->isChecked()) {
937 m_cmbDate->setEnabled (enableDateTime);
938 m_cmbTime->setEnabled (enableDateTime);
941 <<
" textOriginRadius=" << textOriginRadius.toLatin1().data()
942 <<
" goodOriginRadius=" << (goodOriginRadius ?
"true" :
"false")
943 <<
" originRadius=" << posOriginRadius
944 <<
" btnPolarChecked=" << (m_btnPolar->isChecked() ?
"true" :
"false")
945 <<
" enableDateTime=" << (enableDateTime ?
"true" :
"false");
948void DlgSettingsCoords::updateCoordUnits()
951 if (m_btnCartesian->isChecked()) {
952 loadComboBoxUnitsNonPolar (*m_cmbXThetaUnits,
953 m_modelCoordsAfter->coordUnitsX());
954 loadComboBoxUnitsNonPolar (*m_cmbYRadiusUnits,
955 m_modelCoordsAfter->coordUnitsY());
957 loadComboBoxUnitsPolar (*m_cmbXThetaUnits,
958 m_modelCoordsAfter->coordUnitsTheta());
959 loadComboBoxUnitsNonPolar (*m_cmbYRadiusUnits,
960 m_modelCoordsAfter->coordUnitsRadius());
964void DlgSettingsCoords::updatePreview()
966 m_scenePreview->clear();
974 if (m_btnCartesian->isChecked()) {
977 if (m_xThetaLinear->isChecked()) {
978 drawCartesianLinearX ();
980 drawCartesianLogX ();
983 if (m_yRadiusLinear->isChecked()) {
984 drawCartesianLinearY ();
986 drawCartesianLogY ();
993 if (m_yRadiusLinear->isChecked()) {
994 drawPolarLinearRadius ();
996 drawPolarLogRadius ();
1000 annotateRadiusAtOrigin (defaultFont);
1001 annotateAngles (defaultFont);
1004 resetSceneRectangle();
QString coordUnitsDateToString(CoordUnitsDate coordUnits)
@ COORD_UNITS_DATE_DAY_MONTH_YEAR
@ COORD_UNITS_DATE_YEAR_MONTH_DAY
@ COORD_UNITS_DATE_MONTH_DAY_YEAR
QString coordUnitsNonPolarThetaToString(CoordUnitsNonPolarTheta coordUnits)
@ COORD_UNITS_NON_POLAR_THETA_DEGREES_MINUTES_SECONDS
@ COORD_UNITS_NON_POLAR_THETA_DEGREES_MINUTES_SECONDS_NSEW
@ COORD_UNITS_NON_POLAR_THETA_NUMBER
@ NUM_COORD_UNITS_NON_POLAR_THETA
@ COORD_UNITS_NON_POLAR_THETA_DATE_TIME
QString coordUnitsPolarThetaToString(CoordUnitsPolarTheta coordUnits)
@ COORD_UNITS_POLAR_THETA_DEGREES_MINUTES_SECONDS_NSEW
@ COORD_UNITS_POLAR_THETA_TURNS
@ COORD_UNITS_POLAR_THETA_RADIANS
@ COORD_UNITS_POLAR_THETA_DEGREES_MINUTES
@ COORD_UNITS_POLAR_THETA_DEGREES
@ COORD_UNITS_POLAR_THETA_DEGREES_MINUTES_SECONDS
@ COORD_UNITS_POLAR_THETA_GRADIANS
@ NUM_COORD_UNITS_POLAR_THETA
QString coordUnitsTimeToString(CoordUnitsTime coordUnits)
@ COORD_UNITS_TIME_HOUR_MINUTE_SECOND
@ COORD_UNITS_TIME_HOUR_MINUTE
const int MINIMUM_DIALOG_WIDTH_COORDS
const double LINE_WIDTH_THICK
const QString OVERRIDDEN_VALUE("")
const int STEPS_PER_CYCLE
const double LINE_WIDTH_THIN
const double POWER_FOR_LOG
const double CARTESIAN_COORD_STEP
const int CARTESIAN_COORD_MIN
const double POLAR_THETA_STEP
const int MAX_WIDTH_EDIT_ORIGIN_RADIUS
const int CARTESIAN_COORD_MAX
const int POLAR_THETA_MAX
const int NUM_COORD_STEPS
const int POLAR_THETA_MIN
const int STEPS_CYCLE_COUNT
#define ENGAUGE_ASSERT(cond)
Drop in replacement for Q_ASSERT.
log4cpp::Category * mainCat
CallbackSearchReturn callback(const QString &curveName, const Point &point)
Callback method.
Command for DlgSettingsCoords.
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 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 ~DlgSettingsCoords()
virtual QWidget * createSubPanel()
Create dialog-specific panel to which base class will add Ok and Cancel buttons.
DlgSettingsCoords(MainWindow &mainWindow)
Single constructor.
virtual void setSmallDialogs(bool smallDialogs)
If false then dialogs have a minimum size so all controls are visible.
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.
virtual QValidator::State validate(QString &input, int &pos) const =0
Validate according to the numeric format specific to the leaf class.
DlgValidatorAbstract * createWithNonPolar(CoordScale coordScale, CoordUnitsNonPolarTheta coordUnits, CoordUnitsDate coordUnitsDate, CoordUnitsTime coordUnitsTime, const QLocale &locale) const
Factory method for generating validators when cartesian/polar case handling is handled externally,...
Model for DlgSettingsCoords and CmdSettingsCoords.
void setCoordsType(CoordsType coordsType)
Set method for coordinates type.
CoordUnitsDate coordUnitsDate() const
Get method for date format when used.
Main window consisting of menu, graphics scene, status bar and optional toolbars as a Single Document...
Class that modifies QGraphicsView to automatically expand/shrink the view to fit the window,...
@ VIEW_ASPECT_RATIO_VARIABLE
#define LOG4CPP_INFO_S(logger)