Corona SDK Display Group Issue - Where is the error in this code?

Is anyone able to see the logic flaw in this lua code for Corona?

The concept is you create a new “extended” Display Object (e.g. MyGroup:new(…)), after which you can then insert objects into this using percentages for it’s position in the parent (so no need to use pixcels counts).

Issue - The issue is the objects draw are roughly in the correct spots but just a little bit out? I have a feeling it is something due to perhaps coordinates changing in the parent in the “self:insert(displayO)” line?

main.lua

[code] ------------------------------------------------------------------------------
– HELPERS

function rpadString (str, len, char)
if char == nil then char = ’ ’ end
return (str … string.rep(char, len - #str))
end

function drawBorder(obj)
local b = obj.contentBounds

local myRectangle = display.newRect(b.xMin, b.yMin, obj.contentWidth, obj.contentHeight)
– print ("Rect X,Y,Width,Height: ", b.xMin, b.yMin, obj.contentWidth, obj.contentHeight)
myRectangle.strokeWidth = 1
myRectangle:setFillColor(140, 140, 140, 1)
if obj.gcGroupName then
– Group
myRectangle:setStrokeColor(100, 250, 180)
myRectangle.strokeWidth = 1
else
– Image/Rect
myRectangle:setStrokeColor(250, 180, 180)
myRectangle.strokeWidth = 2
end

end

function dumpDisplayObjects(doParent, level)
drawBorder(doParent)
if doParent.numChildren then
for i=doParent.numChildren,1,-1 do
local doChild = doParent[i]
dumpDisplayObjects(doChild, level + 1)
end
end
end


– MAIN

require “MyGroup”

print “RUNNING …”
display.setStatusBar( display.HiddenStatusBar )

– Create Toolbar Area at Bottom
local mainGroup = MyGroup:new(“Main Group”, 0, 0, display.contentWidth, display.contentHeight)
local toolbarArea = MyGroup:new(“Inventory”, 0,0,0,0)
mainGroup:GcInsertLRTB(toolbarArea, 0, 100, 80, 100, “Inventory”) – Percentages Used

– Draw Rectangle 1
local toolbarAreaImage = display.newImage( “toolbarArea_button.png”, 0, 0)
toolbarArea:GcInsertLRTB(toolbarAreaImage, 0, 20, 0, 100, “Inventory Button”)

– -- Setup Toolbar Group
– local toolbarAreaToolbar = MyGroup:new(“InventoryToolbar”, 0, 0, 1, 1)
– toolbarArea:GcInsertLRTB(toolbarAreaToolbar, 20, 100, 0, 100, “Toolbar”)


– -- Draw Rectangle 2
– local rect2 = display.newRoundedRect(0, 0, 1000, 1000, 5)
– rect2.strokeWidth = 1
– rect2:setStrokeColor(140, 140, 140)
– rect2:setFillColor(140, 140, 140, 100)
– toolbarAreaToolbar:GcInsertLRTB(rect2, 0, 100, 0, 100, “Rect2”)

– Debug Display
dumpDisplayObjects(toolbarArea, 1)

[/code]

MyGroup.lua

 MyGroup = {}  
  
 function MyGroup:new(name, left, top, targetWidth, targetHeight)  
 -- Inherit from Group  
 myGroup = display.newGroup()  
  
 -- Work Around (Dummy Display Object Insertion) (See Note 1)  
 myGroup.dummyDO = display.newCircle( myGroup, 10, 10, 1 )  
 myGroup.dummyDO:setFillColor(1,1,1,1)  
 myGroup.dummyDO.debugComment = "Dummy Display Object"  
 myGroup:insert(myGroup.dummyDO)  
  
 myGroup.myGroupName = name   
 myGroup.debugComment = name  
 myGroup.targetWidth = targetWidth  
 myGroup.targetHeight = targetHeight  
 myGroup.x = left  
 myGroup.y = top  
  
  
 function myGroup:GcInsertLRTB(displayO, leftP, rightP, topP, bottomP, debugComment)  
 self:insert(displayO) -- \<=== DOES THIS UPSET THINGS FOR THE PARENT???  
  
 -- Remove Work Around Dummy Display Object (See Note 1)  
 if self.dummyDO then   
 self.dummyDO:removeSelf()   
 self.dummyDO = nil  
 end  
  
 displayO:setReferencePoint(display.TopLeftReferencePoint)  
 displayO.x = leftP \* 0.01 \* self.targetWidth  
 displayO.y = (topP \* 0.01) \* self.targetHeight  
  
 -- Scale Display Object (or set target's if adding another MyGroup)  
 if not displayO.myGroupName then  
 -- Not a MyGroup  
 local xScale = (self.targetWidth \* (rightP - leftP)/100) / displayO.width   
 local yScale = (self.targetHeight \* (bottomP - topP)/100) / displayO.height  
 displayO:scale(xScale, yScale)  
 else  
 -- Inserted object is a MyGroup  
 displayO.targetWidth = self.targetWidth \* (rightP - leftP)/100  
 displayO.targetHeight = self.targetHeight \* (bottomP - topP)/100   
 displayO:scale(1,1) -- TODO: Probably don't need this  
 end  
  
 end  
  
 return myGroup  
 end  
  
 -- Class Variables  
  
 -- Class Methods  
  
 return MyGroup  
  

[import]uid: 140210 topic_id: 25863 reply_id: 325863[/import]

think the issue is probably a bug: “myGroup:setReferencePoint(display.TopLeftReferencePoint) causes items to move”

That is:

AnscaMobile blog states: “The main difference is that the default reference point for a group is display.TopLeftReferencePoint,…
Applying the already existing default to a group changes the locations of items in the group where it should not: e.g. the code: "myGroup:setReferencePoint(display.TopLeftReferencePoint)

So the workaround might have to be in the class to do an if/then check to make sure the setReferencePoint is only applied to non-groups.

Raised with anscamobile as case #14049 [import]uid: 140210 topic_id: 25863 reply_id: 104769[/import]