| 2613 | } // DefaultScheduler::aboutToStartRender |
| 2614 | |
| 2615 | void |
| 2616 | DefaultScheduler::onRenderStopped(bool aborted) |
| 2617 | { |
| 2618 | OutputEffectInstancePtr effect = _effect.lock(); |
| 2619 | bool isBackGround = appPTR->isBackground(); |
| 2620 | |
| 2621 | if (!isBackGround) { |
| 2622 | effect->setKnobsFrozen(false); |
| 2623 | } |
| 2624 | |
| 2625 | { |
| 2626 | QString longText = QString::fromUtf8( effect->getScriptName_mt_safe().c_str() ) + tr(" ==> Rendering finished"); |
| 2627 | appPTR->writeToOutputPipe(longText, QString::fromUtf8(kRenderingFinishedStringShort), true); |
| 2628 | } |
| 2629 | |
| 2630 | effect->notifyRenderFinished(); |
| 2631 | |
| 2632 | std::string cb = effect->getNode()->getAfterRenderCallback(); |
| 2633 | if ( !cb.empty() ) { |
| 2634 | std::vector<std::string> args; |
| 2635 | std::string error; |
| 2636 | try { |
| 2637 | NATRON_PYTHON_NAMESPACE::getFunctionArguments(cb, &error, &args); |
| 2638 | } catch (const std::exception& e) { |
| 2639 | effect->getApp()->appendToScriptEditor( std::string("Failed to get signature of afterRender callback: ") |
| 2640 | + e.what() ); |
| 2641 | |
| 2642 | return; |
| 2643 | } |
| 2644 | |
| 2645 | if ( !error.empty() ) { |
| 2646 | effect->getApp()->appendToScriptEditor("Failed to get signature of afterRender callback: " + error); |
| 2647 | |
| 2648 | return; |
| 2649 | } |
| 2650 | |
| 2651 | std::string signatureError; |
| 2652 | signatureError.append("The after render callback supports the following signature(s):\n"); |
| 2653 | signatureError.append("- callback(aborted, thisNode, app)"); |
| 2654 | if ( (args.size() != 3) || (args[0] != "aborted") || (args[1] != "thisNode") || (args[2] != "app") ) { |
| 2655 | effect->getApp()->appendToScriptEditor("Wrong signature of afterRender callback: " + signatureError); |
| 2656 | |
| 2657 | return; |
| 2658 | } |
| 2659 | |
| 2660 | |
| 2661 | std::stringstream ss; |
| 2662 | std::string appStr = effect->getApp()->getAppIDString(); |
| 2663 | std::string outputNodeName = appStr + "." + effect->getNode()->getFullyQualifiedName(); |
| 2664 | ss << cb << "("; |
| 2665 | if (aborted) { |
| 2666 | ss << "True, "; |
| 2667 | } else { |
| 2668 | ss << "False, "; |
| 2669 | } |
| 2670 | ss << outputNodeName << ", " << appStr << ")"; |
| 2671 | std::string script = ss.str(); |
| 2672 | try { |
nothing calls this directly
no test coverage detected