Files
Basalt/source/project/Object.lua
Robert Jelic 1675b71c40 -monitor support & getAll() for list-objects
added multiple monitor support
added getAll() for lists, dropdowns, radios and menubars
2022-05-30 22:45:37 +02:00

377 lines
9.8 KiB
Lua

local function Object(name)
-- Base object
local objectType = "Object" -- not changeable
--[[
local horizontalAnchor = "left"
local verticalAnchor = "top"
local ignYOffset = false
local ignXOffset = false ]]
local value
local zIndex = 1
local hanchor = "left"
local vanchor = "top"
local ignOffset = false
local isVisible = false
local visualsChanged = true
local eventSystem = BasaltEvents()
local object = {
x = 1,
y = 1,
width = 1,
height = 1,
bgColor = colors.black,
fgColor = colors.white,
name = name or "Object",
parent = nil,
show = function(self)
isVisible = true
visualsChanged = true
return self
end;
hide = function(self)
isVisible = false
visualsChanged = true
return self
end;
isVisible = function(self)
return isVisible
end;
getZIndex = function(self)
return zIndex;
end;
setFocus = function(self)
if (self.parent ~= nil) then
self.parent:setFocusedObject(self)
end
return self
end;
setZIndex = function(self, index)
zIndex = index
if (self.parent ~= nil) then
self.parent:removeObject(self)
self.parent:addObject(self)
end
return self
end;
getType = function(self)
return objectType
end;
getName = function(self)
return self.name
end;
remove = function(self)
if (self.parent ~= nil) then
self.parent:removeObject(self)
end
return self
end;
setParent = function(self, frame)
if (frame.getType ~= nil and frame:getType() == "Frame") then
self:remove()
frame:addObject(self)
if (self.draw) then
self:show()
end
end
return self
end;
setValue = function(self, _value)
if (value ~= _value) then
value = _value
visualsChanged = true
self:valueChangedHandler()
end
return self
end;
getValue = function(self)
return value
end;
getVisualChanged = function(self)
return visualsChanged
end;
setVisualChanged = function(self, change)
visualsChanged = change or true
return self
end;
getEventSystem = function(self)
return eventSystem
end;
getParent = function(self)
return self.parent
end;
setPosition = function(self, xPos, yPos, rel)
if (rel) then
self.x, self.y = math.floor(self.x + xPos), math.floor(self.y + yPos)
else
self.x, self.y = math.floor(xPos), math.floor(yPos)
end
visualsChanged = true
return self
end;
getPosition = function(self)
return self.x, self.y
end;
getVisibility = function(self)
return isVisible
end;
setVisibility = function(self, _isVisible)
isVisible = _isVisible or not isVisible
visualsChanged = true
return self
end;
setSize = function(self, width, height)
self.width, self.height = width, height
visualsChanged = true
return self
end;
getHeight = function(self)
return self.height
end;
getWidth = function(self)
return self.width
end;
getSize = function(self)
return self.width, self.height
end;
setBackground = function(self, color)
self.bgColor = color
visualsChanged = true
return self
end;
getBackground = function(self)
return self.bgColor
end;
setForeground = function(self, color)
self.fgColor = color
visualsChanged = true
return self
end;
getForeground = function(self)
return self.fgColor
end;
draw = function(self)
if (isVisible) then
return true
end
return false
end;
getAbsolutePosition = function(self, x, y)
-- relative position to absolute position
if (x == nil) then
x = self.x
end
if (y == nil) then
y = self.y
end
if (self.parent ~= nil) then
local fx, fy = self.parent:getAbsolutePosition(self.parent:getAnchorPosition())
x = fx + x - 1
y = fy + y - 1
end
return x, y
end;
getAnchorPosition = function(self, x, y, ignOff)
if (x == nil) then
x = self.x
end
if (y == nil) then
y = self.y
end
if (hanchor == "right") then
x = self.parent.width - x - self.width + 2
end
if (vanchor == "bottom") then
y = self.parent.height - y - self.height + 2
end
local xO, yO = self:getOffset()
if (ignOffset or ignOff) then
return x, y
end
return x + xO, y + yO
end;
getOffset = function(self)
if (self.parent ~= nil) and (ignOffset == false) then
return self.parent:getFrameOffset()
end
return 0, 0
end;
ignoreOffset = function(self, ignore)
ignOffset = ignore or true
return self
end;
setAnchor = function(self, ...)
for _, value in pairs(table.pack(...)) do
if (value == "right") or (value == "left") then
hanchor = value
end
if (value == "top") or (value == "bottom") then
vanchor = value
end
end
visualsChanged = true
return self
end;
getAnchor = function(self)
return hanchor, vanchor
end;
onChange = function(self, func)
self:registerEvent("value_changed", func)
return self
end;
onClick = function(self, func)
self:registerEvent("mouse_click", func)
self:registerEvent("monitor_touch", func)
return self
end;
onEvent = function(self, func)
self:registerEvent("custom_event_handler", func)
return self
end;
onClickUp = function(self, func)
self:registerEvent("mouse_up", func)
return self
end;
onKey = function(self, func)
self:registerEvent("key", func)
self:registerEvent("char", func)
return self
end;
onKeyUp = function(self, func)
self:registerEvent("key_up", func)
return self
end;
onBackgroundKey = function(self, func)
self:registerEvent("background_key", func)
self:registerEvent("background_char", func)
return self
end;
onBackgroundKeyUp = function(self, func)
self:registerEvent("background_key_up", func)
return self
end;
isFocused = function(self)
if (self.parent ~= nil) then
return self.parent:getFocusedObject() == self
end
return false
end;
onGetFocus = function(self, func)
self:registerEvent("get_focus", func)
return self
end;
onLoseFocus = function(self, func)
self:registerEvent("lose_focus", func)
return self
end;
registerEvent = function(self, event, func)
return eventSystem:registerEvent(event, func)
end;
removeEvent = function(self, event, index)
return eventSystem:removeEvent(event, index)
end;
sendEvent = function(self, event, ...)
return eventSystem:sendEvent(event, self, ...)
end;
mouseClickHandler = function(self, event, button, x, y)
local objX, objY = self:getAbsolutePosition(self:getAnchorPosition())
if (objX <= x) and (objX + self.width > x) and (objY <= y) and (objY + self.height > y) and (isVisible) then
if (self.parent ~= nil) then
self.parent:setFocusedObject(self)
end
eventSystem:sendEvent(event, self, event, button, x, y)
return true
end
return false
end;
keyHandler = function(self, event, key)
if (self:isFocused()) then
eventSystem:sendEvent(event, self, event, key)
return true
end
return false
end;
backgroundKeyHandler = function(self, event, key)
eventSystem:sendEvent("background_" .. event, self, event, key)
end;
valueChangedHandler = function(self)
eventSystem:sendEvent("value_changed", self)
end;
eventHandler = function(self, event, p1, p2, p3, p4)
eventSystem:sendEvent("custom_event_handler", self, event, p1, p2, p3, p4)
end;
getFocusHandler = function(self)
eventSystem:sendEvent("get_focus", self)
end;
loseFocusHandler = function(self)
eventSystem:sendEvent("lose_focus", self)
end;
}
object.__index = object
return object
end