local lg = love.graphics local t = { name = "", tooltip = "button", icon = false, x = 8, y = 250, w = 176, h = 24, group = false, visible = true, callback = function( self ) return print( "clicked button: ", self.name, self.x, self.y, self.w, self.h, self.visible ) end } t.selected, t.next, t.prev = t, t, t function t.contains( button, x, y ) return x < button.x + button.w and x > button.x and y < button.y + button.h and y > button.y end local function debugLoop() local i = 0 local j = 0 local a = t repeat i = i + 1 --print( "BUTTON", i, tostring( a ) ) a = a.next until a == t or i > 100 a = t repeat j = j + 1 --print( "BUTTON", i, tostring( a ) ) a = a.prev until a == t or j > 100 print( i, j, "BUTTONS" ) end local k = 1 function t.new( b ) b = setmetatable( b or {}, t ) b.next = t t.prev.next = b b.prev = t.prev t.prev = b --nonsense k = k + 1 print( "ADD BUTTON", k, tostring( b ) ) debugLoop() return b end local drawPassOngoing = false function t.draw( b ) if b == t then drawPassOngoing = not( drawPassOngoing ) if not drawPassOngoing then return end elseif b.visible then lg.rectangle( "line", b.x, b.y, b.w, b.h, 6 ) lg.printf( b.name, b.x + (b.icon and b.h or 0), b.y + 0.5 * ( b.h - lg.getFont():getHeight() ), b.w - (b.icon and b.h or 0), "center" ) if b.icon then local h = b.icon:getHeight() lg.draw( b.icon, b.x, b.y, 0, b.h / h ) end if t.selected == b then lg.rectangle( "fill", b.x, b.y, b.w, b.h, 6 ) end end return t.draw( b.next ) end function t.select( b ) t.selected = b end function t.selectNext() repeat t.selected = t.selected.next until (t.selected == t) or t.selected.visible end function t.selectPrev() repeat t.selected = t.selected.prev until (t.selected == t) or t.selected.visible end function t.selectIn( x, y ) t.selected = t repeat t.selected = t.selected.next until (t.selected == t) or (t.selected.visible and t.selected:contains( x, y )) end function t.selectNextInGroup() --make sure our group is visible, otherwise the loop doesn't end local group = t.selected and t.selected.visible and t.selected.group if not group then return t.selectNext() end repeat t.selectNext() until group == t.selected.group end function t.selectPrevInGroup() --make sure our group is visible, otherwise the loop doesn't end local group = t.selected and t.selected.visible and t.selected.group if not group then return t.selectPrev() end repeat t.selectPrev() until group == t.selected.group end function t.displayGroup( group, show ) local b = t repeat b = b.next b.visible = ( b.group == group ) until b == t t.visible = true end function t.deselect( b ) t.selected = t end setmetatable( t, t ) t.__index = t t.__call = t.new return t