wip close buttons, titleoverflow controls, etc

This commit is contained in:
Paul Liverman III 2016-04-17 20:37:55 -07:00
parent a24bd88a17
commit 16b9d28973
13 changed files with 383 additions and 66 deletions

View File

@ -2,6 +2,7 @@ local lg = love.graphics
local pop, inspect local pop, inspect
local debugDraw = false local debugDraw = false
local videoFile = lg.newVideo("test.ogv") -- so we can loop playback
function love.load() function love.load()
print(love.getVersion()) print(love.getVersion())
@ -30,7 +31,6 @@ function love.load()
--b:margin(2) -- testing streamlined_get_set extension --b:margin(2) -- testing streamlined_get_set extension
b:fill() -- testing fill! b:fill() -- testing fill!
---[[
w2 = pop.window(nil, "Window") w2 = pop.window(nil, "Window")
w2:move(100, 100) w2:move(100, 100)
w2:setWidth(500) w2:setWidth(500)
@ -39,14 +39,15 @@ function love.load()
w2:move(0, -175) w2:move(0, -175)
w2.title:align("center") w2.title:align("center")
w2:position(0, 0) w2:position(0, 0)
--w2:setAlignment("right")
w2:size(200, 120):position(90, 70) w2:size(200, 120):position(90, 70)
--w2:align("center") w2:setClose(false)
--w2:setAlignment("center"):align("center") local t2 = pop.text("Click here to toggle close\nbutton on this window."):setMargin(10):setColor(0,0,0)
t2.clicked = function()
--w2.child[1]:setBackground {100, 100, 100, 255} print("CALLED") --NOTE not working!
--w2.child[3]:setBackground {160, 140, 40, 255} w2:setClose(not w2:hasClose())
--]] return true
end
w2:addChild(t2)
local test = lg.newImage("test.png") local test = lg.newImage("test.png")
G = pop.element():align("right"):move(-2, 2) G = pop.element():align("right"):move(-2, 2)
@ -58,14 +59,23 @@ function love.load()
print(b.horizontal, b.vertical) print(b.horizontal, b.vertical)
print(c.horizontal, c.vertical) print(c.horizontal, c.vertical)
local window = pop.window():align("center", "center"):setTitle("Welcome!") local window = pop.window():align("center", "center"):setTitle("Welcome! This title is far too big!")
--window:addChild(pop.text("Welcome to Pop.Box()!")) --window:addChild(pop.text("Welcome to Pop.Box()!"))
pop.window():setClose(false):setClose(true)
local video = pop.box():align("right", "bottom"):setBackground(videoFile):setSize(320/2, 240/2):move(-20, -20)
videoFile:play()
--TODO make debugDraw better --TODO make debugDraw better
end end
function love.update(dt) function love.update(dt)
pop.update(dt) pop.update(dt)
if not videoFile:isPlaying() then
videoFile:rewind()
end
end end
function love.draw() function love.draw()

View File

@ -28,6 +28,7 @@ do
end end
insert(self.child, child) insert(self.child, child)
child.parent = self child.parent = self
child:align()
return self return self
end, end,
removeChild = function(self, child) removeChild = function(self, child)
@ -41,7 +42,7 @@ do
return self return self
end end
end end
return error("Element \"" .. tostring(child) .. "\" is not a child of element \"" .. tostring(self) .. "\". Cannot remove it.") return "Element \"" .. tostring(child) .. "\" is not a child of element \"" .. tostring(self) .. "\". Cannot remove it."
end end
end, end,
getChildren = function(self) getChildren = function(self)
@ -240,7 +241,8 @@ do
for k, v in ipairs(self.child) do for k, v in ipairs(self.child) do
v:delete() v:delete()
end end
return self.parent:removeChild(self) self.parent:removeChild(self)
self = nil
end end
} }
_base_0.__index = _base_0 _base_0.__index = _base_0

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

View File

