Added and fixed form layout+ uneven orientation

Stance/Form/Aura bar layout fix (before wrong), plus support for uneven rows.
This commit is contained in:
Player-Doite
2026-03-26 19:06:25 +01:00
committed by GitHub
parent f43b7c7342
commit c29b69d469
5 changed files with 166 additions and 27 deletions
+115 -14
View File
@@ -1197,10 +1197,45 @@ end
-- returns: array of options as strings for pfUI.gui.bar
function pfUI.api.BarLayoutOptions(barsize)
assert(barsize > 0 and barsize <= NUM_ACTIONBAR_BUTTONS,"BarLayoutOptions: barsize "..tostring(barsize).." is invalid")
local options = {}
for i,layout in ipairs(pfGridmath[barsize]) do
options[i] = string.format("%d x %d",layout[1],layout[2])
local options, seen = {}, {}
local function add(option)
if not seen[option] then
table.insert(options, option)
seen[option] = true
end
end
for i,layout in ipairs(pfGridmath[barsize]) do
add(string.format("%d x %d",layout[1],layout[2]))
end
for _, option in ipairs({
"1 x 15", "1 x 10", "2 x 10", "2 x 5", "3 x 10", "3 x 5", "3 x 3",
"5 x 3", "10 x 3", "5 x 2", "10 x 2", "10 x 1", "15 x 1"
}) do
add(option)
end
table.sort(options, function(a, b)
local _, _, ac, ar = string.find(a, "(%d+)%s*x%s*(%d+)")
local _, _, bc, br = string.find(b, "(%d+)%s*x%s*(%d+)")
ac, ar = tonumber(ac) or 1, tonumber(ar) or 1
bc, br = tonumber(bc) or 1, tonumber(br) or 1
local ah = ac >= ar and 0 or 1
local bh = bc >= br and 0 or 1
if ah ~= bh then return ah < bh end
if ah == 0 then -- horizontal first: wider to narrower
if ac ~= bc then return ac > bc end
return ar < br
else -- vertical: taller to shorter
if ar ~= br then return ar > br end
return ac < bc
end
end)
return options
end
@@ -1225,15 +1260,43 @@ function pfUI.api.BarLayoutFormfactor(option)
end
end
local function ResolveBarLayout(barsize, formfactor, uneven)
local layout = tostring(formfactor or "")
local _, _, a, b = string.find(layout, "(%d+)%s*x%s*(%d+)")
if a and b then
local cols, rows = tonumber(a), tonumber(b)
local orientation = string.upper(uneven or "DOWN")
local mode = (orientation == "LEFT" or orientation == "RIGHT") and "cols" or "rows"
if mode == "rows" then
cols = math.max(1, math.min(cols, barsize))
rows = math.max(1, math.ceil(barsize / cols))
else
rows = math.max(1, math.min(rows, barsize))
cols = math.max(1, math.ceil(barsize / rows))
end
return cols, rows, mode, orientation
end
local index = pfUI.api.BarLayoutFormfactor(layout)
if not index then return nil end
local cols, rows = unpack(pfGridmath[barsize][index])
return cols, rows, "rows", "DOWN"
end
-- [ Bar Layout Size ] --
-- 'bar' frame reference,
-- 'barsize' integer number of buttons,
-- 'formfactor' string formfactor in cols x rows,
-- 'padding' the spacing between buttons
function pfUI.api.BarLayoutSize(bar,barsize,formfactor,iconsize,bordersize,padding)
function pfUI.api.BarLayoutSize(bar,barsize,formfactor,iconsize,bordersize,padding,uneven)
assert(barsize > 0 and barsize <= NUM_ACTIONBAR_BUTTONS,"BarLayoutSize: barsize "..tostring(barsize).." is invalid")
local formfactor = pfUI.api.BarLayoutFormfactor(formfactor)
local cols, rows = unpack(pfGridmath[barsize][formfactor])
local cols, rows = ResolveBarLayout(barsize, formfactor, uneven)
if not cols or not rows then
cols, rows = unpack(pfGridmath[barsize][1])
end
local width = (iconsize + bordersize*2+padding) * cols + padding
local height = (iconsize + bordersize*2+padding) * rows + padding
bar._size = {width,height}
@@ -1248,16 +1311,54 @@ end
-- 'iconsize' size of the button
-- 'bordersize' default bordersize
-- 'padding' the spacing between buttons
function pfUI.api.BarButtonAnchor(button,basename,buttonindex,barsize,formfactor,iconsize,bordersize,padding)
function pfUI.api.BarButtonAnchor(button,basename,buttonindex,barsize,formfactor,iconsize,bordersize,padding,uneven)
assert(barsize > 0 and barsize <= NUM_ACTIONBAR_BUTTONS,"BarButtonAnchor: barsize "..tostring(barsize).." is invalid")
local formfactor = pfUI.api.BarLayoutFormfactor(formfactor)
local cols, rows, mode, orientation = ResolveBarLayout(barsize, formfactor, uneven)
if not cols or not rows then
cols, rows, mode, orientation = unpack(pfGridmath[barsize][1]), "rows", "DOWN"
end
local parent = button:GetParent()
local cols, rows = unpack(pfGridmath[barsize][formfactor])
if buttonindex == 1 then
button._anchor = {"TOPLEFT", parent, "TOPLEFT", bordersize+padding, -bordersize-padding}
local step = iconsize + bordersize*2 + padding
local row, col
if mode == "cols" then
col = math.ceil(buttonindex / rows)
row = buttonindex - ((col-1) * rows)
else
local col = buttonindex-((math.ceil(buttonindex/cols)-1)*cols)
button._anchor = col==1 and {"TOP",_G[basename..(buttonindex-cols)],"BOTTOM",0,-(bordersize*2+padding)} or {"LEFT",_G[basename..(buttonindex-1)],"RIGHT",(bordersize*2+padding),0}
row = math.ceil(buttonindex / cols)
col = buttonindex - ((row-1) * cols)
end
if orientation == "UP" then
row = rows - row + 1
elseif orientation == "LEFT" then
col = cols - col + 1
end
local x = bordersize + padding + (col - 1) * step
local y = -bordersize - padding - (row - 1) * step
if buttonindex == 1 then
button._anchor = {"TOPLEFT", parent, "TOPLEFT", x, y}
else
button._anchor = {"TOPLEFT", parent, "TOPLEFT", x, y}
-- center partially filled final row/column
if mode == "cols" then
local final_col = math.ceil(barsize / rows)
local count = barsize - (final_col - 1) * rows
local target_col = (orientation == "LEFT") and 1 or cols
if count > 0 and count < rows and col == target_col and row == 1 then
button._anchor[5] = button._anchor[5] - (rows - count) * step / 2
end
else
local final_row = math.ceil(barsize / cols)
local count = barsize - (final_row - 1) * cols
local target_row = (orientation == "UP") and 1 or rows
if count > 0 and count < cols and row == target_row and col == 1 then
button._anchor[4] = button._anchor[4] + (cols - count) * step / 2
end
end
end
return button._anchor
end
@@ -1510,4 +1611,4 @@ function pfUI.api.TryMemoizedFuncLoadstringForSpellCasts(funcOrStr)
end
return nil
end
end