From 818b76b64ea3d821e7f7220d0dd680cab8ed8f27 Mon Sep 17 00:00:00 2001 From: Mike Solar Date: Sun, 12 Jul 2026 16:20:37 +0800 Subject: [PATCH] Sync Footage proxy state to render worker copy project Proxy state (enabled/path/state/etc.) is stored as Footage member data, not as a Node input, so ProjectCopier did not synchronize it to the internal copy project used by worker processes. This caused toggling Use Proxy in the UI to have no effect on rendered output. Add a Footage::ProxySettingsChanged signal and have ProjectCopier sync the proxy state to the copied Footage node, marking the copy project modified so RenderWorkerPool writes a fresh graph snapshot. --- app/node/project/footage/footage.cpp | 2 ++ app/node/project/footage/footage.h | 9 ++++++++- app/render/projectcopier.cpp | 26 ++++++++++++++++++++++++++ app/render/projectcopier.h | 3 +++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/app/node/project/footage/footage.cpp b/app/node/project/footage/footage.cpp index 636a3afde..6d447cade 100644 --- a/app/node/project/footage/footage.cpp +++ b/app/node/project/footage/footage.cpp @@ -240,6 +240,7 @@ void Footage::SetProxy(const QString &path, proxy_video_stream_index_ = video_stream_index; proxy_preset_version_ = preset_version; proxy_enabled_ = enabled; + emit ProxySettingsChanged(); } void Footage::ClearProxy() @@ -249,6 +250,7 @@ void Footage::ClearProxy() proxy_state_ = ProxyManager::kProxyMissing; proxy_video_stream_index_ = -1; proxy_preset_version_ = 0; + emit ProxySettingsChanged(); } QString Footage::DescribeVideoStream(const VideoParams ¶ms) diff --git a/app/node/project/footage/footage.h b/app/node/project/footage/footage.h index 8411bf5d4..13497aa1b 100644 --- a/app/node/project/footage/footage.h +++ b/app/node/project/footage/footage.h @@ -180,7 +180,10 @@ public: void set_proxy_enabled(bool enabled) { - proxy_enabled_ = enabled; + if (proxy_enabled_ != enabled) { + proxy_enabled_ = enabled; + emit ProxySettingsChanged(); + } } const QString &proxy_path() const @@ -240,6 +243,10 @@ public: SerializedData *data) override; virtual void SaveCustom(QXmlStreamWriter *writer) const override; +signals: + void ProxySettingsChanged(); + +public: static const QString kFilenameInput; virtual void AddedToGraphEvent(Project *p) override; diff --git a/app/render/projectcopier.cpp b/app/render/projectcopier.cpp index f461247ee..a17dff942 100644 --- a/app/render/projectcopier.cpp +++ b/app/render/projectcopier.cpp @@ -22,6 +22,7 @@ #include "projectcopier.h" #include "node/group/group.h" +#include "node/project/footage/footage.h" namespace olive { @@ -260,10 +261,35 @@ void ProjectCopier::InsertIntoCopyMap(Node *node, Node *copy) // Copy parameters Node::CopyInputs(node, copy, false); + // Sync Footage proxy state (which is not stored as a Node input) + if (Footage *src_footage = dynamic_cast(node)) { + if (dynamic_cast(copy)) { + connect(src_footage, &Footage::ProxySettingsChanged, this, + [this, src_footage]() { SyncFootageProxySettings(src_footage); }); + SyncFootageProxySettings(src_footage); + } + } + // Connect to node's cache emit AddedNode(node); } +void ProjectCopier::SyncFootageProxySettings(Footage *source) +{ + Footage *copy = GetCopy(source); + if (!copy) { + return; + } + + copy->SetProxy(source->proxy_path(), source->proxy_state(), + source->proxy_video_stream_index(), + source->proxy_preset_version(), source->proxy_enabled()); + + if (Project *cp = copy->project()) { + cp->set_modified(true); + } +} + void ProjectCopier::QueueNodeAdd(Node *node) { graph_update_queue_.push_back({ QueuedJob::kNodeAdded, node, NodeInput(), diff --git a/app/render/projectcopier.h b/app/render/projectcopier.h index a7397c4f7..19801ac03 100644 --- a/app/render/projectcopier.h +++ b/app/render/projectcopier.h @@ -23,6 +23,7 @@ #define PROJECTCOPIER_H #include "node/project.h" +#include "node/project/footage/footage.h" namespace olive { @@ -89,6 +90,8 @@ private: void DoValueHintChange(const NodeInput &input); void DoProjectSettingChange(const QString &key, const QString &value); + void SyncFootageProxySettings(Footage *source); + void InsertIntoCopyMap(Node *node, Node *copy); void UpdateGraphChangeValue();