blob: b19a559fe681b882f5a16b2e0576e31cfa7fa4d5 [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 Rusin09ec4842011-04-10 01:57:17 -04008#include "imageviewer.h"
Zack Rusin3acde362011-04-06 01:11:55 -04009#include "retracer.h"
Zack Rusine1745572011-04-03 14:30:19 -040010#include "settingsdialog.h"
Zack Rusin7c814f12011-04-09 19:20:58 -040011#include "shaderssourcewidget.h"
Zack Rusin3165c832011-04-07 20:32:46 -040012#include "ui_retracerdialog.h"
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040013#include "vertexdatainterpreter.h"
Zack Rusin601e8372011-03-24 22:23:21 -040014
Zack Rusine8685f62011-03-30 20:14:01 -040015#include <qjson/parser.h>
16
Zack Rusin601e8372011-03-24 22:23:21 -040017#include <QAction>
18#include <QDebug>
Zack Rusinc97fadc2011-04-07 15:16:59 -040019#include <QDesktopServices>
Zack Rusin601e8372011-03-24 22:23:21 -040020#include <QDir>
21#include <QFileDialog>
Zack Rusin27cb2c42011-03-27 23:53:36 -040022#include <QLineEdit>
23#include <QMessageBox>
Zack Rusinde4ea412011-03-30 11:30:08 -040024#include <QProgressBar>
Zack Rusinea295452011-03-27 02:22:13 -040025#include <QToolBar>
Zack Rusinc97fadc2011-04-07 15:16:59 -040026#include <QUrl>
Zack Rusin7c814f12011-04-09 19:20:58 -040027#include <QVBoxLayout>
Zack Rusinc97fadc2011-04-07 15:16:59 -040028#include <QWebPage>
Zack Rusin96130ac2011-03-27 01:48:36 -040029#include <QWebView>
Zack Rusin601e8372011-03-24 22:23:21 -040030
31
32MainWindow::MainWindow()
Zack Rusin27cb2c42011-03-27 23:53:36 -040033 : QMainWindow(),
Zack Rusin581e3ff2011-03-31 23:58:07 -040034 m_selectedEvent(0),
35 m_stateEvent(0),
Zack Rusin11f7e632011-03-30 22:47:51 -040036 m_jsonParser(new QJson::Parser())
Zack Rusin601e8372011-03-24 22:23:21 -040037{
38 m_ui.setupUi(this);
Zack Rusin46678422011-04-10 12:15:46 -040039 initObjects();
40 initConnections();
Zack Rusin601e8372011-03-24 22:23:21 -040041}
42
43void MainWindow::openTrace()
44{
45 QString fileName =
46 QFileDialog::getOpenFileName(
47 this,
48 tr("Open Trace"),
49 QDir::homePath(),
50 tr("Trace Files (*.trace)"));
51
52 qDebug()<< "File name : " <<fileName;
53
Zack Rusin27cb2c42011-03-27 23:53:36 -040054 newTraceFile(fileName);
Zack Rusin601e8372011-03-24 22:23:21 -040055}
56
57void MainWindow::loadTrace(const QString &fileName)
58{
Zack Rusin27cb2c42011-03-27 23:53:36 -040059 if (!QFile::exists(fileName)) {
60 QMessageBox::warning(this, tr("File Missing"),
61 tr("File '%1' doesn't exist.").arg(fileName));
62 return;
63 }
Zack Rusin601e8372011-03-24 22:23:21 -040064 qDebug()<< "Loading : " <<fileName;
65
Zack Rusinde4ea412011-03-30 11:30:08 -040066 m_progressBar->setValue(0);
Zack Rusin27cb2c42011-03-27 23:53:36 -040067 newTraceFile(fileName);
Zack Rusin601e8372011-03-24 22:23:21 -040068}
69
Zack Rusin96130ac2011-03-27 01:48:36 -040070void MainWindow::callItemSelected(const QModelIndex &index)
71{
Zack Rusinc1acc7f2011-04-02 01:34:04 -040072 ApiTraceEvent *event =
73 index.data(ApiTraceModel::EventRole).value<ApiTraceEvent*>();
74
75 if (event && event->type() == ApiTraceEvent::Call) {
76 ApiTraceCall *call = static_cast<ApiTraceCall*>(event);
Zack Rusin27cb2c42011-03-27 23:53:36 -040077 m_ui.detailsWebView->setHtml(call->toHtml());
Zack Rusin96130ac2011-03-27 01:48:36 -040078 m_ui.detailsDock->show();
Zack Rusin8e7a4ff2011-04-07 01:15:48 -040079 if (call->hasBinaryData()) {
80 QByteArray data =
81 call->argValues[call->binaryDataIndex()].toByteArray();
82 m_vdataInterpreter->setData(data);
83
84 for (int i = 0; i < call->argNames.count(); ++i) {
85 QString name = call->argNames[i];
86 if (name == QLatin1String("stride")) {
87 int stride = call->argValues[i].toInt();
88 m_ui.vertexStrideSB->setValue(stride);
89 } else if (name == QLatin1String("size")) {
90 int components = call->argValues[i].toInt();
91 m_ui.vertexComponentsSB->setValue(components);
92 } else if (name == QLatin1String("type")) {
93 QString val = call->argValues[i].toString();
94 int textIndex = m_ui.vertexTypeCB->findText(val);
95 if (textIndex >= 0)
96 m_ui.vertexTypeCB->setCurrentIndex(textIndex);
97 }
98 }
99 }
100 m_ui.vertexDataDock->setVisible(call->hasBinaryData());
Zack Rusin581e3ff2011-03-31 23:58:07 -0400101 m_selectedEvent = call;
Zack Rusin96130ac2011-03-27 01:48:36 -0400102 } else {
Zack Rusinc1acc7f2011-04-02 01:34:04 -0400103 if (event && event->type() == ApiTraceEvent::Frame) {
104 m_selectedEvent = static_cast<ApiTraceFrame*>(event);
105 } else
106 m_selectedEvent = 0;
Zack Rusin96130ac2011-03-27 01:48:36 -0400107 m_ui.detailsDock->hide();
Zack Rusin8e7a4ff2011-04-07 01:15:48 -0400108 m_ui.vertexDataDock->hide();
Zack Rusin96130ac2011-03-27 01:48:36 -0400109 }
Zack Rusin581e3ff2011-03-31 23:58:07 -0400110 if (m_selectedEvent && !m_selectedEvent->state().isEmpty()) {
Zack Rusin11f7e632011-03-30 22:47:51 -0400111 fillStateForFrame();
112 } else
113 m_ui.stateDock->hide();
Zack Rusin96130ac2011-03-27 01:48:36 -0400114}
115
Zack Rusinea295452011-03-27 02:22:13 -0400116void MainWindow::filterTrace()
117{
118 m_proxyModel->setFilterString(m_filterEdit->text());
119}
120
Zack Rusin27cb2c42011-03-27 23:53:36 -0400121void MainWindow::replayStart()
122{
Zack Rusin3165c832011-04-07 20:32:46 -0400123 QDialog dlg;
124 Ui_RetracerDialog dlgUi;
125 dlgUi.setupUi(&dlg);
126
127 dlgUi.doubleBufferingCB->setChecked(
128 m_retracer->isDoubleBuffered());
129 dlgUi.benchmarkCB->setChecked(
130 m_retracer->isBenchmarking());
131
132 if (dlg.exec() == QDialog::Accepted) {
133 m_retracer->setDoubleBuffered(
134 dlgUi.doubleBufferingCB->isChecked());
135 m_retracer->setBenchmarking(
136 dlgUi.benchmarkCB->isChecked());
137 replayTrace(false);
138 }
Zack Rusin27cb2c42011-03-27 23:53:36 -0400139}
140
141void MainWindow::replayStop()
142{
Zack Rusin3acde362011-04-06 01:11:55 -0400143 m_retracer->terminate();
144 m_ui.actionStop->setEnabled(false);
145 m_ui.actionReplay->setEnabled(true);
146 m_ui.actionLookupState->setEnabled(true);
Zack Rusin27cb2c42011-03-27 23:53:36 -0400147}
148
149void MainWindow::newTraceFile(const QString &fileName)
150{
151 m_traceFileName = fileName;
Zack Rusinf6667d12011-03-30 11:03:37 -0400152 m_trace->setFileName(fileName);
Zack Rusin27cb2c42011-03-27 23:53:36 -0400153
154 if (m_traceFileName.isEmpty()) {
155 m_ui.actionReplay->setEnabled(false);
Zack Rusin2caa06d2011-03-30 18:30:20 -0400156 m_ui.actionLookupState->setEnabled(false);
Zack Rusina228d692011-04-06 17:29:39 -0400157 setWindowTitle(tr("QApiTrace"));
Zack Rusin27cb2c42011-03-27 23:53:36 -0400158 } else {
Zack Rusina228d692011-04-06 17:29:39 -0400159 QFileInfo info(fileName);
Zack Rusin27cb2c42011-03-27 23:53:36 -0400160 m_ui.actionReplay->setEnabled(true);
Zack Rusin2caa06d2011-03-30 18:30:20 -0400161 m_ui.actionLookupState->setEnabled(true);
Zack Rusina228d692011-04-06 17:29:39 -0400162 setWindowTitle(
163 tr("QApiTrace - %1").arg(info.fileName()));
Zack Rusin27cb2c42011-03-27 23:53:36 -0400164 }
165}
166
Zack Rusin3acde362011-04-06 01:11:55 -0400167void MainWindow::replayFinished(const QByteArray &output)
Zack Rusin27cb2c42011-03-27 23:53:36 -0400168{
169 m_ui.actionStop->setEnabled(false);
170 m_ui.actionReplay->setEnabled(true);
Zack Rusin2caa06d2011-03-30 18:30:20 -0400171 m_ui.actionLookupState->setEnabled(true);
Zack Rusin27cb2c42011-03-27 23:53:36 -0400172
Zack Rusin3acde362011-04-06 01:11:55 -0400173 if (m_retracer->captureState()) {
Zack Rusin11f7e632011-03-30 22:47:51 -0400174 bool ok = false;
175 QVariantMap parsedJson = m_jsonParser->parse(output, &ok).toMap();
Zack Rusin7c814f12011-04-09 19:20:58 -0400176 parseState(parsedJson);
Zack Rusin2caa06d2011-03-30 18:30:20 -0400177 } else if (output.length() < 80) {
Zack Rusin27cb2c42011-03-27 23:53:36 -0400178 statusBar()->showMessage(output);
179 }
Zack Rusin581e3ff2011-03-31 23:58:07 -0400180 m_stateEvent = 0;
Zack Rusin27cb2c42011-03-27 23:53:36 -0400181}
182
Zack Rusin3acde362011-04-06 01:11:55 -0400183void MainWindow::replayError(const QString &message)
Zack Rusin27cb2c42011-03-27 23:53:36 -0400184{
185 m_ui.actionStop->setEnabled(false);
186 m_ui.actionReplay->setEnabled(true);
Zack Rusin2caa06d2011-03-30 18:30:20 -0400187 m_ui.actionLookupState->setEnabled(true);
Zack Rusin581e3ff2011-03-31 23:58:07 -0400188 m_stateEvent = 0;
Zack Rusin27cb2c42011-03-27 23:53:36 -0400189
Zack Rusin27cb2c42011-03-27 23:53:36 -0400190 QMessageBox::warning(
Zack Rusin3acde362011-04-06 01:11:55 -0400191 this, tr("Replay Failed"), message);
Zack Rusin27cb2c42011-03-27 23:53:36 -0400192}
193
Zack Rusinde4ea412011-03-30 11:30:08 -0400194void MainWindow::startedLoadingTrace()
195{
196 Q_ASSERT(m_trace);
197 m_progressBar->show();
198 QFileInfo info(m_trace->fileName());
199 statusBar()->showMessage(
200 tr("Loading %1...").arg(info.fileName()));
201}
202
203void MainWindow::finishedLoadingTrace()
204{
205 m_progressBar->hide();
206 if (!m_trace) {
207 return;
208 }
209 QFileInfo info(m_trace->fileName());
210 statusBar()->showMessage(
211 tr("Loaded %1").arg(info.fileName()), 3000);
212}
213
Zack Rusin2caa06d2011-03-30 18:30:20 -0400214void MainWindow::replayTrace(bool dumpState)
215{
Zack Rusin2caa06d2011-03-30 18:30:20 -0400216 if (m_traceFileName.isEmpty())
217 return;
218
Zack Rusin3acde362011-04-06 01:11:55 -0400219 m_retracer->setFileName(m_traceFileName);
220 m_retracer->setCaptureState(dumpState);
221 if (m_retracer->captureState() && m_selectedEvent) {
Zack Rusin581e3ff2011-03-31 23:58:07 -0400222 int index = 0;
223 if (m_selectedEvent->type() == ApiTraceEvent::Call) {
224 index = static_cast<ApiTraceCall*>(m_selectedEvent)->index;
225 } else if (m_selectedEvent->type() == ApiTraceEvent::Frame) {
226 ApiTraceFrame *frame = static_cast<ApiTraceFrame*>(m_selectedEvent);
227 if (frame->calls.isEmpty()) {
228 //XXX i guess we could still get the current state
229 qDebug()<<"tried to get a state for an empty frame";
230 return;
231 }
232 index = frame->calls.first()->index;
233 } else {
234 qDebug()<<"Unknown event type";
235 return;
236 }
Zack Rusin3acde362011-04-06 01:11:55 -0400237 m_retracer->setCaptureAtCallNumber(index);
Zack Rusin2caa06d2011-03-30 18:30:20 -0400238 }
Zack Rusin3acde362011-04-06 01:11:55 -0400239 m_retracer->start();
Zack Rusin2caa06d2011-03-30 18:30:20 -0400240
241 m_ui.actionStop->setEnabled(true);
242}
243
244void MainWindow::lookupState()
245{
Zack Rusin581e3ff2011-03-31 23:58:07 -0400246 if (!m_selectedEvent) {
Zack Rusin2caa06d2011-03-30 18:30:20 -0400247 QMessageBox::warning(
Zack Rusin581e3ff2011-03-31 23:58:07 -0400248 this, tr("Unknown Event"),
249 tr("To inspect the state select an event in the event list."));
Zack Rusin2caa06d2011-03-30 18:30:20 -0400250 return;
251 }
Zack Rusin581e3ff2011-03-31 23:58:07 -0400252 m_stateEvent = m_selectedEvent;
Zack Rusin2caa06d2011-03-30 18:30:20 -0400253 replayTrace(true);
254}
255
Zack Rusin11f7e632011-03-30 22:47:51 -0400256MainWindow::~MainWindow()
257{
258 delete m_jsonParser;
259}
260
Zack Rusin7c814f12011-04-09 19:20:58 -0400261void MainWindow::parseState(const QVariantMap &parsedJson)
Zack Rusin11f7e632011-03-30 22:47:51 -0400262{
Zack Rusin7c814f12011-04-09 19:20:58 -0400263 m_stateEvent->setState(ApiTraceState(parsedJson));
Zack Rusinc1acc7f2011-04-02 01:34:04 -0400264 m_model->stateSetOnEvent(m_stateEvent);
Zack Rusin581e3ff2011-03-31 23:58:07 -0400265 if (m_selectedEvent == m_stateEvent) {
Zack Rusin11f7e632011-03-30 22:47:51 -0400266 fillStateForFrame();
267 } else {
268 m_ui.stateDock->hide();
269 }
270}
271
272static void
273variantToString(const QVariant &var, QString &str)
274{
275 if (var.type() == QVariant::List) {
276 QVariantList lst = var.toList();
277 str += QLatin1String("[");
278 for (int i = 0; i < lst.count(); ++i) {
279 QVariant val = lst[i];
280 variantToString(val, str);
281 if (i < lst.count() - 1)
282 str += QLatin1String(", ");
283 }
284 str += QLatin1String("]");
285 } else if (var.type() == QVariant::Map) {
286 Q_ASSERT(!"unsupported state type");
287 } else if (var.type() == QVariant::Hash) {
288 Q_ASSERT(!"unsupported state type");
289 } else {
290 str += var.toString();
291 }
292}
293
294void MainWindow::fillStateForFrame()
295{
296 QVariantMap::const_iterator itr;
297 QVariantMap params;
298
Zack Rusin581e3ff2011-03-31 23:58:07 -0400299 if (!m_selectedEvent || m_selectedEvent->state().isEmpty())
Zack Rusin11f7e632011-03-30 22:47:51 -0400300 return;
301
Zack Rusin7c814f12011-04-09 19:20:58 -0400302 const ApiTraceState &state = m_selectedEvent->state();
Zack Rusin11f7e632011-03-30 22:47:51 -0400303 m_ui.stateTreeWidget->clear();
Zack Rusin7c814f12011-04-09 19:20:58 -0400304 params = state.parameters();
Zack Rusin11f7e632011-03-30 22:47:51 -0400305 QList<QTreeWidgetItem *> items;
306 for (itr = params.constBegin(); itr != params.constEnd(); ++itr) {
307 QString key = itr.key();
308 QString val;
309
310 variantToString(itr.value(), val);
311 //qDebug()<<"key = "<<key;
312 //qDebug()<<"val = "<<val;
313 QStringList lst;
314 lst += key;
315 lst += val;
316 items.append(new QTreeWidgetItem((QTreeWidget*)0, lst));
317 }
318 m_ui.stateTreeWidget->insertTopLevelItems(0, items);
Zack Rusin7c814f12011-04-09 19:20:58 -0400319
320 QStringList shaderSources = state.shaderSources();
321 if (shaderSources.isEmpty()) {
322 m_sourcesWidget->setShaders(shaderSources);
323 } else {
324 m_sourcesWidget->setShaders(shaderSources);
325 }
326
Zack Rusin09ec4842011-04-10 01:57:17 -0400327 const QList<ApiTexture> &textures =
328 state.textures();
329
Zack Rusin6d554ab2011-04-10 02:47:25 -0400330 m_ui.surfacesTreeWidget->clear();
Zack Rusin09ec4842011-04-10 01:57:17 -0400331 if (textures.isEmpty()) {
Zack Rusin09ec4842011-04-10 01:57:17 -0400332 m_ui.surfacesTab->setDisabled(false);
333 } else {
334 QTreeWidgetItem *textureItem =
335 new QTreeWidgetItem(m_ui.surfacesTreeWidget);
336 m_ui.surfacesTreeWidget->setIconSize(QSize(64, 64));
337 textureItem->setText(0, tr("Textures"));
338 for (int i = 0; i < textures.count(); ++i) {
339 const ApiTexture &texture =
340 textures[i];
341 QIcon icon(QPixmap::fromImage(texture.thumb()));
342 QTreeWidgetItem *item = new QTreeWidgetItem(textureItem);
343 item->setIcon(0, icon);
344 int width = texture.size().width();
345 int height = texture.size().height();
346 QString descr =
347 QString::fromLatin1("%1, %2 x %3")
348 .arg(texture.target())
349 .arg(width)
350 .arg(height);
351 item->setText(1, descr);
352
353 item->setData(0, Qt::UserRole,
354 texture.image());
355 }
356 m_ui.surfacesTab->setEnabled(true);
357 }
Zack Rusin11f7e632011-03-30 22:47:51 -0400358 m_ui.stateDock->show();
359}
360
Zack Rusine1745572011-04-03 14:30:19 -0400361void MainWindow::showSettings()
362{
363 SettingsDialog dialog;
364 dialog.setFilterOptions(m_proxyModel->filterOptions());
365
366 if (dialog.exec() == QDialog::Accepted) {
367 m_proxyModel->setFilterOptions(dialog.filterOptions());
368 }
369}
370
Zack Rusinc97fadc2011-04-07 15:16:59 -0400371void MainWindow::openHelp(const QUrl &url)
372{
373 QDesktopServices::openUrl(url);
374}
375
Zack Rusin09ec4842011-04-10 01:57:17 -0400376void MainWindow::showSurfacesMenu(const QPoint &pos)
377{
378 QTreeWidget *tree = m_ui.surfacesTreeWidget;
379 QTreeWidgetItem *item = tree->itemAt(pos);
380 if (!item)
381 return;
382
383 QMenu menu(tr("Surfaces"), this);
384 //add needed actions
385 QAction *act = menu.addAction(tr("View Image"));
386 act->setStatusTip(tr("View the currently selected surface"));
387 connect(act, SIGNAL(triggered()),
388 SLOT(showSelectedSurface()));
389
390 menu.exec(tree->viewport()->mapToGlobal(pos));
391}
392
393void MainWindow::showSelectedSurface()
394{
395 QTreeWidgetItem *item =
396 m_ui.surfacesTreeWidget->currentItem();
397
398 if (!item)
399 return;
400
401 QVariant var = item->data(0, Qt::UserRole);
402 m_imageViewer->setImage(var.value<QImage>());
403 m_imageViewer->show();
404 m_imageViewer->raise();
405 m_imageViewer->activateWindow();
406}
407
Zack Rusin46678422011-04-10 12:15:46 -0400408void MainWindow::initObjects()
409{
410 m_ui.stateTreeWidget->sortByColumn(0, Qt::AscendingOrder);
411
412 m_sourcesWidget = new ShadersSourceWidget(m_ui.shadersTab);
413 QVBoxLayout *layout = new QVBoxLayout;
414 layout->addWidget(m_sourcesWidget);
415 m_ui.shadersTab->setLayout(layout);
416
417 m_trace = new ApiTrace();
418 m_retracer = new Retracer(this);
419
420 m_vdataInterpreter = new VertexDataInterpreter(this);
421 m_vdataInterpreter->setListWidget(m_ui.vertexDataListWidget);
422 m_vdataInterpreter->setStride(
423 m_ui.vertexStrideSB->value());
424 m_vdataInterpreter->setComponents(
425 m_ui.vertexComponentsSB->value());
426 m_vdataInterpreter->setStartingOffset(
427 m_ui.startingOffsetSB->value());
428 m_vdataInterpreter->setTypeFromString(
429 m_ui.vertexTypeCB->currentText());
430
431 m_imageViewer = new ImageViewer(this);
432
433 m_model = new ApiTraceModel();
434 m_model->setApiTrace(m_trace);
435 m_proxyModel = new ApiTraceFilter();
436 m_proxyModel->setSourceModel(m_model);
437 m_ui.callView->setModel(m_proxyModel);
438 m_ui.callView->setItemDelegate(new ApiCallDelegate);
439 m_ui.callView->resizeColumnToContents(0);
440 m_ui.callView->header()->swapSections(0, 1);
441 m_ui.callView->setColumnWidth(1, 42);
442
443 QToolBar *toolBar = addToolBar(tr("Navigation"));
444 m_filterEdit = new QLineEdit(toolBar);
445 toolBar->addWidget(m_filterEdit);
446
447 m_progressBar = new QProgressBar();
448 m_progressBar->setRange(0, 0);
449 statusBar()->addPermanentWidget(m_progressBar);
450 m_progressBar->hide();
451
452 m_ui.detailsDock->hide();
453 m_ui.vertexDataDock->hide();
454 m_ui.stateDock->hide();
455 setDockOptions(dockOptions() | QMainWindow::ForceTabbedDocks);
456
457 tabifyDockWidget(m_ui.stateDock, m_ui.vertexDataDock);
458
459 m_ui.surfacesTreeWidget->setContextMenuPolicy(Qt::CustomContextMenu);
460
461 m_ui.detailsWebView->page()->setLinkDelegationPolicy(
462 QWebPage::DelegateExternalLinks);
463}
464
465void MainWindow::initConnections()
466{
467 connect(m_trace, SIGNAL(startedLoadingTrace()),
468 this, SLOT(startedLoadingTrace()));
469 connect(m_trace, SIGNAL(finishedLoadingTrace()),
470 this, SLOT(finishedLoadingTrace()));
471
472 connect(m_retracer, SIGNAL(finished(const QByteArray&)),
473 this, SLOT(replayFinished(const QByteArray&)));
474 connect(m_retracer, SIGNAL(error(const QString&)),
475 this, SLOT(replayError(const QString&)));
476
477 connect(m_ui.vertexInterpretButton, SIGNAL(clicked()),
478 m_vdataInterpreter, SLOT(interpretData()));
479 connect(m_ui.vertexTypeCB, SIGNAL(currentIndexChanged(const QString&)),
480 m_vdataInterpreter, SLOT(setTypeFromString(const QString&)));
481 connect(m_ui.vertexStrideSB, SIGNAL(valueChanged(int)),
482 m_vdataInterpreter, SLOT(setStride(int)));
483 connect(m_ui.vertexComponentsSB, SIGNAL(valueChanged(int)),
484 m_vdataInterpreter, SLOT(setComponents(int)));
485 connect(m_ui.startingOffsetSB, SIGNAL(valueChanged(int)),
486 m_vdataInterpreter, SLOT(setStartingOffset(int)));
487
488
489 connect(m_ui.actionOpen, SIGNAL(triggered()),
490 this, SLOT(openTrace()));
491 connect(m_ui.actionQuit, SIGNAL(triggered()),
492 this, SLOT(close()));
493
494 connect(m_ui.actionReplay, SIGNAL(triggered()),
495 this, SLOT(replayStart()));
496 connect(m_ui.actionStop, SIGNAL(triggered()),
497 this, SLOT(replayStop()));
498 connect(m_ui.actionLookupState, SIGNAL(triggered()),
499 this, SLOT(lookupState()));
500 connect(m_ui.actionOptions, SIGNAL(triggered()),
501 this, SLOT(showSettings()));
502
503 connect(m_ui.callView, SIGNAL(activated(const QModelIndex &)),
504 this, SLOT(callItemSelected(const QModelIndex &)));
505 connect(m_filterEdit, SIGNAL(returnPressed()),
506 this, SLOT(filterTrace()));
507
508 connect(m_ui.surfacesTreeWidget,
509 SIGNAL(customContextMenuRequested(const QPoint &)),
510 SLOT(showSurfacesMenu(const QPoint &)));
511 connect(m_ui.surfacesTreeWidget,
512 SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)),
513 SLOT(showSelectedSurface()));
514
515 connect(m_ui.detailsWebView, SIGNAL(linkClicked(const QUrl&)),
516 this, SLOT(openHelp(const QUrl&)));
517}
518
Zack Rusin601e8372011-03-24 22:23:21 -0400519#include "mainwindow.moc"