void GuiApplicationManagerPrivate::removePluginToolButtonInternal(const PluginGroupNodePtr& n, const std::vector<std::string>& grouping) { assert(grouping.size() > 0); const std::list<PluginGroupNodePtr>& children = n->getChildren(); for (std::list<PluginGroupNodePtr>::const_iterator it = children.begin(); it != children.end(); ++it) { if ( (*it)->getTreeNodeID().toStdString() == grouping[0] ) { if (grouping.size() > 1) { std::vector<std::string> newGrouping; for (std::size_t i = 1; i < grouping.size(); ++i) { newGrouping.push_back(grouping[i]); } removePluginToolButtonInternal(*it, newGrouping); if ( (*it)->getChildren().empty() ) { n->tryRemoveChild(*it); } } else { n->tryRemoveChild(*it); } break; } } }
void GuiAppInstancePrivate::findOrCreateToolButtonRecursive(const PluginGroupNodePtr& n) { _gui->findOrCreateToolButton(n); const std::list<PluginGroupNodePtr>& children = n->getChildren(); for (std::list<PluginGroupNodePtr>::const_iterator it = children.begin(); it != children.end(); ++it) { findOrCreateToolButtonRecursive(*it); } }
PluginGroupNodePtr GuiApplicationManagerPrivate::findPluginToolButtonOrCreateInternal(const std::list<PluginGroupNodePtr>& children, const PluginGroupNodePtr& parent, const PluginPtr& plugin, const QStringList& grouping, const QStringList& groupingIcon) { assert(plugin); assert(groupingIcon.size() == grouping.size() || groupingIcon.isEmpty() ); // On first call of this function, children are top-level toolbuttons // Otherwise this tree node has children // We ensure that the path in the tree leading to the plugin in parameter is created by recursing on the children // If there are no children that means we reached the wanted PluginGroupNode QString nodeIDToFind; if (grouping.empty()) { // Look for plugin ID nodeIDToFind = QString::fromUtf8(plugin->getPluginID().c_str()); } else { // Look for grouping menu item nodeIDToFind = grouping[0]; } for (std::list<PluginGroupNodePtr>::const_iterator it = children.begin(); it != children.end(); ++it) { // If we find a node with the same ID, then we found it already. if ( (*it)->getTreeNodeID() == nodeIDToFind ) { if (grouping.empty()) { // This is a leaf (plug-in), return it return *it; } else { // This is an intermidiate menu item, recurse QStringList newGrouping, newIconsGrouping; for (int i = 1; i < grouping.size(); ++i) { newGrouping.push_back(grouping[i]); } for (int i = 1; i < groupingIcon.size(); ++i) { newIconsGrouping.push_back(groupingIcon[i]); } return findPluginToolButtonOrCreateInternal( (*it)->getChildren(), *it, plugin, newGrouping, newIconsGrouping); } } } // Ok the PluginGroupNode does not exist yet, create it QString treeNodeName, iconFilePath; if (grouping.empty()) { // This is a leaf (plug-in), take the plug-in label and icon treeNodeName = QString::fromUtf8(plugin->getLabelWithoutSuffix().c_str()); iconFilePath = QString::fromUtf8(plugin->getProperty<std::string>(kNatronPluginPropIconFilePath).c_str()); } else { // For menu items, take from grouping treeNodeName = grouping[0]; iconFilePath = groupingIcon.isEmpty() ? QString() : groupingIcon[0]; } PluginGroupNodePtr ret(new PluginGroupNode(grouping.empty() ? plugin : PluginPtr(), treeNodeName, iconFilePath)); // If there is a parent, add it as a child if (parent) { parent->tryAddChild(ret); ret->setParent(parent); } else { // No parent, this is a top-level toolbutton _topLevelToolButtons.push_back(ret); } // If we still did not reach the desired tree node, find it, advancing (removing the first item) in the grouping if (!grouping.empty()) { QStringList newGrouping, newIconsGrouping; for (int i = 1; i < grouping.size(); ++i) { newGrouping.push_back(grouping[i]); } for (int i = 1; i < groupingIcon.size(); ++i) { newIconsGrouping.push_back(groupingIcon[i]); } return findPluginToolButtonOrCreateInternal(ret->getChildren(), ret, plugin, newGrouping, newIconsGrouping); } return ret; } // GuiApplicationManagerPrivate::findPluginToolButtonOrCreateInternal