1 #include "mainwindow.h"
4 #include "apitracecall.h"
5 #include "apicalldelegate.h"
6 #include "apitracemodel.h"
7 #include "apitracefilter.h"
12 #include <QFileDialog>
14 #include <QMessageBox>
16 #include <QProgressBar>
21 MainWindow::MainWindow()
28 m_trace = new ApiTrace();
29 connect(m_trace, SIGNAL(startedLoadingTrace()),
30 this, SLOT(startedLoadingTrace()));
31 connect(m_trace, SIGNAL(finishedLoadingTrace()),
32 this, SLOT(finishedLoadingTrace()));
34 m_model = new ApiTraceModel();
35 m_model->setApiTrace(m_trace);
36 m_proxyModel = new ApiTraceFilter();
37 m_proxyModel->setSourceModel(m_model);
38 m_ui.callView->setModel(m_proxyModel);
39 m_ui.callView->setItemDelegate(new ApiCallDelegate);
40 for (int column = 0; column < m_model->columnCount(); ++column)
41 m_ui.callView->resizeColumnToContents(column);
43 QToolBar *toolBar = addToolBar(tr("Navigation"));
44 m_filterEdit = new QLineEdit(toolBar);
45 toolBar->addWidget(m_filterEdit);
47 m_progressBar = new QProgressBar();
48 m_progressBar->setRange(0, 0);
49 statusBar()->addPermanentWidget(m_progressBar);
50 m_progressBar->hide();
52 m_ui.detailsDock->hide();
54 connect(m_ui.actionOpen, SIGNAL(triggered()),
55 this, SLOT(openTrace()));
56 connect(m_ui.actionQuit, SIGNAL(triggered()),
59 connect(m_ui.actionReplay, SIGNAL(triggered()),
60 this, SLOT(replayStart()));
61 connect(m_ui.actionStop, SIGNAL(triggered()),
62 this, SLOT(replayStop()));
63 connect(m_ui.actionLookupState, SIGNAL(triggered()),
64 this, SLOT(lookupState()));
66 connect(m_ui.callView, SIGNAL(activated(const QModelIndex &)),
67 this, SLOT(callItemSelected(const QModelIndex &)));
68 connect(m_filterEdit, SIGNAL(returnPressed()),
69 this, SLOT(filterTrace()));
72 void MainWindow::openTrace()
75 QFileDialog::getOpenFileName(
79 tr("Trace Files (*.trace)"));
81 qDebug()<< "File name : " <<fileName;
83 newTraceFile(fileName);
86 void MainWindow::loadTrace(const QString &fileName)
88 if (!QFile::exists(fileName)) {
89 QMessageBox::warning(this, tr("File Missing"),
90 tr("File '%1' doesn't exist.").arg(fileName));
93 qDebug()<< "Loading : " <<fileName;
95 m_progressBar->setValue(0);
96 newTraceFile(fileName);
99 void MainWindow::callItemSelected(const QModelIndex &index)
101 ApiTraceCall *call = index.data().value<ApiTraceCall*>();
103 m_ui.detailsWebView->setHtml(call->toHtml());
104 m_ui.detailsDock->show();
105 m_currentFrame = call->parentFrame;
107 m_currentFrame = index.data().value<ApiTraceFrame*>();
108 m_ui.detailsDock->hide();
112 void MainWindow::filterTrace()
114 m_proxyModel->setFilterString(m_filterEdit->text());
117 void MainWindow::replayStart()
122 void MainWindow::replayStop()
124 if (m_replayProcess) {
125 m_replayProcess->kill();
127 m_ui.actionStop->setEnabled(false);
128 m_ui.actionReplay->setEnabled(true);
129 m_ui.actionLookupState->setEnabled(true);
133 void MainWindow::newTraceFile(const QString &fileName)
135 m_traceFileName = fileName;
136 m_trace->setFileName(fileName);
138 if (m_traceFileName.isEmpty()) {
139 m_ui.actionReplay->setEnabled(false);
140 m_ui.actionLookupState->setEnabled(false);
142 m_ui.actionReplay->setEnabled(true);
143 m_ui.actionLookupState->setEnabled(true);
147 void MainWindow::replayFinished()
149 m_ui.actionStop->setEnabled(false);
150 m_ui.actionReplay->setEnabled(true);
151 m_ui.actionLookupState->setEnabled(true);
153 QByteArray output = m_replayProcess->readAllStandardOutput();
156 qDebug()<<"Process finished = ";
157 qDebug()<<"\terr = "<<m_replayProcess->readAllStandardError();
158 qDebug()<<"\tout = "<<output;
161 if (m_findingState) {
162 qDebug()<<"json parse";
163 } else if (output.length() < 80) {
164 statusBar()->showMessage(output);
168 void MainWindow::replayError(QProcess::ProcessError err)
170 m_ui.actionStop->setEnabled(false);
171 m_ui.actionReplay->setEnabled(true);
172 m_ui.actionLookupState->setEnabled(true);
173 m_findingState = false;
175 qDebug()<<"Process error = "<<err;
176 qDebug()<<"\terr = "<<m_replayProcess->readAllStandardError();
177 qDebug()<<"\tout = "<<m_replayProcess->readAllStandardOutput();
178 QMessageBox::warning(
179 this, tr("Replay Failed"),
180 tr("Couldn't execute the replay file '%1'").arg(m_traceFileName));
183 void MainWindow::startedLoadingTrace()
186 m_progressBar->show();
187 QFileInfo info(m_trace->fileName());
188 statusBar()->showMessage(
189 tr("Loading %1...").arg(info.fileName()));
192 void MainWindow::finishedLoadingTrace()
194 m_progressBar->hide();
198 QFileInfo info(m_trace->fileName());
199 statusBar()->showMessage(
200 tr("Loaded %1").arg(info.fileName()), 3000);
203 void MainWindow::replayTrace(bool dumpState)
205 if (!m_replayProcess) {
207 QString format = QLatin1String("%1;");
209 QString format = QLatin1String("%1:");
211 QString buildPath = format.arg(BUILD_DIR);
212 QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
213 env.insert("PATH", buildPath + env.value("PATH"));
215 qputenv("PATH", env.value("PATH").toLatin1());
217 m_replayProcess = new QProcess(this);
218 m_replayProcess->setProcessEnvironment(env);
220 connect(m_replayProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
221 this, SLOT(replayFinished()));
222 connect(m_replayProcess, SIGNAL(error(QProcess::ProcessError)),
223 this, SLOT(replayError(QProcess::ProcessError)));
226 if (m_traceFileName.isEmpty())
229 QStringList arguments;
231 m_currentFrame && !m_currentFrame->calls.isEmpty()) {
232 arguments << QLatin1String("-D");
233 arguments << QString::number(m_currentFrame->calls.first()->index);
235 arguments << m_traceFileName;
237 m_replayProcess->start(QLatin1String("glretrace"),
240 m_ui.actionStop->setEnabled(true);
243 void MainWindow::lookupState()
245 if (!m_currentFrame) {
246 QMessageBox::warning(
247 this, tr("Unknown Frame"),
248 tr("To inspect the state select a frame in the trace."));
251 m_findingState = true;
255 #include "mainwindow.moc"