r2.FeatureTree = { Path = "ui:interface:r2ed_palette:content:feature_tree_panel:feature_enclosing:tree_list", } local featureTree = r2.FeatureTree function featureTree.buildFeatureTreeUI() local tree = getUI(r2.FeatureTree.Path) if not tree then return end local rootNode = SNode() rootNode.Text = "Features" rootNode.Opened = false --rootNode.Bitmap = "r2ed_icon_macro_components.tga" tree:setRootNode(rootNode) featureTree.addAllFeatures() tree:forceRebuild() end function featureTree.getCategoryPicture(category) local categories = r2.getCategories() local k, v = next(categories, nil) while k do if v then if v[1] == category then return v[2] end end k, v = next(categories, k) end return "r2ed_icon_macro_components.tga" end function featureTree.getFatherNode(category) local categories = r2.getCategories() local k, v = next(categories, nil) while k do if v then if v[1] == category then return v[3] end end k, v = next(categories, k) end return "root" end function featureTree.createParentNode(parentCategory) local tree = getUI(r2.FeatureTree.Path) if not tree then return end local root = tree:getRootNode() if not root then return end categoryNode = SNode() local text = i18n.hasTranslation(parentCategory) if not text then text = parentCategory else text = i18n.get(parentCategory) end categoryNode.Text = text categoryNode.Id = parentCategory categoryNode.Opened = false --categoryNode.Bitmap = featureTree.getCategoryPicture(parentCategory) root:addChild(categoryNode) return categoryNode end function featureTree.addNodeWithId(featureName, category) local tree = getUI(r2.FeatureTree.Path) if not tree then return end local root = tree:getRootNode() if not root then return end local categoryNode = root:getNodeFromId(category) if not categoryNode then categoryNode = SNode() local text = i18n.hasTranslation(category) if not text then text = category else text = i18n.get(category) end categoryNode.Text = text categoryNode.Id = category categoryNode.Opened = false local catFather = featureTree.getFatherNode(category) if catFather == "root" then --categoryNode.Bitmap = featureTree.getCategoryPicture(category) root:addChild(categoryNode) else local fatherNode = root:getNodeFromId(catFather) if not fatherNode then --if the parent node doesn't exist, attach new category to root anyway fatherNode = featureTree.createParentNode(catFather) end fatherNode:addChild(categoryNode) end end local featureNode = SNode() local componentName = featureName --special case: chat sequence is not a feature like the others if featureName == "ChatSequence" then featureNode.Text = i18n.get("uiR2EDChatSequence") featureNode.AHName = "lua" featureNode.AHParams = "r2.Features['ActivitySequence'].Components.ChatSequence:createProtected()" categoryNode:addChild(featureNode) return end if string.find(componentName, "Feature") ~= nil then componentName = string.sub(componentName, 1, string.len(componentName) - 7) end featureNode.Text = i18n.get("uiR2Ed"..featureName.. "Node") featureNode.AHName = "lua" featureNode.AHParams = "r2.Features['".. featureName.."'].Components." ..componentName.. ":createProtected()" categoryNode:addChild(featureNode) end function featureTree.addUserComponentNode(userComponentName) local tree = getUI(r2.FeatureTree.Path) if not tree then return false end local root = tree:getRootNode() if not root then return false end local userComponentsBranch = root:getNodeFromId("uiR2EdUserComponentCategory") if not userComponentsBranch then return end local presentNode = root:getNodeFromId(userComponentName) if presentNode ~= nil then messageBox("The user component '"..userComponentName.."' is already loaded. Please unload it before loading a user component with the same name.") return false end local categoryNode = root:getNodeFromId("uiR2EdLoadedUserComponentCategory") if not categoryNode then categoryNode = SNode() categoryNode.Text = i18n.get("uiR2EdLoadedUserComponentCategory") categoryNode.Id = "uiR2EdLoadedUserComponentCategory" categoryNode.Opened = false userComponentsBranch:addChild(categoryNode) end local featureNode = SNode() featureNode.Id = userComponentName featureNode.Text = userComponentName featureNode.AHName = "lua" featureNode.AHParams = "r2.Translator.CreateUserComponent('"..userComponentName.."')" categoryNode:addChild(featureNode) tree:forceRebuild() return true end function featureTree.getUserComponentList() local tree = getUI(r2.FeatureTree.Path) if not tree then return false end local root = tree:getRootNode() if not root then return false end local featureNameTable = {} local userComponentCategoryNode = root:getNodeFromId("uiR2EdLoadedUserComponentCategory") if not userComponentCategoryNode then return {} end local nodeSize = userComponentCategoryNode:getNumChildren() local i = 0 while i < nodeSize do local node = userComponentCategoryNode:getChild(i) table.insert(featureNameTable, node.Id) i = i + 1 end return featureNameTable end function featureTree.addAllFeatures() local loadedFeatures = r2.getLoadedFeaturesStatic() local k, v = next(loadedFeatures, nil) while k do if v then featureTree.addNodeWithId(v[2], v[3]) end k, v = next(loadedFeatures, k) end if config.R2EDLoadDynamicFeatures == 1 then local loadBt = getUI("ui:interface:r2ed_palette:content:feature_tree_panel:user_component_buttons:load") local unloadBt = getUI("ui:interface:r2ed_palette:content:feature_tree_panel:user_component_buttons:unload") --loadBt.active = true --unloadBt = true featureTree.addLoadedUserComponents() local btPanel = getUI("ui:interface:r2ed_palette:content:feature_tree_panel:user_component_buttons") btPanel.active = true local loadedFeatures = r2.getLoadedFeaturesDynamic() local k, v = next(loadedFeatures, nil) while k do if v then featureTree.addNodeWithId(v[2], v[3]) end k, v = next(loadedFeatures, k) end end end function featureTree.addLoadedUserComponents() local tree = getUI(r2.FeatureTree.Path) if not tree then return end local root = tree:getRootNode() if not root then return end categoryNode = SNode() categoryNode.Text = i18n.get("uiR2EdUserComponentCategory") categoryNode.Id = "uiR2EdUserComponentCategory" categoryNode.Opened = false --categoryNode.Bitmap = "r2ed_icon_macro_components.tga" root:addChild(categoryNode) local featureNode = SNode() featureNode.Id = "NewComponent" featureNode.Text = "New Component" featureNode.AHName = "lua" featureNode.AHParams = "r2.Features['DefaultFeature'].Components.UserComponentHolder.create()" categoryNode:addChild(featureNode) local loadedUserComponentTable = r2_core.UserComponentTable if table.getn(loadedUserComponentTable) == 0 then debugInfo("No UserComponent were previously loaded") return end local k, v = next(loadedUserComponentTable, nil) while k do local userComponentName = v[1] featureTree.addUserComponentNode(userComponentName) k, v = next(loadedUserComponentTable, k) end end function featureTree.removeUCFromTree(featureName) local tree = getUI(r2.FeatureTree.Path) if not tree then return end local root = tree:getRootNode() if not root then return end local featureNode = root:getNodeFromId(featureName) if featureNode:getFather() then featureNode:getFather():deleteChild(featureNode) end local categoryNode = root:getNodeFromId("uiR2EdLoadedUserComponentCategory") local num = categoryNode:getNumChildren() if num == 0 then root:deleteChild(categoryNode) end tree:forceRebuild() categoryNode:addChild(featureNode) local loadedUserComponentTable = r2_core.UserComponentTable if table.getn(loadedUserComponentTable) == 0 then debugInfo("No UserComponent were previously loaded") return end local k, v = next(loadedUserComponentTable, nil) while k do local userComponentName = v[1] featureTree.addUserComponentNode(userComponentName) k, v = next(loadedUserComponentTable, k) end end function featureTree.removeUCFromTree(featureName) local tree = getUI(r2.FeatureTree.Path) if not tree then return end local root = tree:getRootNode() if not root then return end local featureNode = root:getNodeFromId(featureName) if featureNode:getFather() then featureNode:getFather():deleteChild(featureNode) end local categoryNode = root:getNodeFromId("uiR2EdLoadedUserComponentCategory") local num = categoryNode:getNumChildren() if num == 0 then root:deleteChild(categoryNode) end tree:forceRebuild() end