this, SLOT(replayError(const QString&)));
connect(m_retracer, SIGNAL(foundState(const ApiTraceState&)),
this, SLOT(replayStateFound(const ApiTraceState&)));
+ connect(m_retracer, SIGNAL(retraceErrors(const QList<RetraceError>&)),
+ this, SLOT(slotRetraceErrors(const QList<RetraceError>&)));
connect(m_ui.vertexInterpretButton, SIGNAL(clicked()),
m_vdataInterpreter, SLOT(interpretData()));
}
}
+void MainWindow::slotRetraceErrors(const QList<RetraceError> &errors)
+{
+ m_ui.errorsTreeWidget->clear();
+
+ foreach(RetraceError error, errors) {
+ ApiTraceCall *call = m_trace->callWithIndex(error.callIndex);
+ if (!call)
+ continue;
+ call->setError(error.message);
+
+ QTreeWidgetItem *item =
+ new QTreeWidgetItem(m_ui.errorsTreeWidget);
+ item->setData(0, Qt::DisplayRole, error.callIndex);
+ item->setData(0, Qt::UserRole, QVariant::fromValue(call));
+ QString type = error.type;
+ type[0] = type[0].toUpper();
+ item->setData(1, Qt::DisplayRole, type);
+ item->setData(2, Qt::DisplayRole, error.message);
+ }
+
+ m_ui.errorsDock->setVisible(!errors.isEmpty());
+}
+
#include "mainwindow.moc"
class QModelIndex;
class QProgressBar;
class QUrl;
+class RetraceError;
class Retracer;
class SearchWidget;
class ShadersSourceWidget;
void slotGoFrameStart();
void slotGoFrameEnd();
void slotTraceChanged(ApiTraceCall *call);
+ void slotRetraceErrors(const QList<RetraceError> &errors);
private:
void initObjects();
this, SIGNAL(error(const QString&)));
connect(retrace, SIGNAL(foundState(const ApiTraceState&)),
this, SIGNAL(foundState(const ApiTraceState&)));
+ connect(retrace, SIGNAL(retraceErrors(const QList<RetraceError>&)),
+ this, SIGNAL(retraceErrors(const QList<RetraceError>&)));
retrace->start();
{
QByteArray output = m_process->readAllStandardOutput();
QString msg;
+ QString errStr = m_process->readAllStandardError();
#if 0
qDebug()<<"Process finished = ";
- qDebug()<<"\terr = "<<m_process->readAllStandardError();
+ qDebug()<<"\terr = "<<errStr;
qDebug()<<"\tout = "<<output;
#endif
if (m_captureState) {
msg = QString::fromUtf8(output);
}
+ QStringList errorLines = errStr.split('\n');
+ QList<RetraceError> errors;
+ QRegExp regexp("(^\\d+): +(\\b\\w+\\b): (.+$)");
+ foreach(QString line, errorLines) {
+ if (regexp.indexIn(line) != -1) {
+ RetraceError error;
+ error.callIndex = regexp.cap(1).toInt();
+ error.type = regexp.cap(2);
+ error.message = regexp.cap(3);
+ errors.append(error);
+ }
+ }
+ if (!errors.isEmpty()) {
+ emit retraceErrors(errors);
+ }
emit finished(msg);
}
tr("Couldn't execute the replay file '%1'").arg(m_fileName));
}
-
+Q_DECLARE_METATYPE(QList<RetraceError>);
RetraceProcess::RetraceProcess(QObject *parent)
: QObject(parent)
{
m_process = new QProcess(this);
m_jsonParser = new QJson::Parser();
+ qRegisterMetaType<QList<RetraceError> >();
+
connect(m_process, SIGNAL(finished(int, QProcess::ExitStatus)),
this, SLOT(replayFinished()));
connect(m_process, SIGNAL(error(QProcess::ProcessError)),
class Parser;
}
+struct RetraceError {
+ int callIndex;
+ QString type;
+ QString message;
+};
+
/* internal class used by the retracer to run
* in the thread */
class RetraceProcess : public QObject
void finished(const QString &output);
void error(const QString &msg);
void foundState(const ApiTraceState &state);
+ void retraceErrors(const QList<RetraceError> &errors);
private slots:
void replayFinished();
void finished(const QString &output);
void foundState(const ApiTraceState &state);
void error(const QString &msg);
+ void retraceErrors(const QList<RetraceError> &errors);
protected:
virtual void run();