blob: a46914890984e6cbbdb74705fac89a7da2ec4d28 [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 Rusinea295452011-03-27 02:22:13 -040016#include <QToolBar>
Zack Rusin96130ac2011-03-27 01:48:36 -040017#include <QWebView>
Zack Rusin601e8372011-03-24 22:23:21 -040018
19
20MainWindow::MainWindow()
Zack Rusin27cb2c42011-03-27 23:53:36 -040021 : QMainWindow(),
22 m_replayProcess(0)
Zack Rusin601e8372011-03-24 22:23:21 -040023{
24 m_ui.setupUi(this);
25
Zack Rusinf6667d12011-03-30 11:03:37 -040026 m_trace = new ApiTrace();
27
Zack Rusin601e8372011-03-24 22:23:21 -040028 m_model = new ApiTraceModel();
Zack Rusinf6667d12011-03-30 11:03:37 -040029 m_model->setApiTrace(m_trace);
Zack Rusin91065372011-03-26 01:54:10 -040030 m_proxyModel = new ApiTraceFilter();
31 m_proxyModel->setSourceModel(m_model);
Zack Rusin96130ac2011-03-27 01:48:36 -040032 m_ui.callView->setModel(m_proxyModel);
Zack Rusin18eade52011-03-26 14:23:35 -040033 m_ui.callView->setItemDelegate(new ApiCallDelegate);
Zack Rusin601e8372011-03-24 22:23:21 -040034 for (int column = 0; column < m_model->columnCount(); ++column)
35 m_ui.callView->resizeColumnToContents(column);
36
Zack Rusinea295452011-03-27 02:22:13 -040037 QToolBar *toolBar = addToolBar(tr("Navigation"));
38 m_filterEdit = new QLineEdit(toolBar);
39 toolBar->addWidget(m_filterEdit);
40
Zack Rusin96130ac2011-03-27 01:48:36 -040041 m_ui.detailsDock->hide();
42
Zack Rusin601e8372011-03-24 22:23:21 -040043 connect(m_ui.actionOpen, SIGNAL(triggered()),
44 this, SLOT(openTrace()));
Zack Rusin27cb2c42011-03-27 23:53:36 -040045 connect(m_ui.actionQuit, SIGNAL(triggered()),
46 this, SLOT(close()));
47
48 connect(m_ui.actionReplay, SIGNAL(triggered()),
49 this, SLOT(replayStart()));
50 connect(m_ui.actionStop, SIGNAL(triggered()),
51 this, SLOT(replayStop()));
52
Zack Rusin96130ac2011-03-27 01:48:36 -040053 connect(m_ui.callView, SIGNAL(activated(const QModelIndex &)),
54 this, SLOT(callItemSelected(const QModelIndex &)));
Zack Rusinea295452011-03-27 02:22:13 -040055 connect(m_filterEdit, SIGNAL(returnPressed()),
56 this, SLOT(filterTrace()));
Zack Rusin601e8372011-03-24 22:23:21 -040057}
58
59void MainWindow::openTrace()
60{
61 QString fileName =
62 QFileDialog::getOpenFileName(
63 this,
64 tr("Open Trace"),
65 QDir::homePath(),
66 tr("Trace Files (*.trace)"));
67
68 qDebug()<< "File name : " <<fileName;
69
Zack Rusin27cb2c42011-03-27 23:53:36 -040070 newTraceFile(fileName);
Zack Rusin601e8372011-03-24 22:23:21 -040071}
72
73void MainWindow::loadTrace(const QString &fileName)
74{
Zack Rusin27cb2c42011-03-27 23:53:36 -040075 if (!QFile::exists(fileName)) {
76 QMessageBox::warning(this, tr("File Missing"),
77 tr("File '%1' doesn't exist.").arg(fileName));
78 return;
79 }
Zack Rusin601e8372011-03-24 22:23:21 -040080 qDebug()<< "Loading : " <<fileName;
81
Zack Rusin27cb2c42011-03-27 23:53:36 -040082 newTraceFile(fileName);
Zack Rusin601e8372011-03-24 22:23:21 -040083}
84
Zack Rusin96130ac2011-03-27 01:48:36 -040085void MainWindow::callItemSelected(const QModelIndex &index)
86{
87 ApiTraceCall *call = index.data().value<ApiTraceCall*>();
88 if (call) {
Zack Rusin27cb2c42011-03-27 23:53:36 -040089 m_ui.detailsWebView->setHtml(call->toHtml());
Zack Rusin96130ac2011-03-27 01:48:36 -040090 m_ui.detailsDock->show();
91 } else {
92 m_ui.detailsDock->hide();
93 }
94}
95
Zack Rusinea295452011-03-27 02:22:13 -040096void MainWindow::filterTrace()
97{
98 m_proxyModel->setFilterString(m_filterEdit->text());
99}
100
Zack Rusin27cb2c42011-03-27 23:53:36 -0400101void MainWindow::replayStart()
102{
103 if (!m_replayProcess) {
104#ifdef Q_OS_WIN
105 QString format = QLatin1String("%1;");
106#else
107 QString format = QLatin1String("%1:");
108#endif
109 QString buildPath = format.arg(BUILD_DIR);
110 QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
111 env.insert("PATH", buildPath + env.value("PATH"));
112
113 qputenv("PATH", env.value("PATH").toLatin1());
114
115 m_replayProcess = new QProcess(this);
116 m_replayProcess->setProcessEnvironment(env);
117
118 connect(m_replayProcess, SIGNAL(finished(int, QProcess::ExitStatus)),
119 this, SLOT(replayFinished()));
120 connect(m_replayProcess, SIGNAL(error(QProcess::ProcessError)),
121 this, SLOT(replayError(QProcess::ProcessError)));
122 }
123
124 if (m_traceFileName.isEmpty())
125 return;
126
127 QStringList arguments;
128 arguments << m_traceFileName;
129
130 m_replayProcess->start(QLatin1String("glretrace"),
131 arguments);
132
133 m_ui.actionStop->setEnabled(true);
134 m_ui.actionReplay->setEnabled(false);
135}
136
137void MainWindow::replayStop()
138{
139 if (m_replayProcess) {
140 m_replayProcess->kill();
141
142 m_ui.actionStop->setEnabled(false);
143 m_ui.actionReplay->setEnabled(true);
144 }
145}
146
147void MainWindow::newTraceFile(const QString &fileName)
148{
149 m_traceFileName = fileName;
Zack Rusinf6667d12011-03-30 11:03:37 -0400150 m_trace->setFileName(fileName);
Zack Rusin27cb2c42011-03-27 23:53:36 -0400151
152 if (m_traceFileName.isEmpty()) {
153 m_ui.actionReplay->setEnabled(false);
154 } else {
155 m_ui.actionReplay->setEnabled(true);
156 }
157}
158
159void MainWindow::replayFinished()
160{
161 m_ui.actionStop->setEnabled(false);
162 m_ui.actionReplay->setEnabled(true);
163
164 QString output = m_replayProcess->readAllStandardOutput();
165
166#if 0
167 qDebug()<<"Process finished = ";
168 qDebug()<<"\terr = "<<m_replayProcess->readAllStandardError();
169 qDebug()<<"\tout = "<<output;
170#endif
171
172 if (output.length() < 80) {
173 statusBar()->showMessage(output);
174 }
175}
176
177void MainWindow::replayError(QProcess::ProcessError err)
178{
179 m_ui.actionStop->setEnabled(false);
180 m_ui.actionReplay->setEnabled(true);
181
182 qDebug()<<"Process error = "<<err;
183 qDebug()<<"\terr = "<<m_replayProcess->readAllStandardError();
184 qDebug()<<"\tout = "<<m_replayProcess->readAllStandardOutput();
185 QMessageBox::warning(
186 this, tr("Replay Failed"),
187 tr("Couldn't execute the replay file '%1'").arg(m_traceFileName));
188}
189
Zack Rusin601e8372011-03-24 22:23:21 -0400190#include "mainwindow.moc"