Advertisement
Chelrid

Storage Monitor

Apr 19th, 2022 (edited)
678
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -------------------Start Settings Section------------------
  2. ---Note neither w nor h are directly related to Physical screen size
  3. ---they just control in how many "pixels" the physical space is divided
  4. --- I recommend leaving it default and test then change and see what fits your screen
  5. ---Also the bigger the numbers the smaller the text
  6. w = 85 --Screen Width
  7. h = 31 -- Screen Height
  8.  
  9. minStackSize = 500 --- This is the stack size used to Calculate Capacity
  10. headerRow = 1 --- Row where the Header row is drawn
  11. startRow = 3  --- Row in which itemList starts
  12. startCol = 1 --- Col in which ItemList starts
  13.  
  14. refreshTime = 60 --- Seconds between refresh of Screen also used to measure gain loss
  15.  
  16. mediumThreshold = 50  ---when stock higher then this percentage bar color changes to yellow by default
  17. highThreshold = 90  ---when stock higher then this percentage bar color changes to green by default
  18.  
  19. --- Here you can change the Colors of some elements
  20. --- Backcolors is for Background FrontColors for Foreground
  21. --- Colors that are used in the setColor Function need to exist in both tables
  22.  
  23. BackColors = {default={0,0,0,0},rowEven={255,0,0,0.1},rowOdd = {0,0,0,1},header={255,0,0,0.1},
  24.               lowStockBar={255,0,0,1},mediumStockBar={50,50,0,1},highStockBar={0,255,0,1},nextButton={0,255,0,0.3},
  25.               prevButton = {0,255,0,0.3}}
  26.  
  27. FrontColors = {default={255,255,255,1},rowEven={255,255,255,1},rowOdd = {255,255,255,1},header={255,255,255,1},nextButton={0,0,0,1},
  28.                prevButton = {0,0,0,1}}
  29.  
  30. --- In this table you can change the Column attributes
  31. --- width is the Columnwidth be aware that these are cut off if text is longer then width
  32. --- header is the Text in the Header Column
  33. --- offset allows you to move header text left or right
  34. --- Note: Changing Header text does not change the content for that you need to adjust the code in the drawRows function
  35. Columns = {}
  36. Columns[0] = {width = 29,header="Item",offset = 0}
  37. Columns[1] = {width = 10,header="Current",offset = 0}
  38. Columns[2] = {width = 10,header="Max",offset = 0}
  39. Columns[3] = {width = 10,header=" %",offset = 0}
  40. Columns[4] = {width = 10,header="Change",offset = -3}
  41. Columns[5] = {width = 12,header="Visual",offset = 0}
  42.  
  43. buttonText_NextPage = "  Next Page  "
  44. buttonText_PrevPage = "  Prev Page  "
  45. --- Only change code outside of the settings area if you know what you are doing ;)
  46. -------------------End Settings Section------------------
  47.  
  48.  
  49. -------------------Start Helper Functions------------------
  50. function setBackgroundColor(colorName)
  51.     gpu:setBackground(BackColors[colorName][1],BackColors[colorName][2],BackColors[colorName][3],BackColors[colorName][4])
  52. end
  53.  
  54. function setForegroundColor(colorName)
  55.     gpu:setForeground(FrontColors[colorName][1],FrontColors[colorName][2],FrontColors[colorName][3],FrontColors[colorName][4])
  56. end
  57.  
  58. function setColor(colorName)
  59.     setBackgroundColor(colorName)
  60.     setForegroundColor(colorName)
  61. end
  62.  
  63. function setDefaultColor()
  64.     setColor("default")
  65. end
  66.  
  67. function setRowColor(rowNum)
  68.     if rowNum % 2 == 0 then
  69.         setColor("rowEven")
  70.     else
  71.         setColor("rowOdd")
  72.     end
  73. end
  74.  
  75. function clearScreen()
  76.     setDefaultColor()
  77.     gpu:fill(0,0,w,h," ")
  78.     gpu:flush()
  79. end
  80.  
  81. function pairsByKeys (t, f)
  82.     local a = {}
  83.     for n in pairs(t) do table.insert(a, n) end
  84.     table.sort(a, f)
  85.     local i = 0
  86.     local iter = function ()
  87.         i = i + 1
  88.         if a[i] == nil then return nil
  89.         else return a[i], t[a[i]]
  90.         end
  91.     end
  92.     return iter
  93. end
  94.  
  95. function fillString(str,len)
  96.     local trimmedText = string.sub(str,0,len)
  97.     return trimmedText .. string.rep(" ",len-string.len(trimmedText))
  98. end
  99.  
  100. function format_int(number)
  101.  
  102.     local i, j, minus, int, fraction = tostring(number):find('([-]?)(%d+)([.]?%d*)')
  103.  
  104.     --- reverse the int-string and append a comma to all blocks of 3 digits
  105.     int = int:reverse():gsub("(%d%d%d)", "%1'")
  106.  
  107.     --- reverse the int-string back remove an optional comma and put the
  108.     --- optional minus and fractional part back
  109.     return minus .. int:reverse():gsub("^'", "") .. fraction
  110. end
  111.  
  112. function getItemsPerPage()
  113.     return h-2-startRow
  114. end
  115.  
  116. function setMaxPages()
  117.     maxItemsPerPage = getItemsPerPage()
  118.     totalItems = 0
  119.     for k,v in pairs(items) do
  120.         totalItems = totalItems + 1
  121.     end
  122.     maxPage = totalItems/maxItemsPerPage
  123. end
  124.  
  125. ----------------------End Helper Functions------------------
  126.  
  127. ----------------------Start Functions for Display Stuff ------------------
  128.  
  129. function drawHeader(row)
  130.     local colStart = startCol
  131.     setColor("header")
  132.     for i = 0,#Columns,1 do
  133.         local col = Columns[i]
  134.         gpu:setText(colStart+col.offset,headerRow,fillString(col.header,col.width))
  135.         colStart = colStart + col.width
  136.     end
  137.     gpu:flush()
  138. end
  139.  
  140. function drawButtons()
  141.     setColor("prevButton")
  142.     gpu:setText(0,h-1,buttonText_PrevPage)
  143.     setColor("nextButton")
  144.     gpu:setText(w-14,h-1,buttonText_NextPage)
  145.     setDefaultColor()
  146. end
  147.  
  148. function drawBar(x,y,capacityPercent)
  149.     setDefaultColor()
  150.     gpu:setText(x,y,"|")
  151.     if capacityPercent > 0 and capacityPercent <= 50 then
  152.         setBackgroundColor("lowStockBar")
  153.     elseif capacityPercent > 50 and capacityPercent <= 90 then
  154.         setBackgroundColor("mediumStockBar")
  155.     else
  156.         setBackgroundColor("highStockBar")
  157.     end
  158.     BarLen =math.floor(capacityPercent/10)
  159.     if BarLen < 1 then BarLen = 1 end
  160.     gpu:setText(x+1,y,fillString("",BarLen))
  161.     setDefaultColor()
  162.     gpu:setText(x+11,y,"|")
  163. end
  164.  
  165. function getItemChange(itemName,itemInfo)
  166.     if itemsLast[itemName] ~= nil then
  167.         change = itemInfo.count - itemsLast[itemName].count
  168.     else
  169.         change = "-"
  170.     end
  171.     return change
  172. end
  173.  
  174. function drawRows()
  175.     local currentRow = 0
  176.     local columnValues = {}
  177.     local currentIndex = 1
  178.     local itemsPerPage = getItemsPerPage()
  179.     local maxIndex = itemsPerPage*page
  180.     local minIndex = maxIndex - itemsPerPage +1
  181.  
  182.     currentRow = currentRow+startRow
  183.  
  184.     for itemName,itemInfo in pairsByKeys(items) do
  185.         if currentIndex >= minIndex and currentIndex <= maxIndex then
  186.             local capacityPercent = math.floor(itemInfo.count/itemInfo.capacity*100)
  187.             columnValues[0] = itemName
  188.             columnValues[1] = format_int(itemInfo.count)
  189.             columnValues[2] = format_int(itemInfo.capacity)
  190.             columnValues[3] = capacityPercent
  191.             columnValues[4] = getItemChange(itemName,itemInfo)
  192.             columnValues[5] = "Graph"
  193.  
  194.             local colStart = startCol
  195.             for i = 0,#Columns,1 do
  196.                 setRowColor(currentRow)
  197.                 local col = Columns[i]
  198.                 if columnValues[i] == "Graph" then
  199.                     drawBar(colStart+col.offset,currentRow,capacityPercent)
  200.                 else
  201.                     gpu:setText(colStart+col.offset,currentRow,fillString(columnValues[i],col.width))
  202.                 end
  203.  
  204.                 colStart = colStart + col.width
  205.             end
  206.             currentRow = currentRow + 1
  207.         end
  208.         currentIndex = currentIndex +1
  209.     end
  210.     itemsLast = items
  211. end
  212.  
  213. function DrawTable()
  214.     clearScreen()
  215.     drawHeader()
  216.     drawRows()
  217.     drawButtons()
  218.     gpu:flush()
  219. end
  220.  
  221. ----------------------Start Functions for Grabbing Container Info ------------------
  222.  
  223. function getContainerInfo(container)
  224.     inv = container:getInventories()[1]
  225.     inventorySize = inv.size
  226.     inv:sort()
  227.     maxInventory = minStackSize*inventorySize
  228.     containerInfo = {name = "nothing", count = 0,capacity=inventorySize}
  229.     for i=0,inventorySize-1,1 do
  230.         stack = inv:getStack(i)
  231.         if stack.item.type then
  232.             itemName = stack.item.type.name
  233.             itemCount = inv.itemCount
  234.             containerInfo = {name=itemName,count = itemCount,capacity = maxInventory}
  235.             return containerInfo
  236.         end
  237.     end
  238.     return containerInfo
  239. end
  240.  
  241. function addToItems(containerInfo)
  242.     if items[containerInfo.name] == nil then
  243.         items[containerInfo.name] = containerInfo
  244.     else
  245.         items[containerInfo.name].count = items[containerInfo.name].count + containerInfo.count
  246.         items[containerInfo.name].capacity = items[containerInfo.name].capacity + containerInfo.capacity
  247.     end
  248. end
  249.  
  250. ----------------------End Functions for Grabbing Container Info ------------------
  251.  
  252. --- Grabing Components and initializing Global Variables
  253.  
  254. Containers = component.proxy(component.findComponent(findClass("FGBuildableStorage")))
  255. gpu = computer.getPCIDevices(findClass("GPUT1"))[1]
  256. comp = component.findComponent(findClass("Screen"))[1]
  257. screen = component.proxy(comp)
  258. gpu:bindScreen(screen)
  259. gpu:setSize(w,h)
  260. event.listen(gpu)
  261.  
  262. pages = {}
  263. items = {}
  264. itemsLast = {}
  265. page = 1
  266. maxPage = 1
  267. lastRefresh = computer.millis()
  268. firstStart = true
  269.  
  270. ---Main Loop
  271. ---
  272.  
  273. while true do
  274.     if computer.millis()-lastRefresh >= refreshTime*1000 or firstStart then
  275.         firstStart = false
  276.         Containers = component.proxy(component.findComponent(findClass("FGBuildableStorage")))
  277.         items = {}
  278.         for _,v in pairs(Containers) do
  279.             CurrentInfo = getContainerInfo(v)
  280.             if CurrentInfo.name ~= "nothing" then
  281.                 addToItems(CurrentInfo)
  282.             end
  283.         end
  284.         setMaxPages()
  285.         DrawTable()
  286.         itemsLast = items
  287.         lastRefresh = computer.millis()
  288.     end
  289.  
  290.  
  291.     signal, sender, x, y = event.pull(refreshTime)
  292.     if signal == "OnMouseDown" then
  293.         if x>=0 and x<=string.len(buttonText_PrevPage) and y==h-1 and page > 1 then
  294.             page=page-1
  295.             DrawTable()
  296.         end
  297.         if x>=w-string.len(buttonText_NextPage) and x<=w and y==h-1  and page < maxPage then
  298.             page=page+1
  299.             DrawTable()
  300.         end
  301.     end
  302. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement