Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: Vodurden on Jun 25th, 2012  |  syntax: Lua  |  size: 6.84 KB  |  hits: 97  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. monitor = peripheral.wrap("top")
  2. term.redirect(monitor)
  3. term.clear()
  4.  
  5. Display = {}
  6. Display.__index = Display
  7.  
  8. function Display.create()
  9.   local display = {}
  10.   setmetatable(display, Display)
  11.   display.indent_level = 0
  12.   display.indent_size = 2
  13.   display.margin_size = 1
  14.   display.current_line = 1
  15.   display.term_width, display.term_height = term.getSize()
  16.   return display
  17. end
  18.  
  19. function Display:GetIndentPosition()
  20.   return (self.indent_size * self.indent_level) + self.margin_size
  21. end
  22.  
  23. function Display:DrawBorder()
  24.   for i = 1, self.term_height do
  25.     term.setCursorPos(1, i)
  26.     term.write("|")
  27.     term.setCursorPos(self.term_width, i)
  28.     term.write("|")
  29.   end
  30.  
  31.   local current_position = self.current_line
  32.   self:SetLine(1)
  33.   self:DrawSeperator()
  34.   self:SetLine(self.term_height)
  35.   self:DrawSeperator()
  36.   self:SetLine(current_position)
  37. end
  38.  
  39. function Display:DrawAlignedText(text, alignment)
  40.   if alignment == "left" then
  41.     term.setCursorPos(self:GetIndentPosition(), self.current_line)
  42.   elseif alignment == "center" then
  43.     term.setCursorPos((self.term_width/2) - (string.len(text)/2), self.current_line)
  44.   elseif alignment == "right" then
  45.     term.setCursorPos((self.term_width - self:GetIndentPosition()) - (string.len(text)), self.current_line)
  46.   end
  47.   term.write(text)
  48. end
  49.  
  50. function Display:DrawSeperator(text)
  51.   term.setCursorPos(self:GetIndentPosition(), self.current_line)
  52.   if self.indent_level == 0 then
  53.     term.write("+")
  54.     term.write(string.rep("-", self.term_width-2))
  55.     term.write("+")
  56.   else
  57.     term.setCursorPos(self:GetIndentPosition(), self.current_line)
  58.     term.write(string.rep("-", self.term_width-(self:GetIndentPosition()*2)+1))
  59.   end
  60.  
  61.   if text ~= nil then
  62.     term.setCursorPos(7 + self:GetIndentPosition(), self.current_line)
  63.     term.write(text)
  64.   end
  65.  
  66.   self:NextLine()
  67. end
  68.  
  69. function Display:ShorthandNumber(number)
  70.   if number >= 1000000 then
  71.      return math.floor(number / 1000000) .. "M";
  72.   elseif number > 1000 then
  73.      return math.floor(number / 1000) .. "K";
  74.   else
  75.      return number
  76.   end
  77. end
  78.  
  79. function Display:CalculatePercent(current_value, max_value)
  80.   if current_value == 0 then
  81.     return 0
  82.   else
  83.     return (current_value / max_value)
  84.   end
  85. end
  86.  
  87. function Display:DrawProgressBar(current_value, max_value, start_pos, end_pos)
  88.   local progress = self:CalculatePercent(current_value, max_value)
  89.   local bar_length = end_pos - start_pos - 2 -- -2 is for the start and end markers of the bar
  90.   local progress_length = math.ceil(bar_length * progress)
  91.   local no_progress_length = bar_length - progress_length
  92.  
  93.   term.setCursorPos(start_pos, self.current_line)
  94.   term.write("[")
  95.   term.write(string.rep("=", progress_length))
  96.   term.write(string.rep(".", no_progress_length))
  97.   term.write("]")
  98. end
  99.  
  100. function Display:DrawDecoratedProgressBar(current_value, max_value, title, decoration)
  101.   local start_pos = self:GetIndentPosition()
  102.   local end_pos = self.term_width - self:GetIndentPosition()
  103.   local progress = self:CalculatePercent(current_value, max_value)
  104.  
  105.   -- Figure out title positioning
  106.   if title then
  107.     start_pos = start_pos + string.len(title) + 1
  108.     self:DrawAlignedText(title, "left")
  109.   end
  110.  
  111.   -- Figure out decoration positioning
  112.   if decoration == "percentage" then
  113.     local percentage = math.ceil(progress * 100) .. "%"
  114.     end_pos = end_pos - 5
  115.     self:DrawAlignedText(percentage, "right")
  116.   elseif decoration == "amount" then
  117.     local output = "(" .. current_value .. "/" .. max_value .. ")"
  118.     end_pos = end_pos - string.len(output) - 1
  119.     term.setCursorPos(end_pos + 1, self.current_line)
  120.     term.write(output)
  121.   elseif decoration == "amount_rounded" then
  122.     local output = "(" .. self:ShorthandNumber(current_value) .. "/" .. self:ShorthandNumber(max_value) .. ")"
  123.     end_pos = end_pos - string.len(output) - 1
  124.     term.setCursorPos(end_pos + 1, self.current_line)
  125.     term.write(output)
  126.   end
  127.  
  128.   self:DrawProgressBar(current_value, max_value, start_pos, end_pos)
  129.   self:NextLine()
  130. end
  131.  
  132. function Display:DrawProgressBlock(title, current_value, max_value)
  133.   local start_pos = self:GetIndentPosition()
  134.   local end_pos = self.term_width - self:GetIndentPosition()
  135.   local amount_data = "(" .. self:ShorthandNumber(current_value) .. "/" .. self:ShorthandNumber(max_value) .. ")"
  136.   local progress = self:CalculatePercent(current_value, max_value)
  137.  
  138.   self:DrawAlignedText(title, "left")
  139.   self:DrawAlignedText(amount_data, "right")
  140.   self:NextLine()
  141.   self:DrawDecoratedProgressBar(current_value, max_value, nil, "percentage")
  142. end
  143.  
  144. function Display:DrawBoolean(trigger, title, on_text, off_text)
  145.   local word = off_text
  146.   if trigger then
  147.     word = on_text
  148.   end
  149.  
  150.   self:DrawAlignedText(title, "left")
  151.   self:DrawAlignedText(word, "right")
  152.   self:NextLine()
  153. end
  154.  
  155. function Display:Indent()
  156.   self.indent_level = self.indent_level + 1
  157. end
  158.  
  159. function Display:Unindent()
  160.   self.indent_level =  self.indent_level - 1
  161. end
  162.  
  163. function Display:NextLine(amount)
  164.   if amount ~= nil then
  165.     self.current_line = self.current_line + amount
  166.   else
  167.     self.current_line = self.current_line + 1
  168.   end
  169. end
  170.  
  171. function Display:PreviousLine(amount)
  172.   if amount ~= nil then
  173.     self.current_line = self.current_line - amount
  174.   else
  175.     self.current_line = self.current_line - 1
  176.   end
  177. end
  178.  
  179. function Display:SetLine(line)
  180.   self.current_line = line
  181. end
  182.  
  183.  
  184. -- Configuration setup
  185. header_text = "Nuclear Status & Control System"
  186. reactor_state_side = "left"
  187.  
  188. -- Display Setup
  189. display = Display.create()
  190. display:DrawBorder()
  191.  
  192. -- Draw the header
  193. display:DrawSeperator()
  194. display:DrawAlignedText(header_text, "center")
  195. display:NextLine()
  196. display:DrawSeperator()
  197.  
  198. -- Load the status data
  199. reactor_colours = rs.getBundledInput(reactor_state_side)
  200. reactor_state = not colours.test(reactor_colours, colours.red)
  201. coolant_state = not colours.test(reactor_colours, colours.blue)
  202. uranium_state = not colours.test(reactor_colours, colours.orange)
  203.  
  204. -- Set up the status display
  205. display:NextLine()
  206. display:Indent()
  207. display:DrawSeperator("Reactor Status")
  208. display:Indent()
  209. display:DrawBoolean(reactor_state, "Core Fusion System", "On", "Off")
  210. display:DrawBoolean(coolant_state, "Coolant Injection System", "Injecting", "Off")
  211. display:DrawBoolean(uranium_state, "Uranium Injection System", "Injecting", "Off")
  212. display:Unindent()
  213.  
  214. -- Set up the power displays
  215. display:NextLine()
  216. display:DrawSeperator("Power Status")
  217. display:Indent()
  218. display:DrawProgressBlock("Total Power", 23000000, 160000000)
  219. display:NextLine()
  220. display:DrawDecoratedProgressBar(20000000, 40000000, "Store 1", "percentage")
  221. display:DrawDecoratedProgressBar(1000000, 40000000, "Store 2", "percentage")
  222. display:DrawDecoratedProgressBar(2000000, 40000000, "Store 3", "percentage")
  223. display:DrawDecoratedProgressBar(0, 40000000, "Store 4", "percentage")
  224. term.restore()