little tool for tournament cross-tables
draw_data = function()
	love.graphics.setLineWidth(3)
	local namepx, py = 5, 5
	love.graphics.setFont(love.graphics.newFont(Font_size))
	local c = love.graphics.getFont():getHeight() + py*2
	local rside = max_row_width(Data) + namepx*2  -- width of name column
	local nt = table.size(Data)
	local hrow = total_row_width(Data) + namepx*2*nt
	local width = rside + hrow + App.width('Games') + App.width('Total') + namepx*4
	local height = (nt+1)*c
	local top, left = 30,30
	local cx = column_xs(Rows, left+rside, namepx)  -- right margin of each column
	-- border
	love.graphics.rectangle('line', left,top, width,height, 5,5)
	do
		-- first column for names
		local hx = left+rside
		love.graphics.line(hx, top, hx, top+height)
		-- remaining columns
		for i=1,#cx do
			love.graphics.line(cx[i], top, cx[i], top+height)
		end
	end
	-- rows
	for i=1,#Rows do
		love.graphics.line(left, top+i*c, left+width, top+i*c)
		i = i+1
	end
	-- print out row headings
	for i,name in ipairs(Rows) do
		love.graphics.print(name, left+namepx, top+i*c+py)
	end
	-- print out column headings
	local l = left+rside
	for i=1,#Rows do
		local r = cx[i]
		local w = r-l
		local px = (w - App.width(Rows[i])) / 2  -- x padding
		love.graphics.print(Rows[i], l+px, top+py)
		l = r
	end
	-- 'Games' counts number of games played
	love.graphics.print('Games', l+namepx, top+py)
	l = l+App.width('Games')+namepx*2
	-- 'Total' doubles as a button that sorts the rows by teams' total score
	button(Global_state, 'total', {
		x=l, y=top,
		w=App.width('Total')+namepx*2,
		h=c,
		bg = {r=0,g=0,b=0, a=0},  -- nothing
		icon = function(params)
			make_button_pop(params)
			App.color{r=0, g=0, b=0}
			love.graphics.print('Total', params.x+namepx, params.y+py)
		end,
		onpress1 = function()
			Rows = ordered_keys(Data)
		end
	})
	love.graphics.print('Total', l+namepx, top+py)
	-- print out cells
	for y,t1 in ipairs(Rows) do
		l = left+rside
		for x,t2 in ipairs(Rows) do
			if t1 == t2 then
				-- no button
				local px = (cx[x] - l - App.width('X')) / 2
				App.color{r=0, g=0, b=0}
				love.graphics.print('X', l+px, top+y*c+py)
			else
				button(Global_state, t1..t2, {
					x=l, y=top+y*c,
					w=cx[x] - l,
					h=c,
					bg = {r=0,g=0,b=0, a=0},  -- nothing
					icon = function(params)
						make_button_pop(params)
						if Data[t1][t2] then
							local px = (params.w - App.width(Data[t1][t2])) / 2
							App.color{r=0, g=0, b=0}
							love.graphics.print(Data[t1][t2], params.x+px, params.y+py)
						end
					end,
					onpress1 = function()
						local v = Data[t1][t2]
						if v == 'X' then
							return
						elseif v == nil then
							Data[t1][t2] = 2 Data[t2][t1] = 0
							add_result(t1, t2)
						elseif v == 2 then
							Data[t1][t2] = 0 Data[t2][t1] = 2
							delete_result(t1, t2)
							add_result(t2, t1)
						elseif v == 0 then
							Data[t1][t2] = nil Data[t2][t1] = nil
							delete_result(t2, t1)
						else
							error('invalid value')
						end
						Global_state.next_save = Current_time + 3
					end,
				})
			end
			l = cx[x]
		end
		App.color{r=0, g=0, b=0}
		local count = Data[t1].count
		local px = (App.width('Games') - App.width(count)) / 2
		love.graphics.print(count, l+px, top+y*c+py)
		l = l + App.width('Games') + namepx*2
		local total = score(Data, t1)
		local px = (App.width('Total') - App.width(total)) / 2
		love.graphics.print(total, l+px, top+y*c+py)
	end
end