]> git.cworth.org Git - apitrace/blob - gui/mainwindow.cpp
a46914890984e6cbbdb74705fac89a7da2ec4d28
[apitrace] / gui / mainwindow.cpp
1 #include "mainwindow.h"
2
3 #include "apitrace.h"
4 #include "apitracecall.h"
5 #include "apicalldelegate.h"
6 #include "apitracemodel.h"
7 #include "apitracefilter.h"
8
9 #include <QAction>
10 #include <QDebug>
11 #include <QDir>
12 #include <QFileDialog>
13 #include <QLineEdit>
14 #include <QMessageBox>
15 #include <QProcess>
16 #include <QToolBar>
17 #include <QWebView>
18
19
20 MainWindow::MainWindow()
21     : QMainWindow(),
22       m_replayProcess(0)
23 {
24     m_ui.setupUi(this);
25
26     m_trace = new ApiTrace();
27
28     m_model = new ApiTraceModel();
29     m_model->setApiTrace(m_trace);
30     m_proxyModel = new ApiTraceFilter();
31     m_proxyModel->setSourceModel(m_model);
32     m_ui.callView->setModel(m_proxyModel);
33     m_ui.callView->setItemDelegate(new ApiCallDelegate);
34     for (int column = 0; column < m_model->columnCount(); ++column)
35         m_ui.callView->resizeColumnToContents(column);
36
37     QToolBar *toolBar = addToolBar(tr("Navigation"));
38     m_filterEdit = new QLineEdit(toolBar);
39     toolBar->addWidget(m_filterEdit);
40
41     m_ui.detailsDock->hide();
42
43     connect(m_ui.actionOpen, SIGNAL(triggered()),
44             this, SLOT(openTrace()));
45     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
53     connect(m_ui.callView, SIGNAL(activated(const QModelIndex &)),
54             this, SLOT(callItemSelected(const QModelIndex &)));
55     connect(m_filterEdit, SIGNAL(returnPressed()),
56             this, SLOT(filterTrace()));
57 }
58
59 void 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
70     newTraceFile(fileName);
71 }
72
73 void MainWindow::loadTrace(const QString &fileName)
74 {
75     if (!QFile::exists(fileName)) {
76         QMessageBox::warning(this, tr("File Missing"),
77                              tr("File '%1' doesn't exist.").arg(fileName));
78         return;
79     }
80     qDebug()<< "Loading  : " <<fileName;
81
82     newTraceFile(fileName);
83 }
84
85 void MainWindow::callItemSelected(const QModelIndex &index)
86 {
87     ApiTraceCall *call = index.data().value<ApiTraceCall*>();
88     if (call) {
89         m_ui.detailsWebView->setHtml(call->toHtml());
90         m_ui.detailsDock->show();
91     } else {
92         m_ui.detailsDock->hide();
93     }
94 }
95
96 void MainWindow::filterTrace()
97 {
98     m_proxyModel->setFilterString(m_filterEdit->text());
99 }
100
101 void 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
137 void 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
147 void MainWindow::newTraceFile(const QString &fileName)
148 {
149     m_traceFileName = fileName;
150     m_trace->setFileName(fileName);
151
152     if (m_traceFileName.isEmpty()) {
153         m_ui.actionReplay->setEnabled(false);
154     } else {
155         m_ui.actionReplay->setEnabled(true);
156     }
157 }
158
159 void 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
177 void 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
190 #include "mainwindow.moc"