diff --git a/qrenderdoc/Code/Interface/QRDInterface.h b/qrenderdoc/Code/Interface/QRDInterface.h index 48073331c..b19af84d4 100644 --- a/qrenderdoc/Code/Interface/QRDInterface.h +++ b/qrenderdoc/Code/Interface/QRDInterface.h @@ -963,6 +963,14 @@ QWidget. )"); virtual void AddWatch(const rdcstr &expression) = 0; + DOCUMENT(R"(Return the current text of source files within the viewer. Primarily useful for +returning any edits applied when editing a shader. + +:return: The current file contents as a list of (filename, contents) pairs. +:rtype: List[Tuple[str,str]] +)"); + virtual rdcstrpairs GetCurrentFileContents() = 0; + protected: IShaderViewer() = default; ~IShaderViewer() = default; diff --git a/qrenderdoc/Windows/ShaderViewer.cpp b/qrenderdoc/Windows/ShaderViewer.cpp index 315ec5427..8500d4865 100644 --- a/qrenderdoc/Windows/ShaderViewer.cpp +++ b/qrenderdoc/Windows/ShaderViewer.cpp @@ -4086,6 +4086,22 @@ void ShaderViewer::AddWatch(const rdcstr &variable) ui->watch->QWidget::setFocus(); } +rdcstrpairs ShaderViewer::GetCurrentFileContents() +{ + rdcstrpairs files; + for(ScintillaEdit *s : m_Scintillas) + { + // don't include the disassembly view + if(m_DisassemblyView == s) + continue; + + QWidget *w = (QWidget *)s; + files.push_back( + {w->property("filename").toString(), QString::fromUtf8(s->getText(s->textLength() + 1))}); + } + return files; +} + int ShaderViewer::snippetPos() { ShaderEncoding encoding = currentEncoding(); diff --git a/qrenderdoc/Windows/ShaderViewer.h b/qrenderdoc/Windows/ShaderViewer.h index cac22d730..2b56962b9 100644 --- a/qrenderdoc/Windows/ShaderViewer.h +++ b/qrenderdoc/Windows/ShaderViewer.h @@ -128,6 +128,8 @@ public: virtual void AddWatch(const rdcstr &variable) override; + virtual rdcstrpairs GetCurrentFileContents() override; + // ICaptureViewer void OnCaptureLoaded() override; void OnCaptureClosed() override; diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index 1710d1fc3..1c434e72a 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -4528,16 +4528,24 @@ void TextureViewer::on_customEdit_clicked() // Save Callback [thisPointer, key, filename, path](ICaptureContext *ctx, IShaderViewer *viewer, ResourceId, ShaderStage, ShaderEncoding, ShaderCompileFlags, rdcstr, - bytebuf bytes) { + bytebuf) { { // don't trigger a full refresh if(thisPointer) thisPointer->m_CustomShaderWriteTime = thisPointer->m_CustomShaderTimer.elapsed(); + rdcstrpairs files = viewer->GetCurrentFileContents(); + + if(files.size() != 1) + qCritical() << "Unexpected number of files in custom shader viewer" << files.count(); + + if(files.empty()) + return; + QFile fileHandle(path); if(fileHandle.open(QFile::WriteOnly | QIODevice::Truncate | QIODevice::Text)) { - fileHandle.write(QByteArray(bytes)); + fileHandle.write(files[0].second.c_str(), files[0].second.size()); fileHandle.close(); // watcher doesn't trigger on internal modifications