void NodeAnim::refreshVisibility() { AnimationModulePtr animModule = getModel(); QTreeWidgetItem *nodeItem = getTreeItem(); bool showNode = false; int nChildren = nodeItem->childCount(); // Refresh children, which will recursively refresh their children for (int i = 0; i < nChildren; ++i) { QTreeWidgetItem* child = nodeItem->child(i); AnimatedItemTypeEnum type; KnobAnimPtr isKnob; TableItemAnimPtr isTableItem; NodeAnimPtr isNodeItem; ViewSetSpec view; DimSpec dim; bool found = animModule->findItem(child, &type, &isKnob, &isTableItem, &isNodeItem, &view, &dim); if (!found) { continue; } if (isTableItem) { isTableItem->refreshVisibilityConditional(false /*refreshParent*/); } else if (isNodeItem) { isNodeItem->refreshVisibility(); } else if (isKnob) { isKnob->refreshVisibilityConditional(false /*refreshHolder*/); } if (!child->isHidden()) { showNode = true; } } if (!showNode) { // If so far none of the children should be displayed, still check if the node has a range if (isRangeDrawingEnabled()) { showNode = true; } } // If settings panel is not opened and the "Keep in Animation Module" knob is not checked, hide the node. NodeGuiPtr nodeGui = getNodeGui(); bool keepInAnimationModule = nodeGui->getNode()->isKeepInAnimationModuleButtonDown(); if (!keepInAnimationModule && !nodeGui->isSettingsPanelVisible()) { showNode = false; } refreshFrameRange(); nodeItem->setData(0, QT_ROLE_CONTEXT_IS_ANIMATED, showNode); nodeItem->setHidden(!showNode); } // refreshVisibility
static TableItemAnimPtr findTableItemAnimRecursive(const TableItemAnimPtr& anim, const KnobTableItemPtr& item) { if (anim->getInternalItem() == item) { return anim; } const std::vector<TableItemAnimPtr>& children = anim->getChildren(); for (std::size_t i = 0; i < children.size(); ++i) { TableItemAnimPtr r = findTableItemAnimRecursive(children[i], item); if (r) { return r; } } return TableItemAnimPtr(); }
void NodeAnimPrivate::insertItem(int index, const KnobTableItemPtr& item, TableChangeReasonEnum reason) { // The item already exists if (_publicInterface->findTableItem(item)) { return; } KnobTableItemPtr parentItem = item->getParent(); TableItemAnimPtr parentAnim; if (parentItem) { // If the parent item is not yet in the model, do not create item, the parent will create its children recursively if (parentItem->getIndexInParent() == -1) { return; } parentAnim = _publicInterface->findTableItem(parentItem); } KnobItemsTableGuiPtr table = _publicInterface->getNodeGui()->getKnobItemsTable(item->getModel()->getTableIdentifier()); assert(table); if (parentItem) { TableItemAnimPtr anim(TableItemAnim::create(_publicInterface->getModel(), table, _publicInterface->shared_from_this(), item, parentAnim->getRootItem())); parentAnim->insertChild(index, anim); } else { TableItemAnimPtr anim(TableItemAnim::create(_publicInterface->getModel(), table, _publicInterface->shared_from_this(), item, nameItem)); if (index < 0 || index >= (int)topLevelTableItems.size()) { topLevelTableItems.push_back(anim); } else { std::vector<TableItemAnimPtr>::iterator it = topLevelTableItems.begin(); std::advance(it, index); topLevelTableItems.insert(it, anim); } } // Create children recursively std::vector<KnobTableItemPtr> children = item->getChildren(); for (std::size_t i = 0; i < children.size(); ++i) { insertItem(i, children[i], reason); } }
void AnimationModuleSelectionModel::addTableItemKeyframes(const TableItemAnimPtr& item, bool withKeyFrames, bool recurse, DimSpec dim, ViewSetSpec viewSpec, std::vector<TableItemAnimPtr> *selectedTableItems, AnimItemDimViewKeyFramesMap* result) { if (item->isRangeDrawingEnabled()) { if (selectedTableItems) { selectedTableItems->push_back(item); } } if (withKeyFrames) { addAnimatedItemKeyframes(item, dim, viewSpec, result); } else { addAnimatedItemsWithoutKeyframes(item, dim, viewSpec, result); } const std::vector<KnobAnimPtr>& knobs = item->getKnobs(); for (std::vector<KnobAnimPtr>::const_iterator it2 = knobs.begin(); it2 != knobs.end(); ++it2) { if (withKeyFrames) { addAnimatedItemKeyframes(*it2, DimSpec::all(), ViewSetSpec::all(), result); } else { addAnimatedItemsWithoutKeyframes(*it2, DimSpec::all(), ViewSetSpec::all(), result); } } if (recurse) { std::vector<TableItemAnimPtr> children = item->getChildren(); for (std::size_t i = 0; i < children.size(); ++i) { addTableItemKeyframes(children[i], withKeyFrames, true, dim, viewSpec, selectedTableItems, result); } } }
void NodeAnim::onTableItemInserted(int index, const KnobTableItemPtr& item, TableChangeReasonEnum) { KnobTableItemPtr parentItem = item->getParent(); TableItemAnimPtr parentAnim; if (parentItem) { parentAnim = findTableItem(parentItem); } KnobItemsTableGuiPtr table = getNodeGui()->getKnobItemsTable(); if (parentItem) { TableItemAnimPtr anim(TableItemAnim::create(getModel(), table, shared_from_this(), item, parentAnim->getRootItem())); parentAnim->insertChild(index, anim); } else { TableItemAnimPtr anim(TableItemAnim::create(getModel(), table, shared_from_this(), item, _imp->nameItem)); if (index < 0 || index >= (int)_imp->topLevelTableItems.size()) { _imp->topLevelTableItems.push_back(anim); } else { std::vector<TableItemAnimPtr>::iterator it = _imp->topLevelTableItems.begin(); std::advance(it, index); _imp->topLevelTableItems.insert(it, anim); } } }