Hiranus icon

Button API

Hiranus | PRO | 09/29/14 08:19:58 AM UTC | 0 ⭐ | 765 👁️ | Never ⏰ | []
Lua |

12.54 KB

|

None

|

0 👍

/

0 👎

--credits: Direwolf20: for his button api that gave birth to this creation.
 
function search(perToFind)
    local printMode = false
    if perToFind == "print" or perToFind==nil then
            printMode=true
    end
    if printMode == true then
        term.clear()
        term.setCursorPos(1,1)
    end
    local perip = peripheral.getNames()
    for i=1, #perip do
        if printMode == true then
            print(perip[i] .. " -- " ..peripheral.getType(perip[i]))
        else
            if perToFind==peripheral.getType(perip[i]) or perToFind==perip[i] then
                return perip[i]
            end
        end
    end
    if printMode == false then
        throw("No such peripheral: " ..perToFind)
    end
end
 
function wsearch (perToFind)
    return peripheral.wrap(search(perToFind))
end
 
function throw (text)
    printError(text)
    error()
end
 
local mon
 
function getMonitor ()
    return mon
end
 
function findMonitor (monitor)
    if monitor == nil then
        monitor = "monitor"
    end
    mon = wsearch(monitor)
end
 
function setMonitor (monitor)
    mon = monitor
end
 
function prepareMonitor ()
    if mon == nil then
        findMonitor()
    end
    mon.setTextScale(1)
    mon.setTextColor(colors.white)
    mon.setBackgroundColor(colors.black)
    mon.clear()
end
 
function clearMonitor()
    mon.clear()
end
 
local buttonMenus = {}
local groupInfo = {}
local group
 
function selectGroup (name)
    group=name
    if buttonMenus[group]== nil then
        buttonMenus[group]={}
        groupInfo[group]={}
        groupInfo[group]["num"]=0
    end
end
 
function addCustomButton ( name, func, ymin, ymax, xmin, xmax, mode, colorOFF, colorON)
    if group == nil then
        selectGroup("A")
    end
    buttonMenus[group][name]={}
    buttonMenus[group][name]["func"] = func
    buttonMenus[group][name]["active"] = false
    buttonMenus[group][name]["locked"] = false
    buttonMenus[group][name]["xmin"] = xmin
    buttonMenus[group][name]["ymin"] = ymin
    buttonMenus[group][name]["xmax"] = xmax
    buttonMenus[group][name]["ymax"] = ymax
    buttonMenus[group][name]["mode"] = mode
    buttonMenus[group][name]["custom"] = true
    if colorOFF == nil then
        buttonMenus[group][name]["colorOFF"]=colors.red
    else
        buttonMenus[group][name]["colorOFF"]=colorOFF
    end
    if colorON == nil then
        buttonMenus[group][name]["colorON"]=colors.lime
    else
        buttonMenus[group][name]["colorON"]=colorON
    end
end
 
function addCustomCornerButton(name, func, mode, sizeX, sizeY, corner, colorOFF, colorON)
    local monX,monY = mon.getSize()
    local xmin,xmax,ymin,ymax
    if string.find(corner,"r")~=nil or string.find(corner,"R")~=nil then
        xmax=monX+1
        xmin=monX-sizeX+1
    else
        xmin=1
        xmax=sizeX+1
    end
    if string.find(corner,"t")~=nil or string.find(corner,"T")~=nil then
        ymax=sizeY+1
        ymin=1
    else
        ymin=monY-sizeY+1
        ymax=monY+1
    end
    addCustomButton(name,func,ymin,ymax,xmin,xmax,mode, colorOFF, colorON)
end 
 
function addBasicButton(name, func, mode, colorOFF, colorON)
    if group == nil then
        selectGroup("A")
    end
    buttonMenus[group][name]={}
    buttonMenus[group][name]["func"] = func
    buttonMenus[group][name]["active"] = false
    buttonMenus[group][name]["mode"] = mode
    buttonMenus[group][name]["custom"] = false
    buttonMenus[group][name]["locked"] = false
    groupInfo[group]["num"]=groupInfo[group]["num"] + 1
    if colorOFF == nil then
        buttonMenus[group][name]["colorOFF"]=colors.red
    else
        buttonMenus[group][name]["colorOFF"]=colorOFF
    end
    if colorON == nil then
        buttonMenus[group][name]["colorON"]=colors.lime
    else
        buttonMenus[group][name]["colorON"]=colorON
    end
end
 
 
local heading= ""
 
function setHeading (text)
    heading=text
end
 
function printHeading()
    local head=""
    if groupInfo[group]["heading"]~= nil then
        head=groupInfo[group]["heading"]
    else
        head=heading
    end
    local w, h = mon.getSize()
    mon.setCursorPos((w-string.len(head))/2+1, 1)
    mon.write(head)
end
 
local button={}
 
function setGlobalButtonVar (width, height,Xaxis)
    button["buttonX"]= width
    button["buttonY"] = height
    button["buttonsX"] = Xaxis
end
 
local monitorBorder={}
 
function setGlobalMonitorBorder (mBT,mBR,mBD,mBL)
    monitorBorder["monitorBorderTop"] = mBT
    monitorBorder["monitorBorderRight"] = mBR
    monitorBorder["monitorBorderDown"] = mBD
    monitorBorder["monitorBorderLeft"] = mBL
end
setGlobalMonitorBorder(0,0,0,0)
 
local space={}
function setGlobalButtonBorder (sX,sY)
    space["spaceX"] = sX
    space["spaceY"] = sY
end
------------------------------------------------------------------------------------------------------------------
function setGroupMonitorBorder (mBT,mBR,mBD,mBL)
    if groupInfo[group]["MB"]==nil then
        groupInfo[group]["MB"]={}
    end
    groupInfo[group]["MB"]["monitorBorderTop"] = mBT
    groupInfo[group]["MB"]["monitorBorderRight"] = mBR
    groupInfo[group]["MB"]["monitorBorderDown"] = mBD
    groupInfo[group]["MB"]["monitorBorderLeft"] = mBL
end
 
function setGroupButtonVar (width, height,Xaxis)
    if groupInfo[group]["BV"]==nil then
        groupInfo[group]["BV"]={}
    end
    groupInfo[group]["BV"]["buttonX"]= width
    groupInfo[group]["BV"]["buttonY"]= height
    groupInfo[group]["BV"]["buttonsX"] = Xaxis
end
function setGroupButtonBorder (sX,sY)
    if groupInfo[group]["BB"]==nil then
        groupInfo[group]["BB"]={}
    end
    groupInfo[group]["BB"]["spaceX"] = sX
    groupInfo[group]["BB"]["spaceY"] = sY
end
function setGroupHeading (text)
    groupInfo[group]["heading"]=text
end
----------------------------------------------------------------------------------------------------------
 
