This code demonstrates a problem with eventing that is problematic. Is this a bug?
I click a widget.button, in the onRelease handler I create an ImageRect and I attach a new listener. That listener gets the event. Why would a new listener get a tap event when handling that event? How do you stop a button from sending a new tap event out onRelease?
local scene = storyboard.newScene() local startButton local scrollView local scrollViewGroup local scrollViewItems = {} local overGroup local overButton local overChildButton local \_Nfo = require("mail") local \_Sheet = graphics.newImageSheet( "mail.png", \_Nfo:getSheet() ) function scene:createScene( event ) local group = self.view local background = display.newRect(0,0,768,1152) background.x = 768/2 background.y = 1152/2 background:setFillColor(0,142/255,0,1) group:insert(background) local scrollView = widget.newScrollView { top = 700, left = 32, width = 672, height = 320, horizontalScrollDisabled = true, hideScrollbar = true, verticalScrollDisabled = false, hideBackground = false, backgroundColor = { 123/255, 1, 1, 1 }, maskFile = "scrollmask.png", } group:insert(scrollView) scrollViewGroup = display.newGroup() scrollView:insert(scrollViewGroup) scene:addScrollViewButtons() startButton = widget.newButton{ left = 200, top = 400, sheet = \_Sheet, defaultFrame = \_Nfo:getFrameIndex("Compose-btn"), overFrame = \_Nfo:getFrameIndex("Compose-pbtn"), onPress = function(e) end, onRelease = function(e) scene:createOverlay2() return true end } group:insert(startButton) end function scene:enterScene( event ) end function scene:destroyScene( event ) scene:removeEventListener( "createScene", scene ) scene:removeEventListener( "enterScene", scene ) scene:removeEventListener( "destroyScene", scene ) end scene:addEventListener( "createScene", scene ) scene:addEventListener( "enterScene", scene ) scene:addEventListener( "destroyScene", scene ) ----------------------------------------------------------------------------------------- function scene:addScrollViewButtons() local pLeft = 60 local pTop = 50 for i=1,5 do pTop = i\*110 scrollViewItems[i] = display.newGroup() local scrollItemRect = display.newRect(0,0,100,100) scrollItemRect:setFillColor(111/255,222/255,84/255,1) scrollItemRect.x = pLeft scrollItemRect.y = pTop scrollViewItems[i]:insert(scrollItemRect) scrollViewItems[i]:addEventListener("tap",scene) scrollViewItems[i]:addEventListener("touch",scene) scrollViewGroup:insert(scrollViewItems[i]) end end function scene:tap(e) print("grid item tapped") end function scene:touch(e) print("grid item touched") end function scene:createOverlay2() local group = self.view print("createOverlay2") overGroup = display.newGroup() group:insert(overGroup) overGroup:addEventListener("tap",function() print("group tap2") return true end) overGroup:addEventListener("touch",function() print("group touch2") return true end) overButton = display.newImageRect(overGroup, \_Sheet, \_Nfo:getFrameIndex("Mail-bg"), 768, 1152) overButton.x = 768/2 overButton.y = 1152/2 overButton:addEventListener("tap",function() print("overButton tap2") overGroup:removeSelf() overGroup = nil return true end) overButton:addEventListener("touch",function() print("overButton touch2") return true end) overChildButton = widget.newButton{ left = 32, top = 750, sheet = \_Sheet, defaultFrame = \_Nfo:getFrameIndex("PageLeft-btn"), overFrame = \_Nfo:getFrameIndex("PageLeft-pbtn"), onRelease = function(e) print("close release2") overGroup:removeSelf() overGroup = nil return true end, onPress = function(e) print("close press2") return true end } overGroup:insert(overChildButton) --[[overChildButton:addEventListener("tap",function() print("tap el2") overGroup:removeSelf() overGroup = nil return true end)]]-- --[[overChildButton:addEventListener("touch",function() print("touch el2") return true end)]]-- end return scene
In G1 you create overlays as buttons which can contain child elements and set the button to enabledfalse and events stop falling through.
If this is not a bug, how are you supposed to create overlays that can be cleared onTap? Use a scene flag as a lock for every possible overlay state combination?