diff --git a/.gitignore b/.gitignore deleted file mode 100644 index a19f1fe..0000000 --- a/.gitignore +++ /dev/null @@ -1 +0,0 @@ -busted/ diff --git a/conf.lua b/conf.lua index ed9d1dc..b65f25e 100644 --- a/conf.lua +++ b/conf.lua @@ -1,3 +1,7 @@ function love.conf(t) + t.title = "Pop.Box Demo / Tests" t.console = true + + t.window.width = 960 + t.window.height = 540 end diff --git a/docs/Drawables.md b/docs/Drawables.md index a7575b6..cce1810 100644 --- a/docs/Drawables.md +++ b/docs/Drawables.md @@ -2,6 +2,9 @@ Pop.Box supports three [Drawables][1]: Canvas, Image, Video +**Note**: Video support is theoretical, as I have not tested it. (Well, +everything is theoretical, but I'm writing tests now.) + Additionally, you can use in the place of any Drawable `false` to stop rendering of whatever is using a Drawable, or a table of color values. diff --git a/docs/Elements.md b/docs/Elements.md index 43e1d93..a6ae83c 100644 --- a/docs/Elements.md +++ b/docs/Elements.md @@ -54,7 +54,7 @@ Additional methods: - `getColor()` - Returns background color, or errors if the background is not a color. -TODO Make it possible to just specify skin? +TODO Make it possible to just specify background? ## Text Element @@ -64,10 +64,13 @@ Text is used to draw text. If `parent` not specified, uses `pop.window` (the top level element). If `color` is not specified, uses white. -Additional methods: +Overwritten methods: - `setSize()` - Does not allow you to set the size, instead, it fixes the size if it is incorrect (mostly for internal use). + +Additional methods: + - `setText(text)` - Sets text and modifies size to fit. - `getText()` - Returns text. - `setFont()` - Sets [Font][2] and modifies size to fit. Note: Empty text will @@ -77,7 +80,7 @@ Additional methods: - `setColor(r, g, b, a)` - Sets text color (`a` is alpha, and optional). - `getColor()` - Returns text color. -TODO Make it possible to just specify text, or just text and skin? +TODO Make it possible to just specify text, or just text and color? TODO Make it possible to use setting size on text to actually calculate what font size will make that work? @@ -89,6 +92,9 @@ not be moved unless its own movement methods are used. If you set `excludeRendering` to `true` on any element, it and its children will not be rendered. +If you set `excludeUpdating` to `true` on any element, it and its children will +not be rendered. + [1]: ./Skins.md [2]: https://love2d.org/wiki/Font [3]: ./Drawables.md diff --git a/docs/Pop.md b/docs/Pop.md index 53357df..9dbfd17 100644 --- a/docs/Pop.md +++ b/docs/Pop.md @@ -31,6 +31,8 @@ elements at once. - `pop.update(dt)` is used so that any element can have a frame-by-frame update attached to it. - `pop.draw()` is used to draw everything. +- `pop.debugDraw()` can be used to draw everything in existence, to try to help + figure out exactly what's going on. - `pop.textinput(text)` is used to grab text input for any focused element that can accept it. - `pop.mousepressed(button, x, y)` is used to detect and handle when an element diff --git a/main.lua b/main.lua index 1a32e4d..11614bb 100644 --- a/main.lua +++ b/main.lua @@ -1,18 +1,15 @@ local pop = require "pop" +local lg = love.graphics + +local visualTestsShown = false +local testsRun = false +local debugDrawEnabled = false + function love.load() - local align = pop.box():align("center", "center"):setSize(200, 200) - pop.box(align):align("left", "top"):setSize(75, 10):setColor(255, 0, 255, 255) - pop.box(align):align("center", "top"):setColor(100, 100, 100) - pop.box(align, {0, 255, 0, 255}):setSize(20, 5):align("right", "top") - pop.box(align):align("left", "center"):setColor(0, 0, 255) - pop.box(align):align("center", "center"):setSize(90, 90):setColor(255, 255, 255) - pop.box(align):align("right", "center"):setColor(255, 0, 0) - pop.box(align):align("left", "bottom"):setColor(0, 255, 0) - pop.box(align):align("center", "bottom"):setColor(255, 255, 0) - pop.box(align):align("right", "bottom"):setColor(0, 255, 255) - pop.box(nil, {255, 0, 0, 255}):align("left", "top"):setSize(50, 50) - pop.text(nil, "Hello World!"):align("center"):setText("Hey, I've been modified!") + pop.text(nil, "Press \"s\" to show objects for visual testing/demo.\nPress \"t\" to run tests.\nPress \"d\" to toggle debug draw."):move(2, 2) + --TODO correct the fact that the size is wrong here! (height doesn't take into account \n) + --NOTE width? Is width calculated correctly when \n's exist? TEST THIS (also test tabs) end function love.update(dt) @@ -21,6 +18,10 @@ end function love.draw() pop.draw() + + if debugDrawEnabled then + pop.debugDraw() + end end function love.textinput(text) @@ -39,6 +40,29 @@ function love.keypressed(key) if key == "escape" then love.event.quit() else + if (key == "s") and (not visualTestsShown) then + -- old visual tests + local align = pop.box():align("center", "center"):setSize(200, 200) + pop.box(align):align("left", "top"):setSize(75, 10):setColor(255, 0, 255, 255) + pop.box(align):align("center", "top"):setColor(100, 100, 100) + pop.box(align, {0, 255, 0, 255}):setSize(20, 5):align("right", "top") + pop.box(align):align("left", "center"):setColor(0, 0, 255) + pop.box(align):align("center", "center"):setSize(90, 90):setColor(255, 255, 255) + pop.box(align):align("right", "center"):setColor(255, 0, 0) + pop.box(align):align("left", "bottom"):setColor(0, 255, 0):setSize(nil, 40) + pop.box(align):align("center", "bottom"):setColor(255, 255, 0) + pop.box(align):align("right", "bottom"):setColor(0, 255, 255):setSize(40, 40) + --pop.box(nil, {255, 0, 0, 255}):align("left", "top"):setSize(50, 50) --TODO adjust z-height of elements + pop.text(nil, "Hello World!"):align("center"):setText("Hey, I've been modified!")--:move(0, 18) + pop.text(nil, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()-=_+[]{}\\:;\"',./<>?`~"):align("center", "bottom") + + visualTestsShown = true + elseif (key == "t") and (not testsRun) then + require "test" + elseif key == "d" then + debugDrawEnabled = not debugDrawEnabled + end + pop.keypressed(key) end end diff --git a/pop/elements/box.lua b/pop/elements/box.lua index 63bdeb3..3dad73e 100644 --- a/pop/elements/box.lua +++ b/pop/elements/box.lua @@ -30,6 +30,16 @@ function box:draw() --NOTE these ifs are probably wrong return self end +function box:debugDraw() + lg.setLineWidth(1) + lg.setColor(0, 0, 0, 100) + lg.rectangle("fill", self.x, self.y, self.w, self.h) + lg.setColor(0, 0, 200, 200) + lg.rectangle("line", self.x, self.y, self.w, self.h) + lg.setColor(200, 200, 255, 255) + lg.print("b", self.x, self.y) +end + function box:setBackground(background) self.background = background diff --git a/pop/elements/element.lua b/pop/elements/element.lua index 3b0be75..42d5fa4 100644 --- a/pop/elements/element.lua +++ b/pop/elements/element.lua @@ -1,3 +1,5 @@ +local lg = love.graphics + local path = string.sub(..., 1, string.len(...) - string.len("/elements/element")) local class = require(path .. "/lib/middleclass") @@ -16,6 +18,16 @@ function element:initialize(pop, parent) self.vertical = "top" end +function element:debugDraw() + lg.setLineWidth(1) + lg.setColor(0, 0, 0, 100) + lg.rectangle("fill", self.x, self.y, self.w, self.h) + lg.setColor(0, 200, 0, 200) + lg.rectangle("line", self.x, self.y, self.w, self.h) + lg.setColor(200, 255, 200, 255) + lg.print("e", self.x, self.y) +end + function element:move(x, y) self.x = self.x + x self.y = self.y + y diff --git a/pop/elements/text.lua b/pop/elements/text.lua index 90c229a..f9f3385 100644 --- a/pop/elements/text.lua +++ b/pop/elements/text.lua @@ -22,6 +22,16 @@ function text:draw() return self end +function text:debugDraw() + lg.setLineWidth(1) + lg.setColor(0, 0, 0, 100) + lg.rectangle("fill", self.x, self.y, self.w, self.h) + lg.setColor(200, 0, 0, 200) + lg.rectangle("line", self.x, self.y, self.w, self.h) + lg.setColor(255, 200, 200, 255) + lg.print("t", self.x, self.y) +end + function text:setSize() local w = self.font:getWidth(self.text) local h = self.font:getHeight() diff --git a/pop/init.lua b/pop/init.lua index f6fd611..2a4bd52 100644 --- a/pop/init.lua +++ b/pop/init.lua @@ -45,13 +45,14 @@ function pop.update(dt, element) element = pop.window end - if element.update then - element:update(dt) - end + if not element.excludeUpdating then + if element.update then + element:update(dt) + end - --NOTE add excludeUpdating for performance if needed - for i=1,#element.child do - pop.update(dt, element.child[i]) + for i=1,#element.child do + pop.update(dt, element.child[i]) + end end end @@ -87,6 +88,10 @@ function pop.keyreleased(key) --TODO no idea what to do with this end +function pop.textinput(text) + --TODO something useful will happen here +end + function pop.skin(element, skin, stop) if element.background then element.background = skin.background @@ -105,6 +110,28 @@ function pop.skin(element, skin, stop) end end +function pop.debugDraw(element) + if not element then + element = pop.window + end + + if element.debugDraw then + element:debugDraw() + else + lg.setLineWidth(1) + lg.setColor(0, 0, 0, 100) + lg.rectangle("fill", self.x, self.y, self.w, self.h) + lg.setColor(150, 150, 150, 150) + lg.rectangle("line", self.x, self.y, self.w, self.h) + lg.setColor(200, 200, 200, 255) + lg.print(".", self.x, self.y) + end + + for i=1,#element.child do + pop.debugDraw(element.child[i]) + end +end + pop.load() return pop diff --git a/pop/skins/clear.lua b/pop/skins/clear.lua index 3c863a9..4dee0a9 100644 --- a/pop/skins/clear.lua +++ b/pop/skins/clear.lua @@ -2,6 +2,6 @@ local skin = {} skin.color = {255, 255, 255, 255} skin.background = false -skin.font = love.graphics.newFont(14) +skin.font = love.graphics.newFont(13) return skin diff --git a/test.lua b/test.lua new file mode 100644 index 0000000..2751d87 --- /dev/null +++ b/test.lua @@ -0,0 +1,12 @@ +local pop = require "pop" + +--[[ TODO + +Test using different Drawables: Canvas, Image, Video +- Test without scaling, test with scaling up, test with scaling down. +- Test wtih scaling unevenly (more x / more y, one test for each!). +- Look at what can be done to them, and test doing other things. +- Test using various color tables. +- Test using false. + +]]