function calculateButtons()
    local monX,monY = mon.getSize()
 
    local cButton , cVar , cMonitor
    
    local buttonsY
    local buttonColumn, buttonRow
    for name, groupData in pairs(buttonMenus) do
        
        if groupInfo[name]["BB"] ~= nil then
            cButton=groupInfo[name]["BB"]
        else
            cButton=space
        end
        
        if groupInfo[name]["MB"] ~= nil then
            cMonitor=groupInfo[name]["MB"]
        else
            cMonitor=monitorBorder
        end
        
        if groupInfo[name]["BV"] ~= nil then
            cVar=groupInfo[name]["BV"]
        else
            cVar=button
        end
        
        if cButton == nil then
            throw("You forgot to call 'setBasicButtonVar'")
        end
        
        
        if heading ~= "" then
            if cMonitor["monitorBorderTop"] < 2 then
                cMonitor["monitorBorderTop"]= 2
            end
        end
        if cButton["spaceX"] == nil  then
            cButton["spaceX"]=math.floor  ((monX - (cVar["buttonX"] * cVar["buttonsX"]) ) / (cVar["buttonsX"]+ 1 ) )
            
        end
        buttonsY=math.ceil(groupInfo[name]["num"] / cVar["buttonsX"])
        
        if cButton["spaceY"] == nil then
            cButton["spaceY"]=math.floor(( monY  - (cVar["buttonY"] * buttonsY) ) / (buttonsY + 1 ) )
        end
        
        buttonColumn=-1
        buttonRow=0
        for bName, bData in pairs(groupData) do
            if bData["custom"] == false then
                buttonColumn=buttonColumn+1
                if buttonColumn==cVar["buttonsX"] then
                    buttonColumn=0
                    buttonRow=buttonRow+1
                end
                
                local areaNeededX = (cVar["buttonX"] * cVar["buttonsX"]) + (cButton["spaceX"] * (cVar["buttonsX"] - 1))
                local areaNeededY = (cVar["buttonY"] * buttonsY) + (cButton["spaceY"] * (buttonsY - 1))
                local arealeftX = monX - (areaNeededX + cMonitor["monitorBorderLeft"] + cMonitor["monitorBorderRight"])
                local arealeftY = monY - (areaNeededY + cMonitor["monitorBorderTop"] + cMonitor["monitorBorderDown"])
                local shiftX = math.floor(arealeftX/2)
                local shiftY = math.ceil(arealeftY/2)
                
                bData["xmin"] = (cMonitor["monitorBorderLeft"]+shiftX+((cButton["spaceX"] + cVar["buttonX"])  * buttonColumn))  +1
                bData["xmax"]= (cMonitor["monitorBorderLeft"]+shiftX+((cButton["spaceX"] + cVar["buttonX"])  * buttonColumn)  + cVar["buttonX"] )+1
                bData["ymin"]=  (cMonitor["monitorBorderTop"]+shiftY+((cButton["spaceY"] + cVar["buttonY"])  * buttonRow) ) +1
                bData["ymax"]= (cMonitor["monitorBorderTop"]+shiftY+((cButton["spaceY"] + cVar["buttonY"])  * buttonRow) + cVar["buttonY"]) +1
                
                if bData["xmax"]-1>(monX-cMonitor["monitorBorderRight"]) or bData["ymax"]-1>(monY-cMonitor["monitorBorderDown"]) then
                    throw("Button outside border ")
                end
                if bData["xmin"]<=cMonitor["monitorBorderLeft"] or bData["ymin"]<=cMonitor["monitorBorderTop"] then
                    throw("Button outside border ")
                end
            end
        end
    end
end
 
function printButton (name, bData)
    local color
    local on = bData["active"]
    if on == true then color = bData["colorON"] else color = bData["colorOFF"] end
   mon.setBackgroundColor(color)
   if bData["ymin"] == nil then
    throw ("You forgot to call calculateButtons")
    end
   local yspot = math.floor((bData["ymin"] + bData["ymax"]) /2)
   local xspot = math.floor((bData["xmax"] - bData["xmin"] - string.len(name)) /2) +0
 
   for j = bData["ymin"], (bData["ymax"] - 1) do
      mon.setCursorPos(bData["xmin"], j)
      if j == yspot then
        if xspot<0 then
            mon.setCursorPos((bData["xmin"]+xspot), j)
            mon.write(name)
        else
             for k=0, bData["xmax"] - bData["xmin"] - string.len(name)  do
                if k == xspot then
                   mon.write(name)
                else
                   mon.write(" ")
                end
             end
            end
      else
         for i = bData["xmin"], bData["xmax"]-1 do
            mon.write(" ")
         end
      end
   end
   mon.setBackgroundColor(colors.black)
end
 
function refresh (name)
    printButton(name,buttonMenus[group][name])
end
 
