def ChoiceEntryComponent(self, data): width = self['list'].instance.size().width() height = self['list'].l.getItemSize().height() self.ml.l.setFont(0, gFont(mp_globals.font, height - 4 * mp_globals.sizefactor)) res = [data[1]] plugin_path = mp_globals.pluginPath skin_path = mp_globals.pluginPath + mp_globals.skinsPath key = "key_" + data[0] + ".png" path = "%s/%s/images/%s" % (skin_path, config.mediaportal.skin.value, key) if not fileExists(path): path = "%s/%s/images/%s" % (skin_path, mp_globals.skinFallback, key) if not fileExists(path): path = resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/buttons/" + key) png = LoadPixmap(path) if png is not None: global pwidth pwidth = png.size().width() pheight = png.size().height() vpos = round(float((height-pheight)/2)) res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 5, vpos, pwidth, pheight, png)) if data[1][0] == "--": res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 0, 1000, height, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, "-"*200)) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, pwidth+15, 0, 1000, height, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, data[1][0])) return res
def downloadPicCallback(self, page=""): picture = LoadPixmap(self.pic) size = picture.size() width = size.width() height = size.height() self["pic"].instance.setPixmap(picture) self["pic"].instance.resize(eSize(width, height)) left = int((550 / 2) - (width / 2)) top = int((450 / 2) - (height / 2)) self["pic"].moveTo(left, top, 1) self["pic"].startMoving() self["pic"].show() self.working = False
def __init__(self, root, sort_type=None, descr_state=None): GUIComponent.__init__(self) self.list = [] self.descr_state = descr_state or self.HIDE_DESCRIPTION self.sort_type = sort_type or self.SORT_GROUPWISE self.firstFileEntry = 0 self.parentDirectory = 0 self.fontName = "Regular" self.fontSize = 20 self.listHeight = None self.listWidth = None self.pbarShift = 5 self.pbarHeight = 16 self.pbarLargeWidth = 48 self.pbarColour = 0x206333 self.pbarColourSeen = 0xffc71d self.pbarColourRec = 0xff001d self.partIconeShift = 5 self.spaceRight = 2 self.spaceIconeText = 2 self.iconsWidth = 22 self.durationWidth = 160 self.dateWidth = 160 if config.usage.time.wide.value: self.dateWidth = int(self.dateWidth * 1.15) self.reloadDelayTimer = None self.l = eListboxPythonMultiContent() self.tags = set() self.root = None self._playInBackground = None self._playInForeground = None self._char = '' if root is not None: self.reload(root) self.l.setBuildFunc(self.buildMovieListEntry) self.onSelectionChanged = [ ] self.iconPart = [] for part in range(5): self.iconPart.append(LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/part_%d_4.png" % part))) self.iconMovieRec = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/part_new.png")) self.iconMoviePlay = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/movie_play.png")) self.iconMoviePlayRec = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/movie_play_rec.png")) self.iconUnwatched = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/part_unwatched.png")) self.iconFolder = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/folder.png")) self.iconTrash = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/trashcan.png")) self.runningTimers = {} self.updateRecordings() self.updatePlayPosCache()
def __init__(self, list): GUIComponent.__init__(self) self.l = eListboxPythonMultiContent() self.l.setBuildFunc(self.buildTimerEntry) self.serviceNameFont = gFont("Regular", 20) self.font = gFont("Regular", 18) self.eventNameFont = gFont("Regular", 18) self.l.setList(list) self.posy = 0 self.posy2 = 0 self.itemHeight = 50 self.rowSplit = 25 self.iconMargin = 4 self.satPosLeft = 160 self.iconWait = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/timer_wait.png")) # currently intended that all icons have the same size self.iconWidth = self.iconWait.size().width() self.iconHeight = self.iconWait.size().height() self.iconRecording = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/timer_rec.png")) self.iconPrepared = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/timer_prep.png")) self.iconDone = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/timer_done.png")) self.iconRepeat = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/timer_rep.png")) self.iconZapped = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/timer_zap.png")) self.iconDisabled = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/timer_off.png")) self.iconAutoTimer = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/timer_autotimer.png"))
def VirtualKeyBoardEntryComponent(keys, selectedKey, shiftMode=False): key_bg = LoadPixmap(cached=True, path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_bg.png")) key_bg_width = key_bg.size().width() if shiftMode: key_images = KEY_IMAGES_SHIFT else: key_images = KEY_IMAGES res = [ (keys) ] x = 0 count = 0 for count, key in enumerate(keys): width = None png = key_images.get(key, None) if png: pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_ACTIVE_SKIN, png)) width = pixmap.size().width() res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=pixmap)) else: width = key_bg_width res.extend(( MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_bg), MultiContentEntryText(pos=(x, 0), size=(width, 45), font=0, text=key.encode("utf-8"), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER) )) if selectedKey == count: key_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_sel.png")) width = key_sel.size().width() res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_sel)) if width is not None: x += width else: x += 45 return res
def __init__(self, root, list_type=None, sort_type=None, descr_state=None): GUIComponent.__init__(self) self.list = [] self.list_type = list_type or self.LISTTYPE_MINIMAL self.descr_state = descr_state or self.HIDE_DESCRIPTION self.sort_type = sort_type or self.SORT_GROUPWISE self.firstFileEntry = 0 self.parentDirectory = 0 self.fontName = "Regular" self.fontSizesOriginal = (22,18,16) self.fontSizesCompact = (20,14) self.fontSizesMinimal = (20,16) self.itemHeights = (75,37,25) self.pbarShift = 5 self.pbarHeight = 16 self.pbarLargeWidth = 48 self.partIconeShiftMinimal = 5 self.partIconeShiftCompact = 4 self.partIconeShiftOriginal = 5 self.spaceRight = 2 self.spaceIconeText = 2 self.iconsWidth = 22 self.trashShift = 1 self.dirShift = 1 self.columnsOriginal = (180,200) self.columnsCompactDescription = (120,140,154) self.compactColumn = 200 self.treeDescription = 165 self.reloadDelayTimer = None self.l = eListboxPythonMultiContent() self.tags = set() self.root = None self._playInBackground = None self._char = '' if root is not None: self.reload(root) self.l.setBuildFunc(self.buildMovieListEntry) self.onSelectionChanged = [ ] self.iconPart = [] for part in range(5): self.iconPart.append(LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/part_%d_4.png" % part))) self.iconMovieRec = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/part_new.png")) self.iconMoviePlay = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/movie_play.png")) self.iconMoviePlayRec = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/movie_play_rec.png")) self.iconUnwatched = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/part_unwatched.png")) self.iconFolder = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/folder.png")) self.iconTrash = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/trashcan.png")) self.runningTimers = {} self.updateRecordings()
def __init__(self, entries): MenuList.__init__(self, entries, False, content = eListboxPythonMultiContent) self.l.setBuildFunc(self.buildListboxEntry) try: png = resolveFilename(SCOPE_ACTIVE_SKIN, "icons/lock_off.png") except: png = resolveFilename(SCOPE_CURRENT_SKIN, "skin-default/icons/lock_off.png") self.iconDisabled = LoadPixmap(cached=True, path=png) #currently intended that all icons have the same size try: png = resolveFilename(SCOPE_ACTIVE_SKIN, "icons/lock_on.png") except: png = resolveFilename(SCOPE_CURRENT_SKIN, "skin-default/icons/lock_on.png") self.iconEnabled = LoadPixmap(cached=True, path=png) try: png = resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_rec.png") except: png = resolveFilename(SCOPE_CURRENT_SKIN, "skin-default/icons/timer_rec.png") self.iconRecording = LoadPixmap(cached=True, path=png) try: png = resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_zap.png") except: png = resolveFilename(SCOPE_CURRENT_SKIN, "skin-default/icons/timer_zap.png") self.iconZapped = LoadPixmap(cached=True, path=png) self.ServiceNameFont = gFont("Regular", 20) self.EventNameFont = gFont("Regular", 20) self.DayNameFont = gFont("Regular", 18) self.itemHeight = 75 self.rowHeight = 24 self.rowSplit1 = 26 self.rowSplit2 = 47 self.statusIconWidth = self.iconEnabled.size().width() self.statusIconHeight = self.iconEnabled.size().height() self.typeIconWidth = self.iconRecording.size().width() self.typeIconHeight = self.iconRecording.size().height() self.iconMargin = 2
def __init__(self, list): GUIComponent.__init__(self) self.l = eListboxPythonMultiContent() self.l.setBuildFunc(self.buildTimerEntry) self.serviceNameFont = gFont("Regular", 20) self.font = gFont("Regular", 18) self.eventNameFont = gFont("Regular", 18) self.l.setList(list) self.itemHeight = 50 self.rowSplit = 25 self.iconMargin = 4 self.satPosLeft = 160 self.iconWait = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_wait.png")) self.iconWidth = self.iconWait.size().width() self.iconHeight = self.iconWait.size().height() self.iconRecording = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_rec.png")) self.iconPrepared = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_prep.png")) self.iconDone = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_done.png")) self.iconRepeat = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_rep.png")) self.iconZapped = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_zap.png")) self.iconDisabled = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_off.png")) self.iconFailed = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_failed.png"))
class VirtualKeyBoard(Screen): def __init__(self, session, title="", **kwargs): Screen.__init__(self, session) self.setTitle(_("Virtual keyboard")) self.keys_list = [] self.shiftkeys_list = [] self.lang = language.getLanguage() self.nextLang = None self.shiftMode = False self.selectedKey = 0 self.smsChar = None self.sms = NumericalTextInput(self.smsOK) self.key_bg = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_bg.png")) self.key_sel = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_sel.png")) self.key_backspace = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_backspace.png")) self.key_all = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_all.png")) self.key_clr = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_clr.png")) self.key_esc = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_esc.png")) self.key_ok = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_ok.png")) self.key_shift = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_shift.png")) self.key_shift_sel = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_shift_sel.png")) self.key_space = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_space.png")) self.key_left = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_left.png")) self.key_right = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_right.png")) self.keyImages = { "BACKSPACE": self.key_backspace, "ALL": self.key_all, "EXIT": self.key_esc, "OK": self.key_ok, "SHIFT": self.key_shift, "SPACE": self.key_space, "LEFT": self.key_left, "RIGHT": self.key_right } self.keyImagesShift = { "BACKSPACE": self.key_backspace, "CLEAR": self.key_clr, "EXIT": self.key_esc, "OK": self.key_ok, "SHIFT": self.key_shift_sel, "SPACE": self.key_space, "LEFT": self.key_left, "RIGHT": self.key_right } self["key_red"] = StaticText(_("Exit")) self["key_green"] = StaticText(_("OK")) self["key_yellow"] = StaticText("") self["country"] = StaticText("") self["header"] = Label(title) self["text"] = Input(currPos=len(kwargs.get("text", "").decode("utf-8",'ignore')), allMarked=False, **kwargs) self["list"] = VirtualKeyBoardList([]) self["actions"] = NumberActionMap(["OkCancelActions", "WizardActions", "ColorActions", "KeyboardInputActions", "InputBoxActions", "InputAsciiActions"], { "gotAsciiCode": self.keyGotAscii, "ok": self.okClicked, "cancel": self.exit, "left": self.left, "right": self.right, "up": self.up, "down": self.down, "red": self.exit, "green": self.ok, "yellow": self.switchLang, "blue": self.shiftClicked, "deleteBackward": self.backClicked, "deleteForward": self.forwardClicked, "back": self.exit, "pageUp": self.cursorRight, "pageDown": self.cursorLeft, "1": self.keyNumberGlobal, "2": self.keyNumberGlobal, "3": self.keyNumberGlobal, "4": self.keyNumberGlobal, "5": self.keyNumberGlobal, "6": self.keyNumberGlobal, "7": self.keyNumberGlobal, "8": self.keyNumberGlobal, "9": self.keyNumberGlobal, "0": self.keyNumberGlobal, }, -2) self.setLang() self.onExecBegin.append(self.setKeyboardModeAscii) self.onLayoutFinish.append(self.buildVirtualKeyBoard) self.onClose.append(self.__onClose) def __onClose(self): self.sms.timer.stop() def switchLang(self): self.lang = self.nextLang self.setLang() self.buildVirtualKeyBoard() def setLang(self): if self.lang == 'ar_AE': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"ض", u"ص", u"ث", u"ق", u"ف", u"غ", u"ع", u"ه", u"خ", u"ح", u"ج", u"د"], [u"ش", u"س", u"ي", u"ب", u"ل", u"ا", u"ت", u"ن", u"م", u"ك", u"ط", u"#"], [u"ئ", u"ء", u"ؤ", u"ر", u"لا", u"ى", u"ة", u"و", u"ز", "ظ", u"ذ", u"CLEAR"], [u"SHIFT", u"SPACE", u"+", u"-", u"*", u"/", u".", u",", u"@", u"%", u"&", u"OK"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"^", u"<", u">", u"(", u")", u"=", u"BACKSPACE"], [u"َ", u"ً", u"ُ", u"ٌ", u"لإ", u"إ", u"‘", u"÷", u"×", u"؛", u"<", u">"], [u"ِ", u"ٍ", u"]", u"[", u"لأ", u"أ", u"ـ", u"،", u"/", u":", u"~", u"'"], [u"ْ", u"}", u"{", u"لآ", u"آ", u"’", u",", u".", u"؟", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"=", u"ّ", u"~", u"OK"]] self.nextLang = 'cs_CZ' elif self.lang == 'cs_CZ': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ů", u"@", u"#"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL"], [u"SHIFT", u"SPACE", u"ě", u"š", u"č", u"ř", u"ž", u"ý", u"á", u"í", u"é", u"OK"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"ť", u"*"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"ň", u"ď", u"'"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"Č", u"Ř", u"Š", u"Ž", u"Ú", u"Á", u"É", u"OK"]] self.nextLang = 'de_DE' elif self.lang == 'de_DE': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ü", u"+"], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL"], [u"SHIFT", u"SPACE", u"@", u"ß", u"OK", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ü", u"*"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"OK", u"LEFT", u"RIGHT"]] self.nextLang = 'el_GR' elif self.lang == 'el_GR': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"=", u"ς", u"ε", u"ρ", u"τ", u"υ", u"θ", u"ι", u"ο", u"π", u"[", u"]"], [u"α", u"σ", u"δ", u"φ", u"γ", u"η", u"ξ", u"κ", u"λ", u";", u"'", u"-"], [u"\\", u"ζ", u"χ", u"ψ", u"ω", u"β", u"ν", u"μ", u",", ".", u"/", u"ALL"], [u"SHIFT", u"SPACE", u"ά", u"έ", u"ή", u"ί", u"ό", u"ύ", u"ώ", u"ϊ", u"ϋ", u"OK"]] self.shiftkeys_list = [ [u"EXIT", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"*", u"(", u")", u"BACKSPACE"], [u"+", u"€", u"Ε", u"Ρ", u"Τ", u"Υ", u"Θ", u"Ι", u"Ο", u"Π", u"{", u"}"], [u"Α", u"Σ", u"Δ", u"Φ", u"Γ", u"Η", u"Ξ", u"Κ", u"Λ", u":", u'"', u"_"], [u"|", u"Ζ", u"Χ", u"Ψ", u"Ω", u"Β", u"Ν", u"Μ", u"<", u">", u"?", u"CLEAR"], [u"SHIFT", u"SPACE", u"Ά", u"Έ", u"Ή", u"Ί", u"Ό", u"Ύ", u"Ώ", u"Ϊ", u"Ϋ", u"OK"]] self.nextLang = 'es_ES' elif self.lang == 'es_ES': #still missing keys (u"ùÙ") self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ó", u"á", u"#"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL"], [u"SHIFT", u"SPACE", u"@", u"Ł", u"ŕ", u"é", u"č", u"í", u"ě", u"ń", u"ň", u"OK"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ú", u"*"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ó", u"Á", u"'"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"Ŕ", u"É", u"Č", u"Í", u"Ě", u"Ń", u"Ň", u"OK"]] self.nextLang = 'fa_IR' elif self.lang == 'fa_IR': self.keys_list = [ [u"EXIT", u"\u06F1", u"\u06F2", u"\u06F3", u"\u06F4", u"\u06F5", u"\u06F6", u"\u06F7", u"\u06F8", u"\u06F9", u"\u06F0", u"BACKSPACE"], [u"\u0636", u"\u0635", u"\u062B", u"\u0642", u"\u0641", u"\u063A", u"\u0639", u"\u0647", u"\u062E", u"\u062D", u"-", u"\u062C"], [u"\u0634", u"\u0633", u"\u06CC", u"\u0628", u"\u0644", u"\u0627", u"\u062A", u"\u0646", u"\u0645", u"\u06A9", u"\u06AF", u"\u067E"], [u"<", u"\u0638", u"\u0637", u"\u0632", u"\u0631", u"\u0630", u"\u062F", u"\u0626", u"\u0648", ".", u"/", u"ALL"], [u"SHIFT", u"SPACE", u"OK", u"LEFT", u"RIGHT", u"*"]] self.shiftkeys_list = [ [u"EXIT", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"(", u")", u"=", u"BACKSPACE"], [u"\u0636", u"\u0635", u"\u062B", u"\u0642", u"\u060C", u"\u061B", u"\u0639", u"\u0647", u"\u062E", u"\u062D", u"+", u"\u0686"], [u"\u0634", u"\u0633", u"\u06CC", u"\u0628", u"\u06C0", u"\u0622", u"\u062A", u"\u0646", u"\u0645", u"?", u'"', u"|"], [u">", u"\u0629", u"\u064A", u"\u0698", u"\u0624", u"\u0625", u"\u0623", u"\u0621", u";", u":", u"\u061F", u"CLEAR"], [u"SHIFT", u"SPACE", u"OK", u"LEFT", u"RIGHT", u"~"]] self.nextLang = 'fi_FI' elif self.lang == 'fi_FI': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"é", u"+"], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL"], [u"SHIFT", u"SPACE", u"@", u"ß", u"ĺ", u"OK", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"É", u"*"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"Ĺ", u"OK", u"LEFT", u"RIGHT"]] self.nextLang = 'fr_FR' elif self.lang == 'fr_FR': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"a", u"z", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"é", u"è"], [u"q", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"m", u"ê", u"ë"], [u"<", u"w", u"x", u"c", u"v", u"b", u"n", u",", u";", u":", u"=", u"ALL"], [u"SHIFT", u"SPACE", u"ù", u"â", u"ï", u"ô", u"ç", u"#", u"-", u"OK", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [ [u"EXIT", u"&", u'@', u'"', u"€", u"§", u"!", u"ç", u"(", u")", u"_", u"BACKSPACE"], [u"A", u"Z", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"É", u"È"], [u"Q", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"M", u"Ê", u"Ë"], [u">", u"W", u"X", u"C", u"V", u"B", u"N", u"?", u".", u"+", u"~", u"CLEAR"], [u"SHIFT", u"SPACE", u"Ù", u"Â", u"Ï", u"Ô", u"°", u"/",u"\\", u"OK", u"LEFT", u"RIGHT"]] self.nextLang = 'lv_LV' elif self.lang == 'lv_LV': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"-", u"š"], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u";", u"'", u"ū"], [u"<", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", u".", u"ž", u"ALL"], [u"SHIFT", u"SPACE", u"ā", u"č", u"ē", u"ģ", u"ī", u"ķ", u"ļ", u"ņ", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [ [u"EXIT", u"!", u"@", u"$", u"*", u"(", u")", u"_", u"=", u"/", u"\\", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"+", u"Š"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u":", u'"', u"Ū"], [u">", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u"#", u"?", u"Ž", u"CLEAR"], [u"SHIFT", u"SPACE", u"Ā", u"Č", u"Ē", u"Ģ", u"Ī", u"Ķ", u"Ļ", u"Ņ", u"LEFT", u"RIGHT"]] self.nextLang = 'pl_PL' elif self.lang == 'pl_PL': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"-", u"["], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u";", u"'", u"\\"], [u"<", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"/", u"ALL"], [u"SHIFT", u"SPACE", u"ą", u"ć", u"ę", u"ł", u"ń", u"ó", u"ś", u"ź", u"ż", u"OK"]] self.shiftkeys_list = [ [u"EXIT", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"*", u"]"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"?", u'"', u"|"], [u">", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"Ą", u"Ć", u"Ę", u"Ł", u"Ń", u"Ó", u"Ś", u"Ź", u"Ż", u"OK"]] self.nextLang = 'ru_RU' elif self.lang == 'ru_RU': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"а", u"б", u"в", u"г", u"д", u"е", u"ё", u"ж", u"з", u"и", u"й", u"+"], [u"к", u"л", u"м", u"н", u"о", u"п", u"р", u"с", u"т", u"у", u"ф", u"#"], [u"<", u"х", u"ц", u"ч", u"ш", u"щ", u"ъ", u"ы", u",", u".", u"-", u"ALL"], [u"SHIFT", u"SPACE", u"@", u"ь", u"э", u"ю", u"я", u"OK", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"А", u"Б", u"В", u"Г", u"Д", u"Е", u"Ё", u"Ж", u"З", u"И", u"Й", u"*"], [u"К", u"Л", u"М", u"Н", u"О", u"П", u"Р", u"С", u"Т", u"У", u"Ф", u"'"], [u">", u"Х", u"Ц", u"Ч", u"Ш", u"Щ", u"Ъ", u"Ы", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"Ь", u"Э", u"Ю", u"Я", u"OK", u"LEFT", u"RIGHT"]] self.nextLang = 'sk_SK' elif self.lang =='sk_SK': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ľ", u"@", u"#"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL"], [u"SHIFT", u"SPACE", u"š", u"č", u"ž", u"ý", u"á", u"í", u"é", u"OK", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"ť", u"*"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"ň", u"ď", u"'"], [u"Á", u"É", u"Ď", u"Í", u"Ý", u"Ó", u"Ú", u"Ž", u"Š", u"Č", u"Ť", u"Ň"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"ä", u"ö", u"ü", u"ô", u"ŕ", u"ĺ", u"OK"]] self.nextLang = 'sv_SE' elif self.lang == 'sv_SE': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"é", u"+"], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL"], [u"SHIFT", u"SPACE", u"@", u"ß", u"ĺ", u"OK", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"É", u"*"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"Ĺ", u"OK", u"LEFT", u"RIGHT"]] self.nextLang = 'th_TH' elif self.lang == 'th_TH': self.keys_list = [[u"EXIT", "\xe0\xb9\x85", "\xe0\xb8\xa0", "\xe0\xb8\x96", "\xe0\xb8\xb8", "\xe0\xb8\xb6", "\xe0\xb8\x84", "\xe0\xb8\x95", "\xe0\xb8\x88", "\xe0\xb8\x82", "\xe0\xb8\x8a", u"BACKSPACE"], ["\xe0\xb9\x86", "\xe0\xb9\x84", "\xe0\xb8\xb3", "\xe0\xb8\x9e", "\xe0\xb8\xb0", "\xe0\xb8\xb1", "\xe0\xb8\xb5", "\xe0\xb8\xa3", "\xe0\xb8\x99", "\xe0\xb8\xa2", "\xe0\xb8\x9a", "\xe0\xb8\xa5"], ["\xe0\xb8\x9f", "\xe0\xb8\xab", "\xe0\xb8\x81", "\xe0\xb8\x94", "\xe0\xb9\x80", "\xe0\xb9\x89", "\xe0\xb9\x88", "\xe0\xb8\xb2", "\xe0\xb8\xaa", "\xe0\xb8\xa7", "\xe0\xb8\x87", "\xe0\xb8\x83"], ["\xe0\xb8\x9c", "\xe0\xb8\x9b", "\xe0\xb9\x81", "\xe0\xb8\xad", "\xe0\xb8\xb4", "\xe0\xb8\xb7", "\xe0\xb8\x97", "\xe0\xb8\xa1", "\xe0\xb9\x83", "\xe0\xb8\x9d", "", u"ALL"], [u"SHIFT", u"SPACE", u"OK", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [[u"EXIT", "\xe0\xb9\x91", "\xe0\xb9\x92", "\xe0\xb9\x93", "\xe0\xb9\x94", "\xe0\xb8\xb9", "\xe0\xb9\x95", "\xe0\xb9\x96", "\xe0\xb9\x97", "\xe0\xb9\x98", "\xe0\xb9\x99", u"BACKSPACE"], ["\xe0\xb9\x90", "", "\xe0\xb8\x8e", "\xe0\xb8\x91", "\xe0\xb8\x98", "\xe0\xb9\x8d", "\xe0\xb9\x8a", "\xe0\xb8\x93", "\xe0\xb8\xaf", "\xe0\xb8\x8d", "\xe0\xb8\x90", "\xe0\xb8\x85"], ["\xe0\xb8\xa4", "\xe0\xb8\x86", "\xe0\xb8\x8f", "\xe0\xb9\x82", "\xe0\xb8\x8c", "\xe0\xb9\x87", "\xe0\xb9\x8b", "\xe0\xb8\xa9", "\xe0\xb8\xa8", "\xe0\xb8\x8b", "", "\xe0\xb8\xbf"], ["", "", "\xe0\xb8\x89", "\xe0\xb8\xae", "\xe0\xb8\xba", "\xe0\xb9\x8c", "", "\xe0\xb8\x92", "\xe0\xb8\xac", "\xe0\xb8\xa6", "", u"CLEAR"], [u"SHIFT", u"SPACE", u"OK", u"LEFT", u"RIGHT"]] self.nextLang = 'uk_UA' elif self.lang == 'uk_UA': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"а", u"б", u"в", u"г", u"ґ", u"д", u"е", u"є", u"ж", u"з", u"и", u"+"], [u"і", u"ї", u"й", u"к", u"л", u"м", u"н", u"о", u"п", u"р", u"с", u"#"], [u"<", u"т", u"у", u"ф", u"х", u"ц", u"ч", u"ш", u",", u".", u"-", u"ALL"], [u"SHIFT", u"SPACE", u"@", u"щ", u"ь", u"ю", u"я", u"OK", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"А", u"Б", u"В", u"Г", u"Ґ", u"Д", u"Е", u"Є", u"Ж", u"З", u"И", u"*"], [u"І", u"Ї", u"Й", u"К", u"Л", u"М", u"Н", u"О", u"П", u"Р", u"С", u"'"], [u">", u"Т", u"У", u"Ф", u"Х", u"Ц", u"Ч", u"Ш", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"Щ", u"Ь", u"Ю", u"Я", u"OK", u"LEFT", u"RIGHT"]] self.nextLang = 'en_EN' else: self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"-", u"["], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u";", u"'", u"\\"], [u"<", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"/", u"ALL"], [u"SHIFT", u"SPACE", u"OK", u"LEFT", u"RIGHT", u"*"]] self.shiftkeys_list = [ [u"EXIT", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"+", u"]"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"?", u'"', u"|"], [u">", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"OK", u"LEFT", u"RIGHT", u"~"]] self.lang = 'en_EN' self.nextLang = 'ar_AE' self["country"].setText(self.lang) self["key_yellow"].setText(language.lang[self.lang][0]) def virtualKeyBoardEntryComponent(self, keys): w, h = skin.parameters.get("VirtualKeyboard",(45, 45)) key_bg_width = self.key_bg and self.key_bg.size().width() or w key_images = self.shiftMode and self.keyImagesShift or self.keyImages res = [keys] text = [] x = 0 for key in keys: png = key_images.get(key, None) if png: width = png.size().width() res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, h), png=png)) else: width = key_bg_width res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, h), png=self.key_bg)) text.append(MultiContentEntryText(pos=(x, 0), size=(width, h), font=0, text=key.encode("utf-8"), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER)) x += width return res + text def buildVirtualKeyBoard(self): self.previousSelectedKey = None self.list = [] self.max_key = 0 for keys in self.shiftMode and self.shiftkeys_list or self.keys_list: self.list.append(self.virtualKeyBoardEntryComponent(keys)) self.max_key += len(keys) self.max_key -= 1 self.markSelectedKey() def markSelectedKey(self): w, h = skin.parameters.get("VirtualKeyboard",(45, 45)) if self.previousSelectedKey is not None: self.list[self.previousSelectedKey /12] = self.list[self.previousSelectedKey /12][:-1] width = self.key_sel.size().width() try: x = self.list[self.selectedKey/12][self.selectedKey % 12 + 1][1] except IndexError: self.selectedKey = self.max_key x = self.list[self.selectedKey/12][self.selectedKey % 12 + 1][1] self.list[self.selectedKey / 12].append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, h), png=self.key_sel)) self.previousSelectedKey = self.selectedKey self["list"].setList(self.list) def backClicked(self): self["text"].deleteBackward() def forwardClicked(self): self["text"].deleteForward() def shiftClicked(self): self.smsChar = None self.shiftMode = not self.shiftMode self.buildVirtualKeyBoard() def okClicked(self): self.smsChar = None text = (self.shiftMode and self.shiftkeys_list or self.keys_list)[self.selectedKey / 12][self.selectedKey % 12].encode("UTF-8") if text == "EXIT": self.close(None) elif text == "BACKSPACE": self["text"].deleteBackward() elif text == "ALL": self["text"].markAll() elif text == "CLEAR": self["text"].deleteAllChars() self["text"].update() elif text == "SHIFT": self.shiftClicked() elif text == "SPACE": self["text"].char(" ".encode("UTF-8")) elif text == "OK": self.close(self["text"].getText()) elif text == "LEFT": self["text"].left() elif text == "RIGHT": self["text"].right() else: self["text"].char(text) def ok(self): self.close(self["text"].getText()) def exit(self): self.close(None) def cursorRight(self): self["text"].right() def cursorLeft(self): self["text"].left() def left(self): self.smsChar = None self.selectedKey = self.selectedKey / 12 * 12 + (self.selectedKey + 11) % 12 if self.selectedKey > self.max_key: self.selectedKey = self.max_key self.markSelectedKey() def right(self): self.smsChar = None self.selectedKey = self.selectedKey / 12 * 12 + (self.selectedKey + 1) % 12 if self.selectedKey > self.max_key: self.selectedKey = self.selectedKey / 12 * 12 self.markSelectedKey() def up(self): self.smsChar = None self.selectedKey -= 12 if self.selectedKey < 0: self.selectedKey = self.max_key / 12 * 12 + self.selectedKey % 12 if self.selectedKey > self.max_key: self.selectedKey -= 12 self.markSelectedKey() def down(self): self.smsChar = None self.selectedKey += 12 if self.selectedKey > self.max_key: self.selectedKey %= 12 self.markSelectedKey() def keyNumberGlobal(self, number): self.smsChar = self.sms.getKey(number) self.selectAsciiKey(self.smsChar) def smsOK(self): if self.smsChar and self.selectAsciiKey(self.smsChar): print "pressing ok now" self.okClicked() def keyGotAscii(self): self.smsChar = None if self.selectAsciiKey(str(unichr(getPrevAsciiCode()).encode('utf-8'))): self.okClicked() def selectAsciiKey(self, char): if char == " ": char = "SPACE" for keyslist in (self.shiftkeys_list, self.keys_list): selkey = 0 for keys in keyslist: for key in keys: if key == char: self.selectedKey = selkey if self.shiftMode != (keyslist is self.shiftkeys_list): self.shiftMode = not self.shiftMode self.buildVirtualKeyBoard() else: self.markSelectedKey() return True selkey += 1 return False
def __init__(self, session = None): GUIComponent.__init__(self) self.session = session self.picFolder = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/folder.png")) self.picMarker = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/marker.png")) self.picDVB_S = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_s-fs8.png")) self.picDVB_C = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_c-fs8.png")) self.picDVB_T = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_t-fs8.png")) self.picServiceGroup = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_service_group-fs8.png")) self.markedForeground = 0xffffff self.markedBackground = 0xff0000 self.markedForegroundSelected = 0xffffff self.markedBackgroundSelected = 0x800000 colors = TemplatedColors().colors if "ListboxMarkedForeground" in colors: self.markedForeground = colors["ListboxMarkedForeground"] if "ListboxMarkedBackground" in colors: self.markedBackground = colors["ListboxMarkedBackground"] if "ListboxMarkedAndSelectedForeground" in colors: self.markedForegroundSelected = colors["ListboxMarkedAndSelectedForeground"] if "ListboxMarkedAndSelectedBackground" in colors: self.markedBackgroundSelected = colors["ListboxMarkedAndSelectedBackground"] self.serviceNotAvail = 0xbbbbbb self.serviceEventProgressbarColor = None self.serviceEventProgressbarColorSelected = None self.serviceEventProgressbarBackColor = None self.serviceEventProgressbarBackColorSelected = None self.serviceEventProgressbarBorderColor = None self.serviceEventProgressbarBorderColorSelected = None self.serviceDescriptionColor = 0xe7b53f self.serviceDescriptionColorSelected = 0xe7b53f self.recordingColor = 0xff4A3C self.recordingColorSelected = 0xff4A3C self.additionalInfoColor = None self.additionalInfoColorSelected = None self.picServiceEventProgressbar = None self.selectionPixmapStandard = None self.selectionPixmapBig = None self.l = eListboxServiceContent() self.l.setBuildFunc(self.buildOptionEntry, True) self.l.setFont(0, gFont("Regular", 18)) # AdditionalInfoFont self.l.setFont(1, gFont("Regular", 20)) # ServiceNumberFont self.l.setFont(2, gFont("Regular", 22)) # ServiceNameFont self.l.setFont(3, gFont("Regular", 18)) # ServiceInfoFont self.serviceNameFont = gFont("Regular", 22) self.serviceInfoFontHeight = 18 self.additionalInfoFont = gFont("Regular", 18) self.list = [] self.size = 0 self.service_center = eServiceCenter.getInstance() self.numberoffset = 0 self.is_playable_ignore = eServiceReference() self.root = None self.mode = self.MODE_NORMAL self.itemHeight = 28 self.l.setItemHeight(28) self.onSelectionChanged = [ ] self.recordingList = {} self.piconLoader = PiconLoader() if self.session: self.session.nav.RecordTimer.on_state_change.append(self.onTimerEntryStateChange) config.usage.configselection_showrecordings.addNotifier(self.getRecordingList, initial_call = True) config.usage.configselection_bigpicons.addNotifier(self.setItemHeight, initial_call = True) config.usage.configselection_secondlineinfo.addNotifier(self.setItemHeight, initial_call = False)
def __init__(self, type=EPG_TYPE_SINGLE, selChangedCB=None, timer=None): self.days = (_("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun")) self.timer = timer self.onSelChanged = [] if selChangedCB is not None: self.onSelChanged.append(selChangedCB) GUIComponent.__init__(self) self.type = type self.l = eListboxPythonMultiContent() self.l.setFont(0, gFont("Regular", 22)) self.l.setFont(1, gFont("Regular", 16)) self.dy = 0 if type == EPG_TYPE_SINGLE: self.l.setBuildFunc(self.buildSingleEntry) elif type == EPG_TYPE_MULTI: self.l.setBuildFunc(self.buildMultiEntry) else: assert (type == EPG_TYPE_SIMILAR) self.l.setBuildFunc(self.buildSimilarEntry) self.epgcache = eEPGCache.getInstance() self.clocks = [ LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_add.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_pre.png')), LoadPixmap( cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_prepost.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/epgclock_post.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/zapclock_add.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/zapclock_pre.png')), LoadPixmap( cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, 'skin_default/icons/zapclock.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/zapclock_prepost.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/zapclock_post.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/zaprecclock_add.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/zaprecclock_pre.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/zaprecclock.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/zaprecclock_prepost.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/zaprecclock_post.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/repepgclock_add.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/repepgclock_pre.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/repepgclock.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/repepgclock_prepost.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/repepgclock_post.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/repzapclock_add.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/repzapclock_pre.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/repzapclock.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/repzapclock_prepost.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/repzapclock_post.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/repzaprecclock_add.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/repzaprecclock_pre.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/repzaprecclock.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/repzaprecclock_prepost.png')), LoadPixmap(cached=True, path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/icons/repzaprecclock_post.png')) ]
def __init__(self, session, title = '', **kwargs): Screen.__init__(self, session) self.setTitle(_('Virtual KeyBoard')) self.keys_list = [] self.shiftkeys_list = [] self.lang = language.getLanguage() self.nextLang = None self.shiftMode = False self.selectedKey = 0 self.smsChar = None self.sms = NumericalTextInput(self.smsOK) self.key_bg = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_bg.png')) self.key_sel = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_sel.png')) self.key_backspace = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_backspace.png')) self.key_all = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_all.png')) self.key_clr = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_clr.png')) self.key_esc = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_esc.png')) self.key_ok = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_ok.png')) self.key_shift = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_shift.png')) self.key_shift_sel = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_shift_sel.png')) self.key_space = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_space.png')) self.key_left = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_left.png')) self.key_right = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_right.png')) self.keyImages = {'BACKSPACE': self.key_backspace, 'ALL': self.key_all, 'EXIT': self.key_esc, 'OK': self.key_ok, 'SHIFT': self.key_shift, 'SPACE': self.key_space, 'LEFT': self.key_left, 'RIGHT': self.key_right} self.keyImagesShift = {'BACKSPACE': self.key_backspace, 'CLEAR': self.key_clr, 'EXIT': self.key_esc, 'OK': self.key_ok, 'SHIFT': self.key_shift_sel, 'SPACE': self.key_space, 'LEFT': self.key_left, 'RIGHT': self.key_right} self['country'] = StaticText('') self['header'] = Label() self['text'] = Input(currPos=len(kwargs.get('text', '').decode('utf-8', 'ignore')), allMarked=False, **kwargs) self['list'] = VirtualKeyBoardList([]) self['actions'] = NumberActionMap(['OkCancelActions', 'WizardActions', 'ColorActions', 'KeyboardInputActions', 'InputBoxActions', 'InputAsciiActions'], {'gotAsciiCode': self.keyGotAscii, 'ok': self.okClicked, 'OKLong': self.okLongClicked, 'cancel': self.exit, 'left': self.left, 'right': self.right, 'up': self.up, 'down': self.down, 'red': self.exit, 'green': self.ok, 'yellow': self.switchLang, 'blue': self.shiftClicked, 'deleteBackward': self.backClicked, 'deleteForward': self.forwardClicked, 'back': self.exit, 'pageUp': self.cursorRight, 'pageDown': self.cursorLeft, '1': self.keyNumberGlobal, '2': self.keyNumberGlobal, '3': self.keyNumberGlobal, '4': self.keyNumberGlobal, '5': self.keyNumberGlobal, '6': self.keyNumberGlobal, '7': self.keyNumberGlobal, '8': self.keyNumberGlobal, '9': self.keyNumberGlobal, '0': self.keyNumberGlobal}, -2) self.setLang() self.onExecBegin.append(self.setKeyboardModeAscii) self.onLayoutFinish.append(self.buildVirtualKeyBoard) self.onClose.append(self.__onClose) return
class PowerTimerList(GUIComponent, object): # # | <Service> <Name of the Timer> | # | <start, end> <state> | # def buildTimerEntry(self, timer, processed): screenwidth = getDesktop(0).size().width() timertype = { TIMERTYPE.WAKEUP: _("Wake Up"), TIMERTYPE.WAKEUPTOSTANDBY: _("Wake Up To Standby"), TIMERTYPE.STANDBY: _("Standby"), TIMERTYPE.AUTOSTANDBY: _("Auto Standby"), TIMERTYPE.AUTODEEPSTANDBY: _("Auto Deep Standby"), TIMERTYPE.DEEPSTANDBY: _("Deep Standby"), TIMERTYPE.REBOOT: _("Reboot"), TIMERTYPE.RESTART: _("Restart GUI") }[timer.timerType] afterevent = { AFTEREVENT.NONE: _("Nothing"), AFTEREVENT.WAKEUPTOSTANDBY: _("Wake Up To Standby"), AFTEREVENT.STANDBY: _("Standby"), AFTEREVENT.DEEPSTANDBY: _("Deep Standby") }[timer.afterEvent] height = self.l.getItemSize().height() width = self.l.getItemSize().width() res = [ None ] x = width / 2 res.append((eListboxPythonMultiContent.TYPE_TEXT, self.iconWidth + self.iconMargin, 2, width, self.rowSplit, 0, RT_HALIGN_LEFT|RT_VALIGN_BOTTOM, timertype)) if timer.timerType == TIMERTYPE.AUTOSTANDBY or timer.timerType == TIMERTYPE.AUTODEEPSTANDBY: if self.iconRepeat and timer.autosleeprepeat != "once": res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, self.iconMargin / 2, self.rowSplit + (self.itemHeight - self.rowSplit - self.iconHeight) / 2, self.iconWidth, self.iconHeight, self.iconRepeat)) icon = None if not processed: if timer.state == TimerEntry.StateWaiting: state = _("waiting") icon = self.iconWait elif timer.state == TimerEntry.StatePrepared or timer.state == TimerEntry.StateRunning: state = _("running...") icon = self.iconZapped elif timer.state == TimerEntry.StateEnded: state = _("done!") icon = self.iconDone else: state = _("<unknown>") icon = None else: state = _("done!") icon = self.iconDone res.append((eListboxPythonMultiContent.TYPE_TEXT, 148, 26, width-150, self.itemHeight - self.rowSplit, 2, RT_HALIGN_RIGHT|RT_VALIGN_BOTTOM, _("Delay:") + " " + str(timer.autosleepdelay) + "(" + _("mins") + ")")) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, x+24, 2, x-2-24, self.itemHeight - self.rowSplit, 2, RT_HALIGN_RIGHT|RT_VALIGN_BOTTOM, _('At End:') + ' ' + afterevent)) days = ( _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun") ) begin = FuzzyTime(timer.begin) if timer.repeated: repeatedtext = [] flags = timer.repeated for x in (0, 1, 2, 3, 4, 5, 6): if flags & 1 == 1: repeatedtext.append(days[x]) flags >>= 1 if repeatedtext == [_("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun")]: repeatedtext = _('Everyday') elif repeatedtext == [_("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri")]: repeatedtext = _('Weekday') elif repeatedtext == [_("Sat"), _("Sun")]: repeatedtext = _('Weekend') else: repeatedtext = ", ".join(repeatedtext) if self.iconRepeat: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 2, self.rowSplit, 20, 20, self.iconRepeat)) else: repeatedtext = begin[0] # date text = repeatedtext + ((" %s ... %s (%d " + _("mins") + ")") % (begin[1], FuzzyTime(timer.end)[1], (timer.end - timer.begin) / 60)) res.append((eListboxPythonMultiContent.TYPE_TEXT, 148, self.itemHeight - self.rowSplit, width-150, self.rowSplit, 2, RT_HALIGN_RIGHT|RT_VALIGN_BOTTOM, text)) icon = None if not processed: if timer.state == TimerEntry.StateWaiting: state = _("waiting") icon = self.iconWait elif timer.state == TimerEntry.StatePrepared: state = _("about to start") icon = self.iconPrepared elif timer.state == TimerEntry.StateRunning: state = _("running...") icon = self.iconZapped elif timer.state == TimerEntry.StateEnded: state = _("done!") icon = self.iconDone else: state = _("<unknown>") icon = None else: state = _("done!") icon = self.iconDone if timer.disabled: state = _("disabled") icon = self.iconDisabled if timer.failed: state = _("failed") icon = self.iconFailed icon and res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, self.iconMargin / 2, (self.rowSplit - self.iconHeight) / 2, self.iconWidth, self.iconHeight, icon)) res.append((eListboxPythonMultiContent.TYPE_TEXT, self.iconMargin + self.iconWidth, self.rowSplit, 126, height - self.rowSplit, 2, RT_HALIGN_LEFT|RT_VALIGN_BOTTOM, state)) line = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "div-h.png")) res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 0, height-2, width, 2, line)) return res def __init__(self, list): GUIComponent.__init__(self) self.l = eListboxPythonMultiContent() self.l.setBuildFunc(self.buildTimerEntry) self.serviceNameFont = gFont("Regular", 20) self.font = gFont("Regular", 18) self.eventNameFont = gFont("Regular", 18) self.l.setList(list) self.itemHeight = 50 self.rowSplit = 25 self.iconMargin = 4 self.satPosLeft = 160 self.iconWait = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_wait.png")) self.iconWidth = self.iconWait.size().width() self.iconHeight = self.iconWait.size().height() self.iconRecording = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_rec.png")) self.iconPrepared = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_prep.png")) self.iconDone = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_done.png")) self.iconRepeat = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_rep.png")) self.iconZapped = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_zap.png")) self.iconDisabled = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_off.png")) self.iconFailed = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_failed.png")) def applySkin(self, desktop, parent): def itemHeight(value): self.itemHeight = int(value) def setServiceNameFont(value): self.serviceNameFont = parseFont(value, ((1,1),(1,1))) def setEventNameFont(value): self.eventNameFont = parseFont(value, ((1,1),(1,1))) def setFont(value): self.font = parseFont(value, ((1,1),(1,1))) def rowSplit(value): self.rowSplit = int(value) def iconMargin(value): self.iconMargin = int(value) def satPosLeft(value): self.satPosLeft = int(value) for (attrib, value) in list(self.skinAttributes): try: locals().get(attrib)(value) self.skinAttributes.remove((attrib, value)) except: pass self.l.setItemHeight(self.itemHeight) self.l.setFont(0, self.serviceNameFont) self.l.setFont(1, self.font) self.l.setFont(2, self.eventNameFont) return GUIComponent.applySkin(self, desktop, parent) def getCurrent(self): cur = self.l.getCurrentSelection() return cur and cur[0] GUI_WIDGET = eListbox def postWidgetCreate(self, instance): instance.setContent(self.l) self.instance = instance def moveToIndex(self, index): self.instance.moveSelectionTo(index) def getCurrentIndex(self): return self.instance.getCurrentIndex() currentIndex = property(getCurrentIndex, moveToIndex) currentSelection = property(getCurrent) def moveDown(self): self.instance.moveSelection(self.instance.moveDown) def invalidate(self): self.l.invalidate() def entryRemoved(self, idx): self.l.entryRemoved(idx)
def VirtualKeyBoardEntryComponent(keys, selectedKey, shiftMode=False): key_backspace = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_backspace.png")) key_bg = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_bg.png")) key_clr = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_clr.png")) key_esc = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_esc.png")) key_ok = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_ok.png")) key_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_sel.png")) key_shift = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_shift.png")) key_shift_sel = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_shift_sel.png")) key_space = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/vkey_space.png")) res = [(keys)] x = 0 count = 0 if shiftMode: shiftkey_png = key_shift_sel else: shiftkey_png = key_shift for key in keys: width = None if key == "EXIT": width = key_esc.size().width() res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_esc)) elif key == "BACKSPACE": width = key_backspace.size().width() res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_backspace)) elif key == "CLEAR": width = key_clr.size().width() res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_clr)) elif key == "SHIFT": width = shiftkey_png.size().width() res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=shiftkey_png)) elif key == "SPACE": width = key_space.size().width() res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_space)) elif key == "OK": width = key_ok.size().width() res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_ok)) # elif key == "<-": # res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_left)) # elif key == "->": # res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(45, 45), png=key_right)) else: width = key_bg.size().width() res.extend( ( MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_bg), MultiContentEntryText( pos=(x, 0), size=(width, 45), font=0, text=key.encode("utf-8"), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER, ), ) ) if selectedKey == count: width = key_sel.size().width() res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=key_sel)) if width is not None: x += width else: x += 45 count += 1 return res
def buildTimerEntry(self, timer, processed): screenwidth = getDesktop(0).size().width() height = self.l.getItemSize().height() width = self.l.getItemSize().width() res = [None] x = width // 2 if screenwidth and screenwidth == 1920: res.append( (eListboxPythonMultiContent.TYPE_TEXT, 39, 3, width, 38, 2, RT_HALIGN_LEFT | RT_VALIGN_BOTTOM, gettimerType(timer))) else: res.append( (eListboxPythonMultiContent.TYPE_TEXT, 26, 3, width, 25, 0, RT_HALIGN_LEFT | RT_VALIGN_BOTTOM, gettimerType(timer))) if timer.timerType == TIMERTYPE.AUTOSTANDBY or timer.timerType == TIMERTYPE.AUTODEEPSTANDBY: if self.iconRepeat and timer.autosleeprepeat != "once": if screenwidth and screenwidth == 1920: res.append( (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 3, 5, 30, 30, self.iconRepeat)) else: res.append( (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 2, 3, 20, 20, self.iconRepeat)) icon = None if not processed: if timer.state == TimerEntry.StateWaiting: state = _("waiting") icon = self.iconWait elif timer.state == TimerEntry.StatePrepared or timer.state == TimerEntry.StateRunning: state = _("running...") icon = self.iconZapped elif timer.state == TimerEntry.StateEnded: state = _("done!") icon = self.iconDone else: state = _("<unknown>") icon = None else: state = _("done!") icon = self.iconDone if screenwidth and screenwidth == 1920: res.append( (eListboxPythonMultiContent.TYPE_TEXT, 225, 38, width - 225, 35, 3, RT_HALIGN_RIGHT | RT_VALIGN_BOTTOM, _("Delay:") + " " + str(timer.autosleepdelay) + "(" + _("mins") + ")")) else: res.append( (eListboxPythonMultiContent.TYPE_TEXT, 150, 26, width - 150, 23, 1, RT_HALIGN_RIGHT | RT_VALIGN_BOTTOM, _("Delay:") + " " + str(timer.autosleepdelay) + "(" + _("mins") + ")")) else: if screenwidth and screenwidth == 1920: res.append( (eListboxPythonMultiContent.TYPE_TEXT, x + 36, 3, x - 3 - 36, 35, 3, RT_HALIGN_RIGHT | RT_VALIGN_BOTTOM, _('At End:') + ' ' + getafterEvent(timer))) else: res.append( (eListboxPythonMultiContent.TYPE_TEXT, x + 24, 3, x - 2 - 24, 23, 1, RT_HALIGN_RIGHT | RT_VALIGN_BOTTOM, _('At End:') + ' ' + getafterEvent(timer))) days = (_("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun")) begin = FuzzyTime(timer.begin) if timer.repeated: repeatedtext = [] flags = timer.repeated for x in (0, 1, 2, 3, 4, 5, 6): if flags & 1 == 1: repeatedtext.append(days[x]) flags >>= 1 repeatedtext = ", ".join(repeatedtext) if self.iconRepeat: if screenwidth and screenwidth == 1920: res.append( (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 3, 5, 30, 30, self.iconRepeat)) else: res.append( (eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 2, 3, 20, 20, self.iconRepeat)) else: repeatedtext = begin[0] # date text = repeatedtext + ((" %s ... %s (%d " + _("mins") + ")") % (begin[1], FuzzyTime(timer.end)[1], (timer.end - timer.begin) // 60)) if screenwidth and screenwidth == 1920: res.append((eListboxPythonMultiContent.TYPE_TEXT, 225, 38, width - 225, 35, 3, RT_HALIGN_RIGHT | RT_VALIGN_BOTTOM, text)) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, 150, 26, width - 150, 23, 1, RT_HALIGN_RIGHT | RT_VALIGN_BOTTOM, text)) icon = None if not processed: if timer.state == TimerEntry.StateWaiting: state = _("waiting") icon = self.iconWait elif timer.state == TimerEntry.StatePrepared: state = _("about to start") icon = self.iconPrepared elif timer.state == TimerEntry.StateRunning: state = _("running...") icon = self.iconZapped elif timer.state == TimerEntry.StateEnded: state = _("done!") icon = self.iconDone else: state = _("<unknown>") icon = None else: state = _("done!") icon = self.iconDone if timer.disabled: state = _("disabled") icon = self.iconDisabled if timer.failed: state = _("failed") icon = self.iconFailed if screenwidth and screenwidth == 1920: res.append((eListboxPythonMultiContent.TYPE_TEXT, 39, 38, 225, 35, 3, RT_HALIGN_LEFT | RT_VALIGN_BOTTOM, state)) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, 26, 26, 150, 23, 1, RT_HALIGN_LEFT | RT_VALIGN_BOTTOM, state)) if icon: if screenwidth and screenwidth == 1920: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 3, 39, 30, 30, icon)) else: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 2, 26, 20, 20, icon)) line = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "div-h.png")) res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 0, height - 2, width, 2, line)) return res
def buildInterfaceList(self, device, description, type, isinputdevice=True): divpng = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png")) activepng = None devicepng = None enabled = iInputDevices.getDeviceAttribute(device, 'enabled') if type == 'remote': if config.misc.rcused.value == 0: if enabled: devicepng = LoadPixmap( resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/icons/input_rcnew-configured.png")) else: devicepng = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/input_rcnew.png")) else: if enabled: devicepng = LoadPixmap( resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/icons/input_rcold-configured.png")) else: devicepng = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/input_rcold.png")) elif type == 'keyboard': if enabled: devicepng = LoadPixmap( resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/icons/input_keyboard-configured.png")) else: devicepng = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/input_keyboard.png")) elif type == 'mouse': if enabled: devicepng = LoadPixmap( resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/icons/input_mouse-configured.png")) else: devicepng = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/input_mouse.png")) elif isinputdevice: devicepng = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/input_rcnew.png")) else: devicepng = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/input_xtrc.png")) return ((device, description, devicepng, divpng))
def updateList(self): self.list = [] mypath = DeliteGetSkinPath() rc = system('df -h > /tmp/syinfo.tmp') mypixmap = mypath + 'icons/icon_home_BH.png' png = LoadPixmap(mypixmap) name = 'Black Hole' title = MultiContentEntryText(pos=(120, 30), size=(480, 50), font=0, text=name) png = MultiContentEntryPixmapAlphaTest(pos=(0, 3), size=(100, 100), png=png) self.list.append([name, title, png]) mypixmap = mypath + 'icons/icon_avalon.png' png = LoadPixmap(mypixmap) name = 'Avalon' title = MultiContentEntryText(pos=(120, 30), size=(480, 50), font=0, text=name) png = MultiContentEntryPixmapAlphaTest(pos=(0, 3), size=(100, 100), png=png) self.list.append([name, title, png]) mypixmap = mypath + 'icons/icon_chaos.png' png = LoadPixmap(mypixmap) name = 'Chaos' title = MultiContentEntryText(pos=(120, 30), size=(480, 50), font=0, text=name) png = MultiContentEntryPixmapAlphaTest(pos=(0, 3), size=(100, 100), png=png) self.list.append([name, title, png]) mypixmap = mypath + 'icons/icon_ghost.png' png = LoadPixmap(mypixmap) name = 'Ghost' title = MultiContentEntryText(pos=(120, 30), size=(480, 50), font=0, text=name) png = MultiContentEntryPixmapAlphaTest(pos=(0, 3), size=(100, 100), png=png) self.list.append([name, title, png]) self['list'].setList(self.list) self.current_universe = self.whereIAm() txt = _('You are in %s universe.') % self.current_universe self['lab1'].setText(txt) btot = buse = bempty = utot = uuse = uempty = '' f = open('/tmp/syinfo.tmp', 'r') for line in f.readlines(): parts = line.split() tot = len(parts) - 1 if parts[tot].strip() == '/': btot = parts[tot - 4].strip() buse = parts[tot - 1].strip() bempty = parts[tot - 2].strip() elif parts[tot].strip() == '/universe': utot = parts[tot - 4].strip() uuse = parts[tot - 1].strip() uempty = parts[tot - 2].strip() break f.close() os_remove('/tmp/syinfo.tmp') text = _( 'Black Hole details:\nBlack Hole is the original matrix of all Parallel Universes and resides in its own phisycal space.\n' ) text += _('Estimated size: %s \n') % btot text += _('Occupied space: %s \n') % buse text += _('Empty space: %s \n\n') % bempty text += _( 'Parallel Universes details:\nParallel Universes share the same space because they are all together in the same place, but in different dimensions.\n' ) text += _('Estimated size: %s \n') % utot text += _('Occupied space: %s \n') % uuse text += _('Empty space: %s \n\n') % uempty self['lab2'].setText(text) pos = 0 sel = self['list'].getCurrent() for x in self.list: if x[0] == self.current_universe: self['list'].moveToIndex(pos) break pos += 1
def picServiceEventProgressbar(value): pic = LoadPixmap(resolveFilename(SCOPE_GUISKIN, value)) pic and self.l.setPixmap(self.l.picServiceEventProgressbar, pic)
def showNextScreenshot(self, result, retval, extra_args): if retval == 0: # Show screenshot in the current window pic = LoadPixmap(grab_picture) self["window" + str(self.current_window)].instance.setPixmap(pic) # Hide current video-window and show the running event-name self["video" + str(self.current_window)].hide() self["event" + str(self.current_window)].show() # Get next ref self.current_refidx += 1 if self.current_refidx > (len(self.ref_list) - 1): self.current_refidx = 0 # Play next ref ref = self.ref_list[self.current_refidx] info = self.serviceHandler.info(ref) name = info.getName(ref).replace('\xc2\x86', '').replace('\xc2\x87', '') event_name = self.getEventName(info, ref) self.session.nav.playService(ref) # Get next window index self.current_window += 1 if self.current_window > 9: self.current_window = 1 # Save the ref self.window_refs[self.current_window - 1] = ref # Save the event-name and hide the label self["event" + str(self.current_window)].hide() self["event" + str(self.current_window)].setText(event_name) # Show the new video-window self["video" + str(self.current_window)].show() self["video" + str(self.current_window)].decoder = 0 # Show the servicename self["channel" + str(self.current_window)].setText(name) self["count"].setText( _("Channel: ") + str(self.current_refidx + 1) + " / " + str(len(self.ref_list))) # Restart timer self.working = False self.updateTimer.start(1, 1) else: print "[Mosaic] retval: %d result: %s" % (retval, result) try: f = open(grab_errorlog, "w") f.write("retval: %d\nresult: %s" % (retval, result)) f.close() except: pass self.session.openWithCallback( self.exit, MessageBox, _("Error while creating screenshot. You need grab version 0.8 or higher!" ), MessageBox.TYPE_ERROR, timeout=5)
def buildMy_rec(self, device): mypath = ItalysatGetSkinPath() device2 = re.sub('[0-9]', '', device) devicetype = path.realpath('/sys/block/' + device2 + '/device') d2 = device name = _('HARD DISK: ') mypixmap = mypath + 'italy_icons/dev_hdd.png' model = file('/sys/block/' + device2 + '/device/model').read() model = str(model).replace('\n', '') des = '' if devicetype.find('usb') != -1: name = _('USB: ') mypixmap = mypath + 'italy_icons/dev_usb.png' name += model self.Console.ePopen( "sfdisk -l /dev/sd? | grep swap | awk '{print $(NF-9)}' >/tmp/devices.tmp" ) sleep(0.5) f = open('/tmp/devices.tmp', 'r') swapdevices = f.read() f.close() if path.exists('/tmp/devices.tmp'): remove('/tmp/devices.tmp') swapdevices = swapdevices.replace('\n', '') swapdevices = swapdevices.split('/') f = open('/proc/mounts', 'r') d1 = _('None') dtype = _('unavailable') rw = _('None') for line in f.readlines(): if line.find(device) != -1: parts = line.strip().split() d1 = parts[1] dtype = parts[2] rw = parts[3] break elif device in swapdevices: parts = line.strip().split() d1 = _('None') dtype = 'swap' rw = _('None') break f.close() size = Harddisk(device).diskSize() if float(size) / 1024 / 1024 >= 1: des = _('Size: ') + str(round(float(size) / 1024 / 1024, 2)) + _('TB') elif size / 1024 >= 1: des = _('Size: ') + str(round(float(size) / 1024, 2)) + _('GB') elif size >= 1: des = _('Size: ') + str(size) + _('MB') else: des = _('Size: ') + _('unavailable') if des != '': if rw.startswith('rw'): rw = ' R/W' elif rw.startswith('ro'): rw = ' R/O' else: rw = '' des += '\t' + _('Mount: ') + d1 + '\n' + _( 'Device: ') + '/dev/' + device + '\t' + _( 'Type: ') + dtype + rw png = LoadPixmap(mypixmap) res = (name, des, png) self.list.append(res)
class TimerList(HTMLComponent, GUIComponent, object): def buildTimerEntry(self, timer, processed): height = self.l.getItemSize().height() width = self.l.getItemSize().width() res = [None] serviceName = timer.service_ref.getServiceName() serviceNameWidth = getTextBoundarySize(self.instance, self.serviceNameFont, self.l.getItemSize(), serviceName).width() if 200 > width - serviceNameWidth - self.iconWidth - self.iconMargin: serviceNameWidth = width - 200 - self.iconWidth - self.iconMargin res.append((eListboxPythonMultiContent.TYPE_TEXT, width - serviceNameWidth, 0, serviceNameWidth, self.rowSplit, 0, RT_HALIGN_RIGHT | RT_VALIGN_BOTTOM, serviceName)) res.append((eListboxPythonMultiContent.TYPE_TEXT, self.iconWidth + self.iconMargin, 0, width - serviceNameWidth - self.iconWidth - self.iconMargin, self.rowSplit, 2, RT_HALIGN_LEFT | RT_VALIGN_BOTTOM, timer.name)) begin = FuzzyTime(timer.begin) if timer.repeated: days = (_('Mon'), _('Tue'), _('Wed'), _('Thu'), _('Fri'), _('Sat'), _('Sun')) repeatedtext = [] flags = timer.repeated for x in (0, 1, 2, 3, 4, 5, 6): if flags & 1 == 1: repeatedtext.append(days[x]) flags >>= 1 if repeatedtext == [_('Mon'), _('Tue'), _('Wed'), _('Thu'), _('Fri'), _('Sat'), _('Sun')]: repeatedtext = _('Everyday') elif repeatedtext == [_('Mon'), _('Tue'), _('Wed'), _('Thu'), _('Fri')]: repeatedtext = _('Weekday') elif repeatedtext == [_('Sat'), _('Sun')]: repeatedtext = _('Weekend') else: repeatedtext = ', '.join(repeatedtext) if self.iconRepeat: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, self.iconMargin / 2, self.rowSplit + (self.itemHeight - self.rowSplit - self.iconHeight) / 2, self.iconWidth, self.iconHeight, self.iconRepeat)) else: repeatedtext = begin[0] if timer.justplay: if timer.end > timer.begin + 3: text = repeatedtext + (' %s ... %s (' + _('ZAP') + ', %d ' + _('mins') + ')') % (begin[1], FuzzyTime(timer.end)[1], (timer.end - timer.begin) / 60) else: text = repeatedtext + (' %s (' + _('ZAP') + ')') % begin[1] else: text = repeatedtext + (' %s ... %s (%d ' + _('mins') + ')') % (begin[1], FuzzyTime(timer.end)[1], (timer.end - timer.begin) / 60) icon = None if not processed: if timer.state == TimerEntry.StateWaiting: state = _('waiting') if timer.isAutoTimer: icon = self.iconAutoTimer else: icon = self.iconWait elif timer.state == TimerEntry.StatePrepared: state = _('about to start') icon = self.iconPrepared elif timer.state == TimerEntry.StateRunning: if timer.justplay: state = _('zapped') icon = self.iconZapped else: state = _('recording...') icon = self.iconRecording elif timer.state == TimerEntry.StateEnded: state = _('done!') icon = self.iconDone else: state = _('<unknown>') icon = None elif timer.disabled: state = _('disabled') icon = self.iconDisabled elif timer.failed: state = _('failed') icon = self.iconFailed else: state = _('done!') icon = self.iconDone icon and res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, self.iconMargin / 2, (self.rowSplit - self.iconHeight) / 2, self.iconWidth, self.iconHeight, icon)) orbpos = self.getOrbitalPos(timer.service_ref) orbposWidth = getTextBoundarySize(self.instance, self.font, self.l.getItemSize(), orbpos).width() res.append((eListboxPythonMultiContent.TYPE_TEXT, self.satPosLeft, self.rowSplit, orbposWidth, self.itemHeight - self.rowSplit, 1, RT_HALIGN_LEFT | RT_VALIGN_TOP, orbpos)) res.append((eListboxPythonMultiContent.TYPE_TEXT, self.iconWidth + self.iconMargin, self.rowSplit, self.satPosLeft - self.iconWidth - self.iconMargin, self.itemHeight - self.rowSplit, 1, RT_HALIGN_LEFT | RT_VALIGN_TOP, state)) res.append((eListboxPythonMultiContent.TYPE_TEXT, self.satPosLeft + orbposWidth, self.rowSplit, width - self.satPosLeft - orbposWidth, self.itemHeight - self.rowSplit, 1, RT_HALIGN_RIGHT | RT_VALIGN_TOP, text)) line = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'div-h.png')) res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 0, height - 2, width, 2, line)) return res def __init__(self, list): GUIComponent.__init__(self) self.l = eListboxPythonMultiContent() self.l.setBuildFunc(self.buildTimerEntry) self.serviceNameFont = gFont('Regular', 20) self.font = gFont('Regular', 18) self.eventNameFont = gFont('Regular', 18) self.l.setList(list) self.itemHeight = 50 self.rowSplit = 25 self.iconMargin = 4 self.satPosLeft = 160 self.iconWait = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/timer_wait.png')) self.iconWidth = self.iconWait.size().width() self.iconHeight = self.iconWait.size().height() self.iconRecording = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/timer_rec.png')) self.iconPrepared = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/timer_prep.png')) self.iconDone = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/timer_done.png')) self.iconRepeat = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/timer_rep.png')) self.iconZapped = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/timer_zap.png')) self.iconDisabled = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/timer_off.png')) self.iconFailed = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/timer_failed.png')) self.iconAutoTimer = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/timer_autotimer.png')) def applySkin(self, desktop, parent): def itemHeight(value): self.itemHeight = int(value) def setServiceNameFont(value): self.serviceNameFont = parseFont(value, ((1, 1), (1, 1))) def setEventNameFont(value): self.eventNameFont = parseFont(value, ((1, 1), (1, 1))) def setFont(value): self.font = parseFont(value, ((1, 1), (1, 1))) def rowSplit(value): self.rowSplit = int(value) def iconMargin(value): self.iconMargin = int(value) def satPosLeft(value): self.satPosLeft = int(value) for attrib, value in list(self.skinAttributes): try: locals().get(attrib)(value) self.skinAttributes.remove((attrib, value)) except: pass self.l.setItemHeight(self.itemHeight) self.l.setFont(0, self.serviceNameFont) self.l.setFont(1, self.font) self.l.setFont(2, self.eventNameFont) return GUIComponent.applySkin(self, desktop, parent) def getCurrent(self): cur = self.l.getCurrentSelection() return cur and cur[0] GUI_WIDGET = eListbox def postWidgetCreate(self, instance): instance.setContent(self.l) self.instance = instance instance.setWrapAround(True) def moveToIndex(self, index): self.instance.moveSelectionTo(index) def getCurrentIndex(self): return self.instance.getCurrentIndex() currentIndex = property(getCurrentIndex, moveToIndex) currentSelection = property(getCurrent) def moveDown(self): self.instance.moveSelection(self.instance.moveDown) def invalidate(self): self.l.invalidate() def entryRemoved(self, idx): self.l.entryRemoved(idx) def getOrbitalPos(self, ref): refstr = None if hasattr(ref, 'sref'): refstr = str(ref.sref) else: refstr = str(ref) refstr = refstr and GetWithAlternative(refstr) if '%3a//' in refstr: return '%s' % _('Stream') else: op = int(refstr.split(':', 10)[6][:-4] or '0', 16) if op == 61166: return '%s' % _('DVB-T') if op == 65535: return '%s' % _('DVB-C') direction = 'E' if op > 1800: op = 3600 - op direction = 'W' return '%d.%d\xc2\xb0%s' % (op // 10, op % 10, direction)
def __init__(self, session = None): GUIComponent.__init__(self) self._componentSizes = componentSizes[componentSizes.SERVICE_LIST] Log.i(self._componentSizes) tlf = TemplatedListFonts() upper_service_name_limit = self.getDesktopWith() / 3 config.usage.configselection_servicenamecolwidth.limits = [(100, upper_service_name_limit),] self.session = session self.mode = self.MODE_NORMAL self.picFolder = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/folder.png")) self.picMarker = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/marker.png")) self.picDVB_S = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_s-fs8.png")) self.picDVB_C = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_c-fs8.png")) self.picDVB_T = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_t-fs8.png")) self.picServiceGroup = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_service_group-fs8.png")) self.markedForeground = 0xffffff self.markedBackground = 0xff0000 self.markedForegroundSelected = 0xffffff self.markedBackgroundSelected = 0x800000 colors = TemplatedColors().colors if "ListboxMarkedForeground" in colors: self.markedForeground = colors["ListboxMarkedForeground"] if "ListboxMarkedBackground" in colors: self.markedBackground = colors["ListboxMarkedBackground"] if "ListboxMarkedAndSelectedForeground" in colors: self.markedForegroundSelected = colors["ListboxMarkedAndSelectedForeground"] if "ListboxMarkedAndSelectedBackground" in colors: self.markedBackgroundSelected = colors["ListboxMarkedAndSelectedBackground"] self.serviceNotAvail = 0xbbbbbb self.serviceEventProgressbarColor = None self.serviceEventProgressbarColorSelected = None self.serviceEventProgressbarBackColor = None self.serviceEventProgressbarBackColorSelected = None self.serviceEventProgressbarBorderColor = None self.serviceEventProgressbarBorderColorSelected = None self.serviceDescriptionColor = 0xe7b53f self.serviceDescriptionColorSelected = 0xe7b53f self.recordingColor = 0xff4A3C self.recordingColorSelected = 0xff4A3C self.additionalInfoColor = None self.additionalInfoColorSelected = None self.picServiceEventProgressbar = None self.selectionPixmapStandard = None self.selectionPixmapBig = None self.l = eListboxServiceContent() self.l.setBuildFunc(self.buildOptionEntry, True) self.l.setFont(0, gFont(tlf.face(TemplatedListFonts.SMALL), tlf.size(TemplatedListFonts.SMALL))) # AdditionalInfoFont self.l.setFont(1, gFont(tlf.face(TemplatedListFonts.MEDIUM), tlf.size(TemplatedListFonts.MEDIUM))) # ServiceNumberFont self.l.setFont(2, gFont(tlf.face(TemplatedListFonts.BIG), tlf.size(TemplatedListFonts.BIG))) # ServiceNameFont self.l.setFont(3, gFont(tlf.face(TemplatedListFonts.SMALL), tlf.size(TemplatedListFonts.SMALL))) # ServiceInfoFont self.serviceNameFont = gFont(tlf.face(TemplatedListFonts.BIG), tlf.size(TemplatedListFonts.BIG)) self.serviceInfoFontHeight = tlf.size(TemplatedListFonts.SMALL) self.serviceInfoHeight = self.serviceInfoFontHeight + self._componentSizes.get(self.KEY_SERVICE_INFO_HEIGHT_ADD, 6) self.additionalInfoFont = gFont(tlf.face(TemplatedListFonts.SMALL), tlf.size(TemplatedListFonts.SMALL)) self.list = [] self.size = 0 self.service_center = eServiceCenter.getInstance() self.numberoffset = 0 self.is_playable_ignore = eServiceReference() self.root = None self.itemHeight = self._componentSizes.get(self.KEY_SERVICE_ITEM_HEIGHT, 28) self.itemHeightHigh = self._componentSizes.get(self.KEY_SERVICE_ITEM_HEIGHT_LARGE, 60) self.l.setItemHeight(self.itemHeight) self.onSelectionChanged = [ ] self.recordingList = {} self.piconLoader = PiconLoader() if self.session: self.session.nav.RecordTimer.on_state_change.append(self.onTimerEntryStateChange) config.usage.configselection_showrecordings.addNotifier(self.getRecordingList, initial_call = True) config.usage.configselection_bigpicons.addNotifier(self.setItemHeight, initial_call = True) config.usage.configselection_secondlineinfo.addNotifier(self.setItemHeight, initial_call = False) self._reloadTimer = eTimer() self.__reloadTimerConn = self._reloadTimer.timeout.connect(self._reload)
def loadSingleSkinData(desktop, skin, path_prefix): """loads skin data like colors, windowstyle etc.""" assert skin.tag == "skin", "root element in skin must be 'skin'!" for c in skin.findall("output"): id = c.attrib.get('id') if id: id = int(id) else: id = 0 if id == 0: # framebuffer for res in c.findall("resolution"): get_attr = res.attrib.get xres = get_attr("xres") if xres: xres = int(xres) else: xres = 720 yres = get_attr("yres") if yres: yres = int(yres) else: yres = 576 bpp = get_attr("bpp") if bpp: bpp = int(bpp) else: bpp = 32 #print "Resolution:", xres,yres,bpp from enigma import gMainDC gMainDC.getInstance().setResolution(xres, yres) desktop.resize(eSize(xres, yres)) if bpp != 32: # load palette (not yet implemented) pass if yres >= 1080: parameters["AutotimerEnabledIcon"] = (2,1,38,36) parameters["AutotimerRecordIcon"] = (42,5,30,30) parameters["ChoicelistDash"] = (0,3,1000,30) parameters["ChoicelistName"] = (68,3,1000,30) parameters["ChoicelistIcon"] = (7,0,52,38) parameters["ConfigListSeperator"] = 300 parameters["DreamexplorerName"] = (62,0,1200,38) parameters["DreamexplorerIcon"] = (15,4,30,30) parameters["FileListName"] = (68,4,1000,34) parameters["FileListIcon"] = (7,4,52,37) parameters["FileListMultiName"] = (90,3,1000,32) parameters["FileListMultiIcon"] = (45, 4, 30, 30) parameters["FileListMultiLock"] = (2,0,36,36) parameters["HelpMenuListHlp"] = (0,0,900,42) parameters["HelpMenuListExtHlp0"] = (0,0,900,39) parameters["HelpMenuListExtHlp1"] = (0,42,900,30) parameters["PartnerBoxEntryListName"] = (8,2,225,38) parameters["PartnerBoxEntryListIP"] = (180,2,225,38) parameters["PartnerBoxEntryListPort"] = (405,2,150,38) parameters["PartnerBoxEntryListType"] = (615,2,150,38) parameters["PartnerBoxTimerServicename"] = (0,0,45) parameters["PartnerBoxTimerName"] = (0,42,30) parameters["PartnerBoxE1TimerTime"] = (0,78,255,30) parameters["PartnerBoxE1TimerState"] = (255,78,255,30) parameters["PartnerBoxE2TimerTime"] = (0,78,225,30) parameters["PartnerBoxE2TimerState"] = (225,78,225,30) parameters["PartnerBoxE2TimerIcon"] = (1050,8,20,20) parameters["PartnerBoxE2TimerIconRepeat"] = (1050,38,20,20) parameters["PartnerBoxBouquetListName"] = (0,0,45) parameters["PartnerBoxChannelListName"] = (0,0,45) parameters["PartnerBoxChannelListTitle"] = (0,42,30) parameters["PartnerBoxChannelListTime"] = (0,78,225,30) parameters["PicturePlayerThumb"] = (30,285,45,300,30,25) parameters["PlayListName"] = (38,2,1000,34) parameters["PlayListIcon"] = (7,7,24,24) parameters["PluginBrowserName"] = (180,8,38) parameters["PluginBrowserDescr"] = (180,42,25) parameters["PluginBrowserIcon"] = (15,8,150,60) parameters["PluginBrowserDownloadName"] = (120,8,38) parameters["PluginBrowserDownloadDescr"] = (120,42,25) parameters["PluginBrowserDownloadIcon"] = (15,0,90,76) parameters["ServiceInfo"] = (0,0,450,50) parameters["ServiceInfoLeft"] = (0,0,450,45) parameters["ServiceInfoRight"] = (450,0,1000,45) parameters["SelectionListDescr"] = (45,3,1000,32) parameters["SelectionListLock"] = (0,2,36,36) parameters["SelectionListLockOff"] = (0,2,36,36) parameters["VirtualKeyboard"] = (68,68) parameters["SHOUTcastListItem"] = (30,27,35,96,35,33,60,32) parameters["EPGImportFilterListDescr"] = (30,3,500,30) parameters["EPGImportFilterListLockOff"] = (0,0,30,30) parameters["EPGImportFilterListLockOn"] = (0,0,30,30) for skininclude in skin.findall("include"): filename = skininclude.attrib.get("filename") if filename: skinfile = resolveFilename(SCOPE_ACTIVE_SKIN, filename, path_prefix=path_prefix) if not fileExists(skinfile): skinfile = resolveFilename(SCOPE_SKIN_IMAGE, filename, path_prefix=path_prefix) if fileExists(skinfile): print "[Skin] Loading include:", skinfile loadSkin(skinfile) for c in skin.findall('switchpixmap'): for pixmap in c.findall('pixmap'): get_attr = pixmap.attrib.get name = get_attr('name') if not name: raise SkinError('[Skin] pixmap needs name attribute') filename = get_attr('filename') if not filename: raise SkinError('[Skin] pixmap needs filename attribute') resolved_png = resolveFilename(SCOPE_ACTIVE_SKIN, filename, path_prefix=path_prefix) if fileExists(resolved_png): switchPixmap[name] = LoadPixmap(resolved_png, cached=True) else: raise SkinError('[Skin] switchpixmap pixmap filename="%s" (%s) not found' % (filename, resolved_png)) for c in skin.findall("colors"): for color in c.findall("color"): get_attr = color.attrib.get name = get_attr("name") color = get_attr("value") if name and color: colorNames[name] = parseColor(color) #print "Color:", name, color else: raise SkinError("[Skin] need color and name, got %s %s" % (name, color)) for c in skin.findall("fonts"): for font in c.findall("font"): get_attr = font.attrib.get filename = get_attr("filename", "<NONAME>") name = get_attr("name", "Regular") scale = get_attr("scale") if scale: scale = int(scale) else: scale = 100 is_replacement = get_attr("replacement") and True or False render = get_attr("render") if render: render = int(render) else: render = 0 resolved_font = resolveFilename(SCOPE_FONTS, filename, path_prefix=path_prefix) if not fileExists(resolved_font): #when font is not available look at current skin path resolved_font = resolveFilename(SCOPE_ACTIVE_SKIN, filename) if fileExists(resolveFilename(SCOPE_CURRENT_SKIN, filename)): resolved_font = resolveFilename(SCOPE_CURRENT_SKIN, filename) elif fileExists(resolveFilename(SCOPE_ACTIVE_LCDSKIN, filename)): resolved_font = resolveFilename(SCOPE_ACTIVE_LCDSKIN, filename) addFont(resolved_font, name, scale, is_replacement, render) #print "Font: ", resolved_font, name, scale, is_replacement for alias in c.findall("alias"): get = alias.attrib.get try: name = get("name") font = get("font") size = int(get("size")) height = int(get("height", size)) # to be calculated some day width = int(get("width", size)) global fonts fonts[name] = (font, size, height, width) except Exception, ex: print "[Skin] Bad font alias", ex
class VirtualKeyBoard(Screen, HelpableScreen): def __init__(self, session, title=_("Virtual KeyBoard Text:"), text="", maxSize=False, visible_width=False, type=Input.TEXT, currPos=0, allMarked=False): Screen.__init__(self, session) HelpableScreen.__init__(self) self.setTitle(_("Virtual keyboard")) prompt = title # Title should only be used for screen titles! self.key_bg = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_bg.png")) self.key_red_bg = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_red.png")) self.key_green_bg = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_green.png")) self.key_yellow_bg = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_yellow.png")) self.key_blue_bg = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_blue.png")) self.key_sel = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_sel.png")) self.key_backspace = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_backspace.png")) self.key_enter = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_enter.png")) self.key_first = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_first.png")) self.key_last = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_last.png")) self.key_left = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_left.png")) self.key_right = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_right.png")) self.key_shift0 = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_shift0.png")) self.key_shift1 = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_shift1.png")) self.key_shift2 = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_shift2.png")) self.key_shift3 = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_shift3.png")) self.key_space = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_space.png")) self.key_space_alt = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_space_alt.png")) self.keyBackgrounds = { "EXIT": self.key_red_bg, "OK": self.key_green_bg, "SAVE": self.key_green_bg, "LOC": self.key_yellow_bg, "SHFT": self.key_blue_bg } self.keyImages = [{ "BACKSPACE": self.key_backspace, "ENTER": self.key_enter, "FIRST": self.key_first, "LAST": self.key_last, "LEFT": self.key_left, "RIGHT": self.key_right, "SHIFT": self.key_shift0, "SPACE": self.key_space_alt }, { "BACKSPACE": self.key_backspace, "ENTER": self.key_enter, "FIRST": self.key_first, "LAST": self.key_last, "LEFT": self.key_left, "RIGHT": self.key_right, "SHIFT": self.key_shift1, "SPACE": self.key_space_alt }, { "BACKSPACE": self.key_backspace, "ENTER": self.key_enter, "FIRST": self.key_first, "LAST": self.key_last, "LEFT": self.key_left, "RIGHT": self.key_right, "SHIFT": self.key_shift2, "SPACE": self.key_space_alt }, { "BACKSPACE": self.key_backspace, "ENTER": self.key_enter, "FIRST": self.key_first, "LAST": self.key_last, "LEFT": self.key_left, "RIGHT": self.key_right, "SHIFT": self.key_shift3, "SPACE": self.key_space_alt }] self.shiftMsgs = [ _("Lower case"), _("Upper case"), _("Special 1"), _("Special 2") ] self.english = [ [ [u"`", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"-", u"=", u"BACKSPACE"], [u"FIRST", u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"[", u"]", u"\\"], [u"LAST", u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u";", u"'", u"", u"ENTER"], [u"SHIFT", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", u".", u"/", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ], [ [u"~", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"*", u"(", u")", u"_", u"+", u"BACKSPACE"], [u"FIRST", u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"{", u"}", u"|"], [u"LAST", u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u":", u"\"", u"", u"ENTER"], [u"SHIFT", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u"<", u">", u"?", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ] ] self.french = [ [ [u"\u00B2", u"&", u"\u00E9", u"\"", u"'", u"(", u"-", u"\u00E8", u"_", u"\u00E7", u"\u00E0", u")", u"=", u"BACKSPACE"], [u"FIRST", u"a", u"z", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"$", u"[", u"]"], [u"LAST", u"q", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"m", u"\u00F9", u"*", u"ENTER"], [u"SHIFT", u"<", u"w", u"x", u"c", u"v", u"b", u"n", u",", u";", u":", u"!", u"\u20AC", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"#", u"@", u"`"] ], [ [u"", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"\u00B0", u"+", u"BACKSPACE"], [u"FIRST", u"A", u"Z", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"\u00A3", u"{", u"}"], [u"LAST", u"Q", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"M", u"%", u"\u00B5", u"ENTER"], [u"SHIFT", u">", u"W", u"X", u"C", u"V", u"B", u"N", u"?", u".", u"/", u"\u00A7", u"\u00A6", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"~", u"^", u"\\"] ], [ [u"", u"", u"\u00E2", u"\u00EA", u"\u00EE", u"\u00F4", u"\u00FB", u"\u00E4", u"\u00EB", u"\u00EF", u"\u00F6", u"\u00FC", u"", u"BACKSPACE"], [u"FIRST", u"", u"\u00E0", u"\u00E8", u"\u00EC", u"\u00F2", u"\u00F9", u"\u00E1", u"\u00E9", u"\u00ED", u"\u00F3", u"\u00FA", u"", u""], [u"LAST", u"", u"\u00C2", u"\u00CA", u"\u00CE", u"\u00D4", u"\u00DB", u"\u00C4", u"\u00CB", u"\u00CF", u"\u00D6", u"\u00DC", u"", u"ENTER"], [u"SHIFT", u"", u"\u00C0", u"\u00C8", u"\u00CC", u"\u00D2", u"\u00D9", u"\u00C1", u"\u00C9", u"\u00CD", u"\u00D3", u"\u00DA", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ] ] self.german = [ [ [u"", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"\u00DF", u"'", u"BACKSPACE"], [u"FIRST", u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"\u00FC", u"[", u"]"], [u"LAST", u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"\u00F6", u"\u00E4", u"+", U"ENTER"], [u"SHIFT", u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"#", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"|", u"\\", u"\u00B5"] ], [ [u"\u00B0", u"!", u"\"", u"\u00A7", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"?", u"`", u"BACKSPACE"], [u"FIRST", u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"\u00DC", u"{", u"}"], [u"LAST", u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"\u00D6", u"\u00C4", u"*", U"ENTER"], [u"SHIFT", u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"@", U"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"\u20AC", u"\u00B2", u"\u00B3"] ] ] self.russian = [ [ [u"\u0451", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"-", u"=", u"BACKSPACE"], [u"FIRST", u"\u0439", u"\u0446", u"\u0443", u"\u043A", u"\u0435", u"\u043D", u"\u0433", u"\u0448", u"\u0449", u"\u0437", u"\u0445", u"\u044A", u"\u00A7"], [u"LAST", u"\u0444", u"\u044B", u"\u0432", u"\u0430", u"\u043F", u"\u0440", u"\u043E", u"\u043B", u"\u0434", u"\u0436", u"\u044D", u"\\", u"ENTER"], [u"SHIFT", u"\u044F", u"\u0447", u"\u0441", u"\u043C", u"\u0438", u"\u0442", u"\u044C", u"\u0431", u"\u044E", u".", u"@", u"&", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"<"] ], [ [u"\u0401", u"!", u"\"", u"\u2116", u";", u"%", u":", u"?", u"*", u"(", u")", u"_", u"+", u"BACKSPACE"], [u"FIRST", u"\u0419", u"\u0426", u"\u0423", u"\u041A", u"\u0415", u"\u041D", u"\u0413", u"\u0428", u"\u0429", u"\u0417", u"\u0425", u"\u042A", u"\u20BD"], [u"LAST", u"\u0424", u"\u042B", u"\u0412", u"\u0410", u"\u041F", u"\u0420", u"\u041E", u"\u041B", u"\u0414", u"\u0416", u"\u042D", u"/", u"ENTER"], [u"SHIFT", u"\u042F", u"\u0427", u"\u0421", u"\u041C", u"\u0418", u"\u0422", u"\u042C", u"\u0411", u"\u042E", u",", u"#", u"$", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u">"] ] ] self.scandinavian = [ [ [u"\u00A7", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"+", u"@", u"BACKSPACE"], [u"FIRST", u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"\u00E5", u"[", u"]"], [u"LAST", u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"\u00F6", u"\u00E4", u"'", u"ENTER"], [u"SHIFT", u"<", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"\u00AB", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ], [ [u"\u00BD", u"!", u"\"", u"#", u"\u00A4", u"%", u"&", u"/", u"(", u")", u"=", u"?", u"|", u"BACKSPACE"], [u"FIRST", u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"\u00C5", u"{", u"}"], [u"LAST", u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"\u00D6", u"\u00C4", u"*", u"ENTER"], [u"SHIFT", u">", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"\u00BB", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ], [ [u"", u"\u00E2", u"\u00EA", u"\u00EE", u"\u00F4", u"\u00FB", u"\u00E4", u"\u00EB", u"\u00EF", u"\u00F6", u"\u00FC", u"\u00E3", u"\u00F5", u"BACKSPACE"], [u"FIRST", u"\u00E0", u"\u00E8", u"\u00EC", u"\u00F2", u"\u00F9", u"\u00E1", u"\u00E9", u"\u00ED", u"\u00F3", u"\u00FA", u"", u"", u""], [u"LAST", u"\u00C2", u"\u00CA", u"\u00CE", u"\u00D4", u"\u00DB", u"\u00C4", u"\u00CB", u"\u00CF", u"\u00D6", u"\u00DC", u"\u00C3", u"\u00D5", u"ENTER"], [u"SHIFT", u"\u00C0", u"\u00C8", u"\u00CC", u"\u00D2", u"\u00D9", u"\u00C1", u"\u00C9", u"\u00CD", u"\u00D3", u"\u00DA", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ] ] self.spanish = [ [ [u"\\", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"'", u"\u00A1", u"BACKSPACE"], [u"FIRST", u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"@", u"+", u"\u00E7"], [u"LAST", u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"\u00F1", u"[", u"]", u"ENTER"], [u"SHIFT", u"<", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"\u20AC", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"", u"\u00E1", u"\u00E9", u"\u00ED", u"\u00F3", u"\u00FA", u"\u00FC"] ], [ [u"|", u"!", u"\"", u"\u00B7", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"?", u"\u00BF", u"BACKSPACE"], [u"FIRST", u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"#", u"*", u"\u00C7"], [u"LAST", u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"\u00D1", u"{", u"}", u"ENTER"], [u"SHIFT", u">", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"\u00AC", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"", u"\u00C1", u"\u00C9", u"\u00CD", u"\u00D3", u"\u00DA", u"\u00DC"] ] ] self.locales = { "ar_BH": [_("Arabic"), _("Bahrain"), self.arabic(self.english)], "ar_EG": [_("Arabic"), _("Egypt"), self.arabic(self.english)], "ar_JO": [_("Arabic"), _("Jordan"), self.arabic(self.english)], "ar_KW": [_("Arabic"), _("Kuwait"), self.arabic(self.english)], "ar_LB": [_("Arabic"), _("Lebanon"), self.arabic(self.english)], "ar_OM": [_("Arabic"), _("Oman"), self.arabic(self.english)], "ar_QA": [_("Arabic"), _("Qatar"), self.arabic(self.english)], "ar_SA": [_("Arabic"), _("Saudi Arabia"), self.arabic(self.english)], "ar_SY": [_("Arabic"), _("Syrian Arab Republic"), self.arabic(self.english)], "ar_AE": [_("Arabic"), _("United Arab Emirates"), self.arabic(self.english)], "ar_YE": [_("Arabic"), _("Yemen"), self.arabic(self.english)], "cs_CZ": [_("Czech"), _("Czechia"), [ [ [u";", u"+", u"\u011B", u"\u0161", u"\u010D", u"\u0159", u"\u017E", u"\u00FD", u"\u00E1", u"\u00ED", u"\u00E9", u"=", u"", u"BACKSPACE"], [u"FIRST", u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"\u00FA", u")", u""], [u"LAST", u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"\u016F", u"\u00A7", u"", u"ENTER"], [u"SHIFT", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"\u0148", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ], [ [u"", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"%", u"", u"BACKSPACE"], [u"FIRST", u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"/", u"(", u""], [u"LAST", u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"\"", u"!", u"'", u"ENTER"], [u"SHIFT", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u"?", u":", u"_", u"\u0147", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ], [ [u"", u"~", u"\u011A", u"\u0160", u"\u010C", u"\u0158", u"\u017D", u"\u00DD", u"\u00C1", u"\u00CD", u"\u00C9", u"`", u"", u"BACKSPACE"], [u"FIRST", u"\\", u"|", u"\u20AC", u"\u0165", u"\u0164", u"", u"", u"", u"\u00F3", u"\u00D3", u"\u00DA", u"\u00F7", u"\u00D7"], [u"LAST", u"", u"\u0111", u"\u00D0", u"[", u"]", u"\u010F", u"\u010E", u"\u0142", u"\u0141", u"\u016E", u"$", u"\u00DF", u"ENTER"], [u"SHIFT", u"", u"#", u"&", u"@", u"{", u"}", u"", u"<", u">", u"*", u"", u"\u00A4", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ] ]], "nl_NL": [_("Dutch"), _("Netherlands"), self.dutch(self.english)], "en_AU": [_("English"), _("Australian"), self.australian(self.english)], "en_GB": [_("English"), _("United Kingdom"), self.unitedKingdom(self.english)], "en_US": [_("English"), _("United States"), self.english], "en_EN": [_("English"), _("Various"), self.english], "et_EE": [_("Estonian"), _("Estonia"), self.estonian(self.scandinavian)], "fi_FI": [_("Finnish"), _("Finland"), self.finnish(self.scandinavian)], "fr_BE": [_("French"), _("Belgian"), self.belgian(self.french)], "fr_FR": [_("French"), _("France"), self.french], "de_DE": [_("German"), _("Germany"), self.german], "el_GR": [_("Greek (Modern)"), _("Greece"), [ [ [u"`", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"-", u"=", u"BACKSPACE"], [u"FIRST", u";", u"\u03C2", u"\u03B5", u"\u03C1", u"\u03C4", u"\u03C5", u"\u03B8", u"\u03B9", u"\u03BF", u"\u03C0", u"[", u"]", u"/"], [u"LAST", u"\u03B1", u"\u03C3", u"\u03B4", u"\u03C6", u"\u03B3", u"\u03B7", u"\u03BE", u"\u03BA", u"\u03BB", u"", u"'", u"\\", u"ENTER"], [u"SHIFT", u"<", u"\u03B6", u"\u03C7", u"\u03C8", u"\u03C9", u"\u03B2", u"\u03BD", u"\u03BC", u",", ".", u"\u03CA", u"\u03CB", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"\u03AC", u"\u03AD", u"\u03AE", u"\u03AF", u"\u03CC", u"\u03CD", u"\u03CE"] ], [ [u"~", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"*", u"(", u")", u"_", u"+", u"BACKSPACE"], [u"FIRST", u":", u"", u"\u0395", u"\u03A1", u"\u03A4", u"\u03A5", u"\u0398", u"\u0399", u"\u039F", u"\u03A0", u"{", u"}", u"?"], [u"LAST", u"\u0391", u"\u03A3", u"\u0394", u"\u03A6", u"\u0393", u"\u0397", u"\u039E", u"\u039A", u"\u039B", u"", u"\"", u"|", u"ENTER"], [u"SHIFT", u">", u"\u0396", u"\u03A7", u"\u03A8", u"\u03A9", u"\u0392", u"\u039D", u"\u039C", u"<", u">", u"\u03AA", u"\u03AB", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"\u0386", u"\u0388", u"\u0389", u"\u038A", u"\u038C", u"\u038E", u"\u038F"] ], [ [u"", u"", u"\u00B2", u"\u00B3", u"\u00A3", u"\u00A7", u"\u00B6", u"\u20AC", u"\u00A4", u"\u00A6", u"\u00B0", u"\u00B1", u"\u00BD", u"BACKSPACE"], [u"FIRST", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u""], [u"LAST", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"ENTER"], [u"SHIFT", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ] ]], "lv_LV": [_("Latvian"), _("Latvia"), self.latvian(self.english)], "lt_LT": [_("Lithuanian"), _("Lithuania"), self.lithuanian(self.english)], "nb_NO": [_("Norwegian"), _("Norway"), self.norwegian(self.scandinavian)], "fa_IR": [_("Persian"), _("Iran, Islamic Republic"), self.persian(self.english)], "pl_PL": [_("Polish"), _("Poland"), self.polish(self.english)], "ru_RU": [_("Russian"), _("Russian Federation"), self.russian], "sk_SK": [_("Slovak"), _("Slovakia"), [ [ [u"~", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"*", u"(", u")", u"\u00E1", u"\u00E4", u"BACKSPACE"], [u"FIRST", u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"\u010D", u"\u010F", u"\u00E9"], [u"LAST", u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"\u00ED", u"\u013A", u"\u013E", u"ENTER"], [u"SHIFT", u"<", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"\u0148", u"\u00F3", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"\u00F4", u"\u0155", u"\u0161", u"\u0165", u"\u00FA", u"\u00FD", u"\u017E"] ], [ [u"`", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"\u00C1", u"\u00C4", u"BACKSPACE"], [u"FIRST", u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"\u010C", u"\u010E", u"\u00C9"], [u"LAST", u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"\u00CD", u"\u0139", u"\u013D", u"ENTER"], [u"SHIFT", u">", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u"?", u":", u"\u0147", u"\u00D3", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"\u00D4", u"\u0154", u"\u0160", u"\u0164", u"\u00DA", u"\u00DD", u"\u017D"] ], [ [u"", u"", u"\u00A7", u"\u00B0", u"\u00A4", u"\u20AC", u"\u00DF", u"\u0111", u"\u0110", u"\u0142", u"\u0141", u"", u"", u"BACKSPACE"], [u"FIRST", u"", u"", u"'", u"\"", u"+", u"-", u"\u00D7", u"\u00F7", u"=", u"_", u"~", u"", u""], [u"LAST", u"", u"", u"/", u"\\", u";", u"[", u"]", u"{", u"}", u"|", u"", u"", u"ENTER"], [u"SHIFT", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ] ]], "es_ES": [_("Spanish"), _("Spain"), self.spanish], "sv_SE": [_("Swedish"), _("Sweden"), self.swedish(self.scandinavian)], "th_TH": [_("Thai"), _("Thailand"), [ [ [u"", u"", u"\u0E45", u"\u0E20", u"\u0E16", u"\u0E38", u"\u0E36", u"\u0E04", u"\u0E15", u"\u0E08", u"\u0E02", u"\u0E0A", u"", u"BACKSPACE"], [u"FIRST", u"\u0E46", u"\u0E44", u"\u0E33", u"\u0E1E", u"\u0E30", u"\u0E31", u"\u0E35", u"\u0E23", u"\u0E19", u"\u0E22", u"\u0E1A", u"\u0E25", u""], [u"LAST", u"\u0E1F", u"\u0E2B", u"\u0E01", u"\u0E14", u"\u0E40", u"\u0E49", u"\u0E48", u"\u0E32", u"\u0E2A", u"\u0E27", u"\u0E07", u"\u0E03", u"OK"], [u"SHIFT", u"\u0E1C", u"\u0E1B", u"\u0E41", u"\u0E2D", u"\u0E34", u"\u0E37", u"\u0E17", u"\u0E21", u"\u0E43", u"\u0E1D", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ], [ [u"", u"", u"\u0E51", u"\u0E52", u"\u0E53", u"\u0E54", u"\u0E39", u"\u0E55", u"\u0E56", u"\u0E57", u"\u0E58", u"\u0E59", u"", u"BACKSPACE"], [u"FIRST", u"\u0E50", u"", u"\u0E0E", u"\u0E11", u"\u0E18", u"\u0E4D", u"\u0E4A", u"\u0E13", u"\u0E2F", u"\u0E0D", u"\u0E10", u"\u0E05", u""], [u"LAST", u"\u0E24", u"\u0E06", u"\u0E0F", u"\u0E42", u"\u0E0C", u"\u0E47", u"\u0E4B", u"\u0E29", u"\u0E28", u"\u0E0B", u"", u"\u0E3F", u"OK"], [u"SHIFT", u"", u"", u"\u0E09", u"\u0E2E", u"\u0E3A", u"\u0E4C", u"", u"\u0E12", u"\u0E2C", u"\u0E26", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ] ]], "uk_UA": [_("Ukrainian"), _("Ukraine"), self.ukranian(self.russian)] } self["actions"] = HelpableNumberActionMap(self, "VirtualKeyBoardActions", { "cancel": (self.cancel, _("Cancel any text changes and exit")), "save": (self.save, _("Save any text changes and exit")), "locale": (self.localeMenu, _("Select the virtual keyboard locale from a menu")), "shift": (self.shiftClicked, _("Select the virtual keyboard shifted character set")), "select": (self.processSelect, _("Select the character or action under the virtual keyboard cursor")), "up": (self.up, _("Move the virtual keyboard cursor up")), "left": (self.left, _("Move the virtual keyboard cursor left")), "right": (self.right, _("Move the virtual keyboard cursor right")), "down": (self.down, _("Move the virtual keyboard cursor down")), "first": (self.cursorFirst, _("Move the text buffer cursor to the first character")), "prev": (self.cursorLeft, _("Move the text buffer cursor left")), "next": (self.cursorRight, _("Move the text buffer cursor right")), "last": (self.cursorLast, _("Move the text buffer cursor to the last character")), "toggleOverwrite": (self.keyToggleOW, _("Toggle new text inserts before or overwrites existing text")), "backspace": (self.backClicked, _("Delete the character to the left of text buffer cursor")), "delete": (self.forwardClicked, _("Delete the character under the text buffer cursor")), "1": (self.keyNumberGlobal, _("Number or SMS style data entry")), "2": (self.keyNumberGlobal, _("Number or SMS style data entry")), "3": (self.keyNumberGlobal, _("Number or SMS style data entry")), "4": (self.keyNumberGlobal, _("Number or SMS style data entry")), "5": (self.keyNumberGlobal, _("Number or SMS style data entry")), "6": (self.keyNumberGlobal, _("Number or SMS style data entry")), "7": (self.keyNumberGlobal, _("Number or SMS style data entry")), "8": (self.keyNumberGlobal, _("Number or SMS style data entry")), "9": (self.keyNumberGlobal, _("Number or SMS style data entry")), "0": (self.keyNumberGlobal, _("Number or SMS style data entry")), "gotAsciiCode": (self.keyGotAscii, _("Keyboard data entry")) }, -2, description=_("Virtual KeyBoard Functions")) self.lang = language.getLanguage() self["prompt"] = Label(prompt) self["text"] = Input(text=text, maxSize=maxSize, visible_width=visible_width, type=type, currPos=len(text.decode("utf-8", "ignore")), allMarked=allMarked) self["list"] = VirtualKeyBoardList([]) self["mode"] = Label(_("INS")) self["locale"] = Label(_("Locale") + ": " + self.lang) self["language"] = Label(_("Language") + ": " + self.lang) self["key_info"] = StaticText(_("INFO")) self["key_red"] = StaticText(_("Exit")) self["key_green"] = StaticText(_("Save")) self["key_yellow"] = StaticText(_("Select locale")) self["key_blue"] = StaticText(self.shiftMsgs[1]) self["key_help"] = StaticText(_("HELP")) width, self.height = skin.parameters.get("VirtualKeyBoard", (45, 45)) self.width = self.key_bg and self.key_bg.size().width() or width self.shiftColors = skin.parameters.get("VirtualKeyBoardShiftColors", (0x00ffffff, 0x00ffffff, 0x0000ffff, 0x00ff00ff)) # Ensure there is a color for each shift level! self.language = None self.location = None self.keyList = [] self.shiftLevels = 0 self.shiftLevel = 0 self.keyboardWidth = 0 self.keyboardHeight = 0 self.maxKey = 0 self.overwrite = False self.selectedKey = None self.sms = NumericalTextInput(self.smsGotChar) self.smsChar = None self.setLocale() self.onExecBegin.append(self.setKeyboardModeAscii) self.onLayoutFinish.append(self.buildVirtualKeyBoard) def arabic(self, base): keyList = copy.deepcopy(base) keyList[1][0][8] = u"\u066D" keyList.extend([[ [u"\u0630", u"\u0661", u"\u0662", u"\u0663", u"\u0664", u"\u0665", u"\u0666", u"\u0667", u"\u0668", u"\u0669", u"\u0660", u"-", u"=", u"BACKSPACE"], [u"FIRST", u"\u0636", u"\u0635", u"\u062B", u"\u0642", u"\u0641", u"\u063A", u"\u0639", u"\u0647", u"\u062E", u"\u062D", u"\u062C", u"\u062F", u"\\"], [u"LAST", u"\u0634", u"\u0633", u"\u064A", u"\u0628", u"\u0644", u"\u0627", u"\u062A", u"\u0646", u"\u0645", u"\u0643", u"\u0637", u"", u"ENTER"], [u"SHIFT", u"\u0626", u"\u0621", u"\u0624", u"\u0631", u"\uFEFB", u"\u0649", u"\u0629", u"\u0648", u"\u0632", u"\u0638", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ], [ [u"\u0651", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"\u066D", u"(", u")", u"_", u"+", u"BACKSPACE"], [u"FIRST", u"\u0636", u"\u0635", u"\u062B", u"\u0642", u"\u0641", u"\u063A", u"\u0639", u"\u00F7", u"\u00D7", u"\u061B", u">", u"<", u"|"], [u"LAST", u"\u0634", u"\u0633", u"\u064A", u"\u0628", u"\u0644", u"\u0623", u"\u0640", u"\u060C", u"/", u":", u"\"", u"", u"ENTER"], [u"SHIFT", u"\u0626", u"\u0621", u"\u0624", u"\u0631", u"\uFEF5", u"\u0622", u"\u0629", u",", u".", u"\u061F", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ]]) return keyList def australian(self, base): keyList = copy.deepcopy(base) keyList[0][-1].extend([u"www.", u".com", u".net", u".org", u".edu", u".au", u".tv"]) keyList[1][-1].extend([u"www.", u".com", u".net", u".org", u".edu", u".au", u".tv"]) return keyList def belgian(self, base): keyList = copy.deepcopy(base) keyList[0][0][6] = u"\u00A7" keyList[0][0][8] = u"!" keyList[0][0][12] = u"-" keyList[0][2][12] = u"\u00B5" keyList[0][3][11] = u"=" keyList[1][0][0] = u"\u00B3" keyList[1][0][12] = u"_" keyList[1][1][11] = u"*" keyList[1][2][12] = u"\u00A3" keyList[1][3][11] = u"+" return keyList def dutch(self, base): keyList = copy.deepcopy(base) keyList[0][0][0] = u"@" keyList[0][0][11] = u"/" keyList[0][0][12] = u"\u00BA" keyList[0][1][11] = u"\u00A8" keyList[0][1][12] = u"*" keyList[0][1][13] = u"<" keyList[0][2][10] = u"+" keyList[0][2][11] = u"\u00B4" keyList[0][2][12] = u"\\" keyList[0][3] = [u"SHIFT", u"]", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", u".", u"-", u"{", u"SHIFT"] keyList[0][-1].extend([u"www.", u".com", u".net", u".org", u".edu", u".nl", u".tv"]) keyList[1][0] = [u"\u00A7", u"!", u"\"", u"#", u"$", u"%", u"&", u"_", u"(", u")", u"'", u"?", u"~", u"BACKSPACE"] keyList[1][1][11] = u"^" keyList[1][1][12] = u"|" keyList[1][1][13] = u">" keyList[1][2][10] = u"\u00B1" keyList[1][2][11] = u"`" keyList[1][2][12] = u"\u00A6" keyList[1][3] = [u"SHIFT", u"[", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"=", u"}", u"SHIFT"] keyList[1][-1].extend([u"www.", u".com", u".net", u".org", u".edu", u".nl", u".tv"]) keyList.append([ [u"\u00AC", u"\u00B9", u"\u00B2", u"\u00B3", u"\u00BC", u"\u00BD", u"\u00BE", u"\u00A3", u"{", u"}", u"$", u"\\", u"", u"BACKSPACE"], [u"FIRST", u"", u"", u"\u20AC", u"\u00B6", u"", u"", u"", u"", u"", u"", u"", u"", u""], [u"LAST", u"", u"\u00E1", u"\u00E9", u"\u00ED", u"\u00F3", u"\u00FA", u"\u00C1", u"\u00C9", u"\u00CD", u"\u00D3", u"\u00DA", u"", u"ENTER"], [u"SHIFT", u"\u00A6", u"\u00AB", u"\u00BB", u"\u00A2", u"", u"", u"", u"\u00B5", u"", u"\u00B7", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ]) return keyList def estonian(self, base): keyList = copy.deepcopy(base) keyList[0][1][11] = u"\u00FC" keyList[0][1][12] = u"\u00F5" keyList[0][1][13] = u"\u0161" keyList[0][3][12] = u"\u017E" keyList[0][4].extend([u"[", u"]", u"\\"]) keyList[1][1][11] = u"\u00DC" keyList[1][1][12] = u"\u00D5" keyList[1][1][13] = u"\u0160" keyList[1][3][12] = u"\u017D" keyList[1][4].extend([u"{", u"}", u"\u00A3", u"$", u"\u20AC"]) del keyList[2] return keyList def finnish(self, base): keyList = copy.deepcopy(base) keyList[0][4].append(u"\\") keyList[1][4].extend([u"\u00A3", u"$", u"\u20AC"]) return keyList def latvian(self, base): keyList = copy.deepcopy(base) keyList.append([ [u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"BACKSPACE"], [u"FIRST", u"", u"\u0113", u"\u0112", u"\u0157", u"\u0156", u"\u016B", u"\u016A", u"\u012B", u"\u012A", u"\u014D", u"\u014C", u"", u""], [u"LAST", u"\u0101", u"\u0100", u"\u0161", u"\u0160", u"\u0123", u"\u0122", u"\u0137", u"\u0136", u"\u013C", u"\u013B", u"", u"", u"ENTER"], [u"SHIFT", u"\u017E", u"\u017D", u"\u010D", u"\u010C", u"", u"\u0146", u"\u0145", u"", u"", u"", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ]) return keyList def lithuanian(self, base): keyList = copy.deepcopy(base) keyList[0][0] = [u"`", u"\u0105", u"\u010D", u"\u0119", u"\u0117", u"\u012F", u"\u0161", u"\u0173", u"\u016B", u"", u"", u"", u"\u017E", u"BACKSPACE"] keyList[0][1][13] = u"" keyList[0][2][12] = u"\\" keyList[1][0] = [u"~", u"\u0104", u"\u010C", u"\u0118", u"\u0116", u"\u012E", u"\u0160", u"\u0172", u"\u016A", u"\u201E", u"\u201C", u"", u"\u017D", u"BACKSPACE"] keyList[1][1][13] = u"" keyList[1][2][12] = u"|" keyList.append([ [u"\u02DC", u"\u00BC", u"\u00BD", u"\u00BE", u"\u00A4", u"\u00A2", u"\u00B0", u"\u00A7", u"\u00D7", u"\u00AB", u"\u00BB", u"\u00F7", u"\u00B1", u"BACKSPACE"], [u"FIRST", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"-", u"=", u"\u00AD"], [u"LAST", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"*", u"(", u")", u"_", u"+", u"ENTER"], [u"SHIFT", u"", u"\u00DF", u"\u00A9", u"\u00AE", u"\u2122", u"\u00AC", u"\u00A3", u"\u20AC", u"\u00B7", u"\u00B9", u"\u00B2", u"\u00B3", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ]) return keyList def norwegian(self, base): keyList = copy.deepcopy(base) keyList[0][0][0] = u"|" keyList[0][0][12] = u"\\" keyList[0][2][10] = u"\u00F8" keyList[0][2][11] = u"\u00E6" keyList[0][3][12] = u"\u00B5" keyList[1][0][0] = u"\u00A7" keyList[1][0][12] = u"@" keyList[1][2][10] = u"\u00D8" keyList[1][2][11] = u"\u00C6" keyList[1][3][12] = u"" keyList[1][4].extend([u"\u00A3", u"$", u"\u20AC"]) return keyList def persian(self, base): keyList = copy.deepcopy(base) keyList.append([ [u"\u00F7", u"\u06F1", u"\u06F2", u"\u06F3", u"\u06F4", u"\u06F5", u"\u06F6", u"\u06F7", u"\u06F8", u"\u06F9", u"\u06F0", u"-", u"=", u"BACKSPACE"], [u"FIRST", u"\u0636", u"\u0635", u"\u062B", u"\u0642", u"\u0641", u"\u063A", u"\u0639", u"\u0647", u"\u062E", u"\u062D", u"\u062C", u"\u0686", u"\u067E"], [u"LAST", u"\u0634", u"\u0633", u"\u0649", u"\u0628", u"\u0644", u"\u0622", u"\u0627", u"\u062A", u"\u0646", u"\u0645", u"\u06A9", u"\u06AF", u"ENTER"], [u"SHIFT", u"\u0638", u"\u0637", u"\u0698", u"\u0632", u"\u0631", u"\u0630", u"\u062F", u"\u0626", u"\u0621", u"\u0648", u"\u060C", u"\u061F", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ]) return keyList def polish(self, base): keyList = copy.deepcopy(base) keyList[0][3][11] = u"\u0105" keyList[0][3][12] = u"\u0107" keyList[0][-1].extend([u"\u0119", u"\u0142", u"\u0144", u"\u00F3", u"\u015B", u"\u017A", u"\u017C"]) keyList[1][2][12] = u"\u20AC" keyList[1][3][11] = u"\u0104" keyList[1][3][12] = u"\u0106" keyList[1][-1].extend([u"\u0118", u"\u0141", u"\u0143", u"\u00D3", u"\u015A", u"\u0179", u"\u017B"]) return keyList def swedish(self, base): keyList = copy.deepcopy(base) keyList[0][4].extend([u"\\", u"\u00B5"]) keyList[1][4].extend([u"\u00A3", u"$", u"\u20AC"]) return keyList def ukranian(self, base): keyList = copy.deepcopy(base) keyList[0][1][12] = u"\u0457" keyList[0][2][2] = u"\u0456" keyList[0][2][11] = u"\u0454" keyList[0][3][11] = u"\u0491" keyList[0][4].append(u"@") keyList[1][1][12] = u"\u0407" keyList[1][2][2] = u"\u0406" keyList[1][2][11] = u"\u0404" keyList[1][3][11] = u"\u0490" keyList[1][4].append(u"#") return keyList def unitedKingdom(self, base): keyList = copy.deepcopy(base) keyList[0][1][13] = u"\u00A6" keyList[0][2][12] = u"#" keyList[0][3] = [u"SHIFT", u"\\", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", u".", u"/", u"", u"SHIFT"] # keyList[0][-1].extend([u"\u00E1", u"\u00E9", u"\u00ED", u"\u00F3", u"\u00FA"]) # English users don't use the accented characters. keyList[1][0][0] = u"\u00AC" keyList[1][0][2] = u"\"" keyList[1][0][3] = u"\u00A3" keyList[1][1][13] = u"\u20AC" keyList[1][2][11] = u"@" keyList[1][2][12] = u"~" keyList[1][3] = [u"SHIFT", u"|", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u"<", u">", u"?", u"", u"SHIFT"] # keyList[1][-1].extend([u"\u00C1", u"\u00C9", u"\u00CD", u"\u00D3", u"\u00DA"]) # English users don't use the accented characters. return keyList def smsGotChar(self): if self.smsChar and self.selectAsciiKey(self.smsChar): self.processSelect() def setLocale(self): self.language, self.location, self.keyList = self.locales.get(self.lang, [None, None, None]) if self.language is None or self.location is None or self.keyList is None: self.lang = "en_EN" self.language = _("English") self.location = _("Various") self.keyList = self.english self.shiftLevel = 0 self["locale"].setText(_("Locale") + ": " + self.lang + " (" + self.language + " - " + self.location + ")") def buildVirtualKeyBoard(self): self.shiftLevels = len(self.keyList) if self.shiftLevel >= self.shiftLevels: self.shiftLevel = 0 self.keyboardWidth = len(self.keyList[self.shiftLevel][0]) self.keyboardHeight = len(self.keyList[self.shiftLevel]) self.maxKey = self.keyboardWidth * (self.keyboardHeight - 1) + len(self.keyList[self.shiftLevel][-1]) - 1 # print "[VirtualKeyBoard] DEBUG: Width=%d, Height=%d, Keys=%d, maxKey=%d, shiftLevels=%d" % (self.keyboardWidth, self.keyboardHeight, self.maxKey + 1, self.maxKey, self.shiftLevels) self.list = [] for keys in self.keyList[self.shiftLevel]: self.list.append(self.virtualKeyBoardEntryComponent(keys)) self.previousSelectedKey = None if self.selectedKey is None: self.selectedKey = self.keyboardWidth self.markSelectedKey() def virtualKeyBoardEntryComponent(self, keys): res = [keys] text = [] offset = 14 - self.keyboardWidth # 14 represents the maximum buttons per row as defined here and in the skin (14 x self.width). x = self.width * offset / 2 if offset % 2: x += self.width / 2 for key in keys: image = self.keyImages[self.shiftLevel].get(key, None) if image: width = image.size().width() res.append(MultiContentEntryPixmapAlphaBlend(pos=(x, 0), size=(width, self.height), png=image)) else: width = self.width res.append(MultiContentEntryPixmapAlphaBlend(pos=(x, 0), size=(width, self.height), png=self.keyBackgrounds.get(key, self.key_bg))) if len(key) > 1: # NOTE: UTF8 / Unicode glyphs only count as one character here. text.append(MultiContentEntryText(pos=(x, 0), size=(width, self.height), font=1, flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER, text=_(key.encode("utf-8")), color=self.shiftColors[self.shiftLevel])) else: text.append(MultiContentEntryText(pos=(x, 0), size=(width, self.height), font=0, flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER, text=key.encode("utf-8"), color=self.shiftColors[self.shiftLevel])) x += width return res + text def markSelectedKey(self): if self.previousSelectedKey is not None: self.list[self.previousSelectedKey / self.keyboardWidth] = self.list[self.previousSelectedKey / self.keyboardWidth][:-1] if self.selectedKey > self.maxKey: self.selectedKey = self.maxKey x = self.list[self.selectedKey / self.keyboardWidth][self.selectedKey % self.keyboardWidth + 1][1] if self.key_sel is None: width = self.width else: width = self.key_sel.size().width() self.list[self.selectedKey / self.keyboardWidth].append(MultiContentEntryPixmapAlphaBlend(pos=(x, 0), size=(width, self.height), png=self.key_sel)) self.previousSelectedKey = self.selectedKey self["list"].setList(self.list) def okClicked(self): # Deprecated legacy interface to new processSelect used by YouTubeVirtualKeyBoard self.processSelect() def processSelect(self): self.smsChar = None text = self.keyList[self.shiftLevel][self.selectedKey / self.keyboardWidth][self.selectedKey % self.keyboardWidth].encode("UTF-8") if text == u"": pass elif text == u"ALL": self["text"].markAll() elif text == u"BACK": self["text"].deleteBackward() elif text == u"BACKSPACE": self["text"].deleteBackward() elif text == u"BLANK": pass elif text == u"CLR": self["text"].deleteAllChars() self["text"].update() elif text == u"ENTER": self.save() elif text == u"ESC": self.cancel() elif text == u"EXIT": self.cancel() elif text == u"FIRST": self["text"].home() elif text == u"LOC": self.localeMenu() elif text == u"LAST": self["text"].end() elif text == u"LEFT": self["text"].left() elif text == u"OK": self.save() elif text == u"RIGHT": self["text"].right() elif text == u"SAVE": self.save() elif text == u"SHIFT": self.shiftClicked() elif text == u"Shift": self.shiftClicked() elif text == u"SPACE": self["text"].char(" ".encode("UTF-8")) else: self["text"].char(text.encode("UTF-8")) def cancel(self): self.close(None) def save(self): self.close(self["text"].getText()) def localeMenu(self): languages = [] for locale, data in self.locales.iteritems(): languages.append((data[0] + " - " + data[1] + " (" + locale + ")", locale)) languages = sorted(languages) index = 0 default = 0 for item in languages: if item[1] == self.lang: default = index break index += 1 self.session.openWithCallback(self.localeMenuCallback, ChoiceBox, _("Available locales are:"), list=languages, selection=default, keys=[]) def localeMenuCallback(self, choice): if choice: self.lang = choice[1] self.setLocale() self.buildVirtualKeyBoard() def shiftClicked(self): self.smsChar = None self.shiftLevel = (self.shiftLevel + 1) % self.shiftLevels nextLevel = (self.shiftLevel + 1) % self.shiftLevels self["key_blue"].setText(self.shiftMsgs[nextLevel]) self.buildVirtualKeyBoard() def keyToggleOW(self): self["text"].toggleOverwrite() self.overwrite = not self.overwrite if self.overwrite: self["mode"].setText(_("OVR")) else: self["mode"].setText(_("INS")) def backClicked(self): self["text"].deleteBackward() def forwardClicked(self): self["text"].deleteForward() def cursorFirst(self): self["text"].home() def cursorLeft(self): self["text"].left() def cursorRight(self): self["text"].right() def cursorLast(self): self["text"].end() def up(self): self.smsChar = None self.selectedKey -= self.keyboardWidth if self.selectedKey < 0: self.selectedKey = self.maxKey / self.keyboardWidth * self.keyboardWidth + self.selectedKey % self.keyboardWidth if self.selectedKey > self.maxKey: self.selectedKey -= self.keyboardWidth self.markSelectedKey() def left(self): self.smsChar = None self.selectedKey = self.selectedKey / self.keyboardWidth * self.keyboardWidth + (self.selectedKey + self.keyboardWidth - 1) % self.keyboardWidth if self.selectedKey > self.maxKey: self.selectedKey = self.maxKey self.markSelectedKey() def right(self): self.smsChar = None self.selectedKey = self.selectedKey / self.keyboardWidth * self.keyboardWidth + (self.selectedKey + 1) % self.keyboardWidth if self.selectedKey > self.maxKey: self.selectedKey = self.selectedKey / self.keyboardWidth * self.keyboardWidth self.markSelectedKey() def down(self): self.smsChar = None self.selectedKey += self.keyboardWidth if self.selectedKey > self.maxKey: self.selectedKey %= self.keyboardWidth self.markSelectedKey() def keyNumberGlobal(self, number): self.smsChar = self.sms.getKey(number) self.selectAsciiKey(self.smsChar) def keyGotAscii(self): self.smsChar = None if self.selectAsciiKey(str(unichr(getPrevAsciiCode()).encode("utf-8"))): self.processSelect() def selectAsciiKey(self, char): if char == u" ": char = u"SPACE" self.shiftLevel = -1 for keyList in (self.keyList): self.shiftLevel = (self.shiftLevel + 1) % self.shiftLevels self.buildVirtualKeyBoard() selkey = 0 for keys in keyList: for key in keys: if key == char: self.selectedKey = selkey self.markSelectedKey() return True selkey += 1 return False
class VirtualKeyBoard(Screen): def __init__(self, session, title="", **kwargs): Screen.__init__(self, session) self.keys_list = [] self.shiftkeys_list = [] self.lang = language.getLanguage() self.nextLang = None self.shiftMode = False self.selectedKey = 0 self.smsChar = None self.sms = NumericalTextInput(self.smsOK) self.key_bg = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_bg.png")) self.key_sel = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_sel.png")) self.key_backspace = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_backspace.png")) self.key_all = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_all.png")) self.key_clr = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_clr.png")) self.key_esc = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_esc.png")) self.key_ok = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_ok.png")) self.key_shift = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_shift.png")) self.key_shift_sel = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_shift_sel.png")) self.key_space = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_space.png")) self.key_left = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_left.png")) self.key_right = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_right.png")) self.keyImages = { "BACKSPACE": self.key_backspace, "ALL": self.key_all, "EXIT": self.key_esc, "OK": self.key_ok, "SHIFT": self.key_shift, "SPACE": self.key_space, "LEFT": self.key_left, "RIGHT": self.key_right } self.keyImagesShift = { "BACKSPACE": self.key_backspace, "CLEAR": self.key_clr, "EXIT": self.key_esc, "OK": self.key_ok, "SHIFT": self.key_shift_sel, "SPACE": self.key_space, "LEFT": self.key_left, "RIGHT": self.key_right } self["country"] = StaticText("") self["header"] = Label(title) self["text"] = Input(currPos=len( kwargs.get("text", "").decode("utf-8", 'ignore')), allMarked=False, **kwargs) self["list"] = VirtualKeyBoardList([]) self["actions"] = NumberActionMap( [ "OkCancelActions", "WizardActions", "ColorActions", "KeyboardInputActions", "InputBoxActions", "InputAsciiActions" ], { "gotAsciiCode": self.keyGotAscii, "ok": self.okClicked, "cancel": self.exit, "left": self.left, "right": self.right, "up": self.up, "down": self.down, "red": self.exit, "green": self.ok, "yellow": self.switchLang, "blue": self.shiftClicked, "deleteBackward": self.backClicked, "deleteForward": self.forwardClicked, "back": self.exit, "pageUp": self.cursorRight, "pageDown": self.cursorLeft, "1": self.keyNumberGlobal, "2": self.keyNumberGlobal, "3": self.keyNumberGlobal, "4": self.keyNumberGlobal, "5": self.keyNumberGlobal, "6": self.keyNumberGlobal, "7": self.keyNumberGlobal, "8": self.keyNumberGlobal, "9": self.keyNumberGlobal, "0": self.keyNumberGlobal, }, -2) self.setLang() self.onExecBegin.append(self.setKeyboardModeAscii) self.onLayoutFinish.append(self.buildVirtualKeyBoard) self.onClose.append(self.__onClose) def __onClose(self): self.sms.timer.stop() def switchLang(self): self.lang = self.nextLang self.setLang() self.buildVirtualKeyBoard() def setLang(self): if self.lang == 'de_DE': self.keys_list = [[ u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE" ], [ u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ü", u"+" ], [ u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#" ], [ u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL" ], [ u"SHIFT", u"SPACE", u"@", u"ß", u"OK", u"LEFT", u"RIGHT" ]] self.shiftkeys_list = [[ u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE" ], [ u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ü", u"*" ], [ u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'" ], [ u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR" ], [ u"SHIFT", u"SPACE", u"?", u"\\", u"OK", u"LEFT", u"RIGHT" ]] self.nextLang = 'es_ES' elif self.lang == 'es_ES': #still missing keys (u"ùÙ") self.keys_list = [[ u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE" ], [ u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+" ], [ u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ó", u"á", u"#" ], [ u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL" ], [ u"SHIFT", u"SPACE", u"@", u"Ł", u"ŕ", u"é", u"č", u"í", u"ě", u"ń", u"ň", u"OK" ]] self.shiftkeys_list = [[ u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE" ], [ u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ú", u"*" ], [ u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ó", u"Á", u"'" ], [ u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR" ], [ u"SHIFT", u"SPACE", u"?", u"\\", u"Ŕ", u"É", u"Č", u"Í", u"Ě", u"Ń", u"Ň", u"OK" ]] self.nextLang = 'fi_FI' elif self.lang == 'fi_FI': self.keys_list = [[ u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE" ], [ u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"é", u"+" ], [ u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#" ], [ u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL" ], [ u"SHIFT", u"SPACE", u"@", u"ß", u"ĺ", u"OK", u"LEFT", u"RIGHT" ]] self.shiftkeys_list = [[ u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE" ], [ u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"É", u"*" ], [ u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'" ], [ u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR" ], [ u"SHIFT", u"SPACE", u"?", u"\\", u"Ĺ", u"OK", u"LEFT", u"RIGHT" ]] self.nextLang = 'ru_RU' elif self.lang == 'ru_RU': self.keys_list = [[ u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE" ], [ u"а", u"б", u"в", u"г", u"д", u"е", u"ё", u"ж", u"з", u"и", u"й", u"+" ], [ u"к", u"л", u"м", u"н", u"о", u"п", u"р", u"с", u"т", u"у", u"ф", u"#" ], [ u"<", u"х", u"ц", u"ч", u"ш", u"щ", u"ъ", u"ы", u",", u".", u"-", u"ALL" ], [ u"SHIFT", u"SPACE", u"@", u"ь", u"э", u"ю", u"я", u"OK", u"LEFT", u"RIGHT" ]] self.shiftkeys_list = [[ u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE" ], [ u"А", u"Б", u"В", u"Г", u"Д", u"Е", u"Ё", u"Ж", u"З", u"И", u"Й", u"*" ], [ u"К", u"Л", u"М", u"Н", u"О", u"П", u"Р", u"С", u"Т", u"У", u"Ф", u"'" ], [ u">", u"Х", u"Ц", u"Ч", u"Ш", u"Щ", u"Ъ", u"Ы", u";", u":", u"_", u"CLEAR" ], [ u"SHIFT", u"SPACE", u"?", u"\\", u"Ь", u"Э", u"Ю", u"Я", u"OK", u"LEFT", u"RIGHT" ]] self.nextLang = 'sv_SE' elif self.lang == 'sv_SE': self.keys_list = [[ u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE" ], [ u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"é", u"+" ], [ u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#" ], [ u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL" ], [ u"SHIFT", u"SPACE", u"@", u"ß", u"ĺ", u"OK", u"LEFT", u"RIGHT" ]] self.shiftkeys_list = [[ u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE" ], [ u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"É", u"*" ], [ u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'" ], [ u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR" ], [ u"SHIFT", u"SPACE", u"?", u"\\", u"Ĺ", u"OK", u"LEFT", u"RIGHT" ]] self.nextLang = 'sk_SK' elif self.lang == 'sk_SK': self.keys_list = [[ u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE" ], [ u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+" ], [ u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ľ", u"@", u"#" ], [ u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL" ], [ u"SHIFT", u"SPACE", u"š", u"č", u"ž", u"ý", u"á", u"í", u"é", u"OK", u"LEFT", u"RIGHT" ]] self.shiftkeys_list = [[ u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE" ], [ u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"ť", u"*" ], [ u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"ň", u"ď", u"'" ], [ u"Á", u"É", u"Ď", u"Í", u"Ý", u"Ó", u"Ú", u"Ž", u"Š", u"Č", u"Ť", u"Ň" ], [ u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR" ], [ u"SHIFT", u"SPACE", u"?", u"\\", u"ä", u"ö", u"ü", u"ô", u"ŕ", u"ĺ", u"OK" ]] self.nextLang = 'cs_CZ' elif self.lang == 'cs_CZ': self.keys_list = [[ u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE" ], [ u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+" ], [ u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ů", u"@", u"#" ], [ u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL" ], [ u"SHIFT", u"SPACE", u"ě", u"š", u"č", u"ř", u"ž", u"ý", u"á", u"í", u"é", u"OK" ]] self.shiftkeys_list = [[ u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE" ], [ u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"ť", u"*" ], [ u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"ň", u"ď", u"'" ], [ u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR" ], [ u"SHIFT", u"SPACE", u"?", u"\\", u"Č", u"Ř", u"Š", u"Ž", u"Ú", u"Á", u"É", u"OK" ]] self.nextLang = 'el_GR' elif self.lang == 'el_GR': self.keys_list = [[ u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE" ], [ u"=", u"ς", u"ε", u"ρ", u"τ", u"υ", u"θ", u"ι", u"ο", u"π", u"[", u"]" ], [ u"α", u"σ", u"δ", u"φ", u"γ", u"η", u"ξ", u"κ", u"λ", u";", u"'", u"-" ], [ u"\\", u"ζ", u"χ", u"ψ", u"ω", u"β", u"ν", u"μ", u",", ".", u"/", u"ALL" ], [ u"SHIFT", u"SPACE", u"ά", u"έ", u"ή", u"ί", u"ό", u"ύ", u"ώ", u"ϊ", u"ϋ", u"OK" ]] self.shiftkeys_list = [[ u"EXIT", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"*", u"(", u")", u"BACKSPACE" ], [ u"+", u"€", u"Ε", u"Ρ", u"Τ", u"Υ", u"Θ", u"Ι", u"Ο", u"Π", u"{", u"}" ], [ u"Α", u"Σ", u"Δ", u"Φ", u"Γ", u"Η", u"Ξ", u"Κ", u"Λ", u":", u'"', u"_" ], [ u"|", u"Ζ", u"Χ", u"Ψ", u"Ω", u"Β", u"Ν", u"Μ", u"<", u">", u"?", u"CLEAR" ], [ u"SHIFT", u"SPACE", u"Ά", u"Έ", u"Ή", u"Ί", u"Ό", u"Ύ", u"Ώ", u"Ϊ", u"Ϋ", u"OK" ]] self.nextLang = 'pl_PL' elif self.lang == 'pl_PL': self.keys_list = [[ u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE" ], [ u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"-", u"[" ], [ u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u";", u"'", u"\\" ], [ u"<", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"/", u"ALL" ], [ u"SHIFT", u"SPACE", u"ą", u"ć", u"ę", u"ł", u"ń", u"ó", u"ś", u"ź", u"ż", u"OK" ]] self.shiftkeys_list = [[ u"EXIT", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"(", u")", u"=", u"BACKSPACE" ], [ u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"*", u"]" ], [ u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"?", u'"', u"|" ], [ u">", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR" ], [ u"SHIFT", u"SPACE", u"Ą", u"Ć", u"Ę", u"Ł", u"Ń", u"Ó", u"Ś", u"Ź", u"Ż", u"OK" ]] self.nextLang = 'en_EN' else: self.keys_list = [[ u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE" ], [ u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"-", u"[" ], [ u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u";", u"'", u"\\" ], [ u"<", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"/", u"ALL" ], [u"SHIFT", u"SPACE", u"OK", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [[ u"EXIT", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"(", u")", u"=", u"BACKSPACE" ], [ u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"*", u"]" ], [ u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"?", u'"', u"|" ], [ u">", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR" ], [ u"SHIFT", u"SPACE", u"OK", u"LEFT", u"RIGHT" ]] self.lang = 'en_EN' self.nextLang = 'de_DE' self["country"].setText(self.lang) self.max_key = 47 + len(self.keys_list[4]) def virtualKeyBoardEntryComponent(self, keys): key_bg_width = self.key_bg and self.key_bg.size().width() or 45 key_images = self.shiftMode and self.keyImagesShift or self.keyImages res = [(keys)] text = [] x = 0 for key in keys: png = key_images.get(key, None) if png: width = png.size().width() res.append( MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=png)) else: width = key_bg_width res.append( MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=self.key_bg)) text.append( MultiContentEntryText(pos=(x, 0), size=(width, 45), font=0, text=key.encode("utf-8"), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER)) x += width return res + text def buildVirtualKeyBoard(self): self.previousSelectedKey = None self.list = [] for keys in self.shiftMode and self.shiftkeys_list or self.keys_list: self.list.append(self.virtualKeyBoardEntryComponent(keys)) self.markSelectedKey() def markSelectedKey(self): if self.previousSelectedKey is not None: self.list[self.previousSelectedKey / 12] = self.list[self.previousSelectedKey / 12][:-1] width = self.key_sel.size().width() x = self.list[self.selectedKey / 12][self.selectedKey % 12 + 1][1] self.list[self.selectedKey / 12].append( MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, 45), png=self.key_sel)) self.previousSelectedKey = self.selectedKey self["list"].setList(self.list) def backClicked(self): self["text"].deleteBackward() def forwardClicked(self): self["text"].deleteForward() def shiftClicked(self): self.smsChar = None self.shiftMode = not self.shiftMode self.buildVirtualKeyBoard() def okClicked(self): self.smsChar = None text = (self.shiftMode and self.shiftkeys_list or self.keys_list)[self.selectedKey / 12][self.selectedKey % 12].encode("UTF-8") if text == "EXIT": self.close(None) elif text == "BACKSPACE": self["text"].deleteBackward() elif text == "ALL": self["text"].markAll() elif text == "CLEAR": self["text"].deleteAllChars() self["text"].update() elif text == "SHIFT": self.shiftClicked() elif text == "SPACE": self["text"].char(" ".encode("UTF-8")) elif text == "OK": self.close(self["text"].getText().encode("UTF-8")) elif text == "LEFT": self["text"].left() elif text == "RIGHT": self["text"].right() else: self["text"].char(text) def ok(self): self.close(self["text"].getText().encode("UTF-8")) def exit(self): self.close(None) def cursorRight(self): self["text"].right() def cursorLeft(self): self["text"].left() def left(self): self.smsChar = None self.selectedKey = self.selectedKey / 12 * 12 + (self.selectedKey + 11) % 12 if self.selectedKey > self.max_key: self.selectedKey = self.max_key self.markSelectedKey() def right(self): self.smsChar = None self.selectedKey = self.selectedKey / 12 * 12 + (self.selectedKey + 1) % 12 if self.selectedKey > self.max_key: self.selectedKey = self.selectedKey / 12 * 12 self.markSelectedKey() def up(self): self.smsChar = None self.selectedKey -= 12 if self.selectedKey < 0: self.selectedKey = self.max_key / 12 * 12 + self.selectedKey % 12 if self.selectedKey > self.max_key: self.selectedKey -= 12 self.markSelectedKey() def down(self): self.smsChar = None self.selectedKey += 12 if self.selectedKey > self.max_key: self.selectedKey = self.selectedKey % 12 self.markSelectedKey() def keyNumberGlobal(self, number): self.smsChar = self.sms.getKey(number) self.selectAsciiKey(self.smsChar) def smsOK(self): if self.smsChar and self.selectAsciiKey(self.smsChar): print "pressing ok now" self.okClicked() def keyGotAscii(self): self.smsChar = None if self.selectAsciiKey(str(unichr( getPrevAsciiCode()).encode('utf-8'))): self.okClicked() def selectAsciiKey(self, char): if char == " ": char = "SPACE" for keyslist in (self.shiftkeys_list, self.keys_list): selkey = 0 for keys in keyslist: for key in keys: if key == char: self.selectedKey = selkey if self.shiftMode != (keyslist is self.shiftkeys_list): self.shiftMode = not self.shiftMode self.buildVirtualKeyBoard() else: self.markSelectedKey() return True selkey += 1 return False
def __init__(self, session): Screen.__init__(self, session) self["actions"] = NumberActionMap( ["NumberActions", "RassInteractiveActions"], { "exit": self.close, "0": lambda x: self.numPressed(0), "1": lambda x: self.numPressed(1), "2": lambda x: self.numPressed(2), "3": lambda x: self.numPressed(3), "4": lambda x: self.numPressed(4), "5": lambda x: self.numPressed(5), "6": lambda x: self.numPressed(6), "7": lambda x: self.numPressed(7), "8": lambda x: self.numPressed(8), "9": lambda x: self.numPressed(9), "nextPage": self.nextPage, "prevPage": self.prevPage, "nextSubPage": self.nextSubPage, "prevSubPage": self.prevSubPage }) self.__event_tracker = ServiceEventTracker( screen=self, eventmap={ iPlayableService.evUpdatedRassInteractivePicMask: self.recvRassInteractivePicMaskChanged }) self["subpages_1"] = Pixmap() self["subpages_2"] = Pixmap() self["subpages_3"] = Pixmap() self["subpages_4"] = Pixmap() self["subpages_5"] = Pixmap() self["subpages_6"] = Pixmap() self["subpages_7"] = Pixmap() self["subpages_8"] = Pixmap() self["subpages_9"] = Pixmap() self["Marker"] = Label(">") self.subpage = { 1: self["subpages_1"], 2: self["subpages_2"], 3: self["subpages_3"], 4: self["subpages_4"], 5: self["subpages_5"], 6: self["subpages_6"], 7: self["subpages_7"], 8: self["subpages_8"], 9: self["subpages_9"] } self.subpage_png = { 1: LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/rass_page1.png")), 2: LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/rass_page2.png")), 3: LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/rass_page3.png")), 4: LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/rass_page4.png")) } self.current_page = 0 self.current_subpage = 0 self.showRassPage(0, 0) self.onLayoutFinish.append(self.updateSubPagePixmaps)
def __init__(self, session, title="", **kwargs): Screen.__init__(self, session) self.keys_list = [] self.shiftkeys_list = [] self.lang = language.getLanguage() self.nextLang = None self.shiftMode = False self.selectedKey = 0 self.smsChar = None self.sms = NumericalTextInput(self.smsOK) self.key_bg = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_bg.png")) self.key_sel = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_sel.png")) self.key_backspace = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_backspace.png")) self.key_all = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_all.png")) self.key_clr = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_clr.png")) self.key_esc = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_esc.png")) self.key_ok = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_ok.png")) self.key_shift = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_shift.png")) self.key_shift_sel = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_shift_sel.png")) self.key_space = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_space.png")) self.key_left = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_left.png")) self.key_right = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, "skin_default/vkey_right.png")) self.keyImages = { "BACKSPACE": self.key_backspace, "ALL": self.key_all, "EXIT": self.key_esc, "OK": self.key_ok, "SHIFT": self.key_shift, "SPACE": self.key_space, "LEFT": self.key_left, "RIGHT": self.key_right } self.keyImagesShift = { "BACKSPACE": self.key_backspace, "CLEAR": self.key_clr, "EXIT": self.key_esc, "OK": self.key_ok, "SHIFT": self.key_shift_sel, "SPACE": self.key_space, "LEFT": self.key_left, "RIGHT": self.key_right } self["country"] = StaticText("") self["header"] = Label(title) self["text"] = Input(currPos=len( kwargs.get("text", "").decode("utf-8", 'ignore')), allMarked=False, **kwargs) self["list"] = VirtualKeyBoardList([]) self["actions"] = NumberActionMap( [ "OkCancelActions", "WizardActions", "ColorActions", "KeyboardInputActions", "InputBoxActions", "InputAsciiActions" ], { "gotAsciiCode": self.keyGotAscii, "ok": self.okClicked, "cancel": self.exit, "left": self.left, "right": self.right, "up": self.up, "down": self.down, "red": self.exit, "green": self.ok, "yellow": self.switchLang, "blue": self.shiftClicked, "deleteBackward": self.backClicked, "deleteForward": self.forwardClicked, "back": self.exit, "pageUp": self.cursorRight, "pageDown": self.cursorLeft, "1": self.keyNumberGlobal, "2": self.keyNumberGlobal, "3": self.keyNumberGlobal, "4": self.keyNumberGlobal, "5": self.keyNumberGlobal, "6": self.keyNumberGlobal, "7": self.keyNumberGlobal, "8": self.keyNumberGlobal, "9": self.keyNumberGlobal, "0": self.keyNumberGlobal, }, -2) self.setLang() self.onExecBegin.append(self.setKeyboardModeAscii) self.onLayoutFinish.append(self.buildVirtualKeyBoard) self.onClose.append(self.__onClose)
def __init__(self, blinkTimer, listType, videoMode, piconLoader, bouquetList, currentIndex, piconSize, listStyle, epgList): self.blinkTimer = blinkTimer self.listType = listType self.videoMode = videoMode self.piconLoader = piconLoader self.piconSize = piconSize self.baseHeight = self.piconSize.height() self.listStyle = listStyle self.epgList = epgList GUIComponent.__init__(self) from Screens.InfoBar import InfoBar EpgCenterList.infoBarInstance = InfoBar.instance EpgCenterList.eServiceCenterInstance = eServiceCenter.getInstance() self.l = eListboxPythonMultiContent() self.l.setBuildFunc(self.buildEpgEntry) self.onSelectionChanged = [ ] if self.videoMode == MODE_SD or self.videoMode == MODE_XD: self.overallFontHeight = 36 elif self.videoMode == MODE_HD: self.overallFontHeight = 44 #initialize self.list = [] self.mode = None self.similarShown = False config.plugins.merlinEpgCenter.listItemHeight.addNotifier(self.changeHeight, initial_call = True) config.plugins.merlinEpgCenter.adjustFontSize.addNotifier(self.setFontSizes, initial_call = True) if listType == LIST_TYPE_EPG: EpgCenterList.bouquetList = bouquetList EpgCenterList.currentBouquetIndex = currentIndex EpgCenterList.updateBouquetServices() EpgCenterList.recordTimer = NavigationInstance.instance.RecordTimer # zap timer pixmaps self.zap_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/zap.png")) self.zap_pre_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/zap_pre.png")) self.zap_post_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/zap_post.png")) self.zap_event_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/zap_event.png")) self.zap_repeated_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/zap_repeated.png")) self.zap_add_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/zap_add.png")) # record timer pixmaps self.timer_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/timer.png")) self.timer_pre_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/timer_pre.png")) self.timer_post_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/timer_post.png")) self.timer_event_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/timer_event.png")) self.timer_repeated_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/timer_repeated.png")) self.timer_add_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/timer_add.png")) # progress pixmaps self.progressPixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/Progress.png")) self.progressPixmap_0 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/Progress_0.png")) self.progressPixmap_1 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/Progress_1.png")) self.progressPixmap_2 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/Progress_2.png")) self.progressPixmap_3 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/Progress_3.png")) self.progressPixmap_4 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/Progress_4.png")) self.progressPixmapWidth = self.progressPixmap.size().width() self.epgcache = eEPGCache.getInstance() self.blinkTimer.callbacks.append(self.invalidateList)
def __init__(self, session, params={}): # Skin generator maxWidth = 0 pX = 40 pY = 60 dY = 10 skinItems = '' self.icons = [] self.list = params['list'] self.withAcceptButton = params.get('with_accept_button', False) self.statusText = params.get('status_text', '') statusTextHight = params.get('status_text_hight', 80) # calcl maxWidth size for idx in range(len(self.list)): item = self.list[idx] if item['label_size'][0] > maxWidth: maxWidth = item['label_size'][0] if item['input_size'][0] > maxWidth: maxWidth = item['input_size'][0] maxWidth += pX * 2 if len(self.statusText): skinItems = '<widget name="statustext" position="10,%d" zPosition="2" size="%d,%d" valign="center" halign="center" font="Regular;22" transparent="1" />' % ( pY + dY, maxWidth - 20, statusTextHight) pY += statusTextHight + dY * 2 for idx in range(len(self.list)): item = self.list[idx] if 'icon_path' in item: self["cover_%d" % idx] = Cover2() self.icons.append({ 'name': "cover_%d" % idx, 'path': item['icon_path'] }) else: self["text_%d" % idx] = Label(item.get('title', '')) self["input_%d" % idx] = Input(**item['input']) self["border_%d" % idx] = Label("") if item.get('useable_chars', None) is not None: self["input_%d" % idx].setUseableChars(item['useable_chars']) if 'icon_path' in item: skinItems += '<widget name="cover_%d" position="%d,%d" size="%d,%d" zPosition="8" />' % ( idx, (maxWidth - item['label_size'][0]) / 2, pY, item['label_size'][0], item['label_size'][1]) else: skinItems += '<widget name="text_%d" position="%d,%d" size="%d,%d" font="%s" zPosition="2" />' % ( idx, 10, pY, item['label_size'][0], item['label_size'][1], item['label_font']) pY += dY + item['label_size'][1] skinItems += '<widget name="input_%d" position="%d,%d" size="%d,%d" font="%s" zPosition="2" />' % ( idx, pX, pY, item['input_size'][0], item['input_size'][1], item['input_font']) skinItems += '<widget name="border_%d" position="%d,%d" size="%d,%d" font="%s" zPosition="1" transparent="0" backgroundColor="#331F93B9" />' % ( idx, pX - 5, pY - 5, item['input_size'][0] + 10, item['input_size'][1] + 10, item['input_font']) if 0 == idx: self['marker'] = Cover3() skinItems += '<widget name="marker" zPosition="2" position="10,%d" size="16,16" transparent="1" alphatest="blend" />' % ( pY + (item['input_size'][1] - 16) / 2) skinItems += '<widget name="marker_%d" zPosition="1" position="10,%d" size="16,16" transparent="1" alphatest="blend" />' % ( idx, pY + (item['input_size'][1] - 16) / 2) self['marker_%d' % idx] = Cover3() pY += dY * 2 + item['input_size'][1] if self.withAcceptButton: skinItems += '<widget name="accept_button" position="10,%d" zPosition="2" size="%d,50" valign="center" halign="center" font="Regular;22" foregroundColor="#00FFFFFF" backgroundColor="#320F0F0F" />' % ( pY, maxWidth - 20) pY += dY * 2 + 50 self.skin = """ <screen name="IPTVMultipleInputBox" position="center,center" size="%d,%d" title="%s"> <widget name="key_red" position="10,10" zPosition="2" size="%d,35" valign="center" halign="left" font="Regular;22" transparent="1" foregroundColor="red" /> <widget name="key_ok" position="10,10" zPosition="2" size="%d,35" valign="center" halign="center" font="Regular;22" transparent="1" foregroundColor="white" /> <widget name="key_green" position="10,10" zPosition="2" size="%d,35" valign="center" halign="right" font="Regular;22" transparent="1" foregroundColor="green" /> %s </screen> """ % (maxWidth, pY, params.get('title', _("Input")), maxWidth - 20, maxWidth - 20, maxWidth - 20, skinItems) self["key_green"] = Label(params.get('accep_label', _("Save"))) self["key_ok"] = Label(_("OK")) self["key_red"] = Label(_("Cancel")) if len(self.statusText): self["statustext"] = Label(str(self.statusText)) if self.withAcceptButton: self["accept_button"] = Label( params.get('accep_label', _("Verify"))) self.params = params Screen.__init__(self, session) self.onShown.append(self.onStart) self.onClose.append(self.__onClose) self["actions"] = NumberActionMap( [ "ColorActions", "WizardActions", "InputBoxActions", "InputAsciiActions", "KeyboardInputActions" ], { "gotAsciiCode": self.gotAsciiCode, "green": self.keySave, "ok": self.keyOK, "red": self.keyCancel, "back": self.keyCancel, "left": self.keyLeft, "right": self.keyRight, "up": self.keyUp, "down": self.keyDown, "right": self.keyRight, "home": self.keyHome, "end": self.keyEnd, "deleteForward": self.keyDelete, "deleteBackward": self.keyBackspace, "tab": self.keyTab, "toggleOverwrite": self.keyInsert, "1": self.keyNumberGlobal, "2": self.keyNumberGlobal, "3": self.keyNumberGlobal, "4": self.keyNumberGlobal, "5": self.keyNumberGlobal, "6": self.keyNumberGlobal, "7": self.keyNumberGlobal, "8": self.keyNumberGlobal, "9": self.keyNumberGlobal, "0": self.keyNumberGlobal }, -1) self.idx = 0 self.activeInput = "input_0" self.markerPixmap = [ LoadPixmap(GetIconDir('radio_button_on.png')), LoadPixmap(GetIconDir('radio_button_off.png')) ] self.started = False
class ServiceList(HTMLComponent, GUIComponent): MODE_NORMAL = 0 MODE_FAVOURITES = 1 def __init__(self, session = None): GUIComponent.__init__(self) self.session = session self.picFolder = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/folder.png")) self.picMarker = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/marker.png")) self.picDVB_S = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_s-fs8.png")) self.picDVB_C = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_c-fs8.png")) self.picDVB_T = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_t-fs8.png")) self.picServiceGroup = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_service_group-fs8.png")) self.markedForeground = 0xffffff self.markedBackground = 0xff0000 self.markedForegroundSelected = 0xffffff self.markedBackgroundSelected = 0x800000 colors = TemplatedColors().colors if "ListboxMarkedForeground" in colors: self.markedForeground = colors["ListboxMarkedForeground"] if "ListboxMarkedBackground" in colors: self.markedBackground = colors["ListboxMarkedBackground"] if "ListboxMarkedAndSelectedForeground" in colors: self.markedForegroundSelected = colors["ListboxMarkedAndSelectedForeground"] if "ListboxMarkedAndSelectedBackground" in colors: self.markedBackgroundSelected = colors["ListboxMarkedAndSelectedBackground"] self.serviceNotAvail = 0xbbbbbb self.serviceEventProgressbarColor = None self.serviceEventProgressbarColorSelected = None self.serviceEventProgressbarBackColor = None self.serviceEventProgressbarBackColorSelected = None self.serviceEventProgressbarBorderColor = None self.serviceEventProgressbarBorderColorSelected = None self.serviceDescriptionColor = 0xe7b53f self.serviceDescriptionColorSelected = 0xe7b53f self.recordingColor = 0xff4A3C self.recordingColorSelected = 0xff4A3C self.additionalInfoColor = None self.additionalInfoColorSelected = None self.picServiceEventProgressbar = None self.selectionPixmapStandard = None self.selectionPixmapBig = None self.l = eListboxServiceContent() self.l.setBuildFunc(self.buildOptionEntry, True) self.l.setFont(0, gFont("Regular", 18)) # AdditionalInfoFont self.l.setFont(1, gFont("Regular", 20)) # ServiceNumberFont self.l.setFont(2, gFont("Regular", 22)) # ServiceNameFont self.l.setFont(3, gFont("Regular", 18)) # ServiceInfoFont self.serviceNameFont = gFont("Regular", 22) self.serviceInfoFontHeight = 18 self.additionalInfoFont = gFont("Regular", 18) self.list = [] self.size = 0 self.service_center = eServiceCenter.getInstance() self.numberoffset = 0 self.is_playable_ignore = eServiceReference() self.root = None self.mode = self.MODE_NORMAL self.itemHeight = 28 self.l.setItemHeight(28) self.onSelectionChanged = [ ] self.recordingList = {} self.piconLoader = PiconLoader() if self.session: self.session.nav.RecordTimer.on_state_change.append(self.onTimerEntryStateChange) config.usage.configselection_showrecordings.addNotifier(self.getRecordingList, initial_call = True) config.usage.configselection_bigpicons.addNotifier(self.setItemHeight, initial_call = True) config.usage.configselection_secondlineinfo.addNotifier(self.setItemHeight, initial_call = False) def getRecordingList(self,configElement = None): self.recordingList = {} if config.usage.configselection_showrecordings.value: if NavigationInstance.instance.getRecordings(): for timer in NavigationInstance.instance.RecordTimer.timer_list: if timer.state == TimerEntry.StateRunning and not timer.justplay and hasattr(timer, "Filename"): self.recordingList[str(timer.service_ref)] = 1 def onTimerEntryStateChange(self,timer): if config.usage.configselection_showrecordings.value: if hasattr(timer, "Filename") and not timer.justplay and timer.state == TimerEntry.StateRunning: self.recordingList[str(timer.service_ref)] = 1 else: if self.recordingList.has_key(str(timer.service_ref)): del self.recordingList[str(timer.service_ref)] def setItemHeight(self, configElement = None): if (config.usage.configselection_bigpicons.value or config.usage.configselection_secondlineinfo.value != "0") and self.mode == self.MODE_FAVOURITES: self.l.setItemHeight(60) if self.instance is not None and self.selectionPixmapBig: self.instance.setSelectionPicture(self.selectionPixmapBig) else: self.l.setItemHeight(self.itemHeight) if self.instance is not None and self.selectionPixmapStandard: self.instance.setSelectionPicture(self.selectionPixmapStandard) def paintProgressBar(self, event, xoffset, width, height): percent = 0 progressW = 52 progressH = 8 if event: now = int(time()) percent = 100 * (now - event.getBeginTime()) / event.getDuration() top = int((height - progressH) / 2) if self.picServiceEventProgressbar is None: return(eListboxPythonMultiContent.TYPE_PROGRESS, xoffset, top, progressW, progressH, percent, 1, self.serviceEventProgressbarColor, self.serviceEventProgressbarColorSelected, self.serviceEventProgressbarBackColor, self.serviceEventProgressbarBackColorSelected) else: return(eListboxPythonMultiContent.TYPE_PROGRESS_PIXMAP, xoffset, top, progressW, progressH, percent, self.picServiceEventProgressbar, 1, self.serviceEventProgressbarBorderColor, self.serviceEventProgressbarBorderColorSelected, self.serviceEventProgressbarBackColor, self.serviceEventProgressbarBackColorSelected) def buildOptionEntry(self, service, **args): width = self.l.getItemSize().width() height = self.l.getItemSize().height() selected = args["selected"] res = [ None ] showListNumbers = config.usage.configselection_showlistnumbers.value showPicons = self.mode == self.MODE_FAVOURITES and config.usage.configselection_showpicons.value showServiceName = self.mode == self.MODE_NORMAL or (self.mode == self.MODE_FAVOURITES and config.usage.configselection_showservicename.value) showProgressbar = config.usage.show_event_progress_in_servicelist.value progressbarPosition = config.usage.configselection_progressbarposition.value servicenameWidth = config.usage.configselection_servicenamecolwidth.value columnStyle = config.usage.configselection_columnstyle.value additionalposition = config.usage.configselection_additionaltimedisplayposition.value bigPicons = self.mode == self.MODE_FAVOURITES and config.usage.configselection_bigpicons.value secondlineinfo = config.usage.configselection_secondlineinfo.value # get service information service_info = self.service_center.info(service) isMarker = service.flags & eServiceReference.isMarker isPlayable = not(service.flags & eServiceReference.isDirectory or isMarker) recording = False if config.usage.configselection_showrecordings.value: if self.recordingList.has_key(service.toString()): recording = True else: if isPlayable and len(self.recordingList) and service.flags & eServiceReference.mustDescent: alist = ServiceReference(service).list() while True: aservice = alist.getNext() if not aservice.valid(): break if self.recordingList.has_key(aservice.toString()): recording = True break marked = 0 if self.l.isCurrentMarked() and selected: marked = 2 elif self.l.isMarked(service): if selected: marked = 2 else: marked = 1 if marked == 1: # marked additionalInfoColor = serviceDescriptionColor = forgroundColor = self.markedForeground backgroundColor = self.markedBackground forgroundColorSel = backgroundColorSel = additionalInfoColorSelected = serviceDescriptionColorSelected = None elif marked == 2: # marked and selected additionalInfoColorSelected = serviceDescriptionColorSelected = forgroundColorSel = self.markedForegroundSelected backgroundColorSel = self.markedBackgroundSelected forgroundColor = additionalInfoColor = serviceDescriptionColor = backgroundColor = None else: if recording: forgroundColor = additionalInfoColor = serviceDescriptionColor = self.recordingColor forgroundColorSel = additionalInfoColorSelected = serviceDescriptionColorSelected = self.recordingColorSelected backgroundColor = backgroundColorSel = None else: forgroundColor = forgroundColorSel = backgroundColor = backgroundColorSel = None serviceDescriptionColor = self.serviceDescriptionColor serviceDescriptionColorSelected = self.serviceDescriptionColorSelected additionalInfoColor = self.additionalInfoColor additionalInfoColorSelected = self.additionalInfoColorSelected if (marked == 0 and isPlayable and service_info and self.is_playable_ignore.valid() and not service_info.isPlayable(service, self.is_playable_ignore)): forgroundColor = forgroundColorSel = additionalInfoColor = additionalInfoColorSelected = serviceDescriptionColor = serviceDescriptionColorSelected = self.serviceNotAvail # set windowstyle if marked > 0: res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 0, width , height, 1, RT_HALIGN_RIGHT, "", forgroundColor, forgroundColorSel, backgroundColor, backgroundColorSel)) info = self.service_center.info(service) serviceName = info.getName(service) or "<n/a>" event = info.getEvent(service) index = self.getCurrentIndex() xoffset = 2 pixmap = None drawProgressbar = isPlayable and showProgressbar if service.flags & eServiceReference.isMarker: pixmap = self.picMarker elif service.flags & eServiceReference.isGroup: pixmap = self.picServiceGroup elif service.flags & eServiceReference.isDirectory: pixmap = self.picFolder else: orbpos = service.getUnsignedData(4) >> 16; if orbpos == 0xFFFF: pixmap = self.picDVB_C elif orbpos == 0xEEEE: pixmap = self.picDVB_T else: pixmap = self.picDVB_S if pixmap is not None: pixmap_size = self.picMarker.size() ypos = (height - pixmap_size.height()) / 2 pix_width = pixmap_size.width() res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, xoffset, ypos, pix_width, height, pixmap)) xoffset += pix_width + 8 if self.mode != self.MODE_NORMAL: # servicenumber if not (service.flags & eServiceReference.isMarker) and showListNumbers: markers_before = self.l.getNumMarkersBeforeCurrent() text = "%d" % (self.numberoffset + index + 1 - markers_before) res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, 50 , height, 1, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, text, forgroundColor, forgroundColorSel, backgroundColor, backgroundColorSel)) xoffset += 60 # picons if isPlayable and showPicons: if service.flags & eServiceReference.mustDescent: alist = ServiceReference(service).list() first_in_alternative = alist and alist.getNext() if first_in_alternative: service_str = first_in_alternative.toString() else: service_str = service.toString() else: service_str = service.toString() picon = self.piconLoader.getPicon(service_str) if picon: pixmap_size = picon.size() ypos = (height - pixmap_size.height()) / 2 pix_width = pixmap_size.width() res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, xoffset, ypos, pix_width, height, picon)) if bigPicons: xoffset += 108 else: xoffset += 58 # progressbar between servicenumber and servicename if drawProgressbar and progressbarPosition == "0": res.append(self.paintProgressBar(event, xoffset, width, height)) xoffset += 60 addtimedisplay = "" addtimedisplayWidth = 0 if config.usage.configselection_showadditionaltimedisplay.value != "0" and event and isPlayable: if columnStyle: self.textRenderer.setFont(self.additionalInfoFont) if config.usage.configselection_showadditionaltimedisplay.value == "1": # percent now = int(time()) percent = 100 * (now - event.getBeginTime()) / event.getDuration() addtimedisplay = "%d%%" % percent if columnStyle: self.textRenderer.setText("100%") elif config.usage.configselection_showadditionaltimedisplay.value == "2": # remain now = int(time()) remain = int((event.getBeginTime() + event.getDuration() - now) / 60) addtimedisplay = "+%d min" % remain if columnStyle: self.textRenderer.setText("+%d min" % 9999) elif config.usage.configselection_showadditionaltimedisplay.value == "3": # Remain / duration now = int(time()) remain = int((event.getBeginTime() + event.getDuration() - now) / 60) duration = int(event.getDuration() / 60) addtimedisplay = "+%d/%d min" % (remain, duration) if columnStyle: self.textRenderer.setText("+%d/%d min" % (9999, 9999)) elif config.usage.configselection_showadditionaltimedisplay.value == "4": # elapsed now = int(time()) elapsed = int((now - event.getBeginTime()) / 60) addtimedisplay = "%d min" % elapsed if columnStyle: self.textRenderer.setText("%d min" % 9999) elif config.usage.configselection_showadditionaltimedisplay.value == "5": # elapsed / duration now = int(time()) elapsed = int((now - event.getBeginTime()) / 60) duration = int(event.getDuration() / 60) addtimedisplay = "%d/%d min" % (elapsed, duration) if columnStyle: self.textRenderer.setText("%d/%d min" % (9999, 9999)) elif config.usage.configselection_showadditionaltimedisplay.value == "6": # elapsed / remain / duration now = int(time()) elapsed = int((now - event.getBeginTime()) / 60) remain = int((event.getBeginTime() + event.getDuration() - now) / 60) duration = int(event.getDuration() / 60) addtimedisplay = "%d/+%d/%d min" % (elapsed, remain, duration) if columnStyle: self.textRenderer.setText("%d/+%d/%d min" % (9999, 9999, 9999)) elif config.usage.configselection_showadditionaltimedisplay.value == "7": # begin - end time beginTime = localtime(event.getBeginTime()) endTime = localtime(event.getBeginTime()+event.getDuration()) addtimedisplay = "%02d:%02d - %02d:%02d" % (beginTime[3],beginTime[4],endTime[3],endTime[4]) if columnStyle: self.textRenderer.setText("00:00 - 00:000") if columnStyle: addtimedisplayWidth = self.textRenderer.calculateSize().width() if columnStyle: rwidth = 0 # servicename if (isPlayable and showServiceName) or not isPlayable: if isPlayable: rwidth = servicenameWidth # space for servicename else: rwidth = width - xoffset # space for servicename res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, rwidth , height, 2, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceName, forgroundColor, forgroundColorSel, backgroundColor, backgroundColorSel)) xoffset = xoffset + rwidth + 10 # progressbar between servicename and service description if drawProgressbar and progressbarPosition == "1": res.append(self.paintProgressBar(event, xoffset, width, height)) xoffset += 60 if event and isPlayable: if addtimedisplay != "" and additionalposition == "1": if drawProgressbar and progressbarPosition == "2": rwidth = width - xoffset - addtimedisplayWidth rwidth -= 60 else: rwidth = width - xoffset - addtimedisplayWidth else: rwidth = width-xoffset if drawProgressbar and progressbarPosition == "2": rwidth -= 60 if addtimedisplay != "" and additionalposition == "0": # add time text before service description res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, addtimedisplayWidth, height, 0, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, addtimedisplay, additionalInfoColor, additionalInfoColorSelected, backgroundColor, backgroundColorSel)) addoffset = addtimedisplayWidth + 10 xoffset += addoffset rwidth -= addoffset # service description if secondlineinfo != "0" and self.mode == self.MODE_FAVOURITES: res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, rwidth, self.serviceInfoFontHeight+6, 3, RT_HALIGN_LEFT|RT_VALIGN_CENTER, event.getEventName(), serviceDescriptionColor, serviceDescriptionColorSelected, backgroundColor, backgroundColorSel)) if secondlineinfo == "1": # shortdescription text = event.getShortDescription() else: event_next = eEPGCache.getInstance().lookupEventTime(service, -1, 1) if event_next: beginTime = localtime(event_next.getBeginTime()) endTime = localtime(event_next.getBeginTime()+event_next.getDuration()) text = "%02d:%02d - %02d:%02d %s" % (beginTime[3],beginTime[4],endTime[3],endTime[4], event_next.getEventName()) else: text = "%s: n/a" % _("upcoming event") res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, self.serviceInfoFontHeight+6, rwidth, height - (self.serviceInfoFontHeight+6), 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, text, additionalInfoColor, additionalInfoColorSelected, backgroundColor, backgroundColorSel)) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, rwidth, height, 3, RT_HALIGN_LEFT|RT_VALIGN_CENTER, event.getEventName(), serviceDescriptionColor, serviceDescriptionColorSelected, backgroundColor, backgroundColorSel)) # progressbar after service description if drawProgressbar and progressbarPosition == "2": xoffset = xoffset + rwidth + 5 res.append(self.paintProgressBar(event, xoffset, width, height)) xoffset += 60 elif addtimedisplay != "": xoffset = xoffset + rwidth # add time text at last position if addtimedisplay != "" and additionalposition == "1": res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, width-xoffset , height, 0, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, addtimedisplay, additionalInfoColor, additionalInfoColorSelected, backgroundColor, backgroundColorSel)) else: if event and isPlayable: self.textRenderer.setFont(self.serviceNameFont) self.textRenderer.setText(serviceName) length = self.textRenderer.calculateSize().width() + 10 res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, length , height, 2, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceName, forgroundColor, forgroundColorSel, backgroundColor, backgroundColorSel)) xoffset += length if addtimedisplay != "": if additionalposition == "1": # add time text after service description text = "(%s %s)" % (event.getEventName(), addtimedisplay) else: # add time text before service description text = "(%s %s)" % (addtimedisplay, event.getEventName()) else: text = "(%s)" % (event.getEventName()) if drawProgressbar and progressbarPosition == "2": # progressbar after service description length = width-xoffset - 60 else: length = width-xoffset # service description res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, length , height, 3, RT_HALIGN_LEFT|RT_VALIGN_CENTER, text, serviceDescriptionColor, serviceDescriptionColorSelected, backgroundColor, backgroundColorSel)) if drawProgressbar and progressbarPosition == "2": xoffset += length + 5 res.append(self.paintProgressBar(event, xoffset, width, height)) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, width - xoffset , height, 2, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceName, forgroundColor, forgroundColorSel, backgroundColor, backgroundColorSel)) return res def applySkin(self, desktop, parent): attribs = [ ] for (attrib, value) in self.skinAttributes: if attrib == "foregroundColorMarked": self.markedForeground = parseColor(value) elif attrib == "foregroundColorMarkedSelected": self.markedForegroundSelected = parseColor(value) elif attrib == "backgroundColorMarked": self.markedBackground = parseColor(value) elif attrib == "backgroundColorMarkedSelected": self.markedBackgroundSelected = parseColor(value) elif attrib == "foregroundColorServiceNotAvail": self.serviceNotAvail = parseColor(value) elif attrib == "colorEventProgressbar": self.serviceEventProgressbarColor = parseColor(value) elif attrib == "colorEventProgressbarSelected": self.serviceEventProgressbarColorSelected = parseColor(value) elif attrib == "forgroundColorEventProgressbarBorder": self.serviceEventProgressbarBackColor = parseColor(value) elif attrib == "backgroundColorEventProgressbarBorderSelected": self.serviceEventProgressbarBackColorSelected = parseColor(value) elif attrib == "colorEventProgressbarBorder": self.serviceEventProgressbarBorderColor = parseColor(value) elif attrib == "colorEventProgressbarBorderSelected": self.serviceEventProgressbarBorderColorSelected = parseColor(value) elif attrib == "colorServiceDescription": self.serviceDescriptionColor = parseColor(value) elif attrib == "colorServiceDescriptionSelected": self.serviceDescriptionColorSelected = parseColor(value) elif attrib == "colorRecording": self.recordingColor = parseColor(value) elif attrib == "colorRecordingSelected": self.recordingColorSelected = parseColor(value) elif attrib == "colorAdditionalInfo": self.additionalInfoColor = parseColor(value) elif attrib == "colorAdditionalInfoSelected": self.additionalInfoColorSelected = parseColor(value) elif attrib == "picServiceEventProgressbar": pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, value)) if pic: self.picServiceEventProgressbar = pic elif attrib == "serviceItemHeight": self.itemHeight = int(value) elif attrib == "serviceNameFont": self.l.setFont(2, parseFont(value, ((1,1),(1,1)))) self.serviceNameFont = parseFont(value, ((1,1),(1,1))) elif attrib == "serviceInfoFont": self.l.setFont(3, parseFont(value, ((1,1),(1,1)))) name, size = value.split(';') self.serviceInfoFontHeight = int(size) elif attrib == "serviceNumberFont": self.l.setFont(1, parseFont(value, ((1,1),(1,1)))) elif attrib == "additionalInfoFont": self.l.setFont(0, parseFont(value, ((1,1),(1,1)))) self.additionalInfoFont = parseFont(value, ((1,1),(1,1))) elif attrib == "selectionPixmap": pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, value)) if pic: self.selectionPixmapStandard = pic if not config.usage.configselection_bigpicons.value: self.instance.setSelectionPicture(self.selectionPixmapStandard) elif attrib == "selectionPixmapHigh": pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, value)) if pic: self.selectionPixmapBig = pic if config.usage.configselection_bigpicons.value: self.instance.setSelectionPicture(self.selectionPixmapBig) else: attribs.append((attrib, value)) self.skinAttributes = attribs return GUIComponent.applySkin(self, desktop, parent) def connectSelChanged(self, fnc): if not fnc in self.onSelectionChanged: self.onSelectionChanged.append(fnc) def disconnectSelChanged(self, fnc): if fnc in self.onSelectionChanged: self.onSelectionChanged.remove(fnc) def selectionChanged(self): for x in self.onSelectionChanged: x() def setCurrent(self, ref): self.l.setCurrent(ref) def getCurrent(self): r = eServiceReference() self.l.getCurrent(r) return r def atBegin(self): return self.instance.atBegin() def atEnd(self): return self.instance.atEnd() def moveUp(self): self.instance.moveSelection(self.instance.moveUp) def moveDown(self): self.instance.moveSelection(self.instance.moveDown) def moveToChar(self, char): print "Next char: ", char index = self.l.getNextBeginningWithChar(char) indexup = self.l.getNextBeginningWithChar(char.upper()) if indexup != 0: if (index > indexup or index == 0): index = indexup self.instance.moveSelectionTo(index) print "Moving to character " + str(char) def moveToNextMarker(self): idx = self.l.getNextMarkerPos() self.instance.moveSelectionTo(idx) def moveToPrevMarker(self): idx = self.l.getPrevMarkerPos() self.instance.moveSelectionTo(idx) def moveToIndex(self, index): self.instance.moveSelectionTo(index) def getCurrentIndex(self): return self.instance.getCurrentIndex() GUI_WIDGET = eListbox def postWidgetCreate(self, instance): instance.setWrapAround(True) instance.setContent(self.l) self.selectionChanged_conn = instance.selectionChanged.connect(self.selectionChanged) self.setMode(self.mode) self.textRenderer = eLabel(self.instance) self.textRenderer.resize(eSize(400,0)) self.textRenderer.hide() def preWidgetRemove(self, instance): if self.session: self.session.nav.RecordTimer.on_state_change.remove(self.onTimerEntryStateChange) instance.setContent(None) self.selectionChanged_conn = None config.usage.configselection_showrecordings.removeNotifier(self.getRecordingList) config.usage.configselection_bigpicons.removeNotifier(self.setItemHeight) def getRoot(self): return self.root def getRootServices(self): serviceHandler = eServiceCenter.getInstance() list = serviceHandler.list(self.root) dest = [ ] if list is not None: while 1: s = list.getNext() if s.valid(): dest.append(s.toString()) else: break return dest def setNumberOffset(self, offset): self.numberoffset = offset def setPlayableIgnoreService(self, ref): self.is_playable_ignore = ref def setRoot(self, root, justSet=False): self.root = root self.l.setRoot(root, justSet) if not justSet: self.l.sort() self.selectionChanged() def removeCurrent(self): self.l.removeCurrent() def addService(self, service, beforeCurrent=False): self.l.addService(service, beforeCurrent) def finishFill(self): self.l.FillFinished() self.l.sort() # stuff for multiple marks (edit mode / later multiepg) def clearMarks(self): self.l.initMarked() def isMarked(self, ref): return self.l.isMarked(ref) def addMarked(self, ref): self.l.addMarked(ref) def removeMarked(self, ref): self.l.removeMarked(ref) def getMarked(self): i = self.l i.markedQueryStart() ref = eServiceReference() marked = [ ] while i.markedQueryNext(ref) == 0: marked.append(ref.toString()) ref = eServiceReference() return marked #just for movemode.. only one marked entry.. def setCurrentMarked(self, state): self.l.setCurrentMarked(state) def setMode(self, mode): self.mode = mode self.setItemHeight()
def icon(self): if self.iconstr: from Tools.LoadPixmap import LoadPixmap return LoadPixmap(os.path.join(self.path, self.iconstr)) else: return self._icon
class MovieList(GUIComponent): SORT_ALPHANUMERIC = 1 SORT_RECORDED = 2 SHUFFLE = 3 SORT_ALPHANUMERIC_REVERSE = 4 SORT_RECORDED_REVERSE = 5 SORT_ALPHANUMERIC_FLAT = 6 SORT_ALPHANUMERIC_FLAT_REVERSE = 7 SORT_GROUPWISE = 8 SORT_ALPHA_DATE_OLDEST_FIRST = 9 SORT_ALPHAREV_DATE_NEWEST_FIRST = 10 HIDE_DESCRIPTION = 1 SHOW_DESCRIPTION = 2 def __init__(self, root, sort_type = None, descr_state = None): GUIComponent.__init__(self) self.list = [] self.descr_state = descr_state or self.HIDE_DESCRIPTION self.sort_type = sort_type or self.SORT_GROUPWISE self.firstFileEntry = 0 self.parentDirectory = 0 self.fontName = 'Regular' self.fontSize = 20 self.listHeight = None self.listWidth = None self.pbarShift = 5 self.pbarHeight = 16 self.pbarLargeWidth = 48 self.pbarColour = 2122547 self.pbarColourSeen = 16762653 self.pbarColourRec = 16711709 self.partIconeShift = 5 self.spaceRight = 2 self.spaceIconeText = 2 self.iconsWidth = 22 self.trashShift = 1 self.dirShift = 1 self.dateWidth = 150 self.reloadDelayTimer = None self.l = eListboxPythonMultiContent() self.tags = set() self.root = None self.list = None self._playInBackground = None self._playInForeground = None self._char = '' if root is not None: self.reload(root) self.l.setBuildFunc(self.buildMovieListEntry) self.onSelectionChanged = [] self.iconPart = [] for part in range(5): self.iconPart.append(LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/part_%d_4.png' % part))) self.iconMovieRec = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/part_new.png')) self.iconMoviePlay = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/movie_play.png')) self.iconMoviePlayRec = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/movie_play_rec.png')) self.iconUnwatched = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/part_unwatched.png')) self.iconFolder = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/folder.png')) self.iconTrash = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/trashcan.png')) self.runningTimers = {} self.updateRecordings() self.updatePlayPosCache() return def get_playInBackground(self): return self._playInBackground def set_playInBackground(self, value): if self._playInBackground is not value: index = self.findService(self._playInBackground) if index is not None: self.invalidateItem(index) self.l.invalidateEntry(index) index = self.findService(value) if index is not None: self.invalidateItem(index) self.l.invalidateEntry(index) self._playInBackground = value return playInBackground = property(get_playInBackground, set_playInBackground) def get_playInForeground(self): return self._playInForeground def set_playInForeground(self, value): self._playInForeground = value playInForeground = property(get_playInForeground, set_playInForeground) def updatePlayPosCache(self): from Screens.InfoBarGenerics import updateresumePointCache updateresumePointCache() def updateRecordings(self, timer = None): if timer is not None: if timer.justplay: return result = {} for timer in NavigationInstance.instance.RecordTimer.timer_list: if timer.isRunning() and not timer.justplay: result[os.path.split(timer.Filename)[1] + '.ts'] = timer if self.runningTimers == result: return else: self.runningTimers = result if timer is not None: if self.reloadDelayTimer is not None: self.reloadDelayTimer.stop() self.reloadDelayTimer = eTimer() self.reloadDelayTimer.callback.append(self.reload) self.reloadDelayTimer.start(5000, 1) return def connectSelChanged(self, fnc): if fnc not in self.onSelectionChanged: self.onSelectionChanged.append(fnc) def disconnectSelChanged(self, fnc): if fnc in self.onSelectionChanged: self.onSelectionChanged.remove(fnc) def selectionChanged(self): for x in self.onSelectionChanged: x() def setDescriptionState(self, val): self.descr_state = val def setSortType(self, type): self.sort_type = type def applySkin(self, desktop, parent): def warningWrongSkinParameter(string): print "[MovieList] wrong '%s' skin parameters" % string def font(value): font = skin.parseFont(value, ((1, 1), (1, 1))) self.fontName = font.family self.fontSize = font.pointSize def pbarShift(value): self.pbarShift = int(value) def pbarHeight(value): self.pbarHeight = int(value) def pbarLargeWidth(value): self.pbarLargeWidth = int(value) def pbarColour(value): self.pbarColour = skin.parseColor(value).argb() def pbarColourSeen(value): self.pbarColourSeen = skin.parseColor(value).argb() def pbarColourRec(value): self.pbarColourRec = skin.parseColor(value).argb() def partIconeShift(value): self.partIconeShift = int(value) def spaceIconeText(value): self.spaceIconeText = int(value) def iconsWidth(value): self.iconsWidth = int(value) def trashShift(value): self.trashShift = int(value) def dirShift(value): self.dirShift = int(value) def spaceRight(value): self.spaceRight = int(value) def dateWidth(value): self.dateWidth = int(value) for attrib, value in self.skinAttributes[:]: try: locals().get(attrib)(value) self.skinAttributes.remove((attrib, value)) except: pass rc = GUIComponent.applySkin(self, desktop, parent) self.listHeight = self.instance.size().height() self.listWidth = self.instance.size().width() self.setFontsize() self.setItemsPerPage() return rc def setItemsPerPage(self): if self.listHeight > 0: itemHeight = self.listHeight / config.movielist.itemsperpage.value else: itemHeight = 30 self.itemHeight = itemHeight self.l.setItemHeight(itemHeight) self.instance.resize(eSize(self.listWidth, self.listHeight / itemHeight * itemHeight)) def setFontsize(self): self.l.setFont(0, gFont(self.fontName, self.fontSize + config.movielist.fontsize.value)) self.l.setFont(1, gFont(self.fontName, self.fontSize - 3 + config.movielist.fontsize.value)) def invalidateItem(self, index): x = self.list[index] self.list[index] = (x[0], x[1], x[2], None) return def invalidateCurrentItem(self): self.invalidateItem(self.getCurrentIndex()) def buildMovieListEntry(self, serviceref, info, begin, data): switch = config.usage.show_icons_in_movielist.value width = self.l.getItemSize().width() dateWidth = self.dateWidth iconSize = self.iconsWidth space = self.spaceIconeText r = self.spaceRight pathName = serviceref.getPath() res = [None] if serviceref.flags & eServiceReference.mustDescent: if info is None: txt = '..' else: p = os.path.split(pathName) if not p[1]: p = os.path.split(p[0]) txt = p[1] if txt == '.Trash': res.append(MultiContentEntryPixmapAlphaBlend(pos=(0, self.trashShift), size=(iconSize, self.iconTrash.size().height()), png=self.iconTrash)) res.append(MultiContentEntryText(pos=(iconSize + space, 0), size=(width - 166, self.itemHeight), font=0, flags=RT_HALIGN_LEFT | RT_VALIGN_CENTER, text=_('Deleted items'))) res.append(MultiContentEntryText(pos=(width - 145 - r, 0), size=(145, self.itemHeight), font=1, flags=RT_HALIGN_RIGHT | RT_VALIGN_CENTER, text=_('Trash can'))) return res res.append(MultiContentEntryPixmapAlphaBlend(pos=(0, self.dirShift), size=(iconSize, iconSize), png=self.iconFolder)) res.append(MultiContentEntryText(pos=(iconSize + space, 0), size=(width - 166, self.itemHeight), font=0, flags=RT_HALIGN_LEFT | RT_VALIGN_CENTER, text=txt)) res.append(MultiContentEntryText(pos=(width - 145 - r, 0), size=(145, self.itemHeight), font=1, flags=RT_HALIGN_RIGHT | RT_VALIGN_CENTER, text=_('Directory'))) return res else: if data == -1 or data is None: data = MovieListData() cur_idx = self.l.getCurrentSelectionIndex() x = self.list[cur_idx] data.len = 0 self.list[cur_idx] = (x[0], x[1], x[2], data) data.txt = info.getName(serviceref) if config.movielist.hide_extensions.value: fileName, fileExtension = os.path.splitext(data.txt) if fileExtension in KNOWN_EXTENSIONS: data.txt = fileName data.icon = None data.part = None if os.path.split(pathName)[1] in self.runningTimers: if switch == 'i': if (self.playInBackground or self.playInForeground) and serviceref == (self.playInBackground or self.playInForeground): data.icon = self.iconMoviePlayRec else: data.icon = self.iconMovieRec elif switch in ('p', 's'): data.part = 100 if (self.playInBackground or self.playInForeground) and serviceref == (self.playInBackground or self.playInForeground): data.partcol = self.pbarColourSeen else: data.partcol = self.pbarColourRec elif (self.playInBackground or self.playInForeground) and serviceref == (self.playInBackground or self.playInForeground): data.icon = self.iconMoviePlay else: data.part = moviePlayState(pathName + '.cuts', serviceref, data.len) if switch == 'i': if data.part is not None and data.part > 0: data.icon = self.iconPart[data.part // 25] elif config.usage.movielist_unseen.value: data.icon = self.iconUnwatched elif switch in ('p', 's'): if data.part is not None and data.part > 0: data.partcol = self.pbarColourSeen elif config.usage.movielist_unseen.value: data.part = 100 data.partcol = self.pbarColour len = data.len if len > 0: len = '%d:%02d' % (len / 60, len % 60) else: len = '' if data: pos = (0, self.partIconeShift) if switch == 'i' and hasattr(data, 'icon') and data.icon is not None: res.append(MultiContentEntryPixmapAlphaBlend(pos=pos, size=(iconSize, data.icon.size().height()), png=data.icon)) elif switch in ('p', 's'): if switch == 'p': iconSize = self.pbarLargeWidth if hasattr(data, 'part') and data.part > 0: res.append(MultiContentEntryProgress(pos=(0, self.pbarShift), size=(iconSize, self.pbarHeight), percent=data.part, borderWidth=2, foreColor=data.partcol, foreColorSelected=None, backColor=None, backColorSelected=None)) elif hasattr(data, 'icon') and data.icon is not None: res.append(MultiContentEntryPixmapAlphaBlend(pos=(0, self.pbarShift), size=(iconSize, self.pbarHeight), png=data.icon)) begin_string = '' if begin > 0: begin_string = ' '.join(FuzzyTime(begin, inPast=True)) ih = self.itemHeight res.append(MultiContentEntryText(pos=(iconSize + space, 0), size=(width - iconSize - space - dateWidth - r, ih), font=0, flags=RT_HALIGN_LEFT | RT_VALIGN_CENTER, text=data.txt)) res.append(MultiContentEntryText(pos=(width - dateWidth - r, 0), size=(dateWidth, ih), font=1, flags=RT_HALIGN_RIGHT | RT_VALIGN_CENTER, text=begin_string)) return res def moveToFirstMovie(self): if self.firstFileEntry < len(self.list): self.instance.moveSelectionTo(self.firstFileEntry) else: self.moveToFirst() def moveToParentDirectory(self): if self.parentDirectory < len(self.list): self.instance.moveSelectionTo(self.parentDirectory) else: self.moveToFirst() def moveToLast(self): if self.list: self.instance.moveSelectionTo(len(self.list) - 1) def moveToFirst(self): if self.list: self.instance.moveSelectionTo(0) def moveToIndex(self, index): self.instance.moveSelectionTo(index) def getCurrentIndex(self): return self.instance.getCurrentIndex() def getCurrentEvent(self): l = self.l.getCurrentSelection() return l and l[0] and l[1] and l[1].getEvent(l[0]) def getCurrent(self): l = self.l.getCurrentSelection() return l and l[0] def getItem(self, index): if self.list: if len(self.list) > index: return self.list[index] and self.list[index][0] GUI_WIDGET = eListbox def postWidgetCreate(self, instance): instance.setContent(self.l) instance.selectionChanged.get().append(self.selectionChanged) self.setFontsize() def preWidgetRemove(self, instance): instance.setContent(None) instance.selectionChanged.get().remove(self.selectionChanged) return def reload(self, root = None, filter_tags = None): if self.reloadDelayTimer is not None: self.reloadDelayTimer.stop() self.reloadDelayTimer = None if root is not None: self.load(root, filter_tags) else: self.load(self.root, filter_tags) self.l.setList(self.list) return def removeService(self, service): index = self.findService(service) if index is not None: del self.list[index] self.l.setList(self.list) return def findService(self, service): if service is None: return else: for index, l in enumerate(self.list): if l[0] == service: return index return def __len__(self): return len(self.list) def __getitem__(self, index): return self.list[index] def __iter__(self): return self.list.__iter__() def load(self, root, filter_tags): self.list = [] serviceHandler = eServiceCenter.getInstance() numberOfDirs = 0 reflist = serviceHandler.list(root) if reflist is None: print 'listing of movies failed' return else: realtags = set() autotags = {} rootPath = os.path.normpath(root.getPath()) parent = None if len(rootPath) > 1 and os.path.realpath(rootPath) != os.path.realpath(config.movielist.root.value): parent = os.path.split(os.path.normpath(rootPath))[0] currentfolder = os.path.normpath(rootPath) + '/' if parent and parent not in defaultInhibitDirs and not currentfolder.endswith(config.usage.default_path.value): if not parent.endswith('/'): parent += '/' ref = eServiceReference('2:0:1:0:0:0:0:0:0:0:' + parent) ref.flags = eServiceReference.flagDirectory self.list.append((ref, None, 0, -1)) numberOfDirs += 1 while 1: serviceref = reflist.getNext() if not serviceref.valid(): break if config.ParentalControl.servicepinactive.value and config.ParentalControl.storeservicepin.value != 'never': from Components.ParentalControl import parentalControl if not parentalControl.sessionPinCached and parentalControl.isProtected(serviceref): continue info = serviceHandler.info(serviceref) if info is None: info = justStubInfo begin = info.getInfo(serviceref, iServiceInformation.sTimeCreate) if serviceref.flags & eServiceReference.mustDescent: dirname = info.getName(serviceref) if not dirname.endswith('.AppleDouble/') and not dirname.endswith('.AppleDesktop/') and not dirname.endswith('.AppleDB/') and not dirname.endswith('Network Trash Folder/') and not dirname.endswith('Temporary Items/'): self.list.append((serviceref, info, begin, -1)) numberOfDirs += 1 continue this_tags = info.getInfoString(serviceref, iServiceInformation.sTags).split(' ') name = info.getName(serviceref) if name[:2] == '._': continue if this_tags == ['']: this_tags = name.replace(',', ' ').replace('.', ' ').replace('_', ' ').replace(':', ' ').split() for tag in this_tags: if autotags.has_key(tag): autotags[tag].append(name) else: autotags[tag] = [name] else: realtags.update(this_tags) if filter_tags is not None: this_tags_fullname = [' '.join(this_tags)] this_tags_fullname = set(this_tags_fullname) this_tags = set(this_tags) if not this_tags.issuperset(filter_tags) and not this_tags_fullname.issuperset(filter_tags): continue self.list.append((serviceref, info, begin, -1)) self.firstFileEntry = numberOfDirs self.parentDirectory = 0 self.list.sort(key=self.buildGroupwiseSortkey) if self.sort_type == MovieList.SORT_ALPHANUMERIC: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaNumericSortKey) + sorted(self.list[numberOfDirs:], key=self.buildAlphaNumericSortKey) elif self.sort_type == MovieList.SORT_ALPHANUMERIC_REVERSE: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaNumericSortKey, reverse=True) + sorted(self.list[numberOfDirs:], key=self.buildAlphaNumericSortKey, reverse=True) elif self.sort_type == MovieList.SORT_ALPHANUMERIC_FLAT: self.list.sort(key=self.buildAlphaNumericFlatSortKey) elif self.sort_type == MovieList.SORT_ALPHANUMERIC_FLAT_REVERSE: self.list.sort(key=self.buildAlphaNumericFlatSortKey, reverse=True) elif self.sort_type == MovieList.SORT_RECORDED: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaNumericSortKey) + sorted(self.list[numberOfDirs:], key=self.buildBeginTimeSortKey) elif self.sort_type == MovieList.SORT_RECORDED_REVERSE: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaNumericSortKey, reverse=True) + sorted(self.list[numberOfDirs:], key=self.buildBeginTimeSortKey, reverse=True) elif self.sort_type == MovieList.SHUFFLE: dirlist = self.list[:numberOfDirs] shufflelist = self.list[numberOfDirs:] random.shuffle(shufflelist) self.list = dirlist + shufflelist elif self.sort_type == MovieList.SORT_ALPHA_DATE_OLDEST_FIRST: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaDateSortKey) + sorted(self.list[numberOfDirs:], key=self.buildAlphaDateSortKey) elif self.sort_type == MovieList.SORT_ALPHAREV_DATE_NEWEST_FIRST: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaDateSortKey, reverse=True) + sorted(self.list[numberOfDirs:], key=self.buildAlphaDateSortKey, reverse=True) for x in self.list: if x[1]: tmppath = x[1].getName(x[0])[:-1] if x[1].getName(x[0]).endswith('/') else x[1].getName(x[0]) if tmppath.endswith('.Trash'): self.list.insert(0, self.list.pop(self.list.index(x))) break if self.root and numberOfDirs > 0: rootPath = os.path.normpath(self.root.getPath()) if not rootPath.endswith('/'): rootPath += '/' if rootPath != parent: for index, item in enumerate(self.list): if item[0].flags & eServiceReference.mustDescent: itempath = os.path.normpath(item[0].getPath()) if not itempath.endswith('/'): itempath += '/' if itempath == rootPath: self.parentDirectory = index break self.root = root rautotags = {} for tag, movies in autotags.items(): if len(movies) > 1: movies = tuple(movies) item = rautotags.get(movies, []) if not item: rautotags[movies] = item item.append(tag) self.tags = {} for movies, tags in rautotags.items(): movie = movies[0] tags.sort(key=movie.find) first = movie.find(tags[0]) last = movie.find(tags[-1]) + len(tags[-1]) match = movie start = 0 end = len(movie) for m in movies[1:]: if m[start:end] != match: if not m.startswith(movie[:last]): start = first if not m.endswith(movie[first:]): end = last match = movie[start:end] if m[start:end] != match: match = '' break if match: self.tags[match] = set(tags) else: match = ' '.join(tags) if len(match) > 2 or match in realtags: self.tags[match] = set(tags) for tag in realtags: self.tags[tag] = set([tag]) return def buildAlphaNumericSortKey(self, x): ref = x[0] name = x[1] and x[1].getName(ref) if ref.flags & eServiceReference.mustDescent: return (0, name and name.lower() or '', -x[2]) return (1, name and name.lower() or '', -x[2]) def buildAlphaDateSortKey(self, x): ref = x[0] name = x[1] and x[1].getName(ref) if ref.flags & eServiceReference.mustDescent: return (0, name and name.lower() or '', x[2]) return (1, name and name.lower() or '', x[2]) def buildAlphaNumericFlatSortKey(self, x): ref = x[0] name = x[1] and x[1].getName(ref) if name and ref.flags & eServiceReference.mustDescent: p = os.path.split(name) if not p[1]: p = os.path.split(p[0]) name = p[1] return (1, name and name.lower() or '', -x[2]) def buildBeginTimeSortKey(self, x): ref = x[0] if ref.flags & eServiceReference.mustDescent: try: return (0, x[1] and -os.stat(ref.getPath()).st_mtime) except: return (1, -x[2]) return (1, -x[2]) def buildGroupwiseSortkey(self, x): ref = x[0] if ref.type >= eServiceReference.idUser: return self.buildAlphaNumericSortKey(x) else: return self.buildBeginTimeSortKey(x) def moveTo(self, serviceref): index = self.findService(serviceref) if index is not None: self.instance.moveSelectionTo(index) return True else: return False def moveDown(self): self.instance.moveSelection(self.instance.moveDown) def moveUp(self): self.instance.moveSelection(self.instance.moveUp) def moveToChar(self, char, lbl = None): self._char = char self._lbl = lbl if lbl: lbl.setText(self._char) lbl.visible = True self.moveToCharTimer = eTimer() self.moveToCharTimer.callback.append(self._moveToChrStr) self.moveToCharTimer.start(1000, True) def moveToString(self, char, lbl = None): self._char = self._char + char.upper() self._lbl = lbl if lbl: lbl.setText(self._char) lbl.visible = True self.moveToCharTimer = eTimer() self.moveToCharTimer.callback.append(self._moveToChrStr) self.moveToCharTimer.start(1000, True) def _moveToChrStr(self): currentIndex = self.instance.getCurrentIndex() found = False if currentIndex < len(self.list) - 1: itemsBelow = self.list[currentIndex + 1:] for index, item in enumerate(itemsBelow): ref = item[0] itemName = getShortName(item[1].getName(ref).upper(), ref) if len(self._char) == 1 and itemName.startswith(self._char): found = True self.instance.moveSelectionTo(index + currentIndex + 1) break elif len(self._char) > 1 and itemName.find(self._char) >= 0: found = True self.instance.moveSelectionTo(index + currentIndex + 1) break if found == False and currentIndex > 0: itemsAbove = self.list[1:currentIndex] for index, item in enumerate(itemsAbove): ref = item[0] itemName = getShortName(item[1].getName(ref).upper(), ref) if len(self._char) == 1 and itemName.startswith(self._char): found = True self.instance.moveSelectionTo(index + 1) break elif len(self._char) > 1 and itemName.find(self._char) >= 0: found = True self.instance.moveSelectionTo(index + 1) break self._char = '' if self._lbl: self._lbl.visible = False
class PowerTimerList(GUIComponent, object): # | <Service> <Name of the Timer> | # | <start, end> <state> | def buildTimerEntry(self, timer, processed): screenwidth = getDesktop(0).size().width() timertype = { TIMERTYPE.WAKEUP: _("Wake up"), TIMERTYPE.WAKEUPTOSTANDBY: _("Wake up to standby"), TIMERTYPE.STANDBY: _("Standby"), TIMERTYPE.AUTOSTANDBY: _("Auto standby"), TIMERTYPE.AUTODEEPSTANDBY: _("Auto deep standby"), TIMERTYPE.DEEPSTANDBY: _("Deep standby"), TIMERTYPE.REBOOT: _("Reboot"), TIMERTYPE.RESTART: _("Restart GUI") }[timer.timerType] afterevent = { AFTEREVENT.NONE: _("Nothing"), AFTEREVENT.WAKEUPTOSTANDBY: _("Wake up to standby"), AFTEREVENT.STANDBY: _("Standby"), AFTEREVENT.DEEPSTANDBY: _("Deep standby") }[timer.afterEvent] height = self.l.getItemSize().height() width = self.l.getItemSize().width() res = [ None ] x = width / 2 res.append((eListboxPythonMultiContent.TYPE_TEXT, self.iconWidth + self.iconMargin, 2, width, self.rowSplit, 0, RT_HALIGN_LEFT|RT_VALIGN_BOTTOM, timertype)) if timer.timerType == TIMERTYPE.AUTOSTANDBY or timer.timerType == TIMERTYPE.AUTODEEPSTANDBY: if self.iconRepeat and timer.autosleeprepeat != "once": res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, self.iconMargin / 2, self.rowSplit + (self.itemHeight - self.rowSplit - self.iconHeight) / 2, self.iconWidth, self.iconHeight, self.iconRepeat)) icon = None if not processed: if timer.state == TimerEntry.StateWaiting: state = _("waiting") icon = self.iconWait elif timer.state == TimerEntry.StatePrepared or timer.state == TimerEntry.StateRunning: state = _("running...") icon = self.iconZapped elif timer.state == TimerEntry.StateEnded: state = _("done!") icon = self.iconDone else: state = _("<unknown>") icon = None else: state = _("done!") icon = self.iconDone res.append((eListboxPythonMultiContent.TYPE_TEXT, 148, 26, width-150, self.itemHeight - self.rowSplit, 2, RT_HALIGN_RIGHT|RT_VALIGN_BOTTOM, _("Delay:") + " " + str(timer.autosleepdelay) + "(" + _("mins") + ")")) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, x+24, 2, x-2-24, self.itemHeight - self.rowSplit, 2, RT_HALIGN_RIGHT|RT_VALIGN_BOTTOM, _('At End:') + ' ' + afterevent)) days = ( _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun") ) begin = FuzzyTime(timer.begin) if timer.repeated: repeatedtext = [] flags = timer.repeated for x in (0, 1, 2, 3, 4, 5, 6): if flags & 1 == 1: repeatedtext.append(days[x]) flags >>= 1 if repeatedtext == [_("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun")]: repeatedtext = _('Everyday') elif repeatedtext == [_("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri")]: repeatedtext = _('Weekday') elif repeatedtext == [_("Sat"), _("Sun")]: repeatedtext = _('Weekend') else: repeatedtext = ", ".join(repeatedtext) if self.iconRepeat: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 2, self.rowSplit, 20, 20, self.iconRepeat)) else: repeatedtext = begin[0] # date text = repeatedtext + ((" %s ... %s (%d " + _("mins") + ")") % (begin[1], FuzzyTime(timer.end)[1], (timer.end - timer.begin) / 60)) res.append((eListboxPythonMultiContent.TYPE_TEXT, 148, self.itemHeight - self.rowSplit, width-150, self.rowSplit, 2, RT_HALIGN_RIGHT|RT_VALIGN_BOTTOM, text)) icon = None if not processed: if timer.state == TimerEntry.StateWaiting: state = _("waiting") icon = self.iconWait elif timer.state == TimerEntry.StatePrepared: state = _("about to start") icon = self.iconPrepared elif timer.state == TimerEntry.StateRunning: state = _("running...") icon = self.iconZapped elif timer.state == TimerEntry.StateEnded: state = _("done!") icon = self.iconDone else: state = _("<unknown>") icon = None else: state = _("done!") icon = self.iconDone if timer.disabled: state = _("disabled") icon = self.iconDisabled if timer.failed: state = _("failed") icon = self.iconFailed icon and res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, self.iconMargin / 2, (self.rowSplit - self.iconHeight) / 2, self.iconWidth, self.iconHeight, icon)) res.append((eListboxPythonMultiContent.TYPE_TEXT, self.iconMargin + self.iconWidth, self.rowSplit, 150, height - self.rowSplit, 2, RT_HALIGN_LEFT|RT_VALIGN_BOTTOM, state)) line = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "div-h.png")) res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 0, height-2, width, 2, line)) return res def __init__(self, list): GUIComponent.__init__(self) self.l = eListboxPythonMultiContent() self.l.setBuildFunc(self.buildTimerEntry) self.serviceNameFont = gFont("Regular", 20) self.font = gFont("Regular", 18) self.eventNameFont = gFont("Regular", 18) self.l.setList(list) self.itemHeight = 50 self.rowSplit = 25 self.iconMargin = 4 self.satPosLeft = 160 self.iconWait = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "icons/timer_wait.png")) self.iconWidth = self.iconWait.size().width() self.iconHeight = self.iconWait.size().height() self.iconRecording = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "icons/timer_rec.png")) self.iconPrepared = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "icons/timer_prep.png")) self.iconDone = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "icons/timer_done.png")) self.iconRepeat = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "icons/timer_rep.png")) self.iconZapped = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "icons/timer_zap.png")) self.iconDisabled = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "icons/timer_off.png")) self.iconFailed = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "icons/timer_failed.png")) def applySkin(self, desktop, parent): def itemHeight(value): self.itemHeight = int(value) def setServiceNameFont(value): self.serviceNameFont = parseFont(value, ((1, 1), (1, 1))) def setEventNameFont(value): self.eventNameFont = parseFont(value, ((1, 1), (1, 1))) def setFont(value): self.font = parseFont(value, ((1, 1), (1, 1))) def rowSplit(value): self.rowSplit = int(value) def iconMargin(value): self.iconMargin = int(value) def satPosLeft(value): self.satPosLeft = int(value) for (attrib, value) in list(self.skinAttributes): try: locals().get(attrib)(value) self.skinAttributes.remove((attrib, value)) except: pass self.l.setItemHeight(self.itemHeight) self.l.setFont(0, self.serviceNameFont) self.l.setFont(1, self.font) self.l.setFont(2, self.eventNameFont) return GUIComponent.applySkin(self, desktop, parent) def getCurrent(self): cur = self.l.getCurrentSelection() return cur and cur[0] GUI_WIDGET = eListbox def postWidgetCreate(self, instance): instance.setContent(self.l) self.instance = instance def moveToIndex(self, index): self.instance.moveSelectionTo(index) def getCurrentIndex(self): return self.instance.getCurrentIndex() currentIndex = property(getCurrentIndex, moveToIndex) currentSelection = property(getCurrent) def moveDown(self): self.instance.moveSelection(self.instance.moveDown) def invalidate(self): self.l.invalidate() def entryRemoved(self, idx): self.l.entryRemoved(idx)
class AutoTimerList(MenuList): """Defines a simple Component to show Timer name""" # # | <timername> <timespan> | line 'EventNameFont' # | <timeframe> <days> | line 'DayNameFont' # | <servicename> | line 'ServiceNameFont' # def __init__(self, entries): MenuList.__init__(self, entries, False, content = eListboxPythonMultiContent) self.l.setBuildFunc(self.buildListboxEntry) try: png = resolveFilename(SCOPE_ACTIVE_SKIN, "icons/lock_off.png") except: png = resolveFilename(SCOPE_CURRENT_SKIN, "skin-default/icons/lock_off.png") self.iconDisabled = LoadPixmap(cached=True, path=png) #currently intended that all icons have the same size try: png = resolveFilename(SCOPE_ACTIVE_SKIN, "icons/lock_on.png") except: png = resolveFilename(SCOPE_CURRENT_SKIN, "skin-default/icons/lock_on.png") self.iconEnabled = LoadPixmap(cached=True, path=png) try: png = resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_rec.png") except: png = resolveFilename(SCOPE_CURRENT_SKIN, "skin-default/icons/timer_rec.png") self.iconRecording = LoadPixmap(cached=True, path=png) try: png = resolveFilename(SCOPE_ACTIVE_SKIN, "icons/timer_zap.png") except: png = resolveFilename(SCOPE_CURRENT_SKIN, "skin-default/icons/timer_zap.png") self.iconZapped = LoadPixmap(cached=True, path=png) self.ServiceNameFont = gFont("Regular", 20) self.EventNameFont = gFont("Regular", 20) self.DayNameFont = gFont("Regular", 18) self.itemHeight = 75 self.rowHeight = 24 self.rowSplit1 = 26 self.rowSplit2 = 47 self.statusIconWidth = self.iconEnabled.size().width() self.statusIconHeight = self.iconEnabled.size().height() self.typeIconWidth = self.iconRecording.size().width() self.typeIconHeight = self.iconRecording.size().height() self.iconMargin = 2 def applySkin(self, desktop, parent): def itemHeight(value): self.itemHeight = int(value) def ServiceNameFont(value): self.ServiceNameFont = parseFont(value, ((1,1),(1,1))) def EventNameFont(value): self.EventNameFont = parseFont(value, ((1,1),(1,1))) def DayNameFont(value): self.DayNameFont = parseFont(value, ((1,1),(1,1))) def rowHeight(value): self.rowHeight = int(value) def rowSplit1(value): self.rowSplit1 = int(value) def rowSplit2(value): self.rowSplit2 = int(value) def iconMargin(value): self.iconMargin = int(value) for (attrib, value) in list(self.skinAttributes): try: locals().get(attrib)(value) self.skinAttributes.remove((attrib, value)) except: pass self.l.setItemHeight(self.itemHeight) self.l.setFont(0, self.ServiceNameFont) self.l.setFont(1, self.EventNameFont) self.l.setFont(2, self.DayNameFont) return MenuList.applySkin(self, desktop, parent) def buildListboxEntry(self, timer): if not timer.enabled: icon = self.iconDisabled else: icon = self.iconEnabled if timer.justplay: rectypeicon = self.iconZapped else: rectypeicon = self.iconRecording height = self.l.getItemSize().height() width = self.l.getItemSize().width() iconMargin = self.iconMargin statusIconHeight = self.statusIconHeight statusIconWidth = self.statusIconWidth typeIconHeight = self.typeIconHeight typeIconWidth = self.typeIconWidth rowHeight = self.rowHeight rowSplit1 = self.rowSplit1 rowSplit2 = self.rowSplit2 channel = [] for t in timer.services: channel.append(ServiceReference(t).getServiceName()) if len(channel) >0 : channel = ", ".join(channel) else: channel = _('All channels') res = [ None ] if icon: if skinparms: x, y, w, h = parameters.get("AutotimerEnabledIcon",(iconMargin, 0, statusIconHeight, statusIconWidth)) else: x, y, w, h = (iconMargin, 0, statusIconHeight, statusIconWidth) res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, x, y, w, h, icon)) if rectypeicon: if skinparms: x, y, w, h = parameters.get("AutotimerRecordIcon",(iconMargin+statusIconWidth+iconMargin, 3, statusIconHeight, typeIconWidth)) else: x, y, w, h = (iconMargin+statusIconWidth+iconMargin, 3, statusIconHeight, typeIconWidth) res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, x, y, w, h, rectypeicon)) if timer.hasTimespan(): nowt = time() now = localtime(nowt) begintime = int(mktime((now.tm_year, now.tm_mon, now.tm_mday, timer.timespan[0][0], timer.timespan[0][1], 0, now.tm_wday, now.tm_yday, now.tm_isdst))) endtime = int(mktime((now.tm_year, now.tm_mon, now.tm_mday, timer.timespan[1][0], timer.timespan[1][1], 0, now.tm_wday, now.tm_yday, now.tm_isdst))) timespan = ((" %s ... %s") % (FuzzyTime(begintime)[1], FuzzyTime(endtime)[1])) else: timespan = _(" Any time") res.append((eListboxPythonMultiContent.TYPE_TEXT, float(width)/10*4.5, 2, width-float(width)/10*4.5, rowHeight, 1, RT_HALIGN_RIGHT|RT_VALIGN_BOTTOM, timespan)) if TextBoundary: timespanWidth = getTextBoundarySize(self.instance, self.EventNameFont, self.l.getItemSize(), timespan).width() else: timespanWidth = float(width)/10*2 res.append((eListboxPythonMultiContent.TYPE_TEXT, statusIconWidth+typeIconWidth+iconMargin*3, 2, width-statusIconWidth-typeIconWidth-iconMargin*3- timespanWidth, rowHeight, 1, RT_HALIGN_LEFT|RT_VALIGN_BOTTOM, timer.name)) if timer.hasTimeframe(): begin = strftime("%a, %d %b", localtime(timer.getTimeframeBegin())) end = strftime("%a, %d %b", localtime(timer.getTimeframeEnd())) timeframe = (("%s ... %s") % (begin, end)) res.append((eListboxPythonMultiContent.TYPE_TEXT, iconMargin, rowSplit1, float(width)/10*4.5, rowHeight, 2, RT_HALIGN_LEFT|RT_VALIGN_TOP, timeframe)) if timer.include[3]: total = len(timer.include[3]) count = 0 days = [] while count+1 <= total: day = timer.include[3][count] day = { '0': _("Mon"), '1': _("Tue"), '2': _("Wed"), '3': _("Thur"), '4': _("Fri"), '5': _("Sat"), '6': _("Sun"), "weekend": _("Weekend"), "weekday": _("Weekday") }[day] days.append(day) count += 1 days = ', '.join(days) else: days = _("Everyday") res.append((eListboxPythonMultiContent.TYPE_TEXT, float(width)/10*5.5, rowSplit1, width-float(width)/10*5.5, rowHeight, 2, RT_HALIGN_RIGHT|RT_VALIGN_TOP, days)) res.append((eListboxPythonMultiContent.TYPE_TEXT, iconMargin, rowSplit2, width-(iconMargin*2), rowHeight, 0, RT_HALIGN_LEFT|RT_VALIGN_TOP, channel)) try: devide = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "div-h.png")) except: devide = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/div-h.png")) res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 0, height-2, width, 2, devide)) return res def getCurrent(self): cur = self.l.getCurrentSelection() return cur and cur[0] def moveToEntry(self, entry): if entry is None: return idx = 0 for x in self.list: if x[0] == entry: self.instance.moveSelectionTo(idx) break idx += 1
def buildTimerEntry(self, timer, processed): screenwidth = getDesktop(0).size().width() timertype = { TIMERTYPE.WAKEUP: _("Wake up"), TIMERTYPE.WAKEUPTOSTANDBY: _("Wake up to standby"), TIMERTYPE.STANDBY: _("Standby"), TIMERTYPE.AUTOSTANDBY: _("Auto standby"), TIMERTYPE.AUTODEEPSTANDBY: _("Auto deep standby"), TIMERTYPE.DEEPSTANDBY: _("Deep standby"), TIMERTYPE.REBOOT: _("Reboot"), TIMERTYPE.RESTART: _("Restart GUI") }[timer.timerType] afterevent = { AFTEREVENT.NONE: _("Nothing"), AFTEREVENT.WAKEUPTOSTANDBY: _("Wake up to standby"), AFTEREVENT.STANDBY: _("Standby"), AFTEREVENT.DEEPSTANDBY: _("Deep standby") }[timer.afterEvent] height = self.l.getItemSize().height() width = self.l.getItemSize().width() res = [ None ] x = width / 2 res.append((eListboxPythonMultiContent.TYPE_TEXT, self.iconWidth + self.iconMargin, 2, width, self.rowSplit, 0, RT_HALIGN_LEFT|RT_VALIGN_BOTTOM, timertype)) if timer.timerType == TIMERTYPE.AUTOSTANDBY or timer.timerType == TIMERTYPE.AUTODEEPSTANDBY: if self.iconRepeat and timer.autosleeprepeat != "once": res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, self.iconMargin / 2, self.rowSplit + (self.itemHeight - self.rowSplit - self.iconHeight) / 2, self.iconWidth, self.iconHeight, self.iconRepeat)) icon = None if not processed: if timer.state == TimerEntry.StateWaiting: state = _("waiting") icon = self.iconWait elif timer.state == TimerEntry.StatePrepared or timer.state == TimerEntry.StateRunning: state = _("running...") icon = self.iconZapped elif timer.state == TimerEntry.StateEnded: state = _("done!") icon = self.iconDone else: state = _("<unknown>") icon = None else: state = _("done!") icon = self.iconDone res.append((eListboxPythonMultiContent.TYPE_TEXT, 148, 26, width-150, self.itemHeight - self.rowSplit, 2, RT_HALIGN_RIGHT|RT_VALIGN_BOTTOM, _("Delay:") + " " + str(timer.autosleepdelay) + "(" + _("mins") + ")")) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, x+24, 2, x-2-24, self.itemHeight - self.rowSplit, 2, RT_HALIGN_RIGHT|RT_VALIGN_BOTTOM, _('At End:') + ' ' + afterevent)) days = ( _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun") ) begin = FuzzyTime(timer.begin) if timer.repeated: repeatedtext = [] flags = timer.repeated for x in (0, 1, 2, 3, 4, 5, 6): if flags & 1 == 1: repeatedtext.append(days[x]) flags >>= 1 if repeatedtext == [_("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun")]: repeatedtext = _('Everyday') elif repeatedtext == [_("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri")]: repeatedtext = _('Weekday') elif repeatedtext == [_("Sat"), _("Sun")]: repeatedtext = _('Weekend') else: repeatedtext = ", ".join(repeatedtext) if self.iconRepeat: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 2, self.rowSplit, 20, 20, self.iconRepeat)) else: repeatedtext = begin[0] # date text = repeatedtext + ((" %s ... %s (%d " + _("mins") + ")") % (begin[1], FuzzyTime(timer.end)[1], (timer.end - timer.begin) / 60)) res.append((eListboxPythonMultiContent.TYPE_TEXT, 148, self.itemHeight - self.rowSplit, width-150, self.rowSplit, 2, RT_HALIGN_RIGHT|RT_VALIGN_BOTTOM, text)) icon = None if not processed: if timer.state == TimerEntry.StateWaiting: state = _("waiting") icon = self.iconWait elif timer.state == TimerEntry.StatePrepared: state = _("about to start") icon = self.iconPrepared elif timer.state == TimerEntry.StateRunning: state = _("running...") icon = self.iconZapped elif timer.state == TimerEntry.StateEnded: state = _("done!") icon = self.iconDone else: state = _("<unknown>") icon = None else: state = _("done!") icon = self.iconDone if timer.disabled: state = _("disabled") icon = self.iconDisabled if timer.failed: state = _("failed") icon = self.iconFailed icon and res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, self.iconMargin / 2, (self.rowSplit - self.iconHeight) / 2, self.iconWidth, self.iconHeight, icon)) res.append((eListboxPythonMultiContent.TYPE_TEXT, self.iconMargin + self.iconWidth, self.rowSplit, 150, height - self.rowSplit, 2, RT_HALIGN_LEFT|RT_VALIGN_BOTTOM, state)) line = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "div-h.png")) res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, 0, height-2, width, 2, line)) return res
def updateNetworkList(self): self.list = [] self.network = {} self.mounts = iAutoMount.getMountsList() # reloading mount list for x in self.networklist: if not self.network.has_key(x[2]): self.network[x[2]] = [] self.network[x[2]].append((NetworkDescriptor(name=x[1], description=x[2]), x)) self.network.keys().sort() for x in self.network.keys(): if self.network[x][0][1][3] == '00:00:00:00:00:00': self.device = 'unix' else: self.device = 'windows' if x in self.expanded: networkshares = self.getNetworkShares( x, self.network[x][0][1][1].strip(), self.device) hostentry = self.network[x][0][1] name = hostentry[2] + " ( " + hostentry[1].strip() + " )" if os_path.exists( resolveFilename(SCOPE_ACTIVE_SKIN, "networkbrowser/host.png")): expandedIcon = LoadPixmap(cached=True, path=resolveFilename( SCOPE_ACTIVE_SKIN, "networkbrowser/host.png")) else: expandedIcon = LoadPixmap( cached=True, path=resolveFilename( SCOPE_PLUGINS, "SystemPlugins/NetworkBrowser/icons/host.png")) self.list.append((hostentry, expandedIcon, name, None, None, None, None, None)) for share in networkshares: self.list.append(self.BuildNetworkShareEntry(share)) else: # HOSTLIST - VIEW hostentry = self.network[x][0][1] name = hostentry[2] + " ( " + hostentry[1].strip() + " )" if os_path.exists( resolveFilename(SCOPE_ACTIVE_SKIN, "networkbrowser/host.png")): expandableIcon = LoadPixmap(cached=True, path=resolveFilename( SCOPE_ACTIVE_SKIN, "networkbrowser/host.png")) else: expandableIcon = LoadPixmap( cached=True, path=resolveFilename( SCOPE_PLUGINS, "SystemPlugins/NetworkBrowser/icons/host.png")) self.list.append((hostentry, expandableIcon, name, None, None, None, None, None)) if len(self.list): for entry in self.list: entry[0][2] = "%3s.%3s.%3s.%3s" % tuple(entry[0][2].split(".")) self.list.sort(key=lambda x: x[0][2]) for entry in self.list: entry[0][2] = entry[0][2].replace(" ", "") self["list"].setList(self.list) self["list"].setIndex(self.listindex)
def buildListEntry(self, description, image, optionname): pixmap = LoadPixmap(getPixmapPath(image)) return ((pixmap, description, optionname))
class ServiceList(HTMLComponent, GUIComponent): MODE_NORMAL = 0 MODE_FAVOURITES = 1 KEY_BEGIN_MARGIN = "beginMargin" KEY_END_MARGIN = "endMargin" KEY_PICON_WIDTH = "piconWidth" KEY_PICON_WIDTH_BIG = "piconWidthBig" KEY_PICON_OFFSET = "piconOffset" KEY_PROGRESS_BAR_WIDTH = "progressBarWidth" KEY_PROGRESS_BAR_MARGIN = "progressBarMargin" KEY_PROGRESS_BAR_HEIGHT = "progressBarHeight" KEY_SERVICE_INFO_HEIGHT_ADD ="serviceInfoHeightAdd" KEY_SERVICE_ITEM_HEIGHT = "serviceItemHeight" KEY_SERVICE_ITEM_HEIGHT_LARGE ="serviceItemHeightLarge" KEY_SERVICE_NUMBER_WIDTH = "serviceNumberWidth" KEY_TEXT_OFFSET = "textOffset" def getDesktopWith(self): return getDesktop(0).size().width() def __init__(self, session = None): GUIComponent.__init__(self) self._componentSizes = componentSizes[componentSizes.SERVICE_LIST] Log.i(self._componentSizes) tlf = TemplatedListFonts() upper_service_name_limit = self.getDesktopWith() / 3 config.usage.configselection_servicenamecolwidth.limits = [(100, upper_service_name_limit),] self.session = session self.mode = self.MODE_NORMAL self.picFolder = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/folder.png")) self.picMarker = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/marker.png")) self.picDVB_S = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_s-fs8.png")) self.picDVB_C = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_c-fs8.png")) self.picDVB_T = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_dvb_t-fs8.png")) self.picServiceGroup = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "ico_service_group-fs8.png")) self.markedForeground = 0xffffff self.markedBackground = 0xff0000 self.markedForegroundSelected = 0xffffff self.markedBackgroundSelected = 0x800000 colors = TemplatedColors().colors if "ListboxMarkedForeground" in colors: self.markedForeground = colors["ListboxMarkedForeground"] if "ListboxMarkedBackground" in colors: self.markedBackground = colors["ListboxMarkedBackground"] if "ListboxMarkedAndSelectedForeground" in colors: self.markedForegroundSelected = colors["ListboxMarkedAndSelectedForeground"] if "ListboxMarkedAndSelectedBackground" in colors: self.markedBackgroundSelected = colors["ListboxMarkedAndSelectedBackground"] self.serviceNotAvail = 0xbbbbbb self.serviceEventProgressbarColor = None self.serviceEventProgressbarColorSelected = None self.serviceEventProgressbarBackColor = None self.serviceEventProgressbarBackColorSelected = None self.serviceEventProgressbarBorderColor = None self.serviceEventProgressbarBorderColorSelected = None self.serviceDescriptionColor = 0xe7b53f self.serviceDescriptionColorSelected = 0xe7b53f self.recordingColor = 0xff4A3C self.recordingColorSelected = 0xff4A3C self.additionalInfoColor = None self.additionalInfoColorSelected = None self.picServiceEventProgressbar = None self.selectionPixmapStandard = None self.selectionPixmapBig = None self.l = eListboxServiceContent() self.l.setBuildFunc(self.buildOptionEntry, True) self.l.setFont(0, gFont(tlf.face(TemplatedListFonts.SMALL), tlf.size(TemplatedListFonts.SMALL))) # AdditionalInfoFont self.l.setFont(1, gFont(tlf.face(TemplatedListFonts.MEDIUM), tlf.size(TemplatedListFonts.MEDIUM))) # ServiceNumberFont self.l.setFont(2, gFont(tlf.face(TemplatedListFonts.BIG), tlf.size(TemplatedListFonts.BIG))) # ServiceNameFont self.l.setFont(3, gFont(tlf.face(TemplatedListFonts.SMALL), tlf.size(TemplatedListFonts.SMALL))) # ServiceInfoFont self.serviceNameFont = gFont(tlf.face(TemplatedListFonts.BIG), tlf.size(TemplatedListFonts.BIG)) self.serviceInfoFontHeight = tlf.size(TemplatedListFonts.SMALL) self.serviceInfoHeight = self.serviceInfoFontHeight + self._componentSizes.get(self.KEY_SERVICE_INFO_HEIGHT_ADD, 6) self.additionalInfoFont = gFont(tlf.face(TemplatedListFonts.SMALL), tlf.size(TemplatedListFonts.SMALL)) self.list = [] self.size = 0 self.service_center = eServiceCenter.getInstance() self.numberoffset = 0 self.is_playable_ignore = eServiceReference() self.root = None self.itemHeight = self._componentSizes.get(self.KEY_SERVICE_ITEM_HEIGHT, 28) self.itemHeightHigh = self._componentSizes.get(self.KEY_SERVICE_ITEM_HEIGHT_LARGE, 60) self.l.setItemHeight(self.itemHeight) self.onSelectionChanged = [ ] self.recordingList = {} self.piconLoader = PiconLoader() if self.session: self.session.nav.RecordTimer.on_state_change.append(self.onTimerEntryStateChange) config.usage.configselection_showrecordings.addNotifier(self.getRecordingList, initial_call = True) config.usage.configselection_bigpicons.addNotifier(self.setItemHeight, initial_call = True) config.usage.configselection_secondlineinfo.addNotifier(self.setItemHeight, initial_call = False) self._reloadTimer = eTimer() self.__reloadTimerConn = self._reloadTimer.timeout.connect(self._reload) def onShow(self): GUIComponent.onShow(self) self._resetTimer() def onHide(self): GUIComponent.onHide(self) self._reloadTimer.stop() def _reload(self): self.l.refresh() self._resetTimer() def _resetTimer(self): secs = 60 - datetime.now().second #next full minute self._reloadTimer.startLongTimer(secs) def getRecordingList(self,configElement = None): self.recordingList = {} if config.usage.configselection_showrecordings.value: if NavigationInstance.instance.getRecordings(): for timer in NavigationInstance.instance.RecordTimer.timer_list: if timer.state == TimerEntry.StateRunning and not timer.justplay and hasattr(timer, "Filename"): self.recordingList[str(timer.service_ref)] = 1 def onTimerEntryStateChange(self,timer): if config.usage.configselection_showrecordings.value: if hasattr(timer, "Filename") and not timer.justplay and timer.state == TimerEntry.StateRunning: self.recordingList[str(timer.service_ref)] = 1 else: if self.recordingList.has_key(str(timer.service_ref)): del self.recordingList[str(timer.service_ref)] def setItemHeight(self, configElement = None): if (config.usage.configselection_bigpicons.value or config.usage.configselection_secondlineinfo.value != "0") and self.mode == self.MODE_FAVOURITES: self.l.setItemHeight(self.itemHeightHigh) if self.instance is not None and self.selectionPixmapBig: self.instance.setSelectionPicture(self.selectionPixmapBig) else: self.l.setItemHeight(self.itemHeight) if self.instance is not None and self.selectionPixmapStandard: self.instance.setSelectionPicture(self.selectionPixmapStandard) def _buildOptionEntryProgressBar(self, event, xoffset, width, height): percent = 0 progressW = self._progressBarWidth() progressH = self._componentSizes.get(self.KEY_PROGRESS_BAR_HEIGHT, 8) if event and event.getDuration(): now = int(time()) percent = 100 * (now - event.getBeginTime()) / event.getDuration() top = int((height - progressH) / 2) if self.picServiceEventProgressbar is None: return(eListboxPythonMultiContent.TYPE_PROGRESS, xoffset, top, progressW, progressH, percent, 1, self.serviceEventProgressbarColor, self.serviceEventProgressbarColorSelected, self.serviceEventProgressbarBackColor, self.serviceEventProgressbarBackColorSelected) else: return(eListboxPythonMultiContent.TYPE_PROGRESS_PIXMAP, xoffset, top, progressW, progressH, percent, self.picServiceEventProgressbar, 1, self.serviceEventProgressbarBorderColor, self.serviceEventProgressbarBorderColorSelected, self.serviceEventProgressbarBackColor, self.serviceEventProgressbarBackColorSelected) def _progressBarWidth(self, withOffset=False, withProgressBarSize=True): width = 0 if withProgressBarSize: width += self._componentSizes.get(self.KEY_PROGRESS_BAR_WIDTH, 52) if withOffset: width += self._componentSizes.get(self.KEY_PROGRESS_BAR_MARGIN, 8) return width def _calcTextWidth(self, text, font=None, size=None): if size: self.textRenderer.resize(size) if font: self.textRenderer.setFont(font) self.textRenderer.setText(text) return self.textRenderer.calculateSize().width() def _buildOptionEntryServicePixmap(self, service): pixmap = None if service.flags & eServiceReference.isMarker: pixmap = self.picMarker elif service.flags & eServiceReference.isGroup: pixmap = self.picServiceGroup elif service.flags & eServiceReference.isDirectory: pixmap = self.picFolder else: orbpos = service.getUnsignedData(4) >> 16; if orbpos == 0xFFFF: pixmap = self.picDVB_C elif orbpos == 0xEEEE: pixmap = self.picDVB_T else: pixmap = self.picDVB_S return pixmap def _buildOptionEntryAddTimeDisplay(self, event, isPlayable, columnStyle): addtimedisplay = "" addtimedisplayWidth = 0 if not ( config.usage.configselection_showadditionaltimedisplay.value != "0" and event and isPlayable ): return addtimedisplay, addtimedisplayWidth textTpl = "" maxTimeValue = 9999 if config.usage.configselection_showadditionaltimedisplay.value == "1": # percent now = int(time()) percent = 100 * (now - event.getBeginTime()) / event.getDuration() addtimedisplay = "%d%%" % percent textTpl = "100%" elif config.usage.configselection_showadditionaltimedisplay.value == "2": # remain now = int(time()) remain = int((event.getBeginTime() + event.getDuration() - now) / 60) addtimedisplay = "+%d min" %(remain,) textTpl = "+%d min" %(maxTimeValue,) elif config.usage.configselection_showadditionaltimedisplay.value == "3": # Remain / duration now = int(time()) remain = int((event.getBeginTime() + event.getDuration() - now) / 60) duration = int(event.getDuration() / 60) addtimedisplay = "+%d/%d min" % (remain, duration) textTpl = "+%d/%d min" % (maxTimeValue, maxTimeValue) elif config.usage.configselection_showadditionaltimedisplay.value == "4": # elapsed now = int(time()) elapsed = int((now - event.getBeginTime()) / 60) addtimedisplay = "%d min" % (elapsed,) textTpl = "%d min" % (maxTimeValue,) elif config.usage.configselection_showadditionaltimedisplay.value == "5": # elapsed / duration now = int(time()) elapsed = int((now - event.getBeginTime()) / 60) duration = int(event.getDuration() / 60) addtimedisplay = "%d/%d min" % (elapsed, duration) textTpl = "%d/%d min" % (maxTimeValue, maxTimeValue) elif config.usage.configselection_showadditionaltimedisplay.value == "6": # elapsed / remain / duration now = int(time()) elapsed = int((now - event.getBeginTime()) / 60) remain = int((event.getBeginTime() + event.getDuration() - now) / 60) duration = int(event.getDuration() / 60) addtimedisplay = "%d/+%d/%d min" % (elapsed, remain, duration) textTpl = "%d/+%d/%d mwidthin" % (maxTimeValue, maxTimeValue, maxTimeValue) elif config.usage.configselection_showadditionaltimedisplay.value == "7": # begin - end time beginTime = localtime(event.getBeginTime()) endTime = localtime(event.getBeginTime()+event.getDuration()) addtimedisplay = "%02d:%02d - %02d:%02d" % (beginTime[3],beginTime[4],endTime[3],endTime[4]) textTpl = "00:00 - 00:000" if columnStyle: addtimedisplayWidth = self._calcTextWidth(textTpl, font=self.additionalInfoFont, size=eSize(self.getDesktopWith() / 3, 0)) return addtimedisplay, addtimedisplayWidth def _buildOptionEntryServicePicon(self, service): if service.flags & eServiceReference.mustDescent: alist = ServiceReference(service).list() first_in_alternative = alist and alist.getNext() if first_in_alternative: service_str = first_in_alternative.toString() else: service_str = service.toString() else: service_str = service.toString() return self.piconLoader.getPicon(service_str) def _checkHasRecording(self, service, isPlayable): if not config.usage.configselection_showrecordings.value: return False if self.recordingList.has_key(service.toString()): return True if isPlayable and len(self.recordingList) and service.flags & eServiceReference.mustDescent: alist = ServiceReference(service).list() while True: aservice = alist.getNext() if not aservice.valid(): break if self.recordingList.has_key(aservice.toString()): return True return False def buildOptionEntry(self, service, **args): width = self.l.getItemSize().width() width -= self._componentSizes.get(self.KEY_END_MARGIN, 5) height = self.l.getItemSize().height() selected = args["selected"] res = [ None ] showListNumbers = config.usage.configselection_showlistnumbers.value showPicons = self.mode == self.MODE_FAVOURITES and config.usage.configselection_showpicons.value showServiceName = self.mode == self.MODE_NORMAL or (self.mode == self.MODE_FAVOURITES and config.usage.configselection_showservicename.value) showProgressbar = config.usage.show_event_progress_in_servicelist.value progressbarPosition = config.usage.configselection_progressbarposition.value servicenameWidth = config.usage.configselection_servicenamecolwidth.value columnStyle = config.usage.configselection_columnstyle.value additionalposition = config.usage.configselection_additionaltimedisplayposition.value bigPicons = self.mode == self.MODE_FAVOURITES and config.usage.configselection_bigpicons.value secondlineinfo = config.usage.configselection_secondlineinfo.value # get service information service_info = self.service_center.info(service) isMarker = service.flags & eServiceReference.isMarker isPlayable = not(service.flags & eServiceReference.isDirectory or isMarker) recording = self._checkHasRecording(service, isPlayable) marked = 0 if self.l.isCurrentMarked() and selected: marked = 2 elif self.l.isMarked(service): if selected: marked = 2 else: marked = 1 if marked == 1: # marked additionalInfoColor = serviceDescriptionColor = forgroundColor = self.markedForeground backgroundColor = self.markedBackground forgroundColorSel = backgroundColorSel = additionalInfoColorSelected = serviceDescriptionColorSelected = None elif marked == 2: # marked and selected additionalInfoColorSelected = serviceDescriptionColorSelected = forgroundColorSel = self.markedForegroundSelected backgroundColorSel = self.markedBackgroundSelected forgroundColor = additionalInfoColor = serviceDescriptionColor = backgroundColor = None else: if recording: forgroundColor = additionalInfoColor = serviceDescriptionColor = self.recordingColor forgroundColorSel = additionalInfoColorSelected = serviceDescriptionColorSelected = self.recordingColorSelected backgroundColor = backgroundColorSel = None else: forgroundColor = forgroundColorSel = backgroundColor = backgroundColorSel = None serviceDescriptionColor = self.serviceDescriptionColor serviceDescriptionColorSelected = self.serviceDescriptionColorSelected additionalInfoColor = self.additionalInfoColor additionalInfoColorSelected = self.additionalInfoColorSelected if (marked == 0 and isPlayable and service_info and not service_info.isPlayable(service, self.is_playable_ignore)): forgroundColor = forgroundColorSel = additionalInfoColor = additionalInfoColorSelected = serviceDescriptionColor = serviceDescriptionColorSelected = self.serviceNotAvail # set windowstyle if marked > 0: res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 0, width , height, 1, RT_HALIGN_RIGHT, "", forgroundColor, forgroundColorSel, backgroundColor, backgroundColorSel)) info = self.service_center.info(service) serviceName = info and info.getName(service) or "<n/a>" event = info and info.getEvent(service) index = self.getCurrentIndex() xoffset = self._componentSizes.get(self.KEY_BEGIN_MARGIN, 5) pixmap = self._buildOptionEntryServicePixmap(service) drawProgressbar = isPlayable and showProgressbar progressBarWidth = self._progressBarWidth(withOffset=True) textOffset = self._componentSizes.get(self.KEY_TEXT_OFFSET, 10) if pixmap is not None: pixmap_size = self.picMarker.size() pix_width = pixmap_size.width() pix_height = pixmap_size.height() ypos = (height - pix_height) / 2 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, xoffset, ypos, pix_width, pix_height, pixmap)) xoffset += pix_width + self._componentSizes.get(self.KEY_PICON_OFFSET, 8) if self.mode != self.MODE_NORMAL: # servicenumber if not (service.flags & eServiceReference.isMarker) and showListNumbers: markers_before = self.l.getNumMarkersBeforeCurrent() text = "%d" % (self.numberoffset + index + 1 - markers_before) nameWidth = self._componentSizes.get(self.KEY_SERVICE_NUMBER_WIDTH, 50) res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, nameWidth , height, 1, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, text, forgroundColor, forgroundColorSel, backgroundColor, backgroundColorSel)) xoffset += nameWidth + textOffset # picons if isPlayable and showPicons: picon = self._buildOptionEntryServicePicon(service) if bigPicons: pix_width = self._componentSizes.get(self.KEY_PICON_WIDTH_BIG, 108) else: pix_width = self._componentSizes.get(self.KEY_PICON_WIDTH, 58) if picon: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHABLEND, xoffset, 0, pix_width, height, picon)) xoffset += pix_width xoffset += self._componentSizes.get(self.KEY_PICON_OFFSET, 8) # progressbar between servicenumber and servicename if drawProgressbar and progressbarPosition == "0": res.append(self._buildOptionEntryProgressBar(event, xoffset, width, height)) xoffset += progressBarWidth addtimedisplay, addtimedisplayWidth = self._buildOptionEntryAddTimeDisplay(event, isPlayable, columnStyle) if columnStyle: rwidth = 0 # servicename if (isPlayable and showServiceName) or not isPlayable: if isPlayable: rwidth = servicenameWidth # space for servicename else: rwidth = width - xoffset # space for servicename res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, rwidth , height, 2, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceName, forgroundColor, forgroundColorSel, backgroundColor, backgroundColorSel)) xoffset += rwidth + textOffset # progressbar between servicename and service description if drawProgressbar and progressbarPosition == "1": res.append(self._buildOptionEntryProgressBar(event, xoffset, width, height)) xoffset += progressBarWidth if event and isPlayable: rwidth = width - xoffset if drawProgressbar and progressbarPosition == "2": rwidth -= self._progressBarWidth(withOffset=True, withProgressBarSize=False) rwidth -= self._progressBarWidth(withOffset=True, withProgressBarSize=True) if addtimedisplay != "" : if additionalposition == "0": # add time text before service description res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, addtimedisplayWidth, height, 0, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, addtimedisplay, additionalInfoColor, additionalInfoColorSelected, backgroundColor, backgroundColorSel)) addoffset = addtimedisplayWidth + textOffset xoffset += addoffset rwidth -= addoffset elif additionalposition == "1": rwidth -= addtimedisplayWidth + textOffset # service description if secondlineinfo != "0" and self.mode == self.MODE_FAVOURITES: res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, rwidth, self.serviceInfoHeight, 3, RT_HALIGN_LEFT|RT_VALIGN_CENTER, event.getEventName(), serviceDescriptionColor, serviceDescriptionColorSelected, backgroundColor, backgroundColorSel)) if secondlineinfo == "1": # shortdescription text = event.getShortDescription() else: event_next = eEPGCache.getInstance().lookupEventTime(service, -1, 1) if event_next: beginTime = localtime(event_next.getBeginTime()) endTime = localtime(event_next.getBeginTime()+event_next.getDuration()) text = "%02d:%02d - %02d:%02d %s" % (beginTime[3],beginTime[4],endTime[3],endTime[4], event_next.getEventName()) else: text = "%s: n/a" % _("upcoming event") res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, self.serviceInfoHeight, rwidth, height - self.serviceInfoHeight, 0, RT_HALIGN_LEFT|RT_VALIGN_CENTER, text, additionalInfoColor, additionalInfoColorSelected, backgroundColor, backgroundColorSel)) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, rwidth, height, 3, RT_HALIGN_LEFT|RT_VALIGN_CENTER, event.getEventName(), serviceDescriptionColor, serviceDescriptionColorSelected, backgroundColor, backgroundColorSel)) # progressbar after service description xoffset += rwidth if drawProgressbar and progressbarPosition == "2": xoffset += self._progressBarWidth(withOffset=True, withProgressBarSize=False) res.append(self._buildOptionEntryProgressBar(event, xoffset, width, height)) xoffset += progressBarWidth # add time text at last position if addtimedisplay != "" and additionalposition == "1": xoffset += textOffset res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, addtimedisplayWidth , height, 0, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, addtimedisplay, additionalInfoColor, additionalInfoColorSelected, backgroundColor, backgroundColorSel)) else: if event and isPlayable: maxLength = width - xoffset if drawProgressbar and progressbarPosition == "2": # progressbar after service description maxLength -= progressBarWidth length = self._calcTextWidth(serviceName, font=self.serviceNameFont, size=eSize(maxLength,0)) + textOffset res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, length , height, 2, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceName, forgroundColor, forgroundColorSel, backgroundColor, backgroundColorSel)) xoffset += length if addtimedisplay != "": if additionalposition == "1": # add time text after service description text = "(%s %s)" % (event.getEventName(), addtimedisplay) else: # add time text before service description text = "(%s %s)" % (addtimedisplay, event.getEventName()) else: text = "(%s)" % (event.getEventName()) length = width - xoffset if drawProgressbar and progressbarPosition == "2": # progressbar after service description length -= progressBarWidth # service description res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, length , height, 3, RT_HALIGN_LEFT|RT_VALIGN_CENTER, text, serviceDescriptionColor, serviceDescriptionColorSelected, backgroundColor, backgroundColorSel)) if drawProgressbar and progressbarPosition == "2": xoffset += length + textOffset / 2 res.append(self._buildOptionEntryProgressBar(event, xoffset, width, height)) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, xoffset, 0, width - xoffset , height, 2, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceName, forgroundColor, forgroundColorSel, backgroundColor, backgroundColorSel)) return res def applySkin(self, desktop, parent): attribs = [ ] for (attrib, value) in self.skinAttributes: if attrib == "foregroundColorMarked": self.markedForeground = parseColor(value) elif attrib == "foregroundColorMarkedSelected": self.markedForegroundSelected = parseColor(value) elif attrib == "backgroundColorMarked": self.markedBackground = parseColor(value) elif attrib == "backgroundColorMarkedSelected": self.markedBackgroundSelected = parseColor(value) elif attrib == "foregroundColorServiceNotAvail": self.serviceNotAvail = parseColor(value) elif attrib == "colorEventProgressbar": self.serviceEventProgressbarColor = parseColor(value) elif attrib == "colorEventProgressbarSelected": self.serviceEventProgressbarColorSelected = parseColor(value) elif attrib == "forgroundColorEventProgressbarBorder": self.serviceEventProgressbarBackColor = parseColor(value) elif attrib == "backgroundColorEventProgressbarBorderSelected": self.serviceEventProgressbarBackColorSelected = parseColor(value) elif attrib == "colorEventProgressbarBorder": self.serviceEventProgressbarBorderColor = parseColor(value) elif attrib == "colorEventProgressbarBorderSelected": self.serviceEventProgressbarBorderColorSelected = parseColor(value) elif attrib == "colorServiceDescription": self.serviceDescriptionColor = parseColor(value) elif attrib == "colorServiceDescriptionSelected": self.serviceDescriptionColorSelected = parseColor(value) elif attrib == "colorRecording": self.recordingColor = parseColor(value) elif attrib == "colorRecordingSelected": self.recordingColorSelected = parseColor(value) elif attrib == "colorAdditionalInfo": self.additionalInfoColor = parseColor(value) elif attrib == "colorAdditionalInfoSelected": self.additionalInfoColorSelected = parseColor(value) elif attrib == "picServiceEventProgressbar": pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, value)) if pic: self.picServiceEventProgressbar = pic elif attrib == "serviceItemHeight": self.itemHeight = int(value) elif attrib == "serviceItemHeightHigh": self.itemHeightHigh = int(value) elif attrib == "serviceNameFont": self.l.setFont(2, parseFont(value, ((1,1),(1,1)))) self.serviceNameFont = parseFont(value, ((1,1),(1,1))) elif attrib == "serviceInfoFont": self.l.setFont(3, parseFont(value, ((1,1),(1,1)))) name, size = value.split(';') self.serviceInfoFontHeight = int(size) elif attrib == "serviceNumberFont": self.l.setFont(1, parseFont(value, ((1,1),(1,1)))) elif attrib == "additionalInfoFont": self.l.setFont(0, parseFont(value, ((1,1),(1,1)))) self.additionalInfoFont = parseFont(value, ((1,1),(1,1))) elif attrib == "selectionPixmap": pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, value)) if pic: self.selectionPixmapStandard = pic if not config.usage.configselection_bigpicons.value: self.instance.setSelectionPicture(self.selectionPixmapStandard) elif attrib == "selectionPixmapHigh": pic = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, value)) if pic: self.selectionPixmapBig = pic if config.usage.configselection_bigpicons.value: self.instance.setSelectionPicture(self.selectionPixmapBig) else: attribs.append((attrib, value)) self.skinAttributes = attribs return GUIComponent.applySkin(self, desktop, parent) def connectSelChanged(self, fnc): if not fnc in self.onSelectionChanged: self.onSelectionChanged.append(fnc) def disconnectSelChanged(self, fnc): if fnc in self.onSelectionChanged: self.onSelectionChanged.remove(fnc) def selectionChanged(self): for x in self.onSelectionChanged: x() def setCurrent(self, ref): self.l.setCurrent(ref) def getCurrent(self): r = eServiceReference() self.l.getCurrent(r) return r def atBegin(self): return self.instance.atBegin() def atEnd(self): return self.instance.atEnd() def moveUp(self): self.instance.moveSelection(self.instance.moveUp) def moveDown(self): self.instance.moveSelection(self.instance.moveDown) def moveToChar(self, char): Log.d("Next char: %s" %(char,)) index = self.l.getNextBeginningWithChar(char) indexup = self.l.getNextBeginningWithChar(char.upper()) if indexup != 0: if (index > indexup or index == 0): index = indexup self.instance.moveSelectionTo(index) Log.i("Moving to character %s" %(char,)) def moveToNextMarker(self): idx = self.l.getNextMarkerPos() self.instance.moveSelectionTo(idx) def moveToPrevMarker(self): idx = self.l.getPrevMarkerPos() self.instance.moveSelectionTo(idx) def moveToIndex(self, index): self.instance.moveSelectionTo(index) def getCurrentIndex(self): return self.instance.getCurrentIndex() GUI_WIDGET = eListbox def postWidgetCreate(self, instance): instance.setWrapAround(True) instance.setContent(self.l) self.selectionChanged_conn = instance.selectionChanged.connect(self.selectionChanged) self.setMode(self.mode) self.textRenderer = eLabel(self.instance) self.textRenderer.resize(eSize(self.getDesktopWith() / 3, 0)) self.textRenderer.hide() def preWidgetRemove(self, instance): if self.session: self.session.nav.RecordTimer.on_state_change.remove(self.onTimerEntryStateChange) instance.setContent(None) self.selectionChanged_conn = None config.usage.configselection_showrecordings.removeNotifier(self.getRecordingList) config.usage.configselection_bigpicons.removeNotifier(self.setItemHeight) config.usage.configselection_secondlineinfo.removeNotifier(self.setItemHeight) self.piconLoader.finish() def getRoot(self): return self.root def getRootServices(self): serviceHandler = eServiceCenter.getInstance() list = serviceHandler.list(self.root) dest = [ ] if list is not None: while 1: s = list.getNext() if s.valid(): dest.append(s.toString()) else: break return dest def setNumberOffset(self, offset): self.numberoffset = offset def setPlayableIgnoreService(self, ref): self.is_playable_ignore = ref def setRoot(self, root, justSet=False): self.root = root self.l.setRoot(root, justSet) if not justSet: self.l.sort() self.selectionChanged() def removeCurrent(self): self.l.removeCurrent() def addService(self, service, beforeCurrent=False): self.l.addService(service, beforeCurrent) def finishFill(self): self.l.FillFinished() self.l.sort() # stuff for multiple marks (edit mode / later multiepg) def clearMarks(self): self.l.initMarked() def isMarked(self, ref): return self.l.isMarked(ref) def addMarked(self, ref): self.l.addMarked(ref) def removeMarked(self, ref): self.l.removeMarked(ref) def getMarked(self): i = self.l i.markedQueryStart() ref = eServiceReference() marked = [ ] while i.markedQueryNext(ref) == 0: marked.append(ref.toString()) ref = eServiceReference() return marked #just for movemode.. only one marked entry.. def setCurrentMarked(self, state): self.l.setCurrentMarked(state) def setMode(self, mode): self.mode = mode self.setItemHeight()
def updateList(self): list = [] expandableIcon = LoadPixmap( resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/expandable-plugins.png')) expandedIcon = LoadPixmap( resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/expanded-plugins.png')) verticallineIcon = LoadPixmap( resolveFilename(SCOPE_ACTIVE_SKIN, 'icons/verticalline-plugins.png')) self.plugins = {} if self.type == self.UPDATE: self.list = list self['list'].l.setList(list) return else: for x in self.pluginlist: split = x[3].split('-', 1) if x[0][0:14] == 'kernel-module-': split[0] = 'kernel modules' elif x[0][0:15] == 'enigma2-locale-': split[0] = 'languages' if not self.plugins.has_key(split[0]): self.plugins[split[0]] = [] if split[0] == 'kernel modules': self.plugins[split[0]].append( (PluginDescriptor(name=x[0], description=x[2], icon=verticallineIcon), x[0][14:], x[1])) elif split[0] == 'languages': for t in self.LanguageList: if len(x[2]) > 2: tmpT = t[0].lower() tmpT = tmpT.replace('_', '-') x[2] = x[2].replace(' ', '-') if tmpT == x[2]: countryIcon = LoadPixmap( resolveFilename( SCOPE_ACTIVE_SKIN, 'countries/' + t[0] + '.png')) if countryIcon is None: countryIcon = LoadPixmap( resolveFilename( SCOPE_ACTIVE_SKIN, 'countries/missing.png')) self.plugins[split[0]].append( (PluginDescriptor(name=x[0], description=x[2], icon=countryIcon), t[1], x[1])) break elif t[0][:2] == x[2] and t[0][3:] != 'GB': countryIcon = LoadPixmap( resolveFilename(SCOPE_ACTIVE_SKIN, 'countries/' + t[0] + '.png')) if countryIcon is None: countryIcon = LoadPixmap( resolveFilename(SCOPE_ACTIVE_SKIN, 'countries/missing.png')) self.plugins[split[0]].append( (PluginDescriptor(name=x[0], description=x[2], icon=countryIcon), t[1], x[1])) break else: if len(split) < 2: continue self.plugins[split[0]].append( (PluginDescriptor(name=x[3], description=x[2], icon=verticallineIcon), split[1], x[1])) temp = self.plugins.keys() for x in temp: if x in self.expanded: list.append( PluginCategoryComponent(x, expandedIcon, self.listWidth)) list.extend([ PluginDownloadComponent(plugin[0], plugin[1], plugin[2], self.listWidth) for plugin in self.plugins[x] ]) else: list.append( PluginCategoryComponent(x, expandableIcon, self.listWidth)) self.list = list self['list'].l.setList(list) self['text'] = Label(_('Downloading plugin information complete.')) return
def updateList(self): self.list = [] mypath = DeliteGetSkinPath() rc = system("df -h > /tmp/syinfo.tmp") mypixmap = mypath + "icons/icon_home_BH.png" png = LoadPixmap(mypixmap) name = "Black Hole" title = MultiContentEntryText(pos=(120, 30), size=(480, 50), font=0, text=name) png = MultiContentEntryPixmapAlphaTest(pos=(0, 3), size=(100, 100), png=png) self.list.append([name, title, png]) mypixmap = mypath + "icons/icon_avalon.png" png = LoadPixmap(mypixmap) name = "Avalon" title = MultiContentEntryText(pos=(120, 30), size=(480, 50), font=0, text=name) png = MultiContentEntryPixmapAlphaTest(pos=(0, 3), size=(100, 100), png=png) self.list.append([name, title, png]) mypixmap = mypath + "icons/icon_chaos.png" png = LoadPixmap(mypixmap) name = "Chaos" title = MultiContentEntryText(pos=(120, 30), size=(480, 50), font=0, text=name) png = MultiContentEntryPixmapAlphaTest(pos=(0, 3), size=(100, 100), png=png) self.list.append([name, title, png]) mypixmap = mypath + "icons/icon_ghost.png" png = LoadPixmap(mypixmap) name = "Ghost" title = MultiContentEntryText(pos=(120, 30), size=(480, 50), font=0, text=name) png = MultiContentEntryPixmapAlphaTest(pos=(0, 3), size=(100, 100), png=png) self.list.append([name, title, png]) self["list"].setList(self.list) self.current_universe = self.whereIAm() txt = _("You are in %s universe.") % (self.current_universe) self["lab1"].setText(txt) btot = buse = bempty = utot = uuse = uempty = "" f = open("/tmp/syinfo.tmp", 'r') for line in f.readlines(): parts = line.split() tot = len(parts) - 1 if parts[tot].strip() == "/": btot = parts[(tot - 4)].strip() buse = parts[(tot - 1)].strip() bempty = parts[(tot - 2)].strip() elif parts[tot].strip() == "/universe": utot = parts[(tot - 4)].strip() uuse = parts[(tot - 1)].strip() uempty = parts[(tot - 2)].strip() break f.close() os_remove("/tmp/syinfo.tmp") text = _( "Black Hole details:\nBlack Hole is the original matrix of all Parallel Universes and resides in its own phisycal space.\n" ) text += _("Estimated size: %s \n") % (btot) text += _("Occupied space: %s \n") % (buse) text += _("Empty space: %s \n\n") % (bempty) text += _( "Parallel Universes details:\nParallel Universes share the same space because they are all together in the same place, but in different dimensions.\n" ) text += _("Estimated size: %s \n") % (utot) text += _("Occupied space: %s \n") % (uuse) text += _("Empty space: %s \n\n") % (uempty) self["lab2"].setText(text) pos = 0 sel = self["list"].getCurrent() for x in self.list: if x[0] == self.current_universe: self["list"].moveToIndex(pos) break pos += 1
class MovieList(GUIComponent): SORT_ALPHANUMERIC = 1 SORT_RECORDED = 2 SHUFFLE = 3 SORT_ALPHANUMERIC_REVERSE = 4 SORT_RECORDED_REVERSE = 5 SORT_ALPHANUMERIC_FLAT = 6 SORT_ALPHANUMERIC_FLAT_REVERSE = 7 SORT_GROUPWISE = 8 SORT_ALPHA_DATE_OLDEST_FIRST = 9 SORT_ALPHAREV_DATE_NEWEST_FIRST = 10 SORT_LONGEST = 11 SORT_SHORTEST = 12 HIDE_DESCRIPTION = 1 SHOW_DESCRIPTION = 2 # So MovieSelection.selectSortby() can find out whether we are # in a Trash folder and, if so, what the last sort was # The numbering starts after SORT_* values above. # in MovieSelection.py (that has no SORT_GROUPWISE) # NOTE! that these two *must* *follow on* from the end of the # SORT_* items above! # TRASHSORT_SHOWRECORD = 13 TRASHSORT_SHOWDELETE = 14 UsingTrashSort = False InTrashFolder = False def __init__(self, root, sort_type=None, descr_state=None): GUIComponent.__init__(self) self.list = [] self.descr_state = descr_state or self.HIDE_DESCRIPTION self.sort_type = sort_type or self.SORT_GROUPWISE self.firstFileEntry = 0 self.parentDirectory = 0 self.fontName = "Regular" self.fontSize = 20 self.listHeight = None self.listWidth = None self.pbarShift = 5 self.pbarHeight = 16 self.pbarLargeWidth = 48 self.pbarColour = 0x206333 self.pbarColourSeen = 0xffc71d self.pbarColourRec = 0xff001d self.partIconeShift = 5 self.spaceRight = 2 self.spaceIconeText = 2 self.iconsWidth = 22 self.durationWidth = 160 self.dateWidth = 160 if config.usage.time.wide.value: self.dateWidth = int(self.dateWidth * 1.15) self.reloadDelayTimer = None self.l = eListboxPythonMultiContent() self.tags = set() self.root = None self._playInBackground = None self._playInForeground = None self._char = '' if root is not None: self.reload(root) self.onSelectionChanged = [] self.iconPart = [] for part in range(5): self.iconPart.append( LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/part_%d_4.png" % part))) self.iconMovieRec = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/part_new.png")) self.iconMoviePlay = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/movie_play.png")) self.iconMoviePlayRec = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/movie_play_rec.png")) self.iconUnwatched = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/part_unwatched.png")) self.iconFolder = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/folder.png")) self.iconTrash = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/trashcan.png")) self.iconCutting = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/cutting.png")) self.runningTimers = {} self.updateRecordings() def get_playInBackground(self): return self._playInBackground def set_playInBackground(self, value): if self._playInBackground is not value: index = self.findService(self._playInBackground) if index is not None: self.invalidateItem(index) self.l.invalidateEntry(index) index = self.findService(value) if index is not None: self.invalidateItem(index) self.l.invalidateEntry(index) self._playInBackground = value playInBackground = property(get_playInBackground, set_playInBackground) def get_playInForeground(self): return self._playInForeground def set_playInForeground(self, value): self._playInForeground = value playInForeground = property(get_playInForeground, set_playInForeground) def updateRecordings(self, timer=None): if timer is not None: if timer.justplay: return result = {} for timer in NavigationInstance.instance.RecordTimer.timer_list: if timer.isRunning() and not timer.justplay: result[os.path.split(timer.Filename)[1] + timer.record_service.getFilenameExtension()] = timer if self.runningTimers == result: return self.runningTimers = result if timer is not None: if self.reloadDelayTimer is not None: self.reloadDelayTimer.stop() self.reloadDelayTimer = eTimer() self.reloadDelayTimer.callback.append(self.reload) self.reloadDelayTimer.start(5000, 1) def connectSelChanged(self, fnc): if not fnc in self.onSelectionChanged: self.onSelectionChanged.append(fnc) def disconnectSelChanged(self, fnc): if fnc in self.onSelectionChanged: self.onSelectionChanged.remove(fnc) def selectionChanged(self): for x in self.onSelectionChanged: x() def setDescriptionState(self, val): self.descr_state = val def setSortType(self, type): self.sort_type = type def applySkin(self, desktop, parent): def warningWrongSkinParameter(string): print("[MovieList] wrong '%s' skin parameters" % string) def font(value): font = skin.parseFont(value, ((1, 1), (1, 1))) self.fontName = font.family self.fontSize = font.pointSize def partIconeShift(value): self.partIconeShift = int(value) def pbarShift(value): self.pbarShift = int(value) def pbarHeight(value): self.pbarHeight = int(value) def pbarLargeWidth(value): self.pbarLargeWidth = int(value) def pbarColour(value): self.pbarColour = skin.parseColor(value).argb() def pbarColourSeen(value): self.pbarColourSeen = skin.parseColor(value).argb() def pbarColourRec(value): self.pbarColourRec = skin.parseColor(value).argb() def spaceIconeText(value): self.spaceIconeText = int(value) def iconsWidth(value): self.iconsWidth = int(value) def trashShift(value): self.trashShift = int(value) def dirShift(value): self.dirShift = int(value) def spaceRight(value): self.spaceRight = int(value) def durationWidth(value): self.durationWidth = int(value) def dateWidth(value): self.dateWidth = int(value) if config.usage.time.wide.value: self.dateWidth = int(self.dateWidth * 1.15) for (attrib, value) in self.skinAttributes[:]: try: locals().get(attrib)(value) self.skinAttributes.remove((attrib, value)) except: pass rc = GUIComponent.applySkin(self, desktop, parent) self.listHeight = self.instance.size().height() self.listWidth = self.instance.size().width() self.setFontsize() self.setItemsPerPage() return rc def invalidateItem(self, index): x = self.list[index] self.list[index] = (x[0], x[1], x[2], None) def invalidateCurrentItem(self): self.invalidateItem(self.getCurrentIndex()) def setItemsPerPage(self): if self.listHeight > 0: itemHeight = self.listHeight / config.movielist.itemsperpage.getValue( ) else: itemHeight = 25 # some default (270/5) self.itemHeight = itemHeight self.l.setItemHeight(itemHeight) self.instance.resize( eSize(self.listWidth, self.listHeight / itemHeight * itemHeight)) def setFontsize(self): if isHD(): self.l.setFont( 0, gFont(self.fontName, self.fontSize + config.movielist.fontsize.getValue())) self.l.setFont( 1, gFont(self.fontName, self.fontSize + config.movielist.fontsize.getValue())) else: self.l.setFont( 0, gFont( self.fontName, self.fontSize + config.movielist.fontsize.getValue() + 10)) self.l.setFont( 1, gFont(self.fontName, self.fontSize + config.movielist.fontsize.getValue() + 7)) def buildMovieListEntry(self, serviceref, info, begin, data): showPicons = "picon" in config.usage.movielist_servicename_mode.getValue( ) switch = config.usage.show_icons_in_movielist.getValue() piconWidth = config.usage.movielist_piconwidth.getValue( ) if showPicons else 0 durationWidth = self.durationWidth if config.usage.load_length_of_movies_in_moviellist.getValue( ) else 0 width = self.l.getItemSize().width() dateWidth = self.dateWidth if not config.movielist.use_fuzzy_dates.getValue(): dateWidth += 30 iconSize = self.iconsWidth if switch == 'p': iconSize = self.pbarLargeWidth ih = self.itemHeight col0iconSize = piconWidth if showPicons else iconSize space = self.spaceIconeText r = self.spaceRight pathName = serviceref.getPath() res = [None] if serviceref.flags & eServiceReference.mustDescent: # Directory # Name is full path name if info is None: # Special case: "parent" txt = ".." else: p = os.path.split(pathName) if not p[1]: # if path ends in '/', p is blank. p = os.path.split(p[0]) txt = p[1] if txt == ".Trash": res.append( MultiContentEntryPixmapAlphaBlend( pos=((col0iconSize - self.iconTrash.size().width()) / 2, (self.itemHeight - self.iconFolder.size().height()) / 2), size=(iconSize, self.iconTrash.size().height()), png=self.iconTrash)) res.append( MultiContentEntryText( pos=(col0iconSize + space, 0), size=(width - 145, self.itemHeight), font=0, flags=RT_HALIGN_LEFT | RT_VALIGN_CENTER, text=_("Deleted items"))) res.append( MultiContentEntryText(pos=(width - 185 - r, 0), size=(185, self.itemHeight), font=1, flags=RT_HALIGN_RIGHT | RT_VALIGN_CENTER, text=_("Trash can"))) return res if not config.movielist.show_underlines.value: txt = txt.replace('_', ' ').strip() res.append( MultiContentEntryPixmapAlphaBlend( pos=((col0iconSize - self.iconFolder.size().width()) / 2, (self.itemHeight - self.iconFolder.size().height()) / 2), size=(iconSize, iconSize), png=self.iconFolder)) res.append( MultiContentEntryText(pos=(col0iconSize + space, 0), size=(width - 145, self.itemHeight), font=0, flags=RT_HALIGN_LEFT | RT_VALIGN_CENTER, text=txt)) res.append( MultiContentEntryText(pos=(width - 145 - r, 0), size=(145, self.itemHeight), font=1, flags=RT_HALIGN_RIGHT | RT_VALIGN_CENTER, text=_("Directory"))) return res if data == -1 or data is None: data = MovieListData() cur_idx = self.l.getCurrentSelectionIndex() x = self.list[cur_idx] # x = ref,info,begin,... if config.usage.load_length_of_movies_in_moviellist.getValue(): data.len = x[1].getLength(x[0]) # recalc the movie length... else: data.len = 0 # dont recalc movielist to speedup loading the list self.list[cur_idx] = ( x[0], x[1], x[2], data ) # update entry in list... so next time we don't need to recalc if config.movielist.show_underlines.value: data.txt = info.getName(serviceref) else: data.txt = info.getName(serviceref).replace('_', ' ').strip() if config.movielist.hide_extensions.getValue(): fileName, fileExtension = os.path.splitext(data.txt) if fileExtension in KNOWN_EXTENSIONS: data.txt = fileName data.icon = None data.part = None if os.path.split(pathName)[1] in self.runningTimers: if switch == 'i': if (self.playInBackground or self.playInForeground ) and serviceref == (self.playInBackground or self.playInForeground): data.icon = self.iconMoviePlayRec else: data.icon = self.iconMovieRec elif switch in ('p', 's'): data.part = 100 if (self.playInBackground or self.playInForeground ) and serviceref == (self.playInBackground or self.playInForeground): data.partcol = self.pbarColourSeen else: data.partcol = self.pbarColourRec elif (self.playInBackground or self.playInForeground) and serviceref == ( self.playInBackground or self.playInForeground): data.icon = self.iconMoviePlay elif pathName.endswith( ".tmpcut.ts" ): # cutting with moviecut plugin to same filename data.icon = self.iconCutting else: data.part = moviePlayState(pathName + '.cuts', serviceref, data.len) if switch == 'i': if data.part is not None and data.part > 0: data.icon = self.iconPart[data.part // 25] else: if config.usage.movielist_unseen.value: data.icon = self.iconUnwatched elif switch in ('p', 's'): if data.part is not None and data.part > 0: data.partcol = self.pbarColourSeen else: if config.usage.movielist_unseen.value: data.part = 100 data.partcol = self.pbarColour colX = 0 if switch == 'p': iconSize = self.pbarLargeWidth ih = self.itemHeight def addProgress(): # icon/progress if data: if switch == 'i' and hasattr(data, 'icon') and data.icon is not None: res.append( MultiContentEntryPixmapAlphaBlend( pos=(colX, self.partIconeShift), size=(iconSize, data.icon.size().height()), png=data.icon)) elif switch in ('p', 's'): if hasattr(data, 'part') and data.part > 0: res.append( MultiContentEntryProgress(pos=(colX, self.pbarShift), size=(iconSize, self.pbarHeight), percent=data.part, borderWidth=2, foreColor=data.partcol, foreColorSelected=None, backColor=None, backColorSelected=None)) elif hasattr(data, 'icon') and data.icon is not None: res.append( MultiContentEntryPixmapAlphaBlend( pos=(colX, self.pbarShift), size=(iconSize, self.pbarHeight), png=data.icon)) return iconSize serviceref = info.getInfoString(serviceref, iServiceInformation.sServiceref) displayPicon = None if piconWidth > 0: # Picon picon = getPiconName(serviceref) if picon != "": displayPicon = loadPNG(picon) if displayPicon is not None: res.append( MultiContentEntryPixmapAlphaBlend( pos=(colX, 0), size=(piconWidth, ih), png=displayPicon, backcolor=None, backcolor_sel=None, flags=BT_SCALE | BT_KEEP_ASPECT_RATIO | BT_HALIGN_CENTER | BT_VALIGN_CENTER)) colX = piconWidth else: colX = addProgress() # Recording name res.append( MultiContentEntryText(pos=(colX, 0), size=(width - iconSize - space - durationWidth - dateWidth - r - colX, ih), font=0, flags=RT_HALIGN_LEFT | RT_VALIGN_CENTER, text=data.txt)) colX = width - iconSize - space - durationWidth - dateWidth - r if piconWidth > 0: colX = addProgress() # Duration Mins if durationWidth > 0: if data: len = data.len if len > 0: len = ngettext("%d Min", "%d Mins", (len / 60)) % (len / 60) res.append( MultiContentEntryText(pos=(colX + 425, 0), size=(durationWidth, ih), font=1, flags=RT_HALIGN_RIGHT | RT_VALIGN_CENTER, text=len)) # Date begin_string = "" if begin > 0: if config.movielist.use_fuzzy_dates.value: begin_string = ', '.join(FuzzyTime(begin, inPast=True)) else: begin_string = strftime( "%s, %s" % (config.usage.date.daylong.value, config.usage.time.short.value), localtime(begin)) res.append( MultiContentEntryText(pos=(width - dateWidth - r - 130, 0), size=(dateWidth + 130, ih), font=1, flags=RT_HALIGN_RIGHT | RT_VALIGN_CENTER, text=begin_string)) return res def moveToFirstMovie(self): if self.firstFileEntry < len(self.list): self.instance.moveSelectionTo(self.firstFileEntry) else: # there are no movies, just directories... self.moveToFirst() def moveToParentDirectory(self): if self.parentDirectory < len(self.list): self.instance.moveSelectionTo(self.parentDirectory) else: self.moveToFirst() def moveToLast(self): if self.list: self.instance.moveSelectionTo(len(self.list) - 1) def moveToFirst(self): if self.list: self.instance.moveSelectionTo(0) def moveToIndex(self, index): self.instance.moveSelectionTo(index) def getCurrentIndex(self): return self.instance.getCurrentIndex() def getCurrentEvent(self): l = self.l.getCurrentSelection() return l and l[0] and l[1] and l[1].getEvent(l[0]) def getCurrent(self): l = self.l.getCurrentSelection() return l and l[0] def getItem(self, index): if self.list: if len(self.list) > index: return self.list[index] and self.list[index][0] GUI_WIDGET = eListbox def postWidgetCreate(self, instance): instance.setContent(self.l) instance.selectionChanged.get().append(self.selectionChanged) self.setFontsize() def preWidgetRemove(self, instance): instance.setContent(None) instance.selectionChanged.get().remove(self.selectionChanged) def reload(self, root=None, filter_tags=None): if self.reloadDelayTimer is not None: self.reloadDelayTimer.stop() self.reloadDelayTimer = None if root is not None: self.load(root, filter_tags) else: self.load(self.root, filter_tags) self.l.setBuildFunc( self.buildMovieListEntry ) # don't move that to __init__ as this will create memory leak when calling MovieList from WebIf self.l.setList(self.list) def removeService(self, service): index = self.findService(service) if index is not None: del self.list[index] self.l.setList(self.list) def findService(self, service): if service is None: return None for index, l in enumerate(self.list): if l[0] == service: return index return None def __len__(self): return len(self.list) def __getitem__(self, index): return self.list[index] def __iter__(self): return self.list.__iter__() def load(self, root, filter_tags): # this lists our root service, then building a # nice list del self.list[:] serviceHandler = eServiceCenter.getInstance() numberOfDirs = 0 reflist = root and serviceHandler.list(root) if reflist is None: print("[MovieList] listing of movies failed") return realtags = set() autotags = {} rootPath = os.path.normpath(root.getPath()) parent = None # Don't navigate above the "root" if len(rootPath) > 1 and (os.path.realpath(rootPath) != os.path.realpath( config.movielist.root.value)): parent = os.path.split(os.path.normpath(rootPath))[0] if parent and (parent not in defaultInhibitDirs): # enigma wants an extra '/' appended if not parent.endswith('/'): parent += '/' ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + parent) ref.flags = eServiceReference.flagDirectory self.list.append((ref, None, 0, -1)) numberOfDirs += 1 if config.usage.movielist_trashcan.value: here = os.path.realpath(rootPath) MovieList.InTrashFolder = here.startswith(getTrashFolder(here)) else: MovieList.InTrashFolder = False MovieList.UsingTrashSort = False if MovieList.InTrashFolder: if (config.usage.trashsort_deltime.value == "show record time"): MovieList.UsingTrashSort = MovieList.TRASHSORT_SHOWRECORD elif (config.usage.trashsort_deltime.value == "show delete time"): MovieList.UsingTrashSort = MovieList.TRASHSORT_SHOWDELETE while 1: serviceref = reflist.getNext() if not serviceref.valid(): break if config.ParentalControl.servicepinactive.value and config.ParentalControl.storeservicepin.value != "never": from Components.ParentalControl import parentalControl if not parentalControl.sessionPinCached and parentalControl.isProtected( serviceref): continue info = serviceHandler.info(serviceref) if info is None: info = justStubInfo begin = info.getInfo(serviceref, iServiceInformation.sTimeCreate) begin2 = 0 if MovieList.UsingTrashSort: f_path = serviceref.getPath() if os.path.exists(f_path): # Override with deltime for sorting if MovieList.UsingTrashSort == MovieList.TRASHSORT_SHOWRECORD: begin2 = begin # Save for later re-instatement begin = os.stat(f_path).st_ctime if serviceref.flags & eServiceReference.mustDescent: dirname = info.getName(serviceref) if not dirname.endswith( '.AppleDouble/') and not dirname.endswith( '.AppleDesktop/') and not dirname.endswith( '.AppleDB/') and not dirname.endswith( 'Network Trash Folder/' ) and not dirname.endswith('Temporary Items/'): self.list.append((serviceref, info, begin, -1)) numberOfDirs += 1 continue # convert space-separated list of tags into a set this_tags = info.getInfoString( serviceref, iServiceInformation.sTags).split(' ') name = info.getName(serviceref) # OSX put a lot of stupid files ._* everywhere... we need to skip them if name[:2] == "._": continue if this_tags == ['']: # No tags? Auto tag! this_tags = name.replace(',', ' ').replace('.', ' ').replace( '_', ' ').replace(':', ' ').split() # For auto tags, we are keeping a (tag, movies) dictionary. # It will be used later to check if movies have a complete sentence in common. for tag in this_tags: if tag in autotags: autotags[tag].append(name) else: autotags[tag] = [name] else: realtags.update(this_tags) # filter_tags is either None (which means no filter at all), or # a set. In this case, all elements of filter_tags must be present, # otherwise the entry will be dropped. if filter_tags is not None: this_tags_fullname = [" ".join(this_tags)] this_tags_fullname = set(this_tags_fullname) this_tags = set(this_tags) if not this_tags.issuperset( filter_tags) and not this_tags_fullname.issuperset( filter_tags): # print("Skipping", name, "tags=", this_tags, " filter=", filter_tags) continue if begin2 != 0: self.list.append((serviceref, info, begin, -1, begin2)) else: self.list.append((serviceref, info, begin, -1)) self.firstFileEntry = numberOfDirs self.parentDirectory = 0 self.list.sort(key=self.buildGroupwiseSortkey) # Have we had a temporary sort method override set in MovieSelectiom.py? # If so use it, remove it (it's a one-off) and set the current method so # that the "Sort by" menu can highlight it and "Sort" knows which to # move on from (both in Screens/MovieSelection.py). # try: self.current_sort = self.temp_sort del self.temp_sort except: self.current_sort = self.sort_type if MovieList.UsingTrashSort: # Same as SORT_RECORDED, but must come first... self.list = sorted(self.list[:numberOfDirs], key=self.buildBeginTimeSortKey) + sorted( self.list[numberOfDirs:], key=self.buildBeginTimeSortKey) # Having sorted on *deletion* times, re-instate any record times for # *display* if that option is set. # self.list is a list of tuples, so we can't just assign to elements... # if config.usage.trashsort_deltime.value == "show record time": for i in range(len(self.list)): if len(self.list[i]) == 5: x = self.list[i] self.list[i] = (x[0], x[1], x[4], x[3]) elif self.current_sort == MovieList.SORT_ALPHANUMERIC: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaNumericSortKey) + sorted( self.list[numberOfDirs:], key=self.buildAlphaNumericSortKey) elif self.current_sort == MovieList.SORT_ALPHANUMERIC_REVERSE: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaNumericSortKey, reverse=True) + sorted( self.list[numberOfDirs:], key=self.buildAlphaNumericSortKey, reverse=True) elif self.current_sort == MovieList.SORT_ALPHANUMERIC_FLAT: self.list.sort(key=self.buildAlphaNumericFlatSortKey) elif self.current_sort == MovieList.SORT_ALPHANUMERIC_FLAT_REVERSE: self.list.sort(key=self.buildAlphaNumericFlatSortKey, reverse=True) elif self.current_sort == MovieList.SORT_RECORDED: self.list = sorted(self.list[:numberOfDirs], key=self.buildBeginTimeSortKey) + sorted( self.list[numberOfDirs:], key=self.buildBeginTimeSortKey) elif self.current_sort == MovieList.SORT_RECORDED_REVERSE: self.list = sorted(self.list[:numberOfDirs], key=self.buildBeginTimeSortKey, reverse=True) + sorted( self.list[numberOfDirs:], key=self.buildBeginTimeSortKey, reverse=True) elif self.current_sort == MovieList.SHUFFLE: dirlist = self.list[:numberOfDirs] shufflelist = self.list[numberOfDirs:] random.shuffle(shufflelist) self.list = dirlist + shufflelist elif self.current_sort == MovieList.SORT_ALPHA_DATE_OLDEST_FIRST: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaDateSortKey) + sorted( self.list[numberOfDirs:], key=self.buildAlphaDateSortKey) elif self.current_sort == MovieList.SORT_ALPHAREV_DATE_NEWEST_FIRST: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaDateSortKey, reverse=True) + sorted( self.list[numberOfDirs:], key=self.buildAlphaDateSortKey, reverse=True) elif self.current_sort == MovieList.SORT_LONGEST: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaNumericSortKey) + sorted( self.list[numberOfDirs:], key=self.buildLengthSortKey, reverse=True) elif self.current_sort == MovieList.SORT_SHORTEST: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaNumericSortKey) + sorted( self.list[numberOfDirs:], key=self.buildLengthSortKey) for x in self.list: if x[1]: tmppath = x[1].getName(x[0])[:-1] if x[1].getName( x[0]).endswith('/') else x[1].getName(x[0]) if tmppath.endswith('.Trash'): self.list.insert(0, self.list.pop(self.list.index(x))) break if self.root and numberOfDirs > 0: rootPath = os.path.normpath(self.root.getPath()) if not rootPath.endswith('/'): rootPath += '/' if rootPath != parent: # with new sort types directories may be in between files, so scan whole # list for parentDirectory index. Usually it is the first one anyway for index, item in enumerate(self.list): if item[0].flags & eServiceReference.mustDescent: itempath = os.path.normpath(item[0].getPath()) if not itempath.endswith('/'): itempath += '/' if itempath == rootPath: self.parentDirectory = index break self.root = root # finally, store a list of all tags which were found. these can be presented # to the user to filter the list # ML: Only use the tags that occur more than once in the list OR that were # really in the tag set of some file. # reverse the dictionary to see which unique movie each tag now references rautotags = {} for tag, movies in autotags.items(): if (len(movies) > 1): movies = tuple(movies) # a tuple can be hashed, but a list not item = rautotags.get(movies, []) if not item: rautotags[movies] = item item.append(tag) self.tags = {} for movies, tags in rautotags.items(): movie = movies[0] # format the tag lists so that they are in 'original' order tags.sort(key=movie.find) first = movie.find(tags[0]) last = movie.find(tags[-1]) + len(tags[-1]) match = movie start = 0 end = len(movie) # Check if the set has a complete sentence in common, and how far for m in movies[1:]: if m[start:end] != match: if not m.startswith(movie[:last]): start = first if not m.endswith(movie[first:]): end = last match = movie[start:end] if m[start:end] != match: match = '' break # Adding the longest common sentence to the tag list if match: self.tags[match] = set(tags) else: match = ' '.join(tags) if (len(match) > 2) or ( match in realtags): # Omit small words, only for auto tags self.tags[match] = set(tags) # Adding the realtags to the tag list for tag in realtags: self.tags[tag] = set([tag]) def buildLengthSortKey(self, x): # x = ref,info,begin,... ref = x[0] name = x[1] and x[1].getName(ref) len = x[1] and x[1].getLength(ref) if ref.flags & eServiceReference.mustDescent: return (0, len or 0, name and name.lower() or "", -x[2]) return (1, len or 0, name and name.lower() or "", -x[2]) def buildAlphaNumericSortKey(self, x): # x = ref,info,begin,... ref = x[0] name = x[1] and x[1].getName(ref) if ref.flags & eServiceReference.mustDescent: return (0, name and name.lower() or "", -x[2]) return (1, name and name.lower() or "", -x[2]) def buildAlphaDateSortKey(self, x): # x = ref,info,begin,... ref = x[0] name = x[1] and x[1].getName(ref) if ref.flags & eServiceReference.mustDescent: return (0, name and name.lower() or "", x[2]) return (1, name and name.lower() or "", x[2]) def buildAlphaNumericFlatSortKey(self, x): # x = ref,info,begin,... ref = x[0] name = x[1] and x[1].getName(ref) if name and ref.flags & eServiceReference.mustDescent: # only use directory basename for sorting p = os.path.split(name) if not p[1]: # if path ends in '/', p is blank. p = os.path.split(p[0]) name = p[1] # print("Sorting for -%s-" % name) return (1, name and name.lower() or "", -x[2]) def buildBeginTimeSortKey(self, x): ref = x[0] if ref.flags & eServiceReference.mustDescent: return (0, x[1] and x[1].getName(ref).lower() or "") if six.PY2: return (1, -x[2]) else: return (1, "", -x[2]) def buildGroupwiseSortkey(self, x): # Sort recordings by date, sort MP3 and stuff by name ref = x[0] if ref.type >= eServiceReference.idUser: return self.buildAlphaNumericSortKey(x) else: return self.buildBeginTimeSortKey(x) def moveTo(self, serviceref): index = self.findService(serviceref) if index is not None: self.instance.moveSelectionTo(index) return True return False def moveDown(self): self.instance.moveSelection(self.instance.moveDown) def moveUp(self): self.instance.moveSelection(self.instance.moveUp) def moveToChar(self, char, lbl=None): self._char = char self._lbl = lbl if lbl: lbl.setText(self._char) lbl.visible = True self.moveToCharTimer = eTimer() self.moveToCharTimer.callback.append(self._moveToChrStr) self.moveToCharTimer.start( 1000, True ) # time to wait for next key press to decide which letter to use... def moveToString(self, char, lbl=None): self._char = self._char + char.upper() self._lbl = lbl if lbl: lbl.setText(self._char) lbl.visible = True self.moveToCharTimer = eTimer() self.moveToCharTimer.callback.append(self._moveToChrStr) self.moveToCharTimer.start( 1000, True ) # time to wait for next key press to decide which letter to use... def _moveToChrStr(self): currentIndex = self.instance.getCurrentIndex() found = False if currentIndex < (len(self.list) - 1): itemsBelow = self.list[currentIndex + 1:] # first search the items below the selection for index, item in enumerate(itemsBelow): ref = item[0] itemName = getShortName(item[1].getName(ref).upper(), ref) if len(self._char) == 1 and itemName.startswith(self._char): found = True self.instance.moveSelectionTo(index + currentIndex + 1) break elif len(self._char) > 1 and itemName.find(self._char) >= 0: found = True self.instance.moveSelectionTo(index + currentIndex + 1) break if found == False and currentIndex > 0: itemsAbove = self.list[ 1: currentIndex] # first item (0) points parent folder - no point to include for index, item in enumerate(itemsAbove): ref = item[0] itemName = getShortName(item[1].getName(ref).upper(), ref) if len(self._char) == 1 and itemName.startswith(self._char): found = True self.instance.moveSelectionTo(index + 1) break elif len(self._char) > 1 and itemName.find(self._char) >= 0: found = True self.instance.moveSelectionTo(index + 1) break self._char = '' if self._lbl: self._lbl.visible = False
class MovieList(GUIComponent): SORT_ALPHANUMERIC = 1 SORT_RECORDED = 2 SHUFFLE = 3 SORT_ALPHANUMERIC_REVERSE = 4 SORT_RECORDED_REVERSE = 5 SORT_ALPHANUMERIC_FLAT = 6 SORT_ALPHANUMERIC_FLAT_REVERSE = 7 SORT_GROUPWISE = 8 SORT_ALPHA_DATE_OLDEST_FIRST = 9 SORT_ALPHAREV_DATE_NEWEST_FIRST = 10 HIDE_DESCRIPTION = 1 SHOW_DESCRIPTION = 2 def __init__(self, root, sort_type=None, descr_state=None): GUIComponent.__init__(self) self.list = [] self.descr_state = descr_state or self.HIDE_DESCRIPTION self.sort_type = sort_type or self.SORT_GROUPWISE self.firstFileEntry = 0 self.parentDirectory = 0 self.fontName = "Regular" self.fontSize = 20 self.listHeight = None self.listWidth = None self.pbarShift = 5 self.pbarHeight = 16 self.pbarLargeWidth = 48 self.pbarColour = 0x206333 self.pbarColourSeen = 0xffc71d self.pbarColourRec = 0xff001d self.partIconeShift = 5 self.spaceRight = 2 self.spaceIconeText = 2 self.iconsWidth = 22 self.trashShift = 1 self.dirShift = 1 self.columns = (180,200) self.reloadDelayTimer = None self.l = eListboxPythonMultiContent() self.tags = set() self.root = None self._playInBackground = None self._playInForeground = None self._char = '' if root is not None: self.reload(root) self.l.setBuildFunc(self.buildMovieListEntry) self.onSelectionChanged = [ ] self.iconPart = [] for part in range(5): self.iconPart.append(LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/part_%d_4.png" % part))) self.iconMovieRec = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/part_new.png")) self.iconMoviePlay = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/movie_play.png")) self.iconMoviePlayRec = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/movie_play_rec.png")) self.iconUnwatched = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/part_unwatched.png")) self.iconFolder = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/folder.png")) self.iconTrash = LoadPixmap(resolveFilename(SCOPE_ACTIVE_SKIN, "icons/trashcan.png")) self.runningTimers = {} self.updateRecordings() self.updatePlayPosCache() def get_playInBackground(self): return self._playInBackground def set_playInBackground(self, value): if self._playInBackground is not value: index = self.findService(self._playInBackground) if index is not None: self.invalidateItem(index) self.l.invalidateEntry(index) index = self.findService(value) if index is not None: self.invalidateItem(index) self.l.invalidateEntry(index) self._playInBackground = value playInBackground = property(get_playInBackground, set_playInBackground) def get_playInForeground(self): return self._playInForeground def set_playInForeground(self, value): self._playInForeground = value playInForeground = property(get_playInForeground, set_playInForeground) def updatePlayPosCache(self): from Screens.InfoBarGenerics import updateresumePointCache updateresumePointCache() def updateRecordings(self, timer=None): if timer is not None: if timer.justplay: return result = {} for timer in NavigationInstance.instance.RecordTimer.timer_list: if timer.isRunning() and not timer.justplay: result[os.path.split(timer.Filename)[1]+'.ts'] = timer if self.runningTimers == result: return self.runningTimers = result if timer is not None: if self.reloadDelayTimer is not None: self.reloadDelayTimer.stop() self.reloadDelayTimer = eTimer() self.reloadDelayTimer.callback.append(self.reload) self.reloadDelayTimer.start(5000, 1) def connectSelChanged(self, fnc): if not fnc in self.onSelectionChanged: self.onSelectionChanged.append(fnc) def disconnectSelChanged(self, fnc): if fnc in self.onSelectionChanged: self.onSelectionChanged.remove(fnc) def selectionChanged(self): for x in self.onSelectionChanged: x() def setDescriptionState(self, val): self.descr_state = val def setSortType(self, type): self.sort_type = type def applySkin(self, desktop, parent): def warningWrongSkinParameter(string): print "[MovieList] wrong '%s' skin parameters" % string def font(value): font = skin.parseFont(value, ((1,1),(1,1))) self.fontName = font.family self.fontSize = font.pointSize def pbarShift(value): self.pbarShift = int(value) def pbarHeight(value): self.pbarHeight = int(value) def pbarLargeWidth(value): self.pbarLargeWidth = int(value) def pbarColour(value): self.pbarColour = skin.parseColor(value).argb() def pbarColourSeen(value): self.pbarColourSeen = skin.parseColor(value).argb() def pbarColourRec(value): self.pbarColourRec = skin.parseColor(value).argb() def partIconeShift(value): self.partIconeShift = int(value) def spaceIconeText(value): self.spaceIconeText = int(value) def iconsWidth(value): self.iconsWidth = int(value) def trashShift(value): self.trashShift = int(value) def dirShift(value): self.dirShift = int(value) def spaceRight(value): self.spaceRight = int(value) def columns(value): self.columns = map(int, value.split(",")) if len(self.columns) != 2: warningWrongSkinParameter(attrib) for (attrib, value) in self.skinAttributes[:]: try: locals().get(attrib)(value) self.skinAttributes.remove((attrib, value)) except: pass rc = GUIComponent.applySkin(self, desktop, parent) self.listHeight = self.instance.size().height() self.listWidth = self.instance.size().width() self.setFontsize() self.setItemsPerPage() return rc def setItemsPerPage(self): if self.listHeight > 0: itemHeight = self.listHeight / config.movielist.itemsperpage.value else: itemHeight = 25 # some default (270/5) self.itemHeight = itemHeight self.l.setItemHeight(itemHeight) self.instance.resize(eSize(self.listWidth, self.listHeight / itemHeight * itemHeight)) def setFontsize(self): self.l.setFont(0, gFont(self.fontName, self.fontSize + config.movielist.fontsize.value)) self.l.setFont(1, gFont(self.fontName, (self.fontSize - 3) + config.movielist.fontsize.value)) def invalidateItem(self, index): x = self.list[index] self.list[index] = (x[0], x[1], x[2], None) def invalidateCurrentItem(self): self.invalidateItem(self.getCurrentIndex()) def buildMovieListEntry(self, serviceref, info, begin, data): switch = config.usage.show_icons_in_movielist.value width = self.l.getItemSize().width() iconSize = self.iconsWidth space = self.spaceIconeText r = self.spaceRight pathName = serviceref.getPath() res = [ None ] if serviceref.flags & eServiceReference.mustDescent: # Directory # Name is full path name if info is None: # Special case: "parent" txt = ".." else: p = os.path.split(pathName) if not p[1]: # if path ends in '/', p is blank. p = os.path.split(p[0]) txt = p[1] if txt == ".Trash": res.append(MultiContentEntryPixmapAlphaBlend(pos=(0,self.trashShift), size=(iconSize,self.iconTrash.size().height()), png=self.iconTrash)) res.append(MultiContentEntryText(pos=(iconSize+space, 0), size=(width-166, self.itemHeight), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = _("Deleted items"))) res.append(MultiContentEntryText(pos=(width-145-r, 0), size=(145, self.itemHeight), font=1, flags=RT_HALIGN_RIGHT|RT_VALIGN_CENTER, text=_("Trash can"))) return res res.append(MultiContentEntryPixmapAlphaBlend(pos=(0,self.dirShift), size=(iconSize,iconSize), png=self.iconFolder)) res.append(MultiContentEntryText(pos=(iconSize+space, 0), size=(width-166, self.itemHeight), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = txt)) res.append(MultiContentEntryText(pos=(width-145-r, 0), size=(145, self.itemHeight), font=1, flags=RT_HALIGN_RIGHT|RT_VALIGN_CENTER, text=_("Directory"))) return res if data == -1 or data is None: data = MovieListData() cur_idx = self.l.getCurrentSelectionIndex() x = self.list[cur_idx] # x = ref,info,begin,... data.len = 0 #dont recalc movielist to speedup loading the list self.list[cur_idx] = (x[0], x[1], x[2], data) #update entry in list... so next time we don't need to recalc data.txt = info.getName(serviceref) if config.movielist.hide_extensions.value: fileName, fileExtension = os.path.splitext(data.txt) if fileExtension in KNOWN_EXTENSIONS: data.txt = fileName data.icon = None data.part = None if os.path.split(pathName)[1] in self.runningTimers: if switch == 'i': if (self.playInBackground or self.playInForeground) and serviceref == (self.playInBackground or self.playInForeground): data.icon = self.iconMoviePlayRec else: data.icon = self.iconMovieRec elif switch in ('p', 's'): data.part = 100 if (self.playInBackground or self.playInForeground) and serviceref == (self.playInBackground or self.playInForeground): data.partcol = self.pbarColourSeen else: data.partcol = self.pbarColourRec elif (self.playInBackground or self.playInForeground) and serviceref == (self.playInBackground or self.playInForeground): data.icon = self.iconMoviePlay else: data.part = moviePlayState(pathName + '.cuts', serviceref, data.len) if switch == 'i': if data.part is not None and data.part > 0: data.icon = self.iconPart[data.part // 25] else: if config.usage.movielist_unseen.value: data.icon = self.iconUnwatched elif switch in ('p', 's'): if data.part is not None and data.part > 0: data.partcol = self.pbarColourSeen else: if config.usage.movielist_unseen.value: data.part = 100 data.partcol = self.pbarColour len = data.len if len > 0: len = "%d:%02d" % (len / 60, len % 60) else: len = "" if data: pos = (0,self.partIconeShift) if switch == 'i' and hasattr(data, 'icon') and data.icon is not None: res.append(MultiContentEntryPixmapAlphaBlend(pos=pos, size=(iconSize,data.icon.size().height()), png=data.icon)) elif switch in ('p', 's'): if switch == 'p': iconSize = self.pbarLargeWidth if hasattr(data, 'part') and data.part > 0: res.append(MultiContentEntryProgress(pos=(0,self.pbarShift), size=(iconSize, self.pbarHeight), percent=data.part, borderWidth=2, foreColor=data.partcol, foreColorSelected=None, backColor=None, backColorSelected=None)) elif hasattr(data, 'icon') and data.icon is not None: res.append(MultiContentEntryPixmapAlphaBlend(pos=(0,self.pbarShift), size=(iconSize, self.pbarHeight), png=data.icon)) begin_string = "" if begin > 0: begin_string = ', '.join(FuzzyTime(begin, inPast = True)) ih = self.itemHeight lenSize = ih * 3 # 25 -> 75 dateSize = ih * 145 / 25 # 25 -> 145 res.append(MultiContentEntryText(pos=(iconSize+space, 0), size=(width-iconSize-space-dateSize-r, ih), font = 0, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = data.txt)) res.append(MultiContentEntryText(pos=(width-dateSize-r, 4), size=(dateSize, ih), font=1, flags=RT_HALIGN_RIGHT|RT_VALIGN_CENTER, text=begin_string)) return res def moveToFirstMovie(self): if self.firstFileEntry < len(self.list): self.instance.moveSelectionTo(self.firstFileEntry) else: # there are no movies, just directories... self.moveToFirst() def moveToParentDirectory(self): if self.parentDirectory < len(self.list): self.instance.moveSelectionTo(self.parentDirectory) else: self.moveToFirst() def moveToLast(self): if self.list: self.instance.moveSelectionTo(len(self.list) - 1) def moveToFirst(self): if self.list: self.instance.moveSelectionTo(0) def moveToIndex(self, index): self.instance.moveSelectionTo(index) def getCurrentIndex(self): return self.instance.getCurrentIndex() def getCurrentEvent(self): l = self.l.getCurrentSelection() return l and l[0] and l[1] and l[1].getEvent(l[0]) def getCurrent(self): l = self.l.getCurrentSelection() return l and l[0] def getItem(self, index): if self.list: if len(self.list) > index: return self.list[index] and self.list[index][0] GUI_WIDGET = eListbox def postWidgetCreate(self, instance): instance.setContent(self.l) instance.selectionChanged.get().append(self.selectionChanged) self.setFontsize() def preWidgetRemove(self, instance): instance.setContent(None) instance.selectionChanged.get().remove(self.selectionChanged) def reload(self, root = None, filter_tags = None): if self.reloadDelayTimer is not None: self.reloadDelayTimer.stop() self.reloadDelayTimer = None if root is not None: self.load(root, filter_tags) else: self.load(self.root, filter_tags) self.l.setList(self.list) def removeService(self, service): index = self.findService(service) if index is not None: del self.list[index] self.l.setList(self.list) def findService(self, service): if service is None: return None for index, l in enumerate(self.list): if l[0] == service: return index return None def __len__(self): return len(self.list) def __getitem__(self, index): return self.list[index] def __iter__(self): return self.list.__iter__() def load(self, root, filter_tags): # this lists our root service, then building a # nice list del self.list[:] serviceHandler = eServiceCenter.getInstance() numberOfDirs = 0 reflist = root and serviceHandler.list(root) if reflist is None: print "listing of movies failed" return realtags = set() tags = {} rootPath = os.path.normpath(root.getPath()) parent = None # Don't navigate above the "root" if len(rootPath) > 1 and (os.path.realpath(rootPath) != config.movielist.root.value): parent = os.path.split(os.path.normpath(rootPath))[0] currentfolder = os.path.normpath(rootPath) + '/' if parent and (parent not in defaultInhibitDirs) and not currentfolder.endswith(config.usage.default_path.value): # enigma wants an extra '/' appended if not parent.endswith('/'): parent += '/' ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + parent) ref.flags = eServiceReference.flagDirectory self.list.append((ref, None, 0, -1)) numberOfDirs += 1 while 1: serviceref = reflist.getNext() if not serviceref.valid(): break if config.ParentalControl.servicepinactive.value and config.ParentalControl.storeservicepin.value != "never": from Components.ParentalControl import parentalControl if not parentalControl.sessionPinCached and parentalControl.isProtected(serviceref): continue info = serviceHandler.info(serviceref) if info is None: info = justStubInfo begin = info.getInfo(serviceref, iServiceInformation.sTimeCreate) if serviceref.flags & eServiceReference.mustDescent: dirname = info.getName(serviceref) if not dirname.endswith('.AppleDouble/') and not dirname.endswith('.AppleDesktop/') and not dirname.endswith('.AppleDB/') and not dirname.endswith('Network Trash Folder/') and not dirname.endswith('Temporary Items/'): self.list.append((serviceref, info, begin, -1)) numberOfDirs += 1 continue # convert separe-seperated list of tags into a set this_tags = info.getInfoString(serviceref, iServiceInformation.sTags).split(' ') name = info.getName(serviceref) # OSX put a lot of stupid files ._* everywhere... we need to skip them if name[:2] == "._": continue if this_tags == ['']: # No tags? Auto tag! this_tags = name.replace(',',' ').replace('.',' ').replace('_',' ').replace(':',' ').split() else: realtags.update(this_tags) for tag in this_tags: if len(tag) >= 4: if tags.has_key(tag): tags[tag].append(name) else: tags[tag] = [name] # filter_tags is either None (which means no filter at all), or # a set. In this case, all elements of filter_tags must be present, # otherwise the entry will be dropped. if filter_tags is not None: this_tags_fullname = [" ".join(this_tags)] this_tags_fullname = set(this_tags_fullname) this_tags = set(this_tags) if not this_tags.issuperset(filter_tags) and not this_tags_fullname.issuperset(filter_tags): # print "Skipping", name, "tags=", this_tags, " filter=", filter_tags continue self.list.append((serviceref, info, begin, -1)) self.firstFileEntry = numberOfDirs self.parentDirectory = 0 self.list.sort(key=self.buildGroupwiseSortkey) if self.sort_type == MovieList.SORT_ALPHANUMERIC: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaNumericSortKey) + sorted(self.list[numberOfDirs:], key=self.buildAlphaNumericSortKey) elif self.sort_type == MovieList.SORT_ALPHANUMERIC_REVERSE: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaNumericSortKey, reverse = True) + sorted(self.list[numberOfDirs:], key=self.buildAlphaNumericSortKey, reverse = True) elif self.sort_type == MovieList.SORT_ALPHANUMERIC_FLAT: self.list.sort(key=self.buildAlphaNumericFlatSortKey) elif self.sort_type == MovieList.SORT_ALPHANUMERIC_FLAT_REVERSE: self.list.sort(key=self.buildAlphaNumericFlatSortKey, reverse = True) elif self.sort_type == MovieList.SORT_RECORDED: self.list = sorted(self.list[:numberOfDirs], key=self.buildBeginTimeSortKey) + sorted(self.list[numberOfDirs:], key=self.buildBeginTimeSortKey) elif self.sort_type == MovieList.SORT_RECORDED_REVERSE: self.list = sorted(self.list[:numberOfDirs], key=self.buildBeginTimeSortKey, reverse = True) + sorted(self.list[numberOfDirs:], key=self.buildBeginTimeSortKey, reverse = True) elif self.sort_type == MovieList.SHUFFLE: dirlist = self.list[:numberOfDirs] shufflelist = self.list[numberOfDirs:] random.shuffle(shufflelist) self.list = dirlist + shufflelist elif self.sort_type == MovieList.SORT_ALPHA_DATE_OLDEST_FIRST: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaDateSortKey) + sorted(self.list[numberOfDirs:], key=self.buildAlphaDateSortKey) elif self.sort_type == MovieList.SORT_ALPHAREV_DATE_NEWEST_FIRST: self.list = sorted(self.list[:numberOfDirs], key=self.buildAlphaDateSortKey, reverse = True) + sorted(self.list[numberOfDirs:], key=self.buildAlphaDateSortKey, reverse = True) for x in self.list: if x[1]: tmppath = x[1].getName(x[0])[:-1] if x[1].getName(x[0]).endswith('/') else x[1].getName(x[0]) if tmppath.endswith('.Trash'): self.list.insert(0, self.list.pop(self.list.index(x))) break if self.root and numberOfDirs > 0: rootPath = os.path.normpath(self.root.getPath()) if not rootPath.endswith('/'): rootPath += '/' if rootPath != parent: # with new sort types directories may be in between files, so scan whole # list for parentDirectory index. Usually it is the first one anyway for index, item in enumerate(self.list): if item[0].flags & eServiceReference.mustDescent: itempath = os.path.normpath(item[0].getPath()) if not itempath.endswith('/'): itempath += '/' if itempath == rootPath: self.parentDirectory = index break self.root = root # finally, store a list of all tags which were found. these can be presented # to the user to filter the list # ML: Only use the tags that occur more than once in the list OR that were # really in the tag set of some file. # reverse the dictionary to see which unique movie each tag now references rtags = {} for tag, movies in tags.items(): if (len(movies) > 1) or (tag in realtags): movies = tuple(movies) # a tuple can be hashed, but a list not item = rtags.get(movies, []) if not item: rtags[movies] = item item.append(tag) self.tags = {} for movies, tags in rtags.items(): movie = movies[0] # format the tag lists so that they are in 'original' order tags.sort(key = movie.find) first = movie.find(tags[0]) last = movie.find(tags[-1]) + len(tags[-1]) match = movie start = 0 end = len(movie) # Check if the set has a complete sentence in common, and how far for m in movies[1:]: if m[start:end] != match: if not m.startswith(movie[:last]): start = first if not m.endswith(movie[first:]): end = last match = movie[start:end] if m[start:end] != match: match = '' break if match: self.tags[match] = set(tags) continue else: match = ' '.join(tags) if len(match) > 2: #Omit small words self.tags[match] = set(tags) def buildAlphaNumericSortKey(self, x): # x = ref,info,begin,... ref = x[0] name = x[1] and x[1].getName(ref) if ref.flags & eServiceReference.mustDescent: return 0, name and name.lower() or "", -x[2] return 1, name and name.lower() or "", -x[2] # as for buildAlphaNumericSortKey, but without negating dates def buildAlphaDateSortKey(self, x): # x = ref,info,begin,... ref = x[0] name = x[1] and x[1].getName(ref) if ref.flags & eServiceReference.mustDescent: return 0, name and name.lower() or "", x[2] return 1, name and name.lower() or "", x[2] def buildAlphaNumericFlatSortKey(self, x): # x = ref,info,begin,... ref = x[0] name = x[1] and x[1].getName(ref) if name and ref.flags & eServiceReference.mustDescent: # only use directory basename for sorting p = os.path.split(name) if not p[1]: # if path ends in '/', p is blank. p = os.path.split(p[0]) name = p[1] # print "Sorting for -%s-" % name return 1, name and name.lower() or "", -x[2] def buildBeginTimeSortKey(self, x): ref = x[0] if ref.flags & eServiceReference.mustDescent: return 0, x[1] and -os.stat(ref.getPath()).st_mtime return 1, -x[2] def buildGroupwiseSortkey(self, x): # Sort recordings by date, sort MP3 and stuff by name ref = x[0] if ref.type >= eServiceReference.idUser: return self.buildAlphaNumericSortKey(x) else: return self.buildBeginTimeSortKey(x) def moveTo(self, serviceref): index = self.findService(serviceref) if index is not None: self.instance.moveSelectionTo(index) return True return False def moveDown(self): self.instance.moveSelection(self.instance.moveDown) def moveUp(self): self.instance.moveSelection(self.instance.moveUp) def moveToChar(self, char, lbl=None): self._char = char self._lbl = lbl if lbl: lbl.setText(self._char) lbl.visible = True self.moveToCharTimer = eTimer() self.moveToCharTimer.callback.append(self._moveToChrStr) self.moveToCharTimer.start(1000, True) #time to wait for next key press to decide which letter to use... def moveToString(self, char, lbl=None): self._char = self._char + char.upper() self._lbl = lbl if lbl: lbl.setText(self._char) lbl.visible = True self.moveToCharTimer = eTimer() self.moveToCharTimer.callback.append(self._moveToChrStr) self.moveToCharTimer.start(1000, True) #time to wait for next key press to decide which letter to use... def _moveToChrStr(self): currentIndex = self.instance.getCurrentIndex() found = False if currentIndex < (len(self.list) - 1): itemsBelow = self.list[currentIndex + 1:] #first search the items below the selection for index, item in enumerate(itemsBelow): ref = item[0] itemName = getShortName(item[1].getName(ref).upper(), ref) if len(self._char) == 1 and itemName.startswith(self._char): found = True self.instance.moveSelectionTo(index + currentIndex + 1) break elif len(self._char) > 1 and itemName.find(self._char) >= 0: found = True self.instance.moveSelectionTo(index + currentIndex + 1) break if found == False and currentIndex > 0: itemsAbove = self.list[1:currentIndex] #first item (0) points parent folder - no point to include for index, item in enumerate(itemsAbove): ref = item[0] itemName = getShortName(item[1].getName(ref).upper(), ref) if len(self._char) == 1 and itemName.startswith(self._char): found = True self.instance.moveSelectionTo(index + 1) break elif len(self._char) > 1 and itemName.find(self._char) >= 0: found = True self.instance.moveSelectionTo(index + 1) break self._char = '' if self._lbl: self._lbl.visible = False
def buildHDDList(self, hd, isOfflineStorage=False, partitionNum=False): tot = used = free = 0 usedprc = '0%' devicedata = 'Capacity: 0 Used: 0 Free: 0 ' divpng = LoadPixmap(cached=True, path=resolveFilename( SCOPE_SKIN_IMAGE, 'skin_default/DEInfo/div-h-extended.png')) devicepng = onlinepng = None isOfflineStorageDevice = isOfflineStorage isConfiguredStorageDevice = isMountedPartition = isReadable = False uuid = currentMountpoint = partitionPath = partitionType = devicename = None hdd_description = device_info = '' numpart = 0 onlinepng = LoadPixmap( cached=True, path=resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/buttons/button_green_off.png')) hdd_description = hd.model() numpart = hd.numPartitions() if partitionNum is False: if numpart == 0: devicename = hd.device uuid = harddiskmanager.getPartitionUUID(devicename) partitionPath = hd.dev_path if numpart == 1: devicename = hd.device + str(numpart) uuid = harddiskmanager.getPartitionUUID(devicename) partitionPath = hd.partitionPath(str(numpart)) else: devicename = hd.device + str(partitionNum) uuid = harddiskmanager.getPartitionUUID(devicename) partitionPath = hd.partitionPath(str(partitionNum)) partitionType = harddiskmanager.getBlkidPartitionType(partitionPath) devicepng = LoadPixmap( resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/DEInfo/internal_hdd.png')) if hd.isRemovable: devicepng = LoadPixmap( resolveFilename(SCOPE_SKIN_IMAGE, 'skin_default/DEInfo/removable_dev.png')) device_info += hd.bus_description() + ' ' + _('Storage device') else: device_info += hd.bus_description() + ' ' + _('Hard disk') if uuid is not None: cfg_uuid = config.storage.get(uuid, None) if cfg_uuid is not None: if cfg_uuid['mountpoint'].value != '': currentMountpoint = cfg_uuid['mountpoint'].value if cfg_uuid['enabled'].value: isConfiguredStorageDevice = True p = harddiskmanager.getPartitionbyMountpoint( currentMountpoint) if p is not None: if p.mounted(): isMountedPartition = True if isMountedPartition: isReadable = True devicepng = LoadPixmap( resolveFilename( SCOPE_SKIN_IMAGE, 'skin_default/DEInfo/internal_hdd_mounted.png')) if hd.isRemovable: devicepng = LoadPixmap( resolveFilename( SCOPE_SKIN_IMAGE, 'skin_default/DEInfo/removable_dev_mounted.png')) device_info += ' - ' + currentMountpoint else: device_info += ' - not mounted' if currentMountpoint: for line in self.dfmounts: line = line.replace('part1', ' ') x = line.strip().split() if x[len(x) - 1].find( currentMountpoint.strip()) >= 0 and len(x) > 1: tot = int(x[0]) used = int(x[1]) free = int(x[2]) usedprc = x[3] devicedata = 'Capacity: %s Used: %s Free: %s ' % ( getUnit(tot), x[len(x) - 2], getUnit(free)) if usedprc: hdd_description += ' in use: %s' % usedprc return (hdd_description, hd, device_info, numpart, isOfflineStorageDevice, isMountedPartition, currentMountpoint, devicepng, onlinepng, divpng, partitionNum, isReadable, devicedata, tot, used, free, usedprc)
def __init__(self, session, title=_("Virtual KeyBoard Text:"), text="", maxSize=False, visible_width=False, type=Input.TEXT, currPos=0, allMarked=False): Screen.__init__(self, session) HelpableScreen.__init__(self) self.setTitle(_("Virtual keyboard")) prompt = title # Title should only be used for screen titles! self.key_bg = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_bg.png")) self.key_red_bg = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_red.png")) self.key_green_bg = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_green.png")) self.key_yellow_bg = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_yellow.png")) self.key_blue_bg = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_blue.png")) self.key_sel = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_sel.png")) self.key_backspace = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_backspace.png")) self.key_enter = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_enter.png")) self.key_first = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_first.png")) self.key_last = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_last.png")) self.key_left = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_left.png")) self.key_right = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_right.png")) self.key_shift0 = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_shift0.png")) self.key_shift1 = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_shift1.png")) self.key_shift2 = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_shift2.png")) self.key_shift3 = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_shift3.png")) self.key_space = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_space.png")) self.key_space_alt = LoadPixmap(path=resolveFilename(SCOPE_CURRENT_SKIN, "buttons/vkey_space_alt.png")) self.keyBackgrounds = { "EXIT": self.key_red_bg, "OK": self.key_green_bg, "SAVE": self.key_green_bg, "LOC": self.key_yellow_bg, "SHFT": self.key_blue_bg } self.keyImages = [{ "BACKSPACE": self.key_backspace, "ENTER": self.key_enter, "FIRST": self.key_first, "LAST": self.key_last, "LEFT": self.key_left, "RIGHT": self.key_right, "SHIFT": self.key_shift0, "SPACE": self.key_space_alt }, { "BACKSPACE": self.key_backspace, "ENTER": self.key_enter, "FIRST": self.key_first, "LAST": self.key_last, "LEFT": self.key_left, "RIGHT": self.key_right, "SHIFT": self.key_shift1, "SPACE": self.key_space_alt }, { "BACKSPACE": self.key_backspace, "ENTER": self.key_enter, "FIRST": self.key_first, "LAST": self.key_last, "LEFT": self.key_left, "RIGHT": self.key_right, "SHIFT": self.key_shift2, "SPACE": self.key_space_alt }, { "BACKSPACE": self.key_backspace, "ENTER": self.key_enter, "FIRST": self.key_first, "LAST": self.key_last, "LEFT": self.key_left, "RIGHT": self.key_right, "SHIFT": self.key_shift3, "SPACE": self.key_space_alt }] self.shiftMsgs = [ _("Lower case"), _("Upper case"), _("Special 1"), _("Special 2") ] self.english = [ [ [u"`", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"-", u"=", u"BACKSPACE"], [u"FIRST", u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"[", u"]", u"\\"], [u"LAST", u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u";", u"'", u"", u"ENTER"], [u"SHIFT", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", u".", u"/", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ], [ [u"~", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"*", u"(", u")", u"_", u"+", u"BACKSPACE"], [u"FIRST", u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"{", u"}", u"|"], [u"LAST", u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u":", u"\"", u"", u"ENTER"], [u"SHIFT", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u"<", u">", u"?", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ] ] self.french = [ [ [u"\u00B2", u"&", u"\u00E9", u"\"", u"'", u"(", u"-", u"\u00E8", u"_", u"\u00E7", u"\u00E0", u")", u"=", u"BACKSPACE"], [u"FIRST", u"a", u"z", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"$", u"[", u"]"], [u"LAST", u"q", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"m", u"\u00F9", u"*", u"ENTER"], [u"SHIFT", u"<", u"w", u"x", u"c", u"v", u"b", u"n", u",", u";", u":", u"!", u"\u20AC", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"#", u"@", u"`"] ], [ [u"", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"\u00B0", u"+", u"BACKSPACE"], [u"FIRST", u"A", u"Z", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"\u00A3", u"{", u"}"], [u"LAST", u"Q", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"M", u"%", u"\u00B5", u"ENTER"], [u"SHIFT", u">", u"W", u"X", u"C", u"V", u"B", u"N", u"?", u".", u"/", u"\u00A7", u"\u00A6", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"~", u"^", u"\\"] ], [ [u"", u"", u"\u00E2", u"\u00EA", u"\u00EE", u"\u00F4", u"\u00FB", u"\u00E4", u"\u00EB", u"\u00EF", u"\u00F6", u"\u00FC", u"", u"BACKSPACE"], [u"FIRST", u"", u"\u00E0", u"\u00E8", u"\u00EC", u"\u00F2", u"\u00F9", u"\u00E1", u"\u00E9", u"\u00ED", u"\u00F3", u"\u00FA", u"", u""], [u"LAST", u"", u"\u00C2", u"\u00CA", u"\u00CE", u"\u00D4", u"\u00DB", u"\u00C4", u"\u00CB", u"\u00CF", u"\u00D6", u"\u00DC", u"", u"ENTER"], [u"SHIFT", u"", u"\u00C0", u"\u00C8", u"\u00CC", u"\u00D2", u"\u00D9", u"\u00C1", u"\u00C9", u"\u00CD", u"\u00D3", u"\u00DA", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ] ] self.german = [ [ [u"", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"\u00DF", u"'", u"BACKSPACE"], [u"FIRST", u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"\u00FC", u"[", u"]"], [u"LAST", u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"\u00F6", u"\u00E4", u"+", U"ENTER"], [u"SHIFT", u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"#", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"|", u"\\", u"\u00B5"] ], [ [u"\u00B0", u"!", u"\"", u"\u00A7", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"?", u"`", u"BACKSPACE"], [u"FIRST", u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"\u00DC", u"{", u"}"], [u"LAST", u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"\u00D6", u"\u00C4", u"*", U"ENTER"], [u"SHIFT", u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"@", U"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"\u20AC", u"\u00B2", u"\u00B3"] ] ] self.russian = [ [ [u"\u0451", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"-", u"=", u"BACKSPACE"], [u"FIRST", u"\u0439", u"\u0446", u"\u0443", u"\u043A", u"\u0435", u"\u043D", u"\u0433", u"\u0448", u"\u0449", u"\u0437", u"\u0445", u"\u044A", u"\u00A7"], [u"LAST", u"\u0444", u"\u044B", u"\u0432", u"\u0430", u"\u043F", u"\u0440", u"\u043E", u"\u043B", u"\u0434", u"\u0436", u"\u044D", u"\\", u"ENTER"], [u"SHIFT", u"\u044F", u"\u0447", u"\u0441", u"\u043C", u"\u0438", u"\u0442", u"\u044C", u"\u0431", u"\u044E", u".", u"@", u"&", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"<"] ], [ [u"\u0401", u"!", u"\"", u"\u2116", u";", u"%", u":", u"?", u"*", u"(", u")", u"_", u"+", u"BACKSPACE"], [u"FIRST", u"\u0419", u"\u0426", u"\u0423", u"\u041A", u"\u0415", u"\u041D", u"\u0413", u"\u0428", u"\u0429", u"\u0417", u"\u0425", u"\u042A", u"\u20BD"], [u"LAST", u"\u0424", u"\u042B", u"\u0412", u"\u0410", u"\u041F", u"\u0420", u"\u041E", u"\u041B", u"\u0414", u"\u0416", u"\u042D", u"/", u"ENTER"], [u"SHIFT", u"\u042F", u"\u0427", u"\u0421", u"\u041C", u"\u0418", u"\u0422", u"\u042C", u"\u0411", u"\u042E", u",", u"#", u"$", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u">"] ] ] self.scandinavian = [ [ [u"\u00A7", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"+", u"@", u"BACKSPACE"], [u"FIRST", u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"\u00E5", u"[", u"]"], [u"LAST", u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"\u00F6", u"\u00E4", u"'", u"ENTER"], [u"SHIFT", u"<", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"\u00AB", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ], [ [u"\u00BD", u"!", u"\"", u"#", u"\u00A4", u"%", u"&", u"/", u"(", u")", u"=", u"?", u"|", u"BACKSPACE"], [u"FIRST", u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"\u00C5", u"{", u"}"], [u"LAST", u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"\u00D6", u"\u00C4", u"*", u"ENTER"], [u"SHIFT", u">", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"\u00BB", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ], [ [u"", u"\u00E2", u"\u00EA", u"\u00EE", u"\u00F4", u"\u00FB", u"\u00E4", u"\u00EB", u"\u00EF", u"\u00F6", u"\u00FC", u"\u00E3", u"\u00F5", u"BACKSPACE"], [u"FIRST", u"\u00E0", u"\u00E8", u"\u00EC", u"\u00F2", u"\u00F9", u"\u00E1", u"\u00E9", u"\u00ED", u"\u00F3", u"\u00FA", u"", u"", u""], [u"LAST", u"\u00C2", u"\u00CA", u"\u00CE", u"\u00D4", u"\u00DB", u"\u00C4", u"\u00CB", u"\u00CF", u"\u00D6", u"\u00DC", u"\u00C3", u"\u00D5", u"ENTER"], [u"SHIFT", u"\u00C0", u"\u00C8", u"\u00CC", u"\u00D2", u"\u00D9", u"\u00C1", u"\u00C9", u"\u00CD", u"\u00D3", u"\u00DA", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ] ] self.spanish = [ [ [u"\\", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"'", u"\u00A1", u"BACKSPACE"], [u"FIRST", u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"@", u"+", u"\u00E7"], [u"LAST", u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"\u00F1", u"[", u"]", u"ENTER"], [u"SHIFT", u"<", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"\u20AC", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"", u"\u00E1", u"\u00E9", u"\u00ED", u"\u00F3", u"\u00FA", u"\u00FC"] ], [ [u"|", u"!", u"\"", u"\u00B7", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"?", u"\u00BF", u"BACKSPACE"], [u"FIRST", u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"#", u"*", u"\u00C7"], [u"LAST", u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"\u00D1", u"{", u"}", u"ENTER"], [u"SHIFT", u">", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"\u00AC", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"", u"\u00C1", u"\u00C9", u"\u00CD", u"\u00D3", u"\u00DA", u"\u00DC"] ] ] self.locales = { "ar_BH": [_("Arabic"), _("Bahrain"), self.arabic(self.english)], "ar_EG": [_("Arabic"), _("Egypt"), self.arabic(self.english)], "ar_JO": [_("Arabic"), _("Jordan"), self.arabic(self.english)], "ar_KW": [_("Arabic"), _("Kuwait"), self.arabic(self.english)], "ar_LB": [_("Arabic"), _("Lebanon"), self.arabic(self.english)], "ar_OM": [_("Arabic"), _("Oman"), self.arabic(self.english)], "ar_QA": [_("Arabic"), _("Qatar"), self.arabic(self.english)], "ar_SA": [_("Arabic"), _("Saudi Arabia"), self.arabic(self.english)], "ar_SY": [_("Arabic"), _("Syrian Arab Republic"), self.arabic(self.english)], "ar_AE": [_("Arabic"), _("United Arab Emirates"), self.arabic(self.english)], "ar_YE": [_("Arabic"), _("Yemen"), self.arabic(self.english)], "cs_CZ": [_("Czech"), _("Czechia"), [ [ [u";", u"+", u"\u011B", u"\u0161", u"\u010D", u"\u0159", u"\u017E", u"\u00FD", u"\u00E1", u"\u00ED", u"\u00E9", u"=", u"", u"BACKSPACE"], [u"FIRST", u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"\u00FA", u")", u""], [u"LAST", u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"\u016F", u"\u00A7", u"", u"ENTER"], [u"SHIFT", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"\u0148", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ], [ [u"", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"%", u"", u"BACKSPACE"], [u"FIRST", u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"/", u"(", u""], [u"LAST", u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"\"", u"!", u"'", u"ENTER"], [u"SHIFT", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u"?", u":", u"_", u"\u0147", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ], [ [u"", u"~", u"\u011A", u"\u0160", u"\u010C", u"\u0158", u"\u017D", u"\u00DD", u"\u00C1", u"\u00CD", u"\u00C9", u"`", u"", u"BACKSPACE"], [u"FIRST", u"\\", u"|", u"\u20AC", u"\u0165", u"\u0164", u"", u"", u"", u"\u00F3", u"\u00D3", u"\u00DA", u"\u00F7", u"\u00D7"], [u"LAST", u"", u"\u0111", u"\u00D0", u"[", u"]", u"\u010F", u"\u010E", u"\u0142", u"\u0141", u"\u016E", u"$", u"\u00DF", u"ENTER"], [u"SHIFT", u"", u"#", u"&", u"@", u"{", u"}", u"", u"<", u">", u"*", u"", u"\u00A4", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ] ]], "nl_NL": [_("Dutch"), _("Netherlands"), self.dutch(self.english)], "en_AU": [_("English"), _("Australian"), self.australian(self.english)], "en_GB": [_("English"), _("United Kingdom"), self.unitedKingdom(self.english)], "en_US": [_("English"), _("United States"), self.english], "en_EN": [_("English"), _("Various"), self.english], "et_EE": [_("Estonian"), _("Estonia"), self.estonian(self.scandinavian)], "fi_FI": [_("Finnish"), _("Finland"), self.finnish(self.scandinavian)], "fr_BE": [_("French"), _("Belgian"), self.belgian(self.french)], "fr_FR": [_("French"), _("France"), self.french], "de_DE": [_("German"), _("Germany"), self.german], "el_GR": [_("Greek (Modern)"), _("Greece"), [ [ [u"`", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"-", u"=", u"BACKSPACE"], [u"FIRST", u";", u"\u03C2", u"\u03B5", u"\u03C1", u"\u03C4", u"\u03C5", u"\u03B8", u"\u03B9", u"\u03BF", u"\u03C0", u"[", u"]", u"/"], [u"LAST", u"\u03B1", u"\u03C3", u"\u03B4", u"\u03C6", u"\u03B3", u"\u03B7", u"\u03BE", u"\u03BA", u"\u03BB", u"", u"'", u"\\", u"ENTER"], [u"SHIFT", u"<", u"\u03B6", u"\u03C7", u"\u03C8", u"\u03C9", u"\u03B2", u"\u03BD", u"\u03BC", u",", ".", u"\u03CA", u"\u03CB", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"\u03AC", u"\u03AD", u"\u03AE", u"\u03AF", u"\u03CC", u"\u03CD", u"\u03CE"] ], [ [u"~", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"*", u"(", u")", u"_", u"+", u"BACKSPACE"], [u"FIRST", u":", u"", u"\u0395", u"\u03A1", u"\u03A4", u"\u03A5", u"\u0398", u"\u0399", u"\u039F", u"\u03A0", u"{", u"}", u"?"], [u"LAST", u"\u0391", u"\u03A3", u"\u0394", u"\u03A6", u"\u0393", u"\u0397", u"\u039E", u"\u039A", u"\u039B", u"", u"\"", u"|", u"ENTER"], [u"SHIFT", u">", u"\u0396", u"\u03A7", u"\u03A8", u"\u03A9", u"\u0392", u"\u039D", u"\u039C", u"<", u">", u"\u03AA", u"\u03AB", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"\u0386", u"\u0388", u"\u0389", u"\u038A", u"\u038C", u"\u038E", u"\u038F"] ], [ [u"", u"", u"\u00B2", u"\u00B3", u"\u00A3", u"\u00A7", u"\u00B6", u"\u20AC", u"\u00A4", u"\u00A6", u"\u00B0", u"\u00B1", u"\u00BD", u"BACKSPACE"], [u"FIRST", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u""], [u"LAST", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"ENTER"], [u"SHIFT", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ] ]], "lv_LV": [_("Latvian"), _("Latvia"), self.latvian(self.english)], "lt_LT": [_("Lithuanian"), _("Lithuania"), self.lithuanian(self.english)], "nb_NO": [_("Norwegian"), _("Norway"), self.norwegian(self.scandinavian)], "fa_IR": [_("Persian"), _("Iran, Islamic Republic"), self.persian(self.english)], "pl_PL": [_("Polish"), _("Poland"), self.polish(self.english)], "ru_RU": [_("Russian"), _("Russian Federation"), self.russian], "sk_SK": [_("Slovak"), _("Slovakia"), [ [ [u"~", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"*", u"(", u")", u"\u00E1", u"\u00E4", u"BACKSPACE"], [u"FIRST", u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"\u010D", u"\u010F", u"\u00E9"], [u"LAST", u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"\u00ED", u"\u013A", u"\u013E", u"ENTER"], [u"SHIFT", u"<", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"\u0148", u"\u00F3", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"\u00F4", u"\u0155", u"\u0161", u"\u0165", u"\u00FA", u"\u00FD", u"\u017E"] ], [ [u"`", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"\u00C1", u"\u00C4", u"BACKSPACE"], [u"FIRST", u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"\u010C", u"\u010E", u"\u00C9"], [u"LAST", u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"\u00CD", u"\u0139", u"\u013D", u"ENTER"], [u"SHIFT", u">", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u"?", u":", u"\u0147", u"\u00D3", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE", u"\u00D4", u"\u0154", u"\u0160", u"\u0164", u"\u00DA", u"\u00DD", u"\u017D"] ], [ [u"", u"", u"\u00A7", u"\u00B0", u"\u00A4", u"\u20AC", u"\u00DF", u"\u0111", u"\u0110", u"\u0142", u"\u0141", u"", u"", u"BACKSPACE"], [u"FIRST", u"", u"", u"'", u"\"", u"+", u"-", u"\u00D7", u"\u00F7", u"=", u"_", u"~", u"", u""], [u"LAST", u"", u"", u"/", u"\\", u";", u"[", u"]", u"{", u"}", u"|", u"", u"", u"ENTER"], [u"SHIFT", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ] ]], "es_ES": [_("Spanish"), _("Spain"), self.spanish], "sv_SE": [_("Swedish"), _("Sweden"), self.swedish(self.scandinavian)], "th_TH": [_("Thai"), _("Thailand"), [ [ [u"", u"", u"\u0E45", u"\u0E20", u"\u0E16", u"\u0E38", u"\u0E36", u"\u0E04", u"\u0E15", u"\u0E08", u"\u0E02", u"\u0E0A", u"", u"BACKSPACE"], [u"FIRST", u"\u0E46", u"\u0E44", u"\u0E33", u"\u0E1E", u"\u0E30", u"\u0E31", u"\u0E35", u"\u0E23", u"\u0E19", u"\u0E22", u"\u0E1A", u"\u0E25", u""], [u"LAST", u"\u0E1F", u"\u0E2B", u"\u0E01", u"\u0E14", u"\u0E40", u"\u0E49", u"\u0E48", u"\u0E32", u"\u0E2A", u"\u0E27", u"\u0E07", u"\u0E03", u"OK"], [u"SHIFT", u"\u0E1C", u"\u0E1B", u"\u0E41", u"\u0E2D", u"\u0E34", u"\u0E37", u"\u0E17", u"\u0E21", u"\u0E43", u"\u0E1D", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ], [ [u"", u"", u"\u0E51", u"\u0E52", u"\u0E53", u"\u0E54", u"\u0E39", u"\u0E55", u"\u0E56", u"\u0E57", u"\u0E58", u"\u0E59", u"", u"BACKSPACE"], [u"FIRST", u"\u0E50", u"", u"\u0E0E", u"\u0E11", u"\u0E18", u"\u0E4D", u"\u0E4A", u"\u0E13", u"\u0E2F", u"\u0E0D", u"\u0E10", u"\u0E05", u""], [u"LAST", u"\u0E24", u"\u0E06", u"\u0E0F", u"\u0E42", u"\u0E0C", u"\u0E47", u"\u0E4B", u"\u0E29", u"\u0E28", u"\u0E0B", u"", u"\u0E3F", u"OK"], [u"SHIFT", u"", u"", u"\u0E09", u"\u0E2E", u"\u0E3A", u"\u0E4C", u"", u"\u0E12", u"\u0E2C", u"\u0E26", u"", u"", u"SHIFT"], [u"EXIT", u"LOC", u"LEFT", u"RIGHT", u"ALL", u"CLR", u"SPACE"] ] ]], "uk_UA": [_("Ukrainian"), _("Ukraine"), self.ukranian(self.russian)] } self["actions"] = HelpableNumberActionMap(self, "VirtualKeyBoardActions", { "cancel": (self.cancel, _("Cancel any text changes and exit")), "save": (self.save, _("Save any text changes and exit")), "locale": (self.localeMenu, _("Select the virtual keyboard locale from a menu")), "shift": (self.shiftClicked, _("Select the virtual keyboard shifted character set")), "select": (self.processSelect, _("Select the character or action under the virtual keyboard cursor")), "up": (self.up, _("Move the virtual keyboard cursor up")), "left": (self.left, _("Move the virtual keyboard cursor left")), "right": (self.right, _("Move the virtual keyboard cursor right")), "down": (self.down, _("Move the virtual keyboard cursor down")), "first": (self.cursorFirst, _("Move the text buffer cursor to the first character")), "prev": (self.cursorLeft, _("Move the text buffer cursor left")), "next": (self.cursorRight, _("Move the text buffer cursor right")), "last": (self.cursorLast, _("Move the text buffer cursor to the last character")), "toggleOverwrite": (self.keyToggleOW, _("Toggle new text inserts before or overwrites existing text")), "backspace": (self.backClicked, _("Delete the character to the left of text buffer cursor")), "delete": (self.forwardClicked, _("Delete the character under the text buffer cursor")), "1": (self.keyNumberGlobal, _("Number or SMS style data entry")), "2": (self.keyNumberGlobal, _("Number or SMS style data entry")), "3": (self.keyNumberGlobal, _("Number or SMS style data entry")), "4": (self.keyNumberGlobal, _("Number or SMS style data entry")), "5": (self.keyNumberGlobal, _("Number or SMS style data entry")), "6": (self.keyNumberGlobal, _("Number or SMS style data entry")), "7": (self.keyNumberGlobal, _("Number or SMS style data entry")), "8": (self.keyNumberGlobal, _("Number or SMS style data entry")), "9": (self.keyNumberGlobal, _("Number or SMS style data entry")), "0": (self.keyNumberGlobal, _("Number or SMS style data entry")), "gotAsciiCode": (self.keyGotAscii, _("Keyboard data entry")) }, -2, description=_("Virtual KeyBoard Functions")) self.lang = language.getLanguage() self["prompt"] = Label(prompt) self["text"] = Input(text=text, maxSize=maxSize, visible_width=visible_width, type=type, currPos=len(text.decode("utf-8", "ignore")), allMarked=allMarked) self["list"] = VirtualKeyBoardList([]) self["mode"] = Label(_("INS")) self["locale"] = Label(_("Locale") + ": " + self.lang) self["language"] = Label(_("Language") + ": " + self.lang) self["key_info"] = StaticText(_("INFO")) self["key_red"] = StaticText(_("Exit")) self["key_green"] = StaticText(_("Save")) self["key_yellow"] = StaticText(_("Select locale")) self["key_blue"] = StaticText(self.shiftMsgs[1]) self["key_help"] = StaticText(_("HELP")) width, self.height = skin.parameters.get("VirtualKeyBoard", (45, 45)) self.width = self.key_bg and self.key_bg.size().width() or width self.shiftColors = skin.parameters.get("VirtualKeyBoardShiftColors", (0x00ffffff, 0x00ffffff, 0x0000ffff, 0x00ff00ff)) # Ensure there is a color for each shift level! self.language = None self.location = None self.keyList = [] self.shiftLevels = 0 self.shiftLevel = 0 self.keyboardWidth = 0 self.keyboardHeight = 0 self.maxKey = 0 self.overwrite = False self.selectedKey = None self.sms = NumericalTextInput(self.smsGotChar) self.smsChar = None self.setLocale() self.onExecBegin.append(self.setKeyboardModeAscii) self.onLayoutFinish.append(self.buildVirtualKeyBoard)
def updateIcon(self, path): if isinstance(self.iconstr, str): self.icon = LoadPixmap('/'.join((path, self.iconstr))) else: self.icon = None
def BuildNetworkShareEntry(self, share): if os_path.exists( resolveFilename(SCOPE_ACTIVE_SKIN, "networkbrowser/verticalLine.png")): verticallineIcon = LoadPixmap( cached=True, path=resolveFilename(SCOPE_ACTIVE_SKIN, "networkbrowser/verticalLine.png")) else: verticallineIcon = LoadPixmap( cached=True, path=resolveFilename( SCOPE_PLUGINS, "SystemPlugins/NetworkBrowser/icons/verticalLine.png")) sharetype = share[0] localsharename = share[1] sharehost = share[2] if sharetype == 'smbShare': sharedir = share[3] sharedescription = share[5] else: sharedir = share[4] sharedescription = share[3] if sharetype == 'nfsShare': if os_path.exists( resolveFilename(SCOPE_ACTIVE_SKIN, "networkbrowser/i-nfs.png")): newpng = LoadPixmap(cached=True, path=resolveFilename( SCOPE_ACTIVE_SKIN, "networkbrowser/i-nfs.png")) else: newpng = LoadPixmap( cached=True, path=resolveFilename( SCOPE_PLUGINS, "SystemPlugins/NetworkBrowser/icons/i-nfs.png")) else: if os_path.exists( resolveFilename(SCOPE_ACTIVE_SKIN, "networkbrowser/i-smb.png")): newpng = LoadPixmap(cached=True, path=resolveFilename( SCOPE_ACTIVE_SKIN, "networkbrowser/i-smb.png")) else: newpng = LoadPixmap( cached=True, path=resolveFilename( SCOPE_PLUGINS, "SystemPlugins/NetworkBrowser/icons/i-smb.png")) self.isMounted = False for sharename, sharedata in self.mounts.items(): if sharedata['ip'] == sharehost: if sharetype == 'nfsShare' and sharedata['mounttype'] == 'nfs': sharedir = sharedir.replace('/', '') if sharedir.endswith(sharedata['sharedir']): if sharedata["isMounted"] is True: self.isMounted = True if sharetype == 'smbShare' and sharedata['mounttype'] == 'cifs': if sharedir.endswith(sharedata['sharedir']): if sharedata["isMounted"] is True: self.isMounted = True if self.isMounted is True: if os_path.exists( resolveFilename(SCOPE_ACTIVE_SKIN, "networkbrowser/ok.png")): isMountedpng = LoadPixmap(cached=True, path=resolveFilename( SCOPE_ACTIVE_SKIN, "networkbrowser/ok.png")) else: isMountedpng = LoadPixmap( cached=True, path=resolveFilename( SCOPE_PLUGINS, "SystemPlugins/NetworkBrowser/icons/ok.png")) else: if os_path.exists( resolveFilename(SCOPE_ACTIVE_SKIN, "networkbrowser/cancel.png")): isMountedpng = LoadPixmap(cached=True, path=resolveFilename( SCOPE_ACTIVE_SKIN, "networkbrowser/cancel.png")) else: isMountedpng = LoadPixmap( cached=True, path=resolveFilename( SCOPE_PLUGINS, "SystemPlugins/NetworkBrowser/icons/cancel.png")) return ((share, verticallineIcon, None, sharedir, sharedescription, newpng, isMountedpng, self.isMounted))
class MovieList(GUIComponent): SORT_ALPHANUMERIC = 1 SORT_RECORDED = 2 SHUFFLE = 3 SORT_ALPHANUMERIC_REVERSE = 4 SORT_RECORDED_REVERSE = 5 SORT_ALPHANUMERIC_FLAT = 6 SORT_ALPHANUMERIC_FLAT_REVERSE = 7 SORT_GROUPWISE = 8 LISTTYPE_ORIGINAL = 1 LISTTYPE_COMPACT_DESCRIPTION = 2 LISTTYPE_COMPACT = 3 LISTTYPE_MINIMAL = 4 HIDE_DESCRIPTION = 1 SHOW_DESCRIPTION = 2 def __init__(self, root, list_type=None, sort_type=None, descr_state=None): GUIComponent.__init__(self) self.list = [] self.list_type = list_type or self.LISTTYPE_MINIMAL self.descr_state = descr_state or self.HIDE_DESCRIPTION self.sort_type = sort_type or self.SORT_GROUPWISE self.firstFileEntry = 0 self.parentDirectory = 0 self.fontName = "Regular" self.fontSizesOriginal = (22,18,16) self.fontSizesCompact = (20,14) self.fontSizesMinimal = (20,16) self.itemHeights = (75,37,25) self.pbarShift = 5 self.pbarHeight = 16 self.pbarLargeWidth = 48 self.partIconeShiftMinimal = 5 self.partIconeShiftCompact = 4 self.partIconeShiftOriginal = 5 self.spaceRight = 2 self.spaceIconeText = 2 self.iconsWidth = 22 self.trashShift = 1 self.dirShift = 1 self.columnsOriginal = (180,200) self.columnsCompactDescription = (120,140,154) self.compactColumn = 200 self.treeDescription = 165 self.reloadDelayTimer = None self.l = eListboxPythonMultiContent() self.tags = set() self.root = None self._playInBackground = None self._char = '' if root is not None: self.reload(root) self.l.setBuildFunc(self.buildMovieListEntry) self.onSelectionChanged = [ ] self.iconPart = [] for part in range(5): self.iconPart.append(LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/part_%d_4.png" % part))) self.iconMovieRec = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/part_new.png")) self.iconMoviePlay = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/movie_play.png")) self.iconMoviePlayRec = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/movie_play_rec.png")) self.iconUnwatched = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/part_unwatched.png")) self.iconFolder = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/folder.png")) self.iconTrash = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/trashcan.png")) self.runningTimers = {} self.updateRecordings() def get_playInBackground(self): return self._playInBackground def set_playInBackground(self, value): if self._playInBackground is not value: index = self.findService(self._playInBackground) if index is not None: self.invalidateItem(index) self.l.invalidateEntry(index) index = self.findService(value) if index is not None: self.invalidateItem(index) self.l.invalidateEntry(index) self._playInBackground = value playInBackground = property(get_playInBackground, set_playInBackground) def updateRecordings(self, timer=None): if timer is not None: if timer.justplay: return result = {} for timer in NavigationInstance.instance.RecordTimer.timer_list: if timer.isRunning() and not timer.justplay: result[os.path.split(timer.Filename)[1]+'.ts'] = timer if self.runningTimers == result: return self.runningTimers = result if timer is not None: if self.reloadDelayTimer is not None: self.reloadDelayTimer.stop() self.reloadDelayTimer = eTimer() self.reloadDelayTimer.callback.append(self.reload) self.reloadDelayTimer.start(5000, 1) def connectSelChanged(self, fnc): if not fnc in self.onSelectionChanged: self.onSelectionChanged.append(fnc) def disconnectSelChanged(self, fnc): if fnc in self.onSelectionChanged: self.onSelectionChanged.remove(fnc) def selectionChanged(self): for x in self.onSelectionChanged: x() def setListType(self, type): if type != self.list_type: self.list_type = type self.redrawList() def setDescriptionState(self, val): self.descr_state = val def setSortType(self, type): self.sort_type = type def applySkin(self, desktop, parent): def warningWrongSkinParameter(string): print "[MovieList] wrong '%s' skin parameters" % string def fontName(value): self.fontName = value def fontSizesOriginal(value): self.fontSizesOriginal = map(int, value.split(",")) if len(self.fontSizesOriginal) != 3: warningWrongSkinParameter(attrib) def fontSizesCompact(value): self.fontSizesCompact = map(int, value.split(",")) if len(self.fontSizesCompact) != 2: warningWrongSkinParameter(attrib) def fontSizesMinimal(value): self.fontSizesMinimal = map(int, value.split(",")) if len(self.fontSizesMinimal) != 2: warningWrongSkinParameter(attrib) def itemHeights(value): self.itemHeights = map(int, value.split(",")) if len(self.itemHeights) != 3: warningWrongSkinParameter(attrib) def pbarShift(value): self.pbarShift = int(value) def pbarHeight(value): self.pbarHeight = int(value) def pbarLargeWidth(value): self.pbarLargeWidth = int(value) def partIconeShiftMinimal(value): self.partIconeShiftMinimal = int(value) def partIconeShiftCompact(value): self.partIconeShiftCompact = int(value) def partIconeShiftOriginal(value): self.partIconeShiftOriginal = int(value) def spaceIconeText(value): self.spaceIconeText = int(value) def iconsWidth(value): self.iconsWidth = int(value) def trashShift(value): self.trashShift = int(value) def dirShift(value): self.dirShift = int(value) def spaceRight(value): self.spaceRight = int(value) def columnsOriginal(value): self.columnsOriginal = map(int, value.split(",")) if len(self.columnsOriginal) != 2: warningWrongSkinParameter(attrib) def columnsCompactDescription(value): self.columnsCompactDescription = map(int, value.split(",")) if len(self.columnsCompactDescription) != 3: warningWrongSkinParameter(attrib) def compactColumn(value): self.compactColumn = int(value) def treeDescription(value): self.treeDescription = int(value) for (attrib, value) in self.skinAttributes[:]: try: locals().get(attrib)(value) self.skinAttributes.remove((attrib, value)) except: pass self.redrawList() return GUIComponent.applySkin(self, desktop, parent) def redrawList(self): if self.list_type == MovieList.LISTTYPE_ORIGINAL: for i in range(3): self.l.setFont(i, gFont(self.fontName, self.fontSizesOriginal[i])) self.itemHeight = self.itemHeights[0] elif self.list_type == MovieList.LISTTYPE_COMPACT_DESCRIPTION or self.list_type == MovieList.LISTTYPE_COMPACT: for i in range(2): self.l.setFont(i, gFont(self.fontName, self.fontSizesCompact[i])) self.itemHeight = self.itemHeights[1] else: for i in range(2): self.l.setFont(i, gFont(self.fontName, self.fontSizesMinimal[i])) self.itemHeight = self.itemHeights[2] self.l.setItemHeight(self.itemHeight) def invalidateItem(self, index): x = self.list[index] self.list[index] = (x[0], x[1], x[2], None) def invalidateCurrentItem(self): self.invalidateItem(self.getCurrentIndex()) def buildMovieListEntry(self, serviceref, info, begin, data): width = self.l.getItemSize().width() iconSize = self.iconsWidth space = self.spaceIconeText r = self.spaceRight pathName = serviceref.getPath() res = [ None ] if serviceref.flags & eServiceReference.mustDescent: # Directory # Name is full path name valign_center = 0 if self.list_type == MovieList.LISTTYPE_MINIMAL: valign_center = RT_VALIGN_CENTER x = iconSize + space tn = self.treeDescription if info is None: # Special case: "parent" txt = ".." else: p = os.path.split(pathName) if not p[1]: # if path ends in '/', p is blank. p = os.path.split(p[0]) txt = p[1] if txt == ".Trash": res.append(MultiContentEntryPixmapAlphaTest(pos=(0,self.trashShift), size=(iconSize,self.iconTrash.size().height()), png=self.iconTrash)) res.append(MultiContentEntryText(pos=(x, 0), size=(width-x-tn-r, self.itemHeight), font = 0, flags = RT_HALIGN_LEFT|valign_center, text = _("Deleted items"))) res.append(MultiContentEntryText(pos=(width-tn-r, 0), size=(tn, self.itemHeight), font=1, flags=RT_HALIGN_RIGHT|valign_center, text=_("Trash can"))) return res res.append(MultiContentEntryPixmapAlphaTest(pos=(0,self.dirShift), size=(iconSize,iconSize), png=self.iconFolder)) res.append(MultiContentEntryText(pos=(x, 0), size=(width-x-tn-r, self.itemHeight), font = 0, flags = RT_HALIGN_LEFT|valign_center, text = txt)) res.append(MultiContentEntryText(pos=(width-tn-r, 0), size=(tn, self.itemHeight), font=1, flags=RT_HALIGN_RIGHT|valign_center, text=_("Directory"))) return res if (data == -1) or (data is None): data = MovieListData() cur_idx = self.l.getCurrentSelectionIndex() x = self.list[cur_idx] # x = ref,info,begin,... if config.usage.load_length_of_movies_in_moviellist.value: data.len = x[1].getLength(x[0]) #recalc the movie length... else: data.len = 0 #dont recalc movielist to speedup loading the list self.list[cur_idx] = (x[0], x[1], x[2], data) #update entry in list... so next time we don't need to recalc data.txt = info.getName(serviceref) if config.movielist.hide_extensions.value: fileName, fileExtension = os.path.splitext(data.txt) if fileExtension in KNOWN_EXTENSIONS: data.txt = fileName data.icon = None data.part = None if os.path.split(pathName)[1] in self.runningTimers: if self.playInBackground and serviceref == self.playInBackground: data.icon = self.iconMoviePlayRec else: data.icon = self.iconMovieRec elif self.playInBackground and serviceref == self.playInBackground: data.icon = self.iconMoviePlay else: switch = config.usage.show_icons_in_movielist.value data.part = moviePlayState(pathName + '.cuts', serviceref, data.len) if switch == 'i': if data.part is None: if config.usage.movielist_unseen.value: data.icon = self.iconUnwatched else: data.icon = self.iconPart[data.part // 25] elif switch == 'p' or switch == 's': if data.part is None: if config.usage.movielist_unseen.value: data.part = 0 data.partcol = 0x808080 else: data.partcol = 0xf0f0f0 service = ServiceReference(info.getInfoString(serviceref, iServiceInformation.sServiceref)) if service is None: data.serviceName = None else: data.serviceName = service.getServiceName() data.description = info.getInfoString(serviceref, iServiceInformation.sDescription) len = data.len if len > 0: len = "%d:%02d" % (len / 60, len % 60) else: len = "" if data.icon is not None: if self.list_type in (MovieList.LISTTYPE_COMPACT_DESCRIPTION,MovieList.LISTTYPE_COMPACT): pos = (0,self.partIconeShiftCompact) elif self.list_type == MovieList.LISTTYPE_ORIGINAL: pos = (0,self.partIconeShiftOriginal) else: pos = (0,self.partIconeShiftMinimal) res.append(MultiContentEntryPixmapAlphaTest(pos=pos, size=(iconSize,data.icon.size().height()), png=data.icon)) switch = config.usage.show_icons_in_movielist.value if switch in ('p', 's'): if switch == 'p': iconSize = self.pbarLargeWidth if data.part is not None: res.append(MultiContentEntryProgress(pos=(0,self.pbarShift), size=(iconSize, self.pbarHeight), percent=data.part, borderWidth=2, foreColor=data.partcol, foreColorSelected=None, backColor=None, backColorSelected=None)) elif switch == 'i': pass else: iconSize = 0 begin_string = "" if begin > 0: begin_string = ', '.join(FuzzyTime(begin, inPast = True)) ih = self.itemHeight if self.list_type == MovieList.LISTTYPE_ORIGINAL: fc, sc = self.columnsOriginal[0], self.columnsOriginal[1] ih1 = (ih * 2) / 5 # 75 -> 30 ih2 = (ih * 2) / 3 # 75 -> 50 res.append(MultiContentEntryText(pos=(iconSize+space, 0), size=(width-fc-r, ih1), font = 0, flags = RT_HALIGN_LEFT, text=data.txt)) if self.tags: res.append(MultiContentEntryText(pos=(width-fc-r, 0), size=(fc, ih1), font = 2, flags = RT_HALIGN_RIGHT, text = info.getInfoString(serviceref, iServiceInformation.sTags))) if data.serviceName: res.append(MultiContentEntryText(pos=(sc-r, ih2), size=(sc, ih2-ih1), font = 1, flags = RT_HALIGN_LEFT, text = data.serviceName)) else: if data.serviceName: res.append(MultiContentEntryText(pos=(width-fc-r, 0), size=(fc, ih1), font = 2, flags = RT_HALIGN_RIGHT, text = data.serviceName)) res.append(MultiContentEntryText(pos=(0, ih1), size=(width-r, ih2-ih1), font=1, flags=RT_HALIGN_LEFT, text=data.description)) res.append(MultiContentEntryText(pos=(0, ih2), size=(sc-r, ih-ih2), font=1, flags=RT_HALIGN_LEFT, text=begin_string)) if len: res.append(MultiContentEntryText(pos=(width-sc-r, ih2), size=(sc, ih-ih2), font=1, flags=RT_HALIGN_RIGHT, text=len)) elif self.list_type == MovieList.LISTTYPE_COMPACT_DESCRIPTION: ih1 = ((ih * 8) + 14) / 15 # 37 -> 20, round up if len: lenSize = 58 * ih / 37 else: lenSize = 0 fc, sc, tc = self.columnsCompactDescription[0], self.columnsCompactDescription[1], self.columnsCompactDescription[2] res.append(MultiContentEntryText(pos=(iconSize+space, 0), size=(width-sc-r, ih1), font = 0, flags = RT_HALIGN_LEFT, text = data.txt)) res.append(MultiContentEntryText(pos=(0, ih1), size=(width-tc-lenSize-r, ih-ih1), font=1, flags=RT_HALIGN_LEFT, text=data.description)) res.append(MultiContentEntryText(pos=(width-fc-r, 6), size=(fc, ih1), font=1, flags=RT_HALIGN_RIGHT, text=begin_string)) if data.serviceName: res.append(MultiContentEntryText(pos=(width-tc-lenSize-r, ih1), size=(tc, ih-ih1), font = 1, flags = RT_HALIGN_RIGHT, text = data.serviceName)) if lenSize: res.append(MultiContentEntryText(pos=(width-lenSize-r, ih1), size=(lenSize, ih-ih1), font=1, flags=RT_HALIGN_RIGHT, text=len)) elif self.list_type == MovieList.LISTTYPE_COMPACT: col = self.compactColumn ih1 = ((ih * 8) + 14) / 15 # 37 -> 20, round up if len: lenSize = 2 * ih else: lenSize = 0 res.append(MultiContentEntryText(pos=(iconSize+space, 0), size=(width-lenSize-iconSize-space-r, ih1), font = 0, flags = RT_HALIGN_LEFT, text = data.txt)) if self.tags: res.append(MultiContentEntryText(pos=(width-col-r, ih1), size=(col, ih-ih1), font = 1, flags = RT_HALIGN_RIGHT, text = info.getInfoString(serviceref, iServiceInformation.sTags))) if data.serviceName: res.append(MultiContentEntryText(pos=(col, ih1), size=(col, ih-ih1), font = 1, flags = RT_HALIGN_LEFT, text = data.serviceName)) else: if data.serviceName: res.append(MultiContentEntryText(pos=(width-col-r, ih1), size=(col, ih-ih1), font = 1, flags = RT_HALIGN_RIGHT, text = data.serviceName)) res.append(MultiContentEntryText(pos=(0, ih1), size=(col, ih-ih1), font=1, flags=RT_HALIGN_LEFT, text=begin_string)) if lenSize: res.append(MultiContentEntryText(pos=(width-lenSize-r, 0), size=(lenSize, ih1), font=0, flags=RT_HALIGN_RIGHT, text=len)) else: if (self.descr_state == MovieList.SHOW_DESCRIPTION) or not len: dateSize = ih * 145 / 25 # 25 -> 145 res.append(MultiContentEntryText(pos=(iconSize+space, 0), size=(width-iconSize-space-dateSize-r, ih), font = 0, flags = RT_HALIGN_LEFT|RT_VALIGN_CENTER, text = data.txt)) res.append(MultiContentEntryText(pos=(width-dateSize-r, 4), size=(dateSize, ih), font=1, flags=RT_HALIGN_RIGHT|RT_VALIGN_CENTER, text=begin_string)) else: lenSize = ih * 3 # 25 -> 75 res.append(MultiContentEntryText(pos=(iconSize+space, 0), size=(width-lenSize-iconSize-space-r, ih), font = 0, flags = RT_HALIGN_LEFT, text = data.txt)) res.append(MultiContentEntryText(pos=(width-lenSize-r, 0), size=(lenSize, ih), font=0, flags=RT_HALIGN_RIGHT, text=len)) return res def moveToFirstMovie(self): if self.firstFileEntry < len(self.list): self.instance.moveSelectionTo(self.firstFileEntry) else: # there are no movies, just directories... self.moveToFirst() def moveToParentDirectory(self): if self.parentDirectory < len(self.list): self.instance.moveSelectionTo(self.parentDirectory) else: self.moveToFirst() def moveToLast(self): if self.list: self.instance.moveSelectionTo(len(self.list) - 1) def moveToFirst(self): if self.list: self.instance.moveSelectionTo(0) def moveToIndex(self, index): self.instance.moveSelectionTo(index) def getCurrentIndex(self): return self.instance.getCurrentIndex() def getCurrentEvent(self): l = self.l.getCurrentSelection() return l and l[0] and l[1] and l[1].getEvent(l[0]) def getCurrent(self): l = self.l.getCurrentSelection() return l and l[0] def getItem(self, index): if self.list: if len(self.list) > index: return self.list[index] and self.list[index][0] GUI_WIDGET = eListbox def postWidgetCreate(self, instance): instance.setContent(self.l) instance.selectionChanged.get().append(self.selectionChanged) def preWidgetRemove(self, instance): instance.setContent(None) instance.selectionChanged.get().remove(self.selectionChanged) def reload(self, root = None, filter_tags = None): if self.reloadDelayTimer is not None: self.reloadDelayTimer.stop() self.reloadDelayTimer = None if root is not None: self.load(root, filter_tags) else: self.load(self.root, filter_tags) self.l.setList(self.list) def removeService(self, service): index = self.findService(service) if index is not None: del self.list[index] self.l.setList(self.list) def findService(self, service): if service is None: return None for index, l in enumerate(self.list): if l[0] == service: return index return None def __len__(self): return len(self.list) def __getitem__(self, index): return self.list[index] def __iter__(self): return self.list.__iter__() def load(self, root, filter_tags): # this lists our root service, then building a # nice list del self.list[:] serviceHandler = eServiceCenter.getInstance() numberOfDirs = 0 reflist = root and serviceHandler.list(root) if reflist is None: print "listing of movies failed" return realtags = set() autotags = {} rootPath = os.path.normpath(root.getPath()); parent = None # Don't navigate above the "root" if len(rootPath) > 1 and (os.path.realpath(rootPath) != config.movielist.root.value): parent = os.path.split(os.path.normpath(rootPath))[0] if parent and (parent not in defaultInhibitDirs): # enigma wants an extra '/' appended if not parent.endswith('/'): parent += '/' ref = eServiceReference("2:0:1:0:0:0:0:0:0:0:" + parent) ref.flags = eServiceReference.flagDirectory self.list.append((ref, None, 0, -1)) numberOfDirs += 1 while 1: serviceref = reflist.getNext() if not serviceref.valid(): break if config.ParentalControl.servicepinactive.value and config.ParentalControl.storeservicepin.value != "never": from Components.ParentalControl import parentalControl if not parentalControl.sessionPinCached and parentalControl.isProtected(serviceref): continue info = serviceHandler.info(serviceref) if info is None: info = justStubInfo begin = info.getInfo(serviceref, iServiceInformation.sTimeCreate) if serviceref.flags & eServiceReference.mustDescent: self.list.append((serviceref, info, begin, -1)) numberOfDirs += 1 continue # convert separe-separated list of tags into a set this_tags = info.getInfoString(serviceref, iServiceInformation.sTags).split(' ') name = info.getName(serviceref) if this_tags == ['']: # No tags? Auto tag! this_tags = name.replace(',',' ').replace('.',' ').split() # For auto tags, we are keeping a (tag, movies) dictionary. #It will be used later to check if movies have a complete sentence in common. for tag in this_tags: if autotags.has_key(tag): autotags[tag].append(name) else: autotags[tag] = [name] else: realtags.update(this_tags) # filter_tags is either None (which means no filter at all), or # a set. In this case, all elements of filter_tags must be present, # otherwise the entry will be dropped. if filter_tags is not None: this_tags = set(this_tags) if not this_tags.issuperset(filter_tags): print "Skipping", name, "tags=", this_tags, " filter=", filter_tags continue self.list.append((serviceref, info, begin, -1)) self.firstFileEntry = numberOfDirs self.parentDirectory = 0 if self.sort_type == MovieList.SORT_ALPHANUMERIC: self.list.sort(key=self.buildAlphaNumericSortKey) elif self.sort_type == MovieList.SORT_ALPHANUMERIC_FLAT: self.list.sort(key=self.buildAlphaNumericFlatSortKey) elif self.sort_type == MovieList.SORT_ALPHANUMERIC_FLAT_REVERSE: self.list.sort(key=self.buildAlphaNumericFlatSortKey, reverse = True) elif self.sort_type == MovieList.SORT_RECORDED: self.list.sort(key=self.buildBeginTimeSortKey) else: #always sort first this way to avoid shuffle and reverse-sort directories self.list.sort(key=self.buildGroupwiseSortkey) if self.sort_type == MovieList.SHUFFLE: dirlist = self.list[:numberOfDirs] shufflelist = self.list[numberOfDirs:] random.shuffle(shufflelist) self.list = dirlist + shufflelist elif self.sort_type == MovieList.SORT_ALPHANUMERIC_REVERSE: self.list = self.list[:numberOfDirs] + sorted(self.list[numberOfDirs:], key=self.buildAlphaNumericSortKey, reverse = True) elif self.sort_type == MovieList.SORT_RECORDED_REVERSE: self.list = self.list[:numberOfDirs] + sorted(self.list[numberOfDirs:], key=self.buildBeginTimeSortKey, reverse = True) if self.root and numberOfDirs > 0: rootPath = os.path.normpath(self.root.getPath()) if not rootPath.endswith('/'): rootPath += '/' if rootPath != parent: # with new sort types directories may be in between files, so scan whole # list for parentDirectory index. Usually it is the first one anyway for index, item in enumerate(self.list): if item[0].flags & eServiceReference.mustDescent: itempath = os.path.normpath(item[0].getPath()) if not itempath.endswith('/'): itempath += '/' if itempath == rootPath: self.parentDirectory = index break self.root = root # finally, store a list of all tags which were found. these can be presented # to the user to filter the list # ML: Only use the tags that occur more than once in the list OR that were # really in the tag set of some file. # reverse the dictionary to see which unique movie each tag now references rautotags = {} for tag, movies in autotags.items(): if (len(movies) > 1): movies = tuple(movies) # a tuple can be hashed, but a list not item = rautotags.get(movies, []) if not item: rautotags[movies] = item item.append(tag) self.tags = {} for movies, tags in rautotags.items(): movie = movies[0] # format the tag lists so that they are in 'original' order tags.sort(key = movie.find) first = movie.find(tags[0]) last = movie.find(tags[-1]) + len(tags[-1]) match = movie start = 0 end = len(movie) # Check if the set has a complete sentence in common, and how far for m in movies[1:]: if m[start:end] != match: if not m.startswith(movie[:last]): start = first if not m.endswith(movie[first:]): end = last match = movie[start:end] if m[start:end] != match: match = '' break # Adding the longest common sentence to the tag list if match: self.tags[match] = set(tags) else: match = ' '.join(tags) if (len(match) > 2) or (match in realtags): #Omit small words, only for auto tags self.tags[match] = set(tags) # Adding the realtags to the tag list for tag in realtags: self.tags[tag] = set([tag]) def buildAlphaNumericSortKey(self, x): # x = ref,info,begin,... ref = x[0] name = x[1] and x[1].getName(ref) if ref.flags & eServiceReference.mustDescent: return (0, name and name.lower() or "", -x[2]) return (1, name and name.lower() or "", -x[2]) def buildAlphaNumericFlatSortKey(self, x): # x = ref,info,begin,... ref = x[0] name = x[1] and x[1].getName(ref) if name and ref.flags & eServiceReference.mustDescent: # only use directory basename for sorting p = os.path.split(name) if not p[1]: # if path ends in '/', p is blank. p = os.path.split(p[0]) name = p[1] # print "Sorting for -%s-" % name return (1, name and name.lower() or "", -x[2]) def buildBeginTimeSortKey(self, x): ref = x[0] if ref.flags & eServiceReference.mustDescent: return (0, x[1] and x[1].getName(ref).lower() or "") return (1, -x[2]) def buildGroupwiseSortkey(self, x): # Sort recordings by date, sort MP3 and stuff by name ref = x[0] if ref.type >= eServiceReference.idUser: return self.buildAlphaNumericSortKey(x) else: return self.buildBeginTimeSortKey(x) def moveTo(self, serviceref): index = self.findService(serviceref) if index is not None: self.instance.moveSelectionTo(index) return True return False def moveDown(self): self.instance.moveSelection(self.instance.moveDown) def moveUp(self): self.instance.moveSelection(self.instance.moveUp) def moveToChar(self, char, lbl=None): self._char = char self._lbl = lbl if lbl: lbl.setText(self._char) lbl.visible = True self.moveToCharTimer = eTimer() self.moveToCharTimer.callback.append(self._moveToChrStr) self.moveToCharTimer.start(1000, True) #time to wait for next key press to decide which letter to use... def moveToString(self, char, lbl=None): self._char = self._char + char.upper() self._lbl = lbl if lbl: lbl.setText(self._char) lbl.visible = True self.moveToCharTimer = eTimer() self.moveToCharTimer.callback.append(self._moveToChrStr) self.moveToCharTimer.start(1000, True) #time to wait for next key press to decide which letter to use... def _moveToChrStr(self): currentIndex = self.instance.getCurrentIndex() found = False if currentIndex < (len(self.list) - 1): itemsBelow = self.list[currentIndex + 1:] #first search the items below the selection for index, item in enumerate(itemsBelow): ref = item[0] itemName = getShortName(item[1].getName(ref).upper(), ref) if len(self._char) == 1 and itemName.startswith(self._char): found = True self.instance.moveSelectionTo(index + currentIndex + 1) break elif len(self._char) > 1 and itemName.find(self._char) >= 0: found = True self.instance.moveSelectionTo(index + currentIndex + 1) break if found == False and currentIndex > 0: itemsAbove = self.list[1:currentIndex] #first item (0) points parent folder - no point to include for index, item in enumerate(itemsAbove): ref = item[0] itemName = getShortName(item[1].getName(ref).upper(), ref) if len(self._char) == 1 and itemName.startswith(self._char): found = True self.instance.moveSelectionTo(index + 1) break elif len(self._char) > 1 and itemName.find(self._char) >= 0: found = True self.instance.moveSelectionTo(index + 1) break self._char = '' if self._lbl: self._lbl.visible = False
class VirtualKeyBoard(Screen): def __init__(self, session, title = '', **kwargs): Screen.__init__(self, session) self.setTitle(_('Virtual KeyBoard')) self.keys_list = [] self.shiftkeys_list = [] self.lang = language.getLanguage() self.nextLang = None self.shiftMode = False self.selectedKey = 0 self.smsChar = None self.sms = NumericalTextInput(self.smsOK) self.key_bg = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_bg.png')) self.key_sel = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_sel.png')) self.key_backspace = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_backspace.png')) self.key_all = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_all.png')) self.key_clr = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_clr.png')) self.key_esc = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_esc.png')) self.key_ok = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_ok.png')) self.key_shift = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_shift.png')) self.key_shift_sel = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_shift_sel.png')) self.key_space = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_space.png')) self.key_left = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_left.png')) self.key_right = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, 'buttons/vkey_right.png')) self.keyImages = {'BACKSPACE': self.key_backspace, 'ALL': self.key_all, 'EXIT': self.key_esc, 'OK': self.key_ok, 'SHIFT': self.key_shift, 'SPACE': self.key_space, 'LEFT': self.key_left, 'RIGHT': self.key_right} self.keyImagesShift = {'BACKSPACE': self.key_backspace, 'CLEAR': self.key_clr, 'EXIT': self.key_esc, 'OK': self.key_ok, 'SHIFT': self.key_shift_sel, 'SPACE': self.key_space, 'LEFT': self.key_left, 'RIGHT': self.key_right} self['country'] = StaticText('') self['header'] = Label() self['text'] = Input(currPos=len(kwargs.get('text', '').decode('utf-8', 'ignore')), allMarked=False, **kwargs) self['list'] = VirtualKeyBoardList([]) self['actions'] = NumberActionMap(['OkCancelActions', 'WizardActions', 'ColorActions', 'KeyboardInputActions', 'InputBoxActions', 'InputAsciiActions'], {'gotAsciiCode': self.keyGotAscii, 'ok': self.okClicked, 'OKLong': self.okLongClicked, 'cancel': self.exit, 'left': self.left, 'right': self.right, 'up': self.up, 'down': self.down, 'red': self.exit, 'green': self.ok, 'yellow': self.switchLang, 'blue': self.shiftClicked, 'deleteBackward': self.backClicked, 'deleteForward': self.forwardClicked, 'back': self.exit, 'pageUp': self.cursorRight, 'pageDown': self.cursorLeft, '1': self.keyNumberGlobal, '2': self.keyNumberGlobal, '3': self.keyNumberGlobal, '4': self.keyNumberGlobal, '5': self.keyNumberGlobal, '6': self.keyNumberGlobal, '7': self.keyNumberGlobal, '8': self.keyNumberGlobal, '9': self.keyNumberGlobal, '0': self.keyNumberGlobal}, -2) self.setLang() self.onExecBegin.append(self.setKeyboardModeAscii) self.onLayoutFinish.append(self.buildVirtualKeyBoard) self.onClose.append(self.__onClose) return def __onClose(self): self.sms.timer.stop() def switchLang(self): self.lang = self.nextLang self.setLang() self.buildVirtualKeyBoard() def setLang(self): if self.lang == 'de_DE': self.keys_list = [[u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE'], [u'q', u'w', u'e', u'r', u't', u'z', u'u', u'i', u'o', u'p', u'\xfc', u'+'], [u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u'\xf6', u'\xe4', u'#'], [u'<', u'y', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'-', u'ALL'], [u'SHIFT', u'SPACE', u'@', u'\xdf', u'OK', u'LEFT', u'RIGHT']] self.shiftkeys_list = [[u'EXIT', u'!', u'"', u'\xa7', u'$', u'%', u'&', u'/', u'(', u')', u'=', u'BACKSPACE'], [u'Q', u'W', u'E', u'R', u'T', u'Z', u'U', u'I', u'O', u'P', u'\xdc', u'*'], [u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'\xd6', u'\xc4', u"'"], [u'>', u'Y', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR'], [u'SHIFT', u'SPACE', u'?', u'\\', u'OK', u'LEFT', u'RIGHT']] self.nextLang = 'es_ES' elif self.lang == 'es_ES': self.keys_list = [[u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE'], [u'q', u'w', u'e', u'r', u't', u'z', u'u', u'i', u'o', u'p', u'\xfa', u'+'], [u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u'\xf3', u'\xe1', u'#'], [u'<', u'y', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'-', u'ALL'], [u'SHIFT', u'SPACE', u'@', u'\u0141', u'\u0155', u'\xe9', u'\u010d', u'\xed', u'\u011b', u'\u0144', u'\u0148', u'OK']] self.shiftkeys_list = [[u'EXIT', u'!', u'"', u'\xa7', u'$', u'%', u'&', u'/', u'(', u')', u'=', u'BACKSPACE'], [u'Q', u'W', u'E', u'R', u'T', u'Z', u'U', u'I', u'O', u'P', u'\xda', u'*'], [u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'\xd3', u'\xc1', u"'"], [u'>', u'Y', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR'], [u'SHIFT', u'SPACE', u'?', u'\\', u'\u0154', u'\xc9', u'\u010c', u'\xcd', u'\u011a', u'\u0143', u'\u0147', u'OK']] self.nextLang = 'fi_FI' elif self.lang == 'fi_FI': self.keys_list = [[u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE'], [u'q', u'w', u'e', u'r', u't', u'z', u'u', u'i', u'o', u'p', u'\xe9', u'+'], [u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u'\xf6', u'\xe4', u'#'], [u'<', u'y', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'-', u'ALL'], [u'SHIFT', u'SPACE', u'@', u'\xdf', u'\u013a', u'OK', u'LEFT', u'RIGHT']] self.shiftkeys_list = [[u'EXIT', u'!', u'"', u'\xa7', u'$', u'%', u'&', u'/', u'(', u')', u'=', u'BACKSPACE'], [u'Q', u'W', u'E', u'R', u'T', u'Z', u'U', u'I', u'O', u'P', u'\xc9', u'*'], [u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'\xd6', u'\xc4', u"'"], [u'>', u'Y', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR'], [u'SHIFT', u'SPACE', u'?', u'\\', u'\u0139', u'OK', u'LEFT', u'RIGHT']] self.nextLang = 'lv_LV' elif self.lang == 'lv_LV': self.keys_list = [[u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE'], [u'q', u'w', u'e', u'r', u't', u'y', u'u', u'i', u'o', u'p', u'-', u'\u0161'], [u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u';', u"'", u'\u016b'], [u'<', u'z', u'x', u'c', u'v', u'b', u'n', u'm', u',', u'.', u'\u017e', u'ALL'], [u'SHIFT', u'SPACE', u'\u0101', u'\u010d', u'\u0113', u'\u0123', u'\u012b', u'\u0137', u'\u013c', u'\u0146', u'LEFT', u'RIGHT']] self.shiftkeys_list = [[u'EXIT', u'!', u'@', u'$', u'*', u'(', u')', u'_', u'=', u'/', u'\\', u'BACKSPACE'], [u'Q', u'W', u'E', u'R', u'T', u'Y', u'U', u'I', u'O', u'P', u'+', u'\u0160'], [u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u':', u'"', u'\u016a'], [u'>', u'Z', u'X', u'C', u'V', u'B', u'N', u'M', u'#', u'?', u'\u017d', u'CLEAR'], [u'SHIFT', u'SPACE', u'\u0100', u'\u010c', u'\u0112', u'\u0122', u'\u012a', u'\u0136', u'\u013b', u'\u0145', u'LEFT', u'RIGHT']] self.nextLang = 'ru_RU' elif self.lang == 'ru_RU': self.keys_list = [[u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE'], [u'\u0430', u'\u0431', u'\u0432', u'\u0433', u'\u0434', u'\u0435', u'\u0451', u'\u0436', u'\u0437', u'\u0438', u'\u0439', u'+'], [u'\u043a', u'\u043b', u'\u043c', u'\u043d', u'\u043e', u'\u043f', u'\u0440', u'\u0441', u'\u0442', u'\u0443', u'\u0444', u'#'], [u'<', u'\u0445', u'\u0446', u'\u0447', u'\u0448', u'\u0449', u'\u044a', u'\u044b', u',', u'.', u'-', u'ALL'], [u'SHIFT', u'SPACE', u'@', u'\u044c', u'\u044d', u'\u044e', u'\u044f', u'OK', u'LEFT', u'RIGHT']] self.shiftkeys_list = [[u'EXIT', u'!', u'"', u'\xa7', u'$', u'%', u'&', u'/', u'(', u')', u'=', u'BACKSPACE'], [u'\u0410', u'\u0411', u'\u0412', u'\u0413', u'\u0414', u'\u0415', u'\u0401', u'\u0416', u'\u0417', u'\u0418', u'\u0419', u'*'], [u'\u041a', u'\u041b', u'\u041c', u'\u041d', u'\u041e', u'\u041f', u'\u0420', u'\u0421', u'\u0422', u'\u0423', u'\u0424', u"'"], [u'>', u'\u0425', u'\u0426', u'\u0427', u'\u0428', u'\u0429', u'\u042a', u'\u042b', u';', u':', u'_', u'CLEAR'], [u'SHIFT', u'SPACE', u'?', u'\\', u'\u042c', u'\u042d', u'\u042e', u'\u042f', u'OK', u'LEFT', u'RIGHT']] self.nextLang = 'sv_SE' elif self.lang == 'sv_SE': self.keys_list = [[u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE'], [u'q', u'w', u'e', u'r', u't', u'z', u'u', u'i', u'o', u'p', u'\xe9', u'+'], [u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u'\xf6', u'\xe4', u'#'], [u'<', u'y', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'-', u'ALL'], [u'SHIFT', u'SPACE', u'@', u'\xdf', u'\u013a', u'OK', u'LEFT', u'RIGHT']] self.shiftkeys_list = [[u'EXIT', u'!', u'"', u'\xa7', u'$', u'%', u'&', u'/', u'(', u')', u'=', u'BACKSPACE'], [u'Q', u'W', u'E', u'R', u'T', u'Z', u'U', u'I', u'O', u'P', u'\xc9', u'*'], [u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'\xd6', u'\xc4', u"'"], [u'>', u'Y', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR'], [u'SHIFT', u'SPACE', u'?', u'\\', u'\u0139', u'OK', u'LEFT', u'RIGHT']] self.nextLang = 'sk_SK' elif self.lang == 'sk_SK': self.keys_list = [[u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE'], [u'q', u'w', u'e', u'r', u't', u'z', u'u', u'i', u'o', u'p', u'\xfa', u'+'], [u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u'\u013e', u'@', u'#'], [u'<', u'y', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'-', u'ALL'], [u'SHIFT', u'SPACE', u'\u0161', u'\u010d', u'\u017e', u'\xfd', u'\xe1', u'\xed', u'\xe9', u'OK', u'LEFT', u'RIGHT']] self.shiftkeys_list = [[u'EXIT', u'!', u'"', u'\xa7', u'$', u'%', u'&', u'/', u'(', u')', u'=', u'BACKSPACE'], [u'Q', u'W', u'E', u'R', u'T', u'Z', u'U', u'I', u'O', u'P', u'\u0165', u'*'], [u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'\u0148', u'\u010f', u"'"], [u'\xc1', u'\xc9', u'\u010e', u'\xcd', u'\xdd', u'\xd3', u'\xda', u'\u017d', u'\u0160', u'\u010c', u'\u0164', u'\u0147'], [u'>', u'Y', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR'], [u'SHIFT', u'SPACE', u'?', u'\\', u'\xe4', u'\xf6', u'\xfc', u'\xf4', u'\u0155', u'\u013a', u'OK']] self.nextLang = 'cs_CZ' elif self.lang == 'cs_CZ': self.keys_list = [[u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE'], [u'q', u'w', u'e', u'r', u't', u'z', u'u', u'i', u'o', u'p', u'\xfa', u'+'], [u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u'\u016f', u'@', u'#'], [u'<', u'y', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'-', u'ALL'], [u'SHIFT', u'SPACE', u'\u011b', u'\u0161', u'\u010d', u'\u0159', u'\u017e', u'\xfd', u'\xe1', u'\xed', u'\xe9', u'OK']] self.shiftkeys_list = [[u'EXIT', u'!', u'"', u'\xa7', u'$', u'%', u'&', u'/', u'(', u')', u'=', u'BACKSPACE'], [u'Q', u'W', u'E', u'R', u'T', u'Z', u'U', u'I', u'O', u'P', u'\u0165', u'*'], [u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'\u0148', u'\u010f', u"'"], [u'>', u'Y', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR'], [u'SHIFT', u'SPACE', u'?', u'\\', u'\u010c', u'\u0158', u'\u0160', u'\u017d', u'\xda', u'\xc1', u'\xc9', u'OK']] self.nextLang = 'el_GR' elif self.lang == 'el_GR': self.keys_list = [[u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE'], [u'=', u'\u03c2', u'\u03b5', u'\u03c1', u'\u03c4', u'\u03c5', u'\u03b8', u'\u03b9', u'\u03bf', u'\u03c0', u'[', u']'], [u'\u03b1', u'\u03c3', u'\u03b4', u'\u03c6', u'\u03b3', u'\u03b7', u'\u03be', u'\u03ba', u'\u03bb', u';', u"'", u'-'], [u'\\', u'\u03b6', u'\u03c7', u'\u03c8', u'\u03c9', u'\u03b2', u'\u03bd', u'\u03bc', u',', '.', u'/', u'ALL'], [u'SHIFT', u'SPACE', u'\u03ac', u'\u03ad', u'\u03ae', u'\u03af', u'\u03cc', u'\u03cd', u'\u03ce', u'\u03ca', u'\u03cb', u'OK']] self.shiftkeys_list = [[u'EXIT', u'!', u'@', u'#', u'$', u'%', u'^', u'&', u'*', u'(', u')', u'BACKSPACE'], [u'+', u'\u20ac', u'\u0395', u'\u03a1', u'\u03a4', u'\u03a5', u'\u0398', u'\u0399', u'\u039f', u'\u03a0', u'{', u'}'], [u'\u0391', u'\u03a3', u'\u0394', u'\u03a6', u'\u0393', u'\u0397', u'\u039e', u'\u039a', u'\u039b', u':', u'"', u'_'], [u'|', u'\u0396', u'\u03a7', u'\u03a8', u'\u03a9', u'\u0392', u'\u039d', u'\u039c', u'<', u'>', u'?', u'CLEAR'], [u'SHIFT', u'SPACE', u'\u0386', u'\u0388', u'\u0389', u'\u038a', u'\u038c', u'\u038e', u'\u038f', u'\u03aa', u'\u03ab', u'OK']] self.nextLang = 'pl_PL' elif self.lang == 'pl_PL': self.keys_list = [[u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE'], [u'q', u'w', u'e', u'r', u't', u'y', u'u', u'i', u'o', u'p', u'-', u'['], [u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u';', u"'", u'\\'], [u'<', u'z', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'/', u'ALL'], [u'SHIFT', u'SPACE', u'\u0105', u'\u0107', u'\u0119', u'\u0142', u'\u0144', u'\xf3', u'\u015b', u'\u017a', u'\u017c', u'OK']] self.shiftkeys_list = [[u'EXIT', u'!', u'@', u'#', u'$', u'%', u'^', u'&', u'(', u')', u'=', u'BACKSPACE'], [u'Q', u'W', u'E', u'R', u'T', u'Y', u'U', u'I', u'O', u'P', u'*', u']'], [u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'?', u'"', u'|'], [u'>', u'Z', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR'], [u'SHIFT', u'SPACE', u'\u0104', u'\u0106', u'\u0118', u'\u0141', u'\u0143', u'\xd3', u'\u015a', u'\u0179', u'\u017b', u'OK']] self.nextLang = 'en_EN' else: self.keys_list = [[u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE'], [u'q', u'w', u'e', u'r', u't', u'y', u'u', u'i', u'o', u'p', u'-', u'['], [u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u';', u"'", u'\\'], [u'<', u'z', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'/', u'ALL'], [u'SHIFT', u'SPACE', u'OK', u'LEFT', u'RIGHT', u'*']] self.shiftkeys_list = [[u'EXIT', u'!', u'@', u'#', u'$', u'%', u'^', u'&', u'(', u')', u'=', u'BACKSPACE'], [u'Q', u'W', u'E', u'R', u'T', u'Y', u'U', u'I', u'O', u'P', u'+', u']'], [u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'?', u'"', u'|'], [u'>', u'Z', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR'], [u'SHIFT', u'SPACE', u'OK', u'LEFT', u'RIGHT', u'~']] self.lang = 'en_EN' self.nextLang = 'de_DE' self['country'].setText(self.lang) self.max_key = 47 + len(self.keys_list[4]) def virtualKeyBoardEntryComponent(self, keys): w, h = skin.parameters.get('VirtualKeyboard', (45, 45)) key_bg_width = self.key_bg and self.key_bg.size().width() or w key_images = self.shiftMode and self.keyImagesShift or self.keyImages res = [keys] text = [] x = 0 for key in keys: png = key_images.get(key, None) if png: width = png.size().width() res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, h), png=png)) else: width = key_bg_width res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, h), png=self.key_bg)) text.append(MultiContentEntryText(pos=(x, 0), size=(width, h), font=0, text=key.encode('utf-8'), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER)) x += width return res + text def buildVirtualKeyBoard(self): self.previousSelectedKey = None self.list = [] for keys in self.shiftMode and self.shiftkeys_list or self.keys_list: self.list.append(self.virtualKeyBoardEntryComponent(keys)) self.markSelectedKey() return def markSelectedKey(self): w, h = skin.parameters.get('VirtualKeyboard', (45, 45)) if self.previousSelectedKey is not None: self.list[self.previousSelectedKey / 12] = self.list[self.previousSelectedKey / 12][:-1] width = self.key_sel.size().width() x = self.list[self.selectedKey / 12][self.selectedKey % 12 + 1][1] self.list[self.selectedKey / 12].append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, h), png=self.key_sel)) self.previousSelectedKey = self.selectedKey self['list'].setList(self.list) return def backClicked(self): self['text'].deleteBackward() def forwardClicked(self): self['text'].deleteForward() def shiftClicked(self): self.smsChar = None self.shiftMode = not self.shiftMode self.buildVirtualKeyBoard() return def okClicked(self): self.smsChar = None text = (self.shiftMode and self.shiftkeys_list or self.keys_list)[self.selectedKey / 12][self.selectedKey % 12].encode('UTF-8') if text == 'EXIT': self.close(None) elif text == 'BACKSPACE': self['text'].deleteBackward() elif text == 'ALL': self['text'].markAll() elif text == 'CLEAR': self['text'].deleteAllChars() self['text'].update() elif text == 'SHIFT': self.shiftClicked() elif text == 'SPACE': self['text'].char(' '.encode('UTF-8')) elif text == 'OK': self.close(self['text'].getText()) elif text == 'LEFT': self['text'].left() elif text == 'RIGHT': self['text'].right() else: self['text'].char(text) return def okLongClicked(self): self.smsChar = None text = (self.shiftMode and self.shiftkeys_list or self.keys_list)[self.selectedKey / 12][self.selectedKey % 12].encode('UTF-8') if text == 'BACKSPACE': self['text'].deleteAllChars() self['text'].update() return def ok(self): self.close(self['text'].getText()) def exit(self): self.close(None) return def cursorRight(self): self['text'].right() def cursorLeft(self): self['text'].left() def left(self): self.smsChar = None self.selectedKey = self.selectedKey / 12 * 12 + (self.selectedKey + 11) % 12 if self.selectedKey > self.max_key: self.selectedKey = self.max_key self.markSelectedKey() return def right(self): self.smsChar = None self.selectedKey = self.selectedKey / 12 * 12 + (self.selectedKey + 1) % 12 if self.selectedKey > self.max_key: self.selectedKey = self.selectedKey / 12 * 12 self.markSelectedKey() return def up(self): self.smsChar = None self.selectedKey -= 12 if self.selectedKey < 0: self.selectedKey = self.max_key / 12 * 12 + self.selectedKey % 12 if self.selectedKey > self.max_key: self.selectedKey -= 12 self.markSelectedKey() return def down(self): self.smsChar = None self.selectedKey += 12 if self.selectedKey > self.max_key: self.selectedKey %= 12 self.markSelectedKey() return def keyNumberGlobal(self, number): self.smsChar = self.sms.getKey(number) self.selectAsciiKey(self.smsChar) def smsOK(self): if self.smsChar and self.selectAsciiKey(self.smsChar): print 'pressing ok now' self.okClicked() def keyGotAscii(self): self.smsChar = None if self.selectAsciiKey(str(unichr(getPrevAsciiCode()).encode('utf-8'))): self.okClicked() return def selectAsciiKey(self, char): if char == ' ': char = 'SPACE' for keyslist in (self.shiftkeys_list, self.keys_list): selkey = 0 for keys in keyslist: for key in keys: if key == char: self.selectedKey = selkey if self.shiftMode != (keyslist is self.shiftkeys_list): self.shiftMode = not self.shiftMode self.buildVirtualKeyBoard() else: self.markSelectedKey() return True selkey += 1 return False
class VirtualKeyBoard(Screen): def __init__(self, session, title="", **kwargs): Screen.__init__(self, session) self.setTitle(_(title)) self.keys_list = [] self.shiftkeys_list = [] self.lang = language.getLanguage() self.nextLang = None self.shiftMode = False self.selectedKey = 0 self.smsChar = None self.sms = NumericalTextInput(self.smsOK) self.key_bg = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_bg.png")) self.key_sel = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_sel.png")) self.key_backspace = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_backspace.png")) self.key_all = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_all.png")) self.key_clr = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_clr.png")) self.key_esc = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_esc.png")) self.key_ok = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_ok.png")) self.key_shift = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_shift.png")) self.key_shift_sel = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_shift_sel.png")) self.key_space = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_space.png")) self.key_left = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_left.png")) self.key_right = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_right.png")) self.keyImages = { "BACKSPACE": self.key_backspace, "ALL": self.key_all, "EXIT": self.key_esc, "OK": self.key_ok, "SHIFT": self.key_shift, "SPACE": self.key_space, "LEFT": self.key_left, "RIGHT": self.key_right } self.keyImagesShift = { "BACKSPACE": self.key_backspace, "CLEAR": self.key_clr, "EXIT": self.key_esc, "OK": self.key_ok, "SHIFT": self.key_shift_sel, "SPACE": self.key_space, "LEFT": self.key_left, "RIGHT": self.key_right } self["country"] = StaticText("") self["header"] = Label() self["text"] = Input(currPos=len(kwargs.get("text", "").decode("utf-8",'ignore')), allMarked=False, **kwargs) self["list"] = VirtualKeyBoardList([]) self["actions"] = NumberActionMap(["OkCancelActions", "WizardActions", "ColorActions", "KeyboardInputActions", "InputBoxActions", "InputAsciiActions"], { "gotAsciiCode": self.keyGotAscii, "ok": self.okClicked, "cancel": self.exit, "left": self.left, "right": self.right, "up": self.up, "down": self.down, "red": self.exit, "green": self.ok, "yellow": self.switchLang, "blue": self.shiftClicked, "deleteBackward": self.backClicked, "deleteForward": self.forwardClicked, "back": self.exit, "pageUp": self.cursorRight, "pageDown": self.cursorLeft, "1": self.keyNumberGlobal, "2": self.keyNumberGlobal, "3": self.keyNumberGlobal, "4": self.keyNumberGlobal, "5": self.keyNumberGlobal, "6": self.keyNumberGlobal, "7": self.keyNumberGlobal, "8": self.keyNumberGlobal, "9": self.keyNumberGlobal, "0": self.keyNumberGlobal, }, -2) self.setLang() self.onExecBegin.append(self.setKeyboardModeAscii) self.onLayoutFinish.append(self.buildVirtualKeyBoard) self.onClose.append(self.__onClose) def __onClose(self): self.sms.timer.stop() def switchLang(self): self.lang = self.nextLang self.setLang() self.buildVirtualKeyBoard() def setLang(self): if self.lang == 'de_DE': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ü", u"+"], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL"], [u"SHIFT", u"SPACE", u"@", u"ß", u"OK", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ü", u"*"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"OK", u"LEFT", u"RIGHT"]] self.nextLang = 'es_ES' elif self.lang == 'es_ES': #still missing keys (u"ùÙ") self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ó", u"á", u"#"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL"], [u"SHIFT", u"SPACE", u"@", u"Ł", u"ŕ", u"é", u"č", u"í", u"ě", u"ń", u"ň", u"OK"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"Ú", u"*"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ó", u"Á", u"'"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"Ŕ", u"É", u"Č", u"Í", u"Ě", u"Ń", u"Ň", u"OK"]] self.nextLang = 'fi_FI' elif self.lang == 'fi_FI': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"é", u"+"], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL"], [u"SHIFT", u"SPACE", u"@", u"ß", u"ĺ", u"OK", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"É", u"*"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"Ĺ", u"OK", u"LEFT", u"RIGHT"]] self.nextLang = 'lv_LV' elif self.lang == 'lv_LV': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"-", u"š"], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u";", u"'", u"ū"], [u"<", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", u".", u"ž", u"ALL"], [u"SHIFT", u"SPACE", u"ā", u"č", u"ē", u"ģ", u"ī", u"ķ", u"ļ", u"ņ", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [ [u"EXIT", u"!", u"@", u"$", u"*", u"(", u")", u"_", u"=", u"/", u"\\", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"+", u"Š"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u":", u'"', u"Ū"], [u">", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u"#", u"?", u"Ž", u"CLEAR"], [u"SHIFT", u"SPACE", u"Ā", u"Č", u"Ē", u"Ģ", u"Ī", u"Ķ", u"Ļ", u"Ņ", u"LEFT", u"RIGHT"]] self.nextLang = 'ru_RU' elif self.lang == 'ru_RU': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"а", u"б", u"в", u"г", u"д", u"е", u"ё", u"ж", u"з", u"и", u"й", u"+"], [u"к", u"л", u"м", u"н", u"о", u"п", u"р", u"с", u"т", u"у", u"ф", u"#"], [u"<", u"х", u"ц", u"ч", u"ш", u"щ", u"ъ", u"ы", u",", u".", u"-", u"ALL"], [u"SHIFT", u"SPACE", u"@", u"ь", u"э", u"ю", u"я", u"OK", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"А", u"Б", u"В", u"Г", u"Д", u"Е", u"Ё", u"Ж", u"З", u"И", u"Й", u"*"], [u"К", u"Л", u"М", u"Н", u"О", u"П", u"Р", u"С", u"Т", u"У", u"Ф", u"'"], [u">", u"Х", u"Ц", u"Ч", u"Ш", u"Щ", u"Ъ", u"Ы", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"Ь", u"Э", u"Ю", u"Я", u"OK", u"LEFT", u"RIGHT"]] self.nextLang = 'sv_SE' elif self.lang == 'sv_SE': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"é", u"+"], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ö", u"ä", u"#"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL"], [u"SHIFT", u"SPACE", u"@", u"ß", u"ĺ", u"OK", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"É", u"*"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"Ö", u"Ä", u"'"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"Ĺ", u"OK", u"LEFT", u"RIGHT"]] self.nextLang = 'sk_SK' elif self.lang =='sk_SK': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ľ", u"@", u"#"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL"], [u"SHIFT", u"SPACE", u"š", u"č", u"ž", u"ý", u"á", u"í", u"é", u"OK", u"LEFT", u"RIGHT"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"ť", u"*"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"ň", u"ď", u"'"], [u"Á", u"É", u"Ď", u"Í", u"Ý", u"Ó", u"Ú", u"Ž", u"Š", u"Č", u"Ť", u"Ň"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"ä", u"ö", u"ü", u"ô", u"ŕ", u"ĺ", u"OK"]] self.nextLang = 'cs_CZ' elif self.lang == 'cs_CZ': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"z", u"u", u"i", u"o", u"p", u"ú", u"+"], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u"ů", u"@", u"#"], [u"<", u"y", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"-", u"ALL"], [u"SHIFT", u"SPACE", u"ě", u"š", u"č", u"ř", u"ž", u"ý", u"á", u"í", u"é", u"OK"]] self.shiftkeys_list = [ [u"EXIT", u"!", u'"', u"§", u"$", u"%", u"&", u"/", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Z", u"U", u"I", u"O", u"P", u"ť", u"*"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"ň", u"ď", u"'"], [u">", u"Y", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"?", u"\\", u"Č", u"Ř", u"Š", u"Ž", u"Ú", u"Á", u"É", u"OK"]] self.nextLang = 'el_GR' elif self.lang == 'el_GR': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"=", u"ς", u"ε", u"ρ", u"τ", u"υ", u"θ", u"ι", u"ο", u"π", u"[", u"]"], [u"α", u"σ", u"δ", u"φ", u"γ", u"η", u"ξ", u"κ", u"λ", u";", u"'", u"-"], [u"\\", u"ζ", u"χ", u"ψ", u"ω", u"β", u"ν", u"μ", u",", ".", u"/", u"ALL"], [u"SHIFT", u"SPACE", u"ά", u"έ", u"ή", u"ί", u"ό", u"ύ", u"ώ", u"ϊ", u"ϋ", u"OK"]] self.shiftkeys_list = [ [u"EXIT", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"*", u"(", u")", u"BACKSPACE"], [u"+", u"€", u"Ε", u"Ρ", u"Τ", u"Υ", u"Θ", u"Ι", u"Ο", u"Π", u"{", u"}"], [u"Α", u"Σ", u"Δ", u"Φ", u"Γ", u"Η", u"Ξ", u"Κ", u"Λ", u":", u'"', u"_"], [u"|", u"Ζ", u"Χ", u"Ψ", u"Ω", u"Β", u"Ν", u"Μ", u"<", u">", u"?", u"CLEAR"], [u"SHIFT", u"SPACE", u"Ά", u"Έ", u"Ή", u"Ί", u"Ό", u"Ύ", u"Ώ", u"Ϊ", u"Ϋ", u"OK"]] self.nextLang = 'pl_PL' elif self.lang == 'pl_PL': self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"-", u"["], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u";", u"'", u"\\"], [u"<", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"/", u"ALL"], [u"SHIFT", u"SPACE", u"ą", u"ć", u"ę", u"ł", u"ń", u"ó", u"ś", u"ź", u"ż", u"OK"]] self.shiftkeys_list = [ [u"EXIT", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"*", u"]"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"?", u'"', u"|"], [u">", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"Ą", u"Ć", u"Ę", u"Ł", u"Ń", u"Ó", u"Ś", u"Ź", u"Ż", u"OK"]] self.nextLang = 'en_EN' else: self.keys_list = [ [u"EXIT", u"1", u"2", u"3", u"4", u"5", u"6", u"7", u"8", u"9", u"0", u"BACKSPACE"], [u"q", u"w", u"e", u"r", u"t", u"y", u"u", u"i", u"o", u"p", u"-", u"["], [u"a", u"s", u"d", u"f", u"g", u"h", u"j", u"k", u"l", u";", u"'", u"\\"], [u"<", u"z", u"x", u"c", u"v", u"b", u"n", u"m", u",", ".", u"/", u"ALL"], [u"SHIFT", u"SPACE", u"OK", u"LEFT", u"RIGHT", u"*"]] self.shiftkeys_list = [ [u"EXIT", u"!", u"@", u"#", u"$", u"%", u"^", u"&", u"(", u")", u"=", u"BACKSPACE"], [u"Q", u"W", u"E", u"R", u"T", u"Y", u"U", u"I", u"O", u"P", u"+", u"]"], [u"A", u"S", u"D", u"F", u"G", u"H", u"J", u"K", u"L", u"?", u'"', u"|"], [u">", u"Z", u"X", u"C", u"V", u"B", u"N", u"M", u";", u":", u"_", u"CLEAR"], [u"SHIFT", u"SPACE", u"OK", u"LEFT", u"RIGHT", u"~"]] self.lang = 'en_EN' self.nextLang = 'de_DE' self["country"].setText(self.lang) self.max_key=47+len(self.keys_list[4]) def virtualKeyBoardEntryComponent(self, keys): w, h = skin.parameters.get("VirtualKeyboard",(45, 45)) key_bg_width = self.key_bg and self.key_bg.size().width() or w key_images = self.shiftMode and self.keyImagesShift or self.keyImages res = [keys] text = [] x = 0 for key in keys: png = key_images.get(key, None) if png: width = png.size().width() res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, h), png=png)) else: width = key_bg_width res.append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, h), png=self.key_bg)) text.append(MultiContentEntryText(pos=(x, 0), size=(width, h), font=0, text=key.encode("utf-8"), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER)) x += width return res + text def buildVirtualKeyBoard(self): self.previousSelectedKey = None self.list = [] for keys in self.shiftMode and self.shiftkeys_list or self.keys_list: self.list.append(self.virtualKeyBoardEntryComponent(keys)) self.markSelectedKey() def markSelectedKey(self): w, h = skin.parameters.get("VirtualKeyboard",(45, 45)) if self.previousSelectedKey is not None: self.list[self.previousSelectedKey /12] = self.list[self.previousSelectedKey /12][:-1] width = self.key_sel.size().width() x = self.list[self.selectedKey/12][self.selectedKey % 12 + 1][1] self.list[self.selectedKey / 12].append(MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, h), png=self.key_sel)) self.previousSelectedKey = self.selectedKey self["list"].setList(self.list) def backClicked(self): self["text"].deleteBackward() def forwardClicked(self): self["text"].deleteForward() def shiftClicked(self): self.smsChar = None self.shiftMode = not self.shiftMode self.buildVirtualKeyBoard() def okClicked(self): self.smsChar = None text = (self.shiftMode and self.shiftkeys_list or self.keys_list)[self.selectedKey / 12][self.selectedKey % 12].encode("UTF-8") if text == "EXIT": self.close(None) elif text == "BACKSPACE": self["text"].deleteBackward() elif text == "ALL": self["text"].markAll() elif text == "CLEAR": self["text"].deleteAllChars() self["text"].update() elif text == "SHIFT": self.shiftClicked() elif text == "SPACE": self["text"].char(" ".encode("UTF-8")) elif text == "OK": self.close(self["text"].getText()) elif text == "LEFT": self["text"].left() elif text == "RIGHT": self["text"].right() else: self["text"].char(text) def ok(self): self.close(self["text"].getText()) def exit(self): self.close(None) def cursorRight(self): self["text"].right() def cursorLeft(self): self["text"].left() def left(self): self.smsChar = None self.selectedKey = self.selectedKey / 12 * 12 + (self.selectedKey + 11) % 12 if self.selectedKey > self.max_key: self.selectedKey = self.max_key self.markSelectedKey() def right(self): self.smsChar = None self.selectedKey = self.selectedKey / 12 * 12 + (self.selectedKey + 1) % 12 if self.selectedKey > self.max_key: self.selectedKey = self.selectedKey / 12 * 12 self.markSelectedKey() def up(self): self.smsChar = None self.selectedKey -= 12 if self.selectedKey < 0: self.selectedKey = self.max_key / 12 * 12 + self.selectedKey % 12 if self.selectedKey > self.max_key: self.selectedKey -= 12 self.markSelectedKey() def down(self): self.smsChar = None self.selectedKey += 12 if self.selectedKey > self.max_key: self.selectedKey %= 12 self.markSelectedKey() def keyNumberGlobal(self, number): self.smsChar = self.sms.getKey(number) self.selectAsciiKey(self.smsChar) def smsOK(self): if self.smsChar and self.selectAsciiKey(self.smsChar): print "[VirtualKeyboard] pressing ok now" self.okClicked() def keyGotAscii(self): self.smsChar = None if self.selectAsciiKey(str(unichr(getPrevAsciiCode()).encode('utf-8'))): self.okClicked() def selectAsciiKey(self, char): if char == " ": char = "SPACE" for keyslist in (self.shiftkeys_list, self.keys_list): selkey = 0 for keys in keyslist: for key in keys: if key == char: self.selectedKey = selkey if self.shiftMode != (keyslist is self.shiftkeys_list): self.shiftMode = not self.shiftMode self.buildVirtualKeyBoard() else: self.markSelectedKey() return True selkey += 1 return False
class EpgCenterList(GUIComponent): # some static stuff used by ["list"] and ["upcoming"] widgets infoBarInstance = None eServiceCenterInstance = None bouquetList = [] bouquetServices = [] currentBouquetIndex = 0 bouquetIndexRanges = [] allServicesNameDict = {} recordTimer = None lenChannelDigits = 0 def __init__(self, blinkTimer, listType, videoMode, piconLoader, bouquetList, currentIndex, piconSize, listStyle, epgList): self.blinkTimer = blinkTimer self.listType = listType self.videoMode = videoMode self.piconLoader = piconLoader self.piconSize = piconSize self.baseHeight = self.piconSize.height() self.listStyle = listStyle self.epgList = epgList GUIComponent.__init__(self) from Screens.InfoBar import InfoBar EpgCenterList.infoBarInstance = InfoBar.instance EpgCenterList.eServiceCenterInstance = eServiceCenter.getInstance() self.l = eListboxPythonMultiContent() self.l.setBuildFunc(self.buildEpgEntry) self.onSelectionChanged = [ ] if self.videoMode == MODE_SD or self.videoMode == MODE_XD: self.overallFontHeight = 36 elif self.videoMode == MODE_HD: self.overallFontHeight = 44 #initialize self.list = [] self.mode = None self.similarShown = False config.plugins.merlinEpgCenter.listItemHeight.addNotifier(self.changeHeight, initial_call = True) config.plugins.merlinEpgCenter.adjustFontSize.addNotifier(self.setFontSizes, initial_call = True) if listType == LIST_TYPE_EPG: EpgCenterList.bouquetList = bouquetList EpgCenterList.currentBouquetIndex = currentIndex EpgCenterList.updateBouquetServices() EpgCenterList.recordTimer = NavigationInstance.instance.RecordTimer # zap timer pixmaps self.zap_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/zap.png")) self.zap_pre_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/zap_pre.png")) self.zap_post_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/zap_post.png")) self.zap_event_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/zap_event.png")) self.zap_repeated_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/zap_repeated.png")) self.zap_add_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/zap_add.png")) # record timer pixmaps self.timer_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/timer.png")) self.timer_pre_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/timer_pre.png")) self.timer_post_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/timer_post.png")) self.timer_event_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/timer_event.png")) self.timer_repeated_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/timer_repeated.png")) self.timer_add_pixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/timer_add.png")) # progress pixmaps self.progressPixmap = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/Progress.png")) self.progressPixmap_0 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/Progress_0.png")) self.progressPixmap_1 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/Progress_1.png")) self.progressPixmap_2 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/Progress_2.png")) self.progressPixmap_3 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/Progress_3.png")) self.progressPixmap_4 = LoadPixmap(cached=True, path=resolveFilename(SCOPE_CURRENT_PLUGIN, "Extensions/MerlinEPGCenter/images/Progress_4.png")) self.progressPixmapWidth = self.progressPixmap.size().width() self.epgcache = eEPGCache.getInstance() self.blinkTimer.callbacks.append(self.invalidateList) def onShow(self): self.maxWidth = self.l.getItemSize().width() def setFontSizes(self, configElement = None): diff = configElement.getValue() if self.videoMode == MODE_SD: self.l.setFont(0, gFont("Regular", 18 + diff)) self.l.setFont(1, gFont("Regular", 16 + diff)) self.l.setFont(2, gFont("Regular", 14 + diff)) self.l.setFont(3, gFont("Regular", 12 + diff)) elif self.videoMode == MODE_XD: self.l.setFont(0, gFont("Regular", 18 + diff)) self.l.setFont(1, gFont("Regular", 16 + diff)) self.l.setFont(2, gFont("Regular", 14 + diff)) self.l.setFont(3, gFont("Regular", 12 + diff)) elif self.videoMode == MODE_HD: self.l.setFont(0, gFont("Regular", 22 + diff)) self.l.setFont(1, gFont("Regular", 20 + diff)) self.l.setFont(2, gFont("Regular", 18 + diff)) self.l.setFont(3, gFont("Regular", 16 + diff)) def setMaxWidth(self, newSize): self.maxWidth = newSize.width() def changeHeight(self, configElement = None): self.listStyle = config.plugins.merlinEpgCenter.listStyle.value if self.listStyle == STYLE_SINGLE_LINE: self.singleLineBorder = 2 else: self.singleLineBorder = 0 if self.listStyle == STYLE_SHORT_DESCRIPTION or (self.listStyle == STYLE_SINGLE_LINE and (self.mode == SINGLE_EPG or self.mode == EPGSEARCH_RESULT or self.similarShown)): if self.overallFontHeight > self.baseHeight: self.itemHeight = self.overallFontHeight + int(config.plugins.merlinEpgCenter.listItemHeight.value) else: self.itemHeight = self.baseHeight + int(config.plugins.merlinEpgCenter.listItemHeight.value) elif self.videoMode == MODE_HD and config.plugins.merlinEpgCenter.listProgressStyle.value == STYLE_PERCENT_TEXT: # HD skin adjustment for text size self.itemHeight = self.baseHeight + int(config.plugins.merlinEpgCenter.listItemHeight.value) + 4 else: self.itemHeight = self.baseHeight + int(config.plugins.merlinEpgCenter.listItemHeight.value) self.halfItemHeight = self.itemHeight / 2 self.l.setItemHeight(self.itemHeight) def buildEpgEntry(self, ignoreMe, eventid, sRef, begin, duration, title, short, desc): columnSpace = config.plugins.merlinEpgCenter.columnSpace.getValue() progressPixmap = None offsetLeft = 5 offsetRight = self.maxWidth - 5 - 8 # 8 = timer pixmap width, 5 = border secondLineColor = 0x00909090 # grey border = int(config.plugins.merlinEpgCenter.listItemHeight.value) / 2 percent = 0 if begin != None and duration != None: timeString = strftime("%H:%M", localtime(begin)) + "-" + strftime("%H:%M", localtime(begin + duration)) now = int(time()) if now > begin: percent = (now - begin) * 100 / duration if self.mode == MULTI_EPG_NOW: timeValue = (begin + duration - now) / 60 +1 elif self.mode == MULTI_EPG_NEXT or self.mode == UPCOMING: timeValue = (now - begin) / 60 elif self.mode == MULTI_EPG_PRIMETIME or self.mode == EPGSEARCH_RESULT: if now >= begin: timeValue = (begin + duration - now) / 60 + 1 else: timeValue = (now - begin) / 60 elif self.mode == SINGLE_EPG: if self.instance.getCurrentIndex() == 0: timeValue = (begin + duration - now) / 60 + 1 else: timeValue = (now - begin) / 60 if config.plugins.merlinEpgCenter.showBeginRemainTime.value: if (KEEP_OUTDATED_TIME == 0 and (begin + duration) > now) or (KEEP_OUTDATED_TIME != 0 and (begin + duration) > now): if config.plugins.merlinEpgCenter.showDuration.value: remainBeginString = " I " else: remainBeginString = "" if timeValue >= 0: remainBeginString += "+" if fabs(timeValue) >= 120 and fabs(timeValue) < 1440: timeValue /= 60 remainBeginString += "%0dh" % timeValue elif fabs(timeValue) >= 1440: timeValue = (timeValue / 1440) +1 remainBeginString += "%02dd" % timeValue else: if timeValue < 0: remainBeginString += "%03d" % timeValue else: remainBeginString += "%02d" % timeValue else: if config.plugins.merlinEpgCenter.showDuration.value: remainBeginString = " I <->" else: remainBeginString = "<->" else: remainBeginString = "" if config.plugins.merlinEpgCenter.showDuration.value: duraString = "%d" % (duration / 60) if self.mode == MULTI_EPG_NOW: if config.plugins.merlinEpgCenter.listProgressStyle.value == STYLE_MULTI_PIXMAP: part = int(round(percent / 25)) + 1 progressPixmap = eval('self.progressPixmap_' + str(part)) elif config.plugins.merlinEpgCenter.listProgressStyle.value == STYLE_PIXMAP_BAR: progressPixmap = self.progressPixmap else: timeString = "" duraString = "" remainBeginString = "" if remainBeginString.endswith('>'): # KEEP_OUTDATED_TIME outdated = True try: progColor = parseColor("eventNotAvailable").argb() except: progColor = 0x777777 elif config.plugins.merlinEpgCenter.showBeginRemainTime.value and config.plugins.merlinEpgCenter.showColoredEpgTimes.value: outdated = False if remainBeginString.endswith('h'): # begins in... hours progColor = 0x00ef7f1a # brown elif remainBeginString.endswith('d'): # begins in... days progColor = 0x00e31e24 # red elif remainBeginString.startswith(' I +') or remainBeginString.startswith('+'): # already running progColor = 0x0074de0a # green elif remainBeginString.startswith(' I -') or remainBeginString.startswith('-'): # begins in... minutes progColor = 0x00ffed00 # yellow else: # undefined, shouldn't happen progColor = 0x00ffffff # white else: outdated = False progColor = 0x00ffed00 # yellow if outdated: textColor = progColor elif self.epgList != None: textColor = self.epgList.getColorEventAvailable(sRef, begin, duration) else: textColor = None res = [ None ] if config.plugins.merlinEpgCenter.showListNumbers.value: if ((self.mode == SINGLE_EPG and not self.similarShown) or self.mode == UPCOMING) and self.instance.getCurrentIndex() != 0: chNumber = "" else: # check if the service is found in our bouquets (or don't show the channel number if not found) if self.mode == EPGSEARCH_RESULT: if sRef in EpgCenterList.allServicesNameDict: i = 0 while i < len(EpgCenterList.bouquetServices): if sRef in EpgCenterList.bouquetServices[i]: chOffset = EpgCenterList.bouquetIndexRanges[i] chNumber = str(EpgCenterList.bouquetServices[i].index(sRef) + chOffset) break i += 1 else: chNumber = "" else: if sRef in EpgCenterList.bouquetServices[EpgCenterList.currentBouquetIndex]: chOffset = EpgCenterList.bouquetIndexRanges[EpgCenterList.currentBouquetIndex] chNumber = str(EpgCenterList.bouquetServices[EpgCenterList.currentBouquetIndex].index(sRef) + chOffset) else: chNumber = "" if EpgCenterList.lenChannelDigits < 3: width = self.maxWidth * 3 / 100 else: width = self.maxWidth * 4 / 100 res.append((eListboxPythonMultiContent.TYPE_TEXT, offsetLeft, 0, width, self.itemHeight, 1, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, chNumber)) offsetLeft = offsetLeft + width + columnSpace if config.plugins.merlinEpgCenter.showPicons.value: if ((self.mode == SINGLE_EPG and not self.similarShown) or self.mode == UPCOMING) and self.instance.getCurrentIndex() != 0: picon = None else: picon = self.piconLoader.getPicon(sRef) width = self.piconSize.width() if picon: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetLeft, (self.itemHeight - self.baseHeight) / 2, width, self.itemHeight, picon)) offsetLeft = offsetLeft + width + columnSpace if config.plugins.merlinEpgCenter.showServiceName.value: if self.videoMode == MODE_SD: width = self.maxWidth * 12 / 100 elif self.videoMode == MODE_XD: width = self.maxWidth * 14 / 100 elif self.videoMode == MODE_HD: width = self.maxWidth * 16 / 100 if not (((self.mode == SINGLE_EPG and not self.similarShown) or self.mode == UPCOMING) and self.instance.getCurrentIndex() != 0): if sRef in EpgCenterList.allServicesNameDict: serviceName = EpgCenterList.allServicesNameDict[sRef] else: serviceName = ServiceReference(sRef).getServiceName() res.append((eListboxPythonMultiContent.TYPE_TEXT, offsetLeft, 0, width, self.itemHeight, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, serviceName)) offsetLeft = offsetLeft + width + columnSpace if self.mode == MULTI_EPG_NOW and not self.similarShown: if self.videoMode == MODE_SD: width = self.maxWidth * 18 / 100 else: width = self.maxWidth * 14 / 100 progressHeight = 6 res.append((eListboxPythonMultiContent.TYPE_TEXT, offsetLeft, border, width, self.halfItemHeight - border + (self.singleLineBorder * 2), 1, RT_HALIGN_CENTER|RT_VALIGN_TOP, timeString)) if config.plugins.merlinEpgCenter.listProgressStyle.value == STYLE_MULTI_PIXMAP and progressPixmap is not None: if width > self.progressPixmapWidth: progressOffset = int((width - self.progressPixmapWidth) / 2) else: progressOffset = 0 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetLeft + progressOffset, self.halfItemHeight + (self.halfItemHeight - progressHeight) / 2 + self.singleLineBorder, width, progressHeight, progressPixmap)) elif config.plugins.merlinEpgCenter.listProgressStyle.value == STYLE_SIMPLE_BAR: res.append((eListboxPythonMultiContent.TYPE_PROGRESS, offsetLeft, self.halfItemHeight + (self.halfItemHeight - progressHeight) / 2 + self.singleLineBorder, width, progressHeight, percent, 1, secondLineColor)) elif config.plugins.merlinEpgCenter.listProgressStyle.value == STYLE_PIXMAP_BAR and progressPixmap is not None: if width > self.progressPixmapWidth: progressOffset = int((width - self.progressPixmapWidth) / 2) else: progressOffset = 0 res.append((eListboxPythonMultiContent.TYPE_PROGRESS_PIXMAP, offsetLeft + progressOffset, self.halfItemHeight + (self.halfItemHeight - progressHeight) / 2 + self.singleLineBorder, width, progressHeight, percent, progressPixmap, 0)) elif config.plugins.merlinEpgCenter.listProgressStyle.value == STYLE_PERCENT_TEXT: if self.videoMode == MODE_SD: # we need a bigger font for SD skins font = 2 else: font = 3 res.append((eListboxPythonMultiContent.TYPE_TEXT, offsetLeft, self.halfItemHeight, width, self.halfItemHeight - border, font, RT_HALIGN_CENTER|RT_VALIGN_TOP, str(percent) + "%", secondLineColor)) offsetLeft = offsetLeft + width + columnSpace else: if self.videoMode == MODE_SD: width = self.maxWidth * 18 / 100 else: width = self.maxWidth * 14 / 100 if self.mode == SINGLE_EPG or self.mode == EPGSEARCH_RESULT or self.similarShown: fd = getFuzzyDay(begin) res.append((eListboxPythonMultiContent.TYPE_TEXT, offsetLeft, border, width, self.halfItemHeight - border, 1, RT_HALIGN_CENTER|RT_VALIGN_TOP, timeString, textColor)) res.append((eListboxPythonMultiContent.TYPE_TEXT, offsetLeft, self.halfItemHeight, width, self.halfItemHeight - border, 2, RT_HALIGN_CENTER|RT_VALIGN_TOP, fd, secondLineColor)) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, offsetLeft, 0, width, self.itemHeight, 1, RT_HALIGN_CENTER|RT_VALIGN_CENTER, timeString, textColor)) offsetLeft = offsetLeft + width + columnSpace if begin != None and duration != None: (timerPixmaps, zapPixmaps, isRunning) = self.getTimerPixmapsForEntry(sRef, eventid, begin, duration) else: timerPixmaps = 0 zapPixmaps = 0 isRunning = 0 idx = self.instance.getCurrentIndex() self.blinkTimer.updateEntry(self.listType, idx, isRunning) if zapPixmaps: if (zapPixmaps & TIMER_TYPE_EID_MATCH) or (zapPixmaps & TIMER_TYPE_COVERS_FULL) or (zapPixmaps & TIMER_TYPE_EID_REPEATED) or (zapPixmaps & TIMER_TYPE_ADD_COVERS_FULL): posY = 2 height = self.itemHeight - 4 if (zapPixmaps & TIMER_TYPE_EID_MATCH): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.zap_event_pixmap)) elif (zapPixmaps & TIMER_TYPE_COVERS_FULL): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.zap_pixmap)) elif (zapPixmaps & TIMER_TYPE_EID_REPEATED): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.zap_repeated_pixmap)) elif (zapPixmaps & TIMER_TYPE_ADD_COVERS_FULL): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.zap_add_pixmap)) elif (zapPixmaps & TIMER_TYPE_INSIDE_EVENT) or (zapPixmaps & TIMER_TYPE_ADD_INSIDE_EVENT): posY = self.itemHeight / 2 - 6 height = 12 if (zapPixmaps & TIMER_TYPE_INSIDE_EVENT): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.zap_pixmap)) elif (zapPixmaps & TIMER_TYPE_ADD_INSIDE_EVENT): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.zap_add_pixmap)) else: if zapPixmaps & TIMER_TYPE_COVERS_END: posY = self.itemHeight / 2 + 2 height = self.itemHeight - posY - 2 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.zap_pre_pixmap)) elif zapPixmaps & TIMER_TYPE_ADD_COVERS_END: posY = self.itemHeight / 2 + 2 height = self.itemHeight - posY - 2 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.zap_add_pixmap)) if zapPixmaps & TIMER_TYPE_COVERS_BEGIN: posY = 2 height = self.itemHeight / 2 - 2 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.zap_post_pixmap)) elif zapPixmaps & TIMER_TYPE_ADD_COVERS_BEGIN: posY = 2 height = self.itemHeight / 2 - 2 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.zap_add_pixmap)) if zapPixmaps & TIMER_TYPE_ADD: posY = 2 height = self.itemHeight - 4 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.zap_add_pixmap)) offsetRight -= 10 if timerPixmaps: if (timerPixmaps & TIMER_TYPE_EID_MATCH) or (timerPixmaps & TIMER_TYPE_COVERS_FULL) or (timerPixmaps & TIMER_TYPE_EID_REPEATED) or (timerPixmaps & TIMER_TYPE_ADD_COVERS_FULL): posY = 2 height = self.itemHeight - 4 if (timerPixmaps & TIMER_TYPE_EID_MATCH): if (isRunning & TIMER_TYPE_EID_MATCH) and not self.blinkTimer.getBlinkState(): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, None)) else: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.timer_event_pixmap)) elif (timerPixmaps & TIMER_TYPE_COVERS_FULL): if (isRunning & TIMER_TYPE_COVERS_FULL) and not self.blinkTimer.getBlinkState(): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, None)) else: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.timer_pixmap)) elif (timerPixmaps & TIMER_TYPE_EID_REPEATED): if (isRunning & TIMER_TYPE_EID_REPEATED) and not self.blinkTimer.getBlinkState(): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, None)) else: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.timer_repeated_pixmap)) elif (timerPixmaps & TIMER_TYPE_ADD_COVERS_FULL): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.timer_add_pixmap)) elif (timerPixmaps & TIMER_TYPE_INSIDE_EVENT) or (timerPixmaps & TIMER_TYPE_ADD_INSIDE_EVENT): posY = self.itemHeight / 2 - 6 height = 12 if (timerPixmaps & TIMER_TYPE_INSIDE_EVENT): if (isRunning & TIMER_TYPE_INSIDE_EVENT) and not self.blinkTimer.getBlinkState(): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, None)) else: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.timer_pixmap)) elif (timerPixmaps & TIMER_TYPE_ADD_INSIDE_EVENT): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.timer_add_pixmap)) else: if timerPixmaps & TIMER_TYPE_COVERS_END: posY = self.itemHeight / 2 + 2 height = self.itemHeight - posY - 2 if (isRunning & TIMER_TYPE_COVERS_END) and not self.blinkTimer.getBlinkState(): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, None)) else: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.timer_pre_pixmap)) elif timerPixmaps & TIMER_TYPE_ADD_COVERS_END: posY = self.itemHeight / 2 + 2 height = self.itemHeight - posY - 2 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.timer_add_pixmap)) if timerPixmaps & TIMER_TYPE_COVERS_BEGIN: posY = 2 height = self.itemHeight / 2 - 2 if (isRunning & TIMER_TYPE_COVERS_BEGIN) and not self.blinkTimer.getBlinkState(): res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, None)) else: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.timer_post_pixmap)) elif timerPixmaps & TIMER_TYPE_ADD_COVERS_BEGIN: posY = 2 height = self.itemHeight / 2 - 2 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.timer_add_pixmap)) if timerPixmaps & TIMER_TYPE_ADD: posY = 2 height = self.itemHeight - 4 res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, offsetRight, posY, 8, height, self.timer_add_pixmap)) if config.plugins.merlinEpgCenter.showBeginRemainTime.value and config.plugins.merlinEpgCenter.showDuration.value: width = self.maxWidth * 8 / 100 offsetRight = offsetRight - width res.append((eListboxPythonMultiContent.TYPE_TEXT, offsetRight, 0, width, self.itemHeight, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, remainBeginString, progColor)) elif config.plugins.merlinEpgCenter.showBeginRemainTime.value: width = self.maxWidth * 6 / 100 offsetRight = offsetRight - width res.append((eListboxPythonMultiContent.TYPE_TEXT, offsetRight, 0, width, self.itemHeight, 1, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, remainBeginString, progColor)) if config.plugins.merlinEpgCenter.showDuration.value: width = self.maxWidth * 6 / 100 offsetRight = offsetRight - width elif not config.plugins.merlinEpgCenter.showDuration.value and not config.plugins.merlinEpgCenter.showBeginRemainTime.value: width = self.maxWidth * 1 / 100 offsetRight = offsetRight - width titleWidth = offsetRight - offsetLeft - columnSpace if self.listStyle == STYLE_SINGLE_LINE: res.append((eListboxPythonMultiContent.TYPE_TEXT, offsetLeft, 0, titleWidth, self.itemHeight, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, title, config.plugins.merlinEpgCenter.titleColor.value, config.plugins.merlinEpgCenter.titleColorSelected.value)) elif self.listStyle == STYLE_SHORT_DESCRIPTION: if short and title != short: res.append((eListboxPythonMultiContent.TYPE_TEXT, offsetLeft, border, titleWidth, self.halfItemHeight - border, 1, RT_HALIGN_LEFT|RT_VALIGN_TOP, title, textColor)) res.append((eListboxPythonMultiContent.TYPE_TEXT, offsetLeft, self.halfItemHeight, titleWidth, self.halfItemHeight - border, 2, RT_HALIGN_LEFT|RT_VALIGN_TOP, short, secondLineColor)) else: res.append((eListboxPythonMultiContent.TYPE_TEXT, offsetLeft, 0, titleWidth, self.itemHeight, 1, RT_HALIGN_LEFT|RT_VALIGN_CENTER, title, textColor)) if config.plugins.merlinEpgCenter.showDuration.value: res.append((eListboxPythonMultiContent.TYPE_TEXT, offsetRight, 0, width, self.itemHeight, 1, RT_HALIGN_RIGHT|RT_VALIGN_CENTER, duraString, textColor)) return res GUI_WIDGET = eListbox def selectionChanged(self): for x in self.onSelectionChanged: x() def postWidgetCreate(self, instance): instance.setWrapAround(True) instance.setContent(self.l) instance.selectionChanged.get().append(self.selectionChanged) def preWidgetRemove(self, instance): instance.setContent(None) instance.selectionChanged.get().remove(self.selectionChanged) config.plugins.merlinEpgCenter.listItemHeight.removeNotifier(self.changeHeight) config.plugins.merlinEpgCenter.adjustFontSize.removeNotifier(self.setFontSizes) self.blinkTimer.callbacks.remove(self.invalidateList) def moveToIndex(self, index): self.instance.moveSelectionTo(index) def moveUp(self): self.instance.moveSelection(self.instance.moveUp) def moveDown(self): self.instance.moveSelection(self.instance.moveDown) def pageUp(self): if self.instance is not None: self.instance.moveSelection(self.instance.pageUp) def pageDown(self): if self.instance is not None: self.instance.moveSelection(self.instance.pageDown) def getCurrent(self): return self.l.getCurrentSelection() def invalidate(self, entry): # when the entry to invalidate does not exist, just ignore the request. # this eases up conditional setup screens a lot. if entry in self.list: self.l.invalidateEntry(self.list.index(entry)) def invalidateList(self): self.l.invalidate() def setList(self, l): self.list = l self.l.setList(self.list) def queryEPG(self, servicelist): if self.epgcache is not None: return self.epgcache.lookupEvent(servicelist) return [ ] def fillMultiEPG(self, bouquet, bouquetIndex, mode, stime=-1): EpgCenterList.currentBouquetIndex = bouquetIndex # 1. if oldmode is MULTI_EPG_NOW and new mode is MULTI_EPG_NEXT --> use old list for querying EPG (speed up! :-) ) # 2. otherwise build servicelist from bouquet, and # a) if MULTI_EPG_NOW/MULTI_EPG_PRIMETIME --> query epg # b) if MULTI_EPG_NEXT --> build query-list with servicelist for epg oldmode = self.mode self.mode = mode self.similarShown = False if ((mode == MULTI_EPG_NOW or mode == MULTI_EPG_PRIMETIME) or (oldmode != MULTI_EPG_NOW and mode == MULTI_EPG_NEXT)): servicelist = EpgCenterList.getServiceList(bouquet, stime) returnTuples = '0IRBDTSEX' if mode == MULTI_EPG_NOW or mode == MULTI_EPG_PRIMETIME: servicelist.insert(0, returnTuples) else: if oldmode != MULTI_EPG_NOW: servicelist.insert(0, returnTuples) tmpList = self.queryEPG(servicelist) else: tmpList = self.list servicelist = [ x[3] and (x[2], 1, x[3]) or (x[2], 1, 0) for x in tmpList ] # build servicelist with "event after given start_time" and set the start time servicelist.insert(0, returnTuples) if self.listStyle == STYLE_SINGLE_LINE: self.changeHeight() self.list = self.queryEPG(servicelist) self.l.setList(self.list) def fillSingleEPG(self, bouquet, bouquetIndex, mode, sRef, showOutdated): self.mode = mode EpgCenterList.currentBouquetIndex = bouquetIndex EpgCenterList.getServiceList(bouquet) self.similarShown = False if sRef: if showOutdated: now = time() queryString = [ '0IRBDTSE', (sRef, 0, now - KEEP_OUTDATED_TIME * 60, KEEP_OUTDATED_TIME) ] else: queryString = [ '0IRBDTSE', (sRef, 0, -1, -1) ] self.list = self.queryEPG(queryString) if self.listStyle == STYLE_SINGLE_LINE: self.changeHeight() if showOutdated: self.list.sort(key = lambda x: x[3], reverse = True) # sort by time self.l.setList(self.list) def fillSimilar(self, sRef, eventId): if eventId is None: return self.similarShown = True self.list = self.epgcache.search(('0IRBDTSE', 1024, eEPGCache.SIMILAR_BROADCASTINGS_SEARCH, sRef, eventId)) if self.list is not None: if config.plugins.merlinEpgCenter.limitSearchToBouquetServices.value: for item in self.list[:]: if not item[2] in EpgCenterList.allServicesNameDict: self.list.remove(item) if self.listStyle == STYLE_SINGLE_LINE: self.changeHeight() self.list.sort(key = lambda x: x[3]) # sort by time self.l.setList(self.list) def fillEpgSearch(self, searchString, mode): self.mode = mode self.similarShown = False if searchString == None: self.list = [] else: searchString = searchString.decode('utf-8').encode("iso-8859-1","replace") self.list = self.epgcache.search(('0IRBDTSE', 1024, eEPGCache.PARTIAL_TITLE_SEARCH, searchString, eEPGCache.NO_CASE_CHECK)) or [] if config.plugins.merlinEpgCenter.limitSearchToBouquetServices.value: for item in self.list[:]: if not item[2] in EpgCenterList.allServicesNameDict: self.list.remove(item) self.list.sort(key = lambda x: x[3]) # sort by time if self.listStyle == STYLE_SINGLE_LINE: self.changeHeight() self.l.setList(self.list) @staticmethod def getServiceList(bouquet, stime=-1, sRefOnly = False): services = [ ] servicelist = eServiceCenter.getInstance().list(bouquet) if not servicelist is None: while True: service = servicelist.getNext() if not service.valid(): # check if end of list break if service.flags & (eServiceReference.isDirectory | eServiceReference.isMarker): # ignore non playable services continue # alternative service? if service.flags & (eServiceReference.isGroup): altRoot = eServiceReference(service.toCompareString()) altList = EpgCenterList.eServiceCenterInstance.list(altRoot) if altList: while True: nextService = altList.getNext() if not nextService.valid(): break service = nextService break if sRefOnly: services.append(service.toCompareString()) else: services.append((service.toCompareString(), 0, stime)) return services # get a list of all services in all bouquets @staticmethod def getAllServices(): allServices = {} index = 1 EpgCenterList.lenChannelDigits = 0 totalServices = 0 # the number of services in all bouquets for bouquetEntry in EpgCenterList.bouquetList: servicelist = eServiceCenter.getInstance().list(bouquetEntry[1]) if not servicelist is None: numServices = 0 while True: service = servicelist.getNext() if not service.valid(): # check if end of list break if service.flags & (eServiceReference.isDirectory | eServiceReference.isMarker): # ignore non playable services continue info = EpgCenterList.eServiceCenterInstance.info(service) serviceName = info.getName(service) or ServiceReference(service).getServiceName() or "" allServices[service.toCompareString()] = serviceName numServices += 1 indexEntry = index index += numServices totalServices += numServices EpgCenterList.bouquetIndexRanges.append(indexEntry) EpgCenterList.lenChannelDigits = len(str(totalServices)) return allServices @staticmethod def updateBouquetServices(): EpgCenterList.bouquetIndexRanges = [] EpgCenterList.allServicesNameDict = EpgCenterList.getAllServices() EpgCenterList.bouquetServices = [] for bouquet in EpgCenterList.bouquetList: EpgCenterList.bouquetServices.append(EpgCenterList.getServiceList(bouquet[1], sRefOnly = True)) def selectionEnabled(self, enabled): if self.instance is not None: self.instance.setSelectionEnable(enabled) def getTimerPixmapsForEntry(self, sRef, eventId, begin, duration): timerPixmaps = 0 zapPixmaps = 0 isRunning = 0 for timer in self.recordTimer.timer_list: if timer.service_ref.ref.toString() == sRef: end = begin + duration if timer.begin > begin and timer.end < end: # the timer is inside the events bounds if timer.justplay: zapPixmaps |= TIMER_TYPE_INSIDE_EVENT else: timerPixmaps |= TIMER_TYPE_INSIDE_EVENT if timer.isRunning(): isRunning |= TIMER_TYPE_INSIDE_EVENT elif end >= timer.begin and begin <= timer.end: # this event touches the timer if eventId == timer.eit: # exact event match if timer.repeated: if timer.justplay: zapPixmaps |= TIMER_TYPE_EID_REPEATED else: timerPixmaps |= TIMER_TYPE_EID_REPEATED if timer.isRunning(): isRunning |= TIMER_TYPE_EID_REPEATED else: if timer.justplay: zapPixmaps |= TIMER_TYPE_EID_MATCH else: timerPixmaps |= TIMER_TYPE_EID_MATCH if timer.isRunning(): isRunning |= TIMER_TYPE_EID_MATCH elif begin < timer.begin and end > timer.begin: # this event overlaps the end of the timer if timer.justplay: zapPixmaps |= TIMER_TYPE_COVERS_END else: timerPixmaps |= TIMER_TYPE_COVERS_END if timer.isRunning(): isRunning |= TIMER_TYPE_COVERS_END elif end > timer.end and begin < timer.end: # this event overlaps the begin of the timer if timer.justplay: zapPixmaps |= TIMER_TYPE_COVERS_BEGIN else: timerPixmaps |= TIMER_TYPE_COVERS_BEGIN if timer.isRunning(): isRunning |= TIMER_TYPE_COVERS_BEGIN elif end > timer.begin and begin < timer.end: # this event fully overlaps the timer but itsn't nor the timer event if timer.justplay: zapPixmaps |= TIMER_TYPE_COVERS_FULL else: timerPixmaps |= TIMER_TYPE_COVERS_FULL if timer.isRunning(): isRunning |= TIMER_TYPE_COVERS_FULL elif timerPixmaps == 0 and zapPixmaps == 0 and self.recordTimer.isInTimer(eventId, begin, duration, sRef): # timer repetition # TODO do we need to care about local times? timerBegin = datetime.fromtimestamp(timer.begin).time() timerEnd = datetime.fromtimestamp(timer.end).time() netTimerBegin = datetime.fromtimestamp(int(timer.begin) + 60 * config.recording.margin_before.value).time() netTimerEnd = datetime.fromtimestamp(int(timer.end) - 60 * config.recording.margin_after.value).time() eventBegin = datetime.fromtimestamp(begin).time() eventEnd = datetime.fromtimestamp(end).time() if netTimerBegin == eventBegin and netTimerEnd == eventEnd: # the main timer entry if timer.justplay: zapPixmaps |= TIMER_TYPE_ADD else: timerPixmaps |= TIMER_TYPE_ADD elif netTimerBegin >= eventBegin and netTimerEnd <= eventEnd: # the timer is inside the events bounds if timer.justplay: zapPixmaps |= TIMER_TYPE_ADD_INSIDE_EVENT else: timerPixmaps |= TIMER_TYPE_ADD_INSIDE_EVENT elif eventBegin < timerBegin and eventEnd > timerBegin: # this event overlaps the end of the timer if timer.justplay: zapPixmaps |= TIMER_TYPE_ADD_COVERS_END else: timerPixmaps |= TIMER_TYPE_ADD_COVERS_END elif eventEnd > timerEnd and eventBegin < timerEnd: # this event overlaps the begin of the timer if timer.justplay: zapPixmaps |= TIMER_TYPE_ADD_COVERS_BEGIN else: timerPixmaps |= TIMER_TYPE_ADD_COVERS_BEGIN elif eventEnd > timerBegin and eventBegin < timerEnd: # this event fully overlaps the timer but itsn't nor the timer event if timer.justplay: zapPixmaps |= TIMER_TYPE_ADD_COVERS_FULL else: timerPixmaps |= TIMER_TYPE_ADD_COVERS_FULL return timerPixmaps, zapPixmaps, isRunning
def buildTimerEntry(self, timer, processed): pixmap = None if timer.service_ref.ref.flags & eServiceReference.isGroup: pixmap = self.picServiceGroup else: orbpos = timer.service_ref.ref.getUnsignedData(4) >> 16 if orbpos == 0xFFFF: pixmap = self.picDVB_C elif orbpos == 0xEEEE: pixmap = self.picDVB_T else: pixmap = self.picDVB_S res = [ None ] res.append(timer.service_ref.getServiceName()) res.append(pixmap) res.append(timer.name) repeatedtext = "" days = ( _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun") ) if timer.repeated: flags = timer.repeated count = 0 for x in (0, 1, 2, 3, 4, 5, 6): if (flags & 1 == 1): if (count != 0): repeatedtext += ", " repeatedtext += days[x] count += 1 flags = flags >> 1 if timer.justplay: if timer.end - timer.begin < 4: # rounding differences repeatedtext += ((" %s "+ _("(ZAP)")) % (FuzzyTime(timer.begin)[1])) else: repeatedtext += ((" %s ... %s (%d " + _("mins") + ") ") % (FuzzyTime(timer.begin)[1], FuzzyTime(timer.end)[1], (timer.end - timer.begin) / 60)) + _("(ZAP)") else: repeatedtext += ((" %s ... %s (%d " + _("mins") + ")") % (FuzzyTime(timer.begin)[1], FuzzyTime(timer.end)[1], (timer.end - timer.begin) / 60)) else: if timer.justplay: if timer.end - timer.begin < 4: repeatedtext += (("%s, %s " + _("(ZAP)")) % (FuzzyTime(timer.begin))) else: repeatedtext += (("%s, %s ... %s (%d " + _("mins") + ") ") % (FuzzyTime(timer.begin) + FuzzyTime(timer.end)[1:] + ((timer.end - timer.begin) / 60,))) + _("(ZAP)") else: repeatedtext += (("%s, %s ... %s (%d " + _("mins") + ")") % (FuzzyTime(timer.begin) + FuzzyTime(timer.end)[1:] + ((timer.end - timer.begin) / 60,))) res.append(repeatedtext) if not processed: if timer.state == TimerEntry.StateWaiting: state = _("waiting") elif timer.state == TimerEntry.StatePrepared: state = _("about to start") elif timer.state == TimerEntry.StateRunning: if timer.justplay: state = _("zapped") else: state = _("recording...") elif timer.state == TimerEntry.StateEnded: state = _("done!") else: state = _("<unknown>") else: state = _("done!") if timer.disabled: state = _("disabled") res.append(state) png = None if timer.disabled: png = LoadPixmap(resolveFilename(SCOPE_CURRENT_SKIN, "skin_default/icons/redx.png")) res.append(png) return res
def showNextSpinner(self): self.curr += 1 if self.curr > 10: self.curr = 0 png = LoadPixmap(cached=True, path=PNG_PATH + str(self.curr) + ".png") self["spinner"].instance.setPixmap(png)
def buildMy_rec(self, device): device2 = '' try: if device.find('1') > 1: device2 = device.replace('1', '') except: device2 = '' try: if device.find('2') > 1: device2 = device.replace('2', '') except: device2 = '' try: if device.find('3') > 1: device2 = device.replace('3', '') except: device2 = '' try: if device.find('4') > 1: device2 = device.replace('4', '') except: device2 = '' try: if device.find('5') > 1: device2 = device.replace('5', '') except: device2 = '' try: if device.find('6') > 1: device2 = device.replace('6', '') except: device2 = '' try: if device.find('7') > 1: device2 = device.replace('7', '') except: device2 = '' try: if device.find('8') > 1: device2 = device.replace('8', '') except: device2 = '' try: if device.find('p1') > 1: device2 = device.replace('p1', '') except: device2 = '' try: if device.find('p2') > 1: device2 = device.replace('p2', '') except: device2 = '' try: if device.find('p3') > 1: device2 = device.replace('p3', '') except: device2 = '' try: if device.find('p4') > 1: device2 = device.replace('p4', '') except: device2 = '' try: if device.find('p5') > 1: device2 = device.replace('p5', '') except: device2 = '' try: if device.find('p6') > 1: device2 = device.replace('p6', '') except: device2 = '' try: if device.find('p7') > 1: device2 = device.replace('p7', '') except: device2 = '' try: if device.find('p8') > 1: device2 = device.replace('p8', '') except: device2 = '' devicetype = path.realpath('/sys/block/' + device2 + '/device') d2 = device name = 'USB: ' mypixmap = '/usr/lib/enigma2/python/Plugins/Extensions/spaTeam/icons/dev_usbstick.png' if device2.startswith('mmcblk'): model = file('/sys/block/' + device2 + '/device/name').read() mypixmap = '/usr/lib/enigma2/python/Plugins/Extensions/spaTeam/icons/dev_mmc.png' name = 'MMC: ' else: model = file('/sys/block/' + device2 + '/device/model').read() model = str(model).replace('\n', '') des = '' if devicetype.find('/devices/pci') != -1 or devicetype.find( 'ahci') != -1: name = _("HARD DISK: ") mypixmap = '/usr/lib/enigma2/python/Plugins/Extensions/spaTeam/icons/dev_hdd.png' name = name + model self.Console = Console() self.Console.ePopen( "sfdisk -l | grep swap | awk '{print $(NF-9)}' >/tmp/devices.tmp") sleep(0.5) try: f = open('/tmp/devices.tmp', 'r') swapdevices = f.read() f.close() except: swapdevices = ' ' if path.exists('/tmp/devices.tmp'): remove('/tmp/devices.tmp') swapdevices = swapdevices.replace('\n', '') swapdevices = swapdevices.split('/') f = open('/proc/mounts', 'r') for line in f.readlines(): if line.find(device) != -1: parts = line.strip().split() d1 = parts[1] dtype = parts[2] rw = parts[3] break continue else: if device in swapdevices: parts = line.strip().split() d1 = _("None") dtype = 'swap' rw = _("None") break continue else: d1 = _("None") dtype = _("unavailable") rw = _("None") f.close() f = open('/proc/partitions', 'r') for line in f.readlines(): if line.find(device) != -1: parts = line.strip().split() size = int(parts[2]) if (((float(size) / 1024) / 1024) / 1024) > 1: des = _("Size: ") + str( round((( (float(size) / 1024) / 1024) / 1024), 2)) + _("TB") elif ((size / 1024) / 1024) > 1: des = _("Size: ") + str((size / 1024) / 1024) + _("GB") else: des = _("Size: ") + str(size / 1024) + _("MB") else: try: size = file('/sys/block/' + device2 + '/' + device + '/size').read() size = str(size).replace('\n', '') size = int(size) except: size = 0 if ((((float(size) / 2) / 1024) / 1024) / 1024) > 1: des = _("Size: ") + str( round(((((float(size) / 2) / 1024) / 1024) / 1024), 2)) + _("TB") elif (((size / 2) / 1024) / 1024) > 1: des = _("Size: ") + str( ((size / 2) / 1024) / 1024) + _("GB") else: des = _("Size: ") + str((size / 2) / 1024) + _("MB") f.close() if des != '': if rw.startswith('rw'): rw = ' R/W' elif rw.startswith('ro'): rw = ' R/O' else: rw = "" #des += '\t' + _("Mount: ") + d1 + '\n' + _("Device: ") + '/dev/' + device + '\t' + _("Type: ") + dtype + rw png = LoadPixmap(mypixmap) mountP = _("Mount: ") + d1 deviceP = _("Device: ") + '/dev/' + device typ = _("Type: ") + dtype + rw res = (name, des, png, mountP, deviceP, typ) self.list.append(res)
class TimerList(HTMLComponent, GUIComponent, object): # # | <Name of the Timer> <Service> | # | <state> <orb.pos.> <start, end> | # def buildTimerEntry(self, timer, processed): width = self.l.getItemSize().width() res = [ None ] serviceName = timer.service_ref.getServiceName() serviceNameWidth = getTextBoundarySize(self.instance, self.serviceNameFont, self.l.getItemSize(), serviceName).width() if 200 > width - serviceNameWidth - self.iconWidth - self.iconMargin: serviceNameWidth = width - 200 - self.iconWidth - self.iconMargin res.append((eListboxPythonMultiContent.TYPE_TEXT, width - serviceNameWidth, 0, serviceNameWidth, self.rowSplit, 0, RT_HALIGN_RIGHT|RT_VALIGN_BOTTOM, serviceName)) res.append((eListboxPythonMultiContent.TYPE_TEXT, self.iconWidth + self.iconMargin, 0, width - serviceNameWidth - self.iconWidth - self.iconMargin, self.rowSplit, 2, RT_HALIGN_LEFT|RT_VALIGN_BOTTOM, timer.name)) begin = FuzzyTime(timer.begin) if timer.repeated: days = ( _("Mon"), _("Tue"), _("Wed"), _("Thu"), _("Fri"), _("Sat"), _("Sun") ) repeatedtext = [] flags = timer.repeated for x in (0, 1, 2, 3, 4, 5, 6): if (flags & 1 == 1): repeatedtext.append(days[x]) flags = flags >> 1 repeatedtext = ", ".join(repeatedtext) if self.iconRepeat: res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, self.iconMargin / 2, self.rowSplit + (self.itemHeight - self.rowSplit - self.iconHeight) / 2, self.iconWidth, self.iconHeight, self.iconRepeat)) else: repeatedtext = begin[0] # date if timer.justplay: text = repeatedtext + ((" %s "+ _("(ZAP)")) % (begin[1])) else: text = repeatedtext + ((" %s ... %s (%d " + _("mins") + ")") % (begin[1], FuzzyTime(timer.end)[1], (timer.end - timer.begin) / 60)) icon = None if not processed: if timer.state == TimerEntry.StateWaiting: state = _("waiting") icon = self.iconWait elif timer.state == TimerEntry.StatePrepared: state = _("about to start") icon = self.iconPrepared elif timer.state == TimerEntry.StateRunning: if timer.justplay: state = _("zapped") icon = self.iconZapped else: state = _("recording...") icon = self.iconRecording elif timer.state == TimerEntry.StateEnded: state = _("done!") icon = self.iconDone else: state = _("<unknown>") icon = None elif timer.disabled: state = _("disabled") icon = self.iconDisabled else: state = _("done!") icon = self.iconDone icon and res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, self.iconMargin / 2, (self.rowSplit - self.iconHeight) / 2, self.iconWidth, self.iconHeight, icon)) orbpos = self.getOrbitalPos(timer.service_ref) orbposWidth = getTextBoundarySize(self.instance, self.font, self.l.getItemSize(), orbpos).width() res.append((eListboxPythonMultiContent.TYPE_TEXT, self.satPosLeft, self.rowSplit, orbposWidth, self.itemHeight - self.rowSplit, 1, RT_HALIGN_LEFT|RT_VALIGN_TOP, orbpos)) res.append((eListboxPythonMultiContent.TYPE_TEXT, self.iconWidth + self.iconMargin, self.rowSplit, self.satPosLeft - self.iconWidth - self.iconMargin, self.itemHeight - self.rowSplit, 1, RT_HALIGN_LEFT|RT_VALIGN_TOP, state)) res.append((eListboxPythonMultiContent.TYPE_TEXT, self.satPosLeft + orbposWidth, self.rowSplit, width - self.satPosLeft - orbposWidth, self.itemHeight - self.rowSplit, 1, RT_HALIGN_RIGHT|RT_VALIGN_TOP, text)) return res def __init__(self, list): GUIComponent.__init__(self) self.l = eListboxPythonMultiContent() self.l.setBuildFunc(self.buildTimerEntry) self.serviceNameFont = gFont("Regular", 20) self.font = gFont("Regular", 18) self.eventNameFont = gFont("Regular", 18) self.l.setList(list) self.itemHeight = 50 self.rowSplit = 25 self.iconMargin = 4 self.satPosLeft = 160 self.iconWait = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/timer_wait.png")) #currently intended that all icons have the same size self.iconWidth = self.iconWait.size().width() self.iconHeight = self.iconWait.size().height() self.iconRecording = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/timer_rec.png")) self.iconPrepared = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/timer_prep.png")) self.iconDone = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/timer_done.png")) self.iconRepeat = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/timer_rep.png")) self.iconZapped = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/timer_zap.png")) self.iconDisabled = LoadPixmap(resolveFilename(SCOPE_SKIN_IMAGE, "skin_default/icons/timer_off.png")) def applySkin(self, desktop, parent): def itemHeight(value): self.itemHeight = int(value) def setServiceNameFont(value): self.serviceNameFont = parseFont(value, ((1,1),(1,1))) def setEventNameFont(value): self.eventNameFont = parseFont(value, ((1,1),(1,1))) def setFont(value): self.font = parseFont(value, ((1,1),(1,1))) def rowSplit(value): self.rowSplit = int(value) def iconMargin(value): self.iconMargin = int(value) def satPosLeft(value): self.satPosLeft = int(value) for (attrib, value) in list(self.skinAttributes): try: locals().get(attrib)(value) self.skinAttributes.remove((attrib, value)) except: pass self.l.setItemHeight(self.itemHeight) self.l.setFont(0, self.serviceNameFont) self.l.setFont(1, self.font) self.l.setFont(2, self.eventNameFont) return GUIComponent.applySkin(self, desktop, parent) def getCurrent(self): cur = self.l.getCurrentSelection() return cur and cur[0] GUI_WIDGET = eListbox def postWidgetCreate(self, instance): instance.setContent(self.l) self.instance = instance instance.setWrapAround(True) def moveToIndex(self, index): self.instance.moveSelectionTo(index) def getCurrentIndex(self): return self.instance.getCurrentIndex() currentIndex = property(getCurrentIndex, moveToIndex) currentSelection = property(getCurrent) def moveDown(self): self.instance.moveSelection(self.instance.moveDown) def invalidate(self): self.l.invalidate() def entryRemoved(self, idx): self.l.entryRemoved(idx) def getOrbitalPos(self, ref): refstr = '' if hasattr(ref, 'sref'): refstr = str(ref.sref) else: refstr = str(ref) refstr = refstr and GetWithAlternative(refstr) if '%3a//' in refstr: return "%s" % _("Stream") op = int(refstr.split(':', 10)[6][:-4] or "0",16) if op == 0xeeee: return "%s" % _("DVB-T") if op == 0xffff: return "%s" % _("DVB-C") direction = 'E' if op > 1800: op = 3600 - op direction = 'W' return ("%d.%d\xc2\xb0%s") % (op // 10, op % 10, direction)
def MountEntry(description, details): picture = LoadPixmap(cached = True, path = resolveFilename(SCOPE_CURRENT_PLUGIN, "SystemPlugins/DeviceManager/icons/diskusb.png")); return (picture, description, details)
class VirtualKeyBoard(Screen): skin = '''<screen name="KodiLiteVKskin" position="center,center" size="1200,560" zPosition="99" title="Virtual keyboard"> <ePixmap pixmap="skin_default/vkey_text.png" position="300,245" zPosition="-4" size="542,52" alphatest="on" /> <widget source="country" render="Pixmap" position="40,400" size="60,40" alphatest="on" borderWidth="2" borderColor="yellow" > <convert type="ValueToPixmap">LanguageCode</convert> </widget> <eLabel text="language" position="40,350" size="100,35" font="Regular;21" foregroundColor="white" backgroundColor="yellow" /> <widget name="header" position="10,10" size="500,20" font="Regular;20" transparent="1" noWrap="1" /> <widget name="text" position="302,250" size="536,46" font="Regular;42" transparent="1" noWrap="1" halign="right" /> <widget name="list" position="300,300" size="680,240" selectionDisabled="1" transparent="1" /> <eLabel text="Press blue for suggestion" position="900,10" size="300,35" font="Regular;21" foregroundColor="blue" backgroundColor="white" /> <widget name="suggestlist" position="900,50" size="300,200" selectionDisabled="1" transparent="1" /> <eLabel text="Press red for history" position="50,10" size="300,35" font="Regular;21" foregroundColor="red" backgroundColor="white" /> <widget name="historylist" position="50,50" size="200,200" selectionDisabled="1" transparent="1" /> </screen>''' def __init__(self, session, title='', text=''): Screen.__init__(self, session) self.skinName = 'KodiLiteVKskin' self.keys_list = [] self.session = session self.shiftkeys_list = [] self.lang = language.getLanguage() self.nextLang = None self.shiftMode = False self.text = text self.selectedKey = 0 self['suggestlist'] = MenuList([]) self['historylist'] = MenuList([]) self.key_bg = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_bg.png')) self.key_sel = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_sel.png')) self.key_backspace = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_backspace.png')) self.key_all = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_all.png')) self.key_clr = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_clr.png')) self.key_esc = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_esc.png')) self.key_ok = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_ok.png')) self.key_shift = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_shift.png')) self.key_shift_sel = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_shift_sel.png')) self.key_space = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_space.png')) self.key_left = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_left.png')) self.key_right = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_right.png')) self.keyImages = { 'BACKSPACE': self.key_backspace, 'ALL': self.key_all, 'EXIT': self.key_esc, 'OK': self.key_ok, 'SHIFT': self.key_shift, 'SPACE': self.key_space, 'LEFT': self.key_left, 'RIGHT': self.key_right } self.keyImagesShift = { 'BACKSPACE': self.key_backspace, 'CLEAR': self.key_clr, 'EXIT': self.key_esc, 'OK': self.key_ok, 'SHIFT': self.key_shift_sel, 'SPACE': self.key_space, 'LEFT': self.key_left, 'RIGHT': self.key_right } self['country'] = StaticText('') self['header'] = Label('') self['text'] = Label(self.text) self['list'] = VirtualKeyBoardList([]) self['actions'] = ActionMap( [ 'ColorActions', 'OkCancelActions', 'WizardActions', 'KeyboardInputActions', 'InputBoxActions', 'InputAsciiActions', "MenuActions" ], { 'gotAsciiCode': self.keyGotAscii, 'ok': self.okClicked, 'cancel': self.exit, 'left': self.left, 'right': self.right, 'up': self.up, 'down': self.down, 'red': self.history, 'green': self.ok, 'blue': self.suggest, 'menu': self.showmenu, 'yellow': self.switchLang, 'deleteBackward': self.backClicked, '0': self.insertspace, 'back': self.exit }, -2) self.setLang() self.displayhistory() self.onExecBegin.append(self.setKeyboardModeAscii) self.onLayoutFinish.append(self.buildVirtualKeyBoard) self.onLayoutFinish.append(self.getsuggestion) self.currentlist = 'list' return def showmenu(self): nlines = [] nlines.append( (str("Clear search history"), str("Clear search history"))) self.session.openWithCallback(self.choicesback, ChoiceBox, _('select action'), nlines) def choicesback(self, select): if select: if select[0] == 'Clear search history': self.historydel() def historydel(self): self.session.openWithCallback( self.delhx, MessageBox, _('All search history items will be deleted,are you sure?'), MessageBox.TYPE_YESNO) def delhx(self, answer): if answer: hfile = '/etc/history' try: os.remove(hfile) self['historylist'].setList([]) except: print 'failed to delete history' def suggest(self): debug = True self['suggestlist'].selectionEnabled(1) self['historylist'].selectionEnabled(0) self['list'].selectionEnabled(0) self.currentlist = 'suggestlist' def history(self): self['suggestlist'].selectionEnabled(0) self['historylist'].selectionEnabled(1) self['list'].selectionEnabled(0) self.currentlist = 'historylist' def displayhistory(self): hfile = '/etc/history' if not os.path.exists(hfile): return lines = open(hfile).readlines() list1 = [] for line in lines: list1.append(line.strip()) self['historylist'].setList(list1) def getsuggestion(self): word = self['text'].getText() if word.strip() == '': return lang = self.lang.split('_')[0] self.suggestions = GoogleSuggestions(self.suggestcallback, lang) self.suggestions.getSuggestions(word, hl=lang) def suggestcallback(self, data): if data is None: return else: list1 = data print 'list1', list1 self['suggestlist'].setList(list1) return return def suggestback(self, select): print '143', select if select: self['text'].setText(str(select)) def switchLang(self): self.lang = self.nextLang self.setLang() self.buildVirtualKeyBoard() def setLang(self): if self.lang == 'de_DE': self.keys_list = [[ u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE' ], [ u'q', u'w', u'e', u'r', u't', u'z', u'u', u'i', u'o', u'p', u'\xfc', u'+' ], [ u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u'\xf6', u'\xe4', u'#' ], [ u'<', u'y', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'-', u'CLEAR' ], [u'SHIFT', u'SPACE', u'@', u'\xdf', u'OK']] self.shiftkeys_list = [[ u'EXIT', u'!', u'"', u'\xa7', u'$', u'%', u'&', u'/', u'(', u')', u'=', u'BACKSPACE' ], [ u'Q', u'W', u'E', u'R', u'T', u'Z', u'U', u'I', u'O', u'P', u'\xdc', u'*' ], [ u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'\xd6', u'\xc4', u"'" ], [ u'>', u'Y', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR' ], [u'SHIFT', u'SPACE', u'?', u'\\', u'OK']] self.nextLang = 'ar_AE' elif self.lang == 'ar_AE': self.keys_list = [[ u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE' ], [ u'\u0636', u'\u0635', u'\u062b', u'\u0642', u'\u0641', u'\u063a', u'\u0639', u'\u0647', u'\u062e', u'\u062d', u'\u062c', u'\u062f' ], [ u'\u0634', u'\u0633', u'\u064a', u'\u0628', u'\u0644', u'\u0627', u'\u062a', u'\u0646', u'\u0645', u'\u0643', u'\u0637', u'\u0630' ], [ u'\u0626', u'\u0621', u'\u0624', u'\u0631', u'\u0644\u0627', u'\u0649', u'\u0629', u'\u0648', u'\u0632', '\xd8\xb8', u'#', u'CLEAR' ], [ u'SHIFT', u'SPACE', u'-', u'@', u'.', u'\u0644\u0622', u'\u0622', u'\u0644\u0623', u'\u0644\u0625', u'\u0625', u'\u0623', u'OK' ]] self.shiftkeys_list = [[ u'EXIT', u'!', u'"', u'\xa7', u'$', u'^', u'<', u'>', u'(', u')', u'=', u'BACKSPACE' ], [ u'\u064e', u'\u064b', u'\u064f', u'\u064c', u'%', u'\u060c', u'\u2018', u'\xf7', u'\xd7', u'\u061b', u'<', u'>' ], [ u'\u0650', u'\u064d', u']', u'[', u'*', u'+', u'\u0640', u'\u060c', u'/', u':', u'~', u"'" ], [ u'\u0652', u'}', u'{', u'-', u'/', u'\u2019', u',', u'.', u'\u061f', u':', u'_', u'CLEAR' ], [ u'SHIFT', u'SPACE', u'?', u'\\', u'=', u'\u0651', u'~', u'OK' ]] self.nextLang = 'es_ES' elif self.lang == 'es_ES': self.keys_list = [[ u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE' ], [ u'q', u'w', u'e', u'r', u't', u'z', u'u', u'i', u'o', u'p', u'\xfa', u'+' ], [ u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u'\xf3', u'\xe1', u'#' ], [ u'<', u'y', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'-', u'ALL' ], [ u'SHIFT', u'SPACE', u'@', u'\u0141', u'\u0155', u'\xe9', u'\u010d', u'\xed', u'\u011b', u'\u0144', u'\u0148', u'OK' ]] self.shiftkeys_list = [[ u'EXIT', u'!', u'"', u'\xa7', u'$', u'%', u'&', u'/', u'(', u')', u'=', u'BACKSPACE' ], [ u'Q', u'W', u'E', u'R', u'T', u'Z', u'U', u'I', u'O', u'P', u'\xda', u'*' ], [ u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'\xd3', u'\xc1', u"'" ], [ u'>', u'Y', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR' ], [ u'SHIFT', u'SPACE', u'?', u'\\', u'\u0154', u'\xc9', u'\u010c', u'\xcd', u'\u011a', u'\u0143', u'\u0147', u'OK' ]] self.nextLang = 'fi_FI' elif self.lang == 'fi_FI': self.keys_list = [[ u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE' ], [ u'q', u'w', u'e', u'r', u't', u'z', u'u', u'i', u'o', u'p', u'\xe9', u'+' ], [ u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u'\xf6', u'\xe4', u'#' ], [ u'<', u'y', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'-', u'CLEAR' ], [ u'SHIFT', u'SPACE', u'@', u'\xdf', u'\u013a', u'OK' ]] self.shiftkeys_list = [[ u'EXIT', u'!', u'"', u'\xa7', u'$', u'%', u'&', u'/', u'(', u')', u'=', u'BACKSPACE' ], [ u'Q', u'W', u'E', u'R', u'T', u'Z', u'U', u'I', u'O', u'P', u'\xc9', u'*' ], [ u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'\xd6', u'\xc4', u"'" ], [ u'>', u'Y', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR' ], [ u'SHIFT', u'SPACE', u'?', u'\\', u'\u0139', u'OK' ]] self.nextLang = 'sv_SE' elif self.lang == 'sv_SE': self.keys_list = [[ u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE' ], [ u'q', u'w', u'e', u'r', u't', u'z', u'u', u'i', u'o', u'p', u'\xe9', u'+' ], [ u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u'\xf6', u'\xe4', u'#' ], [ u'<', u'y', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'-', u'CLEAR' ], [ u'SHIFT', u'SPACE', u'@', u'\xdf', u'\u013a', u'OK' ]] self.shiftkeys_list = [[ u'EXIT', u'!', u'"', u'\xa7', u'$', u'%', u'&', u'/', u'(', u')', u'=', u'BACKSPACE' ], [ u'Q', u'W', u'E', u'R', u'T', u'Z', u'U', u'I', u'O', u'P', u'\xc9', u'*' ], [ u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'\xd6', u'\xc4', u"'" ], [ u'>', u'Y', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR' ], [ u'SHIFT', u'SPACE', u'?', u'\\', u'\u0139', u'OK' ]] self.nextLang = 'sk_SK' elif self.lang == 'sk_SK': self.keys_list = [[ u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE' ], [ u'q', u'w', u'e', u'r', u't', u'z', u'u', u'i', u'o', u'p', u'\xfa', u'+' ], [ u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u'\u013e', u'@', u'#' ], [ u'<', u'y', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'-', u'CLEAR' ], [ u'SHIFT', u'SPACE', u'\u0161', u'\u010d', u'\u017e', u'\xfd', u'\xe1', u'\xed', u'\xe9', u'OK' ]] self.shiftkeys_list = [[ u'EXIT', u'!', u'"', u'\xa7', u'$', u'%', u'&', u'/', u'(', u')', u'=', u'BACKSPACE' ], [ u'Q', u'W', u'E', u'R', u'T', u'Z', u'U', u'I', u'O', u'P', u'\u0165', u'*' ], [ u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'\u0148', u'\u010f', u"'" ], [ u'\xc1', u'\xc9', u'\u010e', u'\xcd', u'\xdd', u'\xd3', u'\xda', u'\u017d', u'\u0160', u'\u010c', u'\u0164', u'\u0147' ], [ u'>', u'Y', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR' ], [ u'SHIFT', u'SPACE', u'?', u'\\', u'\xe4', u'\xf6', u'\xfc', u'\xf4', u'\u0155', u'\u013a', u'OK' ]] self.nextLang = 'cs_CZ' elif self.lang == 'cs_CZ': self.keys_list = [[ u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE' ], [ u'q', u'w', u'e', u'r', u't', u'z', u'u', u'i', u'o', u'p', u'\xfa', u'+' ], [ u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u'\u016f', u'@', u'#' ], [ u'<', u'y', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'-', u'CLEAR' ], [ u'SHIFT', u'SPACE', u'\u011b', u'\u0161', u'\u010d', u'\u0159', u'\u017e', u'\xfd', u'\xe1', u'\xed', u'\xe9', u'OK' ]] self.shiftkeys_list = [[ u'EXIT', u'!', u'"', u'\xa7', u'$', u'%', u'&', u'/', u'(', u')', u'=', u'BACKSPACE' ], [ u'Q', u'W', u'E', u'R', u'T', u'Z', u'U', u'I', u'O', u'P', u'\u0165', u'*' ], [ u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'\u0148', u'\u010f', u"'" ], [ u'>', u'Y', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR' ], [ u'SHIFT', u'SPACE', u'?', u'\\', u'\u010c', u'\u0158', u'\u0160', u'\u017d', u'\xda', u'\xc1', u'\xc9', u'OK' ]] self.nextLang = 'el_GR' elif self.lang == 'el_GR': self.keys_list = [[ u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE' ], [ u'=', u'\u03c2', u'\u03b5', u'\u03c1', u'\u03c4', u'\u03c5', u'\u03b8', u'\u03b9', u'\u03bf', u'\u03c0', u'[', u']' ], [ u'\u03b1', u'\u03c3', u'\u03b4', u'\u03c6', u'\u03b3', u'\u03b7', u'\u03be', u'\u03ba', u'\u03bb', u';', u"'", u'-' ], [ u'\\', u'\u03b6', u'\u03c7', u'\u03c8', u'\u03c9', u'\u03b2', u'\u03bd', u'\u03bc', u',', '.', u'/', u'CLEAR' ], [ u'SHIFT', u'SPACE', u'\u03ac', u'\u03ad', u'\u03ae', u'\u03af', u'\u03cc', u'\u03cd', u'\u03ce', u'\u03ca', u'\u03cb', u'OK' ]] self.shiftkeys_list = [[ u'EXIT', u'!', u'@', u'#', u'$', u'%', u'^', u'&', u'*', u'(', u')', u'BACKSPACE' ], [ u'+', u'\u20ac', u'\u0395', u'\u03a1', u'\u03a4', u'\u03a5', u'\u0398', u'\u0399', u'\u039f', u'\u03a0', u'{', u'}' ], [ u'\u0391', u'\u03a3', u'\u0394', u'\u03a6', u'\u0393', u'\u0397', u'\u039e', u'\u039a', u'\u039b', u':', u'"', u'_' ], [ u'|', u'\u0396', u'\u03a7', u'\u03a8', u'\u03a9', u'\u0392', u'\u039d', u'\u039c', u'<', u'>', u'?', u'CLEAR' ], [ u'SHIFT', u'SPACE', u'\u0386', u'\u0388', u'\u0389', u'\u038a', u'\u038c', u'\u038e', u'\u038f', u'\u03aa', u'\u03ab', u'OK' ]] self.nextLang = 'pl_PL' elif self.lang == 'pl_PL': self.keys_list = [[ u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE' ], [ u'q', u'w', u'e', u'r', u't', u'y', u'u', u'i', u'o', u'p', u'-', u'[' ], [ u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u';', u"'", u'\\' ], [ u'<', u'z', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'/', u'CLEAR' ], [ u'SHIFT', u'SPACE', u'\u0105', u'\u0107', u'\u0119', u'\u0142', u'\u0144', u'\xf3', u'\u015b', u'\u017a', u'\u017c', u'OK' ]] self.shiftkeys_list = [[ u'EXIT', u'!', u'@', u'#', u'$', u'%', u'^', u'&', u'(', u')', u'=', u'BACKSPACE' ], [ u'Q', u'W', u'E', u'R', u'T', u'Y', u'U', u'I', u'O', u'P', u'*', u']' ], [ u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'?', u'"', u'|' ], [ u'>', u'Z', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR' ], [ u'SHIFT', u'SPACE', u'\u0104', u'\u0106', u'\u0118', u'\u0141', u'\u0143', u'\xd3', u'\u015a', u'\u0179', u'\u017b', u'OK' ]] self.nextLang = 'en_EN' else: self.keys_list = [[ u'EXIT', u'1', u'2', u'3', u'4', u'5', u'6', u'7', u'8', u'9', u'0', u'BACKSPACE' ], [ u'q', u'w', u'e', u'r', u't', u'y', u'u', u'i', u'o', u'p', u'-', u'[' ], [ u'a', u's', u'd', u'f', u'g', u'h', u'j', u'k', u'l', u';', u"'", u'\\' ], [ u'<', u'z', u'x', u'c', u'v', u'b', u'n', u'm', u',', '.', u'/', u'CLEAR' ], [u'SHIFT', u'SPACE', u'OK', u'*']] self.shiftkeys_list = [[ u'EXIT', u'!', u'@', u'#', u'$', u'%', u'^', u'&', u'(', u')', u'=', u'BACKSPACE' ], [ u'Q', u'W', u'E', u'R', u'T', u'Y', u'U', u'I', u'O', u'P', u'+', u']' ], [ u'A', u'S', u'D', u'F', u'G', u'H', u'J', u'K', u'L', u'?', u'"', u'|' ], [ u'>', u'Z', u'X', u'C', u'V', u'B', u'N', u'M', u';', u':', u'_', u'CLEAR' ], [u'SHIFT', u'SPACE', u'OK', u'~']] self.lang = 'en_EN' self.nextLang = 'de_DE' self['country'].setText(self.lang) self.max_key = 47 + len(self.keys_list[4]) def virtualKeyBoardEntryComponent(self, keys): w, h = parameters.get('VirtualKeyboard', (45, 45)) key_bg_width = self.key_bg and self.key_bg.size().width() or w key_images = self.shiftMode and self.keyImagesShift or self.keyImages res = [keys] text = [] x = 0 for key in keys: png = key_images.get(key, None) if png: width = png.size().width() res.append( MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, h), png=png)) else: width = key_bg_width res.append( MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, h), png=self.key_bg)) text.append( MultiContentEntryText(pos=(x, 0), size=(width, h), font=0, text=key.encode('utf-8'), flags=RT_HALIGN_CENTER | RT_VALIGN_CENTER)) x += width return res + text def buildVirtualKeyBoard(self, selectedkey=None): self.previousSelectedKey = None self.list = [] for keys in self.shiftMode and self.shiftkeys_list or self.keys_list: self.list.append(self.virtualKeyBoardEntryComponent(keys)) self.markSelectedKey() return def markSelectedKey(self): w, h = parameters.get('VirtualKeyboard', (45, 45)) if self.previousSelectedKey is not None: self.list[self.previousSelectedKey / 12] = self.list[self.previousSelectedKey / 12][:-1] width = self.key_sel.size().width() x = self.list[self.selectedKey / 12][self.selectedKey % 12 + 1][1] self.list[self.selectedKey / 12].append( MultiContentEntryPixmapAlphaTest(pos=(x, 0), size=(width, h), png=self.key_sel)) self.previousSelectedKey = self.selectedKey self['list'].setList(self.list) return def backClicked(self): if self.currentlist == 'list': self.text = self['text'].getText()[:-1] self['text'].setText(self.text) self.getsuggestion() def insertspace(self): print 'self.currentlist', self.currentlist if self.currentlist == 'suggestlist': return elif self.currentlist == 'historylist': return else: if self.shiftMode: list = self.shiftkeys_list else: list = self.keys_list selectedKey = self.selectedKey text = None for x in list: if selectedKey < 12: if selectedKey < len(x): text = x[selectedKey] break else: selectedKey -= 12 if text is None: return text = 'SPACE' if text == 'EXIT': self.close(None) elif text == 'BACKSPACE': self.text = self['text'].getText()[:-1] self['text'].setText(self.text) elif text == 'CLEAR': self.text = '' self['text'].setText(self.text) elif text == 'SHIFT': if self.shiftMode: self.shiftMode = False else: self.shiftMode = True self.buildVirtualKeyBoard(self.selectedKey) elif text == 'SPACE': self.text += ' ' self['text'].setText(self.text) elif text == 'OK': self.close(self['text'].getText()) else: self.text = self['text'].getText() self.text += text self['text'].setText(self.text) self.getsuggestion() return return def okClicked(self): print 'self.currentlist', self.currentlist if self.currentlist == 'suggestlist': txt = str(self['suggestlist'].l.getCurrentSelection()) print 'txt', txt self['text'].setText(txt) self.exit() self.currentlist == 'list' return elif self.currentlist == 'historylist': txt = str(self['historylist'].l.getCurrentSelection()) self['text'].setText(txt) self.exit() self.currentlist == 'list' return else: if self.shiftMode: list = self.shiftkeys_list else: list = self.keys_list selectedKey = self.selectedKey text = None for x in list: if selectedKey < 12: if selectedKey < len(x): text = x[selectedKey] break else: selectedKey -= 12 if text is None: return text = text.encode('UTF-8') if text == 'EXIT': self.close(None) elif text == 'BACKSPACE': self.text = self['text'].getText()[:-1] self['text'].setText(self.text) elif text == 'CLEAR': self.text = '' self['text'].setText(self.text) elif text == 'SHIFT': if self.shiftMode: self.shiftMode = False else: self.shiftMode = True self.buildVirtualKeyBoard(self.selectedKey) elif text == 'SPACE': self.text += ' ' self['text'].setText(self.text) elif text == 'OK': self.close(self['text'].getText()) else: self.text = self['text'].getText() self.text += text self['text'].setText(self.text) self.getsuggestion() return return def ok(self): txt = str(self['text'].getText()) writetohistory(txt) self.close(txt) def exit(self): debug = True if self.currentlist == 'suggestlist': self['suggestlist'].selectionEnabled(0) self['historylist'].selectionEnabled(0) self['list'].selectionEnabled(1) self.currentlist = 'list' return elif self.currentlist == 'historylist': self['suggestlist'].selectionEnabled(0) self['historylist'].selectionEnabled(0) self['list'].selectionEnabled(1) self.currentlist = 'list' return else: try: self.suggestions = None self.suggestcallback = None except: pass self.close(None) return return def left(self): self.selectedKey -= 1 if self.selectedKey == -1: self.selectedKey = 11 elif self.selectedKey == 11: self.selectedKey = 23 elif self.selectedKey == 23: self.selectedKey = 35 elif self.selectedKey == 35: self.selectedKey = 47 elif self.selectedKey == 47: self.selectedKey = self.max_key self.showActiveKey() def right(self): self.selectedKey += 1 if self.selectedKey == 12: self.selectedKey = 0 elif self.selectedKey == 24: self.selectedKey = 12 elif self.selectedKey == 36: self.selectedKey = 24 elif self.selectedKey == 48: self.selectedKey = 36 elif self.selectedKey > self.max_key: self.selectedKey = 48 self.showActiveKey() def up(self): if self.currentlist == 'suggestlist': self['suggestlist'].up() print 'suggestlist' return if self.currentlist == 'historylist': self['historylist'].up() return self.selectedKey -= 12 if self.selectedKey < 0 and self.selectedKey > self.max_key - 60: self.selectedKey += 48 elif self.selectedKey < 0: self.selectedKey += 60 self.showActiveKey() def down(self): if self.currentlist == 'suggestlist': self['suggestlist'].down() print 'suggestlist' return if self.currentlist == 'historylist': self['historylist'].down() return self.selectedKey += 12 if self.selectedKey > self.max_key and self.selectedKey > 59: self.selectedKey -= 60 elif self.selectedKey > self.max_key: self.selectedKey -= 48 self.showActiveKey() def showActiveKey(self): self.buildVirtualKeyBoard(self.selectedKey) def inShiftKeyList(self, key): for KeyList in self.shiftkeys_list: for char in KeyList: if char == key: return True return False def keyGotAscii(self): char = str(unichr(getPrevAsciiCode()).encode('utf-8')) if self.inShiftKeyList(char): self.shiftMode = True list = self.shiftkeys_list else: self.shiftMode = False list = self.keys_list if char == ' ': char = 'SPACE' selkey = 0 for keylist in list: for key in keylist: if key == char: self.selectedKey = selkey self.okClicked() self.showActiveKey() return selkey += 1
def __init__(self, session, title='', text=''): Screen.__init__(self, session) self.skinName = 'KodiLiteVKskin' self.keys_list = [] self.session = session self.shiftkeys_list = [] self.lang = language.getLanguage() self.nextLang = None self.shiftMode = False self.text = text self.selectedKey = 0 self['suggestlist'] = MenuList([]) self['historylist'] = MenuList([]) self.key_bg = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_bg.png')) self.key_sel = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_sel.png')) self.key_backspace = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_backspace.png')) self.key_all = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_all.png')) self.key_clr = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_clr.png')) self.key_esc = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_esc.png')) self.key_ok = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_ok.png')) self.key_shift = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_shift.png')) self.key_shift_sel = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_shift_sel.png')) self.key_space = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_space.png')) self.key_left = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_left.png')) self.key_right = LoadPixmap(path=resolveFilename( SCOPE_CURRENT_SKIN, 'skin_default/vkey_right.png')) self.keyImages = { 'BACKSPACE': self.key_backspace, 'ALL': self.key_all, 'EXIT': self.key_esc, 'OK': self.key_ok, 'SHIFT': self.key_shift, 'SPACE': self.key_space, 'LEFT': self.key_left, 'RIGHT': self.key_right } self.keyImagesShift = { 'BACKSPACE': self.key_backspace, 'CLEAR': self.key_clr, 'EXIT': self.key_esc, 'OK': self.key_ok, 'SHIFT': self.key_shift_sel, 'SPACE': self.key_space, 'LEFT': self.key_left, 'RIGHT': self.key_right } self['country'] = StaticText('') self['header'] = Label('') self['text'] = Label(self.text) self['list'] = VirtualKeyBoardList([]) self['actions'] = ActionMap( [ 'ColorActions', 'OkCancelActions', 'WizardActions', 'KeyboardInputActions', 'InputBoxActions', 'InputAsciiActions', "MenuActions" ], { 'gotAsciiCode': self.keyGotAscii, 'ok': self.okClicked, 'cancel': self.exit, 'left': self.left, 'right': self.right, 'up': self.up, 'down': self.down, 'red': self.history, 'green': self.ok, 'blue': self.suggest, 'menu': self.showmenu, 'yellow': self.switchLang, 'deleteBackward': self.backClicked, '0': self.insertspace, 'back': self.exit }, -2) self.setLang() self.displayhistory() self.onExecBegin.append(self.setKeyboardModeAscii) self.onLayoutFinish.append(self.buildVirtualKeyBoard) self.onLayoutFinish.append(self.getsuggestion) self.currentlist = 'list' return
def __init__(self, session, title="", **kwargs): Screen.__init__(self, session) self.setTitle(_(title)) self.keys_list = [] self.shiftkeys_list = [] self.lang = language.getLanguage() self.nextLang = None self.shiftMode = False self.selectedKey = 0 self.smsChar = None self.sms = NumericalTextInput(self.smsOK) self.key_bg = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_bg.png")) self.key_sel = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_sel.png")) self.key_backspace = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_backspace.png")) self.key_all = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_all.png")) self.key_clr = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_clr.png")) self.key_esc = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_esc.png")) self.key_ok = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_ok.png")) self.key_shift = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_shift.png")) self.key_shift_sel = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_shift_sel.png")) self.key_space = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_space.png")) self.key_left = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_left.png")) self.key_right = LoadPixmap(path=resolveFilename(SCOPE_ACTIVE_SKIN, "buttons/vkey_right.png")) self.keyImages = { "BACKSPACE": self.key_backspace, "ALL": self.key_all, "EXIT": self.key_esc, "OK": self.key_ok, "SHIFT": self.key_shift, "SPACE": self.key_space, "LEFT": self.key_left, "RIGHT": self.key_right } self.keyImagesShift = { "BACKSPACE": self.key_backspace, "CLEAR": self.key_clr, "EXIT": self.key_esc, "OK": self.key_ok, "SHIFT": self.key_shift_sel, "SPACE": self.key_space, "LEFT": self.key_left, "RIGHT": self.key_right } self["country"] = StaticText("") self["header"] = Label() self["text"] = Input(currPos=len(kwargs.get("text", "").decode("utf-8",'ignore')), allMarked=False, **kwargs) self["list"] = VirtualKeyBoardList([]) self["actions"] = NumberActionMap(["OkCancelActions", "WizardActions", "ColorActions", "KeyboardInputActions", "InputBoxActions", "InputAsciiActions"], { "gotAsciiCode": self.keyGotAscii, "ok": self.okClicked, "cancel": self.exit, "left": self.left, "right": self.right, "up": self.up, "down": self.down, "red": self.exit, "green": self.ok, "yellow": self.switchLang, "blue": self.shiftClicked, "deleteBackward": self.backClicked, "deleteForward": self.forwardClicked, "back": self.exit, "pageUp": self.cursorRight, "pageDown": self.cursorLeft, "1": self.keyNumberGlobal, "2": self.keyNumberGlobal, "3": self.keyNumberGlobal, "4": self.keyNumberGlobal, "5": self.keyNumberGlobal, "6": self.keyNumberGlobal, "7": self.keyNumberGlobal, "8": self.keyNumberGlobal, "9": self.keyNumberGlobal, "0": self.keyNumberGlobal, }, -2) self.setLang() self.onExecBegin.append(self.setKeyboardModeAscii) self.onLayoutFinish.append(self.buildVirtualKeyBoard) self.onClose.append(self.__onClose)
from Tools.Directories import SCOPE_CURRENT_SKIN, resolveFilename from os import path from enigma import eListboxPythonMultiContent, RT_VALIGN_CENTER, gFont, eServiceCenter from Tools.LoadPixmap import LoadPixmap import skin STATE_PLAY = 0 STATE_PAUSE = 1 STATE_STOP = 2 STATE_REWIND = 3 STATE_FORWARD = 4 STATE_NONE = 5 PlayIcon = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/ico_mp_play.png")) PauseIcon = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/ico_mp_pause.png")) StopIcon = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/ico_mp_stop.png")) RewindIcon = LoadPixmap( resolveFilename(SCOPE_CURRENT_SKIN, "icons/ico_mp_rewind.png")) ForwardIcon = LoadPixmap( path=resolveFilename(SCOPE_CURRENT_SKIN, "icons/ico_mp_forward.png")) def PlaylistEntryComponent(serviceref, state): res = [serviceref] text = serviceref.getName() if text is "": text = path.split(serviceref.getPath().split('/')[-1])[1]