void NodeSettingsPanel::onSettingsButtonClicked() { Menu menu(this); //menu.setFont(QFont(appFont,appFontSize)); NodeGuiPtr node = getNode(); NodePtr master = node->getNode()->getMasterNode(); QAction* importPresets = new QAction(tr("Import presets"), &menu); QObject::connect( importPresets, SIGNAL(triggered()), this, SLOT(onImportPresetsActionTriggered()) ); QAction* exportAsPresets = new QAction(tr("Export as presets"), &menu); QObject::connect( exportAsPresets, SIGNAL(triggered()), this, SLOT(onExportPresetsActionTriggered()) ); menu.addAction(importPresets); menu.addAction(exportAsPresets); menu.addSeparator(); QAction* manageUserParams = new QAction(tr("Manage user parameters..."), &menu); QObject::connect( manageUserParams, SIGNAL(triggered()), this, SLOT(onManageUserParametersActionTriggered()) ); menu.addAction(manageUserParams); menu.addSeparator(); QAction* setKeyOnAll = new QAction(tr("Set key on all parameters"), &menu); QObject::connect( setKeyOnAll, SIGNAL(triggered()), this, SLOT(setKeyOnAllParameters()) ); QAction* removeAnimationOnAll = new QAction(tr("Remove animation on all parameters"), &menu); QObject::connect( removeAnimationOnAll, SIGNAL(triggered()), this, SLOT(removeAnimationOnAllParameters()) ); menu.addAction(setKeyOnAll); menu.addAction(removeAnimationOnAll); if ( master || !node->getDagGui() || !node->getDagGui()->getGui() || node->getDagGui()->getGui()->isGUIFrozen() ) { importPresets->setEnabled(false); exportAsPresets->setEnabled(false); setKeyOnAll->setEnabled(false); removeAnimationOnAll->setEnabled(false); } menu.exec( _settingsButton->mapToGlobal( _settingsButton->pos() ) ); }
void NodeGraph::refreshNodeLinksNow() { // First clear all previous links for (NodeGraphPrivate::LinkedNodesList::const_iterator it = _imp->linkedNodes.begin(); it != _imp->linkedNodes.end(); ++it) { delete it->arrow; } _imp->linkedNodes.clear(); if (!_imp->_knobLinksVisible) { return; } NodesGuiList nodes; { QMutexLocker k(&_imp->_nodesMutex); nodes = _imp->_nodes; } QColor simpleLinkColor, cloneLinkColor; { double exprColor[3], cloneColor[3]; appPTR->getCurrentSettings()->getExprColor(&exprColor[0], &exprColor[1], &exprColor[2]); appPTR->getCurrentSettings()->getCloneColor(&cloneColor[0], &cloneColor[1], &cloneColor[2]); simpleLinkColor.setRgbF(Image::clamp(exprColor[0], 0., 1.), Image::clamp(exprColor[1], 0., 1.), Image::clamp(exprColor[2], 0., 1.)); cloneLinkColor.setRgbF(Image::clamp(cloneColor[0], 0., 1.), Image::clamp(cloneColor[1], 0., 1.), Image::clamp(cloneColor[2], 0., 1.)); } for (NodesGuiList::const_iterator it = nodes.begin(); it!=nodes.end(); ++it) { NodePtr thisNode = (*it)->getNode(); std::list<std::pair<NodePtr, bool> > linkedNodes; thisNode->getLinkedNodes(&linkedNodes); for (std::list<std::pair<NodePtr, bool> >::const_iterator it2 = linkedNodes.begin(); it2 != linkedNodes.end(); ++it2) { // If the linked node doesn't have a gui or it is not part of this nodegraph don't create a link at all NodeGuiPtr otherNodeGui = toNodeGui(it2->first->getNodeGui()); if (!otherNodeGui || otherNodeGui->getDagGui() != this) { continue; } // Try to find an existing link NodeGraphPrivate::LinkedNodes link; link.nodes[0] = thisNode; link.nodes[1] = it2->first; link.isCloneLink = it2->second; NodeGraphPrivate::LinkedNodesList::iterator foundExistingLink = _imp->linkedNodes.end(); { for (NodeGraphPrivate::LinkedNodesList::iterator it = _imp->linkedNodes.begin(); it != _imp->linkedNodes.end(); ++it) { NodePtr a1 = it->nodes[0].lock(); NodePtr a2 = it->nodes[1].lock(); NodePtr b1 = link.nodes[0].lock(); NodePtr b2 = link.nodes[1].lock(); if ((a1 == b1 || a1 == b2) && (a2 == b1 || a2 == b2)) { foundExistingLink = it; break; } } } if (foundExistingLink == _imp->linkedNodes.end()) { // A link did not exist, create it link.arrow = new LinkArrow( otherNodeGui, *it, (*it)->parentItem() ); link.arrow->setWidth(2); link.arrow->setArrowHeadVisible(false); if (link.isCloneLink) { link.arrow->setColor(cloneLinkColor); } else { link.arrow->setColor(simpleLinkColor); } _imp->linkedNodes.push_back(link); } else { // A link existed, if this is a clone link and it was not before, upgrade it if (!foundExistingLink->isCloneLink && link.isCloneLink) { foundExistingLink->arrow->setColor(cloneLinkColor); } } } (*it)->refreshLinkIndicators(linkedNodes); } } // refreshNodeLinksNow
void GuiAppInstance::createNodeGui(const NodePtr &node, const NodePtr& parentMultiInstance, const CreateNodeArgs& args) { boost::shared_ptr<NodeCollection> group = node->getGroup(); NodeGraph* graph; if (group) { NodeGraphI* graph_i = group->getNodeGraph(); assert(graph_i); graph = dynamic_cast<NodeGraph*>(graph_i); assert(graph); } else { graph = _imp->_gui->getNodeGraph(); } if (!graph) { throw std::logic_error(""); } NodesGuiList selectedNodes = graph->getSelectedNodes(); NodeGuiPtr nodegui = _imp->_gui->createNodeGUI(node, args); assert(nodegui); if (parentMultiInstance && nodegui) { nodegui->hideGui(); boost::shared_ptr<NodeGuiI> parentNodeGui_i = parentMultiInstance->getNodeGui(); assert(parentNodeGui_i); nodegui->setParentMultiInstance( boost::dynamic_pointer_cast<NodeGui>(parentNodeGui_i) ); } ///It needs to be here because we rely on the _nodeMapping member bool isViewer = node->isEffectViewer() != 0; if (isViewer) { _imp->_gui->createViewerGui(node); } ///must be done after the viewer gui has been created if ( node->isRotoPaintingNode() ) { _imp->_gui->createNewRotoInterface( nodegui.get() ); } if ( ( node->isTrackerNodePlugin() || node->getEffectInstance()->isBuiltinTrackerNode() ) && !parentMultiInstance ) { _imp->_gui->createNewTrackerInterface( nodegui.get() ); } NodeGroup* isGroup = node->isEffectGroup(); if ( isGroup && isGroup->isSubGraphUserVisible() ) { _imp->_gui->createGroupGui(node, args.reason); } ///Don't initialize inputs if it is a multi-instance child since it is not part of the graph if (!parentMultiInstance) { nodegui->initializeInputs(); } if ( (args.reason == eCreateNodeReasonUserCreate) && !isViewer ) { ///we make sure we can have a clean preview. node->computePreviewImage( getTimeLine()->currentFrame() ); triggerAutoSave(); } ///only move main instances if ( node->getParentMultiInstanceName().empty() ) { bool autoConnect = args.reason == eCreateNodeReasonUserCreate; if ( selectedNodes.empty() ) { autoConnect = false; } if ( (args.xPosHint != INT_MIN) && (args.yPosHint != INT_MIN) && (!autoConnect) ) { QPointF pos = nodegui->mapToParent( nodegui->mapFromScene( QPointF(args.xPosHint, args.yPosHint) ) ); nodegui->refreshPosition( pos.x(), pos.y(), true ); } else { BackdropGui* isBd = dynamic_cast<BackdropGui*>( nodegui.get() ); if (!isBd) { NodeGuiPtr selectedNode; if ( (args.reason == eCreateNodeReasonUserCreate) && (selectedNodes.size() == 1) ) { selectedNode = selectedNodes.front(); BackdropGui* isBackdropGui = dynamic_cast<BackdropGui*>( selectedNode.get() ); if (isBackdropGui) { selectedNode.reset(); } } nodegui->getDagGui()->moveNodesForIdealPosition(nodegui, selectedNode, autoConnect); } } } } // createNodeGui
void GuiAppInstance::createNodeGui(const NodePtr &node, const NodePtr& parentMultiInstance, const CreateNodeArgs& args) { NodeCollectionPtr group = node->getGroup(); NodeGraph* graph; if (group) { NodeGraphI* graph_i = group->getNodeGraph(); assert(graph_i); graph = dynamic_cast<NodeGraph*>(graph_i); assert(graph); } else { graph = _imp->_gui->getNodeGraph(); } if (!graph) { throw std::logic_error(""); } NodesGuiList selectedNodes = graph->getSelectedNodes(); NodeGuiPtr nodegui = _imp->_gui->createNodeGUI(node, args); assert(nodegui); if (parentMultiInstance && nodegui) { nodegui->hideGui(); NodeGuiIPtr parentNodeGui_i = parentMultiInstance->getNodeGui(); assert(parentNodeGui_i); nodegui->setParentMultiInstance( boost::dynamic_pointer_cast<NodeGui>(parentNodeGui_i) ); } bool isViewer = node->isEffectViewerInstance() != 0; if (isViewer) { _imp->_gui->createViewerGui(node); } // Must be done after the viewer gui has been created _imp->_gui->createNodeViewerInterface(nodegui); NodeGroupPtr isGroup = node->isEffectNodeGroup(); if ( isGroup && isGroup->isSubGraphUserVisible() ) { _imp->_gui->createGroupGui(node, args); } ///Don't initialize inputs if it is a multi-instance child since it is not part of the graph if (!parentMultiInstance) { nodegui->initializeInputs(); } NodeSerializationPtr serialization = args.getProperty<NodeSerializationPtr >(kCreateNodeArgsPropNodeSerialization); if ( !serialization && !isViewer ) { ///we make sure we can have a clean preview. node->computePreviewImage( getTimeLine()->currentFrame() ); triggerAutoSave(); } ///only move main instances if ( node->getParentMultiInstanceName().empty() && !serialization) { bool autoConnect = args.getProperty<bool>(kCreateNodeArgsPropAutoConnect); if ( selectedNodes.empty() || serialization) { autoConnect = false; } double xPosHint = serialization ? INT_MIN : args.getProperty<double>(kCreateNodeArgsPropNodeInitialPosition, 0); double yPosHint = serialization ? INT_MIN : args.getProperty<double>(kCreateNodeArgsPropNodeInitialPosition, 1); if ( (xPosHint != INT_MIN) && (yPosHint != INT_MIN) && (!autoConnect) ) { QPointF pos = nodegui->mapToParent( nodegui->mapFromScene( QPointF(xPosHint, yPosHint) ) ); nodegui->refreshPosition( pos.x(), pos.y(), true ); } else { BackdropGuiPtr isBd = toBackdropGui(nodegui); if (!isBd) { NodeGuiPtr selectedNode; if ( !serialization && (selectedNodes.size() == 1) ) { selectedNode = selectedNodes.front(); BackdropGuiPtr isBdGui = toBackdropGui(selectedNode); if (isBdGui) { selectedNode.reset(); } } nodegui->getDagGui()->moveNodesForIdealPosition(nodegui, selectedNode, autoConnect); } } } } // createNodeGui