diff --git a/qrenderdoc/Code/QRDUtils.cpp b/qrenderdoc/Code/QRDUtils.cpp index f380d3085..1dca6fdc8 100644 --- a/qrenderdoc/Code/QRDUtils.cpp +++ b/qrenderdoc/Code/QRDUtils.cpp @@ -2533,6 +2533,18 @@ QString RDDialog::getSaveFileName(QWidget *parent, const QString &caption, const return QString(); } +void RDDialog::closeEvent(QCloseEvent *e) +{ + emit(aboutToClose(e)); + QDialog::closeEvent(e); +} + +void RDDialog::keyPressEvent(QKeyEvent *e) +{ + emit(keyPress(e)); + QDialog::keyPressEvent(e); +} + bool QFileFilterModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const { QModelIndex idx = sourceModel()->index(source_row, 0, source_parent); diff --git a/qrenderdoc/Code/QRDUtils.h b/qrenderdoc/Code/QRDUtils.h index 521d0c544..30428c558 100644 --- a/qrenderdoc/Code/QRDUtils.h +++ b/qrenderdoc/Code/QRDUtils.h @@ -917,8 +917,12 @@ public: class QMenu; // helper for doing a manual blocking invoke of a dialog -struct RDDialog +class RDDialog : public QDialog { +private: + Q_OBJECT + +public: static const QMessageBox::StandardButtons YesNoCancel; static QString DefaultBrowsePath; @@ -995,6 +999,14 @@ struct RDDialog const QString &dir = QString(), const QString &filter = QString(), QString *selectedFilter = NULL, QFileDialog::Options options = QFileDialog::Options()); + +signals: + void aboutToClose(QCloseEvent *); + void keyPress(QKeyEvent *e); + +private: + void closeEvent(QCloseEvent *) override; + void keyPressEvent(QKeyEvent *e) override; }; class QGridLayout; diff --git a/qrenderdoc/Windows/MainWindow.cpp b/qrenderdoc/Windows/MainWindow.cpp index 1335dd9b3..8180c3883 100644 --- a/qrenderdoc/Windows/MainWindow.cpp +++ b/qrenderdoc/Windows/MainWindow.cpp @@ -2588,7 +2588,7 @@ void MainWindow::on_action_Start_Replay_Loop_triggered() if(!m_Ctx.IsCaptureLoaded()) return; - QDialog popup; + RDDialog popup; popup.setWindowFlags(popup.windowFlags() & ~Qt::WindowContextHelpButtonHint); popup.setWindowIcon(windowIcon()); @@ -2651,6 +2651,13 @@ void MainWindow::on_action_Start_Replay_Loop_triggered() m_Ctx.Replay().AsyncInvoke([winData, id](IReplayController *r) { r->ReplayLoop(winData, id); }); + QObject::connect(&popup, &RDDialog::aboutToClose, + [this](QCloseEvent *) { m_Ctx.Replay().CancelReplayLoop(); }); + QObject::connect(&popup, &RDDialog::keyPress, [this](QKeyEvent *e) { + if(e->matches(QKeySequence::Cancel)) + m_Ctx.Replay().CancelReplayLoop(); + }); + RDDialog::show(&popup); m_Ctx.Replay().CancelReplayLoop();