Add frame resizing functionality

This commit is contained in:
Kenny Shields 2014-01-07 19:06:03 -05:00
parent ca26c83414
commit 49dc7ec8ca
3 changed files with 218 additions and 10 deletions

View File

@ -28,6 +28,7 @@ Version 0.9.7 - Alpha (Release Date TBD)
[ADDED] a new tooltip method: SetOffsetY(yoffset)
[ADDED] a new tooltip method: GetText()
[ADDED] a new text event callback: OnClickLink(object, text)
[ADDED] a new frame event callback: OnResize(object, width, height)
[ADDED] a new util library function: TableHasValue(table, value)
[ADDED] a new util library function: GetHoverObject()
[ADDED] a new callback: textinput(text)
@ -40,6 +41,7 @@ Version 0.9.7 - Alpha (Release Date TBD)
[ADDED] support for text object link processing
[ADDED] loveframes.downobject
[ADDED] skin directives for the text object
[ADDED] functionality for resizing frames
[FIXED] error when pressing a function key while a textinput was focused
[FIXED] the tooltip object not setting the state of its text object

View File

@ -30,6 +30,7 @@ loveframes.hoverobject = false
loveframes.modalobject = false
loveframes.inputobject = false
loveframes.downobject = false
loveframes.resizeobject = false
loveframes.hover = false
loveframes.input_cursor_set = false
loveframes.prevcursor = nil

View File

