local love = assert( love ) local button = require( "ui.button" ) local t = {} t.__index = t local i = 0 function t.start( self ) love.graphics.setScissor( self.x or 0, self.y or 0, self.w or love.graphics.getWidth(), self.h or love.graphics.getDimensions()) i = i + 1 t[i] = t[i] or {} --store callbacks for name in pairs( self ) do if love[name] then t[i][name] = love[name] love[name] = self[name] end end --store menus local b = button.next repeat t[i][b] = b.visible b = b.next until b == button end function t.stop( self ) --restore callbacks for name in pairs( self ) do if love[name] then love[name] = t[i][name] end end --restore menus local b = button button.deselect() repeat b = b.next b.visible = t[i][b] or false --accessing a button's nil field is an error, so make sure that b.visible is a boolean until b == button t[i] = nil i = i - 1 end function t.new( modal ) return setmetatable( modal or {}, t ) end return t