diff --git a/app/node/node.cpp b/app/node/node.cpp index 9836840cf..fa1f0f649 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -83,6 +83,13 @@ void Node::InvalidateCache(const rational &start_range, const rational &end_rang { Q_UNUSED(from) + foreach (NodeParam* param, params_) { + if (param->type() == NodeParam::kOutput) { + NodeOutput* output = static_cast(param); + output->drop_cached_values_overlapping(TimeRange(start_range, end_range)); + } + } + SendInvalidateCache(start_range, end_range); } diff --git a/app/node/output.cpp b/app/node/output.cpp index 5d71542b2..93fb4a118 100644 --- a/app/node/output.cpp +++ b/app/node/output.cpp @@ -58,3 +58,16 @@ void NodeOutput::drop_cached_values() { cached_values_.clear(); } + +void NodeOutput::drop_cached_values_overlapping(const TimeRange &time) +{ + QHash::iterator i = cached_values_.begin(); + + while (i != cached_values_.end()) { + if (i.key().OverlapsWith(time)) { + i = cached_values_.erase(i); + } else { + i++; + } + } +} diff --git a/app/node/output.h b/app/node/output.h index 04a5aaadb..19cb3b648 100644 --- a/app/node/output.h +++ b/app/node/output.h @@ -46,6 +46,7 @@ public: QVariant get_cached_value(const TimeRange& time); void cache_value(const TimeRange& time, const QVariant& value); void drop_cached_values(); + void drop_cached_values_overlapping(const TimeRange& time); private: QHash cached_values_;