Skip to content

Commit

Permalink
Better implementation for selection of items (#11978)
Browse files Browse the repository at this point in the history
Related to #11866

This replaces the code implemented in PRs #11928 and #11968
The new implementation selects the item using the smallest possible bounding box that contains the shapes of the item.
  • Loading branch information
adeas31 committed Feb 12, 2024
1 parent 08f57e1 commit f9e0a7d
Show file tree
Hide file tree
Showing 7 changed files with 105 additions and 103 deletions.
2 changes: 1 addition & 1 deletion OMEdit/OMEditLIB/Annotations/EllipseAnnotation.cpp
Expand Up @@ -143,7 +143,7 @@ QPainterPath EllipseAnnotation::shape() const
{
QPainterPath path;
path.addEllipse(getBoundingRect());
if (mFillPattern == StringHandler::FillNone && !mpParentComponent) {
if (mFillPattern == StringHandler::FillNone) {
return addPathStroker(path);
} else {
return path;
Expand Down
2 changes: 1 addition & 1 deletion OMEdit/OMEditLIB/Annotations/PolygonAnnotation.cpp
Expand Up @@ -212,7 +212,7 @@ QRectF PolygonAnnotation::boundingRect() const
QPainterPath PolygonAnnotation::shape() const
{
QPainterPath path = getShape();
if (mFillPattern == StringHandler::FillNone && !mpParentComponent) {
if (mFillPattern == StringHandler::FillNone) {
return addPathStroker(path);
} else {
return path;
Expand Down
2 changes: 1 addition & 1 deletion OMEdit/OMEditLIB/Annotations/RectangleAnnotation.cpp
Expand Up @@ -181,7 +181,7 @@ QPainterPath RectangleAnnotation::shape() const
{
QPainterPath path;
path.addRoundedRect(getBoundingRect(), mRadius, mRadius);
if (mFillPattern == StringHandler::FillNone && !mpParentComponent) {
if (mFillPattern == StringHandler::FillNone) {
return addPathStroker(path);
} else {
return path;
Expand Down
170 changes: 97 additions & 73 deletions OMEdit/OMEditLIB/Element/Element.cpp
Expand Up @@ -531,8 +531,6 @@ Element::Element(ModelInstance::Component *pModelComponent, bool inherited, Grap
mpNonExistingElementLine = 0;
mpDefaultElementRectangle = 0;
mpDefaultElementText = 0;
createNonExistingElement();
createDefaultElement();
createStateElement();
mHasTransition = false;
mIsInitialState = false;
Expand Down Expand Up @@ -599,7 +597,7 @@ Element::Element(ModelInstance::Model *pModel, Element *pParentElement)
mIsInheritedElement = mpParentElement->isInheritedElement();
mElementType = Element::Extend;
mTransformationString = "";
createNonExistingElement();
mpNonExistingElementLine = 0;
mpDefaultElementRectangle = 0;
mpDefaultElementText = 0;
mpStateElementRectangle = 0;
Expand Down Expand Up @@ -638,7 +636,7 @@ Element::Element(ModelInstance::Component *pModelComponent, Element *pParentElem
setChoicesAnnotation(QStringList());
setChoicesAllMatchingAnnotation(QStringList());
setChoices(QStringList());
// createNonExistingElement();
mpNonExistingElementLine = 0;
mpDefaultElementRectangle = 0;
mpDefaultElementText = 0;
mpStateElementRectangle = 0;
Expand Down Expand Up @@ -677,16 +675,16 @@ Element::Element(QString name, LibraryTreeItem *pLibraryTreeItem, QString annota
setOldScenePosition(QPointF(0, 0));
setOldPosition(QPointF(0, 0));
setElementFlags(true);
createNonExistingElement();
createDefaultElement();
mpNonExistingElementLine = 0;
mpDefaultElementRectangle = 0;
mpDefaultElementText = 0;
createStateElement();
mHasTransition = false;
mIsInitialState = false;
mActiveState = false;
mpBusComponent = 0;
if (mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getLibraryType() == LibraryTreeItem::CompositeModel) {
mpDefaultElementRectangle->setVisible(true);
mpDefaultElementText->setVisible(true);
createDefaultElement();
drawInterfacePoints();
} else {
drawElement();
Expand Down Expand Up @@ -765,7 +763,7 @@ Element::Element(LibraryTreeItem *pLibraryTreeItem, Element *pParentElement)
mIsInheritedElement = mpParentElement->isInheritedElement();
mElementType = Element::Extend;
mTransformationString = "";
createNonExistingElement();
mpNonExistingElementLine = 0;
mpDefaultElementRectangle = 0;
mpDefaultElementText = 0;
mpStateElementRectangle = 0;
Expand Down Expand Up @@ -806,7 +804,7 @@ Element::Element(Element *pElement, Element *pParentElement, Element *pRootParen
mChoicesAnnotation = mpReferenceElement->getChoicesAnnotation();
mChoicesAllMatchingAnnotation = mpReferenceElement->getChoicesAllMatchingAnnotation();
mChoices = mpReferenceElement->getChoices();
createNonExistingElement();
mpNonExistingElementLine = 0;
mpDefaultElementRectangle = 0;
mpDefaultElementText = 0;
mpStateElementRectangle = 0;
Expand Down Expand Up @@ -855,8 +853,9 @@ Element::Element(Element *pElement, GraphicsView *pGraphicsView)
setOldScenePosition(QPointF(0, 0));
setOldPosition(QPointF(0, 0));
setElementFlags(true);
createNonExistingElement();
createDefaultElement();
mpNonExistingElementLine = 0;
mpDefaultElementRectangle = 0;
mpDefaultElementText = 0;
createStateElement();
mHasTransition = mpReferenceElement->hasTransition();;
mIsInitialState = mpReferenceElement->isInitialState();
Expand Down Expand Up @@ -904,7 +903,7 @@ Element::Element(ElementInfo *pElementInfo, Element *pParentElement)
mChoicesAnnotation.clear();
mChoicesAllMatchingAnnotation.clear();
mChoices.clear();
createNonExistingElement();
mpNonExistingElementLine = 0;
createDefaultElement();
mpStateElementRectangle = 0;
mHasTransition = false;
Expand Down Expand Up @@ -1027,22 +1026,46 @@ bool Element::hasNonExistingClass()
}
}

/*!
* \brief Element::boundingRect
* Reimplementation of QGraphicsItem::boundingRect()
* We only set the bounding rectangle for root element.
* So childrenBoundingRect() gets correct bounding rectangle for inherited items when called from Element::shape()
* \return
*/
QRectF Element::boundingRect() const
{
if (mpGraphicsView->getModelWidget()->isNewApi()) {
ModelInstance::CoordinateSystem coordinateSystem = getCoOrdinateSystemNew();
return coordinateSystem.getExtentRectangle();
if (mElementType == Element::Root) {
if (mpGraphicsView->getModelWidget()->isNewApi()) {
ModelInstance::CoordinateSystem coordinateSystem = getCoOrdinateSystemNew();
return coordinateSystem.getExtentRectangle();
} else {
CoOrdinateSystem coOrdinateSystem = getCoOrdinateSystem();
ExtentAnnotation extent = coOrdinateSystem.getExtent();
qreal left = extent.at(0).x();
qreal bottom = extent.at(0).y();
qreal right = extent.at(1).x();
qreal top = extent.at(1).y();
return QRectF(left, bottom, qFabs(left - right), qFabs(bottom - top));
}
} else {
CoOrdinateSystem coOrdinateSystem = getCoOrdinateSystem();
ExtentAnnotation extent = coOrdinateSystem.getExtent();
qreal left = extent.at(0).x();
qreal bottom = extent.at(0).y();
qreal right = extent.at(1).x();
qreal top = extent.at(1).y();
return QRectF(left, bottom, qFabs(left - right), qFabs(bottom - top));
return QRectF();
}
}

/*!
* \brief Element::shape
* Reimplementation of QGraphicsItem::shape()
* Calls QGraphicsItem::childrenBoundingRect() to get the proper bounding rectangle for shape.
* \return
*/
QPainterPath Element::shape() const
{
QPainterPath path;
path.addRect(childrenBoundingRect());
return path;
}

/*!
* \brief Element::itemsBoundingRect
* Gets the bounding rectangle of the Element and its children.
Expand Down Expand Up @@ -2002,10 +2025,9 @@ QString Element::getInheritedDerivedClassModifierValue(Element *pElement, QStrin
*/
void Element::shapeAdded()
{
mpNonExistingElementLine->setVisible(false);
deleteNonExistingElement();
if (mElementType == Element::Root) {
mpDefaultElementRectangle->setVisible(false);
mpDefaultElementText->setVisible(false);
deleteDefaultElement();
}
if (mpGraphicsView->getViewType() == StringHandler::Icon) {
mpGraphicsView->getModelWidget()->getLibraryTreeItem()->handleIconUpdated();
Expand All @@ -2029,10 +2051,9 @@ void Element::shapeUpdated()
*/
void Element::shapeDeleted()
{
mpNonExistingElementLine->setVisible(false);
deleteNonExistingElement();
if (mElementType == Element::Root) {
mpDefaultElementRectangle->setVisible(false);
mpDefaultElementText->setVisible(false);
deleteDefaultElement();
}
showNonExistingOrDefaultElementIfNeeded();
if (mpGraphicsView->getViewType() == StringHandler::Icon) {
Expand Down Expand Up @@ -2292,8 +2313,21 @@ void Element::reDrawConnector(QPainter *painter)
*/
void Element::createNonExistingElement()
{
mpNonExistingElementLine = new LineAnnotation(this);
mpNonExistingElementLine->setVisible(false);
if (!mpNonExistingElementLine) {
mpNonExistingElementLine = new LineAnnotation(this);
}
}

/*!
* \brief Element::deleteNonExistingElement
* Delete the non-existing element.
*/
void Element::deleteNonExistingElement()
{
if (mpNonExistingElementLine) {
mpNonExistingElementLine->deleteLater();
mpNonExistingElementLine = 0;
}
}

/*!
Expand All @@ -2302,10 +2336,29 @@ void Element::createNonExistingElement()
*/
void Element::createDefaultElement()
{
mpDefaultElementRectangle = new RectangleAnnotation(this);
mpDefaultElementRectangle->setVisible(false);
mpDefaultElementText = new TextAnnotation(this);
mpDefaultElementText->setVisible(false);
if (!mpDefaultElementRectangle) {
mpDefaultElementRectangle = new RectangleAnnotation(this);
}
if (!mpDefaultElementText) {
mpDefaultElementText = new TextAnnotation(this);
}
}

/*!
* \brief Element::deleteDefaultElement
* Delete default element.
*/
void Element::deleteDefaultElement()
{
if (mpDefaultElementRectangle) {
mpDefaultElementRectangle->deleteLater();
mpDefaultElementRectangle = 0;
}

if (mpDefaultElementText) {
mpDefaultElementText->deleteLater();
mpDefaultElementText = 0;
}
}

/*!
Expand Down Expand Up @@ -2419,11 +2472,10 @@ void Element::drawModelicaElement()
} else {
if (!mpLibraryTreeItem) { // if built in type e.g Real, Boolean etc.
if (mElementType == Element::Root) {
mpDefaultElementRectangle->setVisible(true);
mpDefaultElementText->setVisible(true);
createDefaultElement();
}
} else if (mpLibraryTreeItem->isNonExisting()) { // if class is non existing
mpNonExistingElementLine->setVisible(true);
createNonExistingElement();
} else {
createClassInheritedElements();
createClassShapes();
Expand Down Expand Up @@ -2569,14 +2621,10 @@ void Element::drawInheritedElementsAndShapes()
if (mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getLibraryType() == LibraryTreeItem::Modelica) {
if (!mpLibraryTreeItem) { // if built in type e.g Real, Boolean etc.
if (mElementType == Element::Root) {
assert(mpDefaultElementRectangle);
assert(mpDefaultElementText);
mpDefaultElementRectangle->setVisible(true);
mpDefaultElementText->setVisible(true);
createDefaultElement();
}
} else if (mpLibraryTreeItem->isNonExisting()) { // if class is non existing
assert(mpNonExistingElementLine);
mpNonExistingElementLine->setVisible(true);
createNonExistingElement();
} else {
createClassInheritedElements();
createClassShapes();
Expand All @@ -2601,22 +2649,14 @@ void Element::drawInheritedElementsAndShapes()
*/
void Element::showNonExistingOrDefaultElementIfNeeded()
{
mpNonExistingElementLine->setVisible(false);
if (mElementType == Element::Root) {
assert(mpDefaultElementRectangle);
assert(mpDefaultElementText);
mpDefaultElementRectangle->setVisible(false);
mpDefaultElementText->setVisible(false);
}
deleteNonExistingElement();
deleteDefaultElement();

if (!hasShapeAnnotation(this)) {
if (hasNonExistingClass()) {
assert(mpNonExistingElementLine);
mpNonExistingElementLine->setVisible(true);
createNonExistingElement();
} else if (mElementType == Element::Root) {
assert(mpDefaultElementRectangle);
assert(mpDefaultElementText);
mpDefaultElementRectangle->setVisible(true);
mpDefaultElementText->setVisible(true);
createDefaultElement();
}
}
}
Expand Down Expand Up @@ -4047,19 +4087,3 @@ QVariant Element::itemChange(GraphicsItemChange change, const QVariant &value)
}
return value;
}

/*!
* \brief Element::mousePressEvent
* The GraphicsView sets the Element under mouse object and then we use that to accept the mouse press event.
* Only accept the mouse press event for the Element set by GraphicsView and ignore all others.
* This allows us to select Element's by clicking on their drawn items instead of the bounding rectangle.
* \param event
*/
void Element::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if (mpGraphicsView->getElementUnderMouse() == this) {
QGraphicsItem::mousePressEvent(event);
} else {
event->ignore();
}
}
4 changes: 3 additions & 1 deletion OMEdit/OMEditLIB/Element/Element.h
Expand Up @@ -209,6 +209,7 @@ class Element : public QObject, public QGraphicsItem
bool hasShapeAnnotation(Element *pElement);
bool hasNonExistingClass();
QRectF boundingRect() const override;
QPainterPath shape() const override;
QRectF itemsBoundingRect();
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0) override;
ModelInstance::Model *getModel() const {return mpModel;}
Expand Down Expand Up @@ -361,7 +362,9 @@ class Element : public QObject, public QGraphicsItem
bool mActiveState;
Element *mpBusComponent;
void createNonExistingElement();
void deleteNonExistingElement();
void createDefaultElement();
void deleteDefaultElement();
void createStateElement();
void drawInterfacePoints();
void drawElement();
Expand Down Expand Up @@ -443,7 +446,6 @@ public slots:
// QGraphicsItem interface
protected:
virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) override;
};

#endif // ELEMENT_H

0 comments on commit f9e0a7d

Please sign in to comment.