mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 10:26:39 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local ui = require('openmw.ui')
 | 
						|
 | 
						|
---
 | 
						|
-- `openmw_aux.ui` defines utility functions for UI.
 | 
						|
-- Implementation can be found in `resources/vfs/openmw_aux/ui.lua`.
 | 
						|
-- @module ui
 | 
						|
-- @usage local auxUi = require('openmw_aux.ui')
 | 
						|
local aux_ui = {}
 | 
						|
 | 
						|
local function deepContentCopy(content)
 | 
						|
    local result = ui.content{}
 | 
						|
    for _, v in ipairs(content) do
 | 
						|
        result:add(aux_ui.deepLayoutCopy(v))
 | 
						|
    end
 | 
						|
    return result
 | 
						|
end
 | 
						|
 | 
						|
---
 | 
						|
-- @function [parent=#ui] deepLayoutCopy
 | 
						|
-- @param #table layout
 | 
						|
-- @return #table copied layout
 | 
						|
function aux_ui.deepLayoutCopy(layout)
 | 
						|
    local result = {}
 | 
						|
    for k, v in pairs(layout) do
 | 
						|
        if k == 'content' then
 | 
						|
            result[k] = deepContentCopy(v)
 | 
						|
        elseif type(v) == 'table' and getmetatable(v) == nil then
 | 
						|
            result[k] = aux_ui.deepLayoutCopy(v)
 | 
						|
        else
 | 
						|
            result[k] = v
 | 
						|
        end
 | 
						|
    end
 | 
						|
    return result
 | 
						|
end
 | 
						|
 | 
						|
local function isUiElement(v)
 | 
						|
    return v.__type and v.__type.name == 'LuaUi::Element'
 | 
						|
end
 | 
						|
 | 
						|
local function deepElementCallback(layout, callback)
 | 
						|
    if not layout.content then return end
 | 
						|
    for i = 1, #layout.content do
 | 
						|
        local child = layout.content[i]
 | 
						|
        if isUiElement(child) then
 | 
						|
            callback(child)
 | 
						|
            deepElementCallback(child.layout, callback)
 | 
						|
        else
 | 
						|
            deepElementCallback(child, callback)
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
---
 | 
						|
-- Recursively updates all elements in the passed layout or element
 | 
						|
-- @function [parent=#ui] deepUpdate
 | 
						|
-- @param #any elementOrLayout  @{openmw.ui#Layout} or  @{openmw.ui#Element}
 | 
						|
function aux_ui.deepUpdate(elementOrLayout)
 | 
						|
    local layout = elementOrLayout
 | 
						|
    if elementOrLayout.update then
 | 
						|
        elementOrLayout:update()
 | 
						|
        layout = elementOrLayout.layout
 | 
						|
    end
 | 
						|
    deepElementCallback(layout, function (e) e:update() end)
 | 
						|
end
 | 
						|
 | 
						|
---
 | 
						|
-- Recursively destroys all elements in the passed layout or element
 | 
						|
-- @function [parent=#ui] deepDestroy
 | 
						|
-- @param #any elementOrLayout  @{openmw.ui#Layout} or  @{openmw.ui#Element}
 | 
						|
function aux_ui.deepDestroy(elementOrLayout)
 | 
						|
    local layout = elementOrLayout
 | 
						|
    if elementOrLayout.destroy then
 | 
						|
        elementOrLayout:destroy()
 | 
						|
        layout = elementOrLayout.layout
 | 
						|
    end
 | 
						|
    deepElementCallback(layout, function (e) e:destroy() end)
 | 
						|
end
 | 
						|
 | 
						|
return aux_ui
 |