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)
theme = _theme if(type(_theme)=="table")then
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
self.parent:removeObject(self) if(isMovable)then
self.parent:addObject(self) self.parent:removeEvents(self)
end self.parent:removeObject(self)
end; self.parent:addObject(self)
for k,v in pairs(activeEvents)do
keyHandler = function(self, event, key) if(v)then
if (focusedObject ~= nil) then self.parent:addEvent(k, self)
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
if (value.eventHandler ~= nil) then for _, value in rpairs(events["other_event"][index]) do
value:eventHandler(event, p1, p2, p3, p4) if (value.eventHandler ~= nil) then
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
local xO, yO = self.parent:getOffsetInternal() if(events["mouse_click"]~=nil)then
xO = xO < 0 and math.abs(xO) or -xO self:setCursor(false)
yO = yO < 0 and math.abs(yO) or -yO for _, index in ipairs(eventZIndex["mouse_click"]) do
if (event == "mouse_drag") then if (events["mouse_click"][index] ~= nil) then
local parentX = 1 for _, value in rpairs(events["mouse_click"][index]) do
local parentY = 1
if (self.parent ~= nil) then
parentX, parentY = self.parent:getAbsolutePosition(self.parent:getAnchorPosition())
end
self:setPosition(x + dragXOffset - (parentX - 1) + xO, y + dragYOffset - (parentY - 1) + yO)
end
if (event == "mouse_up") then
self.drag = false
end
return true
end
local fx, fy = self:getAbsolutePosition(self:getAnchorPosition())
local yOff = false
if(fy-1 == y)and(self:getBorder("top"))then
y = y+1
yOff = true
end
if (base.mouseHandler(self, event, button, x, y)) then
fx = fx + xOffset;fy = fy + yOffset;
if(isScrollable)and(importantScroll)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 ~= nil) then
if (value:mouseHandler(event, button, x, y)) then if (value:mouseHandler(button, x, y)) then
focusSystem(self)
return true return true
end end
end end
end end
end end
end end
self:removeFocusedObject() end
if (self.isMoveable) then if (isMovable) then
if (x >= fx) and (x <= fx + self:getWidth() - 1) and (y == fy) and (event == "mouse_click") then local fx, fy = self:getAbsolutePosition(self:getAnchorPosition())
self.drag = true if (x >= fx) and (x <= fx + self:getWidth() - 1) and (y == fy)then
dragXOffset = fx - x isDragging = true
dragYOffset = yOff and 1 or 0 dragXOffset = fx - x
end dragYOffset = yOff and 1 or 0
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 end
end
self:removeFocusedObject()
focusSystem(self)
return true return true
end end
return false return false
end; 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()
xO = xO < 0 and math.abs(xO) or -xO
yO = yO < 0 and math.abs(yO) or -yO
local parentX = 1
local parentY = 1
if (self.parent ~= nil) then
parentX, parentY = self.parent:getAbsolutePosition(self.parent:getAnchorPosition())
end
self:setPosition(x + dragXOffset - (parentX - 1) + xO, y + dragYOffset - (parentY - 1) + yO)
self:updateDraw()
return true
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,
keyHandler = function(self, key, isHolding)
if (self:isFocused())or(self.parent==nil)then
local val = self:getEventSystem():sendEvent("key", self, "key", key)
if(val==false)then return false end
if(events["key"]~=nil)then
for _, index in pairs(eventZIndex["key"]) do
if (events["key"][index] ~= nil) then
for _, value in rpairs(events["key"][index]) do
if (value.keyHandler ~= nil) then
if (value:keyHandler(key, isHolding)) then
return true
end
end
end
end
end
end
end
return false
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,84 +1010,54 @@ 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
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition())
if(focusedObject~=focusedOBjectCache)then local anchx, anchy = self:getAnchorPosition()
if(focusedOBjectCache~=nil)then local w,h = self:getSize()
focusedOBjectCache:getFocusHandler() if (self.parent == nil) then
end if(self.bgColor~=false)then
if(focusedObject~=nil)then basaltDraw.drawBackgroundBox(anchx, anchy, w, h, self.bgColor)
focusedObject:loseFocusHandler() basaltDraw.drawTextBox(anchx, anchy, w, h, " ")
end
focusedObject = focusedOBjectCache
end end
if(self.fgColor~=false)then basaltDraw.drawForegroundBox(anchx, anchy, w, h, self.fgColor) end
local obx, oby = self:getAbsolutePosition(self:getAnchorPosition()) end
local anchx, anchy = self:getAnchorPosition() if (self.barActive) then
local w,h = self:getSize()
if (self.parent ~= nil) then if (self.parent ~= nil) then
if(self.bgColor~=false)then self.parent:writeText(anchx, anchy, utils.getTextHorizontalAlign(self.barText, w, self.barTextAlign), self.barBackground, self.barTextcolor)
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 else
if(self.bgColor~=false)then basaltDraw.writeText(anchx, anchy, utils.getTextHorizontalAlign(self.barText, w, self.barTextAlign), self.barBackground, self.barTextcolor)
basaltDraw.drawBackgroundBox(anchx, anchy, w, h, self.bgColor)
basaltDraw.drawTextBox(anchx, anchy, w, h, " ")
end
if(self.fgColor~=false)then basaltDraw.drawForegroundBox(anchx, anchy, w, h, self.fgColor) end
end end
termObject.setCursorBlink(false) if(self:getBorder("left"))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:drawBackgroundBox(anchx-1, anchy, 1, 1, self.barBackground)
else if(self.bgColor~=false)then
basaltDraw.writeText(anchx, anchy, utils.getTextHorizontalAlign(self.barText, w, self.barTextAlign), self.barBackground, self.barTextcolor) self.parent:drawBackgroundBox(anchx-1, anchy+1, 1, h-1, self.bgColor)
end
if(self:getBorder("left"))then
if (self.parent ~= nil) then
self.parent:drawBackgroundBox(anchx-1, anchy, 1, 1, self.barBackground)
if(self.bgColor~=false)then
self.parent:drawBackgroundBox(anchx-1, anchy+1, 1, h-1, self.bgColor)
end
end
end
if(self:getBorder("top"))then
if (self.parent ~= nil) then
self.parent:drawBackgroundBox(anchx-1, anchy-1, w+1, 1, self.barBackground)
end end
end end
end end
if(self:getBorder("top"))then
for _, index in rpairs(objZIndex) do
if (objects[index] ~= nil) then
for _, value in pairs(objects[index]) do
if (value.draw ~= nil) then
value:draw()
end
end
end
end
if (cursorBlink) then
termObject.setTextColor(cursorColor)
termObject.setCursorPos(xCursor, yCursor)
if (self.parent ~= nil) then if (self.parent ~= nil) then
termObject.setCursorBlink(self:isFocused()) self.parent:drawBackgroundBox(anchx-1, anchy-1, w+1, 1, self.barBackground)
else end
termObject.setCursorBlink(cursorBlink) end
end
for _, index in rpairs(objZIndex) do
if (objects[index] ~= nil) then
for _, value in pairs(objects[index]) do
if (value.draw ~= nil) then
value:draw()
end
end end
end end
self:setVisualChanged(false)
end 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)
shadowColor = color if(color==false)then
shadow = false
else
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
end if(v=="left")or(#t==1)then
if(v=="top")then borderColors["left"] = t[1]
borderTop = true end
end if(v=="top")or(#t==1)then
if(v=="right")then borderColors["top"] = t[1]
borderRight = true end
end if(v=="right")or(#t==1)then
if(v=="bottom")then borderColors["right"] = t[1]
borderBottom = true end
if(v=="bottom")or(#t==1)then
borderColors["bottom"] = t[1]
end
end end
end end
return self self:updateDraw()
end;
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;
@@ -505,59 +543,86 @@ return function(name)
end; end;
onClick = function(self, ...) onClick = 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("mouse_click", v) self:registerEvent("mouse_click", v)
self:registerEvent("monitor_touch", v) end
end
if(self.parent~=nil)then
self.parent:addEvent("mouse_click", self)
activeEvents["mouse_click"] = true
end end
end
return self return self
end; end;
onClickUp = function(self, ...) onClickUp = 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("mouse_up", v) self:registerEvent("mouse_up", v)
end
end
if(self.parent~=nil)then
self.parent:addEvent("mouse_up", self)
activeEvents["mouse_up"] = true
end end
end
return self return self
end; end;
onScroll = function(self, ...) onScroll = 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("mouse_scroll", v) self:registerEvent("mouse_scroll", v)
end
end
if(self.parent~=nil)then
self.parent:addEvent("mouse_scroll", self)
activeEvents["mouse_scroll"] = true
end end
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, ...)
for _,v in pairs(table.pack(...))do if(isEnabled)then
if(type(v)=="function")then for _,v in pairs(table.pack(...))do
self:registerEvent("key", v) if(type(v)=="function")then
self:registerEvent("char", v) self:registerEvent("key", v)
self:registerEvent("char", v)
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
end end
return self return self
@@ -582,30 +647,15 @@ return function(name)
end; end;
onKeyUp = function(self, ...) onKeyUp = 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("key_up", v) self:registerEvent("key_up", v)
end
end end
end if(self.parent~=nil)then
return self self.parent:addEvent("key_up", self)
end; 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
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
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,79 +704,122 @@ 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(objY-1 == y)and(self:getBorder("top"))then
y = y+1
yOff = true
end
if(event=="mouse_up")then
isDragging = false
end
if(isDragging)and(event=="mouse_drag")then
local xO, yO, parentX, parentY = 0, 0, 1, 1
if (self.parent ~= nil) then
xO, yO = self.parent:getOffsetInternal()
xO = xO < 0 and math.abs(xO) or -xO
yO = yO < 0 and math.abs(yO) or -yO
parentX, parentY = self.parent:getAbsolutePosition(self.parent:getAnchorPosition())
end
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)
end
if (objX <= x) and (objX + w > x) and (objY <= y) and (objY + h > y) then if (objX <= x) and (objX + w > x) and (objY <= y) and (objY + h > y) then
if(event=="mouse_click")then
isDragging = true
dragStartX, dragStartY = x, y
dragXOffset, dragYOffset = objX - x, objY - y
end
if(event~="mouse_drag")then
if(event~="mouse_up")then
if (self.parent ~= nil) then
self.parent:setFocusedObject(self)
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 end
return false return false
end; end,
keyHandler = function(self, event, key) mouseHandler = function(self, button, x, y, isMon)
if(isEnabled)then if(self:isCoordsInObject(x, y))then
if (self:isFocused()) then local val = eventSystem:sendEvent("mouse_click", self, "mouse_click", button, x, y, isMon)
local val = eventSystem:sendEvent(event, self, event, key) if(val==false)then return false end
if(val~=nil)then return val end if(self.parent~=nil)then
return true self.parent:setFocusedObject(self)
end end
isDragging = true
dragStartX, dragStartY = x, y
return true
end end
return false return false
end; end,
backgroundKeyHandler = function(self, event, key) mouseUpHandler = function(self, button, x, y)
if(isEnabled)then isDragging = false
local val = eventSystem:sendEvent("background_"..event, self, event, key) 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
return false
end,
dragHandler = function(self, button, x, y)
if(isDragging)then
local xO, yO, parentX, parentY = 0, 0, 1, 1
if (self.parent ~= nil) then
xO, yO = self.parent:getOffsetInternal()
xO = xO < 0 and math.abs(xO) or -xO
yO = yO < 0 and math.abs(yO) or -yO
parentX, parentY = self.parent:getAbsolutePosition(self.parent:getAnchorPosition())
end
local dX, dY = x + dragXOffset - (parentX - 1) + xO, y + dragYOffset - (parentY - 1) + yO
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(val~=nil)then return val end
if(self.parent~=nil)then
self.parent:setFocusedObject(self)
end
return true
end end
return true
if(self:isCoordsInObject(x, y))then
local objX, objY = self:getAbsolutePosition(self:getAnchorPosition())
dragStartX, dragStartY = x, y
dragXOffset, dragYOffset = objX - x, objY - y
end
return false
end,
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)
end
return true
end
return false
end,
keyHandler = function(self, key, isHolding)
if(isEnabled)and(isVisible)then
if (self:isFocused()) then
local val = eventSystem:sendEvent("key", self, "key", key, isHolding)
if(val==false)then return false end
return true
end
end
return false
end; end;
keyUpHandler = function(self, key)
if(isEnabled)and(isVisible)then
if (self:isFocused()) then
local val = eventSystem:sendEvent("key_up", self, "key_up", key)
if(val==false)then return false end
return true
end
end
return false
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()))
setFG(x, y, rep(tHex[fgCol], text:len())) end
if(fgCol~=nil)and(fgCol~=false)then
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
local splitString = function(str, sep) log(errMsg, "Error")
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 end
local words = splitString(errMsg, " ")
local line = "Basalt error: " local text = createText("Basalt error: "..errMsg, w)
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] yPos = yPos + 1
else
baseTerm.write(line)
line = words[n]
yPos = yPos + 1
end
if(n==#words)then
baseTerm.write(line)
end
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
if(monFrames[p1]~=nil)then end
monFrames[p1]:mouseHandler(event, p1, p2, p3, p4) if(event == "monitor_touch") then
activeFrame = monFrames[p1] if(monFrames[p1]~=nil)then
end monFrames[p1]:mouseHandler(1, p2, p3, true)
activeFrame = monFrames[p1]
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
v:eventHandler(event, p1, p2, p3, p4) 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)
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
drawFrames() local function f()
while updaterActive do drawFrames()
local event, p1, p2, p3, p4 = os.pullEventRaw() while updaterActive do
local ok, err = pCall(basaltUpdateEvent, event, p1, p2, p3, p4) basaltUpdateEvent(os.pullEventRaw())
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,55 +110,90 @@ 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
if (yOffset < 0) then local obx, oby = self:getAbsolutePosition(self:getAnchorPosition())
yOffset = 0 if(button==1)then
end if (#list > 0) then
if (button == 1) then for n = 1, dropdownH do
if (#list > dropdownH) then if (list[n + yOffset] ~= nil) then
if (yOffset > #list - dropdownH) then if (obx <= x) and (obx + dropdownW > x) and (oby + n == y) then
yOffset = #list - dropdownH 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
else
yOffset = math.min(#list - 1, 0)
end end
end end
return true
end end
self:setVisualChanged()
end end
if (base.mouseHandler(self, event, button, x, y)) then end,
isOpened = true
else scrollHandler = function(self, dir, x, y)
isOpened = false if (isOpened)and(self:isFocused()) then
yOffset = yOffset + dir
if (yOffset < 0) then
yOffset = 0
end
if (dir == 1) then
if (#list > dropdownH) then
if (yOffset > #list - dropdownH) then
yOffset = #list - dropdownH
end
else
yOffset = math.min(#list - 1, 0)
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
end end
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
textX = tostring(val):len() + 1 if(self:isFocused())then
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 local oX, oY = self.parent:getSize()
if (n == verticalAlign) then local cX, cY = #tData[1][1], #tData[1]
local oX, oY = self.parent:getSize() obx = obx or math.floor((oX - cX) / 2) + 1
local cX, cY = #tData[1][1], #tData[1] oby = oby or math.floor((oY - cY) / 2) + 1
obx = obx or math.floor((oX - cX) / 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
self:setVisualChanged(false)
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
} }

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
local w,h = self:getSize() if(scrollable)then
if (obx <= x) and (obx + w > x) and (oby <= y) and (oby + h > y) and (self:isVisible()) then local w,h = self:getSize()
if (((event == "mouse_click") or (event == "mouse_drag"))and(button==1))or(event=="monitor_touch") then yOffset = yOffset + dir
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,48 +151,49 @@ 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 local xPos = 0
if (self.parent ~= nil) then for n = 1, #list do
self.parent:setFocusedObject(self) if (list[n] ~= nil) then
end if (objX + xPos <= x + itemOffset) and (objX + xPos + list[n].text:len() + (space*2) > x + itemOffset) and (objY == y) then
if (event == "mouse_click") or (event == "monitor_touch") then self:setValue(list[n])
local xPos = 0 self:getEventSystem():sendEvent(event, self, event, 0, x, y, list[n])
for n = 1, #list do
if (list[n] ~= nil) then
if (objX + xPos <= x + itemOffset) and (objX + xPos + list[n].text:len() + (space*2) > x + itemOffset) and (objY == y) then
self:setValue(list[n])
self:getEventSystem():sendEvent(event, self, event, 0, x, y, list[n])
end
xPos = xPos + list[n].text:len() + space * 2
end end
end xPos = xPos + list[n].text:len() + space * 2
end
if (event == "mouse_scroll") and (scrollable) then
itemOffset = itemOffset + button
if (itemOffset < 0) then
itemOffset = 0
end
local mScroll = maxScroll()
if (itemOffset > mScroll) then
itemOffset = mScroll
end end
end end
self:setVisualChanged(true) self:updateDraw()
return true return true
end
end end
return false return false
end; 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
itemOffset = 0
end
local mScroll = maxScroll()
if (itemOffset > mScroll) then
itemOffset = mScroll
end
self:updateDraw()
end
return true
end
return false
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; return false
end,
keyHandler = function(self, event, key) mouseUpHandler = function(self, button, x, y)
base.keyHandler(self, event, key) if (base.mouseUpHandler(self, button, x, y)) then
if (self:isFocused()) then mouseEvent(self, "mouse_up", button, x, y)
if (curProcess == nil) then return true
return false
end
if not (curProcess:isDead()) then
if not (paused) then
if (self.draw) then
curProcess:resume(event, key)
end
end
end
end end
end; return false
end,
scrollHandler = function(self, dir, x, y)
if (base.scrollHandler(self, dir, x, y)) then
mouseEvent(self, "mouse_scroll", dir, x, y)
return true
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
return false
end,
keyHandler = function(self, key, isHolding)
if(base.keyHandler(self, key, isHolding))then
keyEvent(self, "key", key, isHolding)
return true
end
return false
end,
keyUpHandler = function(self, key)
if(base.keyUpHandler(self, key))then
keyEvent(self, "key_up", key)
return true
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,38 +686,54 @@ 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 (curProcess == nil) then if(base.eventHandler(self, event, p1, p2, p3, p4))then
return if (curProcess == nil) then
end return
if not (curProcess:isDead()) then end
if not (paused) then if(event=="dynamicValueEvent")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 local w, h = pWindow.getSize()
curProcess:resume(event, p1, p2, p3, p4) 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 end
if (self:isFocused()) then pWindow.basalt_reposition(self:getAnchorPosition())
local obx, oby = self:getAnchorPosition()
local xCur, yCur = pWindow.getCursorPos() end
if (self.parent ~= nil) then if not (curProcess:isDead()) then
local w,h = self:getSize() if not (paused) then
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 if(event ~= "terminate") then
self.parent:setCursor(pWindow.getCursorBlink(), obx + xCur - 1, yCur + oby - 1, pWindow.getTextColor()) curProcess:resume(event, p1, p2, p3, p4)
end
if (self:isFocused()) then
local obx, oby = self:getAnchorPosition()
local xCur, yCur = pWindow.getCursorPos()
if (self.parent ~= nil) then
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
if (event == "terminate") then
log(self:isFocused())
curProcess:resume(event)
self.parent:setCursor(false)
return true
end end
end end
else
if (event == "terminate") and (self:isFocused()) then
self:stop()
end
end
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,23 +111,23 @@ 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 (#list > 0) then
if ((event == "mouse_click")and(button==1))or(event=="monitor_touch") then local obx, oby = self:getAbsolutePosition(self:getAnchorPosition())
if (#list > 0) then 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() + 1 >= x) and (oby + value.y - 1 == y) then
if (obx + value.x - 1 <= x) and (obx + value.x - 1 + value.text:len() + 2 >= x) and (oby + value.y - 1 == y) then self:setValue(value)
self:setValue(value) local val = self:getEventSystem():sendEvent("mouse_click", self, "mouse_click", button, x, y)
if (self.parent ~= nil) then if(val==false)then return val end
self.parent:setFocusedObject(self) if(self.parent~=nil)then
end self.parent:setFocusedObject(self)
self:getEventSystem():sendEvent(event, self, event, button, x, y)
self:setVisualChanged()
return true
end end
self:updateDraw()
return true
end end
end end
end end
@@ -139,24 +135,32 @@ return function(name)
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 if (value == self:getValue()) then
if (value == self:getValue()) then if (align == "left") then
if (align == "left") then self.parent:writeText(value.x + obx - 1, value.y + oby - 1, symbol, boxSelectedBG, boxSelectedFG)
self.parent:writeText(value.x + obx - 1, value.y + oby - 1, symbol, boxSelectedBG, boxSelectedFG) self.parent:writeText(value.x + 2 + obx - 1, value.y + oby - 1, value.text, itemSelectedBG, itemSelectedFG)
self.parent:writeText(value.x + 2 + obx - 1, value.y + oby - 1, value.text, itemSelectedBG, itemSelectedFG)
end
else
self.parent:drawBackgroundBox(value.x + obx - 1, value.y + oby - 1, 1, 1, boxNotSelectedBG or self.bgColor)
self.parent:writeText(value.x + 2 + obx - 1, value.y + oby - 1, value.text, value.bgCol, value.fgCol)
end end
else
self.parent:drawBackgroundBox(value.x + obx - 1, value.y + oby - 1, 1, 1, boxNotSelectedBG or self.bgColor)
self.parent:writeText(value.x + 2 + obx - 1, value.y + oby - 1, value.text, value.bgCol, value.fgCol)
end end
end end
self:setVisualChanged(false) return true
end 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)
local w,h = self:getSize()
if (((event == "mouse_click") or (event == "mouse_drag")) and (button == 1))or(event=="monitor_touch") then
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
index = 1
end
index = math.min(index, (barType == "vertical" and h or w) - (symbolSize - 1))
self:setValue(maxValue / (barType == "vertical" and h or w) * index)
end
return true return true
end end
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()
index = index + dir
if (index < 1) then
index = 1
end
index = math.min(index, (barType == "vertical" and h or w) - (symbolSize - 1))
self:setValue(maxValue / (barType == "vertical" and h or w) * index)
self:updateDraw()
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)
local w,h = self:getSize()
if (((event == "mouse_click") or (event == "mouse_drag")) and (button == 1))or(event=="monitor_touch") then
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
index = 1
end
index = math.min(index, (barType == "vertical" and h or w) - (symbolSize - 1))
self:setValue(maxValue / (barType == "vertical" and h or w) * index)
end
return true return true
end end
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()
index = index + dir
if (index < 1) then
index = 1
end
index = math.min(index, (barType == "vertical" and h or w) - (symbolSize - 1))
self:setValue(maxValue / (barType == "vertical" and h or w) * index)
self:updateDraw()
return true
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()) self:updateDraw()
end
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,61 +490,89 @@ 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
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
if (event == "mouse_scroll") then
hIndex = hIndex + button
if (hIndex > #lines - (h - 1)) then
hIndex = #lines - (h - 1)
end
if (hIndex < 1) then
hIndex = 1
end
if (self.parent ~= nil) then
if (obx + textX - wIndex >= obx and obx + textX - wIndex < obx + w) and (oby + textY - hIndex >= oby and oby + textY - hIndex < oby + h) then
self.parent:setCursor(true, anchx + textX - wIndex, anchy + textY - hIndex, self.fgColor)
else
self.parent:setCursor(false)
end
end
end
self:setVisualChanged()
return true return true
end end
end; end,
scrollHandler = function(self, dir, x, y)
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
hIndex = #lines - (h - 1)
end
if (hIndex < 1) then
hIndex = 1
end
if (self.parent ~= nil) then
if (obx + textX - wIndex >= obx and obx + textX - wIndex < obx + w) and (oby + textY - hIndex >= oby and oby + textY - hIndex < oby + h) then
self.parent:setCursor(true, anchx + textX - wIndex, anchy + textY - hIndex, self.fgColor)
else
self.parent:setCursor(false)
end
end
self:updateDraw()
return true
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
} }