bool KnobGui::isSecretRecursive() const { // If the Knob is within a group, only show it if the group is unfolded! // To test it: // try TuttlePinning: fold all groups, then switch from perspective to affine to perspective. // VISIBILITY is different from SECRETNESS. The code considers that both things are equivalent, which is wrong. // Of course, this check has to be *recursive* (in case the group is within a folded group) KnobPtr knob = getKnob(); bool isViewerKnob = _imp->container->isInViewerUIKnob(); bool showit = isViewerKnob ? !knob->getInViewerContextSecret() : !knob->getIsSecret(); KnobPtr parentKnob = knob->getParentKnob(); KnobGroup* parentIsGroup = dynamic_cast<KnobGroup*>( parentKnob.get() ); while (showit && parentKnob && parentIsGroup) { KnobGuiGroup* parentGui = dynamic_cast<KnobGuiGroup*>( _imp->container->getKnobGui(parentKnob).get() ); // check for secretness and visibility of the group bool parentSecret = isViewerKnob ? parentKnob->getInViewerContextSecret() : parentKnob->getIsSecret(); if ( parentSecret || ( parentGui && !parentGui->isChecked() ) ) { showit = false; // one of the including groups is folder, so this item is hidden } // prepare for next loop iteration parentKnob = parentKnob->getParentKnob(); parentIsGroup = dynamic_cast<KnobGroup*>( parentKnob.get() ); } return !showit; }