24template<
typename ContainerType,
typename ItemType>
25inline qreal relativePosition(
const ContainerType &list,
const ItemType &t)
27 const int index = list.indexOf(t);
28 return (index + 1.0) / list.size();
33struct RuntimeController::Private
37 , m_lastConfigurations(5)
38 , m_lastTransitions(5)
43 void updateActiveRegion();
50 QRectF m_activeRegion;
53void RuntimeController::Private::updateActiveRegion()
55 const Configuration configuration = q->activeConfiguration();
59 for (
const State *state : configuration) {
60 activeRegion = activeRegion.united(state->boundingRect());
62 m_activeRegion = activeRegion;
63 Q_EMIT q->activeRegionChanged(m_activeRegion);
68 , d(new Private(this))
70 qRegisterMetaType<QSet<State *>>();
79 return d->m_lastConfigurations.size();
84 d->m_lastConfigurations.setCapacity(size);
85 d->m_lastTransitions.setCapacity(size);
90 return d->m_activeRegion;
95 d->m_lastConfigurations.clear();
96 d->m_lastTransitions.clear();
101 return (d->m_lastConfigurations.size() > 0 ? d->m_lastConfigurations.last() :
Configuration());
106 return d->m_lastConfigurations.entries();
111 if (d->m_lastConfigurations.size() > 0 && d->m_lastConfigurations.last() == configuration)
114 d->m_lastConfigurations.enqueue(configuration);
116 d->updateActiveRegion();
121 return d->m_lastTransitions.entries();
126 return (d->m_lastTransitions.size() > 0 ? d->m_lastTransitions.last() :
nullptr);
134 d->m_lastTransitions.enqueue(transition);
139 return d->m_isRunning;
153 const int count = d->m_lastConfigurations.size();
154 for (
int i = d->m_lastConfigurations.size() - 1; i >= 0; --i) {
155 if (d->m_lastConfigurations.at(i).contains(state)) {
156 return static_cast<float>((i + 1.) / count);
164 return static_cast<float>(relativePosition<QList<Transition *>>(d->m_lastTransitions.entries(), transition));
RuntimeController(QObject *parent=nullptr)
QSet< State * > Configuration
void isRunningChanged(bool isRunning)
QSet< KDSME::State * > activeConfiguration
void activeConfigurationChanged(const QSet< KDSME::State * > &configuration)
void setActiveConfiguration(const Configuration &configuration)
Q_INVOKABLE float activenessForTransition(KDSME::Transition *transition)
void setIsRunning(bool isRunning)
Q_INVOKABLE float activenessForState(KDSME::State *state) const
void setHistorySize(int size)
void setLastTransition(Transition *transition)
QList< Configuration > lastConfigurations() const
KDSME::Transition * lastTransition
QList< Transition * > lastTransitions() const