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;
        }
    }
}
Пример #2
0
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