LoveFrames/objects/collapsiblecategory.lua
2015-10-31 21:40:19 +08:00

372 lines
8.6 KiB
Lua

--[[------------------------------------------------
-- Love Frames - A GUI library for LOVE --
-- Copyright (c) 2012-2014 Kenny Shields --
--]]------------------------------------------------
-- get the current require path
local path = string.sub(..., 1, string.len(...) - string.len(".objects.collapsiblecategory"))
local loveframes = require(path .. ".libraries.common")
-- collapsiblecategory object
local newobject = loveframes.NewObject("collapsiblecategory", "loveframes_object_collapsiblecategory", true)
--[[---------------------------------------------------------
- func: initialize()
- desc: initializes the object
--]]---------------------------------------------------------
function newobject:initialize()
self.type = "collapsiblecategory"
self.text = "Category"
self.width = 200
self.height = 25
self.closedheight = 25
self.padding = 5
self.internal = false
self.open = false
self.down = false
self.children = {}
self.OnOpenedClosed = nil
end
--[[---------------------------------------------------------
- func: update(deltatime)
- desc: updates the object
--]]---------------------------------------------------------
function newobject:update(dt)
local state = loveframes.state
local selfstate = self.state
if state ~= selfstate then
return
end
local visible = self.visible
local alwaysupdate = self.alwaysupdate
if not visible then
if not alwaysupdate then
return
end
end
local open = self.open
local children = self.children
local curobject = children[1]
local parent = self.parent
local base = loveframes.base
local update = self.Update
self:CheckHover()
-- move to parent if there is a parent
if parent ~= base and parent.type ~= "list" then
self.x = self.parent.x + self.staticx
self.y = self.parent.y + self.staticy
end
if open and curobject then
curobject:SetWidth(self.width - self.padding * 2)
curobject:update(dt)
elseif not open and curobject then
if curobject:GetVisible() then
curobject:SetVisible(false)
end
end
if update then
update(self, dt)
end
end
--[[---------------------------------------------------------
- func: draw()
- desc: draws the object
--]]---------------------------------------------------------
function newobject:draw()
local state = loveframes.state
local selfstate = self.state
if state ~= selfstate then
return
end
local visible = self.visible
if not visible then
return
end
local open = self.open
local children = self.children
local curobject = children[1]
local skins = loveframes.skins.available
local skinindex = loveframes.config["ACTIVESKIN"]
local defaultskin = loveframes.config["DEFAULTSKIN"]
local selfskin = self.skin
local skin = skins[selfskin] or skins[skinindex]
local drawfunc = skin.DrawCollapsibleCategory or skins[defaultskin].DrawCollapsibleCategory
local draw = self.Draw
local drawcount = loveframes.drawcount
-- set the object's draw order
self:SetDrawOrder()
if draw then
draw(self)
else
drawfunc(self)
end
if open and curobject then
curobject:draw()
end
end
--[[---------------------------------------------------------
- func: mousepressed(x, y, button)
- desc: called when the player presses a mouse button
--]]---------------------------------------------------------
function newobject:mousepressed(x, y, button)
local state = loveframes.state
local selfstate = self.state
if state ~= selfstate then
return
end
local visible = self.visible
if not visible then
return
end
local hover = self.hover
local open = self.open
local children = self.children
local curobject = children[1]
if hover then
local col = loveframes.util.BoundingBox(self.x, x, self.y, y, self.width, 1, self.closedheight, 1)
if button == 1 and col then
local baseparent = self:GetBaseParent()
if baseparent and baseparent.type == "frame" then
baseparent:MakeTop()
end
self.down = true
loveframes.downobject = self
end
end
if open and curobject then
curobject:mousepressed(x, y, button)
end
end
--[[---------------------------------------------------------
- func: mousereleased(x, y, button)
- desc: called when the player releases a mouse button
--]]---------------------------------------------------------
function newobject:mousereleased(x, y, button)
local state = loveframes.state
local selfstate = self.state
if state ~= selfstate then
return
end
local visible = self.visible
if not visible then
return
end
local hover = self.hover
local down = self.down
local clickable = self.clickable
local enabled = self.enabled
local open = self.open
local col = loveframes.util.BoundingBox(self.x, x, self.y, y, self.width, 1, self.closedheight, 1)
local children = self.children
local curobject = children[1]
if hover and col and down and button == 1 then
if open then
self:SetOpen(false)
else
self:SetOpen(true)
end
self.down = false
end
if open and curobject then
curobject:mousereleased(x, y, button)
end
end
--[[---------------------------------------------------------
- func: SetText(text)
- desc: sets the object's text
--]]---------------------------------------------------------
function newobject:SetText(text)
self.text = text
return self
end
--[[---------------------------------------------------------
- func: GetText()
- desc: gets the object's text
--]]---------------------------------------------------------
function newobject:GetText()
return self.text
end
--[[---------------------------------------------------------
- func: SetObject(object)
- desc: sets the category's object
--]]---------------------------------------------------------
function newobject:SetObject(object)
local children = self.children
local curobject = children[1]
if curobject then
curobject:Remove()
self.children = {}
end
object:Remove()
object.parent = self
object:SetState(self.state)
object:SetWidth(self.width - self.padding*2)
object:SetPos(self.padding, self.closedheight + self.padding)
table.insert(self.children, object)
return self
end
--[[---------------------------------------------------------
- func: SetObject(object)
- desc: sets the category's object
--]]---------------------------------------------------------
function newobject:GetObject()
local children = self.children
local curobject = children[1]
if curobject then
return curobject
else
return false
end
end
--[[---------------------------------------------------------
- func: SetSize(width, height, relative)
- desc: sets the object's size
--]]---------------------------------------------------------
function newobject:SetSize(width, height, relative)
if relative then
self.width = self.parent.width * width
else
self.width = width
end
return self
end
--[[---------------------------------------------------------
- func: SetHeight(height)
- desc: sets the object's height
--]]---------------------------------------------------------
function newobject:SetHeight(height)
return self
end
--[[---------------------------------------------------------
- func: SetClosedHeight(height)
- desc: sets the object's closed height
--]]---------------------------------------------------------
function newobject:SetClosedHeight(height)
self.closedheight = height
return self
end
--[[---------------------------------------------------------
- func: GetClosedHeight()
- desc: gets the object's closed height
--]]---------------------------------------------------------
function newobject:GetClosedHeight()
return self.closedheight
end
--[[---------------------------------------------------------
- func: SetOpen(bool)
- desc: sets whether the object is opened or closed
--]]---------------------------------------------------------
function newobject:SetOpen(bool)
local children = self.children
local curobject = children[1]
local closedheight = self.closedheight
local padding = self.padding
local onopenedclosed = self.OnOpenedClosed
self.open = bool
if not bool then
self.height = closedheight
if curobject then
local curobjectheight = curobject.height
curobject:SetVisible(false)
end
else
if curobject then
local curobjectheight = curobject.height
self.height = closedheight + padding * 2 + curobjectheight
curobject:SetVisible(true)
end
end
-- call the on opened closed callback if it exists
if onopenedclosed then
onopenedclosed(self)
end
return self
end
--[[---------------------------------------------------------
- func: GetOpen()
- desc: gets whether the object is opened or closed
--]]---------------------------------------------------------
function newobject:GetOpen()
return self.open
end