@ -17,6 +17,12 @@ local path = sub(..., 1, len(...) - len("/window"))
local element = require(tostring(path) .. "/element") local element = require(tostring(path) .. "/element")
local box = require(tostring(path) .. "/box") local box = require(tostring(path) .. "/box")
local text = require(tostring(path) .. "/text") local text = require(tostring(path) .. "/text")
local closeImage = {
100,
0,
0,
80
}
local left = 1 local left = 1
local mousemoved_event = true local mousemoved_event = true
do do
@ -60,6 +66,14 @@ do
local result = self.window:removeChild(child) local result = self.window:removeChild(child)
if result == self.window then if result == self.window then
return self return self
elseif type(result) == "string" then
for k, v in ipairs(self.child) do
if v == child then
remove(self.child, k)
return self
end
end
return "Element \"" .. tostring(child) .. "\" is not a child of window \"" .. tostring(self) .. "\". Cannot remove it."
else else
return result return result
end end
@ -85,11 +99,18 @@ do
elseif "right" == _exp_0 then elseif "right" == _exp_0 then
x = x - (w - self.w) x = x - (w - self.w)
end end
self.head:setWidth(w) if self.close then
self.head:setWidth(w - self.head:getHeight())
else
self.head:setWidth(w)
end
self.window:setWidth(w) self.window:setWidth(w)
self.w = w self.w = w
self.x = self.x + x self.x = self.x + x
self.title:align() self.title:align()
if self.close then
self.close:align()
end
end end
if h then if h then
h = h - self.head:getHeight() h = h - self.head:getHeight()
@ -115,11 +136,18 @@ do
elseif "right" == _exp_0 then elseif "right" == _exp_0 then
x = x - (w - self.w) x = x - (w - self.w)
end end
self.head:setWidth(w) if self.close then
self.head:setWidth(w - self.head:getHeight())
else
self.head:setWidth(w)
end
self.window:setWidth(w) self.window:setWidth(w)
self.w = w self.w = w
self.x = self.x + x self.x = self.x + x
self.title:align() self.title:align()
if self.close then
self.close:align()
end
self.head:move(x) self.head:move(x)
self.window:move(x) self.window:move(x)
return self return self
@ -143,10 +171,50 @@ do
end, end,
setTitle = function(self, title) setTitle = function(self, title)
self.title:setText(title) self.title:setText(title)
if self.titleOverflow == "trunicate" then
while self.title:getWidth() > self.head:getWidth() do
title = title:sub(1, -3)
self.title:setText(title .. "")
end
elseif self.titleOverflow == "resize" then
if self.title:getWidth() > self.head:getWidth() then
self:setWidth(self.title:getWidth())
end
end
return self return self
end, end,
getTitle = function(self) getTitle = function(self)
return self.title:getText() return self.title:getText()
end,
setTitleOverflow = function(self, method)
self.titleOverflow = method
return self
end,
getTitleOverflow = function(self)
return self.titleOverflow
end,
setClose = function(self, enabled)
if enabled then
self.close = box(self, closeImage)
local height = self.head:getHeight()
self.close:align("right"):setSize(height, height)
self.head:setWidth(self.w - height)
self.title:align()
insert(self.child, self.close)
else
self.close:delete()
self.head:setWidth(self.w)
self.title:align()
self.close = false
end
return self
end,
hasClose = function(self)
if self.close then
return true
else
return false
end
end end
} }
_base_0.__index = _base_0 _base_0.__index = _base_0
@ -184,15 +252,24 @@ do
self.head = box(self, tBackground) self.head = box(self, tBackground)
self.title = text(self, title, tColor) self.title = text(self, title, tColor)
self.window = box(self, wBackground) self.window = box(self, wBackground)
self.close = box(self, closeImage)
local height = self.title:getHeight() local height = self.title:getHeight()
self.head:setSize(self.w, height) self.head:setSize(self.w - height, height)
self.window:move(nil, height) self.window:move(nil, height)
self.close:align("right"):setSize(height, height)
self:setSize(100, 80) self:setSize(100, 80)
self.child = { self.child = {
self.head, self.head,
self.title, self.title,
self.window self.window,
self.close
} }
self.titleOverflow = "trunicate"
self.close.clicked = function()
print("CLOSE WAS CLICKED")
self:delete()
return true
end
self.head.selected = false self.head.selected = false
if mousemoved_event then if mousemoved_event then
self.head.mousemoved = function(self, x, y, dx, dy) self.head.mousemoved = function(self, x, y, dx, dy)

