NodePtr NodeAnim::getInternalNode() const { NodeGuiPtr node = getNodeGui(); return node ? node->getNode() : NodePtr(); }
bool Node::getOverlayColor(double* r, double *g, double* b) const { NodeGuiIPtr node_ui = getNodeGui(); if (node_ui && node_ui->isOverlayLocked()) { *r = 0.5; *g = 0.5; *b = 0.5; return true; } double tmpColor[3]; { QMutexLocker k(&_imp->nodeUIDataMutex); tmpColor[0] = _imp->overlayColor[0]; tmpColor[1] = _imp->overlayColor[1]; tmpColor[2] = _imp->overlayColor[2]; } if (tmpColor[0] == -1 && tmpColor[1] == -1 && tmpColor[2] == -1) { // No overlay color return false; } *r = tmpColor[0]; *g = tmpColor[1]; *b = tmpColor[2]; return true; }
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
void Node::setCurrentCursor(CursorEnum defaultCursor) { NodeGuiIPtr nodeGui = getNodeGui(); if (nodeGui) { nodeGui->setCurrentCursor(defaultCursor); } }
bool Node::setCurrentCursor(const QString& customCursorFilePath) { NodeGuiIPtr nodeGui = getNodeGui(); if (nodeGui) { return nodeGui->setCurrentCursor(customCursorFilePath); } return false; }
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); } } }
void NodeAnim::initialize(AnimatedItemTypeEnum nodeType) { _imp->nodeType = nodeType; NodePtr internalNode = getNodeGui()->getNode(); AnimationModuleBasePtr model = getModel(); NodeAnimPtr thisShared = shared_from_this(); _imp->nameItem = new QTreeWidgetItem; _imp->nameItem->setData(0, QT_ROLE_CONTEXT_ITEM_POINTER, qVariantFromValue((void*)thisShared.get())); _imp->nameItem->setText( 0, QString::fromUtf8( internalNode->getLabel().c_str() ) ); _imp->nameItem->setData(0, QT_ROLE_CONTEXT_TYPE, nodeType); _imp->nameItem->setData(0, QT_ROLE_CONTEXT_IS_ANIMATED, true); _imp->nameItem->setExpanded(true); int nCols = getModel()->getTreeColumnsCount(); if (nCols > ANIMATION_MODULE_TREE_VIEW_COL_VISIBLE) { _imp->nameItem->setData(ANIMATION_MODULE_TREE_VIEW_COL_VISIBLE, QT_ROLE_CONTEXT_ITEM_VISIBLE, QVariant(true)); _imp->nameItem->setIcon(ANIMATION_MODULE_TREE_VIEW_COL_VISIBLE, model->getItemVisibilityIcon(true)); } if (nCols > ANIMATION_MODULE_TREE_VIEW_COL_PLUGIN_ICON) { QString iconFilePath = QString::fromUtf8(internalNode->getPluginIconFilePath().c_str()); AnimationModuleTreeView::setItemIcon(iconFilePath, _imp->nameItem); } connect( internalNode.get(), SIGNAL(labelChanged(QString, QString)), this, SLOT(onNodeLabelChanged(QString, QString)) ); initializeKnobsAnim(); initializeTableItems(); // Connect signals/slots to knobs to compute the frame range AnimationModulePtr animModel = toAnimationModule(model); assert(animModel); if (nodeType == eAnimatedItemTypeCommon) { // Also connect the lifetime knob KnobIntPtr lifeTimeKnob = internalNode->getLifeTimeKnob(); if (lifeTimeKnob) { connect( lifeTimeKnob->getSignalSlotHandler().get(), SIGNAL(mustRefreshKnobGui(ViewSetSpec,DimSpec,ValueChangedReasonEnum)), this, SLOT(onFrameRangeKnobChanged()) ); } } else if (nodeType == eAnimatedItemTypeReader) { // The dopesheet view must refresh if the user set some values in the settings panel // so we connect some signals/slots KnobIPtr lastFrameKnob = internalNode->getKnobByName(kReaderParamNameLastFrame); if (!lastFrameKnob) { return; } boost::shared_ptr<KnobSignalSlotHandler> lastFrameKnobHandler = lastFrameKnob->getSignalSlotHandler(); assert(lastFrameKnob); boost::shared_ptr<KnobSignalSlotHandler> startingTimeKnob = internalNode->getKnobByName(kReaderParamNameStartingTime)->getSignalSlotHandler(); assert(startingTimeKnob); connect( lastFrameKnobHandler.get(), SIGNAL(mustRefreshKnobGui(ViewSetSpec,DimSpec,ValueChangedReasonEnum)), this, SLOT(onFrameRangeKnobChanged()) ); connect( startingTimeKnob.get(), SIGNAL(mustRefreshKnobGui(ViewSetSpec,DimSpec,ValueChangedReasonEnum)), this, SLOT(onFrameRangeKnobChanged()) ); // We don't make the connection for the first frame knob, because the // starting time is updated when it's modified. Thus we avoid two // refreshes of the view. } else if (nodeType == eAnimatedItemTypeRetime) { boost::shared_ptr<KnobSignalSlotHandler> speedKnob = internalNode->getKnobByName(kRetimeParamNameSpeed)->getSignalSlotHandler(); assert(speedKnob); connect( speedKnob.get(), SIGNAL(mustRefreshKnobGui(ViewSetSpec,DimSpec,ValueChangedReasonEnum)), this, SLOT(onFrameRangeKnobChanged()) ); } else if (nodeType == eAnimatedItemTypeTimeOffset) { boost::shared_ptr<KnobSignalSlotHandler> timeOffsetKnob = internalNode->getKnobByName(kReaderParamNameTimeOffset)->getSignalSlotHandler(); assert(timeOffsetKnob); connect( timeOffsetKnob.get(), SIGNAL(mustRefreshKnobGui(ViewSetSpec,DimSpec,ValueChangedReasonEnum)), this, SLOT(onFrameRangeKnobChanged()) ); } else if (nodeType == eAnimatedItemTypeFrameRange) { boost::shared_ptr<KnobSignalSlotHandler> frameRangeKnob = internalNode->getKnobByName(kFrameRangeParamNameFrameRange)->getSignalSlotHandler(); assert(frameRangeKnob); connect( frameRangeKnob.get(), SIGNAL(mustRefreshKnobGui(ViewSetSpec,DimSpec,ValueChangedReasonEnum)), this, SLOT(onFrameRangeKnobChanged()) ); } refreshFrameRange(); } // initialize