diff --git a/qrenderdoc/Code/CaptureContext.cpp b/qrenderdoc/Code/CaptureContext.cpp index 952bdf42c..15883cfbb 100644 --- a/qrenderdoc/Code/CaptureContext.cpp +++ b/qrenderdoc/Code/CaptureContext.cpp @@ -989,11 +989,13 @@ void CaptureContext::LoadCaptureThreaded(const QString &captureFile, const Repla void CaptureContext::CacheResources() { + m_CustomNameCachedID++; + m_Resources.clear(); std::sort(m_ResourceList.begin(), m_ResourceList.end(), [this](const ResourceDescription &a, const ResourceDescription &b) { - return GetResourceName(&a) < GetResourceName(&b); + return GetResourceNameUnsuffixed(&a) < GetResourceNameUnsuffixed(&b); }); for(ResourceDescription &res : m_ResourceList) @@ -1453,6 +1455,24 @@ void CaptureContext::SetRemoteHost(int hostIdx) m_MainWindow->setRemoteHost(hostIdx); } +void CaptureContext::RegisterReplacement(ResourceId id) +{ + m_ReplacedResources.push_back(id); + + CacheResources(); + + RefreshUIStatus({}, true, true); +} + +void CaptureContext::UnregisterReplacement(ResourceId id) +{ + m_ReplacedResources.removeOne(id); + + CacheResources(); + + RefreshUIStatus({}, true, true); +} + void CaptureContext::RefreshUIStatus(const rdcarray &exclude, bool updateSelectedEvent, bool updateEvent) { @@ -1754,7 +1774,7 @@ bool CaptureContext::OpenRGPProfile(const rdcstr &filename) return true; } -rdcstr CaptureContext::GetResourceName(ResourceId id) +rdcstr CaptureContext::GetResourceNameUnsuffixed(ResourceId id) { if(id == ResourceId()) return tr("No Resource"); @@ -1762,14 +1782,14 @@ rdcstr CaptureContext::GetResourceName(ResourceId id) ResourceDescription *desc = GetResource(id); if(desc) - return GetResourceName(desc); + return GetResourceNameUnsuffixed(desc); uint64_t num; memcpy(&num, &id, sizeof(num)); return tr("Unknown Resource %1").arg(num); } -rdcstr CaptureContext::GetResourceName(const ResourceDescription *desc) +rdcstr CaptureContext::GetResourceNameUnsuffixed(const ResourceDescription *desc) { if(m_CustomNames.contains(desc->resourceId)) return m_CustomNames[desc->resourceId]; @@ -1777,6 +1797,16 @@ rdcstr CaptureContext::GetResourceName(const ResourceDescription *desc) return desc->name; } +rdcstr CaptureContext::GetResourceName(ResourceId id) +{ + rdcstr ret = GetResourceNameUnsuffixed(id); + + if(m_ReplacedResources.contains(id)) + ret += tr(" (Edited)"); + + return ret; +} + bool CaptureContext::IsAutogeneratedName(ResourceId id) { if(id == ResourceId()) @@ -1810,8 +1840,6 @@ void CaptureContext::SetResourceCustomName(ResourceId id, const rdcstr &name) m_CustomNames[id] = name; } - m_CustomNameCachedID++; - m_CaptureMods |= CaptureModifications::Renames; m_MainWindow->captureModified(); diff --git a/qrenderdoc/Code/CaptureContext.h b/qrenderdoc/Code/CaptureContext.h index 5da3f0e6e..d4506d674 100644 --- a/qrenderdoc/Code/CaptureContext.h +++ b/qrenderdoc/Code/CaptureContext.h @@ -114,6 +114,8 @@ public: uint32_t eventId, bool force = false) override; void SetRemoteHost(int hostIndex); void RefreshStatus() override { SetEventID({}, m_SelectedEventID, m_EventID, true); } + void RegisterReplacement(ResourceId id) override; + void UnregisterReplacement(ResourceId id) override; void RefreshUIStatus(const rdcarray &exclude, bool updateSelectedEvent, bool updateEvent); @@ -159,6 +161,7 @@ public: ResourceDescription *GetResource(ResourceId id) override { return m_Resources[id]; } const rdcarray &GetResources() override { return m_ResourceList; } rdcstr GetResourceName(ResourceId id) override; + rdcstr GetResourceNameUnsuffixed(ResourceId id) override; bool IsAutogeneratedName(ResourceId id) override; bool HasResourceCustomName(ResourceId id) override; void SetResourceCustomName(ResourceId id, const rdcstr &name) override; @@ -299,7 +302,7 @@ private: void LoadNotes(const QString &data); void CacheResources(); - rdcstr GetResourceName(const ResourceDescription *desc); + rdcstr GetResourceNameUnsuffixed(const ResourceDescription *desc); float m_LoadProgress = 0.0f; float m_PostloadProgress = 0.0f; @@ -359,6 +362,8 @@ private: QMap m_CustomNames; int m_CustomNameCachedID = 1; + QVector m_ReplacedResources; + const SDFile *m_StructuredFile = NULL; SDFile m_DummySDFile; diff --git a/qrenderdoc/Code/Interface/QRDInterface.h b/qrenderdoc/Code/Interface/QRDInterface.h index 335a12775..7ba72a58e 100644 --- a/qrenderdoc/Code/Interface/QRDInterface.h +++ b/qrenderdoc/Code/Interface/QRDInterface.h @@ -1162,6 +1162,26 @@ been made. )"); virtual void RefreshStatus() = 0; + DOCUMENT(R"(Register that a resource has replaced, so that the UI can be updated to reflect the +change. + +This should be called at the same time as :meth:`ReplayController.ReplaceResource`. + +:param ResourceId id: The id of the resource that has been replaced. +)"); + virtual void RegisterReplacement(ResourceId id) = 0; + + DOCUMENT(R"(Register that a replacement has been removed, so that the UI can be updated to reflect +the change. + +This should be called at the same time as :meth:`ReplayController.RemoveReplacement`. + +See :meth:`ReplaceResource`. + +:param ResourceId id: The id of the original resource that was previously replaced. +)"); + virtual void UnregisterReplacement(ResourceId id) = 0; + DOCUMENT(R"(Register a new instance of :class:`CaptureViewer` to receive capture event notifications. :param CaptureViewer viewer: The viewer to register. @@ -1344,6 +1364,14 @@ the resource type. )"); virtual rdcstr GetResourceName(ResourceId id) = 0; + DOCUMENT(R"(Returns the same name as :meth:`GetResourceName` but without any added suffix, e.g. to +indicate the resource's status such as (Edited). + +:return: The unsuffixed resource name. +:rtype: ``str`` +)"); + virtual rdcstr GetResourceNameUnsuffixed(ResourceId id) = 0; + DOCUMENT(R"(Determines whether the name for the given resource has been customised at all, either during capture time or with :meth:`SetResourceCustomName`. diff --git a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp index 1507a8079..981c969ab 100644 --- a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp @@ -829,14 +829,17 @@ IShaderViewer *PipelineStateViewer::EditShader(ResourceId id, ShaderStage shader if(to == ResourceId()) { r->RemoveReplacement(from); - if(ptr) - GUIInvoke::call(ptr, [ctx]() { ctx->RefreshStatus(); }); + + // this GUIInvoke call always needs to go through even if the viewer has been closed. + GUIInvoke::call(ctx->GetMainWindow()->Widget(), + [ctx, from]() { ctx->UnregisterReplacement(from); }); } else { r->ReplaceResource(from, to); - if(ptr) - GUIInvoke::call(ptr, [ctx]() { ctx->RefreshStatus(); }); + + GUIInvoke::call(ctx->GetMainWindow()->Widget(), + [ctx, from]() { ctx->RegisterReplacement(from); }); } }); }; @@ -846,7 +849,7 @@ IShaderViewer *PipelineStateViewer::EditShader(ResourceId id, ShaderStage shader // was a place to control replaced resources/shaders). ctx->Replay().AsyncInvoke([ctx, id](IReplayController *r) { r->RemoveReplacement(id); - GUIInvoke::call(ctx->GetMainWindow()->Widget(), [ctx] { ctx->RefreshStatus(); }); + GUIInvoke::call(ctx->GetMainWindow()->Widget(), [ctx, id] { ctx->UnregisterReplacement(id); }); }); }; diff --git a/qrenderdoc/Windows/PythonShell.cpp b/qrenderdoc/Windows/PythonShell.cpp index 1e82ec91e..863037b3a 100644 --- a/qrenderdoc/Windows/PythonShell.cpp +++ b/qrenderdoc/Windows/PythonShell.cpp @@ -95,6 +95,10 @@ struct CaptureContextInvoker : ICaptureContext return m_Ctx.GetResources(); } virtual rdcstr GetResourceName(ResourceId id) override { return m_Ctx.GetResourceName(id); } + virtual rdcstr GetResourceNameUnsuffixed(ResourceId id) override + { + return m_Ctx.GetResourceNameUnsuffixed(id); + } virtual bool IsAutogeneratedName(ResourceId id) override { return m_Ctx.IsAutogeneratedName(id); } virtual bool HasResourceCustomName(ResourceId id) override { @@ -202,6 +206,14 @@ struct CaptureContextInvoker : ICaptureContext InvokeVoidFunction(&ICaptureContext::SetEventID, exclude, selectedEventID, eventId, force); } virtual void RefreshStatus() override { InvokeVoidFunction(&ICaptureContext::RefreshStatus); } + virtual void RegisterReplacement(ResourceId id) override + { + InvokeVoidFunction(&ICaptureContext::RegisterReplacement, id); + } + virtual void UnregisterReplacement(ResourceId id) override + { + InvokeVoidFunction(&ICaptureContext::UnregisterReplacement, id); + } virtual void AddCaptureViewer(ICaptureViewer *viewer) override { InvokeVoidFunction(&ICaptureContext::AddCaptureViewer, viewer); diff --git a/qrenderdoc/Windows/ResourceInspector.cpp b/qrenderdoc/Windows/ResourceInspector.cpp index 3090fb3c8..09b53153e 100644 --- a/qrenderdoc/Windows/ResourceInspector.cpp +++ b/qrenderdoc/Windows/ResourceInspector.cpp @@ -387,6 +387,7 @@ void ResourceInspector::OnEventChanged(uint32_t eventId) { m_ResourceCacheID = m_Ctx.ResourceNameCacheID(); m_ResourceModel->reset(); + SetResourceNameDisplay(m_Ctx.GetResourceName(m_Resource)); } } @@ -394,9 +395,7 @@ void ResourceInspector::on_renameResource_clicked() { if(!ui->resourceNameEdit->isVisible()) { - ui->resourceNameEdit->setText(ui->resourceName->text() - .replace(QFormatStr(" (%1)").arg(ToQStr(m_Resource)), QString()) - .trimmed()); + ui->resourceNameEdit->setText(m_Ctx.GetResourceNameUnsuffixed(m_Resource).trimmed()); ui->resourceName->hide(); ui->resourceNameEdit->show(); ui->resourceNameEdit->setFocus(); @@ -406,14 +405,14 @@ void ResourceInspector::on_renameResource_clicked() QString name = ui->resourceNameEdit->text(); // apply the edit - SetResourceNameDisplay(name); + m_Ctx.SetResourceCustomName(m_Resource, name); + + SetResourceNameDisplay(m_Ctx.GetResourceName(m_Resource)); ui->resourceNameEdit->hide(); ui->resourceName->show(); ui->resetName->show(); - - m_Ctx.SetResourceCustomName(m_Resource, name); } } @@ -434,12 +433,12 @@ void ResourceInspector::on_resourceNameEdit_keyPress(QKeyEvent *event) void ResourceInspector::on_resetName_clicked() { + m_Ctx.SetResourceCustomName(m_Resource, QString()); + SetResourceNameDisplay(m_Ctx.GetResourceName(m_Resource)); ui->resetName->hide(); - m_Ctx.SetResourceCustomName(m_Resource, QString()); - // force a refresh to pick up the new name ResourceId id = m_Resource; m_Resource = ResourceId();