Skip to content

Commit

Permalink
Added graphical support for ellipse closure attribute (#7634)
Browse files Browse the repository at this point in the history
Fixes #7544
  • Loading branch information
adeas31 committed Jun 30, 2021
1 parent 961e4c5 commit 56800bd
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 27 deletions.
50 changes: 25 additions & 25 deletions OMEdit/OMEditLIB/Annotations/EllipseAnnotation.cpp
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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)
Expand All @@ -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);
}
}
Expand Down Expand Up @@ -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(",");
}

Expand Down Expand Up @@ -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(")");
}

Expand Down
2 changes: 2 additions & 0 deletions OMEdit/OMEditLIB/Annotations/ShapeAnnotation.cpp
Expand Up @@ -385,6 +385,7 @@ void ShapeAnnotation::setDefaults()
mRadius = 0;
mStartAngle = 0;
mEndAngle = 360;
mClosure = StringHandler::ClosureChord;
mOriginalTextString = "";
mTextString = "";
mFontSize = 0;
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 3 additions & 0 deletions OMEdit/OMEditLIB/Annotations/ShapeAnnotation.h
Expand Up @@ -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;}
Expand Down Expand Up @@ -269,6 +271,7 @@ public slots:
qreal mRadius;
qreal mStartAngle;
qreal mEndAngle;
StringHandler::EllipseClosure mClosure;
QString mOriginalTextString;
QString mTextString;
qreal mFontSize;
Expand Down
16 changes: 14 additions & 2 deletions OMEdit/OMEditLIB/Annotations/ShapePropertiesDialog.cpp
Expand Up @@ -172,6 +172,16 @@ ShapePropertiesDialog::ShapePropertiesDialog(ShapeAnnotation *pShapeAnnotation,
mpEndAngleSpinBox->setRange(-std::numeric_limits<double>::max(), std::numeric_limits<double>::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);
Expand All @@ -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"));
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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());
Expand Down
2 changes: 2 additions & 0 deletions OMEdit/OMEditLIB/Annotations/ShapePropertiesDialog.h
Expand Up @@ -106,6 +106,8 @@ class ShapePropertiesDialog : public QDialog
DoubleSpinBox *mpStartAngleSpinBox;
Label *mpEndAngleLabel;
DoubleSpinBox *mpEndAngleSpinBox;
Label *mpClosureLabel;
QComboBox *mpClosureComboBox;
QGroupBox *mpTextGroupBox;
QLineEdit *mpTextTextBox;
QGroupBox *mpFontAndTextStyleGroupBox;
Expand Down
26 changes: 26 additions & 0 deletions OMEdit/OMEditLIB/Util/StringHandler.cpp
Expand Up @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions OMEdit/OMEditLIB/Util/StringHandler.h
Expand Up @@ -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};
Expand Down Expand Up @@ -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();
Expand Down

0 comments on commit 56800bd

Please sign in to comment.