From 27cb2c4e9d10cfd6236162b6f84109a5ca2eda49 Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Sun, 27 Mar 2011 23:53:36 -0400 Subject: [PATCH] Allow retracing from the gui plus make the call list cleaner. --- gui/CMakeLists.txt | 1 + gui/apitracecall.cpp | 39 +++++++++------ gui/apitracecall.h | 4 +- gui/mainwindow.cpp | 112 +++++++++++++++++++++++++++++++++++++++++-- gui/mainwindow.h | 13 +++++ gui/ui/mainwindow.ui | 67 +++++++++++++++++++++++++- 6 files changed, 215 insertions(+), 21 deletions(-) diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index d4c462a..86f60d9 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -18,6 +18,7 @@ QT4_WRAP_UI(qapitrace_UIS_H ${qapitrace_UIS}) #add_app_icon(qapitrace_SRCS ../icons/hi*-qapitrace.png) include_directories(${QT_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/..) +add_definitions(-DBUILD_DIR="${CMAKE_CURRENT_BINARY_DIR}/..") add_executable(qapitrace ${qapitrace_SRCS} ${qapitrace_UIS_H}) diff --git a/gui/apitracecall.cpp b/gui/apitracecall.cpp index f5a5ff7..313d9ea 100644 --- a/gui/apitracecall.cpp +++ b/gui/apitracecall.cpp @@ -227,9 +227,33 @@ void ApiArray::init(const Trace::Array *arr) QStaticText ApiTraceCall::staticText() const { - if (!m_richText.isEmpty()) + if (!m_staticText.text().isEmpty()) return m_staticText; + QString richText = QString::fromLatin1("%1(").arg(name); + for (int i = 0; i < argNames.count(); ++i) { + richText += QLatin1String(""); + richText += apiVariantToString(argValues[i]); + richText += QLatin1String(""); + if (i < argNames.count() - 1) + richText += QString::fromLatin1(", "); + } + richText += QLatin1String(")"); + + m_staticText.setText(richText); + QTextOption opt; + opt.setWrapMode(QTextOption::NoWrap); + m_staticText.setTextOption(opt); + m_staticText.prepare(); + + return m_staticText; +} + +QString ApiTraceCall::toHtml() const +{ + if (!m_richText.isEmpty()) + return m_richText; + m_richText = QString::fromLatin1("%1(").arg(name); for (int i = 0; i < argNames.count(); ++i) { m_richText += argNames[i]; @@ -248,19 +272,6 @@ QStaticText ApiTraceCall::staticText() const m_richText += apiVariantToString(returnValue); m_richText += QLatin1String(""); } - - m_staticText.setText(m_richText); - QTextOption opt; - opt.setWrapMode(QTextOption::NoWrap); - m_staticText.setTextOption(opt); - m_staticText.prepare(); - - return m_staticText; -} - -QString ApiTraceCall::richText() const -{ - staticText(); return m_richText; } diff --git a/gui/apitracecall.h b/gui/apitracecall.h index e47a88d..8b925e8 100644 --- a/gui/apitracecall.h +++ b/gui/apitracecall.h @@ -106,13 +106,13 @@ public: QVariantList argValues; QVariant returnValue; + QString toHtml() const; QString filterText() const; - QString richText() const; QStaticText staticText() const; private: mutable QString m_richText; - mutable QStaticText m_staticText; mutable QString m_filterText; + mutable QStaticText m_staticText; }; Q_DECLARE_METATYPE(ApiTraceCall); Q_DECLARE_METATYPE(ApiTraceCall*); diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 4382def..74d9f94 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -8,14 +8,17 @@ #include #include #include -#include #include +#include +#include +#include #include #include MainWindow::MainWindow() - : QMainWindow() + : QMainWindow(), + m_replayProcess(0) { m_ui.setupUi(this); @@ -35,6 +38,14 @@ MainWindow::MainWindow() connect(m_ui.actionOpen, SIGNAL(triggered()), this, SLOT(openTrace())); + connect(m_ui.actionQuit, SIGNAL(triggered()), + this, SLOT(close())); + + connect(m_ui.actionReplay, SIGNAL(triggered()), + this, SLOT(replayStart())); + connect(m_ui.actionStop, SIGNAL(triggered()), + this, SLOT(replayStop())); + connect(m_ui.callView, SIGNAL(activated(const QModelIndex &)), this, SLOT(callItemSelected(const QModelIndex &))); connect(m_filterEdit, SIGNAL(returnPressed()), @@ -52,21 +63,28 @@ void MainWindow::openTrace() qDebug()<< "File name : " <loadTraceFile(fileName); } void MainWindow::loadTrace(const QString &fileName) { + if (!QFile::exists(fileName)) { + QMessageBox::warning(this, tr("File Missing"), + tr("File '%1' doesn't exist.").arg(fileName)); + return; + } qDebug()<< "Loading : " <loadTraceFile(fileName); + newTraceFile(fileName); } void MainWindow::callItemSelected(const QModelIndex &index) { ApiTraceCall *call = index.data().value(); if (call) { - m_ui.detailsWebView->setHtml(call->richText()); + m_ui.detailsWebView->setHtml(call->toHtml()); m_ui.detailsDock->show(); } else { m_ui.detailsDock->hide(); @@ -78,4 +96,92 @@ void MainWindow::filterTrace() m_proxyModel->setFilterString(m_filterEdit->text()); } +void MainWindow::replayStart() +{ + if (!m_replayProcess) { +#ifdef Q_OS_WIN + QString format = QLatin1String("%1;"); +#else + QString format = QLatin1String("%1:"); +#endif + QString buildPath = format.arg(BUILD_DIR); + QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); + env.insert("PATH", buildPath + env.value("PATH")); + + qputenv("PATH", env.value("PATH").toLatin1()); + + m_replayProcess = new QProcess(this); + m_replayProcess->setProcessEnvironment(env); + + connect(m_replayProcess, SIGNAL(finished(int, QProcess::ExitStatus)), + this, SLOT(replayFinished())); + connect(m_replayProcess, SIGNAL(error(QProcess::ProcessError)), + this, SLOT(replayError(QProcess::ProcessError))); + } + + if (m_traceFileName.isEmpty()) + return; + + QStringList arguments; + arguments << m_traceFileName; + + m_replayProcess->start(QLatin1String("glretrace"), + arguments); + + m_ui.actionStop->setEnabled(true); + m_ui.actionReplay->setEnabled(false); +} + +void MainWindow::replayStop() +{ + if (m_replayProcess) { + m_replayProcess->kill(); + + m_ui.actionStop->setEnabled(false); + m_ui.actionReplay->setEnabled(true); + } +} + +void MainWindow::newTraceFile(const QString &fileName) +{ + m_traceFileName = fileName; + + if (m_traceFileName.isEmpty()) { + m_ui.actionReplay->setEnabled(false); + } else { + m_ui.actionReplay->setEnabled(true); + } +} + +void MainWindow::replayFinished() +{ + m_ui.actionStop->setEnabled(false); + m_ui.actionReplay->setEnabled(true); + + QString output = m_replayProcess->readAllStandardOutput(); + +#if 0 + qDebug()<<"Process finished = "; + qDebug()<<"\terr = "<readAllStandardError(); + qDebug()<<"\tout = "<showMessage(output); + } +} + +void MainWindow::replayError(QProcess::ProcessError err) +{ + m_ui.actionStop->setEnabled(false); + m_ui.actionReplay->setEnabled(true); + + qDebug()<<"Process error = "< +#include class ApiTraceModel; class ApiTraceFilter; class QLineEdit; class QModelIndex; +class QProcess; class MainWindow : public QMainWindow { @@ -24,12 +26,23 @@ private slots: void callItemSelected(const QModelIndex &index); void openTrace(); void filterTrace(); + void replayStart(); + void replayStop(); + void replayFinished(); + void replayError(QProcess::ProcessError err); + +private: + void newTraceFile(const QString &fileName); private: Ui_MainWindow m_ui; ApiTraceModel *m_model; ApiTraceFilter *m_proxyModel; QLineEdit *m_filterEdit; + + QProcess *m_replayProcess; + + QString m_traceFileName; }; diff --git a/gui/ui/mainwindow.ui b/gui/ui/mainwindow.ui index e509cb6..a6f17b3 100644 --- a/gui/ui/mainwindow.ui +++ b/gui/ui/mainwindow.ui @@ -38,11 +38,21 @@ - File + &File + + + + + + &Trace + + + + @@ -92,8 +102,61 @@ + + + + + + + &Open... + + + Ctrl+O + + + + + + + + + + &Quit + + + Ctrl+Q + + + Qt::ApplicationShortcut + + + QAction::QuitRole + + + + + false + + + + + + + + &Replay + + + + + false + + + + + + - Open + &Stop -- 2.43.0