khanat-code-old/code/ryzom/common/data_common/r2/r2_ui_palette.lua
2017-03-15 20:43:10 +01:00

223 lines
7 KiB
Lua

----------------
-- PALETTE UI --
----------------
------------------------------------------------------------------------------------------------------------
-- handle right click on palette item
function r2:onPaletteRightClick(paletteNode)
-- store palette path for futur display
self.tmpPaletteNode = paletteNode
end
------------------------------------------------------------------------------------------------------------
function r2:onShowPaletteLuaTable(maxDepth)
if (self.tmpPaletteNode == nil) then return end
runCommand("luaObject", self.tmpPaletteNode, maxDepth)
end
------------------------------------------------------------------------------------------------------------
function r2:buildPaletteUI()
--debugInfo(colorTag(0, 255, 127) .."Begin building palette UI")
local tree = getUI(r2.Palette.UIPath)
local botTree = getUI(r2.Palette.BotObjectsUIPath)
if tree==nil or botTree==nil then return end
local shortElementId = 0
r2.Palette.ShortIdToElement = {}
local function buildBranch(luaBranch, branchStrId, depth, openDepth)
local newNode = SNode()
newNode.Opened = depth < openDepth
newNode.Id = "branch"
newNode.Text = i18n.get(branchStrId)
for k, v in pairs(luaBranch) do
if (k ~= "instances") then
if type(v)=="table" and v.Display~=false then
-- this is a sub branch
newNode:addChild(buildBranch(v, "uiR2ED" .. k, depth + 1, openDepth))
end
else
for instKey, instValue in pairs(v) do
-- the value is a table containing a list of instances
local subNode = SNode()
if instValue.DirectName ~= nil then
subNode.Text = instValue.DirectName
else
subNode.Text = i18n.get(instValue.Translation)
end
r2.PaletteIdToTranslation[instValue.Id] = subNode.Text:toUtf8()
r2.PaletteIdToGroupTranslation[instValue.Id] = newNode.Text:toUtf8()
r2.PaletteIdToType[instValue.Id] = v
subNode.Id = tostring(shortElementId)
local paletteElement = r2.getPaletteElement(instValue.Id)
if (paletteElement == nil)
then
debugInfo("invalid nil Palette: " .. instValue.Id)
else
r2.Palette.ShortIdToElement[tostring(shortElementId)] = paletteElement
shortElementId = shortElementId + 1
subNode.Opened = false
subNode.AHName = "r2ed_create_entity"
subNode.AHParams = "PaletteId=" .. instValue.Id
--subNode.AHNameRight = "lua"
--subNode.AHParamsRight = "r2ed:onPaletteRightClick(" .. instValue.Id .. ")"
local ringAccess = r2.getPropertyValue(paletteElement, "RingAccess")
local insertNode = true
if ringAccess then
insertNode = r2.RingAccess.testAccess(ringAccess)
end
if insertNode then
newNode:addChild(subNode)
end
end
end
end
end
return newNode
end
-- create root node & call function
local rootNode = buildBranch(r2.Palette.Entries, r2.Palette.StrId, 0, 2)
rootNode:sort()
tree:setRootNode(rootNode)
local botRootNode = buildBranch(r2.Palette.BotEntries, r2.Palette.StrId, 0, 1)
botRootNode:sort()
botTree:setRootNode(botRootNode)
--
local paletteWindow = tree:getEnclosingContainer()
if paletteWindow then
-- paletteWindow.active = true
-- paletteWindow:updateCoords()
local selection = paletteWindow:find("entity_selection")
local enclosing = paletteWindow:find("entity_enclosing")
local delta = 6
enclosing.h = - selection.h_real - delta
enclosing.y = - selection.h_real - delta
paletteWindow:invalidateCoords()
end
--debugInfo(colorTag(0, 255, 127) .. "Palette UI built")
r2:setupPaletteAccessibleContent()
--r2:setupDefaultCustomBBoxes()
end
---------------------------------------------------------------------------------------------------------
-- Setup the content that is visible in the palette depending on the chosen ecosystem and level
function r2:setupPaletteAccessibleContent()
local levelMin, levelMax, ecosystem = r2:getPaletteAccessibilityFactors()
local function setupBranch(branch)
local show = false
if branch.Id == "branch" then
for index = 0, branch:getNumChildren() - 1 do
local showChild = setupBranch(branch:getChild(index))
if showChild then
show = true
end
end
else
-- this is a leaf
local paletteNode = r2.Palette.ShortIdToElement[branch.Id]
--assert(paletteNode)
if paletteNode then
local currLevel = defaulting(paletteNode.Level, 1)
local currEcosystem = defaulting(paletteNode.Ecosystem, "")
-- tmp : ignore level & ecosystem for objects
if string.match(paletteNode.SheetClient, "object.*") then
show = true
elseif currLevel >= levelMin and currLevel <= levelMax and (currEcosystem == "" or string.match(currEcosystem, ecosystem)) then
show = true
else
--debugInfo(currEcosystem)
end
end
end
-- if show then
-- branch.Color = CRGBA(255, 255, 255)
-- else
-- branch.Color = CRGBA(255, 0, 0)
--end
branch.Show = show
return show
end
if ecosystem and levelMin and levelMax then
local tree = getUI(r2.Palette.UIPath)
setupBranch(tree:getRootNode())
tree:forceRebuild()
end
end
function r2:getPaletteAccessibilityFactors()
local tree = getUI(r2.Palette.UIPath)
if tree == nil then return end
local levelRange = tree:getEnclosingContainer():find("level").selection + 1 -- TMP : tha 'all' field was removed ...
local levelMin
local levelMax
if levelRange == 0 then
levelMin = 1
levelMax = 250
else
levelMin = (levelRange - 1) * 50 + 1
levelMax = levelMin + 49
end
local ecosystemTable =
{
".*", "Desert", "Forest", "Jungle", "Lacustre", "PrimeRoots", "Goo"
}
local ecosystem= ecosystemTable[tree:getEnclosingContainer():find("ecosystem").selection + 2] -- TMP : added 2 instead of 1 because the 'all' field has been removed
return levelMin, levelMax, ecosystem
end
function r2:createRoad()
r2:setCurrentTool('R2::CToolDrawPrim', { Look = r2.PrimRender.RoadCreateLook,
InvalidLook = r2.PrimRender.RoadCreateInvalidLook,
Type="Road", ForceShowPrims=true })
end
function r2:createRegion()
r2:setCurrentTool('R2::CToolDrawPrim',
{
Look = r2.PrimRender.RegionCreateLook,
InvalidLook = r2.PrimRender.RegionCreateInvalidLook,
CanCloseLook = r2.PrimRender.RegionCreateCanCloseLook,
Type = "Region",
SelectInstance = true,
ForceShowPrims=true
}
)
end
---------------------------------------------------------------------------------------------------------
-- TMP for demo : assign default custom bbox to mobs
--function r2:setupDefaultCustomBBoxes()
-- for id, node in pairs(r2.Palette.ShortIdToElement) do
-- if string.match(node.Base, "palette.entities.creatures.*") then
-- local box =
-- {
-- Enabled = true,
-- XMin = -0.5,
-- XMax = 0.5,
-- YMin = -0.5,
-- YMax = 0.5,
-- ZMin = 0,
-- ZMax = 2,
-- }
-- r2:setEntityCustomSelectBox(node.SheetClient, box)
-- end
-- end
--end