diff --git a/OMEdit/OMEditLIB/Annotations/EllipseAnnotation.cpp b/OMEdit/OMEditLIB/Annotations/EllipseAnnotation.cpp index 277384ab03c..f4c6b2333dc 100644 --- a/OMEdit/OMEditLIB/Annotations/EllipseAnnotation.cpp +++ b/OMEdit/OMEditLIB/Annotations/EllipseAnnotation.cpp @@ -75,7 +75,7 @@ void EllipseAnnotation::parseShapeAnnotation(QString annotation) FilledShape::parseShapeAnnotation(annotation); // parse the shape to get the list of attributes of Ellipse. QStringList list = StringHandler::getStrings(annotation); - if (list.size() < 11) { + if (list.size() < 12) { return; } // 9th item is the extent points @@ -90,6 +90,8 @@ void EllipseAnnotation::parseShapeAnnotation(QString annotation) mStartAngle = list.at(9).toFloat(); // 11th item of the list contains the end angle. mEndAngle = list.at(10).toFloat(); + // 12th item of the list contains the closure + mClosure = StringHandler::getClosureType(list.at(11)); } QRectF EllipseAnnotation::boundingRect() const @@ -100,22 +102,12 @@ QRectF EllipseAnnotation::boundingRect() const QPainterPath EllipseAnnotation::shape() const { QPainterPath path; - qreal startAngle = StringHandler::getNormalizedAngle(mStartAngle); - qreal endAngle = StringHandler::getNormalizedAngle(mEndAngle); - if ((startAngle - endAngle) == 0) - { - path.addEllipse(getBoundingRect()); - if (mFillPattern == StringHandler::FillNone) - { - return addPathStroker(path); - } - else - { - return path; - } - } path.addEllipse(getBoundingRect()); - return path; + if (mFillPattern == StringHandler::FillNone) { + return addPathStroker(path); + } else { + return path; + } } void EllipseAnnotation::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) @@ -133,19 +125,20 @@ void EllipseAnnotation::paint(QPainter *painter, const QStyleOptionGraphicsItem void EllipseAnnotation::drawEllipseAnnotaion(QPainter *painter) { - QPainterPath path; // first we invert the painter since we have our coordinate system inverted. // inversion is required to draw the elliptic curves at correct angles. painter->scale(1.0, -1.0); painter->translate(0, ((-boundingRect().top()) - boundingRect().bottom())); applyLinePattern(painter); - applyFillPattern(painter); - qreal startAngle = StringHandler::getNormalizedAngle(mStartAngle); - qreal endAngle = StringHandler::getNormalizedAngle(mEndAngle); - if ((startAngle - endAngle) == 0) { - path.addEllipse(getBoundingRect()); - painter->drawPath(path); - } else { + if (mClosure != StringHandler::ClosureNone) { + applyFillPattern(painter); + } + + if (mClosure == StringHandler::ClosureNone) { + painter->drawArc(getBoundingRect(), mStartAngle*16, mEndAngle*16 - mStartAngle*16); + } else if (mClosure == StringHandler::ClosureChord) { + painter->drawChord(getBoundingRect(), mStartAngle*16, mEndAngle*16 - mStartAngle*16); + } else { // StringHandler::ClosureRadial painter->drawPie(getBoundingRect(), mStartAngle*16, mEndAngle*16 - mStartAngle*16); } } @@ -173,6 +166,8 @@ QString EllipseAnnotation::getOMCShapeAnnotation() annotationString.append(QString::number(mStartAngle)); // get the end angle annotationString.append(QString::number(mEndAngle)); + // get the closure + annotationString.append(StringHandler::getClosureString(mClosure)); return annotationString.join(","); } @@ -212,9 +207,14 @@ QString EllipseAnnotation::getShapeAnnotation() annotationString.append(QString("startAngle=").append(QString::number(mStartAngle))); } // get the end angle - if (mEndAngle != 0) { + if (mEndAngle != 360) { annotationString.append(QString("endAngle=").append(QString::number(mEndAngle))); } + // get the closure + if (!((mStartAngle == 0 && mEndAngle == 360 && mClosure == StringHandler::ClosureChord) + || (!(mStartAngle == 0 && mEndAngle == 360) && mClosure == StringHandler::ClosureRadial))) { + annotationString.append(QString("closure=").append(StringHandler::getClosureString(mClosure))); + } return QString("Ellipse(").append(annotationString.join(",")).append(")"); } diff --git a/OMEdit/OMEditLIB/Annotations/ShapeAnnotation.cpp b/OMEdit/OMEditLIB/Annotations/ShapeAnnotation.cpp index 6a135168bfa..0b80e443aa8 100644 --- a/OMEdit/OMEditLIB/Annotations/ShapeAnnotation.cpp +++ b/OMEdit/OMEditLIB/Annotations/ShapeAnnotation.cpp @@ -385,6 +385,7 @@ void ShapeAnnotation::setDefaults() mRadius = 0; mStartAngle = 0; mEndAngle = 360; + mClosure = StringHandler::ClosureChord; mOriginalTextString = ""; mTextString = ""; mFontSize = 0; @@ -420,6 +421,7 @@ void ShapeAnnotation::setDefaults(ShapeAnnotation *pShapeAnnotation) mRadius = pShapeAnnotation->mRadius; mStartAngle = pShapeAnnotation->mStartAngle; mEndAngle = pShapeAnnotation->mEndAngle; + mClosure = pShapeAnnotation->mClosure; mOriginalTextString = pShapeAnnotation->mOriginalTextString; mTextString = pShapeAnnotation->mTextString; mFontSize = pShapeAnnotation->mFontSize; diff --git a/OMEdit/OMEditLIB/Annotations/ShapeAnnotation.h b/OMEdit/OMEditLIB/Annotations/ShapeAnnotation.h index 6210da5a70a..2fc55fc0316 100644 --- a/OMEdit/OMEditLIB/Annotations/ShapeAnnotation.h +++ b/OMEdit/OMEditLIB/Annotations/ShapeAnnotation.h @@ -183,6 +183,8 @@ class ShapeAnnotation : public QObject, public QGraphicsItem, public GraphicItem qreal getStartAngle() {return mStartAngle;} void setEndAngle(qreal endAngle) {mEndAngle = endAngle;} qreal getEndAngle() {return mEndAngle;} + void setClosure(StringHandler::EllipseClosure closure) {mClosure = closure;} + StringHandler::EllipseClosure getClosure() {return mClosure;} void setTextString(QString textString); QString getTextString() {return mOriginalTextString;} void setFontName(QString fontName) {mFontName = fontName;} @@ -269,6 +271,7 @@ public slots: qreal mRadius; qreal mStartAngle; qreal mEndAngle; + StringHandler::EllipseClosure mClosure; QString mOriginalTextString; QString mTextString; qreal mFontSize; diff --git a/OMEdit/OMEditLIB/Annotations/ShapePropertiesDialog.cpp b/OMEdit/OMEditLIB/Annotations/ShapePropertiesDialog.cpp index f84f8f699c9..28727fda48b 100644 --- a/OMEdit/OMEditLIB/Annotations/ShapePropertiesDialog.cpp +++ b/OMEdit/OMEditLIB/Annotations/ShapePropertiesDialog.cpp @@ -172,6 +172,16 @@ ShapePropertiesDialog::ShapePropertiesDialog(ShapeAnnotation *pShapeAnnotation, mpEndAngleSpinBox->setRange(-std::numeric_limits::max(), std::numeric_limits::max()); mpEndAngleSpinBox->setValue(mpShapeAnnotation->getEndAngle()); mpEndAngleSpinBox->setSingleStep(90); + // closure + mpClosureLabel = new Label(tr("Closure:")); + mpClosureComboBox = new QComboBox; + mpClosureComboBox->addItem(StringHandler::getClosureString(StringHandler::ClosureNone)); + mpClosureComboBox->addItem(StringHandler::getClosureString(StringHandler::ClosureChord)); + mpClosureComboBox->addItem(StringHandler::getClosureString(StringHandler::ClosureRadial)); + currentIndex = mpClosureComboBox->findText(StringHandler::getClosureString(mpShapeAnnotation->getClosure()), Qt::MatchExactly); + if (currentIndex > -1) { + mpClosureComboBox->setCurrentIndex(currentIndex); + } // set the border style Group Box layout QGridLayout *pAngleGridLayout = new QGridLayout; pAngleGridLayout->setColumnStretch(1, 1); @@ -180,6 +190,8 @@ ShapePropertiesDialog::ShapePropertiesDialog(ShapeAnnotation *pShapeAnnotation, pAngleGridLayout->addWidget(mpStartAngleSpinBox, 0, 1); pAngleGridLayout->addWidget(mpEndAngleLabel, 0, 2); pAngleGridLayout->addWidget(mpEndAngleSpinBox, 0, 3); + pAngleGridLayout->addWidget(mpClosureLabel, 1, 0); + pAngleGridLayout->addWidget(mpClosureComboBox, 1, 1); mpAngleGroupBox->setLayout(pAngleGridLayout); // Text Group Box mpTextGroupBox = new QGroupBox(tr("Text")); @@ -235,8 +247,7 @@ ShapePropertiesDialog::ShapePropertiesDialog(ShapeAnnotation *pShapeAnnotation, mpTextHorizontalAlignmentComboBox->addItem(StringHandler::getTextAlignmentString(StringHandler::TextAlignmentLeft)); mpTextHorizontalAlignmentComboBox->addItem(StringHandler::getTextAlignmentString(StringHandler::TextAlignmentCenter)); mpTextHorizontalAlignmentComboBox->addItem(StringHandler::getTextAlignmentString(StringHandler::TextAlignmentRight)); - currentIndex = mpTextHorizontalAlignmentComboBox->findText(StringHandler::getTextAlignmentString( - mpShapeAnnotation->getTextHorizontalAlignment()), Qt::MatchExactly); + currentIndex = mpTextHorizontalAlignmentComboBox->findText(StringHandler::getTextAlignmentString(mpShapeAnnotation->getTextHorizontalAlignment()), Qt::MatchExactly); if (currentIndex > -1) { mpTextHorizontalAlignmentComboBox->setCurrentIndex(currentIndex); } @@ -792,6 +803,7 @@ bool ShapePropertiesDialog::applyShapeProperties() if (mpEllipseAnnotation) { mpShapeAnnotation->setStartAngle(mpStartAngleSpinBox->value()); mpShapeAnnotation->setEndAngle(mpEndAngleSpinBox->value()); + mpShapeAnnotation->setClosure(StringHandler::getClosureType(mpClosureComboBox->currentText())); } if (mpTextAnnotation) { mpShapeAnnotation->setTextString(mpTextTextBox->text().trimmed()); diff --git a/OMEdit/OMEditLIB/Annotations/ShapePropertiesDialog.h b/OMEdit/OMEditLIB/Annotations/ShapePropertiesDialog.h index 0fd73af7a69..a44c036a095 100644 --- a/OMEdit/OMEditLIB/Annotations/ShapePropertiesDialog.h +++ b/OMEdit/OMEditLIB/Annotations/ShapePropertiesDialog.h @@ -106,6 +106,8 @@ class ShapePropertiesDialog : public QDialog DoubleSpinBox *mpStartAngleSpinBox; Label *mpEndAngleLabel; DoubleSpinBox *mpEndAngleSpinBox; + Label *mpClosureLabel; + QComboBox *mpClosureComboBox; QGroupBox *mpTextGroupBox; QLineEdit *mpTextTextBox; QGroupBox *mpFontAndTextStyleGroupBox; diff --git a/OMEdit/OMEditLIB/Util/StringHandler.cpp b/OMEdit/OMEditLIB/Util/StringHandler.cpp index a62f3f5772d..520a2012617 100644 --- a/OMEdit/OMEditLIB/Util/StringHandler.cpp +++ b/OMEdit/OMEditLIB/Util/StringHandler.cpp @@ -608,6 +608,32 @@ QString StringHandler::getSmoothString(StringHandler::Smooth type) } } +StringHandler::EllipseClosure StringHandler::getClosureType(QString type) +{ + if (type.compare("EllipseClosure.None") == 0) { + return StringHandler::ClosureNone; + } else if (type.compare("EllipseClosure.Chord") == 0) { + return StringHandler::ClosureChord; + } else if (type.compare("EllipseClosure.Radial") == 0) { + return StringHandler::ClosureRadial; + } else { + return StringHandler::ClosureChord; + } +} + +QString StringHandler::getClosureString(StringHandler::EllipseClosure type) +{ + switch (type) { + case StringHandler::ClosureNone: + return "EllipseClosure.None"; + case StringHandler::ClosureRadial: + return "EllipseClosure.Radial"; + case StringHandler::ClosureChord: + default: + return "EllipseClosure.Chord"; + } +} + StringHandler::Arrow StringHandler::getArrowType(QString type) { if (type.compare("Arrow.None") == 0) diff --git a/OMEdit/OMEditLIB/Util/StringHandler.h b/OMEdit/OMEditLIB/Util/StringHandler.h index 6dfc469d31c..7085d150d06 100644 --- a/OMEdit/OMEditLIB/Util/StringHandler.h +++ b/OMEdit/OMEditLIB/Util/StringHandler.h @@ -55,6 +55,7 @@ class StringHandler : public QObject FillHorizontalCylinder, FillVerticalCylinder, FillSphere}; enum BorderPattern {BorderNone, BorderRaised, BorderSunken, BorderEngraved}; enum Smooth {SmoothNone, SmoothBezier}; + enum EllipseClosure {ClosureNone, ClosureChord, ClosureRadial}; enum Arrow {ArrowNone, ArrowOpen, ArrowFilled, ArrowHalf}; enum TextStyle {TextStyleBold, TextStyleItalic, TextStyleUnderLine}; enum TextAlignment {TextAlignmentLeft, TextAlignmentCenter, TextAlignmentRight}; @@ -95,6 +96,8 @@ class StringHandler : public QObject static QString getBorderPatternString(StringHandler::BorderPattern type); static StringHandler::Smooth getSmoothType(QString type); static QString getSmoothString(StringHandler::Smooth type); + static StringHandler::EllipseClosure getClosureType(QString type); + static QString getClosureString(StringHandler::EllipseClosure type); static StringHandler::Arrow getArrowType(QString type); static QString getArrowString(StringHandler::Arrow type); static QComboBox* getStartArrowComboBox();