diff --git a/addon.xml b/addon.xml
index eb5e848..f22c288 100644
--- a/addon.xml
+++ b/addon.xml
@@ -8,6 +8,7 @@
+
video
diff --git a/controlcenter.py b/controlcenter.py
index 7371021..7bd7476 100644
--- a/controlcenter.py
+++ b/controlcenter.py
@@ -24,7 +24,7 @@ import xbmcaddon
import xbmc
import xbmcgui
from functions import getParameters, HistoryDB, Searchers, log
-from resources.pyxbmct.addonwindow import *
+import pyxbmct
__settings__ = xbmcaddon.Addon(id='plugin.video.torrenter')
__language__ = __settings__.getLocalizedString
@@ -39,7 +39,7 @@ if len(sys.argv) > 1:
else:
params = {}
-class ControlCenter(AddonDialogWindow):
+class ControlCenter(pyxbmct.AddonDialogWindow):
def __init__(self, title, addtime=None):
super(ControlCenter, self).__init__(title)
@@ -57,18 +57,17 @@ class ControlCenter(AddonDialogWindow):
if not providers:
self.db.set_providers(addtime, self.dic)
else:
- for searcher in self.keys:
+ for searcher in self.dic.keys():
self.dic[searcher] = False
for searcher in providers:
try:
- if searcher in self.keys:
+ if searcher in self.dic.keys():
self.dic[searcher] = True
except:
- pass
+ log('self.dic[searcher] except')
self.keys = self.dic.keys()
self.placed, self.button_columns, self.last_column_row = self.place()
- #print str((self.placed, self.button_columns, self.last_column_row))
else:
self.button_columns=0
@@ -78,7 +77,7 @@ class ControlCenter(AddonDialogWindow):
self.set_active_controls()
self.set_navigation()
# Connect a key action (Backspace) to close the window.
- self.connect(ACTION_NAV_BACK, self.close)
+ self.connect(pyxbmct.ACTION_NAV_BACK, self.close)
def place(self):
placed = {}
@@ -90,7 +89,6 @@ class ControlCenter(AddonDialogWindow):
else:
i += 1
placed[item] = (j, i)
- #print item+str((j, i))
return placed, j, i
def set_info_controls(self):
@@ -103,7 +101,7 @@ class ControlCenter(AddonDialogWindow):
self.radiobutton_top, self.radiobutton_bottom = [None, None, None], [None, None, None]
for searcher in self.keys:
place = self.placed[searcher]
- self.radiobutton[searcher] = RadioButton(searcher)
+ self.radiobutton[searcher] = pyxbmct.RadioButton(searcher)
self.placeControl(self.radiobutton[searcher], place[0], place[1])
self.radiobutton[searcher].setSelected(self.dic[searcher])
self.connect(self.radiobutton[searcher], self.radio_update)
@@ -112,32 +110,32 @@ class ControlCenter(AddonDialogWindow):
self.radiobutton_bottom[place[1]] = self.radiobutton[searcher]
# Button
- self.button_install = Button(__language__(30415))
+ self.button_install = pyxbmct.Button(__language__(30415))
self.placeControl(self.button_install, 2 + self.button_columns, 0)
self.connect(self.button_install, self.installSearcher)
# Button
- self.button_openserchset = Button(__language__(30416))
+ self.button_openserchset = pyxbmct.Button(__language__(30416))
self.placeControl(self.button_openserchset, 2 + self.button_columns, 1)
self.connect(self.button_openserchset, self.openSearcherSettings)
# Button
- self.button_clearstor = Button(__language__(30417))
+ self.button_clearstor = pyxbmct.Button(__language__(30417))
self.placeControl(self.button_clearstor, 2 + self.button_columns, 2)
self.connect(self.button_clearstor, self.clearStorage)
# Button
- self.button_openset = Button(__language__(30413))
+ self.button_openset = pyxbmct.Button(__language__(30413))
self.placeControl(self.button_openset, 3 + self.button_columns, 0)
self.connect(self.button_openset, self.openSettings)
# Button
- self.button_utorrent = Button(__language__(30414))
+ self.button_utorrent = pyxbmct.Button(__language__(30414))
self.placeControl(self.button_utorrent, 3 + self.button_columns, 1)
self.connect(self.button_utorrent, self.openUtorrent)
# Button
- self.button_close = Button(__language__(30412))
+ self.button_close = pyxbmct.Button(__language__(30412))
self.placeControl(self.button_close, 3 + self.button_columns, 2)
self.connect(self.button_close, self.close)
@@ -171,8 +169,6 @@ class ControlCenter(AddonDialogWindow):
ser = placed_keys[placed_values.index((place[0], place[1] - 1))]
self.radiobutton[searcher].controlLeft(self.radiobutton[ser])
- #print str((self.button_columns, self.last_column_row))
- #print searcher
if self.more_two_searcher:
if place == (self.button_columns, self.last_column_row) and self.last_column_row < 2:
ser = placed_keys[placed_values.index((place[0] - 1, place[1] + 1))]
@@ -247,7 +243,10 @@ class ControlCenter(AddonDialogWindow):
def openSearcherSettings(self):
slist=Searchers().activeExternal()
if len(slist)>0:
- ret = xbmcgui.Dialog().select(__language__(30418), slist)
+ if len(slist) == 1:
+ ret = 0
+ else:
+ ret = xbmcgui.Dialog().select(__language__(30418), slist)
if ret > -1 and ret < len(slist):
sid = slist[ret]
Searcher=xbmcaddon.Addon(id='torrenter.searcher.'+sid)
diff --git a/functions.py b/functions.py
index 0f33e64..e0d0132 100644
--- a/functions.py
+++ b/functions.py
@@ -917,7 +917,6 @@ class HistoryDB:
self.cur.execute('select providers from history where addtime="' + addtime + '"')
x = self.cur.fetchone()
self._close()
- # print 'get_providers: '+str(x[0].split(',') if x and x[0]!='' else None)
return x[0].split(',') if x and x[0] != '' else None
def set_providers(self, addtime, providers):
@@ -934,7 +933,7 @@ class HistoryDB:
self._close()
def change_providers(self, addtime, searcher):
- self._connect()
+ #self._connect()
providers = self.get_providers(addtime)
keys = Searchers().dic().keys()
if providers and len(providers) > 0:
@@ -946,8 +945,8 @@ class HistoryDB:
if i not in keys:
providers.remove(i)
self.set_providers(addtime, providers)
- self.db.commit()
- self._close()
+ #self.db.commit()
+ #self._close()
def add(self, url):
self._connect()
diff --git a/resources/contenters/KickAssSo.py b/resources/contenters/KickAssSo.py
index 3867011..b384404 100644
--- a/resources/contenters/KickAssSo.py
+++ b/resources/contenters/KickAssSo.py
@@ -82,21 +82,21 @@ class KickAssSo(Content.Content):
return False
def get_contentList(self, category, subcategory=None, apps_property=None):
+ self.debug = self.log
contentList = []
url = self.get_url(category, subcategory, apps_property)
response = self.makeRequest(url, headers=self.headers)
if None != response and 0 < len(response):
- # print response
+ self.debug(response)
if category:
contentList = self.mode(response)
- # print str(contentList)
+ self.debug(str(contentList))
return contentList
def mode(self, response):
contentList = []
- # print str(result)
num = 51
good_forums = ['TV', 'Anime', 'Movies']
regex = ''''''
@@ -129,6 +129,7 @@ class KickAssSo(Content.Content):
return contentList
def get_info(self, url):
+ self.debug = self.log
movieInfo = {}
color = '[COLOR blue]%s:[/COLOR] %s\r\n'
response = self.makeRequest(url, headers=self.headers)
@@ -190,7 +191,5 @@ class KickAssSo(Content.Content):
if i == 'IMDb link':
movieInfo['kinopoisk'] = 'http://imdb.snick.ru/ratefor/02/tt%s.png' % info.get(i)
-
- # print str(info)
-
+ self.debug(str(movieInfo))
return movieInfo
diff --git a/resources/pyxbmct/__init__.py b/resources/pyxbmct/__init__.py
deleted file mode 100644
index e69de29..0000000
diff --git a/resources/pyxbmct/addonwindow.py b/resources/pyxbmct/addonwindow.py
deleted file mode 100644
index c4825e9..0000000
--- a/resources/pyxbmct/addonwindow.py
+++ /dev/null
@@ -1,786 +0,0 @@
-# -*- coding: utf-8 -*-
-# This is a "local" version of PyXBMCt to be used in standalone addons.
-#
-# PyXBMCt is a mini-framework for creating XBMC Python addons with arbitrary UI
-# made of controls - decendants of xbmcgui.Control class.
-# The framework uses image textures from XBMC Confluence skin.
-#
-# Licence: GPL v.3 http://www.gnu.org/licenses/gpl.html
-#
-## @package addonwindow
-# PyXBMCt framework module
-
-import os
-
-import xbmc
-import xbmcgui
-
-
-# _addon = xbmcaddon.Addon()
-_images = os.path.join(os.path.dirname(__file__), 'textures', 'default')
-
-
-# Text alighnment constants. Mixed variants are obtained by bit OR (|)
-ALIGN_LEFT = 0
-ALIGN_RIGHT = 1
-ALIGN_CENTER_X = 2
-ALIGN_CENTER_Y = 4
-ALIGN_CENTER = 6
-ALIGN_TRUNCATED = 8
-ALIGN_JUSTIFY = 10
-
-# XBMC key action codes.
-# More codes at https://github.com/xbmc/xbmc/blob/master/xbmc/guilib/Key.h
-## ESC action
-ACTION_PREVIOUS_MENU = 10
-## Backspace action
-ACTION_NAV_BACK = 92
-## Left arrow key
-ACTION_MOVE_LEFT = 1
-## Right arrow key
-ACTION_MOVE_RIGHT = 2
-## Up arrow key
-ACTION_MOVE_UP = 3
-## Down arrow key
-ACTION_MOVE_DOWN = 4
-## Mouse wheel up
-ACTION_MOUSE_WHEEL_UP = 104
-## Mouse wheel down
-ACTION_MOUSE_WHEEL_DOWN = 105
-## Mouse drag
-ACTION_MOUSE_DRAG = 106
-## Mouse move
-ACTION_MOUSE_MOVE = 107
-
-
-def _set_textures(textures={}, kwargs={}):
- """Set texture arguments for controls."""
- for texture in textures.keys():
- try:
- kwargs[texture]
- except KeyError:
- kwargs[texture] = textures[texture]
-
-
-class AddonWindowError(Exception):
- """Custom exception."""
- pass
-
-
-class Label(xbmcgui.ControlLabel):
- """ControlLabel class.
-
- Parameters:
- label: string or unicode - text string.
- font: string - font used for label text. (e.g. 'font13')
- textColor: hexstring - color of enabled label's label. (e.g. '0xFFFFFFFF')
- disabledColor: hexstring - color of disabled label's label. (e.g. '0xFFFF3300')
- alignment: integer - alignment of label - *Note, see xbfont.h
- hasPath: bool - True=stores a path / False=no path.
- angle: integer - angle of control. (+ rotates CCW, - rotates CW)"
-
- Note:
- After you create the control, you need to add it to the window with placeControl().
-
- Example:
- self.label = Label('Status', angle=45)
- """
-
- def __new__(cls, *args, **kwargs):
- return super(Label, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs)
-
-
-class FadeLabel(xbmcgui.ControlFadeLabel):
- """Control that scrolls label text.
-
- Parameters:
- font: string - font used for label text. (e.g. 'font13')
- textColor: hexstring - color of fadelabel's labels. (e.g. '0xFFFFFFFF')
- _alignment: integer - alignment of label - *Note, see xbfont.h
-
- Note:
- After you create the control, you need to add it to the window with placeControl().
-
- Example:
- self.fadelabel = FadeLabel(textColor='0xFFFFFFFF')
- """
-
- def __new__(cls, *args, **kwargs):
- return super(FadeLabel, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs)
-
-
-class TextBox(xbmcgui.ControlTextBox):
- """ControlTextBox class.
-
- Parameters:
- font: string - font used for text. (e.g. 'font13')
- textColor: hexstring - color of textbox's text. (e.g. '0xFFFFFFFF')
-
- Note:
- After you create the control, you need to add it to the window with placeControl().
-
- Example:
- self.textbox = TextBox(textColor='0xFFFFFFFF')
- """
-
- def __new__(cls, *args, **kwargs):
- return super(TextBox, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs)
-
-
-class Image(xbmcgui.ControlImage):
- """ControlImage class.
-
- Parameters:
- filename: string - image filename.
- colorKey: hexString - (example, '0xFFFF3300')
- aspectRatio: integer - (values 0 = stretch (default), 1 = scale up (crops), 2 = scale down (black bars)
- colorDiffuse: hexString - (example, '0xC0FF0000' (red tint)).
-
- Note:
- After you create the control, you need to add it to the window with placeControl().
-
- Example:
- self.image = Image('d:\images\picture.jpg', aspectRatio=2)
- """
-
- def __new__(cls, *args, **kwargs):
- return super(Image, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs)
-
-
-class Button(xbmcgui.ControlButton):
- """ControlButton class.
-
- Parameters:
- label: string or unicode - text string.
- focusTexture: string - filename for focus texture.
- noFocusTexture: string - filename for no focus texture.
- textOffsetX: integer - x offset of label.
- textOffsetY: integer - y offset of label.
- alignment: integer - alignment of label - *Note, see xbfont.h
- font: string - font used for label text. (e.g. 'font13')
- textColor: hexstring - color of enabled button's label. (e.g. '0xFFFFFFFF')
- disabledColor: hexstring - color of disabled button's label. (e.g. '0xFFFF3300')
- angle: integer - angle of control. (+ rotates CCW, - rotates CW)
- shadowColor: hexstring - color of button's label's shadow. (e.g. '0xFF000000')
- focusedColor: hexstring - color of focused button's label. (e.g. '0xFF00FFFF')
-
- Note:
- After you create the control, you need to add it to the window with placeControl().
-
- Example:
- self.button = Button('Status', font='font14')
- """
-
- def __new__(cls, *args, **kwargs):
- textures = {'focusTexture': os.path.join(_images, 'Button', 'KeyboardKey.png'),
- 'noFocusTexture': os.path.join(_images, 'Button', 'KeyboardKeyNF.png')}
- _set_textures(textures, kwargs)
- try:
- kwargs['alignment']
- except KeyError:
- kwargs['alignment'] = ALIGN_CENTER
- return super(Button, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs)
-
-
-class RadioButton(xbmcgui.ControlRadioButton):
- """ControlRadioButton class.
-
- Parameters:
- label: string or unicode - text string.
- focusTexture: string - filename for focus texture.
- noFocusTexture: string - filename for no focus texture.
- textOffsetX: integer - x offset of label.
- textOffsetY: integer - y offset of label.
- _alignment: integer - alignment of label - *Note, see xbfont.h
- font: string - font used for label text. (e.g. 'font13')
- textColor: hexstring - color of enabled radio button's label. (e.g. '0xFFFFFFFF')
- disabledColor: hexstring - color of disabled radio button's label. (e.g. '0xFFFF3300')
- angle: integer - angle of control. (+ rotates CCW, - rotates CW)
- shadowColor: hexstring - color of radio button's label's shadow. (e.g. '0xFF000000')
- focusedColor: hexstring - color of focused radio button's label. (e.g. '0xFF00FFFF')
- focusOnTexture: string - filename for radio focused/checked texture.
- noFocusOnTexture: string - filename for radio not focused/checked texture.
- focusOffTexture: string - filename for radio focused/unchecked texture.
- noFocusOffTexture: string - filename for radio not focused/unchecked texture.
- Note: To customize RadioButton all 4 abovementioned textures need to be provided.
-
- Note:
- After you create the control, you need to add it to the window with placeControl().
-
- Example:
- self.radiobutton = RadioButton('Status', font='font14')
- """
-
- def __new__(cls, *args, **kwargs):
- if int(xbmc.getInfoLabel('System.BuildVersion')[:2]) >= 13:
- textures = {'focusTexture': os.path.join(_images, 'RadioButton', 'MenuItemFO.png'),
- 'noFocusTexture': os.path.join(_images, 'RadioButton', 'MenuItemNF.png'),
- 'focusOnTexture': os.path.join(_images, 'RadioButton', 'radiobutton-focus.png'),
- 'noFocusOnTexture': os.path.join(_images, 'RadioButton', 'radiobutton-focus.png'),
- 'focusOffTexture': os.path.join(_images, 'RadioButton', 'radiobutton-nofocus.png'),
- 'noFocusOffTexture': os.path.join(_images, 'RadioButton', 'radiobutton-nofocus.png')}
- else: # This is for compatibility with Frodo and earlier versions.
- textures = {'focusTexture': os.path.join(_images, 'RadioButton', 'MenuItemFO.png'),
- 'noFocusTexture': os.path.join(_images, 'RadioButton', 'MenuItemNF.png'),
- 'TextureRadioFocus': os.path.join(_images, 'RadioButton', 'radiobutton-focus.png'),
- 'TextureRadioNoFocus': os.path.join(_images, 'RadioButton', 'radiobutton-nofocus.png')}
- _set_textures(textures, kwargs)
- return super(RadioButton, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs)
-
-
-class Edit(xbmcgui.ControlEdit):
- """
- ControlEdit class.
-
- Edit(label[, font, textColor, disabledColor, alignment, focusTexture, noFocusTexture])
-
- Parameters:
- label : string or unicode - text string.
- font : [opt] string - font used for label text. (e.g. 'font13')
- textColor : [opt] hexstring - color of enabled label's label. (e.g. '0xFFFFFFFF')
- disabledColor : [opt] hexstring - color of disabled label's label. (e.g. '0xFFFF3300')
- _alignment : [opt] integer - alignment of label - *Note, see xbfont.h
- focusTexture : [opt] string - filename for focus texture.
- noFocusTexture : [opt] string - filename for no focus texture.
- isPassword : [opt] bool - if true, mask text value.
-
- *Note, You can use the above as keywords for arguments and skip certain optional arguments.
- Once you use a keyword, all following arguments require the keyword.
- After you create the control, you need to add it to the window with palceControl().
-
- example:
- - self.edit = Edit('Status')
- """
-
- def __new__(cls, *args, **kwargs):
- textures = {'focusTexture': os.path.join(_images, 'Edit', 'button-focus.png'),
- 'noFocusTexture': os.path.join(_images, 'Edit', 'black-back2.png')}
- _set_textures(textures, kwargs)
- return super(Edit, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs)
-
-
-class List(xbmcgui.ControlList):
- """ControlList class.
-
- Parameters:
- font: string - font used for items label. (e.g. 'font13')
- textColor: hexstring - color of items label. (e.g. '0xFFFFFFFF')
- buttonTexture: string - filename for no focus texture.
- buttonFocusTexture: string - filename for focus texture.
- selectedColor: integer - x offset of label.
- _imageWidth: integer - width of items icon or thumbnail.
- _imageHeight: integer - height of items icon or thumbnail.
- _itemTextXOffset: integer - x offset of items label.
- _itemTextYOffset: integer - y offset of items label.
- _itemHeight: integer - height of items.
- _space: integer - space between items.
- _alignmentY: integer - Y-axis alignment of items label - *Note, see xbfont.h
-
- Note:
- After you create the control, you need to add it to the window with placeControl().
-
- Example:
- self.cList = List('font14', space=5)
- """
-
- def __new__(cls, *args, **kwargs):
- textures = {'buttonTexture': os.path.join(_images, 'List', 'MenuItemNF.png'),
- 'buttonFocusTexture': os.path.join(_images, 'List', 'MenuItemFO.png')}
- _set_textures(textures, kwargs)
- return super(List, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs)
-
-
-class Slider(xbmcgui.ControlSlider):
- """ControlSlider class.
-
- Parameters:
- textureback: string - image filename.
- texture: string - image filename.
- texturefocus: string - image filename.
-
- Note:
- After you create the control, you need to add it to the window with placeControl().
-
- Example:
- self.slider = Slider()
- """
-
- def __new__(cls, *args, **kwargs):
- textures = {'textureback': os.path.join(_images, 'Slider', 'osd_slider_bg.png'),
- 'texture': os.path.join(_images, 'Slider', 'osd_slider_nibNF.png'),
- 'texturefocus': os.path.join(_images, 'Slider', 'osd_slider_nib.png')}
- _set_textures(textures, kwargs)
- return super(Slider, cls).__new__(cls, -10, -10, 1, 1, *args, **kwargs)
-
-
-class _AbstractWindow(object):
- """
- Top-level control window.
-
- The control windows serves as a parent widget for other XBMC UI controls
- much like Tkinter.Tk or PyQt QWidget class.
- This is an abstract class which is not supposed to be instantiated directly
- and will raise exeptions.
-
- This class is a basic "skeleton" for a control window.
- """
-
- def __init__(self):
- """Constructor method."""
- self.actions_connected = []
- self.controls_connected = []
-
- def setGeometry(self, width_, height_, rows_, columns_, pos_x=-1, pos_y=-1):
- """
- Set width, height, Grid layout, and coordinates (optional) for a new control window.
-
- Parameters:
- width_, height_: widgh and height of the created window.
- rows_, columns_: rows and colums of the Grid layout to place controls on.
- pos_x, pos_y (optional): coordinates of the top left corner of the window.
- If pos_x and pos_y are not privided, the window will be placed
- at the center of the screen.
- Example:
- self.setGeometry(400, 500, 5, 4)
- """
- self.width = width_
- self.height = height_
- self.rows = rows_
- self.columns = columns_
- if pos_x > 0 and pos_y > 0:
- self.x = pos_x
- self.y = pos_y
- else:
- self.x = 640 - self.width / 2
- self.y = 360 - self.height / 2
- self.setGrid()
-
- def setGrid(self):
- """
- Set window grid layout of rows * columns.
- This is a helper method not to be called directly.
- """
- self.grid_x = self.x
- self.grid_y = self.y
- self.tile_width = self.width / self.columns
- self.tile_height = self.height / self.rows
-
- def placeControl(self, control, row, column, rowspan=1, columnspan=1, pad_x=5, pad_y=5):
- """
- Place a control within the window grid layout.
-
- pad_x, pad_y: horisontal and vertical padding for control's
- size and aspect adjustments. Negative values can be used
- to make a control overlap with grid cells next to it, if necessary.
- Raises AddonWindowError if a grid has not yet been set.
- Example:
- self.placeControl(self.label, 0, 1)
- """
- try:
- control_x = (self.grid_x + self.tile_width * column) + pad_x
- control_y = (self.grid_y + self.tile_height * row) + pad_y
- control_width = self.tile_width * columnspan - 2 * pad_x
- control_height = self.tile_height * rowspan - 2 * pad_y
- except AttributeError:
- raise AddonWindowError('Window geometry is not defined! Call setGeometry first.')
- control.setPosition(control_x, control_y)
- control.setWidth(control_width)
- control.setHeight(control_height)
- self.addControl(control)
- self.setAnimation(control)
-
- def getX(self):
- """Get X coordinate of the top-left corner of the window."""
- try:
- return self.x
- except AttributeError:
- raise AddonWindowError('Window geometry is not defined! Call setGeometry first.')
-
- def getY(self):
- """Get Y coordinate of the top-left corner of the window."""
- try:
- return self.y
- except AttributeError:
- raise AddonWindowError('Window geometry is not defined! Call setGeometry first.')
-
- def getWindowWidth(self):
- """Get window width."""
- try:
- return self.width
- except AttributeError:
- raise AddonWindowError('Window geometry is not defined! Call setGeometry first.')
-
- def getWindowHeight(self):
- """Get window height."""
- try:
- return self.height
- except AttributeError:
- raise AddonWindowError('Window geometry is not defined! Call setGeometry first.')
-
- def getRows(self):
- """
- Get grid rows count.
- Raises AddonWindowError if a grid has not yet been set.
- """
- try:
- return self.rows
- except AttributeError:
- raise AddonWindowError('Grid layot is not set! Call setGeometry first.')
-
- def getColumns(self):
- """
- Get grid columns count.
- Raises AddonWindowError if a grid has not yet been set.
- """
- try:
- return self.columns
- except AttributeError:
- raise AddonWindowError('Grid layout is not set! Call setGeometry first.')
-
- def connect(self, event, function):
- """
- Connect an event to a function.
-
- An event can be an inctance of a Control object or an integer key action code.
- Several basic key action codes are provided by PyXBMCT. More action codes can be found at
- https://github.com/xbmc/xbmc/blob/master/xbmc/guilib/Key.h
-
- You can connect the following Controls: Button, RadioButton and List. Other Controls do not
- generate any control events when activated so their connections won't work.
- To catch Slider events you need to connect the following key actions:
- ACTION_MOVE_LEFT, ACTION_MOVE_RIGHT and ACTION_MOUSE_DRAG, and do a check
- whether the Slider is focused.
-
- "function" parameter is a function or a method to be executed. Note that you must provide
- a function object [without brackets ()], not a function call!
- lambda can be used as a function to call another function or method with parameters.
-
- Examples:
- self.connect(self.exit_button, self.close)
- or
- self.connect(ACTION_NAV_BACK, self.close)
- """
- try:
- self.disconnect(event)
- except AddonWindowError:
- if type(event) == int:
- self.actions_connected.append([event, function])
- else:
- self.controls_connected.append([event, function])
-
- def connectEventList(self, events, function):
- """
- Connect a list of controls/action codes to a function.
- See connect docstring for more info.
- """
- [self.connect(event, function) for event in events]
-
- def disconnect(self, event):
- """
- Disconnect an event from a function.
-
- An event can be an inctance of a Control object or an integer key action code
- which has previously been connected to a function or a method.
- Raises AddonWindowError if an event is not connected to any function.
-
- Examples:
- self.disconnect(self.exit_button)
- or
- self.disconnect(ACTION_NAV_BACK)
- """
- if type(event) == int:
- event_list = self.actions_connected
- else:
- event_list = self.controls_connected
- for index in range(len(event_list)):
- if event == event_list[index][0]:
- event_list.pop(index)
- break
- else:
- raise AddonWindowError('The action or control %s is not connected!' % event)
-
- def disconnectEventList(self, events):
- """
- Disconnect a list of controls/action codes from functions.
- See disconnect docstring for more info.
- Raises AddonWindowError if at least one event in the list
- is not connected to any function.
- """
- [self.disconnect(event) for event in events]
-
- def executeConnected(self, event, connected_list):
- """
- Execute a connected event (an action or a control).
- This is a helper method not to be called directly.
- """
- for item in connected_list:
- if event == item[0]:
- item[1]()
- break
-
- def setAnimation(self, control):
- """
- This method is called to set animation properties for all controls
- added to the current addon window instance - both built-in controls
- (window background, title bar etc.) and controls added with placeControl().
- It receives a control instance as the 2nd positional argument (besides self).
- By default the method does nothing, i.e. no animation is set for controls.
- To add animation you need to re-implement this menthod in your child class.
-
- E.g:
- def setAnimation(self, control):
- control.setAnimations([('WindowOpen', 'effect=fade start=0 end=100 time=1000',),
- ('WindowClose', 'effect=fade start=100 end=0 time=1000',)])
- """
- pass
-
-
-class _AddonWindow(_AbstractWindow):
- """
- Top-level control window.
-
- The control windows serves as a parent widget for other XBMC UI controls
- much like Tkinter.Tk or PyQt QWidget class.
- This is an abstract class which is not supposed to be instantiated directly
- and will raise exeptions. It is designed to be implemented in a grand-child class
- with the second inheritance from xbmcgui.Window or xbmcgui.WindowDialog
- in a direct child class.
-
- This class provides a control window with a background and a header
- similar to top-level widgets of desktop UI frameworks.
- """
-
- def __init__(self, title=''):
- """Constructor method."""
- super(_AddonWindow, self).__init__()
- self.setFrame(title)
-
- def setFrame(self, title):
- """
- Define paths to images for window background and title background textures,
- and set control position adjustment constants used in setGrid.
- This is a helper method not to be called directly.
- """
- # Window background image
- self.background_img = os.path.join(_images, 'AddonWindow', 'ContentPanel.png')
- # Background for a window header
- self.title_background_img = os.path.join(_images, 'AddonWindow', 'dialogheader.png')
- # Horisontal adjustment for a header background if the main background has transparent edges.
- self.X_MARGIN = 5
- # Vertical adjustment for a header background if the main background has transparent edges
- self.Y_MARGIN = 5
- # Header position adjustment if the main backround has visible borders.
- self.Y_SHIFT = 4
- # The height of a window header (for the title background and the title label).
- self.HEADER_HEIGHT = 35
- self.background = xbmcgui.ControlImage(-10, -10, 1, 1, self.background_img)
- self.addControl(self.background)
- self.setAnimation(self.background)
- self.title_background = xbmcgui.ControlImage(-10, -10, 1, 1, self.title_background_img)
- self.addControl(self.title_background)
- self.setAnimation(self.title_background)
- self.title_bar = xbmcgui.ControlLabel(-10, -10, 1, 1, title, alignment=ALIGN_CENTER, textColor='0xFFFFA500',
- font='font13_title')
- self.addControl(self.title_bar)
- self.setAnimation(self.title_bar)
- self.window_close_button = xbmcgui.ControlButton(-100, -100, 60, 30, '',
- focusTexture=os.path.join(_images, 'AddonWindow',
- 'DialogCloseButton-focus.png'),
- noFocusTexture=os.path.join(_images, 'AddonWindow',
- 'DialogCloseButton.png'))
- self.addControl(self.window_close_button)
- self.setAnimation(self.window_close_button)
-
- def setGeometry(self, width_, height_, rows_, columns_, pos_x=-1, pos_y=-1, padding=5):
- """
- Set width, height, Grid layout, and coordinates (optional) for a new control window.
-
- Parameters:
- width_, height_: widgh and height of the created window.
- rows_, columns_: rows and colums of the Grid layout to place controls on.
- pos_x, pos_y (optional): coordinates of the top left corner of the window.
- If pos_x and pos_y are not privided, the window will be placed
- at the center of the screen.
- padding (optional): padding between outer edges of the window and
- controls placed on it.
- Example:
- self.setGeometry(400, 500, 5, 4)
- """
- self.win_padding = padding
- super(_AddonWindow, self).setGeometry(width_, height_, rows_, columns_, pos_x, pos_y)
- self.background.setPosition(self.x, self.y)
- self.background.setWidth(self.width)
- self.background.setHeight(self.height)
- self.title_background.setPosition(self.x + self.X_MARGIN, self.y + self.Y_MARGIN + self.Y_SHIFT)
- self.title_background.setWidth(self.width - 2 * self.X_MARGIN)
- self.title_background.setHeight(self.HEADER_HEIGHT)
- self.title_bar.setPosition(self.x + self.X_MARGIN, self.y + self.Y_MARGIN + self.Y_SHIFT)
- self.title_bar.setWidth(self.width - 2 * self.X_MARGIN)
- self.title_bar.setHeight(self.HEADER_HEIGHT)
- self.window_close_button.setPosition(self.x + self.width - 70, self.y + self.Y_MARGIN + self.Y_SHIFT)
-
- def setGrid(self):
- """
- Set window grid layout of rows * columns.
- This is a helper method not to be called directly.
- """
- self.grid_x = self.x + self.X_MARGIN + self.win_padding
- self.grid_y = self.y + self.Y_MARGIN + self.Y_SHIFT + self.HEADER_HEIGHT + self.win_padding
- self.tile_width = (self.width - 2 * (self.X_MARGIN + self.win_padding)) / self.columns
- self.tile_height = (
- self.height - self.HEADER_HEIGHT - self.Y_SHIFT - 2 * (
- self.Y_MARGIN + self.win_padding)) / self.rows
-
- def setWindowTitle(self, title=''):
- """
- Set window title.
- This method must be called AFTER (!!!) setGeometry(),
- otherwise there is some werid bug with all skin text labels set to the 'title' text.
- Example:
- self.setWindowTitle('My Cool Addon')
- """
- self.title_bar.setLabel(title)
-
- def getWindowTitle(self):
- """Get window title."""
- return self.title_bar.getLabel()
-
-
-class _FullWindow(xbmcgui.Window):
- """An abstract class to define window event processing."""
-
- def onAction(self, action):
- """
- Catch button actions.
- Note that, despite being compared to an integer,
- action is an instance of xbmcgui.Action class.
- """
- if action == ACTION_PREVIOUS_MENU:
- self.close()
- else:
- self.executeConnected(action, self.actions_connected)
-
- def onControl(self, control):
- """
- Catch activated controls.
- Control is an instance of xbmcgui.Control class.
- """
- if control == self.window_close_button:
- self.close()
- else:
- self.executeConnected(control, self.controls_connected)
-
-
-class _DialogWindow(xbmcgui.WindowDialog):
- """An abstract class to define window event processing."""
-
- def onAction(self, action):
- """
- Catch button actions.
- Note that, despite being compared to an integer,
- action is an instance of xbmcgui.Action class.
- """
- if action == ACTION_PREVIOUS_MENU:
- self.close()
- else:
- self.executeConnected(action, self.actions_connected)
-
- def onControl(self, control):
- """
- Catch activated controls.
- Control is an instance of xbmcgui.Control class.
- """
- if control == self.window_close_button:
- self.close()
- else:
- self.executeConnected(control, self.controls_connected)
-
-
-class BlankFullWindow(_FullWindow, _AbstractWindow):
- """
- Addon UI container with a solid background.
- This is a blank window with a black background and without any elements whatsoever.
- The decoration and layout are completely up to an addon developer.
- The window controls can hide under video or music visualization.
- Window ID can be passed on class instantiation an agrument
- but __init__ must have the 2nd fake argument, e.g:
-
- def __init__(self, *args)
-
- Minimal example:
-
- addon = MyAddon('My Cool Addon')
- addon.setGeometry(400, 300, 4, 3)
- addon.doModal()
- """
- pass
-
-
-class BlankDialogWindow(_DialogWindow, _AbstractWindow):
- """
- Addon UI container with a transparent background.
- This is a blank window with a transparent background and without any elements whatsoever.
- The decoration and layout are completely up to an addon developer.
- The window controls are always displayed over video or music visualization.
- Minimal example:
-
- addon = MyAddon('My Cool Addon')
- addon.setGeometry(400, 300, 4, 3)
- addon.doModal()
- """
- pass
-
-
-class AddonFullWindow(_FullWindow, _AddonWindow):
- """
- Addon UI container with a solid background.
- Control window is displayed on top of the main background image - self.main_bg.
- Video and music visualization are displayed unhindered.
- Window ID can be passed on class instantiation as the 2nd positional agrument
- but __init__ must have the 3rd fake argument, e.g:
-
- def __init__(self, title='', *args)
-
- Minimal example:
-
- addon = MyAddon('My Cool Addon')
- addon.setGeometry(400, 300, 4, 3)
- addon.doModal()
- """
-
- def __new__(cls, title='', *args, **kwargs):
- return super(AddonFullWindow, cls).__new__(cls, *args, **kwargs)
-
- def setFrame(self, title):
- """
- Set the image for for the fullscreen background.
- """
- # Image for the fullscreen background.
- self.main_bg_img = os.path.join(_images, 'AddonWindow', 'SKINDEFAULT.jpg')
- # Fullscreen background image control.
- self.main_bg = xbmcgui.ControlImage(1, 1, 1280, 720, self.main_bg_img)
- self.addControl(self.main_bg)
- super(AddonFullWindow, self).setFrame(title)
-
- def setBackground(self, image=''):
- """
- Set the main bacground to an image file.
- image: path to an image file as str.
- Example:
- self.setBackground('d:\images\bacground.png')
- """
- self.main_bg.setImage(image)
-
-
-class AddonDialogWindow(_DialogWindow, _AddonWindow):
- """
- Addon UI container with a transparent background.
- Control window is displayed on top of XBMC UI,
- including video an music visualization!
- Minimal example:
-
- addon = MyAddon('My Cool Addon')
- addon.setGeometry(400, 300, 4, 3)
- addon.doModal()
- """
- pass
diff --git a/resources/pyxbmct/textures/default/AddonWindow/ContentPanel.png b/resources/pyxbmct/textures/default/AddonWindow/ContentPanel.png
deleted file mode 100644
index eb022d6..0000000
Binary files a/resources/pyxbmct/textures/default/AddonWindow/ContentPanel.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/AddonWindow/DialogCloseButton-focus.png b/resources/pyxbmct/textures/default/AddonWindow/DialogCloseButton-focus.png
deleted file mode 100644
index fdde65c..0000000
Binary files a/resources/pyxbmct/textures/default/AddonWindow/DialogCloseButton-focus.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/AddonWindow/DialogCloseButton.png b/resources/pyxbmct/textures/default/AddonWindow/DialogCloseButton.png
deleted file mode 100644
index 7f5d105..0000000
Binary files a/resources/pyxbmct/textures/default/AddonWindow/DialogCloseButton.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/AddonWindow/SKINDEFAULT.jpg b/resources/pyxbmct/textures/default/AddonWindow/SKINDEFAULT.jpg
deleted file mode 100644
index 3d5b572..0000000
Binary files a/resources/pyxbmct/textures/default/AddonWindow/SKINDEFAULT.jpg and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/AddonWindow/dialogheader.png b/resources/pyxbmct/textures/default/AddonWindow/dialogheader.png
deleted file mode 100644
index af7ba85..0000000
Binary files a/resources/pyxbmct/textures/default/AddonWindow/dialogheader.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/Button/KeyboardKey.png b/resources/pyxbmct/textures/default/Button/KeyboardKey.png
deleted file mode 100644
index 5c8b2bf..0000000
Binary files a/resources/pyxbmct/textures/default/Button/KeyboardKey.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/Button/KeyboardKeyNF.png b/resources/pyxbmct/textures/default/Button/KeyboardKeyNF.png
deleted file mode 100644
index 077777f..0000000
Binary files a/resources/pyxbmct/textures/default/Button/KeyboardKeyNF.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/Edit/black-back2.png b/resources/pyxbmct/textures/default/Edit/black-back2.png
deleted file mode 100644
index 399e2d0..0000000
Binary files a/resources/pyxbmct/textures/default/Edit/black-back2.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/Edit/button-focus.png b/resources/pyxbmct/textures/default/Edit/button-focus.png
deleted file mode 100644
index 831dd45..0000000
Binary files a/resources/pyxbmct/textures/default/Edit/button-focus.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/List/MenuItemFO.png b/resources/pyxbmct/textures/default/List/MenuItemFO.png
deleted file mode 100644
index 14230c0..0000000
Binary files a/resources/pyxbmct/textures/default/List/MenuItemFO.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/List/MenuItemNF.png b/resources/pyxbmct/textures/default/List/MenuItemNF.png
deleted file mode 100644
index ecbf84f..0000000
Binary files a/resources/pyxbmct/textures/default/List/MenuItemNF.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/RadioButton/MenuItemFO.png b/resources/pyxbmct/textures/default/RadioButton/MenuItemFO.png
deleted file mode 100644
index 14230c0..0000000
Binary files a/resources/pyxbmct/textures/default/RadioButton/MenuItemFO.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/RadioButton/MenuItemNF.png b/resources/pyxbmct/textures/default/RadioButton/MenuItemNF.png
deleted file mode 100644
index ecbf84f..0000000
Binary files a/resources/pyxbmct/textures/default/RadioButton/MenuItemNF.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/RadioButton/radiobutton-focus.png b/resources/pyxbmct/textures/default/RadioButton/radiobutton-focus.png
deleted file mode 100644
index bcb4cb5..0000000
Binary files a/resources/pyxbmct/textures/default/RadioButton/radiobutton-focus.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/RadioButton/radiobutton-nofocus.png b/resources/pyxbmct/textures/default/RadioButton/radiobutton-nofocus.png
deleted file mode 100644
index 282396d..0000000
Binary files a/resources/pyxbmct/textures/default/RadioButton/radiobutton-nofocus.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/Slider/osd_slider_bg.png b/resources/pyxbmct/textures/default/Slider/osd_slider_bg.png
deleted file mode 100644
index 4b5160b..0000000
Binary files a/resources/pyxbmct/textures/default/Slider/osd_slider_bg.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/Slider/osd_slider_bg_2.png b/resources/pyxbmct/textures/default/Slider/osd_slider_bg_2.png
deleted file mode 100644
index 37dc249..0000000
Binary files a/resources/pyxbmct/textures/default/Slider/osd_slider_bg_2.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/Slider/osd_slider_nib.png b/resources/pyxbmct/textures/default/Slider/osd_slider_nib.png
deleted file mode 100644
index 4e57eb1..0000000
Binary files a/resources/pyxbmct/textures/default/Slider/osd_slider_nib.png and /dev/null differ
diff --git a/resources/pyxbmct/textures/default/Slider/osd_slider_nibNF.png b/resources/pyxbmct/textures/default/Slider/osd_slider_nibNF.png
deleted file mode 100644
index 638d4f8..0000000
Binary files a/resources/pyxbmct/textures/default/Slider/osd_slider_nibNF.png and /dev/null differ