View File

@ -156,30 +156,57 @@ pop.mousepressed = function(x, y, button, element)
end end
return handled return handled
end end
pop.mousereleased = function(x, y, button) pop.mousereleased = function(x, y, button, element)
print("mousereleased", x, y, button)
local clickedHandled = false local clickedHandled = false
local mousereleasedHandled = false local mousereleasedHandled = false
do if element then
local element = pop.events[button] if (x >= element.x) and (x <= element.x + element.w) and (y >= element.y) and (y <= element.y + element.h) then
if element then
if element.clicked and (not element.excludeDraw) then if element.clicked and (not element.excludeDraw) then
do clickedHandled = element:clicked(x - element.x, y - element.y, button)
clickedHandled = element:clicked(x - element.x, y - element.y, button)
if clickedHandled then
pop.events[button] = nil
end
end
end end
if element.mousereleased then if element.mousereleased then
do mousereleasedHandled = element:mousereleased(x - element.x, y - element.y, button)
mousereleasedHandled = element:mousereleased(x - element.x, y - element.y, button) end
if mousereleasedHandled then if clickedHandled then
pop.events[button] = nil pop.focused = element
end
if clickedHandled or mousereleasedHandled then
return clickedHandled, mousereleasedHandled
else
for i = 1, #element.child do
clickedHandled, mousereleasedHandled = pop.mousereleased(x, y, button, element.child[i])
if clickedHandled or mousereleasedHandled then
break
end end
end end
end end
end end
else
print("mousereleased", x, y, button)
do
element = pop.events[button]
if element then
if element.clicked and (not element.excludeDraw) then
do
clickedHandled = element:clicked(x - element.x, y - element.y, button)
if clickedHandled then
pop.events[button] = nil
end
end
end
if element.mousereleased then
do
mousereleasedHandled = element:mousereleased(x - element.x, y - element.y, button)
if mousereleasedHandled then
pop.events[button] = nil
end
end
end
end
end
if (not clickedHandled) and (not mousereleasedHandled) then
clickedHandled, mousereleasedHandled = pop.mousereleased(x, y, button, pop.screen)
end
end end
return clickedHandled, mousereleasedHandled return clickedHandled, mousereleasedHandled
end end

View File

@ -28,6 +28,7 @@ do
end end
insert(self.child, child) insert(self.child, child)
child.parent = self child.parent = self
child:align()
return self return self
end, end,
removeChild = function(self, child) removeChild = function(self, child)
@ -41,7 +42,7 @@ do
return self return self
end end
end end
return error("Element \"" .. tostring(child) .. "\" is not a child of element \"" .. tostring(self) .. "\". Cannot remove it.") return "Element \"" .. tostring(child) .. "\" is not a child of element \"" .. tostring(self) .. "\". Cannot remove it."
end end
end, end,
getChildren = function(self) getChildren = function(self)
@ -240,7 +241,8 @@ do
for k, v in ipairs(self.child) do for k, v in ipairs(self.child) do
v:delete() v:delete()
end end
return self.parent:removeChild(self) self.parent:removeChild(self)
self = nil
end end
} }
_base_0.__index = _base_0 _base_0.__index = _base_0

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

View File

@ -17,6 +17,12 @@ local path = sub(..., 1, len(...) - len("/window"))
local element = require(tostring(path) .. "/element") local element = require(tostring(path) .. "/element")
local box = require(tostring(path) .. "/box") local box = require(tostring(path) .. "/box")
local text = require(tostring(path) .. "/text") local text = require(tostring(path) .. "/text")
local closeImage = {
100,
0,
0,
80
}
local left = 1 local left = 1
local mousemoved_event = true local mousemoved_event = true
do do
@ -60,6 +66,14 @@ do
local result = self.window:removeChild(child) local result = self.window:removeChild(child)
if result == self.window then if result == self.window then
return self return self
elseif type(result) == "string" then
for k, v in ipairs(self.child) do
if v == child then
remove(self.child, k)
return self
end
end
return "Element \"" .. tostring(child) .. "\" is not a child of window \"" .. tostring(self) .. "\". Cannot remove it."
else else
return result return result
end end
@ -85,11 +99,18 @@ do
elseif "right" == _exp_0 then elseif "right" == _exp_0 then
x = x - (w - self.w) x = x - (w - self.w)
end end
self.head:setWidth(w) if self.close then
self.head:setWidth(w - self.head:getHeight())
else
self.head:setWidth(w)
end
self.window:setWidth(w) self.window:setWidth(w)
self.w = w self.w = w
self.x = self.x + x self.x = self.x + x
self.title:align() self.title:align()
if self.close then
self.close:align()
end
end end
if h then if h then
h = h - self.head:getHeight() h = h - self.head:getHeight()
@ -115,11 +136,18 @@ do
elseif "right" == _exp_0 then elseif "right" == _exp_0 then
x = x - (w - self.w) x = x - (w - self.w)
end end
self.head:setWidth(w) if self.close then
self.head:setWidth(w - self.head:getHeight())
else
self.head:setWidth(w)
end
self.window:setWidth(w) self.window:setWidth(w)
self.w = w self.w = w
self.x = self.x + x self.x = self.x + x
self.title:align() self.title:align()
if self.close then
self.close:align()
end
self.head:move(x) self.head:move(x)
self.window:move(x) self.window:move(x)
return self return self
@ -143,10 +171,50 @@ do
end, end,
setTitle = function(self, title) setTitle = function(self, title)
self.title:setText(title) self.title:setText(title)
if self.titleOverflow == "trunicate" then
while self.title:getWidth() > self.head:getWidth() do
title = title:sub(1, -3)
self.title:setText(title .. "")
end
elseif self.titleOverflow == "resize" then
if self.title:getWidth() > self.head:getWidth() then
self:setWidth(self.title:getWidth())
end
end
return self return self
end, end,
getTitle = function(self) getTitle = function(self)
return self.title:getText() return self.title:getText()
end,
setTitleOverflow = function(self, method)
self.titleOverflow = method
return self
end,
getTitleOverflow = function(self)
return self.titleOverflow
end,
setClose = function(self, enabled)
if enabled then
self.close = box(self, closeImage)
local height = self.head:getHeight()
self.close:align("right"):setSize(height, height)
self.head:setWidth(self.w - height)
self.title:align()
insert(self.child, self.close)
else
self.close:delete()
self.head:setWidth(self.w)
self.title:align()
self.close = false
end
return self
end,
hasClose = function(self)
if self.close then
return true
else
return false
end
end end
} }
_base_0.__index = _base_0 _base_0.__index = _base_0
@ -184,15 +252,24 @@ do
self.head = box(self, tBackground) self.head = box(self, tBackground)
self.title = text(self, title, tColor) self.title = text(self, title, tColor)
self.window = box(self, wBackground) self.window = box(self, wBackground)
self.close = box(self, closeImage)
local height = self.title:getHeight() local height = self.title:getHeight()
self.head:setSize(self.w, height) self.head:setSize(self.w - height, height)
self.window:move(nil, height) self.window:move(nil, height)
self.close:align("right"):setSize(height, height)
self:setSize(100, 80) self:setSize(100, 80)
self.child = { self.child = {
self.head, self.head,
self.title, self.title,
self.window self.window,
self.close
} }
self.titleOverflow = "trunicate"
self.close.clicked = function()
print("CLOSE WAS CLICKED")
self:delete()
return true
end
self.head.selected = false self.head.selected = false
if mousemoved_event then if mousemoved_event then
self.head.mousemoved = function(self, x, y, dx, dy) self.head.mousemoved = function(self, x, y, dx, dy)

View File