@ -21,6 +21,16 @@ function newobject:initialize()
self.dockx = 0
self.docky = 0
self.dockzonesize = 10
self.resizex = 0
self.resizey = 0
self.resizexmod = 0
self.resizeymod = 0
self.resizewidth = 0
self.resizeheight = 0
self.minwidth = 100
self.minheight = 30
self.maxwidth = 500
self.maxheight = 500
self.internal = false
self.draggable = true
self.screenlocked = false
@ -38,15 +48,17 @@ function newobject:initialize()
self.leftdockobject = false
self.rightdockobject = false
self.dockable = false
self.resizing = false
self.canresize = false
self.internals = {}
self.children = {}
self.icon = nil
self.OnClose = nil
self.OnDock = nil
self.OnResize = nil
-- create docking zones
self.dockzones =
{
self.dockzones = {
top = {x = 0, y = 0, width = 0, height = 0},
bottom = {x = 0, y = 0, width = 0, height = 0},
left = {x = 0, y = 0, width = 0, height = 0},
@ -91,8 +103,6 @@ function newobject:update(dt)
end
local mx, my = love.mouse.getPosition()
local width = self.width
local height = self.height
local showclose = self.showclose
local close = self.internals[1]
local dragging = self.dragging
@ -125,6 +135,8 @@ function newobject:update(dt)
-- dragging check
if dragging then
if parent == base then
local width = self.width
local height = self.height
if not dockedtop and not dockedbottom then
self.y = my - self.clicky
end
@ -225,10 +237,84 @@ function newobject:update(dt)
self.staticx = mx - self.clickx
self.staticy = my - self.clicky
end
elseif self.resizing then
local width = self.width
local height = self.height
if self.resize_mode == "top_left" then
local new_width = self.resizewidth + (self.resizex - mx)
local new_height = self.resizeheight + (self.resizey - my)
if new_width >= self.minwidth and new_width <= self.maxwidth then
self.width = new_width
self.x = mx - self.resizexmod
end
if new_height >= self.minheight and new_height <= self.maxheight then
self.height = new_height
self.y = my - self.resizeymod
end
elseif self.resize_mode == "bottom_right" then
local new_width = (mx - self.x) + self.resizexmod
local new_height = (my - self.y) + self.resizeymod
if new_width >= self.minwidth and new_width <= self.maxwidth then
self.width = new_width
end
if new_height >= self.minheight and new_height <= self.maxheight then
self.height = new_height
end
elseif self.resize_mode == "top_right" then
local new_width = (mx - self.x) + self.resizexmod
local new_height = self.resizeheight + (self.resizey - my)
if new_width >= self.minwidth and new_width <= self.maxwidth then
self.width = new_width
end
if new_height >= self.minheight and new_height <= self.maxheight then
self.height = new_height
self.y = my - self.resizeymod
end
elseif self.resize_mode == "bottom_left" then
local new_width = self.resizewidth + (self.resizex - mx)
local new_height = (my - self.y) + self.resizeymod
if new_width >= self.minwidth and new_width <= self.maxwidth then
self.width = new_width
self.x = mx - self.resizexmod
end
if new_height >= self.minheight and new_height <= self.maxheight then
self.height = new_height
end
elseif self.resize_mode == "top" then
local new_height = self.resizeheight + (self.resizey - my)
if new_height >= self.minheight and new_height <= self.maxheight then
self.height = new_height
self.y = my - self.resizeymod
end
elseif self.resize_mode == "bottom" then
local new_height = (my - self.y) + self.resizeymod
if new_height >= self.minheight and new_height <= self.maxheight then
self.height = new_height
end
elseif self.resize_mode == "left" then
local new_width = self.resizewidth + (self.resizex - mx)
if new_width >= self.minwidth and new_width <= self.maxwidth then
self.width = new_width
self.x = mx - self.resizexmod
end
elseif self.resize_mode == "right" then
local new_width = (mx - self.x) + self.resizexmod
if new_width >= self.minwidth and new_width <= self.maxwidth then
self.width = new_width
end
end
if self.width ~= width or self.height ~= height then
local onresize = self.OnResize
if onresize then
onresize(self, self.width, self.height)
end
end
end
-- if screenlocked then keep within screen
if screenlocked then
local width = self.width
local height = self.height
local screenwidth = love.graphics.getWidth()
local screenheight = love.graphics.getHeight()
local x = self.x
@ -249,6 +335,8 @@ function newobject:update(dt)
-- keep the frame within its parent's boundaries if parentlocked
if parentlocked then
local width = self.width
local height = self.height
local parentwidth = self.parent.width
local parentheight = self.parent.height
local staticx = self.staticx
@ -384,9 +472,9 @@ function newobject:mousepressed(x, y, button)
local parent = self.parent
local base = loveframes.base
if selfcol then
if button == "l" then
-- initiate dragging if not currently dragging
if not dragging and self.hover and button == "l" then
if not dragging and self.hover then
if y < self.y + 25 and self.draggable then
if parent == base then
self.clickx = x - self.x
@ -398,6 +486,116 @@ function newobject:mousepressed(x, y, button)
self.dragging = true
end
end
if not self.resizing and self.canresize then
if loveframes.util.BoundingBox(self.x, x, self.y, y, 5, 1, 5, 1) then
self.resizing = true
self.dragging = false
self.resize_mode = "top_left"
self.resizex = x
self.resizey = y
self.resizewidth = self.width
self.resizeheight = self.height
loveframes.resizeobject = self
if x ~= self.x then
self.resizexmod = x - self.x
end
if y ~= self.y then
self.resizeymod = y - self.y
end
elseif loveframes.util.BoundingBox(self.x + self.width - 5, x, self.y + self.height - 5, y, 5, 1, 5, 1) then
self.resizing = true
self.resize_mode = "bottom_right"
self.resizex = x
self.resizey = y
self.resizewidth = self.width
self.resizeheight = self.height
loveframes.resizeobject = self
if x ~= self.x + self.width then
self.resizexmod = (self.x + self.width) - x
end
if y ~= self.y + self.height then
self.resizeymod = (self.y + self.height) - y
end
elseif loveframes.util.BoundingBox(self.x + self.width - 5, x, self.y, y, 5, 1, 5, 1) then
self.resizing = true
self.dragging = false
self.resize_mode = "top_right"
self.resizex = x
self.resizey = y
self.resizewidth = self.width
self.resizeheight = self.height
loveframes.resizeobject = self
if x ~= self.x + self.width then
self.resizexmod = (self.x + self.width) - x
end
if y ~= self.y then
self.resizeymod = y - self.y
end
elseif loveframes.util.BoundingBox(self.x, x, self.y + self.height - 5, y, 5, 1, 5, 1) then
self.resizing = true
self.dragging = false
self.resize_mode = "bottom_left"
self.resizex = x
self.resizey = y
self.resizewidth = self.width
self.resizeheight = self.height
loveframes.resizeobject = self
if x ~= self.x then
self.resizexmod = x - self.x
end
if y ~= self.y + self.height then
self.resizeymod = (self.y + self.height) - y
end
elseif loveframes.util.BoundingBox(self.x + 5, x, self.y, y, self.width - 10, 1, 2, 1) then
self.resizing = true
self.dragging = false
self.resize_mode = "top"
self.resizex = x
self.resizey = y
self.resizewidth = self.width
self.resizeheight = self.height
loveframes.resizeobject = self
if y ~= self.y then
self.resizeymod = y - self.y
end
elseif loveframes.util.BoundingBox(self.x + 5, x, self.y + self.height - 2, y, self.width - 10, 1, 2, 1) then
self.resizing = true
self.dragging = false
self.resize_mode = "bottom"
self.resizex = x
self.resizey = y
self.resizewidth = self.width
self.resizeheight = self.height
loveframes.resizeobject = self
if y ~= self.y then
self.resizeymod = (self.y + self.height) - y
end
elseif loveframes.util.BoundingBox(self.x, x, self.y + 5, y, 2, 1, self.height - 10, 1) then
self.resizing = true
self.dragging = false
self.resize_mode = "left"
self.resizex = x
self.resizey = y
self.resizewidth = self.width
self.resizeheight = self.height
loveframes.resizeobject = self
if x ~= self.x then
self.resizexmod = x - self.x
end
elseif loveframes.util.BoundingBox(self.x + self.width - 2, x, self.y + 5, y, 2, 1, self.height - 10, 1) then
self.resizing = true
self.dragging = false
self.resize_mode = "right"
self.resizex = x
self.resizey = y
self.resizewidth = self.width
self.resizeheight = self.height
loveframes.resizeobject = self
if x ~= self.x + self.width then
self.resizexmod = (self.x + self.width) - x
end
end
end
if self.hover and button == "l" then
self:MakeTop()
end
@ -432,13 +630,20 @@ function newobject:mousereleased(x, y, button)
return
end
local dragging = self.dragging
local children = self.children
local internals = self.internals
-- exit the dragging state
if dragging then
self.dragging = false
self.dragging = false
if self.resizing then
self.resizex = 0
self.resizey = 0
self.resizexmod = 0
self.resizeymod = 0
self.resizewidth = 0
self.resizeheight = 0
self.resizing = false
loveframes.resizeobject = false
end
for k, v in ipairs(internals) do