Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import xbmcgui
- import random
- import addon
- import copy
- import log
- ADDON_OFFSET = 13000
- LIST_OFFSET = 10
- GRP_OFFSET = 0
- LBL_OFFSET = 1
- CTRL_OFFSET = 2
- OFFSET = { 'bool': 20 }
- class ControlType:
- def __init__(self, control=None, label=None, height=0, width=0):
- self.height = height
- self.width = width
- self.control = control
- self.label = label
- self.id = 0
- def setLink(self, link):
- self.link = link
- def setText(self, text):
- self.label.setLabel(text)
- def setId(self):
- if self.id = 0:
- self.id = random.randint(10000, 100000)
- def prepare(self, ofx=0, ofy=0):
- self.setId()
- x, y = self.control.getPosition()
- self.control.setPosition(ofx + x, ofy + y)
- self.label.setPosition(ofx + x, ofy + y)
- self.control.setId(self.id+CTRL_OFFSET)
- self.label.setId(self.id+LBL_OFFSET)
- class ListView:
- def __init__(self, window, direction='vertical'):
- self.window = window
- self.direction = direction
- self.maxItems = 0
- self.itemSizeX = 0
- self.itemSizeY = 0
- self.sizeX = 0
- self.sizeY = 0
- self.index = 0
- self.start = 0
- self.end = 0
- self.items = list()
- self.all = list()
- def init(self):
- grp = self.getControl(ADDON_OFFSET + LIST_OFFSET + GRP_OFFSET)
- self.sizeY = grp.getHeight()
- self.sizeX = grp.getWidth()
- self.ofX, self.ofY = grp.getPosition()
- self.maxItems = int(
- (self.sizeX, self.sizeY)[self.direction=='vertical'] /
- (self.itemSizeX, self.itemSizeY)[self.direction=='vertical'] )
- def offset(self, m=0):
- x = self.offsetX + ( self.itemSizeX * (m,0)[self.direction=='vertical'] )
- y = self.offsetY + ( self.itemSizeY * (0,m)[self.direction=='vertical'] )
- return ( x, y )
- def before(self, item):
- x, y = self.offset(0)
- item.prepare(x,y)
- self.items.insert(0, item)
- if len(self.items) > self.maxItems:
- i = self.items.pop()
- self.window.removeControl(i.id+CTRL_OFFSET)
- self.window.removeControl(i.id+LBL_OFFSET)
- self.window.addControl(item.control)
- self.window.addControl(item.label)
- self.update()
- return item.id
- def after(self, item):
- x, y = self.offset(len(self.items))
- item.prepare(x,y)
- self.items.append(item)
- if len(self.items) > self.maxItems:
- i = self.items.popleft()
- self.window.removeControl(i.id+CTRL_OFFSET)
- self.window.removeControl(i.id+LBL_OFFSET)
- self.window.addControl(item.control)
- self.window.addControl(item.label)
- self.update()
- return item.id
- def update(self):
- for index, item in enumerate(self.list):
- x, y = self.offset(index)
- item.prepare(x,y)
- def clear(self):
- while(len(self.items)>0):
- item = self.items.pop()
- self.window.removeControl(item.id+CTRL_OFFSET)
- self.window.removeControl(item.id+LBL_OFFSET)
- def build(self):
- for i in range(self.maxItems):
- self.
- class TestUI(xbmcgui.WindowXML):
- def __init__(self, strXMLname, strFallbackPath, strDefaultName, forceFallback):
- self.direction = 'vertical'
- self.ctrls = {'bool': {}}
- self.category = 'default'
- self.container = dict()
- self.categories = { 'default': [] }
- self.list = list()
- self.id_link = dict()
- self.items = list()
- self.totalHeight = 0
- self.totalWidth = 0
- self.maxHeight = 0
- self.maxWidth = 0
- self.max = {'vertical':0, 'horizontal':0, 'items':0}
- self.maxItems = 0
- self.index = 0
- def addSetting(self, setting, category='default'):
- if not self.categories.has_key(category):
- self.categories[category] = []
- self.categories[category].append(setting)
- def build(self):
- max = self.max['items']
- idx = self.index
- i = 0
- self.list = list()
- self.id_link = dict()
- 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]):
- ctrl = self.new(item.type)
- ctrl.setLink(self.categories[self.category][index])
- ctrl.prepare(self.container['x']+self.max['horizontal']*i, self.container['y']+self.max['vertical']*i)
- self.id_link[ctrl.id+CTRL_OFFSET] = ctrl
- self.list.append(ctrl)
- self.addControl(ctrl.label)
- self.addControl(ctrl.control)
- def clear(self):
- self.
- def show(self):
- self.doModal()
- def onInit(self):
- self.readTypes()
- self.max['items'] = int( self.container[self.direction] / self.max[self.direction] )
- def onClick(self, control):
- ctrl = self.getControl(control)
- log.notice(str(ctrl.getId()))
- def new(self, type):
- control = copy.deepcopy(self.ctrls[type]['ctrl'])
- label = copy.deepcopy(self.ctrls[type]['lbl'])
- def readTypes(self):
- grp = self.getControl(ADDON_OFFSET + LIST_OFFSET + GRP_OFFSET)
- self.container['vertical'] = grp.getHeight()
- self.container['horizontal'] = grp.getWidth()
- self.container['x'], self.container['y'] = grp.getPosition()
- self.totalHeight = self.container['y']
- self.totalWidth = self.container['x']
- self.readType('bool')
- def readType(self, type):
- grp = self.getControl(ADDON_OFFSET + OFFSET[type] + GRP_OFFSET)
- lbl = self.getControl(ADDON_OFFSET + OFFSET[type] + LBL_OFFSET)
- ctrl = self.getControl(ADDON_OFFSET + OFFSET[type] + CTRL_OFFSET)
- grpx, grpy = grp.getPosition()
- offsetx = self.list['x'] + grpx
- offsety = self.list['y'] + grpy
- height = grp.getHeight()
- width = grp.getWidth()
- if height >= self.max['vertical']: self.max['vertical'] = height
- if width >= self.max['horizontal']: self.max['horizontal'] = width
- control = ControlType(offsetx, offsety, ctrl, lbl, height, width)
- self.ctrls[type] = control
- self.removeControl(grp)
- def insert(self, control):
- control.prepare()
- self.addControl(control.label)
- self.addControl(control.control)
- self.totalHeight += control.height
- self.totalWidth += control.width
- def remove(self, control):
- self.removeControl(control.label)
- self.removeControl(control.control)
- self.totalHeight -= control.height
- self.totalWidth -= control.width
- def listDown(self):
- if self.categories
- self.index += 1
- ui = TestUI("addon-settings-window.xml", addon.path, addon.skin, "720p")
- ui.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement