1.6.0 Release

Release version of basalt 1.6.0
This commit is contained in:
Robert Jelic
2022-08-25 22:22:47 +02:00
parent 14643193b9
commit 8ab06dbc17
27 changed files with 1836 additions and 999 deletions

View File

@@ -1,12 +1,12 @@
local Object = require("Object") local Object = require("Object")
local _OBJECTS = require("loadObjects") local _OBJECTS = require("loadObjects")
local BasaltDraw = require("basaltDraw") local BasaltDraw = require("basaltDraw")
local utils = require("utils") local utils = require("utils")
local layout = require("layout") local layout = require("layout")
local uuid = utils.uuid local uuid = utils.uuid
local rpairs = utils.rpairs local rpairs = utils.rpairs
local xmlValue = utils.getValueFromXML local xmlValue = utils.getValueFromXML
local tableCount = utils.tableCount
local sub,min,max = string.sub,math.min,math.max local sub,min,max = string.sub,math.min,math.max
@@ -17,6 +17,8 @@ return function(name, parent, pTerm, basalt)
local objects = {} local objects = {}
local objZIndex = {} local objZIndex = {}
local object = {} local object = {}
local events = {}
local eventZIndex = {}
local variables = {} local variables = {}
local theme = {} local theme = {}
local dynamicValues = {} local dynamicValues = {}
@@ -29,15 +31,20 @@ return function(name, parent, pTerm, basalt)
local dragXOffset = 0 local dragXOffset = 0
local dragYOffset = 0 local dragYOffset = 0
local isScrollable = false local isScrollable = false
local minScroll = 0 local scrollAmount = 0
local maxScroll = 10
local mirrorActive = false local mirrorActive = false
local mirrorAttached = false local mirrorAttached = false
local mirrorSide = "" local mirrorSide = ""
local importantScroll = false local isMovable = false
local isDragging =false
local focusedOBjectCache local focusedObjectCache
local focusedObject local focusedObject
local autoSize = true
local autoScroll = true
local initialized = false
local activeEvents = {}
base:setZIndex(10) base:setZIndex(10)
@@ -70,17 +77,6 @@ return function(name, parent, pTerm, basalt)
end end
end end
if (parent ~= nil) then
base.parent = parent
base.width, base.height = parent:getSize()
base.bgColor = parent:getTheme("FrameBG")
base.fgColor = parent:getTheme("FrameText")
else
base.width, base.height = termObject.getSize()
base.bgColor = basalt.getTheme("BasaltBG")
base.fgColor = basalt.getTheme("BasaltText")
end
local function getObject(name) local function getObject(name)
for _, value in pairs(objects) do for _, value in pairs(objects) do
for _, b in pairs(value) do for _, b in pairs(value) do
@@ -135,11 +131,94 @@ return function(name, parent, pTerm, basalt)
return obj return obj
end end
local function removeEvents(self, obj)
for a, b in pairs(events) do
for c, d in pairs(b) do
for key, value in pairs(d) do
if (value == obj) then
table.remove(events[a][c], key)
if(self.parent~=nil)then
if(tableCount(events[event])<=0)then
self.parent:removeEvent(a, self)
end
end
end
end
end
end
end
local function removeObject(obj) local function removeObject(obj)
for a, b in pairs(objects) do for a, b in pairs(objects) do
for key, value in pairs(b) do for key, value in pairs(b) do
if (value == obj) then if (value == obj) then
table.remove(objects[a], key) table.remove(objects[a], key)
removeEvents(object, obj)
return true;
end
end
end
return false
end
local function getEvent(self, event, name)
for _, value in pairs(events[event]) do
for _, b in pairs(value) do
if (b:getName() == name) then
return b
end
end
end
end
local function addEvent(self, event, obj)
local zIndex = obj:getZIndex()
if(events[event]==nil)then events[event] = {} end
if(eventZIndex[event]==nil)then eventZIndex[event] = {} end
if (getEvent(self, event, obj.name) ~= nil) then
return nil
end
if(self.parent~=nil)then
self.parent:addEvent(event, self)
end
activeEvents[event] = true
if (events[event][zIndex] == nil) then
for x = 1, #eventZIndex[event] + 1 do
if (eventZIndex[event][x] ~= nil) then
if (zIndex == eventZIndex[event][x]) then
break
end
if (zIndex > eventZIndex[event][x]) then
table.insert(eventZIndex[event], x, zIndex)
break
end
else
table.insert(eventZIndex[event], zIndex)
end
end
if (#eventZIndex[event] <= 0) then
table.insert(eventZIndex[event], zIndex)
end
events[event][zIndex] = {}
end
table.insert(events[event][zIndex], obj)
return obj
end
local function removeEvent(self, event, obj)
for a, b in pairs(events[event]) do
for key, value in pairs(b) do
if (value == obj) then
table.remove(events[event][a], key)
if(#events[event][a]<=0)then
events[event][a] = nil
if(self.parent~=nil)then
if(tableCount(events[event])<=0)then
activeEvents[event] = false
self.parent:removeEvent(event, self)
end
end
end
return true; return true;
end end
end end
@@ -217,7 +296,7 @@ return function(name, parent, pTerm, basalt)
end end
local function recalculateDynamicValues() local function recalculateDynamicValues(self)
if(#dynamicValues>0)then if(#dynamicValues>0)then
for n=1,dynValueId do for n=1,dynValueId do
if(dynamicValues[n]~=nil)then if(dynamicValues[n]~=nil)then
@@ -225,6 +304,18 @@ return function(name, parent, pTerm, basalt)
if(#dynamicValues[n][3]<=0)then dynamicValues[n][3] = dynValueGetObjects(dynamicValues[n][4], dynamicValues[n][2]) end if(#dynamicValues[n][3]<=0)then dynamicValues[n][3] = dynValueGetObjects(dynamicValues[n][4], dynamicValues[n][2]) end
numberStr = dynValueObjectToNumber(dynamicValues[n][2], dynamicValues[n][3]) numberStr = dynValueObjectToNumber(dynamicValues[n][2], dynamicValues[n][3])
dynamicValues[n][1] = stringToNumber(numberStr) dynamicValues[n][1] = stringToNumber(numberStr)
if(dynamicValues[n][4]:getType()=="Frame")then
dynamicValues[n][4]:recalculateDynamicValues()
end
end
end
for _, index in pairs(objZIndex) do
if (objects[index] ~= nil) then
for _, value in pairs(objects[index]) do
if (value.eventHandler ~= nil) then
value:eventHandler("dynamicValueEvent", self)
end
end
end end
end end
end end
@@ -234,6 +325,30 @@ return function(name, parent, pTerm, basalt)
return dynamicValues[id][1] return dynamicValues[id][1]
end end
local function calculateMaxScroll(self)
for _, value in pairs(objects) do
for _, b in pairs(value) do
if(b.getHeight~=nil)and(b.getY~=nil)then
local h, y = b:getHeight(), b:getY()
if (h + y - self:getHeight() > scrollAmount) then
scrollAmount = max(h + y - self:getHeight(), 0)
end
end
end
end
end
local function focusSystem(self)
if(focusedObject~=focusedObjectCache)then
if(focusedObject~=nil)then
focusedObject:loseFocusHandler()
end
if(focusedObjectCache~=nil)then
focusedObjectCache:getFocusHandler()
end
focusedObject = focusedObjectCache
end
end
object = { object = {
barActive = false, barActive = false,
@@ -241,7 +356,11 @@ return function(name, parent, pTerm, basalt)
barTextcolor = colors.black, barTextcolor = colors.black,
barText = "New Frame", barText = "New Frame",
barTextAlign = "left", barTextAlign = "left",
isMoveable = false,
addEvent = addEvent,
removeEvent = removeEvent,
removeEvents = removeEvents,
getEvent = getEvent,
newDynamicValue = newDynamicValue, newDynamicValue = newDynamicValue,
recalculateDynamicValues = recalculateDynamicValues, recalculateDynamicValues = recalculateDynamicValues,
@@ -252,7 +371,7 @@ return function(name, parent, pTerm, basalt)
end; end;
setFocusedObject = function(self, obj) setFocusedObject = function(self, obj)
focusedOBjectCache = obj focusedObjectCache = obj
return self return self
end; end;
@@ -262,25 +381,35 @@ return function(name, parent, pTerm, basalt)
setSize = function(self, w, h, rel) setSize = function(self, w, h, rel)
base.setSize(self, w, h, rel) base.setSize(self, w, h, rel)
if(self.parent==nil)then
basaltDraw = BasaltDraw(termObject)
end
for _, index in pairs(objZIndex) do for _, index in pairs(objZIndex) do
if (objects[index] ~= nil) then if (objects[index] ~= nil) then
for _, value in pairs(objects[index]) do for _, value in pairs(objects[index]) do
if (value.eventHandler ~= nil) then if (value.eventHandler ~= nil) then
value:sendEvent("basalt_resize", value, self) value:eventHandler("basalt_resize", value, self)
end end
end end
end end
end end
self:recalculateDynamicValues()
autoSize = false
return self return self
end; end;
setTheme = function(self, _theme) setTheme = function(self, _theme, col)
if(type(_theme)=="table")then
theme = _theme theme = _theme
elseif(type(_theme)=="string")then
theme[_theme] = col
end
self:updateDraw()
return self return self
end, end,
getTheme = function(self, name) getTheme = function(self, name)
return (theme and theme[name]) or (self.parent~=nil and self.parent:getTheme(name) or basalt.getTheme(name)) return theme[name] or (self.parent~=nil and self.parent:getTheme(name) or basalt.getTheme(name))
end, end,
setPosition = function(self, x, y, rel) setPosition = function(self, x, y, rel)
@@ -289,11 +418,12 @@ return function(name, parent, pTerm, basalt)
if (objects[index] ~= nil) then if (objects[index] ~= nil) then
for _, value in pairs(objects[index]) do for _, value in pairs(objects[index]) do
if (value.eventHandler ~= nil) then if (value.eventHandler ~= nil) then
value:sendEvent("basalt_reposition", value, self) value:eventHandler("basalt_reposition", value, self)
end end
end end
end end
end end
self:recalculateDynamicValues()
return self return self
end; end;
@@ -304,6 +434,7 @@ return function(name, parent, pTerm, basalt)
setOffset = function(self, xO, yO) setOffset = function(self, xO, yO)
xOffset = xO ~= nil and math.floor(xO < 0 and math.abs(xO) or -xO) or xOffset xOffset = xO ~= nil and math.floor(xO < 0 and math.abs(xO) or -xO) or xOffset
yOffset = yO ~= nil and math.floor(yO < 0 and math.abs(yO) or -yO) or yOffset yOffset = yO ~= nil and math.floor(yO < 0 and math.abs(yO) or -yO) or yOffset
self:updateDraw()
return self return self
end; end;
@@ -311,12 +442,12 @@ return function(name, parent, pTerm, basalt)
return xOffset, yOffset return xOffset, yOffset
end; end;
getOffset = function(self) -- internal getOffset = function(self)
return xOffset < 0 and math.abs(xOffset) or -xOffset, yOffset < 0 and math.abs(yOffset) or -yOffset return xOffset < 0 and math.abs(xOffset) or -xOffset, yOffset < 0 and math.abs(yOffset) or -yOffset
end; end;
removeFocusedObject = function(self) removeFocusedObject = function(self)
focusedOBjectCache = nil focusedObjectCache = nil
return self return self
end; end;
@@ -338,43 +469,48 @@ return function(name, parent, pTerm, basalt)
yCursor = oby + _yCursor - 1 yCursor = oby + _yCursor - 1
end end
cursorColor = color or cursorColor cursorColor = color or cursorColor
self:setVisualChanged() if (cursorBlink) then
termObject.setTextColor(cursorColor)
termObject.setCursorPos(xCursor, yCursor)
termObject.setCursorBlink(cursorBlink)
else
termObject.setCursorBlink(false)
end
end end
return self return self
end; end;
setMoveable = function(self, moveable) setMovable = function(self, movable)
self.isMoveable = moveable or not self.isMoveable if(self.parent~=nil)then
self:setVisualChanged() isMovable = movable or not isMovable
self.parent:addEvent("mouse_click", self)
activeEvents["mouse_click"] = true
self.parent:addEvent("mouse_up", self)
activeEvents["mouse_up"] = true
self.parent:addEvent("mouse_drag", self)
activeEvents["mouse_drag"] = true
end
return self; return self;
end; end;
setScrollable = function(self, scrollable) setScrollable = function(self, scrollable)
isScrollable = scrollable and true or false isScrollable = scrollable and true or false
if(self.parent~=nil)then
self.parent:addEvent("mouse_scroll", self)
end
activeEvents["mouse_scroll"] = true
return self return self
end, end,
setImportantScroll = function(self, imp) setScrollAmount = function(self, max)
importantScroll = imp and true or false scrollAmount = max or scrollAmount
autoScroll = false
return self return self
end, end,
setMaxScroll = function(self, max)
maxScroll = max or maxScroll
return self
end,
setMinScroll = function(self, min) getScrollAmount = function(self)
minScroll = min or minScroll return scrollAmount
return self
end,
getMaxScroll = function(self)
return maxScroll
end,
getMinScroll = function(self)
return minScroll
end, end,
show = function(self) show = function(self)
@@ -434,7 +570,7 @@ return function(name, parent, pTerm, basalt)
setValuesByXMLData = function(self, data) setValuesByXMLData = function(self, data)
base.setValuesByXMLData(self, data) base.setValuesByXMLData(self, data)
if(xmlValue("moveable", data)~=nil)then if(xmlValue("moveable", data))then self:setMoveable(true) end end if(xmlValue("movable", data)~=nil)then if(xmlValue("movable", data))then self:setMovable(true) end end
if(xmlValue("scrollable", data)~=nil)then if(xmlValue("scrollable", data))then self:setScrollable(true) end end if(xmlValue("scrollable", data)~=nil)then if(xmlValue("scrollable", data))then self:setScrollable(true) end end
if(xmlValue("monitor", data)~=nil)then self:setMonitor(xmlValue("monitor", data)):show() end if(xmlValue("monitor", data)~=nil)then self:setMonitor(xmlValue("monitor", data)):show() end
if(xmlValue("mirror", data)~=nil)then self:setMirror(xmlValue("mirror", data)) end if(xmlValue("mirror", data)~=nil)then self:setMirror(xmlValue("mirror", data)) end
@@ -446,9 +582,7 @@ return function(name, parent, pTerm, basalt)
if(xmlValue("layout", data)~=nil)then self:addLayout(xmlValue("layout", data)) end if(xmlValue("layout", data)~=nil)then self:addLayout(xmlValue("layout", data)) end
if(xmlValue("xOffset", data)~=nil)then self:setOffset(xmlValue("xOffset", data), yOffset) end if(xmlValue("xOffset", data)~=nil)then self:setOffset(xmlValue("xOffset", data), yOffset) end
if(xmlValue("yOffset", data)~=nil)then self:setOffset(yOffset, xmlValue("yOffset", data)) end if(xmlValue("yOffset", data)~=nil)then self:setOffset(yOffset, xmlValue("yOffset", data)) end
if(xmlValue("maxScroll", data)~=nil)then self:setMaxScroll(xmlValue("maxScroll", data)) end if(xmlValue("scrollAmount", data)~=nil)then self:setScrollAmount(xmlValue("scrollAmount", data)) end
if(xmlValue("minScroll", data)~=nil)then self:setMaxScroll(xmlValue("minScroll", data)) end
if(xmlValue("importantScroll", data)~=nil)then self:setImportantScroll(xmlValue("importantScroll", data)) end
local objectList = data:children() local objectList = data:children()
@@ -466,27 +600,28 @@ return function(name, parent, pTerm, basalt)
return self return self
end, end,
showBar = function(self, showIt) showBar = function(self, showIt) -- deprecated
self.barActive = showIt or not self.barActive self.barActive = showIt or not self.barActive
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
setBar = function(self, text, bgCol, fgCol) setBar = function(self, text, bgCol, fgCol) -- deprecated
self.barText = text or "" self.barText = text or ""
self.barBackground = bgCol or self.barBackground self.barBackground = bgCol or self.barBackground
self.barTextcolor = fgCol or self.barTextcolor self.barTextcolor = fgCol or self.barTextcolor
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
setBarTextAlign = function(self, align) setBarTextAlign = function(self, align) -- deprecated
self.barTextAlign = align or "left" self.barTextAlign = align or "left"
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
setMirror = function(self, side) setMirror = function(self, side)
if(self.parent~=nil)then error("Frame has to be a base frame in order to attach a mirror.") end
mirrorSide = side mirrorSide = side
if(mirror~=nil)then if(mirror~=nil)then
basaltDraw.setMirror(mirror) basaltDraw.setMirror(mirror)
@@ -507,11 +642,13 @@ return function(name, parent, pTerm, basalt)
if(peripheral.getType(side)=="monitor")then if(peripheral.getType(side)=="monitor")then
termObject = peripheral.wrap(side) termObject = peripheral.wrap(side)
monitorAttached = true monitorAttached = true
end end
if(self.parent~=nil)then if(self.parent~=nil)then
self.parent:removeObject(self) self.parent:removeObject(self)
end end
isMonitor = true isMonitor = true
basalt.setMonitorFrame(side, self)
else else
termObject = parentTerminal termObject = parentTerminal
isMonitor = false isMonitor = false
@@ -520,85 +657,73 @@ return function(name, parent, pTerm, basalt)
end end
end end
basaltDraw = BasaltDraw(termObject) basaltDraw = BasaltDraw(termObject)
self:setSize(termObject.getSize())
autoSize = true
monSide = side or nil monSide = side or nil
self:updateDraw()
return self; return self;
end; end;
getVisualChanged = function(self)
local changed = base.getVisualChanged(self)
for _, index in pairs(objZIndex) do
if (objects[index] ~= nil) then
for _, value in pairs(objects[index]) do
if (value.getVisualChanged ~= nil and value:getVisualChanged()) then
changed = true
end
end
end
end
return changed
end;
loseFocusHandler = function(self) loseFocusHandler = function(self)
base.loseFocusHandler(self) base.loseFocusHandler(self)
if(focusedOBjectCache~=nil)then if(focusedObject~=nil)then focusedObject:loseFocusHandler() focusedObject = nil end
focusedOBjectCache:loseFocusHandler()
focusedOBjectCache = nil
end
end; end;
getFocusHandler = function(self) getFocusHandler = function(self)
base.getFocusHandler(self) base.getFocusHandler(self)
if (self.parent ~= nil) then if (self.parent ~= nil) then
if(isMovable)then
self.parent:removeEvents(self)
self.parent:removeObject(self) self.parent:removeObject(self)
self.parent:addObject(self) self.parent:addObject(self)
end for k,v in pairs(activeEvents)do
end; if(v)then
self.parent:addEvent(k, self)
keyHandler = function(self, event, key)
if (focusedObject ~= nil) then
if(focusedObject~=self)then
if (focusedObject.keyHandler ~= nil) then
if (focusedObject:keyHandler(event, key)) then
return true
end
end
else
base.keyHandler(self, event, key)
end
end
return false
end;
backgroundKeyHandler = function(self, event, key)
base.backgroundKeyHandler(self, event, key)
for _, index in pairs(objZIndex) do
if (objects[index] ~= nil) then
for _, value in pairs(objects[index]) do
if (value.backgroundKeyHandler ~= nil) then
value:backgroundKeyHandler(event, key)
end end
end end
self:updateDraw()
end end
end end
if(focusedObject~=nil)then focusedObject:getFocusHandler() end
end; end;
eventHandler = function(self, event, p1, p2, p3, p4) eventHandler = function(self, event, p1, p2, p3, p4)
base.eventHandler(self, event, p1, p2, p3, p4) base.eventHandler(self, event, p1, p2, p3, p4)
for _, index in pairs(objZIndex) do if(events["other_event"]~=nil)then
if (objects[index] ~= nil) then for _, index in ipairs(eventZIndex["other_event"]) do
for _, value in pairs(objects[index]) do if (events["other_event"][index] ~= nil) then
for _, value in rpairs(events["other_event"][index]) do
if (value.eventHandler ~= nil) then if (value.eventHandler ~= nil) then
value:eventHandler(event, p1, p2, p3, p4) if (value:eventHandler(event, p1, p2, p3, p4)) then
return true
end end
end end
end end
end end
end
end
if(autoSize)and not(isMonitor)then
if(self.parent==nil)then
if(event=="term_resize")then
self:setSize(termObject.getSize())
autoSize = true
end
end
end
if(isMonitor)then if(isMonitor)then
if(autoSize)then
if(event=="monitor_resize")and(p1==monSide)then
self:setSize(termObject.getSize())
autoSize = true
self:updateDraw()
end
end
if(event == "peripheral")and(p1==monSide)then if(event == "peripheral")and(p1==monSide)then
if(peripheral.getType(monSide)=="monitor")then if(peripheral.getType(monSide)=="monitor")then
monitorAttached = true monitorAttached = true
termObject = peripheral.wrap(monSide) termObject = peripheral.wrap(monSide)
basaltDraw = BasaltDraw(termObject) basaltDraw = BasaltDraw(termObject)
self:updateDraw()
end end
end end
if(event == "peripheral_detach")and(p1==monSide)then if(event == "peripheral_detach")and(p1==monSide)then
@@ -613,82 +738,199 @@ return function(name, parent, pTerm, basalt)
if(event == "peripheral_detach")and(p1==mirrorSide)then if(event == "peripheral_detach")and(p1==mirrorSide)then
monitorAttached = false monitorAttached = false
end end
if(event=="monitor_touch")then if(event=="monitor_touch")and(mirrorSide==p1)then
self:mouseHandler(event, p1, p2, p3, p4) self:mouseHandler(1, p2, p3, true)
end end
end end
if (event == "terminate") then if (event == "terminate")and(self.parent==nil)then
termObject.setCursorPos(1, 1)
termObject.clear()
basalt.stop() basalt.stop()
end end
end; end,
mouseHandler = function(self, event, button, x, y) mouseHandler = function(self, button, x, y)
if (self.drag) then if(base.mouseHandler(self, button, x, y))then
if(events["mouse_click"]~=nil)then
self:setCursor(false)
for _, index in ipairs(eventZIndex["mouse_click"]) do
if (events["mouse_click"][index] ~= nil) then
for _, value in rpairs(events["mouse_click"][index]) do
if (value.mouseHandler ~= nil) then
if (value:mouseHandler(button, x, y)) then
focusSystem(self)
return true
end
end
end
end
end
end
if (isMovable) then
local fx, fy = self:getAbsolutePosition(self:getAnchorPosition())
if (x >= fx) and (x <= fx + self:getWidth() - 1) and (y == fy)then
isDragging = true
dragXOffset = fx - x
dragYOffset = yOff and 1 or 0
end
end
self:removeFocusedObject()
focusSystem(self)
return true
end
return false
end,
mouseUpHandler = function(self, button, x, y)
if (isDragging) then
isDragging = false
end
if(base.mouseUpHandler(self, button, x, y))then
if(events["mouse_up"]~=nil)then
for _, index in ipairs(eventZIndex["mouse_up"]) do
if (events["mouse_up"][index] ~= nil) then
for _, value in rpairs(events["mouse_up"][index]) do
if (value.mouseUpHandler ~= nil) then
if (value:mouseUpHandler(button, x, y)) then
focusSystem(self)
return true
end
end
end
end
end
end
focusSystem(self)
return true
end
return false
end,
scrollHandler = function(self, dir, x, y)
if(base.scrollHandler(self, dir, x, y))then
if(events["mouse_scroll"]~=nil)then
for _, index in pairs(eventZIndex["mouse_scroll"]) do
if (events["mouse_scroll"][index] ~= nil) then
for _, value in rpairs(events["mouse_scroll"][index]) do
if (value.scrollHandler ~= nil) then
if (value:scrollHandler(dir, x, y)) then
focusSystem(self)
return true
end
end
end
end
end
end
local cache = yOffset
if(isScrollable)then
calculateMaxScroll(self)
if(dir>0)or(dir<0)then
yOffset = max(min(yOffset-dir, 0),-scrollAmount)
self:updateDraw()
end
end
self:removeFocusedObject()
focusSystem(self)
if(yOffset==cache)then return false end
return true
end
return false
end,
dragHandler = function(self, button, x, y)
if (isDragging) then
local xO, yO = self.parent:getOffsetInternal() local xO, yO = self.parent:getOffsetInternal()
xO = xO < 0 and math.abs(xO) or -xO xO = xO < 0 and math.abs(xO) or -xO
yO = yO < 0 and math.abs(yO) or -yO yO = yO < 0 and math.abs(yO) or -yO
if (event == "mouse_drag") then
local parentX = 1 local parentX = 1
local parentY = 1 local parentY = 1
if (self.parent ~= nil) then if (self.parent ~= nil) then
parentX, parentY = self.parent:getAbsolutePosition(self.parent:getAnchorPosition()) parentX, parentY = self.parent:getAbsolutePosition(self.parent:getAnchorPosition())
end end
self:setPosition(x + dragXOffset - (parentX - 1) + xO, y + dragYOffset - (parentY - 1) + yO) self:setPosition(x + dragXOffset - (parentX - 1) + xO, y + dragYOffset - (parentY - 1) + yO)
end self:updateDraw()
if (event == "mouse_up") then
self.drag = false
end
return true return true
end end
if(events["mouse_drag"]~=nil)then
for _, index in ipairs(eventZIndex["mouse_drag"]) do
if (events["mouse_drag"][index] ~= nil) then
for _, value in rpairs(events["mouse_drag"][index]) do
if (value.dragHandler ~= nil) then
if (value:dragHandler(button, x, y)) then
focusSystem(self)
return true
end
end
end
end
end
end
focusSystem(self)
base.dragHandler(self, button, x, y)
return false
end,
local fx, fy = self:getAbsolutePosition(self:getAnchorPosition()) keyHandler = function(self, key, isHolding)
local yOff = false if (self:isFocused())or(self.parent==nil)then
if(fy-1 == y)and(self:getBorder("top"))then local val = self:getEventSystem():sendEvent("key", self, "key", key)
y = y+1 if(val==false)then return false end
yOff = true if(events["key"]~=nil)then
end for _, index in pairs(eventZIndex["key"]) do
if (events["key"][index] ~= nil) then
if (base.mouseHandler(self, event, button, x, y)) then for _, value in rpairs(events["key"][index]) do
fx = fx + xOffset;fy = fy + yOffset; if (value.keyHandler ~= nil) then
if(isScrollable)and(importantScroll)then if (value:keyHandler(key, isHolding)) then
if(event=="mouse_scroll")then
if(button>0)or(button<0)then
yOffset = max(min(yOffset-button, -minScroll),-maxScroll)
end
end
end
for _, index in pairs(objZIndex) do
if (objects[index] ~= nil) then
for _, value in rpairs(objects[index]) do
if (value.mouseHandler ~= nil) then
if (value:mouseHandler(event, button, x, y)) then
return true return true
end end
end end
end end
end end
end end
self:removeFocusedObject()
if (self.isMoveable) then
if (x >= fx) and (x <= fx + self:getWidth() - 1) and (y == fy) and (event == "mouse_click") then
self.drag = true
dragXOffset = fx - x
dragYOffset = yOff and 1 or 0
end end
end end
if(isScrollable)and(not importantScroll)then
if(event=="mouse_scroll")then
if(button>0)or(button<0)then
yOffset = max(min(yOffset-button, -minScroll),-maxScroll)
end
end
end
return true
end
return false return false
end; end,
keyUpHandler = function(self, key)
if (self:isFocused())or(self.parent==nil)then
local val = self:getEventSystem():sendEvent("key_up", self, "key_up", key)
if(val==false)then return false end
if(events["key_up"]~=nil)then
for _, index in pairs(eventZIndex["key_up"]) do
if (events["key_up"][index] ~= nil) then
for _, value in rpairs(events["key_up"][index]) do
if (value.keyUpHandler ~= nil) then
if (value:keyUpHandler(key)) then
return true
end
end
end
end
end
end
end
return false
end,
charHandler = function(self, char)
if (self:isFocused())or(self.parent==nil)then
local val = self:getEventSystem():sendEvent("char", self, "char", char)
if(val==false)then return false end
if(events["char"]~=nil)then
for _, index in pairs(eventZIndex["char"]) do
if (events["char"][index] ~= nil) then
for _, value in rpairs(events["char"][index]) do
if (value.charHandler ~= nil) then
if (value:charHandler(char)) then
return true
end
end
end
end
end
end
end
return false
end,
setText = function(self, x, y, text) setText = function(self, x, y, text)
local obx, oby = self:getAnchorPosition() local obx, oby = self:getAnchorPosition()
@@ -768,38 +1010,20 @@ return function(name, parent, pTerm, basalt)
end end
end; end;
draw = function(self) draw = function(self, force)
if(isMonitor)and not(monitorAttached)then return false end; if(isMonitor)and not(monitorAttached)then return false end;
if (self:getVisualChanged()) then if(self.parent==nil)then if(self:getDraw()==false)then return false end end
if (base.draw(self)) then if (base.draw(self))then
if(focusedObject~=focusedOBjectCache)then
if(focusedOBjectCache~=nil)then
focusedOBjectCache:getFocusHandler()
end
if(focusedObject~=nil)then
focusedObject:loseFocusHandler()
end
focusedObject = focusedOBjectCache
end
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition()) local obx, oby = self:getAbsolutePosition(self:getAnchorPosition())
local anchx, anchy = self:getAnchorPosition() local anchx, anchy = self:getAnchorPosition()
local w,h = self:getSize() local w,h = self:getSize()
if (self.parent ~= nil) then if (self.parent == nil) then
if(self.bgColor~=false)then
self.parent:drawBackgroundBox(anchx, anchy, w, h, self.bgColor)
self.parent:drawTextBox(anchx, anchy, w, h, " ")
end
if(self.bgColor~=false)then self.parent:drawForegroundBox(anchx, anchy, w, h, self.fgColor) end
else
if(self.bgColor~=false)then if(self.bgColor~=false)then
basaltDraw.drawBackgroundBox(anchx, anchy, w, h, self.bgColor) basaltDraw.drawBackgroundBox(anchx, anchy, w, h, self.bgColor)
basaltDraw.drawTextBox(anchx, anchy, w, h, " ") basaltDraw.drawTextBox(anchx, anchy, w, h, " ")
end end
if(self.fgColor~=false)then basaltDraw.drawForegroundBox(anchx, anchy, w, h, self.fgColor) end if(self.fgColor~=false)then basaltDraw.drawForegroundBox(anchx, anchy, w, h, self.fgColor) end
end end
termObject.setCursorBlink(false)
if (self.barActive) then if (self.barActive) then
if (self.parent ~= nil) then if (self.parent ~= nil) then
self.parent:writeText(anchx, anchy, utils.getTextHorizontalAlign(self.barText, w, self.barTextAlign), self.barBackground, self.barTextcolor) self.parent:writeText(anchx, anchy, utils.getTextHorizontalAlign(self.barText, w, self.barTextAlign), self.barBackground, self.barTextcolor)
@@ -830,22 +1054,10 @@ return function(name, parent, pTerm, basalt)
end end
end end
end end
if (cursorBlink) then
termObject.setTextColor(cursorColor)
termObject.setCursorPos(xCursor, yCursor)
if (self.parent ~= nil) then
termObject.setCursorBlink(self:isFocused())
else
termObject.setCursorBlink(cursorBlink)
end
end
self:setVisualChanged(false)
end
end end
end; end;
drawUpdate = function(self) updateTerm = function(self)
if(isMonitor)and not(monitorAttached)then return false end; if(isMonitor)and not(monitorAttached)then return false end;
basaltDraw.update() basaltDraw.update()
end; end;
@@ -868,7 +1080,22 @@ return function(name, parent, pTerm, basalt)
addFrame = function(self, name) addFrame = function(self, name)
local obj = basalt.newFrame(name or uuid(), self, nil, basalt) local obj = basalt.newFrame(name or uuid(), self, nil, basalt)
return addObject(obj) return addObject(obj)
end; end,
init = function(self)
if not(initialized)then
if (parent ~= nil) then
base.width, base.height = parent:getSize()
self:setBackground(parent:getTheme("FrameBG"))
self:setForeground(parent:getTheme("FrameText"))
else
base.width, base.height = termObject.getSize()
self:setBackground(basalt.getTheme("BasaltBG"))
self:setForeground(basalt.getTheme("BasaltText"))
end
initialized = true
end
end,
} }
for k,v in pairs(_OBJECTS)do for k,v in pairs(_OBJECTS)do
object["add"..k] = function(self, name) object["add"..k] = function(self, name)

View File

@@ -13,20 +13,23 @@ return function(name)
local anchor = "topLeft" local anchor = "topLeft"
local ignOffset = false local ignOffset = false
local isVisible = true local isVisible = true
local initialized = false
local shadow = false local shadow = false
local borderLeft = false local borderColors = {
local borderTop = false left = false,
local borderRight = false right = false,
local borderBottom = false top = false,
bottom = false
}
local shadowColor = colors.black local shadowColor = colors.black
local borderColor = colors.black
local isEnabled = true local isEnabled = true
local isDragging = false local isDragging = false
local dragStartX, dragStartY, dragXOffset, dragYOffset = 0, 0, 0, 0 local dragStartX, dragStartY, dragXOffset, dragYOffset = 0, 0, 0, 0
local visualsChanged = true local draw = true
local activeEvents = {}
local eventSystem = basaltEvent() local eventSystem = basaltEvent()
@@ -36,19 +39,22 @@ return function(name)
width = 1, width = 1,
height = 1, height = 1,
bgColor = colors.black, bgColor = colors.black,
bgSymbol = " ",
bgSymbolColor = colors.black,
fgColor = colors.white, fgColor = colors.white,
transparentColor = false,
name = name or "Object", name = name or "Object",
parent = nil, parent = nil,
show = function(self) show = function(self)
isVisible = true isVisible = true
visualsChanged = true self:updateDraw()
return self return self
end; end;
hide = function(self) hide = function(self)
isVisible = false isVisible = false
visualsChanged = true self:updateDraw()
return self return self
end; end;
@@ -96,13 +102,12 @@ return function(name)
if(xmlValue("enabled", data)~=nil)then if(xmlValue("enabled", data))then self:enable() else self:disable() end end if(xmlValue("enabled", data)~=nil)then if(xmlValue("enabled", data))then self:enable() else self:disable() end end
if(xmlValue("zIndex", data)~=nil)then self:setZIndex(xmlValue("zIndex", data)) end if(xmlValue("zIndex", data)~=nil)then self:setZIndex(xmlValue("zIndex", data)) end
if(xmlValue("anchor", data)~=nil)then self:setAnchor(xmlValue("anchor", data)) end if(xmlValue("anchor", data)~=nil)then self:setAnchor(xmlValue("anchor", data)) end
if(xmlValue("shadow", data)~=nil)then if(xmlValue("shadow", data))then self:showShadow(true) end end
if(xmlValue("shadowColor", data)~=nil)then self:setShadow(colors[xmlValue("shadowColor", data)]) end if(xmlValue("shadowColor", data)~=nil)then self:setShadow(colors[xmlValue("shadowColor", data)]) end
if(xmlValue("border", data)~=nil)then if(xmlValue("border", data))then borderLeft,borderTop,borderRight,borderBottom = true,true,true,true end end if(xmlValue("border", data)~=nil)then self:setBorder(colors[xmlValue("border", data)]) end
if(xmlValue("borderLeft", data)~=nil)then if(xmlValue("borderLeft", data))then borderLeft = true else borderLeft = false end end if(xmlValue("borderLeft", data)~=nil)then borderColors["left"] = xmlValue("borderLeft", data) end
if(xmlValue("borderTop", data)~=nil)then if(xmlValue("borderTop", data))then borderTop = true else borderTop = false end end if(xmlValue("borderTop", data)~=nil)then borderColors["top"] = xmlValue("borderTop", data) end
if(xmlValue("borderRight", data)~=nil)then if(xmlValue("borderRight", data))then borderRight = true else borderRight = false end end if(xmlValue("borderRight", data)~=nil)then borderColors["right"] = xmlValue("borderRight", data) end
if(xmlValue("borderBottom", data)~=nil)then if(xmlValue("borderBottom", data))then borderBottom = true else borderBottom = false end end if(xmlValue("borderBottom", data)~=nil)then borderColors["bottom"] = xmlValue("borderBottom", data) end
if(xmlValue("borderColor", data)~=nil)then self:setBorder(colors[xmlValue("borderColor", data)]) end if(xmlValue("borderColor", data)~=nil)then self:setBorder(colors[xmlValue("borderColor", data)]) end
if(xmlValue("ignoreOffset", data)~=nil)then if(xmlValue("ignoreOffset", data))then self:ignoreOffset(true) end end if(xmlValue("ignoreOffset", data)~=nil)then if(xmlValue("ignoreOffset", data))then self:ignoreOffset(true) end end
if(xmlValue("onClick", data)~=nil)then self:generateXMLEventFunction(self.onClick, xmlValue("onClick", data)) end if(xmlValue("onClick", data)~=nil)then self:generateXMLEventFunction(self.onClick, xmlValue("onClick", data)) end
@@ -117,9 +122,7 @@ return function(name)
if(xmlValue("onEvent", data)~=nil)then self:generateXMLEventFunction(self.onEvent, xmlValue("onEvent", data)) end if(xmlValue("onEvent", data)~=nil)then self:generateXMLEventFunction(self.onEvent, xmlValue("onEvent", data)) end
if(xmlValue("onGetFocus", data)~=nil)then self:generateXMLEventFunction(self.onGetFocus, xmlValue("onGetFocus", data)) end if(xmlValue("onGetFocus", data)~=nil)then self:generateXMLEventFunction(self.onGetFocus, xmlValue("onGetFocus", data)) end
if(xmlValue("onLoseFocus", data)~=nil)then self:generateXMLEventFunction(self.onLoseFocus, xmlValue("onLoseFocus", data)) end if(xmlValue("onLoseFocus", data)~=nil)then self:generateXMLEventFunction(self.onLoseFocus, xmlValue("onLoseFocus", data)) end
if(xmlValue("onBackgroundKey", data)~=nil)then self:generateXMLEventFunction(self.onBackgroundKey, xmlValue("onBackgroundKey", data)) end self:updateDraw()
if(xmlValue("onBackgroundKeyUp", data)~=nil)then self:generateXMLEventFunction(self.onBackgroundKeyUp, xmlValue("onBackgroundKeyUp", data)) end
return self return self
end, end,
@@ -139,9 +142,19 @@ return function(name)
if (self.parent ~= nil) then if (self.parent ~= nil) then
self.parent:removeObject(self) self.parent:removeObject(self)
self.parent:addObject(self) self.parent:addObject(self)
self:updateEventHandlers()
end end
return self return self
end; end,
updateEventHandlers = function(self)
for k,v in pairs(activeEvents)do
if(v)then
self.parent:addEvent(k, self)
end
end
end,
getZIndex = function(self) getZIndex = function(self)
return zIndex; return zIndex;
@@ -159,6 +172,7 @@ return function(name)
if (self.parent ~= nil) then if (self.parent ~= nil) then
self.parent:removeObject(self) self.parent:removeObject(self)
end end
self:updateDraw()
return self return self
end; end;
@@ -176,7 +190,7 @@ return function(name)
setValue = function(self, _value) setValue = function(self, _value)
if (value ~= _value) then if (value ~= _value) then
value = _value value = _value
visualsChanged = true self:updateDraw()
self:valueChangedHandler() self:valueChangedHandler()
end end
return self return self
@@ -186,13 +200,14 @@ return function(name)
return value return value
end; end;
getVisualChanged = function(self) getDraw = function(self)
return visualsChanged return draw
end; end;
setVisualChanged = function(self, change) updateDraw = function(self, change)
visualsChanged = change or true draw = change
if(change == nil)then visualsChanged = true end if(change == nil)then draw = true end
if(draw)then if(self.parent~=nil)then self.parent:updateDraw() end end
return self return self
end; end;
@@ -206,10 +221,6 @@ return function(name)
return self.parent return self.parent
end; end;
getObjectReferencesForDynVal = function(self, str)
end,
setPosition = function(self, xPos, yPos, rel) setPosition = function(self, xPos, yPos, rel)
if(type(xPos)=="number")then if(type(xPos)=="number")then
self.x = rel and self:getX()+xPos or xPos self.x = rel and self:getX()+xPos or xPos
@@ -227,7 +238,7 @@ return function(name)
self.parent:recalculateDynamicValues() self.parent:recalculateDynamicValues()
end end
eventSystem:sendEvent("basalt_reposition", self) eventSystem:sendEvent("basalt_reposition", self)
visualsChanged = true self:updateDraw()
return self return self
end; end;
@@ -249,7 +260,7 @@ return function(name)
setVisibility = function(self, _isVisible) setVisibility = function(self, _isVisible)
isVisible = _isVisible or not isVisible isVisible = _isVisible or not isVisible
visualsChanged = true self:updateDraw()
return self return self
end; end;
@@ -270,7 +281,7 @@ return function(name)
self.parent:recalculateDynamicValues() self.parent:recalculateDynamicValues()
end end
eventSystem:sendEvent("basalt_resize", self) eventSystem:sendEvent("basalt_resize", self)
visualsChanged = true self:updateDraw()
return self return self
end; end;
@@ -291,12 +302,23 @@ return function(name)
if(type(self.height)=="table")then self.height:calculate() end if(type(self.height)=="table")then self.height:calculate() end
if(type(self.x)=="table")then self.x:calculate() end if(type(self.x)=="table")then self.x:calculate() end
if(type(self.y)=="table")then self.y:calculate() end if(type(self.y)=="table")then self.y:calculate() end
self:updateDraw()
return self return self
end, end,
setBackground = function(self, color) setBackground = function(self, color, symbol, symbolCol)
self.bgColor = color or false self.bgColor = color or false
visualsChanged = true self.bgSymbol = symbol or (self.bgColor~=false and self.bgSymbol or false)
self.bgSymbolColor = symbolCol or self.bgSymbolColor
self:updateDraw()
return self
end;
setTransparent = function(self, color)
self.transparentColor = color or false
self.bgSymbol = false
self.bgSymbolColor = false
self:updateDraw()
return self return self
end; end;
@@ -306,7 +328,7 @@ return function(name)
setForeground = function(self, color) setForeground = function(self, color)
self.fgColor = color or false self.fgColor = color or false
visualsChanged = true self:updateDraw()
return self return self
end; end;
@@ -314,13 +336,14 @@ return function(name)
return self.fgColor return self.fgColor
end; end;
showShadow = function(self, show)
shadow = show or (not shadow)
return self
end;
setShadow = function(self, color) setShadow = function(self, color)
if(color==false)then
shadow = false
else
shadowColor = color shadowColor = color
shadow = true
end
self:updateDraw()
return self return self
end; end;
@@ -328,26 +351,25 @@ return function(name)
return shadow; return shadow;
end; end;
showBorder = function(self, ...) setBorder = function(self, ...)
for _,v in pairs(table.pack(...))do if(...~=nil)then
if(v=="left")then local t = {...}
borderLeft = true for k,v in pairs(t)do
if(v=="left")or(#t==1)then
borderColors["left"] = t[1]
end end
if(v=="top")then if(v=="top")or(#t==1)then
borderTop = true borderColors["top"] = t[1]
end end
if(v=="right")then if(v=="right")or(#t==1)then
borderRight = true borderColors["right"] = t[1]
end end
if(v=="bottom")then if(v=="bottom")or(#t==1)then
borderBottom = true borderColors["bottom"] = t[1]
end end
end end
return self end
end; self:updateDraw()
setBorder = function(self, color)
borderColor = color
return self return self
end; end;
@@ -367,52 +389,68 @@ return function(name)
end; end;
draw = function(self) draw = function(self)
if (isVisible) then if (isVisible)then
if(self.parent~=nil)then if(self.parent~=nil)then
local x, y = self:getAnchorPosition() local x, y = self:getAnchorPosition()
local w,h = self:getSize() local w,h = self:getSize()
local wP,hP = self.parent:getSize()
if(x+w<1)or(x>wP)or(y+h<1)or(y>hP)then return false end
if(self.transparentColor~=false)then
self.parent:drawForegroundBox(x, y, w, h, self.transparentColor)
end
if(self.bgColor~=false)then
self.parent:drawBackgroundBox(x, y, w, h, self.bgColor)
end
if(self.bgSymbol~=false)then
self.parent:drawTextBox(x, y, w, h, self.bgSymbol)
if(self.bgSymbol~=" ")then
self.parent:drawForegroundBox(x, y, w, h, self.bgSymbolColor)
end
end
if(shadow)then if(shadow)then
self.parent:drawBackgroundBox(x+1, y+h, w, 1, shadowColor) self.parent:drawBackgroundBox(x+1, y+h, w, 1, shadowColor)
self.parent:drawBackgroundBox(x+w, y+1, 1, h, shadowColor) self.parent:drawBackgroundBox(x+w, y+1, 1, h, shadowColor)
self.parent:drawForegroundBox(x+1, y+h, w, 1, shadowColor) self.parent:drawForegroundBox(x+1, y+h, w, 1, shadowColor)
self.parent:drawForegroundBox(x+w, y+1, 1, h, shadowColor) self.parent:drawForegroundBox(x+w, y+1, 1, h, shadowColor)
end end
if(borderLeft)then if(borderColors["left"]~=false)then
self.parent:drawTextBox(x-1, y, 1, h, "\149") self.parent:drawTextBox(x-1, y, 1, h, "\149")
self.parent:drawForegroundBox(x-1, y, 1, h, borderColor) self.parent:drawBackgroundBox(x-1, y, 1, h, borderColors["left"])
if(self.bgColor~=false)then self.parent:drawBackgroundBox(x-1, y, 1, h, self.bgColor) end self.parent:drawForegroundBox(x-1, y, 1, h, self.parent.bgColor)
end end
if(borderLeft)and(borderTop)then if(borderColors["left"]~=false)and(borderColors["top"]~=false)then
self.parent:drawTextBox(x-1, y-1, 1, 1, "\151") self.parent:drawTextBox(x-1, y-1, 1, 1, "\151")
self.parent:drawForegroundBox(x-1, y-1, 1, 1, borderColor) self.parent:drawBackgroundBox(x-1, y-1, 1, 1, borderColors["left"])
if(self.bgColor~=false)then self.parent:drawBackgroundBox(x-1, y-1, 1, 1, self.bgColor) end self.parent:drawForegroundBox(x-1, y-1, 1, 1, self.parent.bgColor)
end end
if(borderTop)then if(borderColors["top"]~=false)then
self.parent:drawTextBox(x, y-1, w, 1, "\131") self.parent:drawTextBox(x, y-1, w, 1, "\131")
self.parent:drawForegroundBox(x, y-1, w, 1, borderColor) self.parent:drawBackgroundBox(x, y-1, w, 1, borderColors["top"])
if(self.bgColor~=false)then self.parent:drawBackgroundBox(x, y-1, w, 1, self.bgColor) end self.parent:drawForegroundBox(x, y-1, w, 1, self.parent.bgColor)
end end
if(borderTop)and(borderRight)then if(borderColors["top"]~=false)and(borderColors["right"]~=false)then
self.parent:drawTextBox(x+w, y-1, 1, 1, "\149") self.parent:drawTextBox(x+w, y-1, 1, 1, "\148")
self.parent:drawForegroundBox(x+w, y-1, 1, 1, borderColor) self.parent:drawForegroundBox(x+w, y-1, 1, 1, borderColors["right"])
end end
if(borderRight)then if(borderColors["right"]~=false)then
self.parent:drawTextBox(x+w, y, 1, h, "\149") self.parent:drawTextBox(x+w, y, 1, h, "\149")
self.parent:drawForegroundBox(x+w, y, 1, h, borderColor) self.parent:drawForegroundBox(x+w, y, 1, h, borderColors["right"])
end end
if(borderRight)and(borderBottom)then if(borderColors["right"]~=false)and(borderColors["bottom"]~=false)then
self.parent:drawTextBox(x+w, y+h, 1, 1, "\129") self.parent:drawTextBox(x+w, y+h, 1, 1, "\129")
self.parent:drawForegroundBox(x+w, y+h, 1, 1, borderColor) self.parent:drawForegroundBox(x+w, y+h, 1, 1, borderColors["right"])
end end
if(borderBottom)then if(borderColors["bottom"]~=false)then
self.parent:drawTextBox(x, y+h, w, 1, "\131") self.parent:drawTextBox(x, y+h, w, 1, "\131")
self.parent:drawForegroundBox(x, y+h, w, 1, borderColor) self.parent:drawForegroundBox(x, y+h, w, 1, borderColors["bottom"])
end end
if(borderBottom)and(borderLeft)then if(borderColors["bottom"]~=false)and(borderColors["left"]~=false)then
self.parent:drawTextBox(x-1, y+h, 1, 1, "\131") self.parent:drawTextBox(x-1, y+h, 1, 1, "\130")
self.parent:drawForegroundBox(x-1, y+h, 1, 1, borderColor) self.parent:drawForegroundBox(x-1, y+h, 1, 1, borderColors["left"])
end end
end end
draw = false
return true return true
end end
return false return false
@@ -487,7 +525,7 @@ return function(name)
setAnchor = function(self, newAnchor) setAnchor = function(self, newAnchor)
anchor = newAnchor anchor = newAnchor
visualsChanged = true self:updateDraw()
return self return self
end; end;
@@ -508,9 +546,12 @@ return function(name)
for _,v in pairs(table.pack(...))do for _,v in pairs(table.pack(...))do
if(type(v)=="function")then if(type(v)=="function")then
self:registerEvent("mouse_click", v) self:registerEvent("mouse_click", v)
self:registerEvent("monitor_touch", v)
end end
end end
if(self.parent~=nil)then
self.parent:addEvent("mouse_click", self)
activeEvents["mouse_click"] = true
end
return self return self
end; end;
@@ -520,6 +561,10 @@ return function(name)
self:registerEvent("mouse_up", v) self:registerEvent("mouse_up", v)
end end
end end
if(self.parent~=nil)then
self.parent:addEvent("mouse_up", self)
activeEvents["mouse_up"] = true
end
return self return self
end; end;
@@ -530,36 +575,56 @@ return function(name)
self:registerEvent("mouse_scroll", v) self:registerEvent("mouse_scroll", v)
end end
end end
if(self.parent~=nil)then
self.parent:addEvent("mouse_scroll", self)
activeEvents["mouse_scroll"] = true
end
return self return self
end; end;
onDrag = function(self, ...) onDrag = function(self, ...)
if(isEnabled)then
for _,v in pairs(table.pack(...))do for _,v in pairs(table.pack(...))do
if(type(v)=="function")then if(type(v)=="function")then
self:registerEvent("mouse_drag", v) self:registerEvent("mouse_drag", v)
end end
end end
end self.parent:addEvent("mouse_drag", self)
activeEvents["mouse_drag"] = true
self.parent:addEvent("mouse_click", self)
activeEvents["mouse_click"] = true
self.parent:addEvent("mouse_up", self)
activeEvents["mouse_up"] = true
return self return self
end; end;
onEvent = function(self, ...) onEvent = function(self, ...)
for _,v in pairs(table.pack(...))do for _,v in pairs(table.pack(...))do
if(type(v)=="function")then if(type(v)=="function")then
self:registerEvent("custom_event_handler", v) self:registerEvent("other_event", v)
end end
end end
if(self.parent~=nil)then
self.parent:addEvent("other_event", self)
activeEvents["other_event"] = true
end
return self return self
end; end;
onKey = function(self, ...) onKey = function(self, ...)
if(isEnabled)then
for _,v in pairs(table.pack(...))do for _,v in pairs(table.pack(...))do
if(type(v)=="function")then if(type(v)=="function")then
self:registerEvent("key", v) self:registerEvent("key", v)
self:registerEvent("char", v) self:registerEvent("char", v)
end end
end end
if(self.parent~=nil)then
self.parent:addEvent("key", self)
self.parent:addEvent("char", self)
activeEvents["key"] = true
activeEvents["char"] = true
end
end
return self return self
end; end;
@@ -587,24 +652,9 @@ return function(name)
self:registerEvent("key_up", v) self:registerEvent("key_up", v)
end end
end end
return self if(self.parent~=nil)then
end; self.parent:addEvent("key_up", self)
activeEvents["key_up"] = true
onBackgroundKey = function(self, ...)
for _,v in pairs(table.pack(...))do
if(type(v)=="function")then
self:registerEvent("background_key", v)
self:registerEvent("background_char", v)
end
end
return self
end;
onBackgroundKeyUp = function(self, ...)
for _,v in pairs(table.pack(...))do
if(type(v)=="function")then
self:registerEvent("background_key_up", v)
end
end end
return self return self
end; end;
@@ -622,6 +672,10 @@ return function(name)
self:registerEvent("get_focus", v) self:registerEvent("get_focus", v)
end end
end end
if(self.parent~=nil)then
self.parent:addEvent("mouse_click", self)
activeEvents["mouse_click"] = true
end
return self return self
end; end;
@@ -631,6 +685,10 @@ return function(name)
self:registerEvent("lose_focus", v) self:registerEvent("lose_focus", v)
end end
end end
if(self.parent~=nil)then
self.parent:addEvent("mouse_click", self)
activeEvents["mouse_click"] = true
end
return self return self
end; end;
@@ -646,21 +704,43 @@ return function(name)
return eventSystem:sendEvent(event, self, ...) return eventSystem:sendEvent(event, self, ...)
end; end;
mouseHandler = function(self, event, button, x, y) isCoordsInObject = function(self, x, y)
if(isEnabled)and(isVisible)then if(isVisible)and(isEnabled)then
local objX, objY = self:getAbsolutePosition(self:getAnchorPosition()) local objX, objY = self:getAbsolutePosition(self:getAnchorPosition())
local w, h = self:getSize() local w, h = self:getSize()
local yOff = false if (objX <= x) and (objX + w > x) and (objY <= y) and (objY + h > y) then
return true
if(objY-1 == y)and(self:getBorder("top"))then
y = y+1
yOff = true
end end
if(event=="mouse_up")then end
return false
end,
mouseHandler = function(self, button, x, y, isMon)
if(self:isCoordsInObject(x, y))then
local val = eventSystem:sendEvent("mouse_click", self, "mouse_click", button, x, y, isMon)
if(val==false)then return false end
if(self.parent~=nil)then
self.parent:setFocusedObject(self)
end
isDragging = true
dragStartX, dragStartY = x, y
return true
end
return false
end,
mouseUpHandler = function(self, button, x, y)
isDragging = false isDragging = false
if(self:isCoordsInObject(x, y))then
local val = eventSystem:sendEvent("mouse_up", self, "mouse_up", button, x, y)
if(val==false)then return false end
return true
end end
return false
end,
if(isDragging)and(event=="mouse_drag")then dragHandler = function(self, button, x, y)
if(isDragging)then
local xO, yO, parentX, parentY = 0, 0, 1, 1 local xO, yO, parentX, parentY = 0, 0, 1, 1
if (self.parent ~= nil) then if (self.parent ~= nil) then
xO, yO = self.parent:getOffsetInternal() xO, yO = self.parent:getOffsetInternal()
@@ -669,56 +749,77 @@ return function(name)
parentX, parentY = self.parent:getAbsolutePosition(self.parent:getAnchorPosition()) parentX, parentY = self.parent:getAbsolutePosition(self.parent:getAnchorPosition())
end end
local dX, dY = x + dragXOffset - (parentX - 1) + xO, y + dragYOffset - (parentY - 1) + yO local dX, dY = x + dragXOffset - (parentX - 1) + xO, y + dragYOffset - (parentY - 1) + yO
local val = eventSystem:sendEvent(event, self, event, button, dX, dY, dragStartX, dragStartY, x, y) local val = eventSystem:sendEvent("mouse_drag", self, button, dX, dY, dragStartX-x, dragStartY-y, x, y)
local objX, objY = self:getAbsolutePosition(self:getAnchorPosition())
dragStartX, dragStartY = x, y
if(val~=nil)then return val end
if(self.parent~=nil)then
self.parent:setFocusedObject(self)
end
return true
end end
if(self:isCoordsInObject(x, y))then
if (objX <= x) and (objX + w > x) and (objY <= y) and (objY + h > y) then local objX, objY = self:getAbsolutePosition(self:getAnchorPosition())
if(event=="mouse_click")then
isDragging = true
dragStartX, dragStartY = x, y dragStartX, dragStartY = x, y
dragXOffset, dragYOffset = objX - x, objY - y dragXOffset, dragYOffset = objX - x, objY - y
end end
if(event~="mouse_drag")then return false
if(event~="mouse_up")then end,
if (self.parent ~= nil) then
scrollHandler = function(self, dir, x, y)
if(self:isCoordsInObject(x, y))then
local val = eventSystem:sendEvent("mouse_scroll", self, "mouse_scroll", dir, x, y)
if(val==false)then return false end
if(self.parent~=nil)then
self.parent:setFocusedObject(self) self.parent:setFocusedObject(self)
end end
end
local val = eventSystem:sendEvent(event, self, event, button, x, y)
if(val~=nil)then return val end
end
return true return true
end end
end
return false return false
end; end,
keyHandler = function(self, event, key) keyHandler = function(self, key, isHolding)
if(isEnabled)then if(isEnabled)and(isVisible)then
if (self:isFocused()) then if (self:isFocused()) then
local val = eventSystem:sendEvent(event, self, event, key) local val = eventSystem:sendEvent("key", self, "key", key, isHolding)
if(val~=nil)then return val end if(val==false)then return false end
return true return true
end end
end end
return false return false
end; end;
backgroundKeyHandler = function(self, event, key) keyUpHandler = function(self, key)
if(isEnabled)then if(isEnabled)and(isVisible)then
local val = eventSystem:sendEvent("background_"..event, self, event, key) if (self:isFocused()) then
if(val~=nil)then return val end local val = eventSystem:sendEvent("key_up", self, "key_up", key)
end if(val==false)then return false end
return true return true
end
end
return false
end; end;
charHandler = function(self, char)
if(isEnabled)and(isVisible)then
if (self:isFocused()) then
local val = eventSystem:sendEvent("char", self, "char", char)
if(val==false)then return false end
return true
end
end
return false
end,
valueChangedHandler = function(self) valueChangedHandler = function(self)
eventSystem:sendEvent("value_changed", self) eventSystem:sendEvent("value_changed", self, value)
end; end;
eventHandler = function(self, event, p1, p2, p3, p4) eventHandler = function(self, event, p1, p2, p3, p4)
eventSystem:sendEvent("custom_event_handler", self, event, p1, p2, p3, p4) local val = eventSystem:sendEvent("other_event", self, event, p1, p2, p3, p4)
if(val~=nil)then return val end
return true
end; end;
getFocusHandler = function(self) getFocusHandler = function(self)
@@ -728,11 +829,25 @@ return function(name)
end; end;
loseFocusHandler = function(self) loseFocusHandler = function(self)
isDragging = false
local val = eventSystem:sendEvent("lose_focus", self) local val = eventSystem:sendEvent("lose_focus", self)
if(val~=nil)then return val end if(val~=nil)then return val end
return true return true
end; end;
init = function(self)
if(self.parent~=nil)then
for k,v in pairs(activeEvents)do
if(v)then
self.parent:addEvent(k, self)
end
end
end
if not(initialized)then
initialized = true
return true
end
end
} }

View File

@@ -28,6 +28,7 @@ return function(drawTerm)
createEmptyLines() createEmptyLines()
local function recreateWindowArray() local function recreateWindowArray()
createEmptyLines()
local emptyText = emptySpaceLine local emptyText = emptySpaceLine
local emptyFG = emptyColorLines[colors.white] local emptyFG = emptyColorLines[colors.white]
local emptyBG = emptyColorLines[colors.black] local emptyBG = emptyColorLines[colors.black]
@@ -126,6 +127,11 @@ return function(drawTerm)
end end
local drawHelper = { local drawHelper = {
setSize = function(w, h)
width, height = w, h
recreateWindowArray()
end,
setMirror = function(mirror) setMirror = function(mirror)
mirrorTerm = mirror mirrorTerm = mirror
end, end,
@@ -157,11 +163,15 @@ return function(drawTerm)
end end
end; end;
writeText = function(x, y, text, bgCol, fgCol) writeText = function(x, y, text, bgCol, fgCol)
bgCol = bgCol or terminal.getBackgroundColor() if(text~=nil)then
fgCol = fgCol or terminal.getTextColor()
setText(x, y, text) setText(x, y, text)
if(bgCol~=nil)and(bgCol~=false)then
setBG(x, y, rep(tHex[bgCol], text:len())) setBG(x, y, rep(tHex[bgCol], text:len()))
end
if(fgCol~=nil)and(fgCol~=false)then
setFG(x, y, rep(tHex[fgCol], text:len())) setFG(x, y, rep(tHex[fgCol], text:len()))
end
end
end; end;
update = function() update = function()

View File

@@ -0,0 +1,20 @@
local logDir = ""
local logFileName = "basaltLog.txt"
local defaultLogType = "Debug"
fs.delete(logDir~="" and logDir.."/"..logFileName or logFileName)
local mt = {
__call = function(_,text, typ)
if(text==nil)then return end
local dirStr = logDir~="" and logDir.."/"..logFileName or logFileName
local handle = fs.open(dirStr, fs.exists(dirStr) and "a" or "w")
handle.writeLine("[Basalt]["..(typ and typ or defaultLogType).."]: "..tostring(text))
handle.close()
end,
}
return setmetatable({}, mt)
--Work in progress

View File

@@ -3,12 +3,12 @@ local process = {}
local processId = 0 local processId = 0
function process:new(path, window, ...) function process:new(path, window, ...)
local args = table.pack(...) local args = {...}
local newP = setmetatable({ path = path }, { __index = self }) local newP = setmetatable({ path = path }, { __index = self })
newP.window = window newP.window = window
newP.processId = processId newP.processId = processId
newP.coroutine = coroutine.create(function() newP.coroutine = coroutine.create(function()
os.run({ }, path, table.unpack(args)) shell.execute(path, table.unpack(args))
end) end)
processes[processId] = newP processes[processId] = newP
processId = processId + 1 processId = processId + 1
@@ -17,12 +17,16 @@ end
function process:resume(event, ...) function process:resume(event, ...)
term.redirect(self.window) term.redirect(self.window)
if(self.filter~=nil)then
if(event~=self.filter)then return end
self.filter=nil
end
local ok, result = coroutine.resume(self.coroutine, event, ...) local ok, result = coroutine.resume(self.coroutine, event, ...)
self.window = term.current() self.window = term.current()
if ok then if ok then
self.filter = result self.filter = result
else else
basalt.debug(result) error(result)
end end
end end

View File

@@ -48,6 +48,16 @@ rpairs = function(t)
end, t, #t + 1 end, t, #t + 1
end, end,
tableCount = function(t)
local n = 0
if(t~=nil)then
for k,v in pairs(t)do
n = n + 1
end
end
return n
end,
splitString = splitString, splitString = splitString,
createText = function(str, width) createText = function(str, width)

View File

@@ -5,8 +5,9 @@ local utils = require("utils")
local uuid = utils.uuid local uuid = utils.uuid
local createText = utils.createText local createText = utils.createText
local baseTerm = term.current() local baseTerm = term.current()
local version = "1.5.0" local version = "1.6.0"
local debugger = true local debugger = true
local projectDirectory = fs.getDir(table.pack(...)[2] or "") local projectDirectory = fs.getDir(table.pack(...)[2] or "")
@@ -14,12 +15,16 @@ local projectDirectory = fs.getDir(table.pack(...)[2] or "")
local activeKey, frames, monFrames, variables, schedules = {}, {}, {}, {}, {} local activeKey, frames, monFrames, variables, schedules = {}, {}, {}, {}, {}
local mainFrame, activeFrame, focusedObject, updaterActive local mainFrame, activeFrame, focusedObject, updaterActive
local basalt = {}
if not term.isColor or not term.isColor() then if not term.isColor or not term.isColor() then
error('Basalt requires an advanced (golden) computer to run.', 0) error('Basalt requires an advanced (golden) computer to run.', 0)
end end
local function stop() local function stop()
updaterActive = false updaterActive = false
baseTerm.clear()
baseTerm.setCursorPos(1, 1)
end end
local setVariable = function(name, var) local setVariable = function(name, var)
@@ -72,6 +77,7 @@ local bInstance = {
end, end,
setMonitorFrame = function(name, frame) setMonitorFrame = function(name, frame)
if(mainFrame == frame)then mainFrame = nil end
monFrames[name] = frame monFrames[name] = frame
end, end,
@@ -92,34 +98,19 @@ local basaltError = function(errMsg)
baseTerm.setBackgroundColor(colors.black) baseTerm.setBackgroundColor(colors.black)
baseTerm.setTextColor(colors.red) baseTerm.setTextColor(colors.red)
local w,h = baseTerm.getSize() local w,h = baseTerm.getSize()
if(basalt.logging)then
log(errMsg, "Error")
end
local splitString = function(str, sep) local text = createText("Basalt error: "..errMsg, w)
if sep == nil then
sep = "%s"
end
local t={}
for v in string.gmatch(str, "([^"..sep.."]+)") do
table.insert(t, v)
end
return t
end
local words = splitString(errMsg, " ")
local line = "Basalt error: "
local yPos = 1 local yPos = 1
for n=1,#words do for k,v in pairs(text)do
baseTerm.setCursorPos(1,yPos) baseTerm.setCursorPos(1,yPos)
if(#line+#words[n]<w)then baseTerm.write(v)
line = line.." "..words[n]
else
baseTerm.write(line)
line = words[n]
yPos = yPos + 1 yPos = yPos + 1
end end
if(n==#words)then
baseTerm.write(line)
end
end
baseTerm.setCursorPos(1,yPos+1) baseTerm.setCursorPos(1,yPos+1)
updaterActive = false
end end
local function handleSchedules(event, p1, p2, p3, p4) local function handleSchedules(event, p1, p2, p3, p4)
@@ -144,15 +135,14 @@ local function handleSchedules(event, p1, p2, p3, p4)
end end
local function drawFrames() local function drawFrames()
if(updaterActive)then if(updaterActive==false)then return end
if(mainFrame~=nil)then if(mainFrame~=nil)then
mainFrame:draw() mainFrame:draw()
mainFrame:drawUpdate() mainFrame:updateTerm()
end end
for _,v in pairs(monFrames)do for _,v in pairs(monFrames)do
v:draw() v:draw()
v:drawUpdate() v:updateTerm()
end
end end
end end
@@ -160,51 +150,63 @@ local function basaltUpdateEvent(event, p1, p2, p3, p4)
if(basaltEvent:sendEvent("basaltEventCycle", event, p1, p2, p3, p4)==false)then return end if(basaltEvent:sendEvent("basaltEventCycle", event, p1, p2, p3, p4)==false)then return end
if(mainFrame~=nil)then if(mainFrame~=nil)then
if (event == "mouse_click") then if (event == "mouse_click") then
mainFrame:mouseHandler(event, p1, p2, p3, p4) mainFrame:mouseHandler(p1, p2, p3, false)
activeFrame = mainFrame activeFrame = mainFrame
elseif (event == "mouse_drag") then elseif (event == "mouse_drag") then
mainFrame:mouseHandler(event, p1, p2, p3, p4) mainFrame:dragHandler(p1, p2, p3, p4)
activeFrame = mainFrame activeFrame = mainFrame
elseif (event == "mouse_up") then elseif (event == "mouse_up") then
mainFrame:mouseHandler(event, p1, p2, p3, p4) mainFrame:mouseUpHandler(p1, p2, p3, p4)
activeFrame = mainFrame activeFrame = mainFrame
elseif (event == "mouse_scroll") then elseif (event == "mouse_scroll") then
mainFrame:mouseHandler(event, p1, p2, p3, p4) mainFrame:scrollHandler(p1, p2, p3, p4)
activeFrame = mainFrame activeFrame = mainFrame
elseif (event == "monitor_touch") then end
end
if(event == "monitor_touch") then
if(monFrames[p1]~=nil)then if(monFrames[p1]~=nil)then
monFrames[p1]:mouseHandler(event, p1, p2, p3, p4) monFrames[p1]:mouseHandler(1, p2, p3, true)
activeFrame = monFrames[p1] activeFrame = monFrames[p1]
end end
end end
end
if(event == "key") or (event == "char") then if(event == "char")then
if(activeFrame~=nil)then if(activeFrame~=nil)then
activeFrame:keyHandler(event, p1) activeFrame:charHandler(p1)
activeFrame:backgroundKeyHandler(event, p1)
end end
end end
if(event == "key")then
activeKey[p1] = true
end
if(event == "key_up")then if(event == "key_up")then
if(activeFrame~=nil)then
activeFrame:keyUpHandler(p1)
end
activeKey[p1] = false activeKey[p1] = false
end end
if(event == "key")then
for _, v in pairs(frames) do if(activeFrame~=nil)then
activeFrame:keyHandler(p1, p2)
end
activeKey[p1] = true
end
if(event == "terminate")then
if(activeFrame~=nil)then
activeFrame:eventHandler(event)
if(updaterActive==false)then return end
end
end
if(event~="mouse_click")and(event~="mouse_up")and(event~="mouse_scroll")and(event~="mouse_drag")and(event~="key")and(event~="key_up")and(event~="char")and(event~="terminate")then
for k, v in pairs(frames) do
v:eventHandler(event, p1, p2, p3, p4) v:eventHandler(event, p1, p2, p3, p4)
end end
end
handleSchedules(event, p1, p2, p3, p4) handleSchedules(event, p1, p2, p3, p4)
drawFrames() drawFrames()
end end
local basalt = {}
basalt = { basalt = {
logging = false,
setTheme = setTheme, setTheme = setTheme,
getTheme = getTheme, getTheme = getTheme,
drawFrames = drawFrames,
getVersion = function() getVersion = function()
return version return version
end, end,
@@ -216,14 +218,29 @@ basalt = {
baseTerm = _baseTerm baseTerm = _baseTerm
end, end,
log = function(...)
log(...)
end,
autoUpdate = function(isActive) autoUpdate = function(isActive)
local pCall = pcall
updaterActive = isActive updaterActive = isActive
if(isActive==nil)then updaterActive = true end if(isActive==nil)then updaterActive = true end
local function f()
drawFrames() drawFrames()
while updaterActive do while updaterActive do
local event, p1, p2, p3, p4 = os.pullEventRaw() basaltUpdateEvent(os.pullEventRaw())
local ok, err = pCall(basaltUpdateEvent, event, p1, p2, p3, p4) end
end
local ok, err = xpcall(f, debug.traceback)
if not(ok)then
basaltError(err)
return
end
end,
update = function(event, p1, p2, p3, p4)
if (event ~= nil) then
local ok, err = xpcall(basaltUpdateEvent, debug.traceback, event, p1, p2, p3, p4)
if not(ok)then if not(ok)then
basaltError(err) basaltError(err)
return return
@@ -231,13 +248,8 @@ basalt = {
end end
end, end,
update = function(event, p1, p2, p3, p4)
if (event ~= nil) then
basaltUpdateEvent(event, p1, p2, p3, p4)
end
end,
stop = stop, stop = stop,
stopUpdate = stop,
isKeyDown = function(key) isKeyDown = function(key)
if(activeKey[key]==nil)then return false end if(activeKey[key]==nil)then return false end
@@ -293,6 +305,7 @@ basalt = {
end end
end end
local newFrame = Frame(name,nil,nil,bInstance) local newFrame = Frame(name,nil,nil,bInstance)
newFrame:init()
table.insert(frames, newFrame) table.insert(frames, newFrame)
if(mainFrame==nil)and(newFrame:getName()~="basaltDebuggingFrame")then if(mainFrame==nil)and(newFrame:getName()~="basaltDebuggingFrame")then
newFrame:show() newFrame:show()
@@ -310,6 +323,7 @@ basalt = {
debug = function(...) debug = function(...)
local args = { ... } local args = { ... }
if(mainFrame==nil)then print(...) return end
if (mainFrame.name ~= "basaltDebuggingFrame") then if (mainFrame.name ~= "basaltDebuggingFrame") then
if (mainFrame ~= basalt.debugFrame) then if (mainFrame ~= basalt.debugFrame) then
basalt.debugLabel:setParent(mainFrame) basalt.debugLabel:setParent(mainFrame)
@@ -336,7 +350,7 @@ basalt = {
basalt.debugFrame = basalt.createFrame("basaltDebuggingFrame"):showBar():setBackground(colors.lightGray):setBar("Debug", colors.black, colors.gray) basalt.debugFrame = basalt.createFrame("basaltDebuggingFrame"):showBar():setBackground(colors.lightGray):setBar("Debug", colors.black, colors.gray)
basalt.debugFrame:addButton("back"):setAnchor("topRight"):setSize(1, 1):setText("\22"):onClick(function() if(basalt.oldFrame~=nil)then basalt.oldFrame:show() end end):setBackground(colors.red):show() basalt.debugFrame:addButton("back"):setAnchor("topRight"):setSize(1, 1):setText("\22"):onClick(function() if(basalt.oldFrame~=nil)then basalt.oldFrame:show() end end):setBackground(colors.red):show()
basalt.debugList = basalt.debugFrame:addList("debugList"):setSize(basalt.debugFrame.width - 2, basalt.debugFrame.height - 3):setPosition(2, 3):setScrollable(true):show() basalt.debugList = basalt.debugFrame:addList("debugList"):setSize("parent.w - 2", "parent.h - 3"):setPosition(2, 3):setScrollable(true):show()
basalt.debugLabel = basalt.debugFrame:addLabel("debugLabel"):onClick(function() basalt.oldFrame = mainFrame basalt.debugFrame:show() end):setBackground(colors.black):setForeground(colors.white):setAnchor("bottomLeft"):ignoreOffset():setZIndex(20):show() basalt.debugLabel = basalt.debugFrame:addLabel("debugLabel"):onClick(function() basalt.oldFrame = mainFrame basalt.debugFrame:show() end):setBackground(colors.black):setForeground(colors.white):setAnchor("bottomLeft"):ignoreOffset():setZIndex(20):show()
return basalt return basalt

View File

@@ -1,8 +1,7 @@
local xmlValue = require("utils").getValueFromXML local xmlValue = require("utils").getValueFromXML
local basaltEvent = require("basaltEvent") local basaltEvent = require("basaltEvent")
local floor = math.floor local floor,sin,cos,pi = math.floor,math.sin,math.cos,math.pi
local lerp = function(s, e, pct) local lerp = function(s, e, pct)
return s + (e - s) * pct return s + (e - s) * pct
@@ -12,8 +11,8 @@ local linear = function (t)
return t return t
end end
local flip = function (x) local flip = function (t)
return 1 - x return 1 - t
end end
local easeIn = function (t) local easeIn = function (t)
@@ -28,6 +27,18 @@ local easeInOut = function(t)
return lerp(easeIn(t), easeOut(t), t) return lerp(easeIn(t), easeOut(t), t)
end end
local easeOutSine = function(t)
return sin((t * pi) / 2);
end
local easeInSine = function(t)
return flip(cos((t * pi) / 2))
end
local easeInOutSine = function(t)
return -(cos(pi * x) - 1) / 2
end
local lerp = { local lerp = {
linear = linear, linear = linear,
lerp = lerp, lerp = lerp,
@@ -35,8 +46,13 @@ local lerp = {
easeIn=easeIn, easeIn=easeIn,
easeOut=easeOut, easeOut=easeOut,
easeInOut=easeInOut, easeInOut=easeInOut,
easeOutSine = easeOutSine,
easeInSine = easeInSine,
easeInOutSine = easeInOutSine,
} }
local activeAnimations = {}
return function(name) return function(name)
local object = {} local object = {}
local objectType = "Animation" local objectType = "Animation"
@@ -117,16 +133,33 @@ return function(name)
end end
local function predefinedLerp(v1,v2,d,t,get,set) local function predefinedLerp(v1,v2,d,t,get,set,typ,self)
local x,y local x,y
local name = ""
if(_OBJ.parent~=nil)then name = _OBJ.parent:getName() end
name = name.._OBJ:getName()
addAnimationPart(t+0.05, function() addAnimationPart(t+0.05, function()
if(typ~=nil)then
if(activeAnimations[typ]==nil)then activeAnimations[typ] = {} end
if(activeAnimations[typ][name]~=nil)then
activeAnimations[typ][name]:cancel()
end
activeAnimations[typ][name] = self
end
x,y = get(_OBJ) x,y = get(_OBJ)
end) end)
for n=0.05,d,0.05 do for n=0.05,d+0.01,0.05 do
addAnimationPart(t+n, function() addAnimationPart(t+n, function()
local _x = math.floor(lerp.lerp(x, v1, lerp[mode](n / d))+0.5) local _x = math.floor(lerp.lerp(x, v1, lerp[mode](n / d))+0.5)
local _y = math.floor(lerp.lerp(y, v2, lerp[mode](n / d))+0.5) local _y = math.floor(lerp.lerp(y, v2, lerp[mode](n / d))+0.5)
set(_OBJ, _x,_y) set(_OBJ, _x,_y)
if(typ~=nil)then
if(n>=d-0.01)then
if(activeAnimations[typ][name]==self)then
activeAnimations[typ][name] = nil
end
end
end
end) end)
end end
end; end;
@@ -274,19 +307,19 @@ return function(name)
move = function(self, x, y, duration, timer, obj) move = function(self, x, y, duration, timer, obj)
_OBJ = obj or _OBJ _OBJ = obj or _OBJ
predefinedLerp(x,y,duration,timer or 0,_OBJ.getPosition,_OBJ.setPosition) predefinedLerp(x,y,duration,timer or 0,_OBJ.getPosition,_OBJ.setPosition, "position", self)
return self return self
end, end,
offset = function(self, x, y, duration, timer, obj) offset = function(self, x, y, duration, timer, obj)
_OBJ = obj or _OBJ _OBJ = obj or _OBJ
predefinedLerp(x,y,duration,timer or 0,_OBJ.getOffset,_OBJ.setOffset) predefinedLerp(x,y,duration,timer or 0,_OBJ.getOffset,_OBJ.setOffset, "offset", self)
return self return self
end, end,
size = function(self, w, h, duration, timer, obj) size = function(self, w, h, duration, timer, obj)
_OBJ = obj or _OBJ _OBJ = obj or _OBJ
predefinedLerp(w,h,duration,timer or 0,_OBJ.getSize,_OBJ.setSize) predefinedLerp(w,h,duration,timer or 0,_OBJ.getSize,_OBJ.setSize, "size", self)
return self return self
end, end,
@@ -363,6 +396,7 @@ return function(name)
animationDoneHandler = function(self) animationDoneHandler = function(self)
eventSystem:sendEvent("animation_done", self) eventSystem:sendEvent("animation_done", self)
self.parent:removeEvent("other_event", self)
if(autoDestroy)then if(autoDestroy)then
self.parent:removeObject(self) self.parent:removeObject(self)
self = nil self = nil
@@ -398,6 +432,7 @@ return function(name)
else else
self:animationDoneHandler() self:animationDoneHandler()
end end
self.parent:addEvent("other_event", self)
return self return self
end; end;
@@ -407,6 +442,7 @@ return function(name)
infinitePlay = false infinitePlay = false
end end
animationActive = false animationActive = false
self.parent:removeEvent("other_event", self)
return self return self
end; end;

View File

@@ -1,6 +1,7 @@
local Object = require("Object") local Object = require("Object")
local utils = require("utils") local utils = require("utils")
local xmlValue = utils.getValueFromXML local xmlValue = utils.getValueFromXML
local tHex = require("tHex")
return function(name) return function(name)
-- Button -- Button
@@ -24,14 +25,19 @@ return function(name)
end; end;
setHorizontalAlign = function(self, pos) setHorizontalAlign = function(self, pos)
textHorizontalAlign = pos textHorizontalAlign = pos
self:updateDraw()
return self
end; end;
setVerticalAlign = function(self, pos) setVerticalAlign = function(self, pos)
textVerticalAlign = pos textVerticalAlign = pos
self:updateDraw()
return self
end; end;
setText = function(self, text) setText = function(self, text)
base:setValue(text) base:setValue(text)
self:updateDraw()
return self return self
end; end;
@@ -50,20 +56,15 @@ return function(name)
local w,h = self:getSize() local w,h = self:getSize()
local verticalAlign = utils.getTextVerticalAlign(h, textVerticalAlign) local verticalAlign = utils.getTextVerticalAlign(h, textVerticalAlign)
if(self.bgColor~=false)then
self.parent:drawBackgroundBox(obx, oby, w, h, self.bgColor)
self.parent:drawTextBox(obx, oby, w, h, " ")
end
if(self.fgColor~=false)then self.parent:drawForegroundBox(obx, oby, w, h, self.fgColor) end
for n = 1, h do for n = 1, h do
if (n == verticalAlign) then if (n == verticalAlign) then
self.parent:setText(obx, oby + (n - 1), utils.getTextHorizontalAlign(self:getValue(), w, textHorizontalAlign)) self.parent:setText(obx, oby + (n - 1), utils.getTextHorizontalAlign(self:getValue(), w, textHorizontalAlign))
self.parent:setFG(obx, oby + (n - 1), utils.getTextHorizontalAlign(tHex[self.fgColor]:rep(self:getValue():len()), w, textHorizontalAlign))
end end
end end
end end
self:setVisualChanged(false)
end end
end; end,
} }
return setmetatable(object, base) return setmetatable(object, base)

View File

@@ -12,31 +12,38 @@ return function(name)
base.width = 1 base.width = 1
base.height = 1 base.height = 1
local object = { local symbol = "\42"
symbol = "\42",
init = function(self) local object = {
self.bgColor = self.parent:getTheme("CheckboxBG")
self.fgColor = self.parent:getTheme("CheckboxText")
end,
getType = function(self) getType = function(self)
return objectType return objectType
end; end;
mouseHandler = function(self, event, button, x, y) setSymbol = function(self, sym)
if (base.mouseHandler(self, event, button, x, y)) then symbol = sym
if ((event == "mouse_click") and (button == 1)) or (event == "monitor_touch") then self:updateDraw()
return self
end,
mouseHandler = function(self, button, x, y)
if (base.mouseHandler(self, button, x, y)) then
if(button == 1)then
if (self:getValue() ~= true) and (self:getValue() ~= false) then if (self:getValue() ~= true) and (self:getValue() ~= false) then
self:setValue(false) self:setValue(false)
else else
self:setValue(not self:getValue()) self:setValue(not self:getValue())
end end
end self:updateDraw()
return true return true
end end
end
return false return false
end; end,
touchHandler = function(self, x, y)
return self:mouseHandler(1, x, y)
end,
setValuesByXMLData = function(self, data) setValuesByXMLData = function(self, data)
base.setValuesByXMLData(self, data) base.setValuesByXMLData(self, data)
@@ -54,17 +61,22 @@ return function(name)
for n = 1, h do for n = 1, h do
if (n == verticalAlign) then if (n == verticalAlign) then
if (self:getValue() == true) then if (self:getValue() == true) then
self.parent:writeText(obx, oby + (n - 1), utils.getTextHorizontalAlign(self.symbol, w, "center"), self.bgColor, self.fgColor) self.parent:writeText(obx, oby + (n - 1), utils.getTextHorizontalAlign(symbol, w, "center"), self.bgColor, self.fgColor)
else else
self.parent:writeText(obx, oby + (n - 1), utils.getTextHorizontalAlign(" ", w, "center"), self.bgColor, self.fgColor) self.parent:writeText(obx, oby + (n - 1), utils.getTextHorizontalAlign(" ", w, "center"), self.bgColor, self.fgColor)
end end
end end
end end
end end
self:setVisualChanged(false)
end end
end; end,
init = function(self)
base.init(self)
self.bgColor = self.parent:getTheme("CheckboxBG")
self.fgColor = self.parent:getTheme("CheckboxText")
self.parent:addEvent("mouse_click", self)
end,
} }
return setmetatable(object, base) return setmetatable(object, base)

View File

@@ -26,12 +26,6 @@ return function(name)
getType = function(self) getType = function(self)
return objectType return objectType
end; end;
init = function(self)
self.bgColor = self.parent:getTheme("DropdownBG")
self.fgColor = self.parent:getTheme("DropdownText")
itemSelectedBG = self.parent:getTheme("SelectionBG")
itemSelectedFG = self.parent:getTheme("SelectionText")
end,
setValuesByXMLData = function(self, data) setValuesByXMLData = function(self, data)
base.setValuesByXMLData(self, data) base.setValuesByXMLData(self, data)
@@ -51,6 +45,7 @@ return function(name)
setOffset = function(self, yOff) setOffset = function(self, yOff)
yOffset = yOff yOffset = yOff
self:updateDraw()
return self return self
end; end;
@@ -60,6 +55,7 @@ return function(name)
addItem = function(self, text, bgCol, fgCol, ...) addItem = function(self, text, bgCol, fgCol, ...)
table.insert(list, { text = text, bgCol = bgCol or self.bgColor, fgCol = fgCol or self.fgColor, args = { ... } }) table.insert(list, { text = text, bgCol = bgCol or self.bgColor, fgCol = fgCol or self.fgColor, args = { ... } })
self:updateDraw()
return self return self
end; end;
@@ -69,6 +65,7 @@ return function(name)
removeItem = function(self, index) removeItem = function(self, index)
table.remove(list, index) table.remove(list, index)
self:updateDraw()
return self return self
end; end;
@@ -88,6 +85,7 @@ return function(name)
clear = function(self) clear = function(self)
list = {} list = {}
self:setValue({}) self:setValue({})
self:updateDraw()
return self return self
end; end;
@@ -98,11 +96,13 @@ return function(name)
editItem = function(self, index, text, bgCol, fgCol, ...) editItem = function(self, index, text, bgCol, fgCol, ...)
table.remove(list, index) table.remove(list, index)
table.insert(list, index, { text = text, bgCol = bgCol or self.bgColor, fgCol = fgCol or self.fgColor, args = { ... } }) table.insert(list, index, { text = text, bgCol = bgCol or self.bgColor, fgCol = fgCol or self.fgColor, args = { ... } })
self:updateDraw()
return self return self
end; end;
selectItem = function(self, index) selectItem = function(self, index)
self:setValue(list[index] or {}) self:setValue(list[index] or {})
self:updateDraw()
return self return self
end; end;
@@ -110,37 +110,76 @@ return function(name)
itemSelectedBG = bgCol or self.bgColor itemSelectedBG = bgCol or self.bgColor
itemSelectedFG = fgCol or self.fgColor itemSelectedFG = fgCol or self.fgColor
selectionColorActive = active selectionColorActive = active
self:updateDraw()
return self return self
end; end;
setDropdownSize = function(self, width, height) setDropdownSize = function(self, width, height)
dropdownW, dropdownH = width, height dropdownW, dropdownH = width, height
self:updateDraw()
return self return self
end; end,
mouseHandler = function(self, event, button, x, y) mouseHandler = function(self, button, x, y)
if (isOpened) then if (isOpened) then
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition()) local obx, oby = self:getAbsolutePosition(self:getAnchorPosition())
if ((event == "mouse_click") and (button == 1)) or (event == "monitor_touch") then if(button==1)then
if (#list > 0) then if (#list > 0) then
for n = 1, dropdownH do for n = 1, dropdownH do
if (list[n + yOffset] ~= nil) then if (list[n + yOffset] ~= nil) then
if (obx <= x) and (obx + dropdownW > x) and (oby + n == y) then if (obx <= x) and (obx + dropdownW > x) and (oby + n == y) then
self:setValue(list[n + yOffset]) self:setValue(list[n + yOffset])
self:updateDraw()
local val = self:getEventSystem():sendEvent("mouse_click", self, "mouse_click", dir, x, y)
if(val==false)then return val end
return true return true
end end
end end
end end
end end
end end
end
if (base.mouseHandler(self, button, x, y)) then
isOpened = (not isOpened)
self:updateDraw()
return true
else
if(isOpened)then
self:updateDraw()
isOpened = false
end
return false
end
end,
if (event == "mouse_scroll") then mouseUpHandler = function(self, button, x, y)
yOffset = yOffset + button if (isOpened) then
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition())
if(button==1)then
if (#list > 0) then
for n = 1, dropdownH do
if (list[n + yOffset] ~= nil) then
if (obx <= x) and (obx + dropdownW > x) and (oby + n == y) then
isOpened = false
self:updateDraw()
local val = self:getEventSystem():sendEvent("mouse_up", self, "mouse_up", dir, x, y)
if(val==false)then return val end
return true
end
end
end
end
end
end
end,
scrollHandler = function(self, dir, x, y)
if (isOpened)and(self:isFocused()) then
yOffset = yOffset + dir
if (yOffset < 0) then if (yOffset < 0) then
yOffset = 0 yOffset = 0
end end
if (button == 1) then if (dir == 1) then
if (#list > dropdownH) then if (#list > dropdownH) then
if (yOffset > #list - dropdownH) then if (yOffset > #list - dropdownH) then
yOffset = #list - dropdownH yOffset = #list - dropdownH
@@ -149,16 +188,12 @@ return function(name)
yOffset = math.min(#list - 1, 0) yOffset = math.min(#list - 1, 0)
end end
end end
local val = self:getEventSystem():sendEvent("mouse_scroll", self, "mouse_scroll", dir, x, y)
if(val==false)then return val end
self:updateDraw()
return true return true
end end
self:setVisualChanged() end,
end
if (base.mouseHandler(self, event, button, x, y)) then
isOpened = true
else
isOpened = false
end
end;
draw = function(self) draw = function(self)
if (base.draw(self)) then if (base.draw(self)) then
@@ -186,9 +221,20 @@ return function(name)
end end
end end
end end
self:setVisualChanged(false)
end end
end; end,
init = function(self)
self.bgColor = self.parent:getTheme("DropdownBG")
self.fgColor = self.parent:getTheme("DropdownText")
itemSelectedBG = self.parent:getTheme("SelectionBG")
itemSelectedFG = self.parent:getTheme("SelectionText")
if(self.parent~=nil)then
self.parent:addEvent("mouse_click", self)
self.parent:addEvent("mouse_up", self)
self.parent:addEvent("mouse_scroll", self)
end
end,
} }
return setmetatable(object, base) return setmetatable(object, base)

View File

@@ -142,6 +142,7 @@ return function(name)
loadImage = function(self, path) loadImage = function(self, path)
image = paintutils.loadImage(path) image = paintutils.loadImage(path)
imageGotShrinked = false imageGotShrinked = false
self:updateDraw()
return self return self
end; end;
@@ -149,6 +150,7 @@ return function(name)
shrink = function(self) shrink = function(self)
shrink() shrink()
imageGotShrinked = true imageGotShrinked = true
self:updateDraw()
return self return self
end; end;
@@ -192,9 +194,8 @@ return function(name)
end end
end end
end end
self:setVisualChanged(false)
end end
end; end,
} }
return setmetatable(object, base) return setmetatable(object, base)

View File

@@ -1,5 +1,6 @@
local Object = require("Object") local Object = require("Object")
local utils = require("utils") local utils = require("utils")
local log = require("basaltLogs")
local xmlValue = utils.getValueFromXML local xmlValue = utils.getValueFromXML
return function(name) return function(name)
@@ -24,10 +25,6 @@ return function(name)
local internalValueChange = false local internalValueChange = false
local object = { local object = {
init = function(self)
self.bgColor = self.parent:getTheme("InputBG")
self.fgColor = self.parent:getTheme("InputFG")
end,
getType = function(self) getType = function(self)
return objectType return objectType
end; end;
@@ -36,6 +33,7 @@ return function(name)
if (iType == "password") or (iType == "number") or (iType == "text") then if (iType == "password") or (iType == "number") or (iType == "text") then
inputType = iType inputType = iType
end end
self:updateDraw()
return self return self
end; end;
@@ -48,6 +46,7 @@ return function(name)
else else
showingText = defaultText showingText = defaultText
end end
self:updateDraw()
return self return self
end; end;
@@ -58,8 +57,14 @@ return function(name)
setValue = function(self, val) setValue = function(self, val)
base.setValue(self, tostring(val)) base.setValue(self, tostring(val))
if not (internalValueChange) then if not (internalValueChange) then
if(self:isFocused())then
textX = tostring(val):len() + 1 textX = tostring(val):len() + 1
wIndex = math.max(1, textX-self:getWidth()+1)
local obx, oby = self:getAnchorPosition()
self.parent:setCursor(true, obx + textX - wIndex, oby+math.floor(self.height/2), self.fgColor)
end end
end
self:updateDraw()
return self return self
end; end;
@@ -70,6 +75,7 @@ return function(name)
setInputLimit = function(self, limit) setInputLimit = function(self, limit)
inputLimit = tonumber(limit) or inputLimit inputLimit = tonumber(limit) or inputLimit
self:updateDraw()
return self return self
end; end;
@@ -93,25 +99,28 @@ return function(name)
if (self.parent ~= nil) then if (self.parent ~= nil) then
local obx, oby = self:getAnchorPosition() local obx, oby = self:getAnchorPosition()
showingText = "" showingText = ""
if (self.parent ~= nil) then if(defaultText~="")then
self.parent:setCursor(true, obx + textX - wIndex, oby+math.floor(self.height/2), self.fgColor) self:updateDraw()
end end
self.parent:setCursor(true, obx + textX - wIndex, oby+math.max(math.ceil(self:getHeight()/2-1, 1)), self.fgColor)
end end
end; end;
loseFocusHandler = function(self) loseFocusHandler = function(self)
base.loseFocusHandler(self) base.loseFocusHandler(self)
if (self.parent ~= nil) then if (self.parent ~= nil) then
self.parent:setCursor(false)
showingText = defaultText showingText = defaultText
if(defaultText~="")then
self:updateDraw()
end
self.parent:setCursor(false)
end end
end; end;
keyHandler = function(self, event, key) keyHandler = function(self, key)
if (base.keyHandler(self, event, key)) then if (base.keyHandler(self, key)) then
local w,h = self:getSize() local w,h = self:getSize()
internalValueChange = true internalValueChange = true
if (event == "key") then
if (key == keys.backspace) then if (key == keys.backspace) then
-- on backspace -- on backspace
local text = tostring(base.getValue()) local text = tostring(base.getValue())
@@ -167,29 +176,6 @@ return function(name)
wIndex = 1 wIndex = 1
end end
end end
end
if (event == "char") then
local text = base.getValue()
if (text:len() < inputLimit or inputLimit <= 0) then
if (inputType == "number") then
local cache = text
if (key == ".") or (tonumber(key) ~= nil) then
self:setValue(text:sub(1, textX - 1) .. key .. text:sub(textX, text:len()))
textX = textX + 1
end
if (tonumber(base.getValue()) == nil) then
self:setValue(cache)
end
else
self:setValue(text:sub(1, textX - 1) .. key .. text:sub(textX, text:len()))
textX = textX + 1
end
if (textX >= w + wIndex) then
wIndex = wIndex + 1
end
end
end
local obx, oby = self:getAnchorPosition() local obx, oby = self:getAnchorPosition()
local val = tostring(base.getValue()) local val = tostring(base.getValue())
local cursorX = (textX <= val:len() and textX - 1 or val:len()) - (wIndex - 1) local cursorX = (textX <= val:len() and textX - 1 or val:len()) - (wIndex - 1)
@@ -198,21 +184,117 @@ return function(name)
cursorX = self.x + w - 1 cursorX = self.x + w - 1
end end
if (self.parent ~= nil) then if (self.parent ~= nil) then
self.parent:setCursor(true, obx + cursorX, oby+math.floor(h/2), self.fgColor) self.parent:setCursor(true, obx + cursorX, oby+math.max(math.ceil(h/2-1, 1)), self.fgColor)
end end
internalValueChange = false internalValueChange = false
end
end;
mouseHandler = function(self, event, button, x, y)
if (base.mouseHandler(self, event, button, x, y)) then
if (event == "mouse_click") and (button == 1) then
end
return true return true
end end
return false return false
end; end,
charHandler = function(self, char)
if (base.charHandler(self, char)) then
internalValueChange = true
local w,h = self:getSize()
local text = base.getValue()
if (text:len() < inputLimit or inputLimit <= 0) then
if (inputType == "number") then
local cache = text
if (char == ".") or (tonumber(char) ~= nil) then
self:setValue(text:sub(1, textX - 1) .. char .. text:sub(textX, text:len()))
textX = textX + 1
end
if (tonumber(base.getValue()) == nil) then
self:setValue(cache)
end
else
self:setValue(text:sub(1, textX - 1) .. char .. text:sub(textX, text:len()))
textX = textX + 1
end
if (textX >= w + wIndex) then
wIndex = wIndex + 1
end
end
local obx, oby = self:getAnchorPosition()
local val = tostring(base.getValue())
local cursorX = (textX <= val:len() and textX - 1 or val:len()) - (wIndex - 1)
local x = self:getX()
if (cursorX > x + w - 1) then
cursorX = x + w - 1
end
if (self.parent ~= nil) then
self.parent:setCursor(true, obx + cursorX, oby+math.max(math.ceil(h/2-1, 1)), self.fgColor)
end
internalValueChange = false
self:updateDraw()
return true
end
return false
end,
mouseHandler = function(self, button, x, y)
if(base.mouseHandler(self, button, x, y))then
local ax, ay = self:getAnchorPosition()
local obx, oby = self:getAbsolutePosition(ax, ay)
local w, h = self:getSize()
textX = x - obx + wIndex
local text = base.getValue()
if (textX > text:len()) then
textX = text:len() + 1
end
if (textX < wIndex) then
wIndex = textX - 1
if (wIndex < 1) then
wIndex = 1
end
end
self.parent:setCursor(true, obx + textX-1, oby+math.max(math.ceil(h/2-1, 1)), self.fgColor)
return true
end
end,
eventHandler = function(self, event, paste, p2, p3, p4)
if(base.eventHandler(self, event, paste, p2, p3, p4))then
if(event=="paste")then
if(self:isFocused())then
local text = base.getValue()
local w, h = self:getSize()
internalValueChange = true
if (inputType == "number") then
local cache = text
if (paste == ".") or (tonumber(paste) ~= nil) then
self:setValue(text:sub(1, textX - 1) .. paste .. text:sub(textX, text:len()))
textX = textX + paste:len()
end
if (tonumber(base.getValue()) == nil) then
self:setValue(cache)
end
else
self:setValue(text:sub(1, textX - 1) .. paste .. text:sub(textX, text:len()))
textX = textX + paste:len()
end
if (textX >= w + wIndex) then
wIndex = (textX+1)-w
end
local obx, oby = self:getAnchorPosition()
local val = tostring(base.getValue())
local cursorX = (textX <= val:len() and textX - 1 or val:len()) - (wIndex - 1)
local x = self:getX()
if (cursorX > x + w - 1) then
cursorX = x + w - 1
end
if (self.parent ~= nil) then
self.parent:setCursor(true, obx + cursorX, oby+math.max(math.ceil(h/2-1, 1)), self.fgColor)
end
self:updateDraw()
internalValueChange = false
end
end
end
end,
draw = function(self) draw = function(self)
if (base.draw(self)) then if (base.draw(self)) then
@@ -246,14 +328,24 @@ return function(name)
if (inputType == "password") and (val ~= "") then if (inputType == "password") and (val ~= "") then
text = string.rep("*", text:len()) text = string.rep("*", text:len())
end end
text = text .. string.rep(" ", space) text = text .. string.rep(self.bgSymbol, space)
self.parent:writeText(obx, oby + (n - 1), text, bCol, fCol) self.parent:writeText(obx, oby + (n - 1), text, bCol, fCol)
end end
end end
end end
self:setVisualChanged(false)
end end
end; end,
init = function(self)
self.bgColor = self.parent:getTheme("InputBG")
self.fgColor = self.parent:getTheme("InputText")
if(self.parent~=nil)then
self.parent:addEvent("mouse_click", self)
self.parent:addEvent("key", self)
self.parent:addEvent("char", self)
self.parent:addEvent("other_event", self)
end
end,
} }
return setmetatable(object, base) return setmetatable(object, base)

View File

@@ -33,27 +33,28 @@ return function(name)
if (autoSize) then if (autoSize) then
self.width = text:len() self.width = text:len()
end end
if not(fgColChanged)then self.fgColor = self.parent:getForeground() or colors.white end self:updateDraw()
if not(bgColChanged)then self.bgColor = self.parent:getBackground() or colors.black end
return self return self
end; end;
setBackground = function(self, col) setBackground = function(self, col)
base.setBackground(self, col) base.setBackground(self, col)
bgColChanged = true bgColChanged = true
self:updateDraw()
return self return self
end, end,
setForeground = function(self, col) setForeground = function(self, col)
base.setForeground(self, col) base.setForeground(self, col)
fgColChanged = true fgColChanged = true
self:updateDraw()
return self return self
end, end,
setTextAlign = function(self, hor, vert) setTextAlign = function(self, hor, vert)
textHorizontalAlign = hor or textHorizontalAlign textHorizontalAlign = hor or textHorizontalAlign
textVerticalAlign = vert or textVerticalAlign textVerticalAlign = vert or textVerticalAlign
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
@@ -61,6 +62,7 @@ return function(name)
if(size>0)and(size<=4)then if(size>0)and(size<=4)then
fontsize = size-1 or 0 fontsize = size-1 or 0
end end
self:updateDraw()
return self return self
end; end;
@@ -77,10 +79,10 @@ return function(name)
return self return self
end, end,
setSize = function(self, width, height) setSize = function(self, width, height, rel)
base.setSize(self, width, height) base.setSize(self, width, height, rel)
autoSize = false autoSize = false
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
@@ -90,47 +92,43 @@ return function(name)
local obx, oby = self:getAnchorPosition() local obx, oby = self:getAnchorPosition()
local w,h = self:getSize() local w,h = self:getSize()
local verticalAlign = utils.getTextVerticalAlign(h, textVerticalAlign) local verticalAlign = utils.getTextVerticalAlign(h, textVerticalAlign)
if(self.bgColor~=false)then
self.parent:drawBackgroundBox(obx, oby, w, h, self.bgColor)
self.parent:drawTextBox(obx, oby, w, h, " ") end
if(self.fgColor~=false)then self.parent:drawForegroundBox(obx, oby, w, h, self.fgColor) end
if(fontsize==0)then if(fontsize==0)then
if not(autoSize)then if not(autoSize)then
local text = createText(self:getValue(), self:getWidth()) local text = createText(self:getValue(), self:getWidth())
for k,v in pairs(text)do for k,v in pairs(text)do
self.parent:setText(obx, oby+k-1, v) self.parent:writeText(obx, oby+k-1, v, self.bgColor, self.fgColor)
end end
else else
for n = 1, h do self.parent:writeText(obx, oby, self:getValue(), self.bgColor, self.fgColor)
if (n == verticalAlign) then
self.parent:setText(obx, oby + (n - 1), utils.getTextHorizontalAlign(self:getValue(), w, textHorizontalAlign))
end
end
end end
else else
local tData = bigFont(fontsize, self:getValue(), self.fgColor, self.bgColor or colors.black) local tData = bigFont(fontsize, self:getValue(), self.fgColor, self.bgColor or colors.lightGray)
if(autoSize)then if(autoSize)then
self:setSize(#tData[1][1], #tData[1]-1) self:setSize(#tData[1][1], #tData[1]-1)
end end
for n = 1, h do
if (n == verticalAlign) then
local oX, oY = self.parent:getSize() local oX, oY = self.parent:getSize()
local cX, cY = #tData[1][1], #tData[1] local cX, cY = #tData[1][1], #tData[1]
obx = obx or math.floor((oX - cX) / 2) + 1 obx = obx or math.floor((oX - cX) / 2) + 1
oby = oby or math.floor((oY - cY) / 2) + 1 oby = oby or math.floor((oY - cY) / 2) + 1
for i = 1, cY do for i = 1, cY do
self.parent:setFG(obx, oby + i + n - 2, utils.getTextHorizontalAlign(tData[2][i], w, textHorizontalAlign)) self.parent:setFG(obx, oby + i - 2, tData[2][i])
self.parent:setBG(obx, oby + i + n - 2, utils.getTextHorizontalAlign(tData[3][i], w, textHorizontalAlign, tHex[self.bgColor or colors.black])) self.parent:setBG(obx, oby + i - 2, tData[3][i])
self.parent:setText(obx, oby + i + n - 2, utils.getTextHorizontalAlign(tData[1][i], w, textHorizontalAlign)) self.parent:setText(obx, oby + i - 2, tData[1][i])
end end
end end
end end
end end
end,
init = function(self)
if(base.init(self))then
self.bgColor = self.parent:getTheme("LabelBG")
self.fgColor = self.parent:getTheme("LabelText")
if(self.parent.bgColor==colors.black)and(self.fgColor==colors.black)then
self.fgColor = colors.lightGray
end
end end
self:setVisualChanged(false)
end end
end;
} }

View File

@@ -18,12 +18,6 @@ return function(name)
local scrollable = true local scrollable = true
local object = { local object = {
init = function(self)
self.bgColor = self.parent:getTheme("ListBG")
self.fgColor = self.parent:getTheme("ListText")
itemSelectedBG = self.parent:getTheme("SelectionBG")
itemSelectedFG = self.parent:getTheme("SelectionText")
end,
getType = function(self) getType = function(self)
return objectType return objectType
end; end;
@@ -33,11 +27,13 @@ return function(name)
if (#list == 1) then if (#list == 1) then
self:setValue(list[1]) self:setValue(list[1])
end end
self:updateDraw()
return self return self
end; end;
setOffset = function(self, yOff) setOffset = function(self, yOff)
yOffset = yOff yOffset = yOff
self:updateDraw()
return self return self
end; end;
@@ -47,6 +43,7 @@ return function(name)
removeItem = function(self, index) removeItem = function(self, index)
table.remove(list, index) table.remove(list, index)
self:updateDraw()
return self return self
end; end;
@@ -70,6 +67,7 @@ return function(name)
clear = function(self) clear = function(self)
list = {} list = {}
self:setValue({}) self:setValue({})
self:updateDraw()
return self return self
end; end;
@@ -80,23 +78,28 @@ return function(name)
editItem = function(self, index, text, bgCol, fgCol, ...) editItem = function(self, index, text, bgCol, fgCol, ...)
table.remove(list, index) table.remove(list, index)
table.insert(list, index, { text = text, bgCol = bgCol or self.bgColor, fgCol = fgCol or self.fgColor, args = { ... } }) table.insert(list, index, { text = text, bgCol = bgCol or self.bgColor, fgCol = fgCol or self.fgColor, args = { ... } })
self:updateDraw()
return self return self
end; end;
selectItem = function(self, index) selectItem = function(self, index)
self:setValue(list[index] or {}) self:setValue(list[index] or {})
self:updateDraw()
return self return self
end; end;
setSelectedItem = function(self, bgCol, fgCol, active) setSelectedItem = function(self, bgCol, fgCol, active)
itemSelectedBG = bgCol or self.bgColor itemSelectedBG = bgCol or self.bgColor
itemSelectedFG = fgCol or self.fgColor itemSelectedFG = fgCol or self.fgColor
selectionColorActive = active selectionColorActive = active~=nil and active or true
self:updateDraw()
return self return self
end; end;
setScrollable = function(self, scroll) setScrollable = function(self, scroll)
scrollable = scroll scrollable = scroll
if(scroll==nil)then scrollable = true end
self:updateDraw()
return self return self
end; end;
@@ -116,29 +119,15 @@ return function(name)
return self return self
end, end,
mouseHandler = function(self, event, button, x, y) scrollHandler = function(self, dir, x, y)
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition()) if(base.scrollHandler(self, dir, x, y))then
if(scrollable)then
local w,h = self:getSize() local w,h = self:getSize()
if (obx <= x) and (obx + w > x) and (oby <= y) and (oby + h > y) and (self:isVisible()) then yOffset = yOffset + dir
if (((event == "mouse_click") or (event == "mouse_drag"))and(button==1))or(event=="monitor_touch") then
if (#list > 0) then
for n = 1, h do
if (list[n + yOffset] ~= nil) then
if (obx <= x) and (obx + w > x) and (oby + n - 1 == y) then
self:setValue(list[n + yOffset])
self:getEventSystem():sendEvent("mouse_click", self, "mouse_click", 0, x, y, list[n + yOffset])
end
end
end
end
end
if (event == "mouse_scroll") and (scrollable) then
yOffset = yOffset + button
if (yOffset < 0) then if (yOffset < 0) then
yOffset = 0 yOffset = 0
end end
if (button >= 1) then if (dir >= 1) then
if (#list > h) then if (#list > h) then
if (yOffset > #list - h) then if (yOffset > #list - h) then
yOffset = #list - h yOffset = #list - h
@@ -150,11 +139,39 @@ return function(name)
yOffset = yOffset - 1 yOffset = yOffset - 1
end end
end end
self:updateDraw()
end end
self:setVisualChanged()
return true return true
end end
end; return false
end,
mouseHandler = function(self, button, x, y)
if(base.mouseHandler(self, button, x, y))then
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition())
local w,h = self:getSize()
if (#list > 0) then
for n = 1, h do
if (list[n + yOffset] ~= nil) then
if (obx <= x) and (obx + w > x) and (oby + n - 1 == y) then
self:setValue(list[n + yOffset])
self:updateDraw()
end
end
end
end
return true
end
return false
end,
dragHandler = function(self, button, x, y)
return self:mouseHandler(button, x, y)
end,
touchHandler = function(self, x, y)
return self:mouseHandler(1, x, y)
end,
draw = function(self) draw = function(self)
if (base.draw(self)) then if (base.draw(self)) then
@@ -178,9 +195,18 @@ return function(name)
end end
end end
end end
self:setVisualChanged(false)
end end
end; end,
init = function(self)
self.bgColor = self.parent:getTheme("ListBG")
self.fgColor = self.parent:getTheme("ListText")
itemSelectedBG = self.parent:getTheme("SelectionBG")
itemSelectedFG = self.parent:getTheme("SelectionText")
self.parent:addEvent("mouse_click", self)
self.parent:addEvent("mouse_drag", self)
self.parent:addEvent("mouse_scroll", self)
end,
} }
return setmetatable(object, base) return setmetatable(object, base)

View File

@@ -40,13 +40,6 @@ return function(name)
end end
object = { object = {
init = function(self)
self.bgColor = self.parent:getTheme("MenubarBG")
self.fgColor = self.parent:getTheme("MenubarText")
itemSelectedBG = self.parent:getTheme("SelectionBG")
itemSelectedFG = self.parent:getTheme("SelectionText")
end,
getType = function(self) getType = function(self)
return objectType return objectType
end; end;
@@ -56,6 +49,7 @@ return function(name)
if (#list == 1) then if (#list == 1) then
self:setValue(list[1]) self:setValue(list[1])
end end
self:updateDraw()
return self return self
end; end;
@@ -75,11 +69,13 @@ return function(name)
clear = function(self) clear = function(self)
list = {} list = {}
self:setValue({}) self:setValue({})
self:updateDraw()
return self return self
end; end;
setSpace = function(self, _space) setSpace = function(self, _space)
space = _space or space space = _space or space
self:updateDraw()
return self return self
end; end;
@@ -93,6 +89,7 @@ return function(name)
if (itemOffset > mScroll) then if (itemOffset > mScroll) then
itemOffset = mScroll itemOffset = mScroll
end end
self:updateDraw()
return self return self
end; end;
@@ -125,6 +122,7 @@ return function(name)
removeItem = function(self, index) removeItem = function(self, index)
table.remove(list, index) table.remove(list, index)
self:updateDraw()
return self return self
end; end;
@@ -139,11 +137,13 @@ return function(name)
editItem = function(self, index, text, bgCol, fgCol, ...) editItem = function(self, index, text, bgCol, fgCol, ...)
table.remove(list, index) table.remove(list, index)
table.insert(list, index, { text = text, bgCol = bgCol or self.bgColor, fgCol = fgCol or self.fgColor, args = { ... } }) table.insert(list, index, { text = text, bgCol = bgCol or self.bgColor, fgCol = fgCol or self.fgColor, args = { ... } })
self:updateDraw()
return self return self
end; end;
selectItem = function(self, index) selectItem = function(self, index)
self:setValue(list[index] or {}) self:setValue(list[index] or {})
self:updateDraw()
return self return self
end; end;
@@ -151,18 +151,14 @@ return function(name)
itemSelectedBG = bgCol or self.bgColor itemSelectedBG = bgCol or self.bgColor
itemSelectedFG = fgCol or self.fgColor itemSelectedFG = fgCol or self.fgColor
selectionColorActive = active selectionColorActive = active
self:updateDraw()
return self return self
end; end;
mouseHandler = function(self, event, button, x, y) mouseHandler = function(self, button, x, y)
if(base.mouseHandler(self, event, button, x, y))then if(base.mouseHandler(self, button, x, y))then
local objX, objY = self:getAbsolutePosition(self:getAnchorPosition()) local objX, objY = self:getAbsolutePosition(self:getAnchorPosition())
local w,h = self:getSize() local w,h = self:getSize()
if (objX <= x) and (objX + w > x) and (objY <= y) and (objY + h > y) and (self:isVisible()) then
if (self.parent ~= nil) then
self.parent:setFocusedObject(self)
end
if (event == "mouse_click") or (event == "monitor_touch") then
local xPos = 0 local xPos = 0
for n = 1, #list do for n = 1, #list do
if (list[n] ~= nil) then if (list[n] ~= nil) then
@@ -173,10 +169,16 @@ return function(name)
xPos = xPos + list[n].text:len() + space * 2 xPos = xPos + list[n].text:len() + space * 2
end end
end end
self:updateDraw()
return true
end end
if (event == "mouse_scroll") and (scrollable) then return false
itemOffset = itemOffset + button end,
scrollHandler = function(self, dir, x, y)
if(base.scrollHandler(self, dir, x, y))then
if(scrollable)then
itemOffset = itemOffset + dir
if (itemOffset < 0) then if (itemOffset < 0) then
itemOffset = 0 itemOffset = 0
end end
@@ -186,13 +188,12 @@ return function(name)
if (itemOffset > mScroll) then if (itemOffset > mScroll) then
itemOffset = mScroll itemOffset = mScroll
end end
self:updateDraw()
end end
self:setVisualChanged(true)
return true return true
end end
end
return false return false
end; end,
draw = function(self) draw = function(self)
if (base.draw(self)) then if (base.draw(self)) then
@@ -221,9 +222,19 @@ return function(name)
self.parent:setBG(obx, oby, textBGCol:sub(itemOffset+1, w+itemOffset)) self.parent:setBG(obx, oby, textBGCol:sub(itemOffset+1, w+itemOffset))
self.parent:setFG(obx, oby, textFGCol:sub(itemOffset+1, w+itemOffset)) self.parent:setFG(obx, oby, textFGCol:sub(itemOffset+1, w+itemOffset))
end end
self:setVisualChanged(false)
end end
end; end,
init = function(self)
self.bgColor = self.parent:getTheme("MenubarBG")
self.fgColor = self.parent:getTheme("MenubarText")
itemSelectedBG = self.parent:getTheme("SelectionBG")
itemSelectedFG = self.parent:getTheme("SelectionText")
self.parent:addEvent("mouse_click", self)
self.parent:addEvent("mouse_scroll", self)
end,
} }
return setmetatable(object, base) return setmetatable(object, base)

View File

@@ -1,4 +1,5 @@
local Object = require("Object") local Object = require("Object")
local log = require("basaltLogs")
return function(name) return function(name)
-- Pane -- Pane
@@ -6,26 +7,21 @@ return function(name)
local objectType = "Pane" local objectType = "Pane"
local object = { local object = {
init = function(self)
self.bgColor = self.parent:getTheme("PaneBG")
self.fgColor = self.parent:getTheme("PaneBG")
end,
getType = function(self) getType = function(self)
return objectType return objectType
end; end;
draw = function(self) setBackground = function(self, col, sym, symC)
if (base.draw(self)) then base.setBackground(self, col, sym, symC)
if (self.parent ~= nil) then return self
local obx, oby = self:getAnchorPosition() end,
local w,h = self:getSize()
self.parent:drawBackgroundBox(obx, oby, w, h, self.bgColor)
self.parent:drawForegroundBox(obx, oby, w, h, self.fgColor)
end
self:setVisualChanged(false)
end
end;
init = function(self)
if(base.init(self))then
self.bgColor = self.parent:getTheme("PaneBG")
self.fgColor = self.parent:getTheme("PaneBG")
end
end,
} }
return setmetatable(object, base) return setmetatable(object, base)

View File

@@ -2,6 +2,7 @@ local Object = require("Object")
local tHex = require("tHex") local tHex = require("tHex")
local process = require("process") local process = require("process")
local xmlValue = require("utils").getValueFromXML local xmlValue = require("utils").getValueFromXML
local log = require("basaltLogs")
local sub = string.sub local sub = string.sub
@@ -12,7 +13,7 @@ return function(name, parent)
local object local object
local cachedPath local cachedPath
local function createBasaltWindow(x, y, width, height) local function createBasaltWindow(x, y, width, height, self)
local xCursor, yCursor = 1, 1 local xCursor, yCursor = 1, 1
local bgColor, fgColor = colors.black, colors.white local bgColor, fgColor = colors.black, colors.white
local cursorBlink = false local cursorBlink = false
@@ -51,6 +52,7 @@ return function(name, parent)
cacheFG[n] = sub(cacheFG[n] == nil and emptyFG or cacheFG[n] .. emptyFG:sub(1, width - cacheFG[n]:len()), 1, width) cacheFG[n] = sub(cacheFG[n] == nil and emptyFG or cacheFG[n] .. emptyFG:sub(1, width - cacheFG[n]:len()), 1, width)
cacheBG[n] = sub(cacheBG[n] == nil and emptyBG or cacheBG[n] .. emptyBG:sub(1, width - cacheBG[n]:len()), 1, width) cacheBG[n] = sub(cacheBG[n] == nil and emptyBG or cacheBG[n] .. emptyBG:sub(1, width - cacheBG[n]:len()), 1, width)
end end
base.updateDraw(base)
end end
recreateWindowArray() recreateWindowArray()
@@ -118,6 +120,7 @@ return function(name, parent)
cacheFG[yCursor] = sNewTextColor cacheFG[yCursor] = sNewTextColor
cacheBG[yCursor] = sNewBackgroundColor cacheBG[yCursor] = sNewBackgroundColor
end end
object:updateDraw()
end end
xCursor = nEnd + 1 xCursor = nEnd + 1
if (visible) then if (visible) then
@@ -133,6 +136,7 @@ return function(name, parent)
cacheT[_y] = sub(gText:sub(1, _x - 1) .. text .. gText:sub(_x + (text:len()), width), 1, width) cacheT[_y] = sub(gText:sub(1, _x - 1) .. text .. gText:sub(_x + (text:len()), width), 1, width)
end end
end end
object:updateDraw()
end end
local function setBG(_x, _y, colorStr) local function setBG(_x, _y, colorStr)
@@ -142,6 +146,7 @@ return function(name, parent)
cacheBG[_y] = sub(gBG:sub(1, _x - 1) .. colorStr .. gBG:sub(_x + (colorStr:len()), width), 1, width) cacheBG[_y] = sub(gBG:sub(1, _x - 1) .. colorStr .. gBG:sub(_x + (colorStr:len()), width), 1, width)
end end
end end
object:updateDraw()
end end
local function setFG(_x, _y, colorStr) local function setFG(_x, _y, colorStr)
@@ -151,6 +156,7 @@ return function(name, parent)
cacheFG[_y] = sub(gFG:sub(1, _x - 1) .. colorStr .. gFG:sub(_x + (colorStr:len()), width), 1, width) cacheFG[_y] = sub(gFG:sub(1, _x - 1) .. colorStr .. gFG:sub(_x + (colorStr:len()), width), 1, width)
end end
end end
object:updateDraw()
end end
local setTextColor = function(color) local setTextColor = function(color)
@@ -417,10 +423,43 @@ return function(name, parent)
local paused = false local paused = false
local queuedEvent = {} local queuedEvent = {}
local function updateCursor(self)
local xCur, yCur = pWindow.getCursorPos()
local obx, oby = self:getAnchorPosition()
local w,h = self:getSize()
if (obx + xCur - 1 >= 1 and obx + xCur - 1 <= obx + w - 1 and yCur + oby - 1 >= 1 and yCur + oby - 1 <= oby + h - 1) then
self.parent:setCursor(pWindow.getCursorBlink(), obx + xCur - 1, yCur + oby - 1, pWindow.getTextColor())
end
end
local function mouseEvent(self, event, p1, x, y)
if (curProcess == nil) then
return false
end
if not (curProcess:isDead()) then
if not (paused) then
local absX, absY = self:getAbsolutePosition(self:getAnchorPosition(nil, nil, true))
curProcess:resume(event, p1, x-absX+1, y-absY+1)
updateCursor(self)
end
end
end
local function keyEvent(self, event, key, isHolding)
if (curProcess == nil) then
return false
end
if not (curProcess:isDead()) then
if not (paused) then
if (self.draw) then
curProcess:resume(event, key, isHolding)
updateCursor(self)
end
end
end
end
object = { object = {
init = function(self)
self.bgColor = self.parent:getTheme("ProgramBG")
end,
getType = function(self) getType = function(self)
return objectType return objectType
end; end;
@@ -461,7 +500,7 @@ return function(name, parent)
setSize = function(self, width, height, rel) setSize = function(self, width, height, rel)
base.setSize(self, width, height, rel) base.setSize(self, width, height, rel)
pWindow.basalt_resize(self:getSize()) pWindow.basalt_resize(self:getWidth(), self:getHeight())
return self return self
end; end;
@@ -484,6 +523,16 @@ return function(name, parent)
pWindow.basalt_setVisible(true) pWindow.basalt_setVisible(true)
curProcess:resume() curProcess:resume()
paused = false paused = false
if(self.parent~=nil)then
self.parent:addEvent("mouse_click", self)
self.parent:addEvent("mouse_up", self)
self.parent:addEvent("mouse_drag", self)
self.parent:addEvent("mouse_scroll", self)
self.parent:addEvent("key", self)
self.parent:addEvent("key_up", self)
self.parent:addEvent("char", self)
self.parent:addEvent("other_event", self)
end
return self return self
end; end;
@@ -498,6 +547,7 @@ return function(name, parent)
end end
end end
end end
self.parent:removeEvents(self)
return self return self
end; end;
@@ -551,36 +601,61 @@ return function(name, parent)
return self return self
end; end;
mouseHandler = function(self, event, button, x, y) mouseHandler = function(self, button, x, y)
if (base.mouseHandler(self, event, button, x, y)) then if (base.mouseHandler(self, button, x, y)) then
if (curProcess == nil) then mouseEvent(self, "mouse_click", button, x, y)
return false
end
if not (curProcess:isDead()) then
if not (paused) then
local absX, absY = self:getAbsolutePosition(self:getAnchorPosition(nil, nil, true))
curProcess:resume(event, button, x-absX+1, y-absY+1)
end
end
return true return true
end end
end;
keyHandler = function(self, event, key)
base.keyHandler(self, event, key)
if (self:isFocused()) then
if (curProcess == nil) then
return false return false
end,
mouseUpHandler = function(self, button, x, y)
if (base.mouseUpHandler(self, button, x, y)) then
mouseEvent(self, "mouse_up", button, x, y)
return true
end end
if not (curProcess:isDead()) then return false
if not (paused) then end,
if (self.draw) then
curProcess:resume(event, key) scrollHandler = function(self, dir, x, y)
if (base.scrollHandler(self, dir, x, y)) then
mouseEvent(self, "mouse_scroll", dir, x, y)
return true
end end
return false
end,
dragHandler = function(self, button, x, y)
if (base.dragHandler(self, button, x, y)) then
mouseEvent(self, "mouse_drag", button, x, y)
return true
end end
return false
end,
keyHandler = function(self, key, isHolding)
if(base.keyHandler(self, key, isHolding))then
keyEvent(self, "key", key, isHolding)
return true
end end
return false
end,
keyUpHandler = function(self, key)
if(base.keyUpHandler(self, key))then
keyEvent(self, "key_up", key)
return true
end end
end; return false
end,
charHandler = function(self, char)
if(base.charHandler(self, char))then
keyEvent(self, "char", char)
return true
end
return false
end,
getFocusHandler = function(self) getFocusHandler = function(self)
base.getFocusHandler(self) base.getFocusHandler(self)
@@ -600,7 +675,7 @@ return function(name, parent)
end end
end end
end end
end; end,
loseFocusHandler = function(self) loseFocusHandler = function(self)
base.loseFocusHandler(self) base.loseFocusHandler(self)
@@ -611,15 +686,28 @@ return function(name, parent)
end end
end end
end end
end; end,
eventHandler = function(self, event, p1, p2, p3, p4) eventHandler = function(self, event, p1, p2, p3, p4)
if(base.eventHandler(self, event, p1, p2, p3, p4))then
if (curProcess == nil) then if (curProcess == nil) then
return return
end end
if(event=="dynamicValueEvent")then
local w, h = pWindow.getSize()
local pW, pH = self:getSize()
if(w~=pW)or(h~=pH)then
pWindow.basalt_resize(pW, pH)
if not (curProcess:isDead()) then
curProcess:resume("term_resize")
end
end
pWindow.basalt_reposition(self:getAnchorPosition())
end
if not (curProcess:isDead()) then if not (curProcess:isDead()) then
if not (paused) then if not (paused) then
if (event ~= "mouse_click") and (event ~= "monitor_touch") and (event ~= "mouse_up") and (event ~= "mouse_scroll") and (event ~= "mouse_drag") and (event ~= "key_up") and (event ~= "key") and (event ~= "char") and (event ~= "terminate") then if(event ~= "terminate") then
curProcess:resume(event, p1, p2, p3, p4) curProcess:resume(event, p1, p2, p3, p4)
end end
if (self:isFocused()) then if (self:isFocused()) then
@@ -632,17 +720,20 @@ return function(name, parent)
end end
end end
if (event == "terminate") and (self:isFocused()) then if (event == "terminate") then
self:stop() log(self:isFocused())
curProcess:resume(event)
self.parent:setCursor(false)
return true
end end
end end
else else
if (event ~= "mouse_click") and (event ~= "monitor_touch") and (event ~= "mouse_up") and (event ~= "mouse_scroll") and (event ~= "mouse_drag") and (event ~= "key_up") and (event ~= "key") and (event ~= "char") and (event ~= "terminate") then
table.insert(queuedEvent, { event = event, args = { p1, p2, p3, p4 } }) table.insert(queuedEvent, { event = event, args = { p1, p2, p3, p4 } })
end end
end end
return false
end end
end; end,
draw = function(self) draw = function(self)
if (base.draw(self)) then if (base.draw(self)) then
@@ -650,14 +741,14 @@ return function(name, parent)
local obx, oby = self:getAnchorPosition() local obx, oby = self:getAnchorPosition()
local w,h = self:getSize() local w,h = self:getSize()
pWindow.basalt_reposition(obx, oby) pWindow.basalt_reposition(obx, oby)
if(self.bgColor~=false)then
self.parent:drawBackgroundBox(obx, oby, w, h, self.bgColor)
end
pWindow.basalt_update() pWindow.basalt_update()
end end
self:setVisualChanged(false)
end end
end; end,
init = function(self)
self.bgColor = self.parent:getTheme("ProgramBG")
end,
} }

View File

@@ -42,6 +42,7 @@ return function(name)
setDirection = function(self, dir) setDirection = function(self, dir)
direction = dir direction = dir
self:updateDraw()
return self return self
end; end;
@@ -49,11 +50,13 @@ return function(name)
activeBarColor = color or activeBarColor activeBarColor = color or activeBarColor
activeBarSymbol = symbol or activeBarSymbol activeBarSymbol = symbol or activeBarSymbol
activeBarSymbolCol = symbolcolor or activeBarSymbolCol activeBarSymbolCol = symbolcolor or activeBarSymbolCol
self:updateDraw()
return self return self
end; end;
setBackgroundSymbol = function(self, symbol) setBackgroundSymbol = function(self, symbol)
bgBarSymbol = symbol:sub(1, 1) bgBarSymbol = symbol:sub(1, 1)
self:updateDraw()
return self return self
end; end;
@@ -65,6 +68,7 @@ return function(name)
self:progressDoneHandler() self:progressDoneHandler()
end end
end end
self:updateDraw()
return self return self
end; end;
@@ -107,9 +111,8 @@ return function(name)
self.parent:drawTextBox(obx, oby, w / 100 * progress, h, activeBarSymbol) self.parent:drawTextBox(obx, oby, w / 100 * progress, h, activeBarSymbol)
end end
end end
self:setVisualChanged(false)
end end
end; end,
} }

View File

@@ -20,16 +20,6 @@ return function(name)
local align = "left" local align = "left"
local object = { local object = {
init = function(self)
self.bgColor = self.parent:getTheme("MenubarBG")
self.fgColor = self.parent:getTheme("MenubarFG")
itemSelectedBG = self.parent:getTheme("SelectionBG")
itemSelectedFG = self.parent:getTheme("SelectionText")
boxSelectedBG = self.parent:getTheme("MenubarBG")
boxSelectedFG = self.parent:getTheme("MenubarText")
end,
getType = function(self) getType = function(self)
return objectType return objectType
end; end;
@@ -58,6 +48,7 @@ return function(name)
if (#list == 1) then if (#list == 1) then
self:setValue(list[1]) self:setValue(list[1])
end end
self:updateDraw()
return self return self
end; end;
@@ -67,6 +58,7 @@ return function(name)
removeItem = function(self, index) removeItem = function(self, index)
table.remove(list, index) table.remove(list, index)
self:updateDraw()
return self return self
end; end;
@@ -86,6 +78,7 @@ return function(name)
clear = function(self) clear = function(self)
list = {} list = {}
self:setValue({}) self:setValue({})
self:updateDraw()
return self return self
end; end;
@@ -96,16 +89,19 @@ return function(name)
editItem = function(self, index, text, x, y, bgCol, fgCol, ...) editItem = function(self, index, text, x, y, bgCol, fgCol, ...)
table.remove(list, index) table.remove(list, index)
table.insert(list, index, { x = x or 1, y = y or 1, text = text, bgCol = bgCol or self.bgColor, fgCol = fgCol or self.fgColor, args = { ... } }) table.insert(list, index, { x = x or 1, y = y or 1, text = text, bgCol = bgCol or self.bgColor, fgCol = fgCol or self.fgColor, args = { ... } })
self:updateDraw()
return self return self
end; end;
selectItem = function(self, index) selectItem = function(self, index)
self:setValue(list[index] or {}) self:setValue(list[index] or {})
self:updateDraw()
return self return self
end; end;
setActiveSymbol = function(self, sym) setActiveSymbol = function(self, sym)
symbol = sym:sub(1,1) symbol = sym:sub(1,1)
self:updateDraw()
return self return self
end, end,
@@ -115,31 +111,30 @@ return function(name)
boxSelectedBG = boxBG or boxSelectedBG boxSelectedBG = boxBG or boxSelectedBG
boxSelectedFG = boxFG or boxSelectedFG boxSelectedFG = boxFG or boxSelectedFG
selectionColorActive = active~=nil and active or true selectionColorActive = active~=nil and active or true
self:updateDraw()
return self return self
end; end;
mouseHandler = function(self, event, button, x, y) mouseHandler = function(self, button, x, y)
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition())
if ((event == "mouse_click")and(button==1))or(event=="monitor_touch") then
if (#list > 0) then if (#list > 0) then
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition())
for _, value in pairs(list) do for _, value in pairs(list) do
if (obx + value.x - 1 <= x) and (obx + value.x - 1 + value.text:len() + 2 >= x) and (oby + value.y - 1 == y) then if (obx + value.x - 1 <= x) and (obx + value.x - 1 + value.text:len() + 1 >= x) and (oby + value.y - 1 == y) then
self:setValue(value) self:setValue(value)
if (self.parent ~= nil) then local val = self:getEventSystem():sendEvent("mouse_click", self, "mouse_click", button, x, y)
if(val==false)then return val end
if(self.parent~=nil)then
self.parent:setFocusedObject(self) self.parent:setFocusedObject(self)
end end
self:getEventSystem():sendEvent(event, self, event, button, x, y) self:updateDraw()
self:setVisualChanged()
return true return true
end end
end end
end end
end
return false return false
end; end;
draw = function(self) draw = function(self)
if (base.draw(self)) then
if (self.parent ~= nil) then if (self.parent ~= nil) then
local obx, oby = self:getAnchorPosition() local obx, oby = self:getAnchorPosition()
for _, value in pairs(list) do for _, value in pairs(list) do
@@ -153,10 +148,19 @@ return function(name)
self.parent:writeText(value.x + 2 + obx - 1, value.y + oby - 1, value.text, value.bgCol, value.fgCol) self.parent:writeText(value.x + 2 + obx - 1, value.y + oby - 1, value.text, value.bgCol, value.fgCol)
end end
end end
return true
end end
self:setVisualChanged(false) end,
end
end; init = function(self)
self.bgColor = self.parent:getTheme("MenubarBG")
self.fgColor = self.parent:getTheme("MenubarFG")
itemSelectedBG = self.parent:getTheme("SelectionBG")
itemSelectedFG = self.parent:getTheme("SelectionText")
boxSelectedBG = self.parent:getTheme("MenubarBG")
boxSelectedFG = self.parent:getTheme("MenubarText")
self.parent:addEvent("mouse_click", self)
end,
} }
return setmetatable(object, base) return setmetatable(object, base)

View File

@@ -18,19 +18,37 @@ return function(name)
local index = 1 local index = 1
local symbolSize = 1 local symbolSize = 1
local function mouseEvent(self, button, x, y)
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition())
local w,h = self:getSize()
if (barType == "horizontal") then
for _index = 0, w do
if (obx + _index == x) and (oby <= y) and (oby + h > y) then
index = math.min(_index + 1, w - (symbolSize - 1))
self:setValue(maxValue / w * (index))
self:updateDraw()
end
end
end
if (barType == "vertical") then
for _index = 0, h do
if (oby + _index == y) and (obx <= x) and (obx + w > x) then
index = math.min(_index + 1, h - (symbolSize - 1))
self:setValue(maxValue / h * (index))
self:updateDraw()
end
end
end
end
local object = { local object = {
init = function(self)
self.bgColor = self.parent:getTheme("ScrollbarBG")
self.fgColor = self.parent:getTheme("ScrollbarText")
symbolColor = self.parent:getTheme("ScrollbarSymbolColor")
end,
getType = function(self) getType = function(self)
return objectType return objectType
end; end;
setSymbol = function(self, _symbol) setSymbol = function(self, _symbol)
symbol = _symbol:sub(1, 1) symbol = _symbol:sub(1, 1)
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
@@ -53,6 +71,7 @@ return function(name)
local w,h = self:getSize() local w,h = self:getSize()
index = math.min(index, (barType == "vertical" and h or w) - (symbolSize - 1)) index = math.min(index, (barType == "vertical" and h or w) - (symbolSize - 1))
self:setValue(maxValue / (barType == "vertical" and h or w) * index) self:setValue(maxValue / (barType == "vertical" and h or w) * index)
self:updateDraw()
return self return self
end, end,
@@ -68,67 +87,62 @@ return function(name)
elseif (barType == "horizontal") then elseif (barType == "horizontal") then
self:setValue(index - 1 * (maxValue / (w - (symbolSize - 1))) - (maxValue / (w - (symbolSize - 1)))) self:setValue(index - 1 * (maxValue / (w - (symbolSize - 1))) - (maxValue / (w - (symbolSize - 1))))
end end
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
setMaxValue = function(self, val) setMaxValue = function(self, val)
maxValue = val maxValue = val
self:updateDraw()
return self return self
end; end;
setBackgroundSymbol = function(self, _bgSymbol) setBackgroundSymbol = function(self, _bgSymbol)
bgSymbol = string.sub(_bgSymbol, 1, 1) bgSymbol = string.sub(_bgSymbol, 1, 1)
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
setSymbolColor = function(self, col) setSymbolColor = function(self, col)
symbolColor = col symbolColor = col
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
setBarType = function(self, _typ) setBarType = function(self, _typ)
barType = _typ:lower() barType = _typ:lower()
self:updateDraw()
return self return self
end; end;
mouseHandler = function(self, event, button, x, y) mouseHandler = function(self, button, x, y)
if (base.mouseHandler(self, event, button, x, y)) then if (base.mouseHandler(self, button, x, y)) then
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition()) mouseEvent(self, button, x, y)
return true
end
return false
end,
dragHandler = function(self, button, x, y)
if (base.dragHandler(self, button, x, y)) then
mouseEvent(self, button, x, y)
return true
end
return false
end,
scrollHandler = function(self, dir, x, y)
if(base.scrollHandler(self, dir, x, y))then
local w,h = self:getSize() local w,h = self:getSize()
if (((event == "mouse_click") or (event == "mouse_drag")) and (button == 1))or(event=="monitor_touch") then index = index + dir
if (barType == "horizontal") then
for _index = 0, w do
if (obx + _index == x) and (oby <= y) and (oby + h > y) then
index = math.min(_index + 1, w - (symbolSize - 1))
self:setValue(maxValue / w * (index))
self:setVisualChanged()
end
end
end
if (barType == "vertical") then
for _index = 0, h do
if (oby + _index == y) and (obx <= x) and (obx + w > x) then
index = math.min(_index + 1, h - (symbolSize - 1))
self:setValue(maxValue / h * (index))
self:setVisualChanged()
end
end
end
end
if (event == "mouse_scroll") then
index = index + button
if (index < 1) then if (index < 1) then
index = 1 index = 1
end end
index = math.min(index, (barType == "vertical" and h or w) - (symbolSize - 1)) index = math.min(index, (barType == "vertical" and h or w) - (symbolSize - 1))
self:setValue(maxValue / (barType == "vertical" and h or w) * index) self:setValue(maxValue / (barType == "vertical" and h or w) * index)
self:updateDraw()
end end
return true end,
end
end;
draw = function(self) draw = function(self)
if (base.draw(self)) then if (base.draw(self)) then
@@ -155,9 +169,17 @@ return function(name)
end end
end end
end end
self:setVisualChanged(false)
end end
end; end,
init = function(self)
self.bgColor = self.parent:getTheme("ScrollbarBG")
self.fgColor = self.parent:getTheme("ScrollbarText")
symbolColor = self.parent:getTheme("ScrollbarSymbolColor")
self.parent:addEvent("mouse_click", self)
self.parent:addEvent("mouse_drag", self)
self.parent:addEvent("mouse_scroll", self)
end,
} }
return setmetatable(object, base) return setmetatable(object, base)

View File

@@ -1,4 +1,5 @@
local Object = require("Object") local Object = require("Object")
local log = require("basaltLogs")
local xmlValue = require("utils").getValueFromXML local xmlValue = require("utils").getValueFromXML
return function(name) return function(name)
@@ -17,19 +18,37 @@ return function(name)
local index = 1 local index = 1
local symbolSize = 1 local symbolSize = 1
local function mouseEvent(self, button, x, y)
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition())
local w,h = self:getSize()
if (barType == "horizontal") then
for _index = 0, w do
if (obx + _index == x) and (oby <= y) and (oby + h > y) then
index = math.min(_index + 1, w - (symbolSize - 1))
self:setValue(maxValue / w * (index))
self:updateDraw()
end
end
end
if (barType == "vertical") then
for _index = 0, h do
if (oby + _index == y) and (obx <= x) and (obx + w > x) then
index = math.min(_index + 1, h - (symbolSize - 1))
self:setValue(maxValue / h * (index))
self:updateDraw()
end
end
end
end
local object = { local object = {
init = function(self)
self.bgColor = self.parent:getTheme("SliderBG")
self.fgColor = self.parent:getTheme("SliderText")
symbolColor = self.parent:getTheme("SliderSymbolColor")
end,
getType = function(self) getType = function(self)
return objectType return objectType
end; end;
setSymbol = function(self, _symbol) setSymbol = function(self, _symbol)
symbol = _symbol:sub(1, 1) symbol = _symbol:sub(1, 1)
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
@@ -52,6 +71,7 @@ return function(name)
local w,h = self:getSize() local w,h = self:getSize()
index = math.min(index, (barType == "vertical" and h or w) - (symbolSize - 1)) index = math.min(index, (barType == "vertical" and h or w) - (symbolSize - 1))
self:setValue(maxValue / (barType == "vertical" and h or w) * index) self:setValue(maxValue / (barType == "vertical" and h or w) * index)
self:updateDraw()
return self return self
end, end,
@@ -66,7 +86,7 @@ return function(name)
elseif (barType == "horizontal") then elseif (barType == "horizontal") then
self:setValue(index - 1 * (maxValue / (w - (symbolSize - 1))) - (maxValue / (w - (symbolSize - 1)))) self:setValue(index - 1 * (maxValue / (w - (symbolSize - 1))) - (maxValue / (w - (symbolSize - 1))))
end end
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
@@ -77,56 +97,52 @@ return function(name)
setBackgroundSymbol = function(self, _bgSymbol) setBackgroundSymbol = function(self, _bgSymbol)
bgSymbol = string.sub(_bgSymbol, 1, 1) bgSymbol = string.sub(_bgSymbol, 1, 1)
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
setSymbolColor = function(self, col) setSymbolColor = function(self, col)
symbolColor = col symbolColor = col
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
setBarType = function(self, _typ) setBarType = function(self, _typ)
barType = _typ:lower() barType = _typ:lower()
self:updateDraw()
return self return self
end; end;
mouseHandler = function(self, event, button, x, y) mouseHandler = function(self, button, x, y)
if (base.mouseHandler(self, event, button, x, y)) then if (base.mouseHandler(self, button, x, y)) then
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition()) mouseEvent(self, button, x, y)
return true
end
return false
end,
dragHandler = function(self, button, x, y)
if (base.dragHandler(self, button, x, y)) then
mouseEvent(self, button, x, y)
return true
end
return false
end,
scrollHandler = function(self, dir, x, y)
if(base.scrollHandler(self, dir, x, y))then
local w,h = self:getSize() local w,h = self:getSize()
if (((event == "mouse_click") or (event == "mouse_drag")) and (button == 1))or(event=="monitor_touch") then index = index + dir
if (barType == "horizontal") then
for _index = 0, w do
if (obx + _index == x) and (oby <= y) and (oby + h > y) then
index = math.min(_index + 1, w - (symbolSize - 1))
self:setValue(maxValue / w * (index))
self:setVisualChanged()
end
end
end
if (barType == "vertical") then
for _index = 0, h do
if (oby + _index == y) and (obx <= x) and (obx + w > x) then
index = math.min(_index + 1, h - (symbolSize - 1))
self:setValue(maxValue / h * (index))
self:setVisualChanged()
end
end
end
end
if (event == "mouse_scroll") then
index = index + button
if (index < 1) then if (index < 1) then
index = 1 index = 1
end end
index = math.min(index, (barType == "vertical" and h or w) - (symbolSize - 1)) index = math.min(index, (barType == "vertical" and h or w) - (symbolSize - 1))
self:setValue(maxValue / (barType == "vertical" and h or w) * index) self:setValue(maxValue / (barType == "vertical" and h or w) * index)
end self:updateDraw()
return true return true
end end
end; return false
end,
draw = function(self) draw = function(self)
if (base.draw(self)) then if (base.draw(self)) then
@@ -141,7 +157,6 @@ return function(name)
if (barType == "vertical") then if (barType == "vertical") then
for n = 0, h - 1 do for n = 0, h - 1 do
if (index == n + 1) then if (index == n + 1) then
for curIndexOffset = 0, math.min(symbolSize - 1, h) do for curIndexOffset = 0, math.min(symbolSize - 1, h) do
self.parent:writeText(obx, oby + n + curIndexOffset, symbol, symbolColor, symbolColor) self.parent:writeText(obx, oby + n + curIndexOffset, symbol, symbolColor, symbolColor)
@@ -154,9 +169,17 @@ return function(name)
end end
end end
end end
self:setVisualChanged(false)
end end
end; end,
init = function(self)
self.bgColor = self.parent:getTheme("SliderBG")
self.fgColor = self.parent:getTheme("SliderText")
symbolColor = self.parent:getTheme("SliderSymbolColor")
self.parent:addEvent("mouse_click", self)
self.parent:addEvent("mouse_drag", self)
self.parent:addEvent("mouse_scroll", self)
end,
} }
return setmetatable(object, base) return setmetatable(object, base)

View File

@@ -17,32 +17,25 @@ return function(name)
local activeBG = colors.green local activeBG = colors.green
local object = { local object = {
init = function(self)
self.bgColor = self.parent:getTheme("SwitchBG")
self.fgColor = self.parent:getTheme("SwitchText")
bgSymbol = self.parent:getTheme("SwitchBGSymbol")
inactiveBG = self.parent:getTheme("SwitchInactive")
activeBG = self.parent:getTheme("SwitchActive")
end,
getType = function(self) getType = function(self)
return objectType return objectType
end; end;
setSymbolColor = function(self, symbolColor) setSymbolColor = function(self, symbolColor)
bgSymbol = symbolColor bgSymbol = symbolColor
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
setActiveBackground = function(self, bgcol) setActiveBackground = function(self, bgcol)
activeBG = bgcol activeBG = bgcol
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
setInactiveBackground = function(self, bgcol) setInactiveBackground = function(self, bgcol)
inactiveBG = bgcol inactiveBG = bgcol
self:setVisualChanged() self:updateDraw()
return self return self
end; end;
@@ -54,12 +47,11 @@ return function(name)
end, end,
mouseHandler = function(self, event, button, x, y) mouseHandler = function(self, button, x, y)
if (base.mouseHandler(self, event, button, x, y)) then if (base.mouseHandler(self, button, x, y)) then
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition()) local obx, oby = self:getAbsolutePosition(self:getAnchorPosition())
if ((event == "mouse_click") and (button == 1))or(event=="monitor_touch") then
self:setValue(not self:getValue()) self:setValue(not self:getValue())
end self:updateDraw()
return true return true
end end
end; end;
@@ -78,9 +70,17 @@ return function(name)
self.parent:drawBackgroundBox(obx+1, oby, 1, h, inactiveBG) self.parent:drawBackgroundBox(obx+1, oby, 1, h, inactiveBG)
end end
end end
self:setVisualChanged(false)
end end
end; end,
init = function(self)
self.bgColor = self.parent:getTheme("SwitchBG")
self.fgColor = self.parent:getTheme("SwitchText")
bgSymbol = self.parent:getTheme("SwitchBGSymbol")
inactiveBG = self.parent:getTheme("SwitchInactive")
activeBG = self.parent:getTheme("SwitchActive")
self.parent:addEvent("mouse_click", self)
end,
} }
return setmetatable(object, base) return setmetatable(object, base)

View File

@@ -1,7 +1,10 @@
local Object = require("Object") local Object = require("Object")
local tHex = require("tHex") local tHex = require("tHex")
local log = require("basaltLogs")
local xmlValue = require("utils").getValueFromXML local xmlValue = require("utils").getValueFromXML
local rep = string.rep
return function(name) return function(name)
local base = Object(name) local base = Object(name)
local objectType = "Textfield" local objectType = "Textfield"
@@ -65,6 +68,7 @@ return function(name)
end end
fgLines[l] = fgLine fgLines[l] = fgLine
bgLines[l] = bgLine bgLines[l] = bgLine
self:updateDraw()
end end
local function updateAllColors(self) local function updateAllColors(self)
@@ -74,10 +78,6 @@ return function(name)
end end
local object = { local object = {
init = function(self)
self.bgColor = self.parent:getTheme("TextfieldBG")
self.fgColor = self.parent:getTheme("TextfieldText")
end,
getType = function(self) getType = function(self)
return objectType return objectType
end; end;
@@ -144,6 +144,7 @@ return function(name)
editLine = function(self, index, text) editLine = function(self, index, text)
lines[index] = text or lines[index] lines[index] = text or lines[index]
self:updateDraw()
return self return self
end; end;
@@ -152,6 +153,7 @@ return function(name)
bgLines = {""} bgLines = {""}
fgLines = {""} fgLines = {""}
hIndex, wIndex, textX, textY = 1, 1, 1, 1 hIndex, wIndex, textX, textY = 1, 1, 1, 1
self:updateDraw()
return self return self
end, end,
@@ -173,6 +175,7 @@ return function(name)
table.insert(fgLines, tHex[self.fgColor]:rep(text:len())) table.insert(fgLines, tHex[self.fgColor]:rep(text:len()))
end end
end end
self:updateDraw()
return self return self
end; end;
@@ -183,11 +186,13 @@ return function(name)
for k,v in pairs(tab)do for k,v in pairs(tab)do
table.insert(keyWords[color], v) table.insert(keyWords[color], v)
end end
self:updateDraw()
return self return self
end; end;
addRule = function(self, rule, fg, bg) addRule = function(self, rule, fg, bg)
table.insert(rules, {rule, fg, bg}) table.insert(rules, {rule, fg, bg})
self:updateDraw()
return self return self
end; end;
@@ -198,6 +203,7 @@ return function(name)
rules[k][3] = bg rules[k][3] = bg
end end
end end
self:updateDraw()
return self return self
end; end;
@@ -207,11 +213,13 @@ return function(name)
table.remove(rules, k) table.remove(rules, k)
end end
end end
self:updateDraw()
return self return self
end; end;
setKeywords = function(self, color, tab) setKeywords = function(self, color, tab)
keyWords[color] = tab keyWords[color] = tab
self:updateDraw()
return self return self
end; end;
@@ -220,6 +228,7 @@ return function(name)
if (#lines <= 0) then if (#lines <= 0) then
table.insert(lines, "") table.insert(lines, "")
end end
self:updateDraw()
return self return self
end; end;
@@ -244,11 +253,10 @@ return function(name)
end end
end; end;
keyHandler = function(self, event, key) keyHandler = function(self, key)
if (base.keyHandler(self, event, key)) then if (base.keyHandler(self, event, key)) then
local obx, oby = self:getAnchorPosition() local obx, oby = self:getAnchorPosition()
local w,h = self:getSize() local w,h = self:getSize()
if (event == "key") then
if (key == keys.backspace) then if (key == keys.backspace) then
-- on backspace -- on backspace
if (lines[textY] == "") then if (lines[textY] == "") then
@@ -361,7 +369,14 @@ return function(name)
if (textX > lines[textY]:len() + 1) then if (textX > lines[textY]:len() + 1) then
textX = lines[textY]:len() + 1 textX = lines[textY]:len() + 1
end end
if (wIndex > 1) then
if (textX < wIndex) then
wIndex = textX - w + 1
if (wIndex < 1) then
wIndex = 1
end
end
end
if (textY >= hIndex + h) then if (textY >= hIndex + h) then
hIndex = hIndex + 1 hIndex = hIndex + 1
end end
@@ -411,19 +426,6 @@ return function(name)
wIndex = 1 wIndex = 1
end end
end end
end
if (event == "char") then
lines[textY] = lines[textY]:sub(1, textX - 1) .. key .. lines[textY]:sub(textX, lines[textY]:len())
fgLines[textY] = fgLines[textY]:sub(1, textX - 1) .. tHex[self.fgColor] .. fgLines[textY]:sub(textX, fgLines[textY]:len())
bgLines[textY] = bgLines[textY]:sub(1, textX - 1) .. tHex[self.bgColor] .. bgLines[textY]:sub(textX, bgLines[textY]:len())
textX = textX + 1
if (textX >= w + wIndex) then
wIndex = wIndex + 1
end
updateColors(self)
self:setValue("")
end
local cursorX = (textX <= lines[textY]:len() and textX - 1 or lines[textY]:len()) - (wIndex - 1) local cursorX = (textX <= lines[textY]:len() and textX - 1 or lines[textY]:len()) - (wIndex - 1)
if (cursorX > self.x + w - 1) then if (cursorX > self.x + w - 1) then
@@ -434,17 +436,46 @@ return function(name)
cursorX = 0 cursorX = 0
end end
self.parent:setCursor(true, obx + cursorX, oby + cursorY, self.fgColor) self.parent:setCursor(true, obx + cursorX, oby + cursorY, self.fgColor)
self:updateDraw()
return true return true
end end
end; end,
mouseHandler = function(self, event, button, x, y) charHandler = function(self, char)
if (base.mouseHandler(self, event, button, x, y)) then if(base.charHandler(self, char))then
local obx, oby = self:getAnchorPosition()
local w,h = self:getSize()
lines[textY] = lines[textY]:sub(1, textX - 1) .. char .. lines[textY]:sub(textX, lines[textY]:len())
fgLines[textY] = fgLines[textY]:sub(1, textX - 1) .. tHex[self.fgColor] .. fgLines[textY]:sub(textX, fgLines[textY]:len())
bgLines[textY] = bgLines[textY]:sub(1, textX - 1) .. tHex[self.bgColor] .. bgLines[textY]:sub(textX, bgLines[textY]:len())
textX = textX + 1
if (textX >= w + wIndex) then
wIndex = wIndex + 1
end
updateColors(self)
self:setValue("")
local cursorX = (textX <= lines[textY]:len() and textX - 1 or lines[textY]:len()) - (wIndex - 1)
if (cursorX > self.x + w - 1) then
cursorX = self.x + w - 1
end
local cursorY = (textY - hIndex < h and textY - hIndex or textY - hIndex - 1)
if (cursorX < 1) then
cursorX = 0
end
self.parent:setCursor(true, obx + cursorX, oby + cursorY, self.fgColor)
self:updateDraw()
return true
end
end,
dragHandler = function(self, button, x, y)
if (base.dragHandler(self, button, x, y)) then
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition()) local obx, oby = self:getAbsolutePosition(self:getAnchorPosition())
local anchx, anchy = self:getAnchorPosition() local anchx, anchy = self:getAnchorPosition()
local w,h = self:getSize() local w,h = self:getSize()
if (event == "mouse_click")or(event=="monitor_touch") then
if (lines[y - oby + hIndex] ~= nil) then if (lines[y - oby + hIndex] ~= nil) then
if(anchx+w > anchx + x - (obx+1)+ wIndex)and(anchx < anchx + x - obx+ wIndex)then
textX = x - obx + wIndex textX = x - obx + wIndex
textY = y - oby + hIndex textY = y - oby + hIndex
if (textX > lines[textY]:len()) then if (textX > lines[textY]:len()) then
@@ -459,29 +490,19 @@ return function(name)
if (self.parent ~= nil) then if (self.parent ~= nil) then
self.parent:setCursor(true, anchx + textX - wIndex, anchy + textY - hIndex, self.fgColor) self.parent:setCursor(true, anchx + textX - wIndex, anchy + textY - hIndex, self.fgColor)
end end
self:updateDraw()
end end
end end
if (event == "mouse_drag") then return true
if (lines[y - oby + hIndex] ~= nil) then
textX = x - obx + wIndex
textY = y - oby + hIndex
if (textX > lines[textY]:len()) then
textX = lines[textY]:len() + 1
end
if (textX < wIndex) then
wIndex = textX - 1
if (wIndex < 1) then
wIndex = 1
end
end
if (self.parent ~= nil) then
self.parent:setCursor(true, anchx + textX - wIndex, anchy + textY - hIndex, self.fgColor)
end
end
end end
end,
if (event == "mouse_scroll") then scrollHandler = function(self, dir, x, y)
hIndex = hIndex + button if (base.scrollHandler(self, dir, x, y)) then
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition())
local anchx, anchy = self:getAnchorPosition()
local w,h = self:getSize()
hIndex = hIndex + dir
if (hIndex > #lines - (h - 1)) then if (hIndex > #lines - (h - 1)) then
hIndex = #lines - (h - 1) hIndex = #lines - (h - 1)
end end
@@ -497,23 +518,61 @@ return function(name)
self.parent:setCursor(false) self.parent:setCursor(false)
end end
end end
end self:updateDraw()
self:setVisualChanged()
return true return true
end end
end; end,
mouseHandler = function(self, button, x, y)
if (base.mouseHandler(self, button, x, y)) then
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition())
local anchx, anchy = self:getAnchorPosition()
if (lines[y - oby + hIndex] ~= nil) then
textX = x - obx + wIndex
textY = y - oby + hIndex
if (textX > lines[textY]:len()) then
textX = lines[textY]:len() + 1
end
if (textX < wIndex) then
wIndex = textX - 1
if (wIndex < 1) then
wIndex = 1
end
end
end
if (self.parent ~= nil) then
self.parent:setCursor(true, anchx + textX - wIndex, anchy + textY - hIndex, self.fgColor)
end
return true
end
end,
eventHandler = function(self, event, paste, p2, p3, p4)
if(base.eventHandler(self, event, paste, p2, p3, p4))then
if(event=="paste")then
if(self:isFocused())then
local w, h = self:getSize()
lines[textY] = lines[textY]:sub(1, textX - 1) .. paste .. lines[textY]:sub(textX, lines[textY]:len())
fgLines[textY] = fgLines[textY]:sub(1, textX - 1) .. tHex[self.fgColor]:rep(paste:len()) .. fgLines[textY]:sub(textX, fgLines[textY]:len())
bgLines[textY] = bgLines[textY]:sub(1, textX - 1) .. tHex[self.bgColor]:rep(paste:len()) .. bgLines[textY]:sub(textX, bgLines[textY]:len())
textX = textX + paste:len()
if (textX >= w + wIndex) then
wIndex = (textX+1)-w
end
local anchx, anchy = self:getAnchorPosition()
self.parent:setCursor(true, anchx + textX - wIndex, anchy + textY - hIndex, self.fgColor)
updateColors(self)
self:updateDraw()
end
end
end
end,
draw = function(self) draw = function(self)
if (base.draw(self)) then if (base.draw(self)) then
if (self.parent ~= nil) then if (self.parent ~= nil) then
local obx, oby = self:getAnchorPosition() local obx, oby = self:getAnchorPosition()
local w,h = self:getSize() local w,h = self:getSize()
if(self.bgColor~=false)then
self.parent:drawBackgroundBox(obx, oby, w, h, self.bgColor)
end
if(self.fgColor~=false)then
self.parent:drawForegroundBox(obx, oby, w, h, self.fgColor)
end
for n = 1, h do for n = 1, h do
local text = "" local text = ""
local bg = "" local bg = ""
@@ -530,17 +589,27 @@ return function(name)
if (space < 0) then if (space < 0) then
space = 0 space = 0
end end
text = text .. string.rep(" ", space) text = text .. rep(self.bgSymbol, space)
bg = bg .. string.rep(tHex[self.bgColor], space) bg = bg .. rep(tHex[self.bgColor], space)
fg = fg .. string.rep(tHex[self.fgColor], space) fg = fg .. rep(tHex[self.fgColor], space)
self.parent:setText(obx, oby + n - 1, text) self.parent:setText(obx, oby + n - 1, text)
self.parent:setBG(obx, oby + n - 1, bg) self.parent:setBG(obx, oby + n - 1, bg)
self.parent:setFG(obx, oby + n - 1, fg) self.parent:setFG(obx, oby + n - 1, fg)
end end
end end
self:setVisualChanged(false)
end end
end; end,
init = function(self)
self.bgColor = self.parent:getTheme("TextfieldBG")
self.fgColor = self.parent:getTheme("TextfieldText")
self.parent:addEvent("mouse_click", self)
self.parent:addEvent("mouse_scroll", self)
self.parent:addEvent("mouse_drag", self)
self.parent:addEvent("key", self)
self.parent:addEvent("char", self)
self.parent:addEvent("other_event", self)
end,
} }
return setmetatable(object, base) return setmetatable(object, base)

View File

@@ -59,6 +59,7 @@ return function(name)
error("Thread Error Occurred - " .. result) error("Thread Error Occurred - " .. result)
end end
end end
self.parent:addEvent("other_event", self)
return self return self
end; end;
@@ -71,6 +72,7 @@ return function(name)
stop = function(self, f) stop = function(self, f)
isActive = false isActive = false
self.parent:removeEvent("other_event", self)
return self return self
end; end;

View File

@@ -74,6 +74,7 @@ return function(name)
repeats = savedRepeats repeats = savedRepeats
timerObj = os.startTimer(timer) timerObj = os.startTimer(timer)
timerIsActive = true timerIsActive = true
self.parent:addEvent("other_event", self)
return self return self
end; end;
@@ -86,6 +87,7 @@ return function(name)
os.cancelTimer(timerObj) os.cancelTimer(timerObj)
end end
timerIsActive = false timerIsActive = false
self.parent:removeEvent("other_event", self)
return self return self
end; end;

View File

@@ -31,7 +31,7 @@ return { -- The default main theme for basalt!
ScrollbarBG = colors.lightGray, ScrollbarBG = colors.lightGray,
ScrollbarText = colors.gray, ScrollbarText = colors.gray,
ScrollbarSymbolColor = colors.black, ScrollbarSymbolColor = colors.black,
SliderBG = colors.lightGray, SliderBG = false,
SliderText = colors.gray, SliderText = colors.gray,
SliderSymbolColor = colors.black, SliderSymbolColor = colors.black,
SwitchBG = colors.lightGray, SwitchBG = colors.lightGray,
@@ -39,5 +39,7 @@ return { -- The default main theme for basalt!
SwitchBGSymbol = colors.black, SwitchBGSymbol = colors.black,
SwitchInactive = colors.red, SwitchInactive = colors.red,
SwitchActive = colors.green, SwitchActive = colors.green,
LabelBG = false,
LabelText = colors.black
} }