From 99fade66258e0d1f23f02b5fdee54ad2cd35236f Mon Sep 17 00:00:00 2001 From: zorfmorf Date: Thu, 12 Feb 2015 13:17:47 +0100 Subject: [PATCH] Added group decorating support: Border, bkg, padding --- button.lua | 2 +- checkbox.lua | 2 +- core.lua | 10 +++++++--- group.lua | 50 +++++++++++++++++++++++++++++++++++++++++++---- input.lua | 2 +- label.lua | 2 +- slider.lua | 2 +- slider2d.lua | 2 +- style-default.lua | 14 ++++++++++++- 9 files changed, 72 insertions(+), 14 deletions(-) diff --git a/button.lua b/button.lua index a1f0589..c63c6fe 100644 --- a/button.lua +++ b/button.lua @@ -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') diff --git a/checkbox.lua b/checkbox.lua index 5137bb0..dbaf953 100644 --- a/checkbox.lua +++ b/checkbox.lua @@ -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 diff --git a/core.lua b/core.lua index 42b1ae1..d1dd999 100644 --- a/core.lua +++ b/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 diff --git a/group.lua b/group.lua index 4889cd4..b02e65d 100644 --- a/group.lua +++ b/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) @@ -62,12 +78,20 @@ local function push(info) assert(size, "Size 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)) - + + 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 @@ -104,21 +133,34 @@ 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() diff --git a/input.lua b/input.lua index b161993..a7e1753 100644 --- a/input.lua +++ b/input.lua @@ -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') diff --git a/label.lua b/label.lua index 345516c..58e5cbc 100644 --- a/label.lua +++ b/label.lua @@ -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) diff --git a/slider.lua b/slider.lua index 4700ae5..2977f80 100644 --- a/slider.lua +++ b/slider.lua @@ -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 diff --git a/slider2d.lua b/slider2d.lua index 19e264c..ca732f6 100644 --- a/slider2d.lua +++ b/slider2d.lua @@ -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 diff --git a/style-default.lua b/style-default.lua index 71f412a..1609a5c 100644 --- a/style-default.lua +++ b/style-default.lua @@ -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, }