Files
love-luigi/luigi/widget/sash.lua
2015-12-19 23:54:57 -05:00

93 lines
2.6 KiB
Lua

--[[--
A sash.
Dragging this widget resizes the widgets adjacent to it.
A sash should be adjacent to a widget with a specified size
in the same direction as the parent element's @{attribute.flow|flow}.
For example, if the parent of the sash is `flow = 'x'`
then either or both of the siblings adjacent to the sash
should have a specified @{attribute.width|width} attribute.
@usage
-- create a layout containing two widgets separated by a sash
local layout = Layout {
type = 'panel', flow = 'x',
{ text = 'This is the left side', wrap = true, width = 100 },
{ type = 'sash' },
{ text = 'This is the right side', wrap = true },
}
-- show the layout
layout:show()
@widget sash
--]]--
local function setDimension (widget, name, size)
if not widget.parent then
widget[name] = size
return
end
local parentDimension = widget.parent:calculateDimension(name)
local claimed = 0
for i, sibling in ipairs(widget.parent) do
local value = sibling[name]
if sibling ~= widget and value then
if value == 'auto' then
value = sibling:calculateDimensionMinimum(name)
end
claimed = claimed + value
end
end
if claimed + size > parentDimension then
size = parentDimension - claimed
end
local min = (name == 'width') and (widget.minwidth or 0)
or (widget.minheight or 0)
widget[name] = math.max(size, min)
end
return function (self)
self:onEnter(function (event)
local axis = self.parent.flow
if axis == 'x' then
self.cursor = 'sizewe'
else
self.cursor = 'sizens'
end
end)
self:onPressDrag(function (event)
if event.button ~= 'left' then return end
local axis = self.parent.flow
if axis == 'x' then
dimension = 'width'
else
axis = 'y'
dimension = 'height'
end
local prevSibling = self:getPreviousSibling()
local nextSibling = self:getNextSibling()
local prevSize = prevSibling and prevSibling[dimension]
local nextSize = nextSibling and nextSibling[dimension]
if prevSize or not nextSize then
setDimension(prevSibling, dimension,
event[axis] - prevSibling:calculatePosition(axis))
elseif nextSize then
if nextSize == 'auto' then
nextSize = nextSibling:calculateDimensionMinimum(dimension)
end
setDimension(nextSibling, dimension,
nextSibling:calculatePosition(axis) + nextSize - event[axis])
end
self.parent:reshape()
end)
end