+ emit endAddingFrames();
+}
+
+ApiTraceCall * ApiTrace::callWithIndex(int idx) const
+{
+ for (int i = 0; i < m_calls.count(); ++i) {
+ ApiTraceCall *call = m_calls[i];
+ if (call->index() == idx)
+ return call;
+ }
+ return NULL;
+}
+
+ApiTraceState ApiTrace::defaultState() const
+{
+ ApiTraceFrame *frame = frameAt(0);
+ if (!frame || !frame->hasState())
+ return ApiTraceState();
+
+ return *frame->state();
+}
+
+void ApiTrace::callEdited(ApiTraceCall *call)
+{
+ if (!m_editedCalls.contains(call)) {
+ //lets generate a temp filename
+ QString tempPath = QDir::tempPath();
+ m_tempFileName = QString::fromLatin1("%1/%2.edited")
+ .arg(tempPath)
+ .arg(m_fileName);
+ }
+ m_editedCalls.insert(call);
+ m_needsSaving = true;
+
+ emit changed(call);
+}
+
+void ApiTrace::callReverted(ApiTraceCall *call)
+{
+ m_editedCalls.remove(call);
+
+ if (m_editedCalls.isEmpty()) {
+ m_needsSaving = false;
+ }
+ emit changed(call);
+}
+
+bool ApiTrace::edited() const
+{
+ return !m_editedCalls.isEmpty();
+}
+
+bool ApiTrace::needsSaving() const
+{
+ return m_needsSaving;
+}
+
+void ApiTrace::save()
+{
+ QFileInfo fi(m_tempFileName);
+ QDir dir;
+ emit startedSaving();
+ dir.mkpath(fi.absolutePath());
+ m_saver->saveFile(m_tempFileName, m_calls);
+}
+
+void ApiTrace::slotSaved()
+{
+ m_needsSaving = false;
+}
+
+bool ApiTrace::isSaving() const
+{
+ return m_saver->isRunning();
+}
+
+void ApiTrace::callError(ApiTraceCall *call)
+{
+ Q_ASSERT(call);
+
+ if (call->hasError())
+ m_errors.insert(call);
+ else
+ m_errors.remove(call);
+
+ emit changed(call);
+}
+
+bool ApiTrace::hasErrors() const
+{
+ return !m_errors.isEmpty();
+}
+
+void ApiTrace::loadFrame(ApiTraceFrame *frame)
+{
+ Q_ASSERT(!frame->loaded());
+ emit beginLoadingFrame(frame, frame->numChildrenToLoad());
+ emit requestFrame(frame);
+}
+
+void ApiTrace::finishedParsing()
+{
+ ApiTraceFrame *firstFrame = m_frames[0];
+ if (firstFrame && !firstFrame->loaded()) {
+ loadFrame(firstFrame);
+ }
+}
+
+void ApiTrace::frameLoadFinished(ApiTraceFrame *frame)
+{
+ emit endLoadingFrame(frame);