@ -156,30 +156,57 @@ pop.mousepressed = function(x, y, button, element)
end end
return handled return handled
end end
pop.mousereleased = function(x, y, button) pop.mousereleased = function(x, y, button, element)
print("mousereleased", x, y, button)
local clickedHandled = false local clickedHandled = false
local mousereleasedHandled = false local mousereleasedHandled = false
do if element then
local element = pop.events[button] if (x >= element.x) and (x <= element.x + element.w) and (y >= element.y) and (y <= element.y + element.h) then
if element then
if element.clicked and (not element.excludeDraw) then if element.clicked and (not element.excludeDraw) then
do clickedHandled = element:clicked(x - element.x, y - element.y, button)
clickedHandled = element:clicked(x - element.x, y - element.y, button)
if clickedHandled then
pop.events[button] = nil
end
end
end end
if element.mousereleased then if element.mousereleased then
do mousereleasedHandled = element:mousereleased(x - element.x, y - element.y, button)
mousereleasedHandled = element:mousereleased(x - element.x, y - element.y, button) end
if mousereleasedHandled then if clickedHandled then
pop.events[button] = nil pop.focused = element
end
if clickedHandled or mousereleasedHandled then
return clickedHandled, mousereleasedHandled
else
for i = 1, #element.child do
clickedHandled, mousereleasedHandled = pop.mousereleased(x, y, button, element.child[i])
if clickedHandled or mousereleasedHandled then
break
end end
end end
end end
end end
else
print("mousereleased", x, y, button)
do
element = pop.events[button]
if element then
if element.clicked and (not element.excludeDraw) then
do
clickedHandled = element:clicked(x - element.x, y - element.y, button)
if clickedHandled then
pop.events[button] = nil
end
end
end
if element.mousereleased then
do
mousereleasedHandled = element:mousereleased(x - element.x, y - element.y, button)
if mousereleasedHandled then
pop.events[button] = nil
end
end
end
end
end
if (not clickedHandled) and (not mousereleasedHandled) then
clickedHandled, mousereleasedHandled = pop.mousereleased(x, y, button, pop.screen)
end
end end
return clickedHandled, mousereleasedHandled return clickedHandled, mousereleasedHandled
end end

View File

@ -47,6 +47,8 @@ class element
insert @child, child insert @child, child
child.parent = @ child.parent = @
child\align! --NOTE not 100% sure if this is a good idea
return @ return @
-- remove child by index and return it OR remove child by reference -- remove child by index and return it OR remove child by reference
@ -60,7 +62,7 @@ class element
if v == child if v == child
remove @child, k remove @child, k
return @ return @
error "Element \"#{child}\" is not a child of element \"#{@}\". Cannot remove it." return "Element \"#{child}\" is not a child of element \"#{@}\". Cannot remove it."
getChildren: => getChildren: =>
return @child return @child
@ -259,3 +261,4 @@ class element
v\delete! v\delete!
@parent\removeChild @ @parent\removeChild @
@ = nil

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

View File

