diff options
Diffstat (limited to 'src/plugins/scxmleditor/plugin_interface/stateitem.cpp')
-rw-r--r-- | src/plugins/scxmleditor/plugin_interface/stateitem.cpp | 66 |
1 files changed, 56 insertions, 10 deletions
diff --git a/src/plugins/scxmleditor/plugin_interface/stateitem.cpp b/src/plugins/scxmleditor/plugin_interface/stateitem.cpp index dd1015f9d40..e53bd8c894e 100644 --- a/src/plugins/scxmleditor/plugin_interface/stateitem.cpp +++ b/src/plugins/scxmleditor/plugin_interface/stateitem.cpp @@ -1,19 +1,18 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 -#include "finalstateitem.h" +#include "stateitem.h" + +#include "eventitem.h" #include "graphicsitemprovider.h" #include "graphicsscene.h" #include "idwarningitem.h" #include "imageprovider.h" -#include "initialstateitem.h" -#include "parallelitem.h" #include "sceneutils.h" #include "scxmleditorconstants.h" #include "scxmleditortr.h" #include "scxmltagutils.h" #include "scxmluifactory.h" -#include "stateitem.h" #include "statewarningitem.h" #include "textitem.h" #include "transitionitem.h" @@ -28,6 +27,7 @@ #include <QTextOption> #include <QUndoStack> #include <QtMath> +#include <QRubberBand> using namespace ScxmlEditor::PluginInterface; @@ -171,6 +171,7 @@ void StateItem::updateBoundingRect() // Check if we need to increase parent boundingrect if (!r2.isNull()) { + positionOnExitItems(); QRectF r = boundingRect(); QRectF r3 = r.united(r2); @@ -244,7 +245,6 @@ void StateItem::transitionCountChanged() QRectF StateItem::childItemsBoundingRect() const { QRectF r; - QRectF rr = boundingRect(); QList<QGraphicsItem*> children = childItems(); for (int i = 0; i < children.count(); ++i) { @@ -256,15 +256,26 @@ QRectF StateItem::childItemsBoundingRect() const } } + if (m_onEntryItem) { + QRectF br = m_onEntryItem->childBoundingRect(); + QPointF p = m_onEntryItem->pos() + br.topLeft(); + br.moveTopLeft(p); + r = r.united(br); + } + + if (m_onExitItem) { + QRectF br = m_onExitItem->childBoundingRect(); + QPointF p = m_onExitItem->pos() + br.topLeft(); + br.moveTopLeft(p); + r = r.united(br); + } + if (m_transitionRect.isValid()) { r.setLeft(r.left() - m_transitionRect.width()); r.setHeight(qMax(r.height(), m_transitionRect.height())); r.moveBottom(qMax(r.bottom(), m_transitionRect.bottom())); } - if (!r.isNull()) - r.adjust(-20, -(rr.height() * 0.06 + 40), 20, 20); - return r; } @@ -418,11 +429,18 @@ void StateItem::updatePolygon() << m_drawingRect.bottomLeft() << m_drawingRect.topLeft(); - m_titleRect = QRectF(m_drawingRect.left(), m_drawingRect.top(), m_drawingRect.width(), TEXT_ITEM_HEIGHT + m_drawingRect.height() * 0.06); + m_titleRect = QRectF(m_drawingRect.left(), + m_drawingRect.top(), + m_drawingRect.width(), + TEXT_ITEM_HEIGHT + m_drawingRect.height() * 0.06); QFont f = m_stateNameItem->font(); f.setPixelSize(m_titleRect.height() * 0.65); m_stateNameItem->setFont(f); + if (m_onEntryItem) + m_onEntryItem->setPos(m_titleRect.x(), m_titleRect.bottom()); + positionOnExitItems(); + updateTextPositions(); } @@ -517,13 +535,41 @@ void StateItem::init(ScxmlTag *tag, BaseItem *parentItem, bool initChildren, boo if (newItem) { newItem->init(child, this, initChildren, blockUpdates); newItem->finalizeCreation(); - } + } else + addChild(child); } } if (blockUpdates) setBlockUpdates(false); } + +void StateItem::addChild(ScxmlTag *child) +{ + if (child->tagName() == "onentry") { + OnEntryExitItem *item = new OnEntryExitItem(this); + m_onEntryItem = item; + item->setTag(child); + item->finalizeCreation(); + item->updateAttributes(); + m_onEntryItem->setPos(m_titleRect.x(), m_titleRect.bottom()); + } else if (child->tagName() == "onexit") { + OnEntryExitItem *item = new OnEntryExitItem(this); + m_onExitItem = item; + item->setTag(child); + item->finalizeCreation(); + item->updateAttributes(); + positionOnExitItems(); + } +} + +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); +} + QString StateItem::itemId() const { return m_stateNameItem ? m_stateNameItem->toPlainText() : QString(); |