Compare commits
16 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
859303e7a1 | ||
|
|
51f6ebe7ce | ||
|
|
4d227af9d9 | ||
|
|
cf4f15e659 | ||
|
|
a3291544ac | ||
|
|
0503aa1274 | ||
|
|
299b23a6c2 | ||
|
|
8b3b6f3490 | ||
|
|
d1792ac537 | ||
|
|
709cf66ce8 | ||
|
|
ae14d85a6b | ||
|
|
896e8179a6 | ||
|
|
2dd3bf648b | ||
|
|
c977410a41 | ||
|
|
23b94d076b | ||
|
|
b10ec1770c |
127
Basalt/Frame.lua
127
Basalt/Frame.lua
@@ -3,6 +3,7 @@ local _OBJECTS = require("loadObjects")
|
||||
local BasaltDraw = require("basaltDraw")
|
||||
local utils = require("utils")
|
||||
local layout = require("layout")
|
||||
local basaltMon = require("basaltMon")
|
||||
local uuid = utils.uuid
|
||||
local rpairs = utils.rpairs
|
||||
local xmlValue = utils.getValueFromXML
|
||||
@@ -27,6 +28,7 @@ return function(name, parent, pTerm, basalt)
|
||||
|
||||
local monSide = ""
|
||||
local isMonitor = false
|
||||
local isGroupedMonitor = false
|
||||
local monitorAttached = false
|
||||
local dragXOffset = 0
|
||||
local dragYOffset = 0
|
||||
@@ -138,7 +140,7 @@ return function(name, parent, pTerm, basalt)
|
||||
if (value == obj) then
|
||||
table.remove(events[a][c], key)
|
||||
if(self.parent~=nil)then
|
||||
if(tableCount(events[event])<=0)then
|
||||
if(tableCount(events[a])<=0)then
|
||||
self.parent:removeEvent(a, self)
|
||||
end
|
||||
end
|
||||
@@ -148,13 +150,23 @@ return function(name, parent, pTerm, basalt)
|
||||
end
|
||||
end
|
||||
|
||||
local function removeObject(obj)
|
||||
local function removeObject(self, obj)
|
||||
for a, b in pairs(objects) do
|
||||
for key, value in pairs(b) do
|
||||
if (value == obj) then
|
||||
table.remove(objects[a], key)
|
||||
removeEvents(object, obj)
|
||||
return true;
|
||||
if(type(obj)=="string")then
|
||||
if (value:getName() == obj) then
|
||||
table.remove(objects[a], key)
|
||||
removeEvents(object, value)
|
||||
self:updateDraw()
|
||||
return true;
|
||||
end
|
||||
else
|
||||
if (value == obj) then
|
||||
table.remove(objects[a], key)
|
||||
removeEvents(object, value)
|
||||
self:updateDraw()
|
||||
return true;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -375,6 +387,7 @@ return function(name, parent, pTerm, basalt)
|
||||
|
||||
setFocusedObject = function(self, obj)
|
||||
focusedObjectCache = obj
|
||||
focusSystem(self)
|
||||
return self
|
||||
end;
|
||||
|
||||
@@ -451,6 +464,7 @@ return function(name, parent, pTerm, basalt)
|
||||
|
||||
removeFocusedObject = function(self)
|
||||
focusedObjectCache = nil
|
||||
focusSystem(self)
|
||||
return self
|
||||
end;
|
||||
|
||||
@@ -520,8 +534,10 @@ return function(name, parent, pTerm, basalt)
|
||||
base.show(self)
|
||||
if(self.parent==nil)then
|
||||
basalt.setActiveFrame(self)
|
||||
if(isMonitor)then
|
||||
if(isMonitor)and not(isGroupedMonitor)then
|
||||
basalt.setMonitorFrame(monSide, self)
|
||||
elseif(isGroupedMonitor)then
|
||||
basalt.setMonitorFrame(self:getName(), self, monSide)
|
||||
else
|
||||
basalt.setMainFrame(self)
|
||||
end
|
||||
@@ -532,11 +548,15 @@ return function(name, parent, pTerm, basalt)
|
||||
hide = function (self)
|
||||
base.hide(self)
|
||||
if(self.parent==nil)then
|
||||
if(activeFrame == self)then activeFrame = nil end
|
||||
if(isMonitor)then
|
||||
if(activeFrame == self)then activeFrame = nil end -- bug activeFrame always nil
|
||||
if(isMonitor)and not(isGroupedMonitor)then
|
||||
if(basalt.getMonitorFrame(monSide) == self)then
|
||||
basalt.setActiveFrame(nil)
|
||||
end
|
||||
elseif(isGroupedMonitor)then
|
||||
if(basalt.getMonitorFrame(self:getName()) == self)then
|
||||
basalt.setActiveFrame(nil)
|
||||
end
|
||||
else
|
||||
if(basalt.getMainFrame() == self)then
|
||||
basalt.setMainFrame(nil)
|
||||
@@ -640,25 +660,47 @@ return function(name, parent, pTerm, basalt)
|
||||
return self
|
||||
end,
|
||||
|
||||
setMonitor = function(self, side)
|
||||
setMonitorScale = function(self, scale)
|
||||
if(isMonitor)then
|
||||
termObject.setTextScale(scale)
|
||||
end
|
||||
return self
|
||||
end,
|
||||
|
||||
setMonitor = function(self, side, scale)
|
||||
if(side~=nil)and(side~=false)then
|
||||
if(peripheral.getType(side)=="monitor")then
|
||||
termObject = peripheral.wrap(side)
|
||||
if(type(side)=="string")then
|
||||
if(peripheral.getType(side)=="monitor")then
|
||||
termObject = peripheral.wrap(side)
|
||||
monitorAttached = true
|
||||
end
|
||||
if(self.parent~=nil)then
|
||||
self.parent:removeObject(self)
|
||||
end
|
||||
isMonitor = true
|
||||
basalt.setMonitorFrame(side, self)
|
||||
elseif(type(side)=="table")then
|
||||
termObject = basaltMon(side)
|
||||
monitorAttached = true
|
||||
|
||||
isMonitor = true
|
||||
isGroupedMonitor = true
|
||||
basalt.setMonitorFrame(self:getName(), self, true)
|
||||
end
|
||||
if(self.parent~=nil)then
|
||||
self.parent:removeObject(self)
|
||||
end
|
||||
isMonitor = true
|
||||
basalt.setMonitorFrame(side, self)
|
||||
else
|
||||
termObject = parentTerminal
|
||||
isMonitor = false
|
||||
if(basalt.getMonitorFrame(monSide)==self)then
|
||||
basalt.setMonitorFrame(monSide, nil)
|
||||
isGroupedMonitor = false
|
||||
if(type(monSide)=="string")then
|
||||
if(basalt.getMonitorFrame(monSide)==self)then
|
||||
basalt.setMonitorFrame(monSide, nil)
|
||||
end
|
||||
else
|
||||
if(basalt.getMonitorFrame(self:getName())==self)then
|
||||
basalt.setMonitorFrame(self:getName(), nil)
|
||||
end
|
||||
end
|
||||
end
|
||||
if(scale~=nil)then termObject.setTextScale(scale) end
|
||||
basaltDraw = BasaltDraw(termObject)
|
||||
self:setSize(termObject.getSize())
|
||||
autoSize = true
|
||||
@@ -715,8 +757,18 @@ return function(name, parent, pTerm, basalt)
|
||||
end
|
||||
if(isMonitor)then
|
||||
if(autoSize)then
|
||||
if(event=="monitor_resize")and(p1==monSide)then
|
||||
self:setSize(termObject.getSize())
|
||||
if(event=="monitor_resize")then
|
||||
if(type(monSide)=="string")then
|
||||
self:setSize(termObject.getSize())
|
||||
elseif(type(monSide)=="table")then
|
||||
for k,v in pairs(monSide)do
|
||||
for a,b in pairs(v)do
|
||||
if(p1==b)then
|
||||
self:setSize(termObject.getSize())
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
autoSize = true
|
||||
self:updateDraw()
|
||||
end
|
||||
@@ -750,7 +802,12 @@ return function(name, parent, pTerm, basalt)
|
||||
end
|
||||
end,
|
||||
|
||||
mouseHandler = function(self, button, x, y)
|
||||
mouseHandler = function(self, button, x, y, _, side)
|
||||
if(isGroupedMonitor)then
|
||||
if(termObject.calculateClick~=nil)then
|
||||
x, y = termObject.calculateClick(side, x, y)
|
||||
end
|
||||
end
|
||||
if(base.mouseHandler(self, button, x, y))then
|
||||
if(events["mouse_click"]~=nil)then
|
||||
self:setCursor(false)
|
||||
@@ -776,7 +833,6 @@ return function(name, parent, pTerm, basalt)
|
||||
end
|
||||
end
|
||||
self:removeFocusedObject()
|
||||
focusSystem(self)
|
||||
return true
|
||||
end
|
||||
return false
|
||||
@@ -832,7 +888,6 @@ return function(name, parent, pTerm, basalt)
|
||||
end
|
||||
end
|
||||
self:removeFocusedObject()
|
||||
focusSystem(self)
|
||||
if(yOffset==cache)then return false end
|
||||
return true
|
||||
end
|
||||
@@ -853,14 +908,16 @@ return function(name, parent, pTerm, basalt)
|
||||
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
|
||||
if(self:isVisible())and(self:isEnabled())then
|
||||
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
|
||||
@@ -1069,9 +1126,7 @@ return function(name, parent, pTerm, basalt)
|
||||
return addObject(obj)
|
||||
end;
|
||||
|
||||
removeObject = function(self, obj)
|
||||
return removeObject(obj)
|
||||
end;
|
||||
removeObject = removeObject,
|
||||
|
||||
getObject = function(self, obj)
|
||||
return getObject(obj)
|
||||
|
||||
@@ -56,17 +56,21 @@ return function(name)
|
||||
isVisible = false
|
||||
self:updateDraw()
|
||||
return self
|
||||
end;
|
||||
end,
|
||||
|
||||
enable = function(self)
|
||||
isEnabled = true
|
||||
return self
|
||||
end;
|
||||
end,
|
||||
|
||||
disable = function(self)
|
||||
isEnabled = false
|
||||
return self
|
||||
end;
|
||||
end,
|
||||
|
||||
isEnabled = function(self)
|
||||
return isEnabled
|
||||
end,
|
||||
|
||||
generateXMLEventFunction = function(self, func, val)
|
||||
local createF = function(str)
|
||||
@@ -415,39 +419,44 @@ return function(name)
|
||||
end
|
||||
if(borderColors["left"]~=false)then
|
||||
self.parent:drawTextBox(x-1, y, 1, h, "\149")
|
||||
self.parent:drawBackgroundBox(x-1, y, 1, h, borderColors["left"])
|
||||
self.parent:drawForegroundBox(x-1, y, 1, h, self.parent.bgColor)
|
||||
self.parent:drawBackgroundBox(x-1, y, 1, h, self.bgColor)
|
||||
self.parent:drawForegroundBox(x-1, y, 1, h, borderColors["left"])
|
||||
end
|
||||
if(borderColors["left"]~=false)and(borderColors["top"]~=false)then
|
||||
self.parent:drawTextBox(x-1, y-1, 1, 1, "\151")
|
||||
self.parent:drawBackgroundBox(x-1, y-1, 1, 1, borderColors["left"])
|
||||
self.parent:drawForegroundBox(x-1, y-1, 1, 1, self.parent.bgColor)
|
||||
self.parent:drawBackgroundBox(x-1, y-1, 1, 1, self.bgColor)
|
||||
self.parent:drawForegroundBox(x-1, y-1, 1, 1, borderColors["left"])
|
||||
end
|
||||
if(borderColors["top"]~=false)then
|
||||
|
||||
self.parent:drawTextBox(x, y-1, w, 1, "\131")
|
||||
self.parent:drawBackgroundBox(x, y-1, w, 1, borderColors["top"])
|
||||
self.parent:drawForegroundBox(x, y-1, w, 1, self.parent.bgColor)
|
||||
self.parent:drawBackgroundBox(x, y-1, w, 1, self.bgColor)
|
||||
self.parent:drawForegroundBox(x, y-1, w, 1, borderColors["top"])
|
||||
end
|
||||
if(borderColors["top"]~=false)and(borderColors["right"]~=false)then
|
||||
self.parent:drawTextBox(x+w, y-1, 1, 1, "\148")
|
||||
self.parent:drawForegroundBox(x+w, y-1, 1, 1, borderColors["right"])
|
||||
self.parent:drawForegroundBox(x+w, y-1, 1, 1, self.bgColor)
|
||||
self.parent:drawBackgroundBox(x+w, y-1, 1, 1, borderColors["right"])
|
||||
end
|
||||
if(borderColors["right"]~=false)then
|
||||
self.parent:drawTextBox(x+w, y, 1, h, "\149")
|
||||
self.parent:drawForegroundBox(x+w, y, 1, h, borderColors["right"])
|
||||
self.parent:drawForegroundBox(x+w, y, 1, h, self.bgColor)
|
||||
self.parent:drawBackgroundBox(x+w, y, 1, h, borderColors["right"])
|
||||
end
|
||||
if(borderColors["right"]~=false)and(borderColors["bottom"]~=false)then
|
||||
self.parent:drawTextBox(x+w, y+h, 1, 1, "\129")
|
||||
self.parent:drawForegroundBox(x+w, y+h, 1, 1, borderColors["right"])
|
||||
self.parent:drawTextBox(x+w, y+h, 1, 1, "\133")
|
||||
self.parent:drawForegroundBox(x+w, y+h, 1, 1, self.bgColor)
|
||||
self.parent:drawBackgroundBox(x+w, y+h, 1, 1, borderColors["right"])
|
||||
end
|
||||
if(borderColors["bottom"]~=false)then
|
||||
self.parent:drawTextBox(x, y+h, w, 1, "\131")
|
||||
self.parent:drawForegroundBox(x, y+h, w, 1, borderColors["bottom"])
|
||||
self.parent:drawTextBox(x, y+h, w, 1, "\143")
|
||||
self.parent:drawForegroundBox(x, y+h, w, 1, self.bgColor)
|
||||
self.parent:drawBackgroundBox(x, y+h, w, 1, borderColors["bottom"])
|
||||
end
|
||||
if(borderColors["bottom"]~=false)and(borderColors["left"]~=false)then
|
||||
self.parent:drawTextBox(x-1, y+h, 1, 1, "\130")
|
||||
self.parent:drawForegroundBox(x-1, y+h, 1, 1, borderColors["left"])
|
||||
self.parent:drawTextBox(x-1, y+h, 1, 1, "\138")
|
||||
self.parent:drawForegroundBox(x-1, y+h, 1, 1, self.bgColor)
|
||||
self.parent:drawBackgroundBox(x-1, y+h, 1, 1, borderColors["left"])
|
||||
end
|
||||
end
|
||||
draw = false
|
||||
|
||||
@@ -181,7 +181,7 @@ return function(drawTerm)
|
||||
isBlinking = terminal.getCursorBlink()
|
||||
end
|
||||
terminal.setCursorBlink(false)
|
||||
if(mirrorTerm~=nil)then terminal.setCursorBlink(false) end
|
||||
if(mirrorTerm~=nil)then mirrorTerm.setCursorBlink(false) end
|
||||
for n = 1, height do
|
||||
terminal.setCursorPos(1, n)
|
||||
terminal.blit(cacheT[n], cacheFG[n], cacheBG[n])
|
||||
|
||||
199
Basalt/libraries/basaltMon.lua
Normal file
199
Basalt/libraries/basaltMon.lua
Normal file
@@ -0,0 +1,199 @@
|
||||
-- Right now this doesn't support scroll(n)
|
||||
-- Because this lbirary is mainly made for basalt - it doesn't need scroll support, maybe i will add it in the future
|
||||
|
||||
local tHex = {
|
||||
[colors.white] = "0",
|
||||
[colors.orange] = "1",
|
||||
[colors.magenta] = "2",
|
||||
[colors.lightBlue] = "3",
|
||||
[colors.yellow] = "4",
|
||||
[colors.lime] = "5",
|
||||
[colors.pink] = "6",
|
||||
[colors.gray] = "7",
|
||||
[colors.lightGray] = "8",
|
||||
[colors.cyan] = "9",
|
||||
[colors.purple] = "a",
|
||||
[colors.blue] = "b",
|
||||
[colors.brown] = "c",
|
||||
[colors.green] = "d",
|
||||
[colors.red] = "e",
|
||||
[colors.black] = "f",
|
||||
}
|
||||
|
||||
local type,len,rep,sub = type,string.len,string.rep,string.sub
|
||||
|
||||
|
||||
return function (monitorNames)
|
||||
local monitors = {}
|
||||
for k,v in pairs(monitorNames)do
|
||||
monitors[k] = {}
|
||||
for a,b in pairs(v)do
|
||||
local mon = peripheral.wrap(b)
|
||||
if(mon==nil)then
|
||||
error("Unable to find monitor "..b)
|
||||
end
|
||||
monitors[k][a] = mon
|
||||
monitors[k][a].name = b
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
local x,y,monX,monY,monW,monH,w,h = 1,1,1,1,0,0,0,0
|
||||
local blink,scale = false,1
|
||||
local fg,bg = colors.white,colors.black
|
||||
|
||||
|
||||
local function calcSize()
|
||||
local maxW,maxH = 0,0
|
||||
for k,v in pairs(monitors)do
|
||||
local _maxW,_maxH = 0,0
|
||||
for a,b in pairs(v)do
|
||||
local nw,nh = b.getSize()
|
||||
_maxW = _maxW + nw
|
||||
_maxH = nh > _maxH and nh or _maxH
|
||||
end
|
||||
maxW = maxW > _maxW and maxW or _maxW
|
||||
maxH = maxH + _maxH
|
||||
end
|
||||
w,h = maxW,maxH
|
||||
end
|
||||
calcSize()
|
||||
|
||||
local function calcPosition()
|
||||
local relY = 0
|
||||
local mX,mY = 0,0
|
||||
for k,v in pairs(monitors)do
|
||||
local relX = 0
|
||||
local _mh = 0
|
||||
for a,b in pairs(v)do
|
||||
local mw,mh = b.getSize()
|
||||
if(x-relX>=1)and(x-relX<=mw)then
|
||||
mX = a
|
||||
end
|
||||
b.setCursorPos(x-relX, y-relY)
|
||||
relX = relX + mw
|
||||
if(_mh<mh)then _mh = mh end
|
||||
end
|
||||
if(y-relY>=1)and(y-relY<=_mh)then
|
||||
mY = k
|
||||
end
|
||||
relY = relY + _mh
|
||||
end
|
||||
monX,monY = mX,mY
|
||||
end
|
||||
calcPosition()
|
||||
|
||||
local function call(f, ...)
|
||||
local t = {...}
|
||||
return function()
|
||||
for k,v in pairs(monitors)do
|
||||
for a,b in pairs(v)do
|
||||
b[f](table.unpack(t))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function cursorBlink()
|
||||
call("setCursorBlink", false)()
|
||||
if not(blink)then return end
|
||||
if(monitors[monY]==nil)then return end
|
||||
local mon = monitors[monY][monX]
|
||||
if(mon==nil)then return end
|
||||
mon.setCursorBlink(blink)
|
||||
end
|
||||
|
||||
local function blit(text, tCol, bCol)
|
||||
if(monitors[monY]==nil)then return end
|
||||
local mon = monitors[monY][monX]
|
||||
if(mon==nil)then return end
|
||||
mon.blit(text, tCol, bCol)
|
||||
local mW, mH = mon.getSize()
|
||||
if(len(text)+x>mW)then
|
||||
local monRight = monitors[monY][monX+1]
|
||||
if(monRight~=nil)then
|
||||
monRight.blit(text, tCol, bCol)
|
||||
monX = monX + 1
|
||||
x = x + len(text)
|
||||
end
|
||||
end
|
||||
calcPosition()
|
||||
end
|
||||
|
||||
return {
|
||||
clear = call("clear"),
|
||||
|
||||
setCursorBlink = function(_blink)
|
||||
blink = _blink
|
||||
cursorBlink()
|
||||
end,
|
||||
|
||||
getCursorBlink = function()
|
||||
return blink
|
||||
end,
|
||||
|
||||
getCursorPos = function()
|
||||
return x, y
|
||||
end,
|
||||
|
||||
setCursorPos = function(newX,newY)
|
||||
x, y = newX, newY
|
||||
calcPosition()
|
||||
cursorBlink()
|
||||
end,
|
||||
|
||||
setTextScale = function(_scale)
|
||||
call("setTextScale", _scale)()
|
||||
calcSize()
|
||||
calcPosition()
|
||||
scale = _scale
|
||||
end,
|
||||
|
||||
getTextScale = function()
|
||||
return scale
|
||||
end,
|
||||
|
||||
blit = function(text,fgCol,bgCol)
|
||||
blit(text,fgCol,bgCol)
|
||||
end,
|
||||
|
||||
write = function(text)
|
||||
text = tostring(text)
|
||||
local l = len(text)
|
||||
blit(text, rep(tHex[fg], l), rep(tHex[bg], l))
|
||||
end,
|
||||
|
||||
getSize = function()
|
||||
return w,h
|
||||
end,
|
||||
|
||||
setBackgroundColor = function(col)
|
||||
call("setBackgroundColor", col)()
|
||||
bg = col
|
||||
end,
|
||||
|
||||
setTextColor = function(col)
|
||||
call("setTextColor", col)()
|
||||
fg = col
|
||||
end,
|
||||
|
||||
calculateClick = function(name, xClick, yClick)
|
||||
local relY = 0
|
||||
for k,v in pairs(monitors)do
|
||||
local relX = 0
|
||||
local maxY = 0
|
||||
for a,b in pairs(v)do
|
||||
local wM,hM = b.getSize()
|
||||
if(b.name==name)then
|
||||
return xClick + relX, yClick + relY
|
||||
end
|
||||
relX = relX + wM
|
||||
if(hM > maxY)then maxY = hM end
|
||||
end
|
||||
relY = relY + maxY
|
||||
end
|
||||
return xClick, yClick
|
||||
end,
|
||||
|
||||
}
|
||||
end
|
||||
@@ -7,9 +7,17 @@ function process:new(path, window, ...)
|
||||
local newP = setmetatable({ path = path }, { __index = self })
|
||||
newP.window = window
|
||||
newP.processId = processId
|
||||
if(type(path)=="string")then
|
||||
newP.coroutine = coroutine.create(function()
|
||||
shell.execute(path, table.unpack(args))
|
||||
end)
|
||||
elseif(type(path)=="function")then
|
||||
newP.coroutine = coroutine.create(function()
|
||||
path(table.unpack(args))
|
||||
end)
|
||||
else
|
||||
return
|
||||
end
|
||||
processes[processId] = newP
|
||||
processId = processId + 1
|
||||
return newP
|
||||
@@ -22,7 +30,6 @@ function process:resume(event, ...)
|
||||
self.filter=nil
|
||||
end
|
||||
local ok, result = coroutine.resume(self.coroutine, event, ...)
|
||||
self.window = term.current()
|
||||
if ok then
|
||||
self.filter = result
|
||||
else
|
||||
|
||||
@@ -5,15 +5,16 @@ local utils = require("utils")
|
||||
local log = require("basaltLogs")
|
||||
local uuid = utils.uuid
|
||||
local createText = utils.createText
|
||||
local count = utils.tableCount
|
||||
|
||||
|
||||
local baseTerm = term.current()
|
||||
local version = "1.6.0"
|
||||
local version = "1.6.2"
|
||||
local debugger = true
|
||||
|
||||
local projectDirectory = fs.getDir(table.pack(...)[2] or "")
|
||||
|
||||
local activeKey, frames, monFrames, variables, schedules = {}, {}, {}, {}, {}
|
||||
local activeKey, frames, monFrames, monGroups, variables, schedules = {}, {}, {}, {}, {}, {}
|
||||
local mainFrame, activeFrame, focusedObject, updaterActive
|
||||
|
||||
local basalt = {}
|
||||
@@ -74,12 +75,19 @@ local bInstance = {
|
||||
end,
|
||||
|
||||
getMonitorFrame = function(name)
|
||||
return monFrames[name]
|
||||
return monFrames[name] or monGroups[name][1]
|
||||
end,
|
||||
|
||||
setMonitorFrame = function(name, frame)
|
||||
setMonitorFrame = function(name, frame, isGroupedMon)
|
||||
if(mainFrame == frame)then mainFrame = nil end
|
||||
monFrames[name] = frame
|
||||
if(isGroupedMon)then
|
||||
monGroups[name] = {frame, sides}
|
||||
else
|
||||
monFrames[name] = frame
|
||||
end
|
||||
if(frame==nil)then
|
||||
monGroups[name] = nil
|
||||
end
|
||||
end,
|
||||
|
||||
getBaseTerm = function()
|
||||
@@ -145,6 +153,10 @@ local function drawFrames()
|
||||
v:draw()
|
||||
v:updateTerm()
|
||||
end
|
||||
for _,v in pairs(monGroups)do
|
||||
v[1]:draw()
|
||||
v[1]:updateTerm()
|
||||
end
|
||||
end
|
||||
|
||||
local function basaltUpdateEvent(event, p1, p2, p3, p4)
|
||||
@@ -169,8 +181,15 @@ local function basaltUpdateEvent(event, p1, p2, p3, p4)
|
||||
monFrames[p1]:mouseHandler(1, p2, p3, true)
|
||||
activeFrame = monFrames[p1]
|
||||
end
|
||||
if(count(monGroups)>0)then
|
||||
for k,v in pairs(monGroups)do
|
||||
v[1]:mouseHandler(1, p2, p3, true, p1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
if(event == "char")then
|
||||
if(activeFrame~=nil)then
|
||||
activeFrame:charHandler(p1)
|
||||
|
||||
@@ -61,7 +61,7 @@ return function(name)
|
||||
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)
|
||||
self.parent:setCursor(true, obx + textX - wIndex, oby+math.floor(self:getHeight()/2), self.fgColor)
|
||||
end
|
||||
end
|
||||
self:updateDraw()
|
||||
@@ -179,13 +179,15 @@ return function(name)
|
||||
local obx, oby = self:getAnchorPosition()
|
||||
local val = tostring(base.getValue())
|
||||
local cursorX = (textX <= val:len() and textX - 1 or val:len()) - (wIndex - 1)
|
||||
|
||||
if (cursorX > self.x + w - 1) then
|
||||
cursorX = self.x + w - 1
|
||||
|
||||
local inpX = self:getX()
|
||||
if (cursorX > inpX + w - 1) then
|
||||
cursorX = inpX + 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
|
||||
return true
|
||||
end
|
||||
@@ -249,11 +251,22 @@ return function(name)
|
||||
wIndex = 1
|
||||
end
|
||||
end
|
||||
self.parent:setCursor(true, obx + textX-1, oby+math.max(math.ceil(h/2-1, 1)), self.fgColor)
|
||||
self.parent:setCursor(true, ax + textX - wIndex, ay+math.max(math.ceil(h/2-1, 1)), self.fgColor)
|
||||
return true
|
||||
end
|
||||
end,
|
||||
|
||||
dragHandler = function(self, btn, x, y, xOffset, yOffset)
|
||||
if(self:isFocused())then
|
||||
if(self:isCoordsInObject(x, y))then
|
||||
if(base.dragHandler(self, btn, x, y, xOffset, yOffset))then
|
||||
return true
|
||||
end
|
||||
end
|
||||
self.parent:removeFocusedObject()
|
||||
end
|
||||
end,
|
||||
|
||||
eventHandler = function(self, event, paste, p2, p3, p4)
|
||||
if(base.eventHandler(self, event, paste, p2, p3, p4))then
|
||||
if(event=="paste")then
|
||||
@@ -333,7 +346,7 @@ return function(name)
|
||||
end
|
||||
end
|
||||
if(self:isFocused())then
|
||||
self.parent:setCursor(true, obx + textX - wIndex, oby+math.max(math.ceil(self:getHeight()/2-1, 1)), self.fgColor)
|
||||
self.parent:setCursor(true, obx + textX - wIndex, oby+math.floor(self:getHeight()/2), self.fgColor)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -347,6 +360,7 @@ return function(name)
|
||||
self.parent:addEvent("key", self)
|
||||
self.parent:addEvent("char", self)
|
||||
self.parent:addEvent("other_event", self)
|
||||
self.parent:addEvent("mouse_drag", self)
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
@@ -29,3 +29,4 @@
|
||||
- [Button coloring](tips/buttonColoring.md)
|
||||
- [Designing/Animating](tips/design.md)
|
||||
- [Dynamic Values](tips/dynamicvalues.md)
|
||||
- [XML](tips/xml.md)
|
||||
|
||||
487
docs/installer.lua
Normal file
487
docs/installer.lua
Normal file
@@ -0,0 +1,487 @@
|
||||
--Basalt configurated installer
|
||||
local filePath = "basalt.lua" --here you can change the file path default: basalt
|
||||
if not(fs.exists(filePath))then
|
||||
shell.run("pastebin run ESs1mg7P packed true "..filePath:gsub(".lua", "")) -- this is an alternative to the wget command
|
||||
end
|
||||
local basalt = require(filePath:gsub(".lua", "")) -- here you can change the variablename in any variablename you want default: basalt
|
||||
|
||||
local maxCoWorker = 3
|
||||
|
||||
local recipeList = {}
|
||||
local craftingQueue = {}
|
||||
local bridge = peripheral.find("rsBridge")
|
||||
local w, h = term.getSize()
|
||||
|
||||
local main = basalt.createFrame()
|
||||
local home = main:addFrame():setPosition(1,2):setBackground(colors.lightGray):setSize(w, h-2)
|
||||
local recipes = main:addFrame():setPosition(1,2):setBackground(colors.lightGray):hide()
|
||||
local log = main:addFrame():setPosition(1,2):setBackground(colors.lightGray):hide()
|
||||
|
||||
local menuBar = main:addMenubar():addItem("Home"):addItem("Recipes"):addItem("Log"):setBackground(colors.gray):setSize(w, 1):setSpace(6):setScrollable():show()
|
||||
menuBar:onChange(function(self)
|
||||
home:hide()
|
||||
recipes:hide()
|
||||
log:hide()
|
||||
if(self:getValue().text=="Home")then
|
||||
home:show()
|
||||
elseif(self:getValue().text=="Recipes")then
|
||||
recipes:show()
|
||||
elseif(self:getValue().text=="Log")then
|
||||
log:show()
|
||||
end
|
||||
end)
|
||||
|
||||
local function buttonVisuals(btn)
|
||||
btn:onClick(basalt.schedule(function() btn:setBackground(colors.black) btn:setForeground(colors.lightGray) os.sleep(0.1) btn:setBackground(colors.gray) btn:setForeground(colors.black) end))
|
||||
end
|
||||
|
||||
local coworkerCount = home:addLabel():setText(maxCoWorker):setPosition(45,2):show()
|
||||
home:addLabel():setText("Co-Worker:"):setPosition(32,2):show()
|
||||
buttonVisuals(home:addButton():setText(">"):setSize(1,1):setPosition(47,2):onClick(function() if(maxCoWorker<100)then maxCoWorker = maxCoWorker+1 end coworkerCount:setText(maxCoWorker) end):show())
|
||||
buttonVisuals(home:addButton():setText("<"):setSize(1,1):setPosition(43,2):onClick(function() if(maxCoWorker>1)then maxCoWorker = maxCoWorker-1 end coworkerCount:setText(maxCoWorker) end):show())
|
||||
|
||||
local logList = log:addList():setPosition(2,2):setSize(w-2,h-3):setScrollable(false):show()
|
||||
local jobList = home:addList():setPosition(20,4):setSize(30,10):show()
|
||||
local rList = recipes:addList():setPosition(13,2):setSize(38,16):show()
|
||||
|
||||
local function logging(text)
|
||||
logList:addItem(text)
|
||||
if(logList:getItemCount()>h-3)then
|
||||
logList:removeItem(1)
|
||||
end
|
||||
end
|
||||
|
||||
logging("Loading autocrafter...")
|
||||
|
||||
function SaveToFile()
|
||||
local file = io.open("recipes", "wb")
|
||||
local sel = rList:getItemIndex()
|
||||
rList:clear()
|
||||
for _,v in pairs(recipeList)do
|
||||
if(v.useDmg)then
|
||||
file:write(v.name.."|"..v.damage.."|"..v.minAmount.."|"..v.maxCraftAmount.."|true|", "\n")
|
||||
else
|
||||
file:write(v.name.."|"..v.damage.."|"..v.minAmount.."|"..v.maxCraftAmount.."|false|", "\n")
|
||||
end
|
||||
rList:addItem(v.minAmount.."x "..v.name..":"..v.damage, nil, nil, v)
|
||||
end
|
||||
rList:selectItem(sel)
|
||||
file:close()
|
||||
end
|
||||
|
||||
buttonVisuals(recipes:addButton():setPosition(2,2):setText("Remove"):setSize(8,1):onClick(function()
|
||||
if(rList:getValue()~=nil)then
|
||||
local sel = rList:getValue().args[1]
|
||||
for k,v in pairs(recipeList)do
|
||||
if(v.name==sel.name)and(tonumber(v.damage)==tonumber(sel.damage))then
|
||||
table.remove(recipeList, k)
|
||||
logging("Removed recipe: "..v.name..":"..v.damage)
|
||||
SaveToFile()
|
||||
end
|
||||
end
|
||||
end
|
||||
end))
|
||||
local changeAmn = recipes:addInput():setPosition(4,4):setSize(5,1):setInputType("number"):setForeground(colors.black):setDefaultText("32", colors.black):onChange(function(self)
|
||||
local val = tonumber(self:getValue()) or 32
|
||||
if(val<0)then
|
||||
self:setValue(0)
|
||||
end
|
||||
end)
|
||||
buttonVisuals(recipes:addButton():setPosition(2,4):setSize(1,1):setText("-"):onClick(function()
|
||||
local val = tonumber(changeAmn:getValue()) or 32
|
||||
if(rList:getValue()~=nil)then
|
||||
local sel = rList:getValue().args[1]
|
||||
if(val>0)and(sel.name~=nil)and(sel.damage~=nil)then
|
||||
for k,v in pairs(recipeList)do
|
||||
if(v.name==sel.name)and(tonumber(v.damage)==tonumber(sel.damage))then
|
||||
v.minAmount = v.minAmount - val
|
||||
if(v.minAmount < 0)then v.minAmount = 0 end
|
||||
SaveToFile()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end))
|
||||
buttonVisuals(recipes:addButton():setPosition(10,4):setSize(1,1):setText("+"):onClick(function()
|
||||
local val = tonumber(changeAmn:getValue()) or 32
|
||||
if(rList:getValue()~=nil)then
|
||||
local sel = rList:getValue().args[1]
|
||||
if(val>0)and(sel.name~=nil)and(sel.damage~=nil)then
|
||||
for k,v in pairs(recipeList)do
|
||||
if(v.name==sel.name)and(tonumber(v.damage)==tonumber(sel.damage))then
|
||||
v.minAmount = v.minAmount + val
|
||||
SaveToFile()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end))
|
||||
|
||||
buttonVisuals(recipes:addButton():setPosition(2,6):setSize(8,1):setText("Set"):onClick(function()
|
||||
local val = tonumber(changeAmn:getValue()) or 32
|
||||
if(rList:getValue()~=nil)then
|
||||
local sel = rList:getValue().args[1]
|
||||
if(val>0)and(sel.name~=nil)and(sel.damage~=nil)then
|
||||
for k,v in pairs(recipeList)do
|
||||
if(v.name==sel.name)and(tonumber(v.damage)==tonumber(sel.damage))then
|
||||
v.minAmount = val
|
||||
SaveToFile()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end))
|
||||
|
||||
local rItemFrame = home:addFrame():setPosition(7,3):setBackground(colors.gray):setSize(27,6):setMoveable(true):setBar("Remove Item", colors.black, colors.lightGray):showBar():hide()
|
||||
rItemFrame:addButton():setPosition(1,1):setAnchor("topRight"):setSize(1,1):setBackground(colors.black):setForeground(colors.lightGray):setText("x"):onClick(function() rItemFrame:hide() end):show()
|
||||
rItemFrame:addLabel():setText("Item ID:"):setPosition(2,3):show()
|
||||
local ritemId = rItemFrame:addInput("itemid"):setPosition(12,3):setSize(15,1):setBackground(colors.black):setForeground(colors.lightGray):setDefaultText("minecraft:stick", colors.gray):show()
|
||||
rItemFrame:addButton():setPosition(-7,0):setAnchor("bottomRight"):setSize(8,1):setBackground(colors.black):setForeground(colors.lightGray):setText("Remove"):onClick(function()
|
||||
local id = ritemId:getValue()
|
||||
|
||||
for k,v in pairs(recipeList)do
|
||||
if(v.name==id)then
|
||||
table.remove(recipeList, k)
|
||||
logging("Removed recipe: "..v.name..":"..v.damage)
|
||||
end
|
||||
end
|
||||
SaveToFile()
|
||||
end)
|
||||
|
||||
|
||||
local aItemFrame = home:addFrame():setPosition(7,3):setBackground(colors.gray):setSize(27,12):setMoveable(true):setBar("Add Item", colors.black, colors.lightGray):showBar():hide()
|
||||
aItemFrame:addLabel():setText("Item ID:"):setPosition(2,3)
|
||||
aItemFrame:addLabel():setText("Damage:"):setPosition(2,5)
|
||||
aItemFrame:addLabel():setText("Count:"):setPosition(2,7)
|
||||
aItemFrame:addLabel():setText("Max:"):setPosition(2,9)
|
||||
aItemFrame:addLabel():setText("Use Damage:"):setAnchor("bottomLeft"):setPosition(4,0)
|
||||
local itemId = aItemFrame:addInput():setPosition(12,3):setSize(15,1):setBackground(colors.black):setForeground(colors.lightGray):setDefaultText("minecraft:stick", colors.gray)
|
||||
local itemDamage = aItemFrame:addInput():setPosition(12,5):setSize(15,1):setBackground(colors.black):setForeground(colors.lightGray):setInputType("number"):setDefaultText("0", colors.gray)
|
||||
local itemCount = aItemFrame:addInput():setPosition(12,7):setSize(15,1):setBackground(colors.black):setForeground(colors.lightGray):setInputType("number"):setDefaultText("64", colors.gray)
|
||||
local itemMaxCount = aItemFrame:addInput():setPosition(12,9):setSize(15,1):setBackground(colors.black):setForeground(colors.lightGray):setInputType("number"):setDefaultText("0", colors.gray)
|
||||
local useDamage = aItemFrame:addCheckbox():setAnchor("bottomLeft"):setPosition(2,0):setBackground(colors.black):setForeground(colors.lightGray):setValue(true)
|
||||
aItemFrame:addButton():setAnchor("topRight"):setPosition(1,1):setSize(1,1):setBackground(colors.black):setForeground(colors.lightGray):setText("x"):onClick(function() aItemFrame:hide() end)
|
||||
aItemFrame:addButton():setAnchor("bottomRight"):setPosition(-4,0):setSize(5,1):setBackground(colors.black):setForeground(colors.lightGray):setText("Add"):onClick(function()
|
||||
local id = itemId:getValue()
|
||||
local dmg = itemDamage:getValue() == "" and 0 or itemDamage:getValue()
|
||||
local count = itemCount:getValue() == "" and 64 or itemCount:getValue()
|
||||
local maxCount = itemMaxCount:getValue() == "" and 0 or itemMaxCount:getValue()
|
||||
local usedamage = useDamage:getValue() or true
|
||||
if(id~="")then
|
||||
local itemExist = false
|
||||
for k,v in pairs(recipeList)do
|
||||
if(v.name==id)then
|
||||
if(usedamage)then
|
||||
if(v.damage==dmg)then
|
||||
itemExist = true
|
||||
v.minAmount = count or 64
|
||||
v.maxCraftAmount = maxCount or 0
|
||||
logging("Edited recipe: "..(count).."x "..id..":"..dmg)
|
||||
end
|
||||
else
|
||||
itemExist = true
|
||||
v.minAmount = count or 64
|
||||
v.maxCraftAmount = maxCount or 0
|
||||
logging("Edited recipe: "..(count).."x "..id..":"..dmg)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(itemExist == false)then
|
||||
table.insert(recipeList, {name = id, damage = dmg or 0, minAmount = count, maxCraftAmount = maxCount or 0, useDmg = usedamage, fails = 0, timer = 0})
|
||||
logging("Added recipe: "..(count).."x "..id..":"..dmg)
|
||||
end
|
||||
SaveToFile()
|
||||
else
|
||||
logging("Please set a ID.")
|
||||
end
|
||||
end)
|
||||
|
||||
buttonVisuals(home:addButton():setText("Add Item"):setSize(12,3):setPosition(2,6):onClick(function() aItemFrame:show() aItemFrame:setFocus() end):show())
|
||||
buttonVisuals(home:addButton():setText("Remove Item"):setSize(12,3):setPosition(2,10):onClick(function() rItemFrame:show() rItemFrame:setFocus() end):show())
|
||||
|
||||
local function StringSeperate(str, seperator)
|
||||
local words = {}
|
||||
local word = ""
|
||||
|
||||
if(string.sub(str, str:len(), str:len())~=seperator)then
|
||||
str = str..""..seperator
|
||||
end
|
||||
for x=1,str:len() do
|
||||
local s = string.sub(str,x,x)
|
||||
if(s==seperator)then
|
||||
table.insert(words, word)
|
||||
word = ""
|
||||
else
|
||||
word = word..s
|
||||
end
|
||||
end
|
||||
return words
|
||||
end
|
||||
|
||||
if not(fs.exists("recipes"))then
|
||||
fs.open("recipes","w").close()
|
||||
end
|
||||
|
||||
local f = fs.open("recipes", "r")
|
||||
for line in f.readLine do
|
||||
local tab = StringSeperate(line, "|")
|
||||
if(tab[1]~=nil)and(tab[2]~=nil)and(tab[3]~=nil)and(tab[4]~=nil)and(tab[5]~=nil)then
|
||||
logging("Registered recipe: "..tab[3].."x "..tab[1]..":"..tab[2])
|
||||
local recipe = {name=tab[1],damage=tonumber(tab[2]),minAmount=tonumber(tab[3]),maxCraftAmount=tonumber(tab[4]),fails=0,timer=0}
|
||||
if(tab[5]=="true")then
|
||||
recipe.useDmg=true
|
||||
else
|
||||
recipe.useDmg=false
|
||||
end
|
||||
rList:addItem(recipe.minAmount.."x "..recipe.name..":"..recipe.damage, nil, nil, recipe)
|
||||
table.insert(recipeList, recipe)
|
||||
end
|
||||
end
|
||||
f.close()
|
||||
|
||||
local function findKeyWithItemName(table, itemname, damage)
|
||||
for k,v in pairs(table)do
|
||||
if(v.name==itemname)and(v.damage == damage)then
|
||||
return k
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
local scanChestBtn = home:addButton("scanChest"):setText("Scan Chest"):setSize(12,3):setPosition(2,2):show()
|
||||
local function checkChestForNewEntrys()
|
||||
scanChestBtn:setText("Scanning..")
|
||||
local inventory = peripheral.find("minecraft:chest")
|
||||
local items = {}
|
||||
local itemAmounts = {}
|
||||
local somethingChanged = false
|
||||
|
||||
if(inventory~=nil)then
|
||||
for x=1,inventory.size(), 1 do
|
||||
local item = inventory.getItemDetail(x)
|
||||
if(item~=nil)then
|
||||
if(item.damage==nil)then item.damage = 0 end
|
||||
table.insert(items, item)
|
||||
end
|
||||
os.sleep(0.1)
|
||||
end
|
||||
else
|
||||
logging("No chest available!")
|
||||
end
|
||||
|
||||
if(#items > 0)then
|
||||
for _,v in pairs(items)do
|
||||
local key = findKeyWithItemName(itemAmounts, v.name, v.damage)
|
||||
if(key~=nil)then
|
||||
itemAmounts[key].count = itemAmounts[key].count + v.count
|
||||
else
|
||||
table.insert( itemAmounts, {name=v.name, damage=v.damage, count = v.count})
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(#itemAmounts > 0)then
|
||||
for _,v in pairs(itemAmounts)do
|
||||
local key = findKeyWithItemName(recipeList, v.name, v.damage)
|
||||
if(key~=nil)then
|
||||
if(recipeList[key].minAmount ~= v.count)then
|
||||
logging("Edited recipe: "..v.name.. ":"..v.damage.." new count: "..v.count)
|
||||
end
|
||||
somethingChanged = true
|
||||
recipeList[key].minAmount = v.count
|
||||
else
|
||||
table.insert( recipeList, {name=v.name, damage=v.damage, minAmount = v.count, maxCraftAmount = 0, useDmg = true, fails = 0, timer = 0})
|
||||
somethingChanged = true
|
||||
logging("Registered recipe: "..v.count.."x "..v.name.. ":"..v.damage)
|
||||
end
|
||||
end
|
||||
if(somethingChanged)then
|
||||
SaveToFile()
|
||||
end
|
||||
end
|
||||
scanChestBtn:setText("Scan Chest")
|
||||
logging("Scanning chest done.")
|
||||
end
|
||||
|
||||
local chestScanThread = main:addThread("chestScanThread")
|
||||
buttonVisuals(scanChestBtn:onClick(function() chestScanThread:start(checkChestForNewEntrys) end))
|
||||
|
||||
|
||||
local function GetAmount(itemAmount, recipe)
|
||||
local amount = 0
|
||||
if(itemAmount < recipe.minAmount)then
|
||||
if(recipe.maxCraftAmount > 0)then
|
||||
if(recipe.minAmount-itemAmount > recipe.maxCraftAmount)then
|
||||
amount = recipe.maxCraftAmount
|
||||
else
|
||||
amount = recipe.minAmount-itemAmount
|
||||
end
|
||||
else
|
||||
amount = recipe.minAmount-itemAmount
|
||||
end
|
||||
end
|
||||
return amount
|
||||
end
|
||||
|
||||
function GetRecipeKey(pattern)
|
||||
for k,v in pairs(recipeList)do
|
||||
if(v.name == pattern.name)then
|
||||
if(pattern.damage==nil)then return k end
|
||||
if(v.useDmg)then
|
||||
if(v.damage == pattern.damage)then
|
||||
return k
|
||||
end
|
||||
else
|
||||
return k
|
||||
end
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
local function CheckCraftingRecipe(recipe)
|
||||
local pattern = bridge.getItem({name=recipe.name})
|
||||
local item = {pattern=pattern, amount=0}
|
||||
if(pattern~=nil)then
|
||||
local storedAmount = pattern.amount
|
||||
local neededItemAmount = GetAmount(storedAmount, recipe)
|
||||
if(neededItemAmount > 0)then
|
||||
item.amount = neededItemAmount
|
||||
table.insert(craftingQueue, item)
|
||||
return true
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function RemoveRecipe(item)
|
||||
local key = -1
|
||||
for k,v in pairs(recipeList)do
|
||||
if(v.name == item.name)and(v.damage== item.damage)then
|
||||
key = k
|
||||
end
|
||||
end
|
||||
if(key>=0)then
|
||||
table.remove(recipeList, key)
|
||||
end
|
||||
SaveToFile()
|
||||
end
|
||||
|
||||
local function FindKeyInTable(table, item)
|
||||
for k,v in pairs(table)do
|
||||
if(v==item)then
|
||||
return k
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
local function CheckAllRecipes()
|
||||
for _,v in pairs(recipeList)do
|
||||
if(type(v)=="table")then
|
||||
CheckCraftingRecipe(v)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function jobCrafting(coworker, item)
|
||||
if(jobList:getItem(coworker)~=nil)then
|
||||
jobList:editItem(coworker, "Co-Worker "..coworker..": "..item.amountToCraft.."x "..item.item.displayName:gsub(" ", ""))
|
||||
else
|
||||
jobList:addItem("Co-Worker "..coworker..": "..item.amountToCraft.."x "..item.item.displayName:gsub(" ", ""))
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
local function jobDone(coworker)
|
||||
if(jobList:getItem(coworker)~=nil)then
|
||||
jobList:editItem(coworker, "Co-Worker "..coworker..": waiting...")
|
||||
else
|
||||
jobList:addItem("Co-Worker "..coworker..": waiting...")
|
||||
end
|
||||
end
|
||||
|
||||
local coWorkerId = 1
|
||||
local function UpdateCraftingQueue()
|
||||
while(#craftingQueue > 0)do
|
||||
local activeCoWorkers = {}
|
||||
local craftingQueuesToRemove = {}
|
||||
for _,v in pairs(craftingQueue)do
|
||||
if(#activeCoWorkers+1 <= maxCoWorker)then
|
||||
local stack = v.pattern
|
||||
local recipeKey = GetRecipeKey(stack)
|
||||
|
||||
local waittimer = 0
|
||||
local multiplier = 1
|
||||
|
||||
if(recipeList[recipeKey].fails > 0)and(recipeList[recipeKey].fails <=10)then
|
||||
multiplier = recipeList[recipeKey].fails
|
||||
elseif(recipeList[recipeKey].fails > 10)then
|
||||
multiplier = 20
|
||||
end
|
||||
waittimer = multiplier * 30
|
||||
if(os.clock()>=recipeList[recipeKey].timer+waittimer)then
|
||||
if not(bridge.isItemCrafting(stack.name))then
|
||||
local currentItemState = {item=stack, curAmount = stack.count, amountToCraft = v.amount}
|
||||
if(bridge.isItemCraftable({name=stack.name}))then
|
||||
local task, errormsg = bridge.craftItem({name=stack.name, count = v.amount})
|
||||
if(task)then
|
||||
logging("Sheduled Task: "..v.amount.." ("..stack.name..") "..stack.displayName:gsub(" ", ""))
|
||||
jobCrafting(coWorkerId, currentItemState)
|
||||
currentItemState.coWorker = coWorkerId
|
||||
coWorkerId = coWorkerId + 1
|
||||
if(coWorkerId > maxCoWorker)then coWorkerId = 1 end
|
||||
table.insert(activeCoWorkers, currentItemState)
|
||||
recipeList[recipeKey].fails = 0
|
||||
else
|
||||
logging("Error sheduling task: "..v.amount.."x ("..stack.name..") "..stack.displayName:gsub(" ", ""))
|
||||
logging("Not enough materials!")
|
||||
recipeList[recipeKey].fails = recipeList[recipeKey].fails + 1
|
||||
recipeList[recipeKey].timer = os.clock()
|
||||
end
|
||||
else
|
||||
logging("Error sheduling task: "..v.amount.."x ("..stack.name..") "..stack.displayName:gsub(" ", ""))
|
||||
logging("No pattern available!")
|
||||
recipeList[recipeKey].fails = recipeList[recipeKey].fails + 1
|
||||
recipeList[recipeKey].timer = os.clock()
|
||||
end
|
||||
end
|
||||
end
|
||||
table.insert(craftingQueuesToRemove, v)
|
||||
end
|
||||
end
|
||||
|
||||
if(#craftingQueuesToRemove > 0)then
|
||||
for _,v in pairs(craftingQueuesToRemove)do
|
||||
local id = FindKeyInTable(craftingQueue, v)
|
||||
table.remove(craftingQueue, id)
|
||||
end
|
||||
end
|
||||
|
||||
while(#activeCoWorkers > 0)do
|
||||
local finishedCoworker = {}
|
||||
for _,v in pairs(activeCoWorkers)do
|
||||
if not(bridge.isItemCrafting(v.item.name))then
|
||||
logging("Task done: "..v.amountToCraft.."x ("..v.item.name..") "..v.item.displayName:gsub(" ", ""))
|
||||
table.insert(finishedCoworker, v)
|
||||
end
|
||||
end
|
||||
if(#finishedCoworker>0)then
|
||||
for _,v in pairs(finishedCoworker)do
|
||||
local id = FindKeyInTable(activeCoWorkers, v)
|
||||
table.remove(activeCoWorkers, id)
|
||||
jobDone(v.coWorker)
|
||||
end
|
||||
end
|
||||
os.sleep(0.75)
|
||||
end
|
||||
os.sleep(0.75)
|
||||
end
|
||||
end
|
||||
|
||||
main:addThread("craftingThread"):start(function() while true do CheckAllRecipes() os.sleep(1) UpdateCraftingQueue() os.sleep(1) end end)
|
||||
|
||||
logging("Autocrafter successfully loaded!")
|
||||
|
||||
basalt.autoUpdate()
|
||||
@@ -14,7 +14,7 @@ Changes the background color while the animation is running
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local testButton = mainFrame:addButton("buttonToAnimate")
|
||||
local aAnimation = mainFrame:addAnimation():setObject(testButton):changeTextColor({colors.red, colors.yellow, colors.green}, 2):play()
|
||||
local aAnimation = mainFrame:addAnimation():setObject(testButton):changeTextColor(2, 0, colors.red, colors.yellow, colors.green):play()
|
||||
```
|
||||
```xml
|
||||
<animation object="buttonToAnimate" play="true">
|
||||
|
||||
@@ -14,7 +14,7 @@ Changes the text while animation is running
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local testButton = mainFrame:addButton("buttonToAnimate")
|
||||
local aAnimation = mainFrame:addAnimation():setObject(testButton):changeText({"i", "am", "groot"}, 2):play()
|
||||
local aAnimation = mainFrame:addAnimation():setObject(testButton):changeText(2, 0, "i", "am", "groot"):play()
|
||||
```
|
||||
```xml
|
||||
<animation object="buttonToAnimate" play="true">
|
||||
|
||||
@@ -14,7 +14,7 @@ Changes the text color while the animation is running
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local testButton = mainFrame:addButton("buttonToAnimate")
|
||||
local aAnimation = mainFrame:addAnimation():setObject(testButton):changeTextColor({colors.red, colors.yellow, colors.green}, 2):play()
|
||||
local aAnimation = mainFrame:addAnimation():setObject(testButton):changeTextColor(2, 0, colors.red, colors.yellow, colors.green):play()
|
||||
```
|
||||
```xml
|
||||
<animation object="buttonToAnimate" play="true">
|
||||
|
||||
@@ -24,13 +24,13 @@ end)
|
||||
|
||||
and this would be the xml way:
|
||||
```lua
|
||||
local main = basalt.createFrame():addLayout("example.xml")
|
||||
|
||||
basalt.setVariable("buttonClick", function(self,event,button,x,y)
|
||||
if(event=="mouse_click")and(button==1)then
|
||||
basalt.debug("Left mousebutton got clicked!")
|
||||
end
|
||||
end)
|
||||
|
||||
local main = basalt.createFrame():addLayout("example.xml")
|
||||
```
|
||||
```xml
|
||||
<button onClick="buttonClick" text="Click" />
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
## setSymbol
|
||||
Changes the checkbox symbol, default is "\42"
|
||||
|
||||
#### Parameters:
|
||||
1. `string` symbol
|
||||
|
||||
#### Returns:
|
||||
1. `object` The object in use
|
||||
|
||||
#### Usage:
|
||||
* Creates a new checkbox and changes the symbol to o
|
||||
```lua
|
||||
local main = basalt.createFrame()
|
||||
local checkbox = main:addCheckbox():setSymbol("o")
|
||||
```
|
||||
```xml
|
||||
<checkbox symbol="o" />
|
||||
```
|
||||
@@ -10,6 +10,7 @@ some special functionality to create very advanced programs.
|
||||
|[setBarTextAlign](objects/Frame/setBarTextAlign.md)|Sets the top bars text align - deprecated
|
||||
|[showBar](objects/Frame/showBar.md)|Shows the top bar - deprecated
|
||||
|[setMonitor](objects/Frame/setMonitor.md)|Sets the frame to be a monitor frame (only for base frames)
|
||||
|[setMonitorScale](objects/Frame/setMonitorScale.md)|Sets the monitor scale (same as monitor.setTextScale)
|
||||
|[setMirror](objects/Frame/setMirror.md)|Sets the frame to mirror onto a monitor (only for base frames)
|
||||
|[getObject](objects/Frame/getObject.md)|Returns the object by its name (or id)
|
||||
|[removeObject](objects/Frame/removeObject.md)|Removes the object by its name (or id)
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
## removeFocusedObject
|
||||
Removes the focus of the supplied object
|
||||
|
||||
#### Parameters:
|
||||
1. `object` The child object to remove focus from
|
||||
Removes the currently focused object of that frame
|
||||
|
||||
#### Returns:
|
||||
1. `frame` The frame being used
|
||||
@@ -10,7 +7,9 @@ Removes the focus of the supplied object
|
||||
#### Usage:
|
||||
* Creates a new button then removes the focus from that button when clicking on it
|
||||
```lua
|
||||
local aButton = myFrame:addButton():setFocus():onClick(function()
|
||||
myFrame:removeFocusedObject(aButton)
|
||||
local main = basalt.createFrame()
|
||||
local input = main:addInput():setFocus()
|
||||
local aButton = main:addButton():onClick(function()
|
||||
main:removeFocusedObject()
|
||||
end)
|
||||
```
|
||||
@@ -2,7 +2,7 @@
|
||||
Removes a child object from the frame
|
||||
|
||||
#### Parameters:
|
||||
1. `string` The name of the child object
|
||||
1. `string|object` The name of the child object or the object itself
|
||||
|
||||
#### Returns:
|
||||
1. `boolean` Whether the object with the given name was properly removed
|
||||
@@ -10,6 +10,9 @@ Removes a child object from the frame
|
||||
#### Usage:
|
||||
* Adds a button with the id "myFirstButton", then removes it with the aforementioned id
|
||||
```lua
|
||||
myFrame:addButton("myFirstButton")
|
||||
myFrame:removeObject("myFirstButton")
|
||||
local main = basalt.createFrame()
|
||||
main:addButton("myFirstButton"):setText("Close")
|
||||
:onClick(function(self)
|
||||
main:removeObject("myFirstButton") -- or main:removeObject(self)
|
||||
end)
|
||||
```
|
||||
@@ -1,8 +1,9 @@
|
||||
## setMonitor
|
||||
Sets this frame as a monitor frame
|
||||
You can set base frames as monitor frames, don't try to use setMonitor on sub frames
|
||||
|
||||
#### Parameters:
|
||||
1. `string` The monitor name ("right", "left",... "monitor_1", "monitor_2",...)
|
||||
1. `string|table` The monitor name ("right", "left",... "monitor_1", "monitor_2",...) OR a table to create multi-monitors (see example)
|
||||
2. `number` optional - a number between 0.5 to 5 which sets the monitor scale
|
||||
|
||||
#### Returns:
|
||||
1. `frame` The frame being used
|
||||
@@ -12,8 +13,29 @@ Sets this frame as a monitor frame
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local monitorFrame = basalt.createFrame():setMonitor("right")
|
||||
monitorFrame:setBar("Monitor 1"):showBar()
|
||||
monitorFrame:addLabel():setText("Hellooo!")
|
||||
```
|
||||
```xml
|
||||
<frame monitor="right"></frame>
|
||||
```
|
||||
|
||||
* Here is a example on how to create mutlimonitors. You always have to start on the top left of your screen and go to the bottom right, which means in this example
|
||||
monitor_1 is always your most top left monitor while monitor_6 is your most bottom right monitor.
|
||||
|
||||
Table structure:
|
||||
local monitors = {
|
||||
[y1] = {x1,x2,x3},
|
||||
[y2] = {x1,x2,x3}
|
||||
...
|
||||
}
|
||||
|
||||
```lua
|
||||
local monitors = {
|
||||
{"monitor_1", "monitor_2", "monitor_3"},
|
||||
{"monitor_4", "monitor_5", "monitor_6"}
|
||||
}
|
||||
|
||||
local mainFrame = basalt.createFrame()
|
||||
local monitorFrame = basalt.createFrame():setMonitor(monitors)
|
||||
monitorFrame:addLabel():setText("Hellooo!")
|
||||
```
|
||||
15
docs/objects/Frame/setMonitorScale.md
Normal file
15
docs/objects/Frame/setMonitorScale.md
Normal file
@@ -0,0 +1,15 @@
|
||||
## setMonitorScale
|
||||
Changes the scale on the the monitor which the frame is attached to
|
||||
|
||||
#### Parameters:
|
||||
1. `number` A number from 0.5 to 5
|
||||
|
||||
#### Returns:
|
||||
1. `frame` The frame being used
|
||||
|
||||
#### Usage:
|
||||
* Creates a new base frame, sets the frame as a monitor frame and changes the monitor scale
|
||||
```lua
|
||||
local myFrame = basalt.createFrame()setMonitor("left"):setMonitorScale(2)
|
||||
myFrame:addLabel("Monitor scale is bigger")
|
||||
```
|
||||
@@ -10,7 +10,7 @@ loads a default .nfp file into the object.
|
||||
#### Usage:
|
||||
* Creates a default image and loads a test.nfp file
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame():show()
|
||||
local mainFrame = basalt.createFrame()
|
||||
local aImage = mainFrame:addImage():loadImage("test.nfp")
|
||||
```
|
||||
```xml
|
||||
|
||||
@@ -8,6 +8,6 @@ The fontsize feature is calculated by bigfonts, a library made by Wojbie (http:/
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
|[setText](objects/Input/setInputType.md)|Sets the input type
|
||||
|[setFontSize](objects/Input/getInputType.md)|Returns the input type
|
||||
|[getFontSize](objects/Input/setDefaultText.md)|Sets the default text
|
||||
|[setText](objects/Label/setText.md)|Sets the input type
|
||||
|[setFontSize](objects/Label/setFontSize.md)|Returns the input type
|
||||
|[getFontSize](objects/Label/getFontSize.md)|Sets the default text
|
||||
|
||||
@@ -13,8 +13,8 @@ Adds a item into the list
|
||||
#### Usage:
|
||||
* Creates a default menubar with 3 entries
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local aMenubar = mainFrame:addMenubar()
|
||||
local main = basalt.createFrame()
|
||||
local aMenubar = main:addMenubar()
|
||||
:addItem("1. Entry")
|
||||
:addItem("2. Entry",colors.yellow)
|
||||
:addItem("3. Entry",colors.yellow,colors.green)
|
||||
|
||||
@@ -7,8 +7,8 @@ Removes all items.
|
||||
#### Usage:
|
||||
* Creates a default menubar with 3 entries and removes them immediatley. Which makes no sense.
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local aMenubar = mainFrame:addMenubar()
|
||||
local main = basalt.createFrame()
|
||||
local aMenubar = main:addMenubar()
|
||||
:addItem("1. Entry")
|
||||
:addItem("2. Entry",colors.yellow)
|
||||
:addItem("3. Entry",colors.yellow,colors.green)
|
||||
|
||||
@@ -14,8 +14,8 @@ Edits a item from the menubar
|
||||
#### Usage:
|
||||
* Creates a default menubar with 3 entries and edits the second one.
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local aMenubar = mainFrame:addMenubar()
|
||||
local main = basalt.createFrame()
|
||||
local aMenubar = main:addMenubar()
|
||||
:addItem("1. Entry")
|
||||
:addItem("2. Entry",colors.yellow)
|
||||
:addItem("3. Entry",colors.yellow,colors.green)
|
||||
|
||||
@@ -7,8 +7,8 @@ Returns all items as table
|
||||
#### Usage:
|
||||
* Creates a default menubar with 3 entries and prints a table.
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local aMenubar = mainFrame:addMenubar()
|
||||
local main = basalt.createFrame()
|
||||
local aMenubar = main:addMenubar()
|
||||
:addItem("1. Entry")
|
||||
:addItem("2. Entry",colors.yellow)
|
||||
:addItem("3. Entry",colors.yellow,colors.green)
|
||||
|
||||
@@ -10,8 +10,8 @@ Returns a item by index
|
||||
#### Usage:
|
||||
* Creates a default menubar with 3 entries and edits the second one.
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local aMenubar = mainFrame:addMeubar()
|
||||
local main = basalt.createFrame()
|
||||
local aMenubar = main:addMeubar()
|
||||
:addItem("1. Entry")
|
||||
:addItem("2. Entry",colors.yellow)
|
||||
:addItem("3. Entry",colors.yellow,colors.green)
|
||||
|
||||
@@ -7,8 +7,8 @@ Returns the current item count
|
||||
#### Usage:
|
||||
* Creates a default menubar with 3 entries and prints the current item count.
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local aMenubar = mainFrame:addMenubar()
|
||||
local main = basalt.createFrame()
|
||||
local aMenubar = main:addMenubar()
|
||||
:addItem("1. Entry")
|
||||
:addItem("2. Entry",colors.yellow)
|
||||
:addItem("3. Entry",colors.yellow,colors.green)
|
||||
|
||||
@@ -7,8 +7,8 @@ returns the item index of the currently selected item
|
||||
#### Usage:
|
||||
* Creates a default menubar with 3 entries selects the second entry and prints the currently selected index.
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local aMenubar = mainFrame:addMenubar()
|
||||
local main = basalt.createFrame()
|
||||
local aMenubar = main:addMenubar()
|
||||
:addItem("1. Entry")
|
||||
:addItem("2. Entry",colors.yellow)
|
||||
:addItem("3. Entry",colors.yellow,colors.green)
|
||||
|
||||
@@ -7,8 +7,8 @@ Returns the current index offset
|
||||
#### Usage:
|
||||
* Creates a default menubar with 6 entries and sets the offset to 3, also prints the current offset.
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local aMenubar = mainFrame:addMenubar()
|
||||
local main = basalt.createFrame()
|
||||
local aMenubar = main:addMenubar()
|
||||
:addItem("1. Entry")
|
||||
:addItem("2. Entry")
|
||||
:addItem("3. Entry")
|
||||
|
||||
@@ -10,8 +10,8 @@ Removes a item from the menubar
|
||||
#### Usage:
|
||||
* Creates a default menubar with 3 entries and removes the second one.
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local aMenubar = mainFrame:addMenubar()
|
||||
local main = basalt.createFrame()
|
||||
local aMenubar = main:addMenubar()
|
||||
:addItem("1. Entry")
|
||||
:addItem("2. Entry",colors.yellow)
|
||||
:addItem("3. Entry",colors.yellow,colors.green)
|
||||
|
||||
@@ -10,8 +10,8 @@ selects a item in the menubar (same as a player would click on a item)
|
||||
#### Usage:
|
||||
* Creates a default menubar with 3 entries and selects the second entry.
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local aMenubar = mainFrame:addMenubar()
|
||||
local main = basalt.createFrame()
|
||||
local aMenubar = main:addMenubar()
|
||||
:addItem("1. Entry")
|
||||
:addItem("2. Entry",colors.yellow)
|
||||
:addItem("3. Entry",colors.yellow,colors.green)
|
||||
|
||||
@@ -10,8 +10,8 @@ Sets the offset of the menubar (the same as you would scroll) - default is 0
|
||||
#### Usage:
|
||||
* Creates a default menubar with 6 entries and sets the offset to 3.
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local aMenubar = mainFrame:addMenubar()
|
||||
local main = basalt.createFrame()
|
||||
local aMenubar = main:addMenubar()
|
||||
:addItem("1. Entry")
|
||||
:addItem("2. Entry")
|
||||
:addItem("3. Entry")
|
||||
|
||||
@@ -10,8 +10,8 @@ Makes it possible to scroll while the mouse is over the menubar
|
||||
#### Usage:
|
||||
* Creates a new menubar and makes it scrollable
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local aMenubar = mainFrame:addMenubar():setScrollable(true)
|
||||
local main = basalt.createFrame()
|
||||
local aMenubar = main:addMenubar():setScrollable(true)
|
||||
:addItem("1. Entry")
|
||||
:addItem("2. Entry")
|
||||
:addItem("3. Entry")
|
||||
|
||||
@@ -11,8 +11,8 @@ Sets the background and the foreground of the item which is currently selected
|
||||
#### Usage:
|
||||
* Creates a default menubar with 4 entries and sets the selection background color to green.
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local aMenubar = mainFrame:addMenubar()
|
||||
local main = basalt.createFrame()
|
||||
local aMenubar = main:addMenubar()
|
||||
:addItem("1. Entry")
|
||||
:addItem("2. Entry",colors.yellow)
|
||||
:addItem("3. Entry",colors.yellow,colors.green)
|
||||
|
||||
27
docs/objects/Menubar/setSpace.md
Normal file
27
docs/objects/Menubar/setSpace.md
Normal file
@@ -0,0 +1,27 @@
|
||||
## setSpace
|
||||
Sets the background and the foreground of the item which is currently selected
|
||||
|
||||
#### Parameters:
|
||||
1. `number` The space you want between the entries
|
||||
|
||||
#### Returns:
|
||||
1. `object` The object in use
|
||||
|
||||
#### Usage:
|
||||
* Creates a default menubar with 4 entries and sets the space to 3.
|
||||
```lua
|
||||
local main = basalt.createFrame()
|
||||
local aMenubar = main:addMenubar()
|
||||
:addItem("1. Entry")
|
||||
:addItem("2. Entry",colors.yellow)
|
||||
:addItem("3. Entry",colors.yellow,colors.green)
|
||||
:addItem("4. Entry")
|
||||
:setSpace(3)
|
||||
```
|
||||
```xml
|
||||
<menubar selectionBG="green" selectionFG="red" space="3">
|
||||
<item><text>1. Entry</text></item>
|
||||
<item><text>2. Entry</text><bg>yellow</bg></item>
|
||||
<item><text>2. Entry</text><bg>yellow</bg><fg>green</fg></item>
|
||||
</menubar>
|
||||
```
|
||||
5
docs/objects/Object/getBackground.md
Normal file
5
docs/objects/Object/getBackground.md
Normal file
@@ -0,0 +1,5 @@
|
||||
## getBackground
|
||||
Returns the current background color
|
||||
|
||||
#### Returns:
|
||||
1. `number` color
|
||||
5
docs/objects/Object/getForeground.md
Normal file
5
docs/objects/Object/getForeground.md
Normal file
@@ -0,0 +1,5 @@
|
||||
## getForeground
|
||||
Returns the current foreground color
|
||||
|
||||
#### Returns:
|
||||
1. `number` color
|
||||
@@ -41,3 +41,24 @@ local button2 = main:addButton()
|
||||
|
||||
basalt.autoUpdate()
|
||||
```
|
||||
|
||||
Also very interesting is a button where you are able to resize the frame just by dragging the button.
|
||||
```lua
|
||||
local basalt = require("basalt")
|
||||
|
||||
local main = basalt.createFrame()
|
||||
|
||||
local sub = main:addFrame():setSize(30,12):setMovable()
|
||||
sub:addLabel():setText("Example Frame"):setSize("parent.w", 1):setBackground(colors.black):setForeground(colors.lightGray)
|
||||
|
||||
local dragButton = sub:addButton()
|
||||
:setAnchor("bottomRight")
|
||||
:setPosition(1,1)
|
||||
:setSize(1,1)
|
||||
:setText("/")
|
||||
:onDrag(function(self, button, x, y, xOffset, yOffset)
|
||||
sub:setSize(-xOffset, -yOffset, true)
|
||||
end)
|
||||
|
||||
basalt.autoUpdate()
|
||||
```
|
||||
|
||||
11
docs/objects/Object/remove.md
Normal file
11
docs/objects/Object/remove.md
Normal file
@@ -0,0 +1,11 @@
|
||||
## remove
|
||||
Removes the object from it's parent frame. This won't 'destroy' the object, It will continue to exist as long as you still have pointers to it.
|
||||
|
||||
Here is a example on how a button will be fully removed from the memory:
|
||||
```lua
|
||||
local main = basalt.createFrame()
|
||||
local button = main:addButton():setPosition(2,2):setText("Close")
|
||||
|
||||
button:remove()
|
||||
button = nil
|
||||
```
|
||||
@@ -1,108 +1,12 @@
|
||||
Scrollbars are objects, the user can scroll vertically or horizontally, this will change a value, which you can access by :getValue().<br>
|
||||
|
||||
Remember scrollbar also inherits from [Object](objects/Object.md)
|
||||
|
||||
## setSymbol
|
||||
Changes the scrollbar symbol, default is " "
|
||||
|
||||
#### Parameters:
|
||||
1. `string` symbol
|
||||
|
||||
#### Returns:
|
||||
1. `object` The object in use
|
||||
|
||||
#### Usage:
|
||||
* Creates a new scrollbar and changes the symbol to X
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local scrollbar = mainFrame:addScrollbar():setSymbol("X")
|
||||
```
|
||||
```xml
|
||||
<scrollbar symbol="X" />
|
||||
```
|
||||
|
||||
## setBackgroundSymbol
|
||||
Changes the symbol in the background, default is "\127"
|
||||
|
||||
#### Parameters:
|
||||
1. `string` symbol
|
||||
|
||||
#### Returns:
|
||||
1. `object` The object in use
|
||||
|
||||
#### Usage:
|
||||
* Creates a new scrollbar and changes the background symbol to X
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local scrollbar = mainFrame:addScrollbar():setBackgroundSymbol("X")
|
||||
```
|
||||
```xml
|
||||
<scrollbar backgroundSymbol="X" />
|
||||
```
|
||||
|
||||
## setBarType
|
||||
Changes the scrollbar to be vertical or horizontal, default is vertical
|
||||
|
||||
#### Parameters:
|
||||
1. `string` vertical or horizontal
|
||||
|
||||
#### Returns:
|
||||
1. `object` The object in use
|
||||
|
||||
#### Usage:
|
||||
* Creates a new scrollbar and changes the bar type to horizontal
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local scrollbar = mainFrame:addScrollbar():setBarType("horizontal")
|
||||
```
|
||||
```xml
|
||||
<scrollbar barType="horizontal" />
|
||||
```
|
||||
|
||||
## setMaxValue
|
||||
the default max value is always the width (if horizontal) or height (if vertical), if you change the max value the bar will always calculate the value based on its width or height - example: you set the max value to 100, the height is 10 and it is a vertical bar, this means if the bar is on top, the value is 10, if the bar goes one below, it is 20 and so on.
|
||||
|
||||
#### Parameters:
|
||||
1. `number` maximum
|
||||
|
||||
#### Returns:
|
||||
1. `object` The object in use
|
||||
|
||||
#### Usage:
|
||||
* Creates a new scrollbar and changes the max value to 20
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local scrollbar = mainFrame:addScrollbar():setMaxValue(20)
|
||||
```
|
||||
```xml
|
||||
<scrollbar maxValue="20" />
|
||||
```
|
||||
|
||||
## setIndex
|
||||
Changes the current index to your choice, for example you could create a button which scrolls up to 1 by using :setIndex(1)
|
||||
|
||||
#### Parameters:
|
||||
1. `number` the index
|
||||
|
||||
#### Returns:
|
||||
1. `object` The object in use
|
||||
|
||||
#### Usage:
|
||||
* Creates a new scrollbar and changes the index to 1 as soon as the button got clicked
|
||||
```lua
|
||||
local mainFrame = basalt.createFrame()
|
||||
local scrollbar = mainFrame:addScrollbar():setMaxValue(20)
|
||||
local button = mainFrame:addButton(function()
|
||||
scrollbar:setIndex(1)
|
||||
end)
|
||||
```
|
||||
```xml
|
||||
<scrollbar index="2" />
|
||||
```
|
||||
|
||||
## getIndex
|
||||
Returns the current index
|
||||
|
||||
#### Returns:
|
||||
1. `number` index
|
||||
[Object](objects/Object.md) methods also apply for scrollbars.
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
|[setSymbol](objects/Slider/setSymbol.md)|Sets the slider symbol
|
||||
|[setBackgroundSymbol](objects/Slider/setBackgroundSymbol.md)|Sets the background symbol
|
||||
|[setBarType](objects/Slider/setBarType.md)|Sets the bar type (vertical or horizontal)
|
||||
|[setMaxValue](objects/Slider/setMaxValue.md)|Sets the maximum value
|
||||
|[setIndex](objects/Slider/setIndex.md)|Sets the current index
|
||||
|[getIndex](objects/Slider/getIndex.md)|Returns the index
|
||||
|
||||
5
docs/objects/Scrollbar/getIndex.md
Normal file
5
docs/objects/Scrollbar/getIndex.md
Normal file
@@ -0,0 +1,5 @@
|
||||
## getIndex
|
||||
Returns the current index
|
||||
|
||||
#### Returns:
|
||||
1. `number` index
|
||||
18
docs/objects/Scrollbar/setBackgroundSymbol.md
Normal file
18
docs/objects/Scrollbar/setBackgroundSymbol.md
Normal file
@@ -0,0 +1,18 @@
|
||||
## setBackgroundSymbol
|
||||
Changes the symbol in the background, default is "\127"
|
||||
|
||||
#### Parameters:
|
||||
1. `string` symbol
|
||||
|
||||
#### Returns:
|
||||
1. `object` The object in use
|
||||
|
||||
#### Usage:
|
||||
* Creates a new scrollbar and changes the background symbol to X
|
||||
```lua
|
||||
local main = basalt.createFrame()
|
||||
local scrollbar = main:addScrollbar():setBackgroundSymbol("X")
|
||||
```
|
||||
```xml
|
||||
<scrollbar backgroundSymbol="X" />
|
||||
```
|
||||
18
docs/objects/Scrollbar/setBarType.md
Normal file
18
docs/objects/Scrollbar/setBarType.md
Normal file
@@ -0,0 +1,18 @@
|
||||
## setBarType
|
||||
Changes the scrollbar to be vertical or horizontal, default is vertical
|
||||
|
||||
#### Parameters:
|
||||
1. `string` vertical or horizontal
|
||||
|
||||
#### Returns:
|
||||
1. `object` The object in use
|
||||
|
||||
#### Usage:
|
||||
* Creates a new scrollbar and changes the bar type to horizontal
|
||||
```lua
|
||||
local main = basalt.createFrame()
|
||||
local scrollbar = main:addScrollbar():setBarType("horizontal")
|
||||
```
|
||||
```xml
|
||||
<scrollbar barType="horizontal" />
|
||||
```
|
||||
21
docs/objects/Scrollbar/setIndex.md
Normal file
21
docs/objects/Scrollbar/setIndex.md
Normal file
@@ -0,0 +1,21 @@
|
||||
## setIndex
|
||||
Changes the current index to your choice, for example you could create a button which scrolls up to 1 by using :setIndex(1)
|
||||
|
||||
#### Parameters:
|
||||
1. `number` the index
|
||||
|
||||
#### Returns:
|
||||
1. `object` The object in use
|
||||
|
||||
#### Usage:
|
||||
* Creates a new scrollbar and changes the index to 1 as soon as the button got clicked
|
||||
```lua
|
||||
local main = basalt.createFrame()
|
||||
local scrollbar = main:addScrollbar():setMaxValue(20)
|
||||
local button = main:addButton(function()
|
||||
scrollbar:setIndex(1)
|
||||
end)
|
||||
```
|
||||
```xml
|
||||
<scrollbar index="2" />
|
||||
```
|
||||
18
docs/objects/Scrollbar/setMaxValue.md
Normal file
18
docs/objects/Scrollbar/setMaxValue.md
Normal file
@@ -0,0 +1,18 @@
|
||||
## setMaxValue
|
||||
the default max value is always the width (if horizontal) or height (if vertical), if you change the max value the bar will always calculate the value based on its width or height - example: you set the max value to 100, the height is 10 and it is a vertical bar, this means if the bar is on top, the value is 10, if the bar goes one below, it is 20 and so on.
|
||||
|
||||
#### Parameters:
|
||||
1. `number` maximum
|
||||
|
||||
#### Returns:
|
||||
1. `object` The object in use
|
||||
|
||||
#### Usage:
|
||||
* Creates a new scrollbar and changes the max value to 20
|
||||
```lua
|
||||
local main = basalt.createFrame()
|
||||
local scrollbar = main:addScrollbar():setMaxValue(20)
|
||||
```
|
||||
```xml
|
||||
<scrollbar maxValue="20" />
|
||||
```
|
||||
18
docs/objects/Scrollbar/setSymbol.md
Normal file
18
docs/objects/Scrollbar/setSymbol.md
Normal file
@@ -0,0 +1,18 @@
|
||||
## setSymbol
|
||||
Changes the scrollbar symbol, default is " "
|
||||
|
||||
#### Parameters:
|
||||
1. `string` symbol
|
||||
|
||||
#### Returns:
|
||||
1. `object` The object in use
|
||||
|
||||
#### Usage:
|
||||
* Creates a new scrollbar and changes the symbol to X
|
||||
```lua
|
||||
local main = basalt.createFrame()
|
||||
local scrollbar = main:addScrollbar():setSymbol("X")
|
||||
```
|
||||
```xml
|
||||
<scrollbar symbol="X" />
|
||||
```
|
||||
79
docs/tips/xml.md
Normal file
79
docs/tips/xml.md
Normal file
@@ -0,0 +1,79 @@
|
||||
This is a basic guide on how to create a UI with XML.
|
||||
|
||||
In XML you are not able to create logic, but you could refer to logic - i will show you how.
|
||||
But first i will show you how you are able to create some basic XML design.
|
||||
|
||||
First we will need a .lua file - we need to process the XML stuff, and this is only possible in lua.
|
||||
So let's create a lua file:
|
||||
|
||||
```lua
|
||||
local basalt = require("basalt") -- as always we will need basalt
|
||||
|
||||
local main = basalt.createFrame() -- and atleast 1 base frame is needed
|
||||
|
||||
basalt.autoUpdate() -- starting the event and draw handler is also needed
|
||||
```
|
||||
|
||||
The code above you are just not able to do in XML, you are not able to create base frames and you are also not able to start the event/draw handlers.
|
||||
This can only be done in Lua.
|
||||
|
||||
In Basalt XML Code will always be loaded into frames. Which means all the objects created in XML are always childrens of that particular frame. Here is a example to show what i mean:
|
||||
|
||||
Lua:
|
||||
```lua
|
||||
local basalt = require("basalt")
|
||||
local main = basalt.createFrame():addLayout("example.xml")
|
||||
basalt.autoUpdate()
|
||||
```
|
||||
|
||||
XML:
|
||||
```xml
|
||||
<button x="5" y="3" text="Hello" />
|
||||
```
|
||||
|
||||
This would be exactly the same like if you would use the following lua code:
|
||||
```lua
|
||||
local basalt = require("basalt")
|
||||
local main = basalt.createFrame()
|
||||
main:addButton():setPosition(5, 3):setText("Hello")
|
||||
basalt.autoUpdate()
|
||||
```
|
||||
|
||||
You can also add a layout multiple times, or create multiple frames and always use the same layout. For example a design layout for more frames and then you could also use
|
||||
a unique layout for each frame. I wont show you a example, you just have to use :addLayout multiple times on different frames.
|
||||
|
||||
Another thing is, you could add/load XML files IN XML:
|
||||
example.xml:
|
||||
```xml
|
||||
<frame layout="anotherExample.xml" />
|
||||
```
|
||||
|
||||
anotherExample.xml:
|
||||
```xml
|
||||
<button x="2" y="3" width="parent.w - 2" text="Greetings" />
|
||||
```
|
||||
|
||||
# Events
|
||||
|
||||
Using events in XML is also pretty simple. For that basalt has a function called basalt.setVariable. This is to store functions or other things which you can access via
|
||||
XML. Obviously the logic you want to add has to be done in lua, here:
|
||||
|
||||
Lua:
|
||||
```lua
|
||||
local basalt = require("basalt")
|
||||
|
||||
basalt.setVariable("buttonClick", function()
|
||||
basalt.debug("i got clicked!")
|
||||
end)
|
||||
|
||||
local main = basalt.createFrame():addLayout("example.xml")
|
||||
basalt.autoUpdate()
|
||||
```
|
||||
|
||||
And then you just have to link your function in your XML file:
|
||||
```xml
|
||||
<button x="2" y="3" width="parent.w - 2" text="Greetings" onClick="buttonClick" />
|
||||
```
|
||||
|
||||
This is pretty simple! BUT there is one thing you shouldn't forget: In Lua you always have to create the function's before you want to access it, which means
|
||||
always use basalt.setVariable before you use frame:addLayout() - otherwise basalt is not able to find the function
|
||||
Reference in New Issue
Block a user