Added group decorating support: Border, bkg, padding
This commit is contained in:
parent
4eadfee6f4
commit
99fade6625
9 changed files with 72 additions and 14 deletions
|
@ -69,7 +69,7 @@ return function(w)
|
|||
|
||||
-- core.registerDraw(id, drawfunction, drawfunction-arguments...)
|
||||
-- shows widget when core.draw() is called.
|
||||
core.registerDraw(id, w.draw or core.style.Button,
|
||||
core.registerDraw(id, w.draw or core.style.Button, false,
|
||||
w.text, pos[1],pos[2], size[1],size[2])
|
||||
|
||||
return mouse.releasedOn(id) or keyboard.pressedOn(id, 'return')
|
||||
|
|
|
@ -60,7 +60,7 @@ return function(w)
|
|||
w.checked = not w.checked
|
||||
end
|
||||
|
||||
core.registerDraw(id, w.draw or core.style.Checkbox,
|
||||
core.registerDraw(id, w.draw or core.style.Checkbox, false,
|
||||
w.checked, w.text, w.align or 'left', pos[1], pos[2], size[1], size[2])
|
||||
|
||||
return w.checked ~= checked
|
||||
|
|
10
core.lua
10
core.lua
|
@ -66,7 +66,7 @@ end
|
|||
-- Drawing / Frame update
|
||||
--
|
||||
local draw_items = {n = 0}
|
||||
local function registerDraw(id, f, ...)
|
||||
local function registerDraw(id, f, isGroup, ...)
|
||||
assert(type(f) == 'function' or (getmetatable(f) or {}).__call,
|
||||
'Drawing function is not a callable type!')
|
||||
|
||||
|
@ -78,10 +78,14 @@ local function registerDraw(id, f, ...)
|
|||
end
|
||||
local rest = {n = select('#', ...), ...}
|
||||
draw_items.n = draw_items.n + 1
|
||||
draw_items[draw_items.n] = function()
|
||||
|
||||
local targetindex = draw_items.n
|
||||
if isGroup then targetindex = 1 end
|
||||
|
||||
table.insert(draw_items, targetindex, function()
|
||||
if font then love.graphics.setFont(font) end
|
||||
f(state, unpack(rest, 1, rest.n))
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
-- actually update-and-draw
|
||||
|
|
46
group.lua
46
group.lua
|
@ -24,6 +24,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|||
THE SOFTWARE.
|
||||
]]--
|
||||
|
||||
local BASE = (...):match("(.-)[^%.]+$")
|
||||
local core = nil -- cant load here bc of circular dependencies
|
||||
|
||||
local stack = {n = 0}
|
||||
local default = {
|
||||
pos = {0,0},
|
||||
|
@ -32,6 +35,7 @@ local default = {
|
|||
size = {100, 30},
|
||||
upper_left = {0,0},
|
||||
lower_right = {0,0},
|
||||
pad = 0
|
||||
}
|
||||
local current = default
|
||||
|
||||
|
@ -43,10 +47,14 @@ local Grow = {
|
|||
right = { 1, 0}
|
||||
}
|
||||
|
||||
-- {grow = grow, spacing = spacing, size = size, pos = pos}
|
||||
-- {grow = grow, spacing = spacing, size = size, pos = pos, draw = draw, border = bool, bkg = bool, padding = padding}
|
||||
local function push(info)
|
||||
|
||||
if not core then core = require(BASE .. 'core') end
|
||||
|
||||
local grow = info.grow or "none"
|
||||
local spacing = info.spacing or default.spacing
|
||||
local pad = info.pad or default.pad
|
||||
|
||||
local size = {
|
||||
info.size and info.size[1] or current.size[1],
|
||||
|
@ -54,6 +62,14 @@ local function push(info)
|
|||
}
|
||||
|
||||
local pos = {current.pos[1], current.pos[2]}
|
||||
|
||||
-- apply parent container padding (if any)
|
||||
local parent = stack[stack.n]
|
||||
if parent then
|
||||
pos[1] = pos[1] + parent.pad
|
||||
pos[2] = pos[2] + parent.pad
|
||||
end
|
||||
|
||||
if info.pos then
|
||||
pos[1] = pos[1] + (info.pos[1] or 0)
|
||||
pos[2] = pos[2] + (info.pos[2] or 0)
|
||||
|
@ -63,11 +79,19 @@ local function push(info)
|
|||
assert(pos, "Position neither specified nor derivable from parent group.")
|
||||
grow = assert(Grow[grow], "Invalid grow: " .. tostring(grow))
|
||||
|
||||
local id = info.id
|
||||
if not id then id = core.generateID() end
|
||||
|
||||
current = {
|
||||
pos = pos,
|
||||
grow = grow,
|
||||
size = size,
|
||||
spacing = spacing,
|
||||
pad = pad,
|
||||
border = info.border,
|
||||
bkg = info.bkg,
|
||||
draw = info.draw,
|
||||
id = id,
|
||||
upper_left = { math.huge, math.huge},
|
||||
lower_right = {-math.huge, -math.huge},
|
||||
}
|
||||
|
@ -87,6 +111,11 @@ local function advance(pos, size)
|
|||
if current.grow[2] ~= 0 then
|
||||
current.pos[2] = pos[2] + current.grow[2] * (size[2] + current.spacing)
|
||||
end
|
||||
|
||||
-- adjust for padding
|
||||
--pos[1] = pos[1] + current.pad
|
||||
--pos[2] = pos[2] + current.pad
|
||||
|
||||
return pos, size
|
||||
end
|
||||
|
||||
|
@ -105,20 +134,33 @@ local function getRect(pos, size)
|
|||
pos[1] = pos[1] + current.pos[1]
|
||||
pos[2] = pos[2] + current.pos[2]
|
||||
|
||||
return advance(pos, size)
|
||||
local pos, size = advance(pos, size)
|
||||
pos[1] = pos[1] + current.pad
|
||||
pos[2] = pos[2] + current.pad
|
||||
return pos, size
|
||||
end
|
||||
|
||||
local function pop()
|
||||
assert(stack.n > 0, "Group stack is empty.")
|
||||
|
||||
stack.n = stack.n - 1
|
||||
local child = current
|
||||
current = stack[stack.n] or default
|
||||
|
||||
-- adjust for padding
|
||||
child.lower_right[1] = child.lower_right[1] + child.pad * 2
|
||||
child.lower_right[2] = child.lower_right[2] + child.pad * 2
|
||||
|
||||
local size = {
|
||||
child.lower_right[1] - math.max(child.upper_left[1], current.pos[1]),
|
||||
child.lower_right[2] - math.max(child.upper_left[2], current.pos[2])
|
||||
}
|
||||
advance(current.pos, size)
|
||||
|
||||
if child.bkg or child.border then
|
||||
core.registerDraw(child.id, child.draw or core.style.Group, true,
|
||||
child.bkg, child.border, child.upper_left[1], child.upper_left[2], child.lower_right[1] - child.upper_left[1], child.lower_right[2] - child.upper_left[2])
|
||||
end
|
||||
end
|
||||
|
||||
local function beginFrame()
|
||||
|
|
|
@ -73,7 +73,7 @@ return function(w)
|
|||
w.info.cursor = w.info.cursor + 1
|
||||
end
|
||||
|
||||
core.registerDraw(id, w.draw or core.style.Input,
|
||||
core.registerDraw(id, w.draw or core.style.Input, false,
|
||||
w.info.text, w.info.cursor, pos[1],pos[2], size[1],size[2])
|
||||
|
||||
return mouse.releasedOn(id) or keyboard.pressedOn(id, 'return')
|
||||
|
|
|
@ -53,7 +53,7 @@ return function(w)
|
|||
keyboard.clearFocus()
|
||||
end
|
||||
|
||||
core.registerDraw(id, w.draw or core.style.Label,
|
||||
core.registerDraw(id, w.draw or core.style.Label, false,
|
||||
w.text, w.align, pos[1],pos[2], size[1],size[2])
|
||||
|
||||
return mouse.releasedOn(id)
|
||||
|
|
|
@ -72,7 +72,7 @@ return function(w)
|
|||
end
|
||||
end
|
||||
|
||||
core.registerDraw(id, w.draw or core.style.Slider,
|
||||
core.registerDraw(id, w.draw or core.style.Slider, false,
|
||||
fraction, w.vertical, pos[1],pos[2], size[1],size[2])
|
||||
|
||||
return changed
|
||||
|
|
|
@ -92,7 +92,7 @@ return function(w)
|
|||
end
|
||||
end
|
||||
|
||||
core.registerDraw(id, w.draw or core.style.Slider2D,
|
||||
core.registerDraw(id, w.draw or core.style.Slider2D, false,
|
||||
fraction, pos[1],pos[2], size[1],size[2])
|
||||
|
||||
return changed
|
||||
|
|
|
@ -31,7 +31,8 @@ local utf8 = require(BASE .. 'utf8')
|
|||
local color = {
|
||||
normal = {bg = {78,78,78}, fg = {200,200,200}, border={20,20,20}},
|
||||
hot = {bg = {98,98,98}, fg = {69,201,84}, border={30,30,30}},
|
||||
active = {bg = {88,88,88}, fg = {49,181,64}, border={10,10,10}}
|
||||
active = {bg = {88,88,88}, fg = {49,181,64}, border={10,10,10}},
|
||||
group = {bg = {88,88,88}, border = {255,255,255}}
|
||||
}
|
||||
|
||||
-- box drawing
|
||||
|
@ -189,6 +190,16 @@ local function Checkbox(state, checked, label, align, x,y,w,h)
|
|||
love.graphics.print(label, tx, ty)
|
||||
end
|
||||
|
||||
local function Group(state, bkg, border, x,y,w,h)
|
||||
if bkg then
|
||||
love.graphics.setColor(color.group.bg)
|
||||
love.graphics.rectangle("fill", x, y, w, h)
|
||||
end
|
||||
if border then
|
||||
love.graphics.setColor(color.group.border)
|
||||
love.graphics.rectangle("line", x, y, w, h)
|
||||
end
|
||||
end
|
||||
|
||||
-- the style
|
||||
return {
|
||||
|
@ -201,4 +212,5 @@ return {
|
|||
Slider2D = Slider2D,
|
||||
Input = Input,
|
||||
Checkbox = Checkbox,
|
||||
Group = Group,
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue