[MerlinEGCenter] add support for default FHD skin
[enigma2-plugins.git] / merlinepgcenter / src / SkinFinder.py
1 #
2 #  SkinFinder E2
3 #
4 #  $Id: SkinFinder.py,v 1.0 2011-06-28 00:00:00 shaderman Exp $
5 #
6 #  Coded by Shaderman (c) 2011
7 #  Support: www.dreambox-tools.info
8 #
9 #  This plugin is licensed under the Creative Commons 
10 #  Attribution-NonCommercial-ShareAlike 3.0 Unported 
11 #  License. To view a copy of this license, visit
12 #  http://creativecommons.org/licenses/by-nc-sa/3.0/ or send a letter to Creative
13 #  Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
14 #
15 #  Alternatively, this plugin may be distributed and executed on hardware which
16 #  is licensed by Dream Property GmbH.
17
18 #  This plugin is NOT free software. It is open source, you are allowed to
19 #  modify it (if you keep the license), but it may not be commercially 
20 #  distributed other than under the conditions noted above.
21 #
22
23 # PYTHON IMPORTS
24 from glob import iglob
25 from os.path import basename as path_basename
26
27 # ENIGMA IMPORTS
28 from enigma import getDesktop
29 from Tools.Directories import resolveFilename, SCOPE_CURRENT_PLUGIN
30
31 # DESCRIPTION:
32 """
33 SKINDIR:
34 A subdirectory of you plugin where required default skins (HD_default.xml, XD_default.xml and SD_default.xml) can be found
35 along with more (optional) custom skins.
36
37 SKINLIST:
38 A list of 3 tuples (full path and filename of a skin file, basename of the skin file).
39                 
40 config.plugins.yourConfigText.skin.value:
41 A ConfigText value of a skin filename.
42
43 getSkinData() checks if a skin file set in config.plugins.yourConfigText.skin.value can be found in SKINDIR. If it's found,
44 it'll be returned together with a list of all skins found in SKINDIR (thos files with a .xml ending). If it can't be found,
45 the matching skin file for the detected reolution will be returned along with a list of all skins found in SKINDIR.
46 These return values can be used by a ConfigSelection object to build a choice list with a default choice value
47 (config.plugins.yourConfigSelection.skinSelection.setChoices(skinList, default = skinFile)).
48 This function can also be called for example on plugin start to load a selected skin (skin.loadSkin), or to refresh the
49 ConfigSelection choices when plugin settings are shown.
50 """
51
52 # USAGE EXAMPLE:
53 """
54 SKINDIR = "Extensions/YourPlugin/skins/"
55
56 SKINLIST =      [ # order is important (HD, XD, SD)!
57                 (resolveFilename(SCOPE_CURRENT_PLUGIN, ''.join([SKINDIR, "HD_default.xml"])), "HD_default.xml"),
58                 (resolveFilename(SCOPE_CURRENT_PLUGIN, ''.join([SKINDIR, "XD_default.xml"])), "XD_default.xml"),
59                 (resolveFilename(SCOPE_CURRENT_PLUGIN, ''.join([SKINDIR, "SD_default.xml"])), "SD_default.xml")
60                 ]
61                 
62 class YourClass():
63         (skinFile, skinList) = SkinFinder.getSkinData(SKINLIST, SKINDIR, config.plugins.yourConfigText.skin.value)
64         if skinFile is not None:
65                 if config.plugins.yourConfigText.skin.value != skinFile:
66                         config.plugins.yourConfigText.skin.value = skinFile
67                         config.plugins.yourConfigText.skin.save()
68                 config.plugins.yourConfigSelection.skinSelection.setChoices(skinList, default = skinFile)
69                 loadSkin(skinFile, "")
70 """
71
72 class SkinFinder(object):
73         skinList = None
74         skinDir = None
75         
76         @staticmethod
77         def getSkinData(skinList, skinDir, currentSkinValue):
78                 SkinFinder.skinList = skinList[:] # we don't want the passed list to be modified, let's use a copy instead
79                 SkinFinder.skinDir = skinDir
80                 
81                 if currentSkinValue == "":
82                         firstRun = True
83                 else:
84                         firstRun = False
85                         
86                 # build a list of the filenames from our (default) skin list
87                 skinListFiles = [x[0] for x in SkinFinder.skinList]
88                 
89                 # try to find additional skins and add them to our list
90                 path = resolveFilename(SCOPE_CURRENT_PLUGIN, ''.join([skinDir, "*.xml"]))
91                 for fileName in iglob(path):
92                         if not fileName in skinListFiles:
93                                 baseName = path_basename(fileName)
94                                 SkinFinder.skinList.append((fileName, baseName))
95                                 if not firstRun:
96                                         skinListFiles.append(fileName)
97                                         
98                 if not firstRun:
99                         # try to find the config value in our list of files
100                         if currentSkinValue in skinListFiles:
101                                 skinIndex = skinListFiles.index(currentSkinValue)
102                         else:
103                                 # fall back to the default skin
104                                 print '[SkinFinder] unable to find skin file %s, tryig to load a default skin' % currentSkinValue
105                                 skinIndex = SkinFinder.getDefaultSkinEntry()
106                 else:
107                         # get the index of the detected skin in our list of default skins
108                         skinIndex = SkinFinder.getDefaultSkinEntry()
109                         
110                 if skinIndex is not None:
111                         skinFile = SkinFinder.skinList[skinIndex][0]
112                         print '[SkinFinder] found skin file', skinFile
113                         return skinFile, SkinFinder.skinList
114                 else:
115                         print '[SkinFinder] unable to find any skin!'
116                         return None
117                         
118         @staticmethod
119         def getDefaultSkinEntry():
120                 desktopSize = getDesktop(0).size()
121                 if desktopSize.width() == 1280:
122                         fileName = resolveFilename(SCOPE_CURRENT_PLUGIN, ''.join([SkinFinder.skinDir, SkinFinder.skinList[0][1]]))
123                 elif desktopSize.width() == 1024:
124                         fileName = resolveFilename(SCOPE_CURRENT_PLUGIN, ''.join([SkinFinder.skinDir, SkinFinder.skinList[1][1]]))
125                 elif desktopSize.width() == 720:
126                         fileName = resolveFilename(SCOPE_CURRENT_PLUGIN, ''.join([SkinFinder.skinDir, SkinFinder.skinList[2][1]]))
127                 elif desktopSize.width() == 1920:
128                         fileName = resolveFilename(SCOPE_CURRENT_PLUGIN, ''.join([SkinFinder.skinDir, SkinFinder.skinList[5][1]]))
129                 else:
130                         fileName = None
131                         
132                 if fileName is not None:
133                         try:
134                                 index = [x[0] for x in SkinFinder.skinList].index(fileName)
135                                 return index
136                         except ValueError:
137                                 pass
138                                 
139                 print '[SkinFinder] skin index error! File:', fileName
140                 return None
141