QVariant TimerModel::data(const QModelIndex &index, int role) const { if (!m_sourceModel || !index.isValid()) return QVariant(); if (role == Qt::DisplayRole) { const TimerInfoPtr timerInfo = const_cast<TimerModel *>(this)->findOrCreateTimerInfo(index); switch (index.column()) { case ObjectNameColumn: return timerInfo->displayName(); case StateColumn: return timerInfo->state(); case TotalWakeupsColumn: return timerInfo->totalWakeups(); case WakeupsPerSecColumn: return timerInfo->wakeupsPerSec(); case TimePerWakeupColumn: return timerInfo->timePerWakeup(); case MaxTimePerWakeupColumn: return timerInfo->maxWakeupTime(); case TimerIdColumn: return timerInfo->timerId(); case ColumnCount: break; } } if (role == ObjectIdRole && index.column() == 0) { const TimerInfoPtr timerInfo = const_cast<TimerModel*>(this)->findOrCreateTimerInfo(index); return QVariant::fromValue(ObjectId(timerInfo->timerObject())); } return QVariant(); }
int TimerModel::rowFor(QObject *timer) { for (int i = 0; i < rowCount(); i++) { const TimerInfoPtr timerInfo = findOrCreateTimerInfo(index(i, 0)); if (timerInfo && timerInfo->timerObject() == timer) return i; } return -1; }
void TimerModel::postSignalActivate(QObject *caller, int methodIndex) { QHash<QObject*, TimerInfoPtr>::iterator it = m_currentSignals.find(caller); if (it == m_currentSignals.end()) { // Ok, likely a GammaRay timer // cout << "TimerModel::postSignalActivate(): Unable to find timer " // << (void*)caller << " (" << caller->objectName().toStdString() << ")!" << endl; return; } const TimerInfoPtr timerInfo = *it; Q_ASSERT(timerInfo); if (!(timerInfo->type() == TimerInfo::QTimerType && methodIndex == m_timeoutIndex) && !(timerInfo->type() == TimerInfo::QQmlTimerType && methodIndex == m_qmlTimerTriggeredIndex)) { return; } m_currentSignals.erase(it); if (!timerInfo->timerObject()) { // timer got killed in a slot return; } Q_ASSERT(caller == timerInfo->timerObject()); if (!timerInfo->functionCallTimer()->active()) { cout << "TimerModel::postSignalActivate(): Timer not active: " << (void*)caller << " (" << caller->objectName().toStdString() << ")!" << endl; return; } TimerInfo::TimeoutEvent event; event.timeStamp = QTime::currentTime(); event.executionTime = timerInfo->functionCallTimer()->stop(); timerInfo->addEvent(event); const int row = rowFor(timerInfo->timerObject()); emitTimerObjectChanged(row); }
TimerInfoPtr TimerModel::findOrCreateQTimerTimerInfo(QObject *timer) { if (!timer) return TimerInfoPtr(); QVariant timerInfoVariant = timer->property(timerInfoPropertyName); if (!timerInfoVariant.isValid()) { const TimerInfoPtr info = TimerInfoPtr(new TimerInfo(timer)); if (m_qmlTimerTriggeredIndex < 0 && info->type() == TimerInfo::QQmlTimerType) m_qmlTimerTriggeredIndex = timer->metaObject()->indexOfMethod("triggered()"); timerInfoVariant.setValue(info); if (timer->thread() == QThread::currentThread()) // ### FIXME: we shouldn't use setProperty() in the first place... timer->setProperty(timerInfoPropertyName, timerInfoVariant); } const TimerInfoPtr timerInfo = timerInfoVariant.value<TimerInfoPtr>(); Q_ASSERT(timerInfo->timerObject() == timer); return timerInfo; }