blob: 63864bfa1787b01fdee05b9c78657de986e6bc45 [file] [log] [blame]
Zack Rusin601e8372011-03-24 22:23:21 -04001#include "mainwindow.h"
2
Zack Rusinf6667d12011-03-30 11:03:37 -04003#include "apitrace.h"
Zack Rusin96130ac2011-03-27 01:48:36 -04004#include "apitracecall.h"
Zack Rusin18eade52011-03-26 14:23:35 -04005#include "apicalldelegate.h"
Zack Rusin601e8372011-03-24 22:23:21 -04006#include "apitracemodel.h"
Zack Rusin91065372011-03-26 01:54:10 -04007#include "apitracefilter.h"
Zack Rusin601e8372011-03-24 22:23:21 -04008
9#include <QAction>
10#include <QDebug>
11#include <QDir>
12#include <QFileDialog>
Zack Rusin27cb2c42011-03-27 23:53:36 -040013#include <QLineEdit>
14#include <QMessageBox>
15#include <QProcess>
Zack Rusinde4ea412011-03-30 11:30:08 -040016#include <QProgressBar>
Zack Rusinea295452011-03-27 02:22:13 -040017#include <QToolBar>
Zack Rusin96130ac2011-03-27 01:48:36 -040018#include <QWebView>
Zack Rusin601e8372011-03-24 22:23:21 -040019
20
21MainWindow::MainWindow()
Zack Rusin27cb2c42011-03-27 23:53:36 -040022 : QMainWindow(),
23 m_replayProcess(0)
Zack Rusin601e8372011-03-24 22:23:21 -040024{
25 m_ui.setupUi(this);
26
Zack Rusinf6667d12011-03-30 11:03:37 -040027 m_trace = new ApiTrace();
Zack Rusinde4ea412011-03-30 11:30:08 -040028 connect(m_trace, SIGNAL(startedLoadingTrace()),
29 this, SLOT(startedLoadingTrace()));
30 connect(m_trace, SIGNAL(finishedLoadingTrace()),
31 this, SLOT(finishedLoadingTrace()));
Zack Rusinf6667d12011-03-30 11:03:37 -040032
Zack Rusin601e8372011-03-24 22:23:21 -040033 m_model = new ApiTraceModel();
Zack Rusinf6667d12011-03-30 11:03:37 -040034 m_model->setApiTrace(m_trace);
Zack Rusin91065372011-03-26 01:54:10 -040035 m_proxyModel = new ApiTraceFilter();
36 m_proxyModel->setSourceModel(m_model);
Zack Rusin96130ac2011-03-27 01:48:36 -040037 m_ui.callView->setModel(m_proxyModel);
Zack Rusin18eade52011-03-26 14:23:35 -040038 m_ui.callView->setItemDelegate(new ApiCallDelegate);
Zack Rusin601e8372011-03-24 22:23:21 -040039 for (int column = 0; column < m_model->columnCount(); ++column)
40 m_ui.callView->resizeColumnToContents(column);
41
Zack Rusinea295452011-03-27 02:22:13 -040042 QToolBar *toolBar = addToolBar(tr("Navigation"));
43 m_filterEdit = new QLineEdit(toolBar);
44 toolBar->addWidget(m_filterEdit);
45
Zack Rusinde4ea412011-03-30 11:30:08 -040046 m_progressBar = new QProgressBar();
47 m_progressBar->setRange(0, 0);
48 statusBar()->addPermanentWidget(m_progressBar);
49 m_progressBar->hide();
50
Zack Rusin96130ac2011-03-27 01:48:36 -040051 m_ui.detailsDock->hide();
52
Zack Rusin601e8372011-03-24 22:23:21 -040053 connect(m_ui.actionOpen, SIGNAL(triggered()),
54 this, SLOT(openTrace()));
Zack Rusin27cb2c42011-03-27 23:53:36 -040055 connect(m_ui.actionQuit, SIGNAL(triggered()),
56 this, SLOT(close()));
57
58 connect(m_ui.actionReplay, SIGNAL(triggered()),
59 this, SLOT(replayStart()));
60 connect(m_ui.actionStop, SIGNAL(triggered()),
61 this, SLOT(replayStop()));
62
Zack Rusin96130ac2011-03-27 01:48:36 -040063 connect(m_ui.callView, SIGNAL(activated(const QModelIndex &)),
64 this, SLOT(callItemSelected(const QModelIndex &)));
Zack Rusinea295452011-03-27 02:22:13 -040065 connect(m_filterEdit, SIGNAL(returnPressed()),
66 this, SLOT(filterTrace()));
Zack Rusin601e8372011-03-24 22:23:21 -040067}
68
69void MainWindow::openTrace()
70{
71 QString fileName =
72 QFileDialog::getOpenFileName(
73 this,
74 tr("Open Trace"),
75 QDir::homePath(),
76 tr("Trace Files (*.trace)"));
77
78 qDebug()<< "File name : " <<fileName;
79
Zack Rusin27cb2c42011-03-27 23:53:36 -040080 newTraceFile(fileName);
Zack Rusin601e8372011-03-24 22:23:21 -040081}
82
83void MainWindow::loadTrace(const QString &fileName)
84{
Zack Rusin27cb2c42011-03-27 23:53:36 -040085 if (!QFile::exists(fileName)) {
86 QMessageBox::warning(this, tr("File Missing"),
87 tr("File '%1' doesn't exist.").arg(fileName));
88 return;
89 }
Zack Rusin601e8372011-03-24 22:23:21 -040090 qDebug()<< "Loading : " <<fileName;
91
Zack Rusinde4ea412011-03-30 11:30:08 -040092 m_progressBar->setValue(0);
Zack Rusin27cb2c42011-03-27 23:53:36 -040093 newTraceFile(fileName);
Zack Rusin601e8372011-03-24 22:23:21 -040094}
95
Zack Rusin96130ac2011-03-27 01:48:36 -040096void MainWindow::callItemSelected(const QModelIndex &index)
97{
98 ApiTraceCall *call = index.data().value<ApiTraceCall*>();
99 if (call) {
Zack Rusin27cb2c42011-03-27 23:53:36 -0400100 m_ui.detailsWebView->setHtml(call->toHtml());
Zack Rusin96130ac2011-03-27 01:48:36 -0400101 m_ui.detailsDock->show();
102 } else {
103 m_ui.detailsDock->hide();
104 }
105}
106
Zack Rusinea295452011-03-27 02:22:13 -0400107void MainWindow::filterTrace()
108{
109 m_proxyModel->setFilterString(m_filterEdit->text());
110}
111
Zack Rusin27cb2c42011-03-27 23:53:36 -0400112void MainWindow::replayStart()
113{
114 if (!m_replayProcess) {
115#ifdef Q_OS_WIN
116 QString format = QLatin1String("%1;");
117#else
118 QString format = QLatin1String("%1:");
119#endif
120 QString buildPath = format.arg(BUILD_DIR);
121 QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
122 env.insert("PATH", buildPath + env.value("PATH"));
123
124 qputenv("PATH", env.value("PATH").toLatin1());
125
126 m_replayProcess = new QProcess(this);
127 m_replayProcess->setProcessEnvironment(env);
128
129 connect(m_replayProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
130 this, SLOT(replayFinished()));
131 connect(m_replayProcess, SIGNAL(error(QProcess::ProcessError)),
132 this, SLOT(replayError(QProcess::ProcessError)));
133 }
134
135 if (m_traceFileName.isEmpty())
136 return;
137
138 QStringList arguments;
139 arguments << m_traceFileName;
140
141 m_replayProcess->start(QLatin1String("glretrace"),
142 arguments);
143
144 m_ui.actionStop->setEnabled(true);
145 m_ui.actionReplay->setEnabled(false);
146}
147
148void MainWindow::replayStop()
149{
150 if (m_replayProcess) {
151 m_replayProcess->kill();
152
153 m_ui.actionStop->setEnabled(false);
154 m_ui.actionReplay->setEnabled(true);
155 }
156}
157
158void MainWindow::newTraceFile(const QString &fileName)
159{
160 m_traceFileName = fileName;
Zack Rusinf6667d12011-03-30 11:03:37 -0400161 m_trace->setFileName(fileName);
Zack Rusin27cb2c42011-03-27 23:53:36 -0400162
163 if (m_traceFileName.isEmpty()) {
164 m_ui.actionReplay->setEnabled(false);
165 } else {
166 m_ui.actionReplay->setEnabled(true);
167 }
168}
169
170void MainWindow::replayFinished()
171{
172 m_ui.actionStop->setEnabled(false);
173 m_ui.actionReplay->setEnabled(true);
174
175 QString output = m_replayProcess->readAllStandardOutput();
176
177#if 0
178 qDebug()<<"Process finished = ";
179 qDebug()<<"\terr = "<<m_replayProcess->readAllStandardError();
180 qDebug()<<"\tout = "<<output;
181#endif
182
183 if (output.length() < 80) {
184 statusBar()->showMessage(output);
185 }
186}
187
188void MainWindow::replayError(QProcess::ProcessError err)
189{
190 m_ui.actionStop->setEnabled(false);
191 m_ui.actionReplay->setEnabled(true);
192
193 qDebug()<<"Process error = "<<err;
194 qDebug()<<"\terr = "<<m_replayProcess->readAllStandardError();
195 qDebug()<<"\tout = "<<m_replayProcess->readAllStandardOutput();
196 QMessageBox::warning(
197 this, tr("Replay Failed"),
198 tr("Couldn't execute the replay file '%1'").arg(m_traceFileName));
199}
200
Zack Rusinde4ea412011-03-30 11:30:08 -0400201void MainWindow::startedLoadingTrace()
202{
203 Q_ASSERT(m_trace);
204 m_progressBar->show();
205 QFileInfo info(m_trace->fileName());
206 statusBar()->showMessage(
207 tr("Loading %1...").arg(info.fileName()));
208}
209
210void MainWindow::finishedLoadingTrace()
211{
212 m_progressBar->hide();
213 if (!m_trace) {
214 return;
215 }
216 QFileInfo info(m_trace->fileName());
217 statusBar()->showMessage(
218 tr("Loaded %1").arg(info.fileName()), 3000);
219}
220
Zack Rusin601e8372011-03-24 22:23:21 -0400221#include "mainwindow.moc"