local flashTime=0.2
 
function setGlobalFlashTime(tim)
    flashTime=tim
end
 
function toggle(name,button)
    if button["locked"]~=true then
        button["active"] = not button["active"]
        refresh(name)
        button["func"]()
    end
end
 
function flash(name,button)
    if button["locked"]~=true then
        local tgroup=group
        if button["active"]==false then
            toggle(name,button)
        end
 
        if tgroup==group then
            sleep(flashTime)
            button["active"] = not button["active"]
            refresh(name)
        else
            button["active"] = not button["active"]
        end
    end
end  
 
function flashInvert(name,button)
    if button["locked"]~=true then
        local tgroup=group
        if tgroup==group then
            sleep(flashTime)
            button["active"] = not button["active"]
            refresh(name)
        else
            button["active"] = not button["active"]
        end
        if button["active"]==false then
            toggle(name,button)
        end
    end
end  
 
function no(name,button)
    if button["locked"]~=true then
        button["func"]()
    end
end
 
 
function empty() end
 
function redrawScreen()
    clearMonitor()
    printHeading()
    for name,data in pairs(buttonMenus[group]) do
        printButton(name, data)
    end
end
 
function setButtonLock(state, name, gr)
    if gr==nil then
        gr=group
    end
    if buttonMenus[gr][name]==nil then
        throw("button does not exist")
    end
    buttonMenus[gr][name]["locked"]=state
end
function changeButtonLock( name, gr)
    if gr==nil then
        gr=group
    end
    if buttonMenus[gr][name]==nil then
        throw("button does not exist")
    end
    buttonMenus[gr][name]["locked"]=not buttonMenus[gr][name]["locked"]
end
function getButtonLock(name,gr)
    if gr==nil then
        gr=group
    end
    if buttonMenus[gr][name]==nil then
        throw("button does not exist")
    end
    return buttonMenus[gr][name]["locked"]
end
 
function useButton(name,gr)
    if gr==nil then
        gr=group
    end
    if buttonMenus[gr][name]==nil then
        throw("button does not exist")
    end
    if buttonMenus[gr][name]["locked"]~=true then
        buttonMenus[gr][name]["mode"](name,buttonMenus[gr][name])
    end
end
 
function setButtonState(state,name,gr)
    if gr==nil then
        gr=group
    end
    if buttonMenus[gr][name]==nil then
        throw("button does not exist")
    end
    if buttonMenus[gr][name]["active"]~= state then
        toggle (name,buttonMenus[gr][name])
    end
end
 
function getButtonState(name,gr)
    if gr==nil then
        gr=group
    end
    if buttonMenus[gr][name]==nil then
        throw("button does not exist")
    end
    return buttonMenus[gr][name]["active"]
end
 
function getButton(name,gr)
    if gr==nil then
        gr=group
    end
    if buttonMenus[gr][name]==nil then
        throw("button does not exist")
    end
    return buttonMenus[gr][name]
end
 
function getGroup(gr)
    if gr==nil then
        gr=group
    end
    return buttonMenus[gr]
end
 
function checkxy(x, y)
   for name, data in pairs(buttonMenus[group]) do
 
          if y>=data["ymin"] and  y < data["ymax"] then
             if x>=data["xmin"] and x< data["xmax"] then
                 print ("")print ("")
                    data["mode"](name,data)
                    return true
             end
          end
 
    end
   return false
end
 
function getClick()
    local event,side,x,y = os.pullEvent("monitor_touch")
    checkxy(x,y)
end
 
function printButtonData()
    local monX,monY = mon.getSize()
    print(monX)
    print (monY)
    for name, data in pairs(buttonMenus) do
        
        for names, dataup in pairs(data) do
            print (name.."  "..names .." xmin:"..dataup["xmin"].." xmax:"..dataup["xmax"].." ymin:"..dataup["ymin"].." ymax:"..dataup["ymax"])
        end
 
    end
 
end

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