|
XWindowLayoutFuncs = {} |
|
XWindowMeasureFuncs = {} |
|
XWindowLayoutMethods = { "None", "Box", "HOverlappingList", "VOverlappingList", "HList", "VList", "HPanel", "VPanel", "Grid", "HWrap", "VWrap" } |
|
|
|
|
|
|
|
|
|
function XWindowMeasureFuncs:None(max_width, max_height) |
|
return max_width, max_height |
|
end |
|
|
|
function XWindowLayoutFuncs:None(x, y, width, height) |
|
end |
|
|
|
|
|
|
|
|
|
function XWindowMeasureFuncs:Box(max_width, max_height) |
|
local width = 0 |
|
local height = 0 |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
win:UpdateMeasure(max_width, max_height) |
|
width = Max(width, win.measure_width) |
|
height = Max(height, win.measure_height) |
|
end |
|
end |
|
return width, height |
|
end |
|
|
|
function XWindowLayoutFuncs:Box(x, y, width, height) |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
win:SetLayoutSpace(x, y, width, height) |
|
end |
|
end |
|
end |
|
|
|
|
|
|
|
function XWindowMeasureFuncs:HOverlappingList(max_width, max_height) |
|
return XWindowMeasureFuncs.HList(self, max_width, max_height) |
|
end |
|
|
|
function XWindowLayoutFuncs:HOverlappingList(x, y, width, height) |
|
local max_item_width, width_sum, items, last_item = 0, 0, 0 |
|
local spacing = ScaleXY(self.scale, self.LayoutHSpacing) |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
max_item_width = Max(max_item_width, win.measure_width) |
|
width_sum = width_sum + win.measure_width |
|
last_item = win |
|
items = items + 1 |
|
end |
|
end |
|
local overflow = 0 |
|
local fill = self.FillOverlappingSpace |
|
if items > 1 then |
|
local total_width = (self.UniformColumnWidth and items * max_item_width or width_sum) + (items - 1) * spacing |
|
overflow = total_width - width |
|
if not fill then |
|
overflow = Max(overflow, 0) |
|
end |
|
end |
|
local n = 1 |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
local item_width = Min(max_item_width, win.measure_width) |
|
win:SetLayoutSpace(x, y, item_width, height) |
|
local move = 0 |
|
if (fill or overflow > 0) and items > 1 then |
|
move = -(overflow * n / (items - 1) - overflow * (n - 1) / (items - 1)) |
|
end |
|
x = x + item_width + spacing + move |
|
n = n + 1 |
|
end |
|
end |
|
end |
|
|
|
|
|
|
|
function XWindowMeasureFuncs:VOverlappingList(max_width, max_height) |
|
return XWindowMeasureFuncs.VList(self, max_width, max_height) |
|
end |
|
|
|
function XWindowLayoutFuncs:VOverlappingList(x, y, width, height) |
|
local max_item_height, height_sum, items, last_item = 0, 0, 0 |
|
local _, spacing = ScaleXY(self.scale, 0, self.LayoutVSpacing) |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
max_item_height = Max(max_item_height, win.measure_height) |
|
height_sum = height_sum + win.measure_height |
|
last_item = win |
|
items = items + 1 |
|
end |
|
end |
|
local overflow = 0 |
|
local fill = self.FillOverlappingSpace |
|
if items > 1 then |
|
local total_height = (self.UniformRowHeight and items * max_item_height or height_sum) + (items - 1) * spacing |
|
overflow = total_height - height |
|
if not fill then |
|
overflow = Max(total_height - height, 0) |
|
end |
|
end |
|
local n = 1 |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
local item_height = Min(max_item_height, win.measure_height) |
|
win:SetLayoutSpace(x, y, width, item_height) |
|
local move = 0 |
|
if (fill or overflow > 0) and items > 1 then |
|
move = -(overflow * n / (items - 1) - overflow * (n - 1) / (items - 1)) |
|
end |
|
y = y + item_height + spacing + move |
|
n = n + 1 |
|
end |
|
end |
|
end |
|
|
|
|
|
|
|
function XWindowMeasureFuncs:HList(max_width, max_height) |
|
local item_width, item_height, width_sum, items = 0, 0, 0, 0 |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
win:UpdateMeasure(max_width, max_height) |
|
item_width = Max(item_width, win.measure_width) |
|
item_height = Max(item_height, win.measure_height) |
|
width_sum = width_sum + win.measure_width |
|
items = items + 1 |
|
end |
|
end |
|
local spacing = ScaleXY(self.scale, self.LayoutHSpacing) |
|
return (self.UniformColumnWidth and items * item_width or width_sum) + Max(0, items - 1) * spacing, item_height |
|
end |
|
|
|
function XWindowLayoutFuncs:HList(x, y, width, height) |
|
local max_item_width = 0 |
|
if self.UniformColumnWidth then |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
max_item_width = Max(max_item_width, win.measure_width) |
|
end |
|
end |
|
end |
|
local spacing = ScaleXY(self.scale, self.LayoutHSpacing) |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
local item_width = Max(max_item_width, win.measure_width) |
|
win:SetLayoutSpace(x, y, item_width, height) |
|
x = x + item_width + spacing |
|
end |
|
end |
|
end |
|
|
|
|
|
|
|
|
|
function XWindowMeasureFuncs:VList(max_width, max_height) |
|
local item_width, item_height, height_sum, items = 0, 0, 0, 0 |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
win:UpdateMeasure(max_width, max_height) |
|
item_width = Max(item_width, win.measure_width) |
|
item_height = Max(item_height, win.measure_height) |
|
height_sum = height_sum + win.measure_height |
|
items = items + 1 |
|
end |
|
end |
|
local _, spacing = ScaleXY(self.scale, 0, self.LayoutVSpacing) |
|
return item_width, (self.UniformRowHeight and items * item_height or height_sum) + Max(0, items - 1) * spacing |
|
end |
|
|
|
function XWindowLayoutFuncs:VList(x, y, width, height) |
|
local max_item_height = 0 |
|
if self.UniformRowHeight then |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
max_item_height = Max(max_item_height, win.measure_height) |
|
end |
|
end |
|
end |
|
local _, spacing = ScaleXY(self.scale, 0, self.LayoutVSpacing) |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
local item_height = Max(max_item_height, win.measure_height) |
|
win:SetLayoutSpace(x, y, width, item_height) |
|
y = y + item_height + spacing |
|
end |
|
end |
|
end |
|
|
|
|
|
|
|
|
|
function XWindowMeasureFuncs:HPanel(max_width, max_height) |
|
local min_width_total_size = 0 |
|
local max_width_total_size = 0 |
|
local total_items = 0 |
|
local sizers = 0 |
|
|
|
for _, win in ipairs(self) do |
|
if not win.Dock and not IsKindOf(win, "XPanelSizer") then |
|
if IsKindOf(win, "XPanelSizer") then |
|
sizers = sizers + 1 |
|
else |
|
local min_width, _, max_width = ScaleXY(win.scale, win.MinWidth, 0, win.MaxWidth) |
|
min_width_total_size = min_width_total_size + min_width |
|
max_width_total_size = max_width_total_size + max_width |
|
total_items = total_items + 1 |
|
end |
|
end |
|
end |
|
|
|
if sizers > 0 then |
|
assert(max_width_total_size >= 100000, "MaxWidths of HPanel's children should be > 1000000") |
|
if max_width_total_size < 100000 then |
|
max_width_total_size = 0 |
|
for _, win in ipairs(self) do |
|
if not win.Dock and not IsKindOf(win, "XPanelSizer") then |
|
win.MaxWidth = 100000 |
|
local max_width = ScaleXY(win.scale, win.MaxWidth) |
|
max_width_total_size = max_width_total_size + max_width |
|
end |
|
end |
|
end |
|
end |
|
|
|
local width_difference_total = max_width_total_size - min_width_total_size |
|
local spacing = ScaleXY(self.scale, self.LayoutHSpacing) |
|
local to_distribute = max_width - min_width_total_size - Max(0, total_items - 1) * spacing |
|
|
|
local used_width, height = 0, 0 |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
local win_min_width, _, win_max_width = ScaleXY(win.scale, win.MinWidth, 0, win.MaxWidth) |
|
local new_width = win_min_width |
|
if not IsKindOf(win, "XPanelSizer") then |
|
local difference = win_max_width - win_min_width |
|
new_width = win_min_width + Max(0, MulDivRound(to_distribute, difference, width_difference_total)) |
|
end |
|
|
|
win:UpdateMeasure(new_width, max_height) |
|
height = Max(height, win.measure_height) |
|
used_width = used_width + win.measure_width |
|
end |
|
end |
|
return used_width + Max(0, total_items - 1) * spacing, height |
|
end |
|
|
|
function XWindowLayoutFuncs:HPanel(x, y, width, height) |
|
local min_width_total_size = 0 |
|
local max_width_total_size = 0 |
|
local total_items = 0 |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
local min_width, _, max_width = ScaleXY(win.scale, win.MinWidth, 0, win.MaxWidth) |
|
min_width_total_size = min_width_total_size + min_width |
|
max_width_total_size = max_width_total_size + max_width |
|
total_items = total_items + 1 |
|
end |
|
end |
|
|
|
local width_difference_total = max_width_total_size - min_width_total_size |
|
local spacing = ScaleXY(self.scale, self.LayoutHSpacing) |
|
local to_distribute = width - min_width_total_size - Max(0, total_items - 1) * spacing |
|
|
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
local min_width, _, max_width = ScaleXY(win.scale, win.MinWidth, 0, win.MaxWidth) |
|
|
|
local new_width = min_width |
|
if not IsKindOf(win, "XPanelSizer") then |
|
local difference = max_width - min_width |
|
new_width = min_width + Max(0, MulDivRound(to_distribute, difference, width_difference_total)) |
|
end |
|
|
|
win:SetLayoutSpace(x, y, new_width, height) |
|
x = x + new_width + spacing |
|
end |
|
end |
|
end |
|
|
|
|
|
|
|
function XWindowMeasureFuncs:VPanel(max_width, max_height) |
|
local min_height_total_size = 0 |
|
local max_height_total_size = 0 |
|
local total_items = 0 |
|
local sizers = 0 |
|
|
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
if IsKindOf(win, "XPanelSizer") then |
|
sizers = sizers + 1 |
|
else |
|
local _, min_height, _, max_height = ScaleXY(win.scale, 0, win.MinHeight, 0, win.MaxHeight) |
|
min_height_total_size = min_height_total_size + min_height |
|
max_height_total_size = max_height_total_size + max_height |
|
total_items = total_items + 1 |
|
end |
|
end |
|
end |
|
|
|
if sizers > 0 then |
|
assert(max_height_total_size >= 100000, "MaxHeights of VPanel's children should be > 1000000") |
|
if max_height_total_size < 100000 then |
|
max_height_total_size = 0 |
|
for _, win in ipairs(self) do |
|
if not win.Dock and not IsKindOf(win, "XPanelSizer") then |
|
win.MaxHeight = 100000 |
|
local _, max_height = ScaleXY(win.scale, 0, win.MaxHeight) |
|
max_height_total_size = max_height_total_size + max_height |
|
end |
|
end |
|
end |
|
end |
|
|
|
local height_difference_total = max_height_total_size - min_height_total_size |
|
local _, spacing = ScaleXY(self.scale, 0, self.LayoutVSpacing) |
|
local to_distribute = max_height - min_height_total_size - Max(0, total_items - 1) * spacing |
|
|
|
local used_height, width = 0, 0 |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
local _, win_min_height, _, win_max_height = ScaleXY(win.scale, 0, win.MinHeight, 0, win.MaxHeight) |
|
local new_height = win_min_height |
|
if not IsKindOf(win, "XPanelSizer") then |
|
local difference = win_max_height - win_min_height |
|
new_height = win_min_height + Max(0, MulDivRound(to_distribute, difference, height_difference_total)) |
|
end |
|
|
|
win:UpdateMeasure(max_width, new_height) |
|
width = Max(width, win.measure_width) |
|
used_height = used_height + win.measure_height |
|
end |
|
end |
|
return width, used_height + Max(0, total_items - 1) * spacing |
|
end |
|
|
|
function XWindowLayoutFuncs:VPanel(x, y, width, height) |
|
local min_height_total_size = 0 |
|
local max_height_total_size = 0 |
|
local total_items = 0 |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
local _, min_height, _, max_height = ScaleXY(win.scale, 0, win.MinHeight, 0, win.MaxHeight) |
|
min_height_total_size = min_height_total_size + min_height |
|
max_height_total_size = max_height_total_size + max_height |
|
total_items = total_items + 1 |
|
end |
|
end |
|
|
|
local height_difference_total = max_height_total_size - min_height_total_size |
|
local _, spacing = ScaleXY(self.scale, 0, self.LayoutVSpacing) |
|
local to_distribute = height - min_height_total_size - Max(0, total_items - 1) * spacing |
|
|
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
local _, min_height, _, max_height = ScaleXY(win.scale, 0, win.MinHeight, 0, win.MaxHeight) |
|
|
|
local new_height = min_height |
|
if not IsKindOf(win, "XPanelSizer") then |
|
local difference = max_height - min_height |
|
new_height = min_height + Max(0, MulDivRound(to_distribute, difference, height_difference_total)) |
|
end |
|
|
|
win:SetLayoutSpace(x, y, width, new_height) |
|
y = y + new_height + spacing |
|
end |
|
end |
|
end |
|
|
|
|
|
|
|
function XWindowMeasureFuncs:Grid(max_width, max_height) |
|
local width, height = 0, 0 |
|
local max_col, max_row = 0, 0 |
|
local col_width, row_height |
|
local col_widths, row_heights |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
win:UpdateMeasure(max_width, max_height) |
|
max_col = Max(max_col, win.GridX + win.GridWidth - 1) |
|
max_row = Max(max_row, win.GridY + win.GridHeight - 1) |
|
local width_per_col = win.measure_width / win.GridWidth |
|
local height_per_row = win.measure_height / win.GridHeight |
|
if self.UniformColumnWidth then |
|
col_width = Max(col_width, width_per_col) |
|
else |
|
col_widths = col_widths or {} |
|
for i = win.GridX, win.GridX + win.GridWidth - 1 do |
|
col_widths[i] = Max(col_widths[i], width_per_col) |
|
end |
|
end |
|
if self.UniformRowHeight then |
|
row_height = Max(row_height, height_per_row) |
|
else |
|
row_heights = row_heights or {} |
|
for i = win.GridY, win.GridY + win.GridHeight - 1 do |
|
row_heights[i] = Max(row_heights[i], height_per_row) |
|
end |
|
end |
|
end |
|
end |
|
local h_spacing, v_spacing = ScaleXY(self.scale, self.LayoutHSpacing, self.LayoutVSpacing) |
|
for i = 1, max_col do |
|
width = width + (col_width or col_widths[i] or 0) |
|
end |
|
width = width + Max(0, max_col - 1) * h_spacing |
|
for i = 1, max_row do |
|
height = height + (row_height or row_heights[i] or 0) |
|
end |
|
height = height + Max(0, max_row - 1) * v_spacing |
|
return width, height |
|
end |
|
|
|
function XWindowLayoutFuncs:Grid(x, y, width, height) |
|
local col_width, row_height |
|
local col_widths, row_heights = {}, {} |
|
local num_cols, num_rows |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
local width_per_col = win.measure_width / win.GridWidth |
|
local height_per_row = win.measure_height / win.GridHeight |
|
if self.UniformColumnWidth then |
|
col_width = Max(col_width, width_per_col) |
|
else |
|
for i = win.GridX, win.GridX + win.GridWidth - 1 do |
|
col_widths[i] = Max(col_widths[i], width_per_col) |
|
end |
|
end |
|
num_cols = Max(num_cols, win.GridX + win.GridWidth - 1) |
|
if self.UniformRowHeight then |
|
row_height = Max(row_height, height_per_row) |
|
else |
|
for i = win.GridY, win.GridY + win.GridHeight - 1 do |
|
row_heights[i] = Max(row_heights[i], height_per_row) |
|
end |
|
end |
|
num_rows = Max(num_rows, win.GridY + win.GridHeight - 1) |
|
end |
|
end |
|
local total_width, total_height = 0, 0 |
|
local h_spacing, v_spacing = ScaleXY(self.scale, self.LayoutHSpacing, self.LayoutVSpacing) |
|
if self.UniformColumnWidth then |
|
total_width = col_width * num_cols |
|
else |
|
for i = 1, num_cols do |
|
total_width = total_width + (col_widths[i] or 0) |
|
end |
|
end |
|
|
|
local h_spacing_sum = Max(0, num_cols - 1) * h_spacing |
|
local total_width_noSpacing = total_width |
|
local width_noSpacing = width - h_spacing_sum |
|
total_width = total_width + h_spacing_sum |
|
|
|
if self.UniformRowHeight then |
|
total_height = row_height * num_rows |
|
else |
|
for i = 1, num_rows do |
|
total_height = total_height + (row_heights[i] or 0) |
|
end |
|
end |
|
|
|
local v_spacing_sum = Max(0, num_rows - 1) * v_spacing |
|
local total_height_noSpacing = total_height |
|
local height_noSpacing = height - v_spacing_sum |
|
total_height = total_height + v_spacing_sum |
|
|
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
local x_left = x |
|
local space_width = 0 |
|
if total_width_noSpacing > 0 then |
|
for i = 1, win.GridX - 1 do |
|
|
|
|
|
|
|
|
|
if self.GridStretchX then |
|
x_left = x_left + (col_width or col_widths[i] or 0) * width_noSpacing / total_width_noSpacing |
|
else |
|
x_left = x_left + (col_width or col_widths[i] or 0) |
|
end |
|
end |
|
x_left = x_left + Max(0, (win.GridX - 1)) * h_spacing |
|
for i = win.GridX, win.GridX + win.GridWidth - 1 do |
|
if self.GridStretchX then |
|
space_width = space_width + (col_width or col_widths[i] or 0) * width_noSpacing / total_width_noSpacing |
|
else |
|
space_width = space_width + (col_width or col_widths[i] or 0) |
|
end |
|
end |
|
space_width = space_width + Max(0, (win.GridWidth - 1)) * h_spacing |
|
end |
|
local y_top = y |
|
local space_height = 0 |
|
if total_height_noSpacing > 0 then |
|
for i = 1, win.GridY - 1 do |
|
if self.GridStretchY then |
|
y_top = y_top + (row_height or row_heights[i] or 0) * height_noSpacing / total_height_noSpacing |
|
else |
|
y_top = y_top + (row_height or row_heights[i] or 0) |
|
end |
|
end |
|
y_top = y_top + Max(0, (win.GridY - 1)) * v_spacing |
|
for i = win.GridY, win.GridY + win.GridHeight - 1 do |
|
if self.GridStretchY then |
|
space_height = space_height + (row_height or row_heights[i] or 0) * height_noSpacing / total_height_noSpacing |
|
else |
|
space_height = space_height + (row_height or row_heights[i] or 0) |
|
end |
|
end |
|
space_height = space_height + Max(0, (win.GridHeight - 1)) * v_spacing |
|
end |
|
win:SetLayoutSpace(x_left, y_top, space_width, space_height) |
|
end |
|
end |
|
end |
|
|
|
|
|
|
|
function XWindowMeasureFuncs:HWrap(max_width, max_height) |
|
local line_width, line_height, total_width, total_height = 0, 0, 0, 0 |
|
local max_item_width, max_item_height, items = 0, 0, 0 |
|
local h_spacing, v_spacing = ScaleXY(self.scale, self.LayoutHSpacing, self.LayoutVSpacing) |
|
|
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
win:UpdateMeasure(max_width, max_height) |
|
max_item_width = self.UniformColumnWidth and Max(max_item_width, win.measure_width) or max_item_width |
|
max_item_height = self.UniformRowHeight and Max(max_item_height, win.measure_height) or max_item_height |
|
end |
|
end |
|
|
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
local item_width = Max(max_item_width, win.measure_width) |
|
local item_height = Max(max_item_height, win.measure_height) |
|
local new_width = line_width + (line_width > 0 and h_spacing or 0) + item_width |
|
if new_width > max_width then |
|
total_width = Max(total_width, line_width) |
|
total_height = total_height + (total_height > 0 and v_spacing or 0) + line_height |
|
line_width = item_width |
|
line_height = item_height |
|
else |
|
line_width = new_width |
|
line_height = Max(line_height, item_height) |
|
end |
|
items = items + 1 |
|
end |
|
end |
|
total_width = Max(total_width, line_width) |
|
total_height = total_height + (total_height > 0 and v_spacing or 0) + line_height |
|
return total_width, total_height |
|
end |
|
|
|
function XWindowLayoutFuncs:HWrap(x, y, width, height) |
|
local x_left = x |
|
local max_item_width, max_item_height = 0, 0 |
|
if self.UniformColumnWidth or self.UniformRowHeight then |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
max_item_width = self.UniformColumnWidth and Max(max_item_width, win.measure_width) or max_item_width |
|
max_item_height = self.UniformRowHeight and Max(max_item_height, win.measure_height) or max_item_height |
|
end |
|
end |
|
end |
|
local h_spacing, v_spacing = ScaleXY(self.scale, self.LayoutHSpacing, self.LayoutVSpacing) |
|
local line_height = 0 |
|
for i = 1, #self do |
|
local win = self[i] |
|
if not win.Dock then |
|
local item_width = Max(max_item_width, win.measure_width) |
|
local item_height = Max(max_item_height, win.measure_height) |
|
local x_right = x + item_width |
|
if x_right > x_left + width then |
|
local x_offset = x_left |
|
if self.HAlign == "center" then |
|
|
|
local line_items_width = 0 |
|
for j = i, #self do |
|
local line_win = self[j] |
|
if line_items_width > width then |
|
|
|
break |
|
end |
|
line_items_width = line_items_width + Max(max_item_width, line_win.measure_width) |
|
end |
|
if line_items_width < width then |
|
x_offset = x_left + (width - line_items_width) / 2 |
|
end |
|
end |
|
x = x_offset |
|
y = y + line_height + (line_height > 0 and v_spacing or 0) |
|
line_height = 0 |
|
end |
|
win:SetLayoutSpace(x, y, item_width, item_height) |
|
line_height = Max(line_height, item_height) |
|
x = x + item_width + h_spacing |
|
end |
|
end |
|
end |
|
|
|
|
|
|
|
function XWindowMeasureFuncs:VWrap(max_width, max_height) |
|
local col_width, col_height, total_width, total_height = 0, 0, 0, 0 |
|
local max_item_width, max_item_height, items = 0, 0, 0 |
|
local h_spacing, v_spacing = ScaleXY(self.scale, self.LayoutHSpacing, self.LayoutVSpacing) |
|
|
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
win:UpdateMeasure(max_width, max_height) |
|
max_item_width = self.UniformColumnWidth and Max(max_item_width, win.measure_width) or max_item_width |
|
max_item_height = self.UniformRowHeight and Max(max_item_height, win.measure_height) or max_item_height |
|
end |
|
end |
|
|
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
local item_width = Max(max_item_width, win.measure_width) |
|
local item_height = Max(max_item_height, win.measure_height) |
|
local new_height = col_height + (col_height > 0 and v_spacing or 0) + item_height |
|
if new_height > max_height then |
|
total_height = Max(total_height, col_height) |
|
total_width = total_width + (total_width > 0 and h_spacing or 0) + col_width |
|
col_width = item_width |
|
col_height = item_height |
|
else |
|
col_height = new_height |
|
col_width = Max(col_width, item_width) |
|
end |
|
items = items + 1 |
|
end |
|
end |
|
total_height = Max(total_height, col_height) |
|
total_width = total_width + (total_width > 0 and h_spacing or 0) + col_width |
|
return total_width, total_height |
|
end |
|
|
|
function XWindowLayoutFuncs:VWrap(x, y, width, height) |
|
local y_top = y |
|
local max_item_width, max_item_height = 0, 0 |
|
if self.UniformColumnWidth or self.UniformRowHeight then |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
max_item_width = self.UniformColumnWidth and Max(max_item_width, win.measure_width) or max_item_width |
|
max_item_height = self.UniformRowHeight and Max(max_item_height, win.measure_height) or max_item_height |
|
end |
|
end |
|
end |
|
local h_spacing, v_spacing = ScaleXY(self.scale, self.LayoutHSpacing, self.LayoutVSpacing) |
|
local line_width = 0 |
|
for _, win in ipairs(self) do |
|
if not win.Dock then |
|
local item_width = Max(max_item_width, win.measure_width) |
|
local item_height = Max(max_item_height, win.measure_height) |
|
local y_bottom = y + item_height |
|
if y_bottom > y_top + height then |
|
y = y_top |
|
x = x + line_width + (line_width > 0 and h_spacing or 0) |
|
line_width = 0 |
|
end |
|
win:SetLayoutSpace(x, y, item_width, item_height) |
|
line_width = Max(line_width, item_width) |
|
y = y + item_height + v_spacing |
|
end |
|
end |
|
end |