Advertisement
Pirnogion

OC/context

Aug 24th, 2015
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.41 KB | None | 0 0
  1. local e = require "event"
  2. local unicode = require "unicode"
  3.  
  4. --local context = {}
  5. local g = require ("component").gpu
  6. local s = require "serialization"
  7.  
  8. function createContext(context_content, gpu, x, y, design)
  9.     local self = {}
  10.     self.pixels_under_context = {}
  11.     self.content = context_content
  12.     self.draw_point = {['x'] = x, ['y'] = y}
  13.     self.gpu = gpu
  14.  
  15.     self.default_design = {}
  16.     self.default_design.width, self.default_design.height = 10, 10
  17.     self.default_design.horizontal_indents = 2
  18.     self.default_design.shadow = true
  19.     self.default_design.blink_time = 0.2
  20.  
  21.     self.default_design.enabled_background = 0xffffff
  22.     self.default_design.enabled_foreground = 0x000000
  23.  
  24.     self.default_design.disabled_background = 0xffffff
  25.     self.default_design.disabled_foreground = 0xaaaaaa
  26.  
  27.     self.default_design.selected_background = 0x0000ff
  28.     self.default_design.selected_foreground = 0x000000
  29.  
  30.     self.default_design.shadow_background = 0xaaaaaa
  31.     self.default_design.delim_char = '—'
  32.  
  33.     if ( design ) then
  34.         self.default_design = design
  35.     end
  36.  
  37.     local maxLength = 0
  38.     for _, item in pairs(context_content) do
  39.         if ( item ) then
  40.             maxLength = math.max( maxLength, unicode.len(item.name) )
  41.         end
  42.     end
  43.     self.default_design.width, self.default_design.height = maxLength+self.default_design.horizontal_indents*2, #context_content
  44.  
  45.     function self.copyPixelsUnderContext(self)
  46.         for y=self.draw_point.y, self.default_design.height+self.draw_point.y+1 do
  47.             self.pixels_under_context[y] = {}
  48.             for x=self.draw_point.x, self.default_design.width+self.draw_point.x+1 do
  49.                 self.pixels_under_context[y][x] = { self.gpu.get(x, y) }
  50.             end
  51.         end
  52.     end
  53.  
  54.     function self.drawPixelsUnderContext(self)
  55.         for y=self.draw_point.y, self.default_design.height+self.draw_point.y+1 do
  56.             for x=self.draw_point.x, self.default_design.width+self.draw_point.x+1 do
  57.                 self.gpu.setBackground( self.pixels_under_context[y][x][3] )
  58.                 self.gpu.setForeground( self.pixels_under_context[y][x][2] )
  59.                 self.gpu.set( x, y, self.pixels_under_context[y][x][1] )
  60.             end
  61.         end
  62.     end
  63.  
  64.     function self.drawShadow(self)
  65.         self.gpu.setBackground(self.default_design.shadow_background)
  66.         self.gpu.fill(self.draw_point.x+1, self.draw_point.y+self.default_design.height, self.default_design.width, 1, ' ')
  67.         self.gpu.fill(self.draw_point.x+self.default_design.width, self.draw_point.y+1, 1, self.default_design.height, ' ')
  68.     end
  69.  
  70.     function self.drawItem(self, num_item, item)
  71.         if ( not item ) then
  72.             self.gpu.setBackground( self.default_design.disabled_background )
  73.             self.gpu.setForeground( self.default_design.disabled_foreground )
  74.             self.gpu.fill(self.draw_point.x, self.draw_point.y+num_item, self.default_design.width, 1, self.default_design.delim_char)
  75.         else
  76.             if ( item.active ) then
  77.                 self.gpu.setBackground( self.default_design.enabled_background )
  78.                 self.gpu.setForeground( self.default_design.enabled_foreground )
  79.             else
  80.                 self.gpu.setBackground( self.default_design.disabled_background )
  81.                 self.gpu.setForeground( self.default_design.disabled_foreground )
  82.             end
  83.             self.gpu.fill(self.draw_point.x, self.draw_point.y+num_item, self.default_design.width, 1, ' ')
  84.             self.gpu.set(self.draw_point.x, self.draw_point.y+num_item, string.rep(' ', self.default_design.horizontal_indents) .. item.name)
  85.         end
  86.     end
  87.  
  88.     function self.blinkItem(self, selected_item, touch_y)
  89.         self.gpu.setBackground( self.default_design.selected_background )
  90.         self.gpu.setForeground( self.default_design.selected_foreground )
  91.         self.gpu.fill(x, touch_y, self.default_design.width, 1, ' ')
  92.         self.gpu.set(x, touch_y, string.rep(' ', self.default_design.horizontal_indents) .. selected_item.name)
  93.  
  94.         os.sleep( self.default_design.blink_time )
  95.  
  96.         self.gpu.setBackground( self.default_design.enabled_background )
  97.         self.gpu.setForeground( self.default_design.enabled_foreground )
  98.         self.gpu.fill(x, touch_y, self.default_design.width, 1, ' ')
  99.         self.gpu.set(x, touch_y, string.rep(' ', self.default_design.horizontal_indents) .. selected_item.name)
  100.     end
  101.  
  102.     function self.openContext(self)
  103.         self:copyPixelsUnderContext()
  104.         self:drawShadow()
  105.  
  106.         for numItem, item in pairs(self.content) do
  107.             self:drawItem(numItem-1, item)
  108.         end
  109.     end
  110.  
  111.     function self.checkTouch(self, event)
  112.         local numSelectedItem = event[4]-self.draw_point.y+1
  113.  
  114.         local selectedItem = self.content[numSelectedItem]
  115.         local isEnabledItem = ( selectedItem ) and ( selectedItem.active == true )
  116.         local clickOnContextFrame = ( event[3] > self.draw_point.x-1 ) and ( event[3] < self.draw_point.x+self.default_design.width )
  117.  
  118.         if ( event[1] == "touch" ) then
  119.             if ( isEnabledItem and clickOnContextFrame ) then
  120.                 self:blinkItem(selectedItem, event[4])
  121.  
  122.                 --Call function
  123.                 local calledFunction = selectedItem["function"]
  124.                 if ( calledFunction ) then
  125.                     calledFunction()
  126.                 end
  127.             end
  128.         end
  129.     end
  130.  
  131.     function self.closeContext(self)
  132.         self:drawPixelsUnderContext()
  133.     end
  134.  
  135.     return self
  136. end
  137.  
  138. --Example
  139. local function pr()
  140.     print("Opened!")
  141. end
  142.  
  143. local content = {}
  144. content[1] = {["name"] = "Open", ["function"] = pr, ["active"] = true}
  145. content[2] = {["name"] = "Close", ["function"] = nil, ["active"] = true}
  146. content[3] = false
  147. content[4] = {["name"] = "Delete", ["function"] = nil, ["active"] = false}
  148. content[5] = false
  149.  
  150. local t = { e.pull("touch") }
  151.  
  152. local menu = createContext(content, g, t[3], t[4])
  153. menu:openContext()
  154. menu:checkTouch({ e.pull() } )
  155. menu:closeContext()
  156.  
  157. --return context
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement