Added group decorating support: Border, bkg, padding

This commit is contained in:
zorfmorf 2015-02-12 13:17:47 +01:00
parent 4eadfee6f4
commit 99fade6625
9 changed files with 72 additions and 14 deletions

View file

@ -69,7 +69,7 @@ return function(w)
-- core.registerDraw(id, drawfunction, drawfunction-arguments...) -- core.registerDraw(id, drawfunction, drawfunction-arguments...)
-- shows widget when core.draw() is called. -- 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]) w.text, pos[1],pos[2], size[1],size[2])
return mouse.releasedOn(id) or keyboard.pressedOn(id, 'return') return mouse.releasedOn(id) or keyboard.pressedOn(id, 'return')

View file

@ -60,7 +60,7 @@ return function(w)
w.checked = not w.checked w.checked = not w.checked
end 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]) w.checked, w.text, w.align or 'left', pos[1], pos[2], size[1], size[2])
return w.checked ~= checked return w.checked ~= checked

View file

@ -66,7 +66,7 @@ end
-- Drawing / Frame update -- Drawing / Frame update
-- --
local draw_items = {n = 0} 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, assert(type(f) == 'function' or (getmetatable(f) or {}).__call,
'Drawing function is not a callable type!') 'Drawing function is not a callable type!')
@ -78,10 +78,14 @@ local function registerDraw(id, f, ...)
end end
local rest = {n = select('#', ...), ...} local rest = {n = select('#', ...), ...}
draw_items.n = draw_items.n + 1 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 if font then love.graphics.setFont(font) end
f(state, unpack(rest, 1, rest.n)) f(state, unpack(rest, 1, rest.n))
end end)
end end
-- actually update-and-draw -- actually update-and-draw

View file

@ -24,6 +24,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. THE SOFTWARE.
]]-- ]]--
local BASE = (...):match("(.-)[^%.]+$")
local core = nil -- cant load here bc of circular dependencies
local stack = {n = 0} local stack = {n = 0}
local default = { local default = {
pos = {0,0}, pos = {0,0},
@ -32,6 +35,7 @@ local default = {
size = {100, 30}, size = {100, 30},
upper_left = {0,0}, upper_left = {0,0},
lower_right = {0,0}, lower_right = {0,0},
pad = 0
} }
local current = default local current = default
@ -43,10 +47,14 @@ local Grow = {
right = { 1, 0} 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) local function push(info)
if not core then core = require(BASE .. 'core') end
local grow = info.grow or "none" local grow = info.grow or "none"
local spacing = info.spacing or default.spacing local spacing = info.spacing or default.spacing
local pad = info.pad or default.pad
local size = { local size = {
info.size and info.size[1] or current.size[1], 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]} 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 if info.pos then
pos[1] = pos[1] + (info.pos[1] or 0) pos[1] = pos[1] + (info.pos[1] or 0)
pos[2] = pos[2] + (info.pos[2] 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.") assert(pos, "Position neither specified nor derivable from parent group.")
grow = assert(Grow[grow], "Invalid grow: " .. tostring(grow)) grow = assert(Grow[grow], "Invalid grow: " .. tostring(grow))
local id = info.id
if not id then id = core.generateID() end
current = { current = {
pos = pos, pos = pos,
grow = grow, grow = grow,
size = size, size = size,
spacing = spacing, spacing = spacing,
pad = pad,
border = info.border,
bkg = info.bkg,
draw = info.draw,
id = id,
upper_left = { math.huge, math.huge}, upper_left = { math.huge, math.huge},
lower_right = {-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 if current.grow[2] ~= 0 then
current.pos[2] = pos[2] + current.grow[2] * (size[2] + current.spacing) current.pos[2] = pos[2] + current.grow[2] * (size[2] + current.spacing)
end end
-- adjust for padding
--pos[1] = pos[1] + current.pad
--pos[2] = pos[2] + current.pad
return pos, size return pos, size
end end
@ -105,20 +134,33 @@ local function getRect(pos, size)
pos[1] = pos[1] + current.pos[1] pos[1] = pos[1] + current.pos[1]
pos[2] = pos[2] + current.pos[2] 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 end
local function pop() local function pop()
assert(stack.n > 0, "Group stack is empty.") assert(stack.n > 0, "Group stack is empty.")
stack.n = stack.n - 1 stack.n = stack.n - 1
local child = current local child = current
current = stack[stack.n] or default 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 = { local size = {
child.lower_right[1] - math.max(child.upper_left[1], current.pos[1]), 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]) child.lower_right[2] - math.max(child.upper_left[2], current.pos[2])
} }
advance(current.pos, size) 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 end
local function beginFrame() local function beginFrame()

View file

@ -73,7 +73,7 @@ return function(w)
w.info.cursor = w.info.cursor + 1 w.info.cursor = w.info.cursor + 1
end 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]) w.info.text, w.info.cursor, pos[1],pos[2], size[1],size[2])
return mouse.releasedOn(id) or keyboard.pressedOn(id, 'return') return mouse.releasedOn(id) or keyboard.pressedOn(id, 'return')

View file

@ -53,7 +53,7 @@ return function(w)
keyboard.clearFocus() keyboard.clearFocus()
end 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]) w.text, w.align, pos[1],pos[2], size[1],size[2])
return mouse.releasedOn(id) return mouse.releasedOn(id)

View file

@ -72,7 +72,7 @@ return function(w)
end end
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]) fraction, w.vertical, pos[1],pos[2], size[1],size[2])
return changed return changed

View file

@ -92,7 +92,7 @@ return function(w)
end end
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]) fraction, pos[1],pos[2], size[1],size[2])
return changed return changed

View file

@ -31,7 +31,8 @@ local utf8 = require(BASE .. 'utf8')
local color = { local color = {
normal = {bg = {78,78,78}, fg = {200,200,200}, border={20,20,20}}, 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}}, 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 -- box drawing
@ -189,6 +190,16 @@ local function Checkbox(state, checked, label, align, x,y,w,h)
love.graphics.print(label, tx, ty) love.graphics.print(label, tx, ty)
end 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 -- the style
return { return {
@ -201,4 +212,5 @@ return {
Slider2D = Slider2D, Slider2D = Slider2D,
Input = Input, Input = Input,
Checkbox = Checkbox, Checkbox = Checkbox,
Group = Group,
} }