@ -7,6 +7,8 @@ element = require "#{path}/element"
box = require "#{path}/box" box = require "#{path}/box"
text = require "#{path}/text" text = require "#{path}/text"
closeImage = {100, 0, 0, 80} --graphics.newImage "#{path}/img/close.png"
-- version compatibility -- version compatibility
left = 1 -- what is the left mouse button? left = 1 -- what is the left mouse button?
mousemoved_event = true -- is the mousemoved event available? mousemoved_event = true -- is the mousemoved event available?
@ -35,19 +37,28 @@ class window extends element
@head = box @, tBackground -- title box at top @head = box @, tBackground -- title box at top
@title = text @, title, tColor -- text at top @title = text @, title, tColor -- text at top
@window = box @, wBackground -- main window area @window = box @, wBackground -- main window area
@close = box @, closeImage -- close button
-- correct placement / sizes of elements -- correct placement / sizes of elements
height = @title\getHeight! height = @title\getHeight!
@head\setSize @w, height @head\setSize @w - height, height
@window\move nil, height @window\move nil, height
@close\align("right")\setSize height, height
@setSize 100, 80 @setSize 100, 80
-- our child elements are still child elements -- our child elements are still child elements
--TODO change title to be a child of head ? --TODO change title to be a child of head ?
@child = { @child = {
@head, @title, @window @head, @title, @window, @close
} }
@titleOverflow = "trunicate" -- defaults to trunicating title to fit in window
@close.clicked = ->
print "CLOSE WAS CLICKED"
@delete!
return true
@head.selected = false -- whether or not the window title (and thus, the window) has been selected @head.selected = false -- whether or not the window title (and thus, the window) has been selected
if mousemoved_event if mousemoved_event
@ -108,6 +119,12 @@ class window extends element
result = @window\removeChild child result = @window\removeChild child
if result == @window if result == @window
return @ return @
elseif type(result) == "string"
for k,v in ipairs @child
if v == child
remove @child, k
return @
return "Element \"#{child}\" is not a child of window \"#{@}\". Cannot remove it."
else else
return result return result
@ -135,13 +152,20 @@ class window extends element
when "right" when "right"
x -= w - @w x -= w - @w
@head\setWidth w if @close
@head\setWidth w - @head\getHeight!
else
@head\setWidth w
@window\setWidth w @window\setWidth w
@w = w @w = w
@x += x @x += x
@title\align! @title\align!
if @close
@close\align!
if h if h
h = h - @head\getHeight! h = h - @head\getHeight!
switch @vertical switch @vertical
@ -169,13 +193,20 @@ class window extends element
when "right" when "right"
x -= w - @w x -= w - @w
@head\setWidth w if @close
@head\setWidth w - @head\getHeight!
else
@head\setWidth w
@window\setWidth w @window\setWidth w
@w = w @w = w
@x += x @x += x
@title\align! @title\align!
if @close
@close\align!
@head\move x @head\move x
--@title\move x --@title\move x
@window\move x @window\move x
@ -204,7 +235,47 @@ class window extends element
setTitle: (title) => setTitle: (title) =>
@title\setText title @title\setText title
if @titleOverflow == "trunicate"
while @title\getWidth! > @head\getWidth!
title = title\sub 1, -3
@title\setText title .. "…"
elseif @titleOverflow == "resize"
if @title\getWidth! > @head\getWidth!
@setWidth @title\getWidth!
return @ return @
getTitle: => getTitle: =>
return @title\getText! return @title\getText!
setTitleOverflow: (method) =>
@titleOverflow = method
return @
getTitleOverflow: =>
return @titleOverflow
setClose: (enabled) =>
if enabled
@close = box @, closeImage
height = @head\getHeight!
@close\align("right")\setSize height, height
@head\setWidth @w - height
@title\align! -- new might not be working?
insert @child, @close
else
@close\delete!
@head\setWidth @w
@title\align! -- new might not be working?
@close = false
return @
hasClose: =>
if @close
return true
else
return false

View File

@ -129,20 +129,41 @@ pop.mousepressed = (x, y, button, element) ->
return handled return handled
pop.mousereleased = (x, y, button) -> pop.mousereleased = (x, y, button, element) ->
print "mousereleased", x, y, button
clickedHandled = false clickedHandled = false
mousereleasedHandled = false mousereleasedHandled = false
if element = pop.events[button] if element
if element.clicked and (not element.excludeDraw) --and (x >= element.x) and (x <= element.x + element.w) and (y >= element.y) and (y <= element.y + element.h) if (x >= element.x) and (x <= element.x + element.w) and (y >= element.y) and (y <= element.y + element.h)
if clickedHandled = element\clicked x - element.x, y - element.y, button if element.clicked and (not element.excludeDraw)
pop.events[button] = nil clickedHandled = element\clicked x - element.x, y - element.y, button
if element.mousereleased
mousereleasedHandled = element\mousereleased x - element.x, y - element.y, button
if element.mousereleased if clickedHandled
if mousereleasedHandled = element\mousereleased x - element.x, y - element.y, button pop.focused = element
pop.events[button] = nil
if clickedHandled or mousereleasedHandled
return clickedHandled, mousereleasedHandled
else
for i = 1, #element.child
clickedHandled, mousereleasedHandled = pop.mousereleased x, y, button, element.child[i]
if clickedHandled or mousereleasedHandled
break
else
print "mousereleased", x, y, button
if element = pop.events[button]
if element.clicked and (not element.excludeDraw) --and (x >= element.x) and (x <= element.x + element.w) and (y >= element.y) and (y <= element.y + element.h)
if clickedHandled = element\clicked x - element.x, y - element.y, button
pop.events[button] = nil
if element.mousereleased
if mousereleasedHandled = element\mousereleased x - element.x, y - element.y, button
pop.events[button] = nil
if (not clickedHandled) and (not mousereleasedHandled)
clickedHandled, mousereleasedHandled = pop.mousereleased x, y, button, pop.screen
return clickedHandled, mousereleasedHandled return clickedHandled, mousereleasedHandled