diff --git a/qrenderdoc/Windows/ConstantBufferPreviewer.ui b/qrenderdoc/Windows/ConstantBufferPreviewer.ui index 118a76d43..adace34c4 100644 --- a/qrenderdoc/Windows/ConstantBufferPreviewer.ui +++ b/qrenderdoc/Windows/ConstantBufferPreviewer.ui @@ -149,6 +149,9 @@ + + Export to CSV + diff --git a/qrenderdoc/Windows/PerformanceCounterViewer.cpp b/qrenderdoc/Windows/PerformanceCounterViewer.cpp index 3c3464a4a..f2047a045 100644 --- a/qrenderdoc/Windows/PerformanceCounterViewer.cpp +++ b/qrenderdoc/Windows/PerformanceCounterViewer.cpp @@ -37,6 +37,7 @@ PerformanceCounterViewer::PerformanceCounterViewer(ICaptureContext &ctx, QWidget &PerformanceCounterViewer::CaptureCounters); ui->captureCounters->setEnabled(m_Ctx.LogLoaded()); + ui->saveCSV->setEnabled(m_Ctx.LogLoaded()); } PerformanceCounterViewer::~PerformanceCounterViewer() @@ -181,11 +182,13 @@ void PerformanceCounterViewer::CaptureCounters() void PerformanceCounterViewer::OnLogfileClosed() { ui->captureCounters->setEnabled(false); + ui->saveCSV->setEnabled(false); } void PerformanceCounterViewer::OnLogfileLoaded() { ui->captureCounters->setEnabled(true); + ui->saveCSV->setEnabled(true); } void PerformanceCounterViewer::on_counterResults_doubleClicked(const QModelIndex &index) @@ -201,3 +204,61 @@ void PerformanceCounterViewer::on_counterResults_doubleClicked(const QModelIndex m_Ctx.SetEventID({}, eid, eid); } } + +void PerformanceCounterViewer::on_saveCSV_clicked() +{ + QString filename = RDDialog::getSaveFileName(this, tr("Export counter results as CSV"), QString(), + tr("CSV Files (*.csv)")); + + if(!filename.isEmpty()) + { + QDir dirinfo = QFileInfo(filename).dir(); + if(dirinfo.exists()) + { + QFile f(filename, this); + if(f.open(QIODevice::WriteOnly | QIODevice::Truncate)) + { + QTextStream ts(&f); + + for(int col = 0; col < ui->counterResults->columnCount(); col++) + { + ts << ui->counterResults->horizontalHeaderItem(col)->text(); + + if(col == ui->counterResults->columnCount() - 1) + ts << lit("\n"); + else + ts << lit(","); + } + + for(int row = 0; row < ui->counterResults->rowCount(); row++) + { + for(int col = 0; col < ui->counterResults->columnCount(); col++) + { + QTableWidgetItem *item = ui->counterResults->item(row, col); + + if(item) + ts << item->text(); + else + ts << lit("-"); + + if(col == ui->counterResults->columnCount() - 1) + ts << lit("\n"); + else + ts << lit(","); + } + } + + return; + } + + RDDialog::critical( + this, tr("Error exporting counter results"), + tr("Couldn't open path %1 for write.\n%2").arg(filename).arg(f.errorString())); + } + else + { + RDDialog::critical(this, tr("Invalid directory"), + tr("Cannot find target directory to save to")); + } + } +} diff --git a/qrenderdoc/Windows/PerformanceCounterViewer.h b/qrenderdoc/Windows/PerformanceCounterViewer.h index 945733b11..31ead3935 100644 --- a/qrenderdoc/Windows/PerformanceCounterViewer.h +++ b/qrenderdoc/Windows/PerformanceCounterViewer.h @@ -50,6 +50,7 @@ public: private slots: // automatic slots void on_counterResults_doubleClicked(const QModelIndex &index); + void on_saveCSV_clicked(); private: QString FormatCounterResult(const CounterResult &result, const CounterDescription &description); diff --git a/qrenderdoc/Windows/PerformanceCounterViewer.ui b/qrenderdoc/Windows/PerformanceCounterViewer.ui index c90a61e4e..75243a45c 100644 --- a/qrenderdoc/Windows/PerformanceCounterViewer.ui +++ b/qrenderdoc/Windows/PerformanceCounterViewer.ui @@ -44,10 +44,58 @@ 6 - - - Capture counters + + + QFrame::Panel + + QFrame::Raised + + + + 2 + + + 6 + + + 2 + + + 6 + + + 2 + + + + + Capture counters + + + + + + + Qt::Vertical + + + + + + + Export to CSV + + + + :/save.png:/save.png + + + true + + + + @@ -90,6 +138,8 @@
Widgets/Extended/RDTableWidget.h
- + + +