SxmlEditor: Fix crash with transitions and onEntry events

Fixed a crash in SxmlEditor that occurred when transitions and
onEntry/onExit events were displayed together.

Fixes: QTCREATORBUG-29429
Change-Id: Idca72ac1a661355a2caaa3f16457e4cfb9aaa785
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Artem Sokolovskii
2023-07-31 14:41:25 +02:00
parent dd04e9bc0b
commit 609e5e2127
3 changed files with 20 additions and 7 deletions

View File

@@ -18,7 +18,7 @@ EventItem::EventItem(const QPointF &pos, BaseItem *parent)
{ {
m_eventNameItem = new TextItem(this); m_eventNameItem = new TextItem(this);
m_eventNameItem->setParentItem(this); m_eventNameItem->setParentItem(this);
QFont serifFont("Times", 13, QFont::Normal); QFont serifFont("Times", 10, QFont::Normal);
m_eventNameItem->setFont(serifFont); m_eventNameItem->setFont(serifFont);
QString color = editorInfo("fontColor"); QString color = editorInfo("fontColor");
@@ -49,7 +49,7 @@ OnEntryExitItem::OnEntryExitItem(BaseItem *parent)
{ {
m_eventNameItem = new TextItem(this); m_eventNameItem = new TextItem(this);
m_eventNameItem->setParentItem(this); m_eventNameItem->setParentItem(this);
QFont serifFont("Times", 13, QFont::Normal); QFont serifFont("Times", 10, QFont::Normal);
m_eventNameItem->setFont(serifFont); m_eventNameItem->setFont(serifFont);
m_eventNameItem->setDefaultTextColor(Qt::black); m_eventNameItem->setDefaultTextColor(Qt::black);
m_eventNameItem->setTextInteractionFlags(Qt::NoTextInteraction); m_eventNameItem->setTextInteractionFlags(Qt::NoTextInteraction);

View File

@@ -232,6 +232,9 @@ void StateItem::transitionsChanged()
} }
m_transitionRect = rectInternalTransitions; m_transitionRect = rectInternalTransitions;
positionOnEntryItems();
positionOnExitItems();
updateBoundingRect(); updateBoundingRect();
} }
@@ -437,8 +440,7 @@ void StateItem::updatePolygon()
f.setPixelSize(m_titleRect.height() * 0.65); f.setPixelSize(m_titleRect.height() * 0.65);
m_stateNameItem->setFont(f); m_stateNameItem->setFont(f);
if (m_onEntryItem) positionOnEntryItems();
m_onEntryItem->setPos(m_titleRect.x(), m_titleRect.bottom());
positionOnExitItems(); positionOnExitItems();
updateTextPositions(); updateTextPositions();
@@ -552,7 +554,7 @@ void StateItem::addChild(ScxmlTag *child)
item->setTag(child); item->setTag(child);
item->finalizeCreation(); item->finalizeCreation();
item->updateAttributes(); item->updateAttributes();
m_onEntryItem->setPos(m_titleRect.x(), m_titleRect.bottom()); positionOnEntryItems();
} else if (child->tagName() == "onexit") { } else if (child->tagName() == "onexit") {
OnEntryExitItem *item = new OnEntryExitItem(this); OnEntryExitItem *item = new OnEntryExitItem(this);
m_onExitItem = item; m_onExitItem = item;
@@ -566,8 +568,18 @@ void StateItem::addChild(ScxmlTag *child)
void StateItem::positionOnExitItems() void StateItem::positionOnExitItems()
{ {
int offset = m_onEntryItem ? m_onEntryItem->boundingRect().height() : 0; int offset = m_onEntryItem ? m_onEntryItem->boundingRect().height() : 0;
if (m_onExitItem) if (m_onExitItem) {
m_onExitItem->setPos(m_titleRect.x(), m_titleRect.bottom() + offset); auto x = m_transitionRect.isValid() ? m_transitionRect.right() : m_titleRect.x();
m_onExitItem->setPos(x, m_titleRect.bottom() + offset);
}
}
void StateItem::positionOnEntryItems()
{
if (m_onEntryItem) {
auto x = m_transitionRect.isValid() ? m_transitionRect.right() : m_titleRect.x();
m_onEntryItem->setPos(x, m_titleRect.bottom());
}
} }
QString StateItem::itemId() const QString StateItem::itemId() const

View File

@@ -75,6 +75,7 @@ private:
void checkParentBoundingRect(); void checkParentBoundingRect();
void checkWarningItems(); void checkWarningItems();
void positionOnExitItems(); void positionOnExitItems();
void positionOnEntryItems();
TextItem *m_stateNameItem; TextItem *m_stateNameItem;
StateWarningItem *m_stateWarningItem = nullptr; StateWarningItem *m_stateWarningItem = nullptr;