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
ViewerTab* Gui::addNewViewerTab(const NodeGuiPtr& node, TabWidget* where) { if (!node) { return 0; } ViewerNodePtr viewer = node->getNode()->isEffectViewerNode(); NodesGuiList activeNodeViewerUi, nodeViewerUi; //Don't create tracker & roto interface for file dialog preview viewer NodeCollectionPtr group = viewer->getNode()->getGroup(); if (group) { if ( !_imp->_viewerTabs.empty() ) { ( *_imp->_viewerTabs.begin() )->getNodesViewerInterface(&nodeViewerUi, &activeNodeViewerUi); } else { NodeGraph* graph = dynamic_cast<NodeGraph*>( group->getNodeGraph() ); if (!graph) { graph = _imp->_nodeGraphArea; } if (graph) { const NodesGuiList & allNodes = graph->getAllActiveNodes(); std::set<std::string> activeNodesPluginID; for (NodesGuiList::const_iterator it = allNodes.begin(); it != allNodes.end(); ++it) { nodeViewerUi.push_back( *it ); std::string pluginID = (*it)->getNode()->getPluginID(); std::set<std::string>::iterator found = activeNodesPluginID.find(pluginID); if ( found == activeNodesPluginID.end() ) { activeNodesPluginID.insert(pluginID); activeNodeViewerUi.push_back(*it); } } } } } std::string nodeName = node->getNode()->getFullyQualifiedName(); for (std::size_t i = 0; i < nodeName.size(); ++i) { if (nodeName[i] == '.') { nodeName[i] = '_'; } } std::string label; NodeGraph::makeFullyQualifiedLabel(node->getNode(), &label); ViewerTab* tab = new ViewerTab(nodeName, nodeViewerUi, activeNodeViewerUi, this, node, where); tab->setLabel(label); QObject::connect( tab->getViewer(), SIGNAL(imageChanged(int,bool)), this, SLOT(onViewerImageChanged(int,bool)) ); { QMutexLocker l(&_imp->_viewerTabsMutex); _imp->_viewerTabs.push_back(tab); if (!_imp->_activeViewer) { _imp->_activeViewer = tab; } } where->appendTab(tab, tab); Q_EMIT viewersChanged(); return tab; } // Gui::addNewViewerTab