diff --git a/qrenderdoc/Code/CaptureContext.cpp b/qrenderdoc/Code/CaptureContext.cpp index 7c1dc1044..0ada81c3e 100644 --- a/qrenderdoc/Code/CaptureContext.cpp +++ b/qrenderdoc/Code/CaptureContext.cpp @@ -33,7 +33,10 @@ #include #include #include +#include "Windows/Dialogs/CaptureDialog.h" +#include "Windows/EventBrowser.h" #include "Windows/MainWindow.h" +#include "Windows/TextureViewer.h" #include "QRDUtils.h" CaptureContext::CaptureContext(QString paramFilename, QString remoteHost, uint32_t remoteIdent, @@ -391,3 +394,74 @@ void *CaptureContext::FillWindowingData(WId widget) #endif } + +EventBrowser *CaptureContext::eventBrowser() +{ + if(m_EventBrowser) + return m_EventBrowser; + + m_EventBrowser = new EventBrowser(this, m_MainWindow); + m_EventBrowser->setObjectName("eventBrowser"); + + return m_EventBrowser; +} + +TextureViewer *CaptureContext::textureViewer() +{ + if(m_TextureViewer) + return m_TextureViewer; + + m_TextureViewer = new TextureViewer(this, m_MainWindow); + m_TextureViewer->setObjectName("textureViewer"); + + return m_TextureViewer; +} + +CaptureDialog *CaptureContext::captureDialog() +{ + if(m_CaptureDialog) + return m_CaptureDialog; + + m_CaptureDialog = new CaptureDialog( + this, + [this](const QString &exe, const QString &workingDir, const QString &cmdLine, + const QList &env, CaptureOptions opts) { + return m_MainWindow->OnCaptureTrigger(exe, workingDir, cmdLine, env, opts); + }, + [this](uint32_t PID, const QList &env, const QString &name, + CaptureOptions opts) { return m_MainWindow->OnInjectTrigger(PID, env, name, opts); }, + m_MainWindow); + m_CaptureDialog->setObjectName("capDialog"); + + return m_CaptureDialog; +} + +QWidget *CaptureContext::createToolWindow(const QString &objectName) +{ + if(objectName == "textureViewer") + { + return textureViewer(); + } + else if(objectName == "eventBrowser") + { + return eventBrowser(); + } + else if(objectName == "capDialog") + { + return captureDialog(); + } + + return NULL; +} + +void CaptureContext::windowClosed(QWidget *window) +{ + if((QWidget *)m_EventBrowser == window) + m_EventBrowser = NULL; + else if((QWidget *)m_TextureViewer == window) + m_TextureViewer = NULL; + else if((QWidget *)m_CaptureDialog == window) + m_CaptureDialog = NULL; + else + qCritical() << "Unrecognised window being closed: " << window; +} diff --git a/qrenderdoc/Code/CaptureContext.h b/qrenderdoc/Code/CaptureContext.h index cced3a097..05c647460 100644 --- a/qrenderdoc/Code/CaptureContext.h +++ b/qrenderdoc/Code/CaptureContext.h @@ -46,6 +46,9 @@ struct ILogViewerForm }; class MainWindow; +class EventBrowser; +class TextureViewer; +class CaptureDialog; class QProgressDialog; struct Formatter @@ -90,19 +93,6 @@ public: } void RemoveLogViewer(ILogViewerForm *f) { m_LogViewers.removeAll(f); } - ////////////////////////////////////////////////////////////////////////////// - // Singleton windows - - /* - private MainWindow m_MainWindow = null; - private EventBrowser m_EventBrowser = null; - private APIInspector m_APIInspector = null; - private DebugMessages m_DebugMessages = null; - private TimelineBar m_TimelineBar = null; - private TextureViewer m_TextureViewer = null; - private PipelineStateViewer m_PipelineStateViewer = null; - */ - ////////////////////////////////////////////////////////////////////////////// // Accessors @@ -133,6 +123,17 @@ public: WindowingSystem m_CurWinSystem; void *FillWindowingData(WId widget); + MainWindow *mainWindow() { return m_MainWindow; } + EventBrowser *eventBrowser(); + TextureViewer *textureViewer(); + CaptureDialog *captureDialog(); + + bool hasEventBrowser() { return m_EventBrowser != NULL; } + bool hasTextureViewer() { return m_TextureViewer != NULL; } + bool hasCaptureDialog() { return m_CaptureDialog != NULL; } + QWidget *createToolWindow(const QString &objectName); + void windowClosed(QWidget *window); + D3D11PipelineState CurD3D11PipelineState; D3D12PipelineState CurD3D12PipelineState; GLPipelineState CurGLPipelineState; @@ -191,5 +192,8 @@ private: // Windows QProgressDialog *m_Progress; - MainWindow *m_MainWindow; + MainWindow *m_MainWindow = NULL; + EventBrowser *m_EventBrowser = NULL; + TextureViewer *m_TextureViewer = NULL; + CaptureDialog *m_CaptureDialog = NULL; }; diff --git a/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp b/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp index dfd4ae105..62fa56c0a 100644 --- a/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp +++ b/qrenderdoc/Windows/Dialogs/CaptureDialog.cpp @@ -167,6 +167,8 @@ CaptureDialog::CaptureDialog(CaptureContext *ctx, OnCaptureMethod captureCallbac CaptureDialog::~CaptureDialog() { + m_Ctx->windowClosed(this); + if(ui->toggleGlobal->isChecked()) { ui->toggleGlobal->setChecked(false); diff --git a/qrenderdoc/Windows/EventBrowser.cpp b/qrenderdoc/Windows/EventBrowser.cpp index 33884007e..e4397719d 100644 --- a/qrenderdoc/Windows/EventBrowser.cpp +++ b/qrenderdoc/Windows/EventBrowser.cpp @@ -86,6 +86,7 @@ EventBrowser::EventBrowser(CaptureContext *ctx, QWidget *parent) EventBrowser::~EventBrowser() { + m_Ctx->windowClosed(this); m_Ctx->RemoveLogViewer(this); delete ui; delete m_SizeDelegate; diff --git a/qrenderdoc/Windows/MainWindow.cpp b/qrenderdoc/Windows/MainWindow.cpp index a5647a529..8d072ba09 100644 --- a/qrenderdoc/Windows/MainWindow.cpp +++ b/qrenderdoc/Windows/MainWindow.cpp @@ -55,18 +55,6 @@ struct Version static bool isMismatched() { return RENDERDOC_GetVersionString() != bareString(); } }; -void MainWindow::ShowLiveCapture(LiveCapture *live) -{ - m_LiveCaptures.push_back(live); - ui->toolWindowManager->addToolWindow( - live, ToolWindowManager::AreaReference(ToolWindowManager::LastUsedArea)); -} - -void MainWindow::LiveCaptureClosed(LiveCapture *live) -{ - m_LiveCaptures.removeOne(live); -} - MainWindow::MainWindow(CaptureContext *ctx) : QMainWindow(NULL), ui(new Ui::MainWindow), m_Ctx(ctx) { ui->setupUi(this); @@ -128,25 +116,7 @@ MainWindow::MainWindow(CaptureContext *ctx) : QMainWindow(NULL), ui(new Ui::Main ui->toolWindowManager->setRubberBandLineWidth(50); ui->toolWindowManager->setToolWindowCreateCallback([this](const QString &objectName) -> QWidget * { - if(objectName == "textureViewer") - { - TextureViewer *textureViewer = new TextureViewer(m_Ctx); - textureViewer->setObjectName("textureViewer"); - return textureViewer; - } - else if(objectName == "eventBrowser") - { - EventBrowser *eventBrowser = new EventBrowser(m_Ctx); - eventBrowser->setObjectName("eventBrowser"); - return eventBrowser; - } - else if(objectName == "capDialog") - { - CaptureDialog *capDialog = this->createCaptureDialog(); - return capDialog; - } - - return NULL; + return m_Ctx->createToolWindow(objectName); }); bool loaded = LoadLayout(0); @@ -154,20 +124,18 @@ MainWindow::MainWindow(CaptureContext *ctx) : QMainWindow(NULL), ui(new Ui::Main // create default layout if layout failed to load if(!loaded) { - EventBrowser *eventBrowser = new EventBrowser(m_Ctx, this); - eventBrowser->setObjectName("eventBrowser"); + EventBrowser *eventBrowser = m_Ctx->eventBrowser(); ui->toolWindowManager->addToolWindow(eventBrowser, ToolWindowManager::EmptySpace); - TextureViewer *textureViewer = new TextureViewer(m_Ctx, this); - textureViewer->setObjectName("textureViewer"); + TextureViewer *textureViewer = m_Ctx->textureViewer(); ui->toolWindowManager->addToolWindow( textureViewer, ToolWindowManager::AreaReference(ToolWindowManager::RightOf, ui->toolWindowManager->areaOf(eventBrowser), 0.75f)); - CaptureDialog *capDialog = createCaptureDialog(); + CaptureDialog *capDialog = m_Ctx->captureDialog(); ui->toolWindowManager->addToolWindow( capDialog, ToolWindowManager::AreaReference(ToolWindowManager::AddTo, @@ -466,14 +434,15 @@ void MainWindow::LoadLogfile(const QString &filename, bool temporary, bool local void MainWindow::OpenCaptureConfigFile(const QString &filename, bool exe) { - CaptureDialog *capDialog = createCaptureDialog(); + CaptureDialog *capDialog = m_Ctx->captureDialog(); if(exe) capDialog->setExecutableFilename(filename); else capDialog->loadSettings(filename); - ui->toolWindowManager->addToolWindow(capDialog, ToolWindowManager::EmptySpace); + if(!ui->toolWindowManager->toolWindows().contains(capDialog)) + ui->toolWindowManager->addToolWindow(capDialog, mainToolArea()); } QString MainWindow::GetSavePath() @@ -607,21 +576,6 @@ void MainWindow::CloseLogfile() ui->action_Save_Log->setEnabled(false); } -CaptureDialog *MainWindow::createCaptureDialog() -{ - CaptureDialog *ret = new CaptureDialog( - m_Ctx, - [this](const QString &exe, const QString &workingDir, const QString &cmdLine, - const QList &env, CaptureOptions opts) { - return this->OnCaptureTrigger(exe, workingDir, cmdLine, env, opts); - }, - [this](uint32_t PID, const QList &env, const QString &name, - CaptureOptions opts) { return this->OnInjectTrigger(PID, env, name, opts); }, - this); - ret->setObjectName("capDialog"); - return ret; -} - void MainWindow::SetTitle(const QString &filename) { QString prefix = ""; @@ -698,6 +652,50 @@ void MainWindow::PopulateRecentCaptures() ui->menu_Recent_Capture_Settings->addAction(ui->action_Clear_Log_History); } +void MainWindow::ShowLiveCapture(LiveCapture *live) +{ + m_LiveCaptures.push_back(live); + ui->toolWindowManager->addToolWindow(live, mainToolArea()); +} + +void MainWindow::LiveCaptureClosed(LiveCapture *live) +{ + m_LiveCaptures.removeOne(live); +} + +ToolWindowManager::AreaReference MainWindow::mainToolArea() +{ + // bit of a hack. Maybe the ToolWindowManager should track this? + // Try and identify where to add new windows, by searching a + // priority list of other windows to use their area + if(m_Ctx->hasTextureViewer() && + ui->toolWindowManager->toolWindows().contains(m_Ctx->textureViewer())) + return ToolWindowManager::AreaReference(ToolWindowManager::AddTo, + ui->toolWindowManager->areaOf(m_Ctx->textureViewer())); + else if(m_Ctx->hasCaptureDialog() && + ui->toolWindowManager->toolWindows().contains(m_Ctx->captureDialog())) + return ToolWindowManager::AreaReference(ToolWindowManager::AddTo, + ui->toolWindowManager->areaOf(m_Ctx->captureDialog())); + + // if all else fails just add to the last place we placed something. + return ToolWindowManager::AreaReference(ToolWindowManager::LastUsedArea); +} + +ToolWindowManager::AreaReference MainWindow::leftToolArea() +{ + // see mainToolArea() + if(m_Ctx->hasTextureViewer() && + ui->toolWindowManager->toolWindows().contains(m_Ctx->textureViewer())) + return ToolWindowManager::AreaReference(ToolWindowManager::LeftOf, + ui->toolWindowManager->areaOf(m_Ctx->textureViewer())); + else if(m_Ctx->hasCaptureDialog() && + ui->toolWindowManager->toolWindows().contains(m_Ctx->captureDialog())) + return ToolWindowManager::AreaReference(ToolWindowManager::LeftOf, + ui->toolWindowManager->areaOf(m_Ctx->captureDialog())); + + return ToolWindowManager::AreaReference(ToolWindowManager::LastUsedArea); +} + void MainWindow::recentLog(const QString &filename) { if(QFileInfo::exists(filename)) @@ -829,38 +827,48 @@ void MainWindow::on_action_Mesh_Output_triggered() // TODO Mesh view } -void MainWindow::on_action_Event_Viewer_triggered() +void MainWindow::on_action_Event_Browser_triggered() { - EventBrowser *eventBrowser = new EventBrowser(m_Ctx, this); - eventBrowser->setObjectName("eventBrowser"); + EventBrowser *eventBrowser = m_Ctx->eventBrowser(); - ui->toolWindowManager->addToolWindow(eventBrowser, ToolWindowManager::EmptySpace); + if(ui->toolWindowManager->toolWindows().contains(eventBrowser)) + eventBrowser->activateWindow(); + else + ui->toolWindowManager->addToolWindow(eventBrowser, leftToolArea()); } void MainWindow::on_action_Texture_Viewer_triggered() { - TextureViewer *textureViewer = new TextureViewer(m_Ctx, this); - textureViewer->setObjectName("textureViewer"); + TextureViewer *textureViewer = m_Ctx->textureViewer(); - ui->toolWindowManager->addToolWindow(textureViewer, ToolWindowManager::EmptySpace); + if(ui->toolWindowManager->toolWindows().contains(textureViewer)) + textureViewer->activateWindow(); + else + ui->toolWindowManager->addToolWindow(textureViewer, mainToolArea()); } void MainWindow::on_action_Capture_Log_triggered() { - CaptureDialog *capDialog = createCaptureDialog(); - - ui->toolWindowManager->addToolWindow(capDialog, ToolWindowManager::EmptySpace); + CaptureDialog *capDialog = m_Ctx->captureDialog(); capDialog->setInjectMode(false); + + if(ui->toolWindowManager->toolWindows().contains(capDialog)) + capDialog->activateWindow(); + else + ui->toolWindowManager->addToolWindow(capDialog, mainToolArea()); } void MainWindow::on_action_Inject_into_Process_triggered() { - CaptureDialog *capDialog = createCaptureDialog(); - - ui->toolWindowManager->addToolWindow(capDialog, ToolWindowManager::EmptySpace); + CaptureDialog *capDialog = m_Ctx->captureDialog(); capDialog->setInjectMode(true); + + if(ui->toolWindowManager->toolWindows().contains(capDialog)) + capDialog->activateWindow(); + else + ui->toolWindowManager->addToolWindow(capDialog, mainToolArea()); } void MainWindow::saveLayout_triggered() diff --git a/qrenderdoc/Windows/MainWindow.h b/qrenderdoc/Windows/MainWindow.h index 3899cd392..aca33d09e 100644 --- a/qrenderdoc/Windows/MainWindow.h +++ b/qrenderdoc/Windows/MainWindow.h @@ -27,6 +27,7 @@ #include #include #include "Code/CaptureContext.h" +#include "ToolWindowManager.h" namespace Ui { @@ -76,7 +77,7 @@ private slots: void on_action_Open_Log_triggered(); void on_action_Close_Log_triggered(); void on_action_Mesh_Output_triggered(); - void on_action_Event_Viewer_triggered(); + void on_action_Event_Browser_triggered(); void on_action_Texture_Viewer_triggered(); void on_action_Capture_Log_triggered(); void on_action_Inject_into_Process_triggered(); @@ -93,6 +94,9 @@ private: QString dragFilename(const QMimeData *mimeData); + ToolWindowManager::AreaReference mainToolArea(); + ToolWindowManager::AreaReference leftToolArea(); + Ui::MainWindow *ui; CaptureContext *m_Ctx; @@ -107,8 +111,6 @@ private: QString m_LastSaveCapturePath = ""; - CaptureDialog *createCaptureDialog(); - void SetTitle(const QString &filename); void SetTitle(); diff --git a/qrenderdoc/Windows/MainWindow.ui b/qrenderdoc/Windows/MainWindow.ui index 09d46b952..0febfa3a8 100644 --- a/qrenderdoc/Windows/MainWindow.ui +++ b/qrenderdoc/Windows/MainWindow.ui @@ -120,7 +120,7 @@ - + @@ -203,9 +203,9 @@ P&ython Shell - + - &Event Viewer + &Event Browser diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index 3691d3ff5..f5d69c288 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -629,6 +629,7 @@ TextureViewer::TextureViewer(CaptureContext *ctx, QWidget *parent) TextureViewer::~TextureViewer() { + m_Ctx->windowClosed(this); m_Ctx->RemoveLogViewer(this); delete ui; }