Advertisement
Guest User

Untitled

a guest
May 25th, 2012
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.50 KB | None | 0 0
  1. import xbmcgui
  2. import random
  3. import addon
  4. import copy
  5. import log
  6.  
  7.  
  8. ADDON_OFFSET  = 13000
  9. LIST_OFFSET   = 10
  10. GRP_OFFSET    = 0
  11. LBL_OFFSET    = 1
  12. CTRL_OFFSET   = 2
  13. OFFSET = { 'bool': 20 }
  14.  
  15.  
  16.  
  17. class ControlType:
  18.     def __init__(self, control=None, label=None, height=0, width=0):
  19.         self.height  = height
  20.         self.width   = width
  21.         self.control = control
  22.         self.label   = label
  23.         self.id      = 0
  24.    
  25.     def setLink(self, link):
  26.         self.link = link
  27.        
  28.     def setText(self, text):
  29.         self.label.setLabel(text)
  30.    
  31.     def setId(self):
  32.         if self.id = 0:
  33.             self.id = random.randint(10000, 100000)
  34.            
  35.            
  36.     def prepare(self, ofx=0, ofy=0):
  37.         self.setId()
  38.         x, y = self.control.getPosition()
  39.         self.control.setPosition(ofx + x, ofy + y)
  40.         self.label.setPosition(ofx + x, ofy + y)
  41.         self.control.setId(self.id+CTRL_OFFSET)
  42.         self.label.setId(self.id+LBL_OFFSET)
  43.        
  44.          
  45.        
  46. class ListView:
  47.     def __init__(self, window, direction='vertical'):
  48.         self.window = window
  49.         self.direction = direction
  50.         self.maxItems  = 0
  51.         self.itemSizeX = 0
  52.         self.itemSizeY = 0
  53.         self.sizeX = 0
  54.         self.sizeY = 0
  55.         self.index = 0
  56.         self.start = 0
  57.         self.end   = 0
  58.         self.items = list()
  59.         self.all = list()
  60.    
  61.    
  62.     def init(self):
  63.         grp = self.getControl(ADDON_OFFSET + LIST_OFFSET + GRP_OFFSET)
  64.         self.sizeY = grp.getHeight()
  65.         self.sizeX = grp.getWidth()
  66.         self.ofX, self.ofY = grp.getPosition()
  67.         self.maxItems = int(
  68.                 (self.sizeX, self.sizeY)[self.direction=='vertical'] /
  69.                 (self.itemSizeX, self.itemSizeY)[self.direction=='vertical'] )
  70.        
  71.    
  72.     def offset(self, m=0):
  73.         x = self.offsetX + ( self.itemSizeX * (m,0)[self.direction=='vertical'] )
  74.         y = self.offsetY + ( self.itemSizeY * (0,m)[self.direction=='vertical'] )
  75.         return ( x, y )
  76.        
  77.            
  78.     def before(self, item):
  79.         x, y = self.offset(0)
  80.         item.prepare(x,y)
  81.         self.items.insert(0, item)
  82.         if len(self.items) > self.maxItems:
  83.             i = self.items.pop()
  84.             self.window.removeControl(i.id+CTRL_OFFSET)
  85.             self.window.removeControl(i.id+LBL_OFFSET)
  86.         self.window.addControl(item.control)
  87.         self.window.addControl(item.label)  
  88.         self.update()
  89.         return item.id
  90.        
  91.        
  92.            
  93.     def after(self, item):
  94.         x, y = self.offset(len(self.items))
  95.         item.prepare(x,y)
  96.         self.items.append(item)        
  97.         if len(self.items) > self.maxItems:
  98.             i = self.items.popleft()
  99.             self.window.removeControl(i.id+CTRL_OFFSET)
  100.             self.window.removeControl(i.id+LBL_OFFSET)    
  101.         self.window.addControl(item.control)
  102.         self.window.addControl(item.label)
  103.         self.update()    
  104.         return item.id    
  105.            
  106.            
  107.     def update(self):
  108.         for index, item in enumerate(self.list):
  109.             x, y = self.offset(index)
  110.             item.prepare(x,y)          
  111.        
  112.    
  113.     def clear(self):
  114.         while(len(self.items)>0):
  115.             item = self.items.pop()
  116.             self.window.removeControl(item.id+CTRL_OFFSET)
  117.             self.window.removeControl(item.id+LBL_OFFSET)
  118.                
  119.    
  120.     def build(self):
  121.         for i in range(self.maxItems):
  122.             self.            
  123.                
  124. class TestUI(xbmcgui.WindowXML):
  125.    
  126.     def __init__(self, strXMLname, strFallbackPath, strDefaultName, forceFallback):
  127.         self.direction = 'vertical'
  128.         self.ctrls = {'bool': {}}
  129.         self.category = 'default'
  130.         self.container = dict()
  131.         self.categories = { 'default': [] }
  132.         self.list = list()
  133.         self.id_link = dict()
  134.         self.items = list()
  135.         self.totalHeight = 0
  136.         self.totalWidth  = 0
  137.         self.maxHeight = 0
  138.         self.maxWidth =  0
  139.         self.max = {'vertical':0, 'horizontal':0, 'items':0}
  140.         self.maxItems = 0
  141.         self.index = 0
  142.        
  143.        
  144.     def addSetting(self, setting, category='default'):
  145.         if not self.categories.has_key(category):
  146.             self.categories[category] = []
  147.         self.categories[category].append(setting)
  148.        
  149.    
  150.     def build(self):
  151.         max = self.max['items']
  152.         idx = self.index
  153.         i = 0
  154.         self.list = list()
  155.         self.id_link = dict()
  156.         for index, item in enumerate( self.categories[self.category][ [0,0+idx-max][0+idx-max>=0] : max-1 ], [0,0+idx-max][0+idx-max>=0]):
  157.             ctrl = self.new(item.type)
  158.             ctrl.setLink(self.categories[self.category][index])
  159.             ctrl.prepare(self.container['x']+self.max['horizontal']*i, self.container['y']+self.max['vertical']*i)
  160.             self.id_link[ctrl.id+CTRL_OFFSET] = ctrl
  161.             self.list.append(ctrl)
  162.             self.addControl(ctrl.label)
  163.             self.addControl(ctrl.control)
  164.            
  165.     def clear(self):
  166.         self.        
  167.     def show(self):
  168.         self.doModal()
  169.        
  170.        
  171.     def onInit(self):
  172.         self.readTypes()
  173.         self.max['items'] = int( self.container[self.direction] / self.max[self.direction] )
  174.        
  175.     def onClick(self, control):
  176.         ctrl = self.getControl(control)
  177.         log.notice(str(ctrl.getId()))
  178.    
  179.    
  180.     def new(self, type):
  181.         control = copy.deepcopy(self.ctrls[type]['ctrl'])
  182.         label   = copy.deepcopy(self.ctrls[type]['lbl'])
  183.        
  184.        
  185.     def readTypes(self):
  186.         grp = self.getControl(ADDON_OFFSET + LIST_OFFSET + GRP_OFFSET)
  187.         self.container['vertical'] = grp.getHeight()
  188.         self.container['horizontal']  = grp.getWidth()
  189.         self.container['x'], self.container['y']  = grp.getPosition()
  190.         self.totalHeight = self.container['y']
  191.         self.totalWidth  = self.container['x']
  192.         self.readType('bool')
  193.        
  194.        
  195.     def readType(self, type):
  196.         grp  = self.getControl(ADDON_OFFSET + OFFSET[type] + GRP_OFFSET)
  197.         lbl  = self.getControl(ADDON_OFFSET + OFFSET[type] + LBL_OFFSET)
  198.         ctrl = self.getControl(ADDON_OFFSET + OFFSET[type] + CTRL_OFFSET)
  199.                      
  200.         grpx,  grpy  = grp.getPosition()        
  201.         offsetx = self.list['x'] + grpx
  202.         offsety = self.list['y'] + grpy      
  203.         height = grp.getHeight()
  204.         width  = grp.getWidth()
  205.         if height >= self.max['vertical']: self.max['vertical'] = height
  206.         if width  >= self.max['horizontal']:  self.max['horizontal']  = width      
  207.         control = ControlType(offsetx, offsety, ctrl, lbl, height, width)
  208.         self.ctrls[type] = control
  209.         self.removeControl(grp)
  210.        
  211.  
  212.        
  213.     def insert(self, control):
  214.         control.prepare()
  215.         self.addControl(control.label)
  216.         self.addControl(control.control)        
  217.         self.totalHeight += control.height
  218.         self.totalWidth  += control.width
  219.        
  220.        
  221.     def remove(self, control):
  222.         self.removeControl(control.label)
  223.         self.removeControl(control.control)      
  224.         self.totalHeight -= control.height
  225.         self.totalWidth  -= control.width
  226.        
  227.    
  228.     def listDown(self):
  229.         if self.categories
  230.         self.index += 1
  231.            
  232.              
  233. ui = TestUI("addon-settings-window.xml", addon.path, addon.skin, "720p")
  234. ui.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement