forked from qt-creator/qt-creator
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:
@@ -18,7 +18,7 @@ EventItem::EventItem(const QPointF &pos, BaseItem *parent)
|
||||
{
|
||||
m_eventNameItem = new TextItem(this);
|
||||
m_eventNameItem->setParentItem(this);
|
||||
QFont serifFont("Times", 13, QFont::Normal);
|
||||
QFont serifFont("Times", 10, QFont::Normal);
|
||||
m_eventNameItem->setFont(serifFont);
|
||||
|
||||
QString color = editorInfo("fontColor");
|
||||
@@ -49,7 +49,7 @@ OnEntryExitItem::OnEntryExitItem(BaseItem *parent)
|
||||
{
|
||||
m_eventNameItem = new TextItem(this);
|
||||
m_eventNameItem->setParentItem(this);
|
||||
QFont serifFont("Times", 13, QFont::Normal);
|
||||
QFont serifFont("Times", 10, QFont::Normal);
|
||||
m_eventNameItem->setFont(serifFont);
|
||||
m_eventNameItem->setDefaultTextColor(Qt::black);
|
||||
m_eventNameItem->setTextInteractionFlags(Qt::NoTextInteraction);
|
||||
|
@@ -232,6 +232,9 @@ void StateItem::transitionsChanged()
|
||||
}
|
||||
|
||||
m_transitionRect = rectInternalTransitions;
|
||||
positionOnEntryItems();
|
||||
positionOnExitItems();
|
||||
|
||||
updateBoundingRect();
|
||||
}
|
||||
|
||||
@@ -437,8 +440,7 @@ void StateItem::updatePolygon()
|
||||
f.setPixelSize(m_titleRect.height() * 0.65);
|
||||
m_stateNameItem->setFont(f);
|
||||
|
||||
if (m_onEntryItem)
|
||||
m_onEntryItem->setPos(m_titleRect.x(), m_titleRect.bottom());
|
||||
positionOnEntryItems();
|
||||
positionOnExitItems();
|
||||
|
||||
updateTextPositions();
|
||||
@@ -552,7 +554,7 @@ void StateItem::addChild(ScxmlTag *child)
|
||||
item->setTag(child);
|
||||
item->finalizeCreation();
|
||||
item->updateAttributes();
|
||||
m_onEntryItem->setPos(m_titleRect.x(), m_titleRect.bottom());
|
||||
positionOnEntryItems();
|
||||
} else if (child->tagName() == "onexit") {
|
||||
OnEntryExitItem *item = new OnEntryExitItem(this);
|
||||
m_onExitItem = item;
|
||||
@@ -566,8 +568,18 @@ void StateItem::addChild(ScxmlTag *child)
|
||||
void StateItem::positionOnExitItems()
|
||||
{
|
||||
int offset = m_onEntryItem ? m_onEntryItem->boundingRect().height() : 0;
|
||||
if (m_onExitItem)
|
||||
m_onExitItem->setPos(m_titleRect.x(), m_titleRect.bottom() + offset);
|
||||
if (m_onExitItem) {
|
||||
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
|
||||
|
@@ -75,6 +75,7 @@ private:
|
||||
void checkParentBoundingRect();
|
||||
void checkWarningItems();
|
||||
void positionOnExitItems();
|
||||
void positionOnEntryItems();
|
||||
|
||||
TextItem *m_stateNameItem;
|
||||
StateWarningItem *m_stateWarningItem = nullptr;
|
||||
|
Reference in New Issue
Block a user