Replace your gui.lua content with this one:
g_gridListContents = {} -- info about binded gridlists g_openedWindows = {} -- {window1table = true, window2table = true, ...} GRIDLIST_UPDATE_CHUNK_SIZE = 10 classInfo = { wnd = {className = 'Window', padding = {25, 10, 10, 10}, isContainer = true}, tbp = {className = 'TabPanel'}, tab = {className = 'Tab', padding = 10, isContainer = true}, lbl = {className = 'Label', height = 20}, btn = {className = 'Button', height = 20, padding = {0, 4}}, chk = {className = 'CheckBox', height = 20, padding = {0, 6}}, rad = {className = 'RadioButton', height = 20, padding = {0, 10}}, txt = {className = 'Edit', width=100, height = 24}, lst = {className = 'GridList', width = 250, height = 400}, img = {className = 'StaticImage'} } function getTextWidth(text) return 8*text:len() end function createWindow(wnd, rebuild) if wnd.element then if rebuild then destroyElement(wnd.element) else guiSetVisible(wnd.element, true) guiBringToFront(wnd.element) g_openedWindows[wnd] = true if wnd.oncreate then wnd.oncreate() end return end end _planWindow(wnd) _buildWindow(wnd) end function _planWindow(wnd, baseWnd, parentWnd, x, y, maxHeightInLine) -- simulate building a window to get the proper height local wndClass = wnd[1] if not maxHeightInLine then maxHeightInLine = LINE_HEIGHT end local text, padding, parentPadding if wndClass ~= 'br' then padding = classInfo[wndClass].padding if type(padding) == 'number' then padding = table.rep(padding, 4) classInfo[wndClass].padding = padding elseif type(padding) == 'table' then if #padding == 1 then padding = table.rep(padding[1], 4) classInfo[wndClass].padding = padding elseif #padding == 2 then padding = table.flatten(table.rep(padding, 2)) classInfo[wndClass].padding = padding elseif #padding == 3 then table.insert(padding, padding[2]) classInfo[wndClass].padding = padding end elseif not padding then padding = table.rep(0, 4) classInfo[wndClass].padding = padding end text = wnd.text or wnd.id or '' if not wnd.width then wnd.width = (classInfo[wndClass].width or getTextWidth(text)) + (not classInfo[wndClass].isContainer and (padding[2] + padding[4]) or 0) end if not wnd.height and not classInfo[wndClass].isContainer then wnd.height = (classInfo[wndClass].height or LINE_HEIGHT) + padding[1] + padding[3] end end parentPadding = parentWnd and classInfo[parentWnd[1]].padding if wndClass == 'br' or (not classInfo[wndClass].isContainer and x + wnd.width > parentWnd.width - parentPadding[2]) then -- line wrap x = parentPadding[4] y = y + maxHeightInLine + LINE_MARGIN maxHeightInLine = LINE_HEIGHT if wndClass == 'br' then return nil, x, y, maxHeightInLine end end if not wnd.x then wnd.x = x end if not wnd.y then wnd.y = y end wnd.parent = parentWnd if wnd.controls then local childX, childY = padding[4], padding[1] local childMaxHeightInLine = LINE_HEIGHT local control for id, controlwnd in pairs(wnd.controls) do control, childX, childY, childMaxHeightInLine = _planWindow(controlwnd, baseWnd or wnd, wnd, childX, childY, childMaxHeightInLine) end if classInfo[wndClass].isContainer then wnd.height = childY + childMaxHeightInLine + padding[3] end end if wnd.tabs then local maxTabHeight = 0 for id, tab in pairs(wnd.tabs) do tab[1] = 'tab' tab.width = wnd.width _planWindow(tab, baseWnd, wnd) if tab.height > maxTabHeight then maxTabHeight = tab.height end end wnd.height = maxTabHeight end if classInfo[wndClass].isContainer then return elem else if wnd.height > maxHeightInLine then maxHeightInLine = wnd.height end return elem, x + wnd.width + CONTROL_MARGIN_RIGHT, y, maxHeightInLine end end function _buildWindow(wnd, baseWnd, parentWnd) local wndClass = wnd[1] if wndClass == 'br' then return end local relX, relY, relWidth, relHeight if parentWnd then if wnd.x and wnd.y then relX = wnd.x/parentWnd.width relY = wnd.y/parentWnd.height end relWidth = wnd.width / parentWnd.width relHeight = wnd.height / parentWnd.height end local elem if wndClass == 'wnd' then local screenWidth, screenHeight = guiGetScreenSize() if not wnd.x then wnd.x = screenWidth/2 - wnd.width/2 else local i, f = math.modf(wnd.x) if f ~= 0 then wnd.x = screenWidth * wnd.x end if wnd.x < 0 then wnd.x = screenWidth - math.abs(wnd.x) - wnd.width end end if not wnd.y then wnd.y = screenHeight/2 - wnd.height/2 else local i, f = math.modf(wnd.y) if f ~= 0 then wnd.y = screenHeight * wnd.y end if wnd.y < 0 then wnd.y = screenHeight - math.abs(wnd.y) - wnd.height end end elem = guiCreateWindow(wnd.x, wnd.y, wnd.width, wnd.height, wnd.text, false) guiWindowSetSizable(elem, false) guiBringToFront(elem) g_openedWindows[wnd] = true elseif wndClass == 'chk' then elem = guiCreateCheckBox(relX, relY, relWidth, relHeight, wnd.text or wnd.id or '', false, true, parentWnd.element) elseif wndClass == 'tbp' then elem = guiCreateTabPanel(relX, relY, relWidth, relHeight, true, parentWnd.element) elseif wndClass == 'tab' then elem = guiCreateTab(text, parentWnd.element) elseif wndClass == 'lst' then elem = guiCreateGridList(relX, relY, relWidth, relHeight, true, parentWnd.element) if wnd.columns then for i, column in ipairs(wnd.columns) do guiGridListAddColumn(elem, column.text or column.attr or '', column.width or 0.9) end end elseif wndClass == 'img' then elem = guiCreateStaticImage(relX, relY, relWidth, relHeight, wnd.src or '', true, parentWnd.element) else elem = _G['guiCreate' .. classInfo[wndClass].className](relX, relY, relWidth, relHeight, wnd.text or wnd.id or '', true, parentWnd.element) if wnd.align and wndClass == 'lbl' then guiLabelSetHorizontalAlign(elem, wnd.align, true) end end wnd.element = elem if wnd.controls then for id, controlwnd in pairs(wnd.controls) do _buildWindow(controlwnd, baseWnd or wnd, wnd) end end if wnd.tabs then for id, tab in pairs(wnd.tabs) do _buildWindow(tab, baseWnd, wnd) end end if wnd.rows then if wnd.rows.xml then -- get rows from xml bindGridListToTable(wnd, not gridListHasCache(wnd) and xmlToTable(wnd.rows.xml, wnd.rows.attrs) or false, wnd.expandlastlevel or wnd.expandlastlevel == nil) else -- rows hardcoded in window definition bindGridListToTable(wnd, not gridListHasCache(wnd) and wnd.rows or false, false) end end local clickhandler = nil if wnd.onclick then if wndClass == 'img' then clickhandler = function(btn, state, x, y) local imgX, imgY = getControlScreenPos(wnd) wnd.onclick((x - imgX)/wnd.width, (y - imgY)/wnd.height, btn) end else clickhandler = function() wnd.onclick() end end elseif wnd.window then clickhandler = function() toggleWindow(wnd.window) end elseif wnd.inputbox then clickhandler = function() wndInput = { 'wnd', width = 170, height = 60, controls = { {'txt', id='input', text='', width=60}, {'btn', id='ok', onclick=function() wnd.inputbox.callback(getControlText(wndInput, 'input')) closeWindow(wndInput) end}, {'btn', id='cancel', closeswindow=true} } } for propname, propval in