16#include <config-kdsme.h>
38#include <QElapsedTimer>
39#include <QItemSelectionModel>
40#include <QPainterPath>
41#include <QSortFilterProxyModel>
49 , m_rootState(nullptr)
63 , d(new Private(this))
74 return d->m_properties;
83 d->updateChildItemVisibility(state,
false);
92 d->updateChildItemVisibility(state,
true);
124 selectionModel()->select(index, (selected ? QItemSelectionModel::Select : QItemSelectionModel::Deselect));
150 QQmlEngine::setObjectOwnership(element, QQmlEngine::CppOwnership);
156 return d->m_rootState;
173 d->updateItemVisibilities();
178 return d->m_layouter;
186 delete d->m_layouter;
191 d->m_layouter->setParent(
this);
203 if (qFuzzyCompare(d->m_zoom,
zoom))
206 const auto delta =
zoom / d->m_zoom;
207 d->zoomByInternal(delta);
220 return d->m_maximumDepth;
225 if (maximumDepth <= 0 || d->m_maximumDepth ==
maximumDepth)
234 d->updateItemVisibilities();
240void StateMachineScene::Private::zoomByInternal(qreal scale)
const
242 auto root = q->rootState();
245 matrix.scale(scale, scale);
247 auto oldViewState = q->viewState();
248 q->setViewState(RefreshState);
252 element->
setPos(matrix.map(element->
pos()));
255 if (
auto transition = qobject_cast<Transition *>(element)) {
256 transition->setShape(matrix.map(transition->shape()));
261 q->setViewState(oldViewState);
266 qCDebug(KDSME_VIEW) << d->m_layouter << d->m_rootState;
268 if (!d->m_layouter || !d->m_rootState) {
283 qCDebug(KDSME_VIEW) <<
"Layouting took" << timer.elapsed() <<
"ms";
290 return qobject_cast<StateModel *>(
model());
297 qCWarning(KDSME_VIEW) <<
"Invalid model class type, expected StateModel instance";
304void StateMachineScene::Private::updateItemVisibilities()
const
308 if (
auto state = qobject_cast<State *>(element)) {
309 const bool expand = (m_maximumDepth > 0 ?
ObjectHelper::depth(m_rootState, state) < m_maximumDepth :
true);
311 q->setItemExpanded(state, expand);
318void StateMachineScene::Private::updateChildItemVisibility(
State *state,
bool expand)
325 if (
auto *transition = qobject_cast<Transition *>(i)) {
328 auto sourceState = transition->sourceState();
329 auto targetState = transition->targetState();
330 if (sourceState->isVisible()
331 && (sourceState->parentState() ? sourceState->parentState()->children().contains(targetState) : false)) {
378#include "moc_statemachinescene.cpp"
QItemSelectionModel * selectionModel() const
void setViewState(KDSME::AbstractScene::ViewState state)
QAbstractItemModel * model
void setCurrentIndex(const QModelIndex &index)
virtual void setModel(QAbstractItemModel *model)
virtual void currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
virtual void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
virtual void layoutChanged()
QModelIndex currentIndex() const
virtual void rowsInserted(const QModelIndex &parent, int start, int end)
void setPos(const QPointF &pos)
void setSelected(bool selected)
void setVisible(bool visible)
QPointF pos
The position of the element from the top-left corner.
void setWidth(qreal width)
void setHeight(qreal height)
QModelIndex indexForObject(QObject *object) const
void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) override
void setModel(QAbstractItemModel *model) override
Q_INVOKABLE void collapseItem(KDSME::State *state)
StateModel * stateModel() const
StateMachineScene(QQuickItem *parent=nullptr)
void zoomChanged(qreal zoom)
void layoutChanged() override
Layouter * layouter() const
Q_INVOKABLE bool isItemSelected(KDSME::Element *item)
void currentChanged(const QModelIndex ¤t, const QModelIndex &previous) override
KDSME::Element * currentItem
void maximumDepthChanged(int depth)
void currentItemChanged(KDSME::Element *currentItem)
Q_INVOKABLE void expandItem(KDSME::State *state)
void rowsInserted(const QModelIndex &parent, int start, int end) override
KDSME::Element * currentState() const
void setCurrentItem(KDSME::Element *item)
Q_INVOKABLE void setItemSelected(KDSME::Element *item, bool selected)
Q_INVOKABLE void setItemExpanded(KDSME::State *state, bool expand)
void rootStateChanged(KDSME::State *state)
void setRootState(State *rootState)
Q_INVOKABLE bool isItemExpanded(KDSME::State *state) const
void setMaximumDepth(int maximumDepth)
KDSME::LayoutProperties * layoutProperties
void setLayouter(Layouter *layouter)
Ownership is transferred.
@ ElementRole
return Element*
void setState(State *state)
void setExpanded(bool expanded)
KDSME::State * sourceState
@ RecursiveWalk
Traverse the children of this item.
KDSME_CORE_EXPORT int depth(const QObject *root, const QObject *object)