-
Notifications
You must be signed in to change notification settings - Fork 19
/
linear.lua
56 lines (48 loc) · 2.88 KB
/
linear.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
local ipairs = ipairs
local common = require( "ultiLayout.common" )
local edge = require( "ultiLayout.edge" )
local splitter = require( "ultiLayout.widgets.splitter" )
module("ultiLayout.layouts.linear")
local function new(cg,ori)
local data = { ratio = {} }
cg.decorations:add_decoration(splitter(cg,{direction=(ori == "horizontal") and "bottom" or "right", index=1}),{class="splitter",position="top",align="beginning",ontop=true})
cg.decorations:add_decoration(splitter(cg,{direction=(ori == "horizontal") and "top" or "left" , }),{class="splitter",position="top",align="beginning",ontop=true})
local function sum_ratio(only_visible)
local sumratio = 0
for k,v in ipairs(cg:childs()) do
if (only_visible == true and v.visible ~= false and (#v:childs() > 0 or v:has_client() == true)) or only_visible ~= true then --TODO visible childs
sumratio = sumratio + (data.ratio[k] or 1)
end
end
return sumratio
end
local function get_average(only_visible)
return (#cg:childs() > 0) and (sum_ratio(only_visible) / #((only_visible == true) and cg:visible_childs() or cg:childs())) or 1
end
local function size(ratio,w_or_h,orientation)
return ( ori == orientation ) and cg.workarea[w_or_h] or ((ratio or get_average(true)) / sum_ratio(true))*cg.workarea[w_or_h]
end
function data:update()
local relX,relY = cg.workarea.x,cg.workarea.y
for k,v in ipairs(cg:childs()) do
if v.visible ~= false and (#v:childs() > 0 or v:has_client() == true) then --TODO visible childs
v:geometry({width = size(data.ratio[k],"width","horizontal"), height = size(data.ratio[k],"height","vertical"), x = relX, y = relY })
relY,relX = relY + (( ori == "horizontal" ) and v.height or 0),relX + (( ori == "vertical" ) and v.width or 0)
end
end
end
function data:add_child(child_cg,index)
local index,anEdge = index or #cg:childs()+1,edge({cg=child_cg,orientation=ori})
data.ratio[#cg:childs()+1] = child_cg.default_percent or get_average()
anEdge:add_signal("distance_change::request",function(_e, delta)
local diff,idx = (sum_ratio()/cg[(ori == "horizontal") and "height" or "width"])*delta,cg:cg_to_idx(child_cg)
data.ratio[idx-1],data.ratio[idx] = data.ratio[ idx-1 ] + diff,data.ratio[ idx ] - diff
cg:repaint()
end)
child_cg.decorations:add_decoration(anEdge,{class="edge",position=((ori == "vertical") and "left" or "top"),align="ajust",index=1,update_callback= function() anEdge:update() end})
return child_cg
end
return data
end
common.add_new_layout( "horizontal", function(cg) return new(cg,"horizontal" ) end)
common.add_new_layout( "vertical" , function(cg) return new(cg,"vertical" ) end)