mirror of
https://github.com/TangentFoxy/Pop.Box.git
synced 2024-12-15 12:44:20 +00:00
add/remove methods, optional title bar for windows, demo-work
add/remove not implemented for window elements
This commit is contained in:
parent
aa54b9714e
commit
5c35892fb6
@ -5,6 +5,8 @@ do
|
||||
local _obj_0 = math
|
||||
floor, max = _obj_0.floor, _obj_0.max
|
||||
end
|
||||
local inheritsFromElement
|
||||
inheritsFromElement = require(tostring((...):sub(1, -19)) .. "/util").inheritsFromElement
|
||||
local element
|
||||
do
|
||||
local _class_0
|
||||
@ -176,6 +178,33 @@ do
|
||||
end
|
||||
end
|
||||
end,
|
||||
add = function(self, element)
|
||||
if not (inheritsFromElement(element)) then
|
||||
for _index_0 = 1, #element do
|
||||
local e = element[_index_0]
|
||||
self:add(e)
|
||||
return self
|
||||
end
|
||||
end
|
||||
element.parent:remove(element)
|
||||
table.insert(self.child, element)
|
||||
table.insert(self.data.child, element.data)
|
||||
return self
|
||||
end,
|
||||
remove = function(self, element)
|
||||
if not (inheritsFromElement(element)) then
|
||||
for _index_0 = 1, #element do
|
||||
local e = element[_index_0]
|
||||
self:remove(e)
|
||||
return self
|
||||
end
|
||||
end
|
||||
local index = self:indexOf(element)
|
||||
local dataIndex = self:dataIndexOf(element.data)
|
||||
table.remove(self.child, index)
|
||||
table.remove(self.data.child, dataIndex)
|
||||
return self
|
||||
end,
|
||||
delete = function(self)
|
||||
for i = #self.child, 1, -1 do
|
||||
self.child[i]:delete()
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
import graphics from love
|
||||
import floor, max from math
|
||||
import inheritsFromElement from require "#{(...)\sub 1, -19}/util"
|
||||
|
||||
class element
|
||||
--- Constructor expects nothing, or a data table describing it.
|
||||
@ -223,6 +224,33 @@ class element
|
||||
if @data.child[i] == data
|
||||
return i
|
||||
|
||||
add: (element) =>
|
||||
unless inheritsFromElement element
|
||||
for e in *element
|
||||
@add e
|
||||
return @
|
||||
|
||||
element.parent\remove(element)
|
||||
|
||||
table.insert @child, element
|
||||
table.insert @data.child, element.data
|
||||
|
||||
return @
|
||||
|
||||
remove: (element) =>
|
||||
unless inheritsFromElement element
|
||||
for e in *element
|
||||
@remove e
|
||||
return @
|
||||
|
||||
index = @indexOf element
|
||||
dataIndex = @dataIndexOf element.data
|
||||
|
||||
table.remove @child, index
|
||||
table.remove @data.child, dataIndex
|
||||
|
||||
return @
|
||||
|
||||
--- Deletes references to this element and then deletes it.
|
||||
delete: =>
|
||||
for i=#@child, 1, -1
|
||||
|
@ -6,6 +6,8 @@ do
|
||||
end
|
||||
local path = (...):sub(1, -7)
|
||||
local element = require(tostring(path) .. "/element")
|
||||
local inheritsFromElement
|
||||
inheritsFromElement = require(tostring(path:sub(1, -11)) .. "/util").inheritsFromElement
|
||||
path = path:sub(1, -11)
|
||||
local maximizeImage = graphics.newImage(tostring(path) .. "/images/maximize.png")
|
||||
local minimizeImage = graphics.newImage(tostring(path) .. "/images/minimize.png")
|
||||
@ -35,7 +37,9 @@ do
|
||||
if self.minimizeButton then
|
||||
self.minimizeButton:align()
|
||||
end
|
||||
if self.data.titleBar then
|
||||
self.window_area:move(nil, self.header:getHeight())
|
||||
end
|
||||
return self
|
||||
end,
|
||||
setSize = function(self, w, h)
|
||||
@ -61,8 +65,12 @@ do
|
||||
elseif "right" == _exp_0 then
|
||||
y = y - (h - self.data.h)
|
||||
end
|
||||
if self.data.titleBar then
|
||||
self.window_area:setHeight(h - self.header:getHeight())
|
||||
self.window_area:move(nil, self.header:getHeight())
|
||||
else
|
||||
self.window_area:setHeight(h)
|
||||
end
|
||||
self.data.h = h
|
||||
self.data.y = self.data.y + y
|
||||
end
|
||||
@ -83,11 +91,13 @@ do
|
||||
getPadding = function(self)
|
||||
return self.window_area:getPadding()
|
||||
end,
|
||||
childAdded = function(self, element)
|
||||
table.insert(self.window_area.data, table.remove(self.data.child, self:dataIndexOf(element.data)))
|
||||
table.insert(self.window_area, table.remove(self.child, self:indexOf(element)))
|
||||
element:align()
|
||||
print("worked?")
|
||||
add = function(self, element)
|
||||
self.window_area:add(element)
|
||||
local x, y = self.window_area.data.x, self.window_area.data.y
|
||||
return self
|
||||
end,
|
||||
remove = function(self, element)
|
||||
self.window_area:remove(element)
|
||||
return self
|
||||
end,
|
||||
maximize = function(self)
|
||||
@ -142,6 +152,9 @@ do
|
||||
self.data.containMethod = "mouse"
|
||||
end
|
||||
self.data.maximized = false
|
||||
if self.data.titleBar == nil then
|
||||
self.data.titleBar = true
|
||||
end
|
||||
if self.data.maximizeable == nil then
|
||||
self.data.maximizeable = false
|
||||
end
|
||||
@ -226,8 +239,16 @@ do
|
||||
end
|
||||
local height = self.title:getHeight() + 1
|
||||
self.header:setSize(self.data.w - self.data.header_width_reduction, height)
|
||||
if self.data.titleBar then
|
||||
self.window_area:setSize(self.data.w, self.data.h - height)
|
||||
self.window_area:move(nil, height)
|
||||
else
|
||||
self.header.data.draw = false
|
||||
self.window_area.data.x = self.data.x + self.data.padding
|
||||
self.window_area.data.y = self.data.y + self.data.padding
|
||||
self.window_area.data.w = self.data.w - self.data.padding * 2
|
||||
self.window_area.data.h = self.data.h - self.data.padding * 2
|
||||
end
|
||||
self.window_area.mousepressed = function(self, x, y, button)
|
||||
if button == pop.constants.left_mouse then
|
||||
local grandparent = self.parent.parent
|
||||
|
@ -12,6 +12,8 @@ import graphics, mouse from love
|
||||
path = (...)\sub 1, -7
|
||||
element = require "#{path}/element"
|
||||
|
||||
import inheritsFromElement from require "#{path\sub 1, -11}/util"
|
||||
|
||||
path = path\sub 1, -11
|
||||
maximizeImage = graphics.newImage "#{path}/images/maximize.png"
|
||||
minimizeImage = graphics.newImage "#{path}/images/minimize.png"
|
||||
@ -35,6 +37,7 @@ class window extends element
|
||||
@data.containMethod = "mouse" unless @data.containMethod
|
||||
|
||||
@data.maximized = false
|
||||
@data.titleBar = true if @data.titleBar == nil
|
||||
@data.maximizeable = false if @data.maximizeable == nil
|
||||
@data.minimizeable = false if @data.minimizeable == nil
|
||||
@data.closeable = false if @data.closeable == nil
|
||||
@ -70,8 +73,16 @@ class window extends element
|
||||
|
||||
height = @title\getHeight! + 1
|
||||
@header\setSize @data.w - @data.header_width_reduction, height
|
||||
|
||||
if @data.titleBar
|
||||
@window_area\setSize @data.w, @data.h - height
|
||||
@window_area\move nil, height
|
||||
else
|
||||
@header.data.draw = false
|
||||
@window_area.data.x = @data.x + @data.padding
|
||||
@window_area.data.y = @data.y + @data.padding
|
||||
@window_area.data.w = @data.w - @data.padding*2
|
||||
@window_area.data.h = @data.h - @data.padding*2
|
||||
|
||||
-- window area steals mouse events to prevent propagation to elements under it
|
||||
@window_area.mousepressed = (x, y, button) =>
|
||||
@ -82,7 +93,23 @@ class window extends element
|
||||
@window_area.clicked = =>
|
||||
return nil
|
||||
|
||||
--print "window_area " .. tostring @window_area
|
||||
-- @window_area.add = (element) =>
|
||||
-- pop.elements.box.__parent.add @, element
|
||||
-- --NOTE temporarily disabled
|
||||
-- -- this seems to be working but errors with previous == nil
|
||||
-- -- I have moved the intended functionality to the window element's function that calls these
|
||||
-- if false and inheritsFromElement element
|
||||
-- -- we need to adjust its position based on the previous element
|
||||
-- previous = @data.child[#@data.child-1]
|
||||
-- y, h = previous.y, previous.h
|
||||
-- y += h + @data.padding
|
||||
-- element.data.x = @data.x + @data.padding
|
||||
-- element.data.y = y
|
||||
-- element\setWidth @data.w - @data.padding*2
|
||||
--
|
||||
-- @window_area.remove = (element) =>
|
||||
-- pop.elements.box.__parent.remove @, element
|
||||
-- --TODO we need to adjust all elements' positions
|
||||
|
||||
selected = false
|
||||
mx = 0
|
||||
@ -144,6 +171,7 @@ class window extends element
|
||||
if @minimizeButton
|
||||
@minimizeButton\align!
|
||||
|
||||
if @data.titleBar
|
||||
@window_area\move nil, @header\getHeight!
|
||||
|
||||
return @
|
||||
@ -173,8 +201,11 @@ class window extends element
|
||||
when "right"
|
||||
y -= h - @data.h
|
||||
|
||||
if @data.titleBar
|
||||
@window_area\setHeight h - @header\getHeight!
|
||||
@window_area\move nil, @header\getHeight!
|
||||
else
|
||||
@window_area\setHeight h
|
||||
@data.h = h
|
||||
@data.y += y
|
||||
|
||||
@ -196,13 +227,46 @@ class window extends element
|
||||
getPadding: =>
|
||||
return @window_area\getPadding!
|
||||
|
||||
childAdded: (element) =>
|
||||
table.insert @window_area.data, table.remove @data.child, @dataIndexOf element.data
|
||||
table.insert @window_area, table.remove @child, @indexOf element
|
||||
element\align!
|
||||
print "worked?"
|
||||
add: (element) =>
|
||||
@window_area\add element
|
||||
|
||||
x, y = @window_area.data.x, @window_area.data.y
|
||||
--for element in *@window_area.child
|
||||
--element\setWidth @data.w - @data.padding*2
|
||||
--TODO needs to align them vertically with appropriate padding (I am not taking margin into account which is bad)
|
||||
|
||||
return @
|
||||
|
||||
-- @window_area.add = (element) =>
|
||||
-- pop.elements.box.__parent.add @, element
|
||||
-- --NOTE temporarily disabled
|
||||
-- -- this seems to be working but errors with previous == nil
|
||||
-- -- I have moved the intended functionality to the window element's function that calls these
|
||||
-- if false and inheritsFromElement element
|
||||
-- -- we need to adjust its position based on the previous element
|
||||
-- previous = @data.child[#@data.child-1]
|
||||
-- y, h = previous.y, previous.h
|
||||
-- y += h + @data.padding
|
||||
-- element.data.x = @data.x + @data.padding
|
||||
-- element.data.y = y
|
||||
-- element\setWidth @data.w - @data.padding*2
|
||||
--
|
||||
-- @window_area.remove = (element) =>
|
||||
-- pop.elements.box.__parent.remove @, element
|
||||
-- --TODO we need to adjust all elements' positions
|
||||
|
||||
remove: (element) =>
|
||||
@window_area\remove element
|
||||
return @
|
||||
|
||||
--NOTE was this even used?
|
||||
--childAdded: (element) =>
|
||||
-- table.insert @window_area.data, table.remove @data.child, @dataIndexOf element.data
|
||||
-- table.insert @window_area, table.remove @child, @indexOf element
|
||||
-- element\align!
|
||||
-- print "worked?"
|
||||
-- return @
|
||||
|
||||
maximize: =>
|
||||
if @data.maximized
|
||||
@setSize @data.previous.w, @data.previous.h
|
||||
|
@ -11,6 +11,7 @@ element = require "#{path}/elements/element"
|
||||
--text = require "#{path}/elements/text"
|
||||
|
||||
--- @todo make this built-in as maximize for window elements
|
||||
--- @todo rewrite to take into account margin!
|
||||
element.__base.fill = =>
|
||||
@data.x = @parent.data.x + @parent.data.padding
|
||||
@data.y = @parent.data.y + @parent.data.padding
|
||||
|
25
main.lua
25
main.lua
@ -1,6 +1,10 @@
|
||||
local graphics
|
||||
graphics = love.graphics
|
||||
local pop = require("")
|
||||
local debug = false
|
||||
love.load = function()
|
||||
local old_method
|
||||
old_method = function()
|
||||
pop.text("Hello World!"):align("center", "center")
|
||||
local testWindow = pop.window({
|
||||
windowBackground = {
|
||||
@ -136,6 +140,27 @@ love.load = function()
|
||||
}
|
||||
}):align("right", "bottom")
|
||||
end
|
||||
local new_method
|
||||
new_method = function()
|
||||
local partsGrid = pop.dynamicGrid()
|
||||
return pop.window({
|
||||
w = graphics.getWidth() / 2,
|
||||
h = graphics.getHeight(),
|
||||
titleBar = false
|
||||
}):add({
|
||||
pop.box({
|
||||
h = 17
|
||||
}),
|
||||
pop.scrollbox():add(partsGrid),
|
||||
pop.grid():add({
|
||||
pop.button(),
|
||||
pop.button(),
|
||||
pop.button()
|
||||
})
|
||||
})
|
||||
end
|
||||
return new_method()
|
||||
end
|
||||
love.update = function(dt)
|
||||
return pop.update(dt)
|
||||
end
|
||||
|
20
main.moon
20
main.moon
@ -2,10 +2,13 @@
|
||||
--- @copyright Paul Liverman III (2016)
|
||||
--- @license The MIT License (MIT)
|
||||
|
||||
import graphics from love
|
||||
|
||||
pop = require ""
|
||||
debug = false
|
||||
|
||||
love.load = ->
|
||||
old_method = ->
|
||||
pop.text("Hello World!")\align "center", "center"
|
||||
testWindow = pop.window({windowBackground: {200, 200, 200}, closeable: true, maximizeable: true, minimizeable: true}, "Testing Window")\move(20, 20)\setSize(200, 100)\align "right", "top"
|
||||
print testWindow.window_area
|
||||
@ -34,6 +37,23 @@ love.load = ->
|
||||
pop.text(centerBox, {color: {0, 0, 255, 100}}, "Align me!")\align "right", "top"
|
||||
pop.window(centerBox, {titleColor: {0, 0, 0, 150}, titleBackground: {0, 0, 255, 100}, windowBackground: {200, 200, 255, 100}})\align "right", "bottom"
|
||||
|
||||
new_method = ->
|
||||
partsGrid = pop.dynamicGrid!
|
||||
pop.window({w: graphics.getWidth!/2, h: graphics.getHeight!, titleBar: false})\add({
|
||||
pop.box({h: 17}) -- temporary height
|
||||
pop.scrollbox()\add(
|
||||
partsGrid
|
||||
)
|
||||
pop.grid()\add({
|
||||
pop.button()
|
||||
pop.button()
|
||||
pop.button()
|
||||
})
|
||||
})
|
||||
|
||||
--old_method!
|
||||
new_method!
|
||||
|
||||
love.update = (dt) ->
|
||||
pop.update dt
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user