2 from MyTubeService import GoogleSuggestions
3 from Screens.Screen import Screen
4 from Screens.LocationBox import MovieLocationBox
5 from Components.config import config, Config, ConfigSelection, ConfigText, getConfigListEntry, ConfigSubsection, ConfigYesNo, ConfigIP, ConfigNumber,ConfigLocations
6 from Components.ConfigList import ConfigListScreen
7 from Components.config import KEY_DELETE, KEY_BACKSPACE, KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_TOGGLEOW, KEY_ASCII, KEY_TIMEOUT
8 from Components.ActionMap import ActionMap
9 from Components.Button import Button
10 from Components.Label import Label
11 from Components.ScrollLabel import ScrollLabel
12 from Components.Sources.List import List
13 from Components.Pixmap import Pixmap
14 from Components.MultiContent import MultiContentEntryText, MultiContentEntryPixmapAlphaTest
15 from Components.Task import Task, Job, job_manager
16 from enigma import eListboxPythonMultiContent, RT_HALIGN_LEFT, RT_HALIGN_RIGHT, gFont, eListbox,ePoint,eTimer
17 from Components.Task import job_manager
18 from Tools.Directories import pathExists, fileExists, resolveFilename, SCOPE_HDD
19 from threading import Thread
20 from threading import Condition
24 from urllib import FancyURLopener
26 class MyOpener(FancyURLopener):
27 version = 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12'
30 class ConfigTextWithGoogleSuggestions(ConfigText):
31 class SuggestionsThread(Thread):
32 def __init__(self, suggestionsService):
34 self.suggestionsService = suggestionsService
37 self.condition = Condition()
41 self.condition.acquire()
42 if self.value is None:
46 self.condition.release()
48 self.suggestionsService.getSuggestions(value)
52 self.condition.acquire()
53 self.condition.notify()
54 self.condition.release()
57 def getSuggestions(self, value):
58 self.condition.acquire()
60 self.condition.notify()
61 self.condition.release()
63 def __init__(self, default = "", fixed_size = True, visible_width = False, threaded = False):
64 ConfigText.__init__(self, default, fixed_size, visible_width)
65 self.suggestions = GoogleSuggestions(self.propagateSuggestions, ds = "yt", hl = "en")
66 self.suggestionsThread = None
67 self.threaded = threaded
68 self.suggestionsListActivated = False
70 def propagateSuggestions(self, suggestionsList):
71 if self.suggestionsWindow:
72 self.suggestionsWindow.update(suggestionsList)
74 def getSuggestions(self):
75 if self.suggestionsThread is not None:
76 self.suggestionsThread.getSuggestions(self.value)
78 self.suggestions.getSuggestions(self.value)
80 def handleKey(self, key):
81 if not self.suggestionsListActivated:
82 ConfigText.handleKey(self, key)
83 if key in [KEY_DELETE, KEY_BACKSPACE, KEY_ASCII, KEY_TIMEOUT]:
86 def onSelect(self, session):
88 if self.suggestionsThread is not None:
89 self.suggestionsThread.stop()
90 self.suggestionsThread = ConfigTextWithGoogleSuggestions.SuggestionsThread(self.suggestions)
91 self.suggestionsThread.start()
93 self.suggestionsThread = None
94 ConfigText.onSelect(self, session)
95 if session is not None:
96 self.suggestionsWindow = session.instantiateDialog(MyTubeSuggestionsListScreen, self)
97 self.suggestionsWindow.deactivate()
98 self.suggestionsWindow.hide()
99 self.suggestions.getSuggestions(self.value)
101 def onDeselect(self, session):
102 if self.suggestionsThread is not None:
103 self.suggestionsThread.stop()
104 ConfigText.onDeselect(self, session)
105 if self.suggestionsWindow:
106 session.deleteDialog(self.suggestionsWindow)
107 self.suggestionsWindow = None
109 def suggestionListUp(self):
110 if self.suggestionsWindow.getlistlenght() > 0:
111 self.value = self.suggestionsWindow.up()
113 def suggestionListDown(self):
114 if self.suggestionsWindow.getlistlenght() > 0:
115 self.value = self.suggestionsWindow.down()
117 def suggestionListPageDown(self):
118 if self.suggestionsWindow.getlistlenght() > 0:
119 self.value = self.suggestionsWindow.pageDown()
121 def suggestionListPageUp(self):
122 if self.suggestionsWindow.getlistlenght() > 0:
123 self.value = self.suggestionsWindow.pageUp()
125 def activateSuggestionList(self):
127 if self.suggestionsWindow is not None and self.suggestionsWindow.shown:
128 self.tmpValue = self.value
129 self.value = self.suggestionsWindow.activate()
130 self.allmarked = False
131 #self.marked_pos = -1
132 self.suggestionsListActivated = True
136 def deactivateSuggestionList(self):
138 if self.suggestionsWindow is not None:
139 self.suggestionsWindow.deactivate()
140 self.getSuggestions()
141 self.allmarked = True
142 self.suggestionsListActivated = False
146 def cancelSuggestionList(self):
147 self.value = self.tmpValue
148 return self.deactivateSuggestionList()
150 def enableSuggestionSelection(self,value):
151 if self.suggestionsWindow is not None:
152 self.suggestionsWindow.enableSelection(value)
155 config.plugins.mytube = ConfigSubsection()
156 config.plugins.mytube.search = ConfigSubsection()
158 config.plugins.mytube.search.searchTerm = ConfigTextWithGoogleSuggestions("", False, threaded = True)
159 config.plugins.mytube.search.orderBy = ConfigSelection(
161 ("relevance", _("Relevance")),
162 ("viewCount", _("View Count")),
163 ("published", _("Published")),
164 ("rating", _("Rating"))
166 config.plugins.mytube.search.time = ConfigSelection(
168 ("all_time", _("All Time")),
169 ("this_month", _("This Month")),
170 ("this_week", _("This Week")),
171 ("today", _("Today"))
173 config.plugins.mytube.search.racy = ConfigSelection(
175 ("include", _("Yes")),
178 config.plugins.mytube.search.categories = ConfigSelection(
181 ("Film", _("Film & Animation")),
182 ("Autos", _("Autos & Vehicles")),
183 ("Music", _("Music")),
184 ("Animals", _("Pets & Animals")),
185 ("Sports", _("Sports")),
186 ("Travel", _("Travel & Events")),
187 ("Shortmov", _("Short Movies")),
188 ("Games", _("Gaming")),
189 ("Comedy", _("Comedy")),
190 ("People", _("People & Blogs")),
191 ("News", _("News & Politics")),
192 ("Entertainment", _("Entertainment")),
193 ("Education", _("Education")),
194 ("Howto", _("Howto & Style")),
195 ("Nonprofit", _("Nonprofits & Activism")),
196 ("Tech", _("Science & Technology"))
198 config.plugins.mytube.search.lr = ConfigSelection(
201 ("au", _("Australia")),
204 ("cz", _("Czech Republic")),
206 ("de", _("Germany")),
207 ("gb", _("Great Britain")),
208 ("au", _("Australia")),
209 ("nl", _("Holland")),
210 ("hk", _("Hong Kong")),
212 ("ie", _("Ireland")),
217 ("nz", _("New Zealand")),
220 ("kr", _("South Korea")),
224 ("us", _("United States"))
226 config.plugins.mytube.search.sortOrder = ConfigSelection(
228 ("ascending", _("Ascending")),
229 ("descending", _("Descending"))
232 config.plugins.mytube.general = ConfigSubsection()
233 config.plugins.mytube.general.showHelpOnOpen = ConfigYesNo(default = True)
234 config.plugins.mytube.general.loadFeedOnOpen = ConfigYesNo(default = True)
235 config.plugins.mytube.general.startFeed = ConfigSelection(
237 ("hd", _("HD videos")),
238 ("most_viewed", _("Most viewed")),
239 ("top_rated", _("Top rated")),
240 ("recently_featured", _("Recently featured")),
241 ("most_discussed", _("Most discussed")),
242 ("top_favorites", _("Top favorites")),
243 ("most_linked", _("Most linked")),
244 ("most_responded", _("Most responded")),
245 ("most_recent", _("Most recent"))
248 config.plugins.mytube.general.on_movie_stop = ConfigSelection(default = "ask", choices = [
249 ("ask", _("Ask user")), ("quit", _("Return to movie list")), ("playnext", _("Play next video")), ("playagain", _("Play video again")) ])
251 config.plugins.mytube.general.on_exit = ConfigSelection(default = "ask", choices = [
252 ("ask", _("Ask user")), ("quit", _("Return to movie list"))])
255 default = resolveFilename(SCOPE_HDD)
256 tmp = config.movielist.videodirs.value
257 if default not in tmp:
259 config.plugins.mytube.general.videodir = ConfigSelection(default = default, choices = tmp)
260 config.plugins.mytube.general.history = ConfigText(default="")
261 config.plugins.mytube.general.clearHistoryOnClose = ConfigYesNo(default = False)
263 #config.plugins.mytube.general.useHTTPProxy = ConfigYesNo(default = False)
264 #config.plugins.mytube.general.ProxyIP = ConfigIP(default=[0,0,0,0])
265 #config.plugins.mytube.general.ProxyPort = ConfigNumber(default=8080)
267 class MyTubeSuggestionsListScreen(Screen):
269 <screen name="MyTubeSuggestionsListScreen" position="60,93" zPosition="6" size="610,160" flags="wfNoBorder" >
270 <ePixmap position="0,0" zPosition="-1" size="610,160" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MyTube/suggestions_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
271 <widget source="suggestionslist" render="Listbox" position="10,5" zPosition="7" size="580,150" scrollbarMode="showOnDemand" transparent="1" >
272 <convert type="TemplatedMultiContent">
274 MultiContentEntryText(pos = (0, 1), size = (340, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
275 MultiContentEntryText(pos = (350, 1), size = (180, 24), font=1, flags = RT_HALIGN_RIGHT, text = 1), # index 1 are the rtesults
277 "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
284 def __init__(self, session, configTextWithGoogleSuggestion):
285 Screen.__init__(self, session)
286 self.activeState = False
288 self.suggestlist = []
289 self["suggestionslist"] = List(self.list)
290 self.configTextWithSuggestion = configTextWithGoogleSuggestion
292 def update(self, suggestions):
293 if suggestions and len(suggestions[1]) > 0:
298 self.suggestlist = []
299 suggests = suggestions[1]
300 for suggestion in suggests:
302 results = suggestion[1].replace(" results", "")
303 numresults = results.replace(",", "")
304 self.suggestlist.append((name, numresults ))
305 if len(self.suggestlist):
306 self.suggestlist.sort(key=lambda x: int(x[1]))
307 self.suggestlist.reverse()
308 for entry in self.suggestlist:
309 self.list.append((entry[0], entry[1] + _(" Results") ))
310 self["suggestionslist"].setList(self.list)
311 self["suggestionslist"].setIndex(0)
315 def getlistlenght(self):
316 return len(self.list)
320 if self.list and len(self.list) > 0:
321 self["suggestionslist"].selectPrevious()
322 return self.getSelection()
326 if self.list and len(self.list) > 0:
327 self["suggestionslist"].selectNext()
328 return self.getSelection()
332 if self.list and len(self.list) > 0:
333 self["suggestionslist"].selectPrevious()
334 return self.getSelection()
338 if self.list and len(self.list) > 0:
339 self["suggestionslist"].selectNext()
340 return self.getSelection()
344 self.activeState = True
345 return self.getSelection()
347 def deactivate(self):
349 self.activeState = False
350 return self.getSelection()
352 def getSelection(self):
353 if self["suggestionslist"].getCurrent() is None:
355 print self["suggestionslist"].getCurrent()[0]
356 return self["suggestionslist"].getCurrent()[0]
358 def enableSelection(self,value):
359 self["suggestionslist"].selectionEnabled(value)
362 class MyTubeSettingsScreen(Screen, ConfigListScreen):
364 <screen name="MyTubeSettingsScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTubePlayerMainScreen..." >
365 <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
366 <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
367 <widget name="config" zPosition="2" position="60,120" size="610,370" scrollbarMode="showOnDemand" transparent="1" />
369 <ePixmap position="100,500" size="100,40" zPosition="0" pixmap="~/plugin.png" alphatest="on" transparent="1" />
370 <ePixmap position="220,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
371 <ePixmap position="360,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" />
372 <widget name="key_red" position="220,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
373 <widget name="key_green" position="360,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
376 def __init__(self, session, plugin_path):
377 Screen.__init__(self, session)
378 self.skin_path = plugin_path
379 self.session = session
381 self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "MediaPlayerActions"],
384 "back": self.keyCancel,
385 "red": self.keyCancel,
386 "green": self.keySave,
388 "down": self.keyDown,
389 "left": self.keyLeft,
390 "right": self.keyRight,
393 self["key_red"] = Button(_("Close"))
394 self["key_green"] = Button(_("Save"))
395 self["title"] = Label()
397 self.searchContextEntries = []
398 self.ProxyEntry = None
399 self.loadFeedEntry = None
400 self.VideoDirname = None
401 ConfigListScreen.__init__(self, self.searchContextEntries, session)
403 self.onLayoutFinish.append(self.layoutFinished)
404 self.onShown.append(self.setWindowTitle)
406 def layoutFinished(self):
407 self["title"].setText(_("MyTubePlayer settings"))
409 def setWindowTitle(self):
410 self.setTitle(_("MyTubePlayer settings"))
412 def createSetup(self):
413 self.searchContextEntries = []
414 self.searchContextEntries.append(getConfigListEntry(_("Display search results by:"), config.plugins.mytube.search.orderBy))
415 self.searchContextEntries.append(getConfigListEntry(_("Search restricted content:"), config.plugins.mytube.search.racy))
416 self.searchContextEntries.append(getConfigListEntry(_("Search category:"), config.plugins.mytube.search.categories))
417 self.searchContextEntries.append(getConfigListEntry(_("Search region:"), config.plugins.mytube.search.lr))
418 self.loadFeedEntry = getConfigListEntry(_("Load feed on startup:"), config.plugins.mytube.general.loadFeedOnOpen)
419 self.searchContextEntries.append(self.loadFeedEntry)
420 if config.plugins.mytube.general.loadFeedOnOpen.value:
421 self.searchContextEntries.append(getConfigListEntry(_("Start with following feed:"), config.plugins.mytube.general.startFeed))
422 self.searchContextEntries.append(getConfigListEntry(_("Videoplayer stop/exit behavior:"), config.plugins.mytube.general.on_movie_stop))
423 self.searchContextEntries.append(getConfigListEntry(_("Videobrowser exit behavior:"), config.plugins.mytube.general.on_exit))
424 """self.ProxyEntry = getConfigListEntry(_("Use HTTP Proxy Server:"), config.plugins.mytube.general.useHTTPProxy)
425 self.searchContextEntries.append(self.ProxyEntry)
426 if config.plugins.mytube.general.useHTTPProxy.value:
427 self.searchContextEntries.append(getConfigListEntry(_("HTTP Proxy Server IP:"), config.plugins.mytube.general.ProxyIP))
428 self.searchContextEntries.append(getConfigListEntry(_("HTTP Proxy Server Port:"), config.plugins.mytube.general.ProxyPort))"""
429 # disabled until i have time for some proper tests
430 self.VideoDirname = getConfigListEntry(_("Download location"), config.plugins.mytube.general.videodir)
431 if config.usage.setup_level.index >= 2: # expert+
432 self.searchContextEntries.append(self.VideoDirname)
433 self.searchContextEntries.append(getConfigListEntry(_("Clear history on Exit:"), config.plugins.mytube.general.clearHistoryOnClose))
435 self["config"].list = self.searchContextEntries
436 self["config"].l.setList(self.searchContextEntries)
437 if not self.selectionChanged in self["config"].onSelectionChanged:
438 self["config"].onSelectionChanged.append(self.selectionChanged)
440 def selectionChanged(self):
441 current = self["config"].getCurrent()
445 print "newConfig", self["config"].getCurrent()
446 if self["config"].getCurrent() == self.loadFeedEntry:
450 cur = self["config"].getCurrent()
451 if config.usage.setup_level.index >= 2 and cur == self.VideoDirname:
452 self.session.openWithCallback(
455 _("Choose target folder"),
456 config.plugins.mytube.general.videodir.value,
457 minFree = 100 # We require at least 100MB free space
462 def pathSelected(self, res):
464 if config.movielist.videodirs.value != config.plugins.mytube.general.videodir.choices:
465 config.plugins.mytube.general.videodir.setChoices(config.movielist.videodirs.value, default=res)
466 config.plugins.mytube.general.videodir.value = res
469 self["config"].instance.moveSelection(self["config"].instance.moveUp)
472 self["config"].instance.moveSelection(self["config"].instance.moveDown)
475 ConfigListScreen.keyRight(self)
479 ConfigListScreen.keyLeft(self)
484 for x in self["config"].list:
490 config.plugins.mytube.search.orderBy.save()
491 config.plugins.mytube.search.racy.save()
492 config.plugins.mytube.search.categories.save()
493 config.plugins.mytube.search.lr.save()
494 config.plugins.mytube.general.loadFeedOnOpen.save()
495 config.plugins.mytube.general.startFeed.save()
496 config.plugins.mytube.general.on_movie_stop.save()
497 config.plugins.mytube.general.on_exit.save()
498 config.plugins.mytube.general.videodir.save()
499 config.plugins.mytube.general.clearHistoryOnClose.save()
500 if config.plugins.mytube.general.clearHistoryOnClose.value:
501 config.plugins.mytube.general.history.value = ""
502 config.plugins.mytube.general.history.save()
503 #config.plugins.mytube.general.useHTTPProxy.save()
504 #config.plugins.mytube.general.ProxyIP.save()
505 #config.plugins.mytube.general.ProxyPort.save()
506 for x in self["config"].list:
508 config.plugins.mytube.general.save()
509 config.plugins.mytube.search.save()
510 config.plugins.mytube.save()
511 """if config.plugins.mytube.general.useHTTPProxy.value is True:
512 proxy = {'http': 'http://'+str(config.plugins.mytube.general.ProxyIP.getText())+':'+str(config.plugins.mytube.general.ProxyPort.value)}
513 self.myopener = MyOpener(proxies=proxy)
514 urllib.urlopen = MyOpener(proxies=proxy).open
516 self.myopener = MyOpener()
517 urllib.urlopen = MyOpener().open"""
521 class MyTubeTasksScreen(Screen):
523 <screen name="MyTubeTasksScreen" flags="wfNoBorder" position="0,0" size="720,576" title="MyTubePlayerMainScreen..." >
524 <ePixmap position="0,0" zPosition="-1" size="720,576" pixmap="~/mytubemain_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
525 <widget name="title" position="60,50" size="600,50" zPosition="5" valign="center" halign="left" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
526 <widget source="tasklist" render="Listbox" position="60,120" size="610,370" zPosition="7" scrollbarMode="showOnDemand" transparent="1" >
527 <convert type="TemplatedMultiContent">
529 MultiContentEntryText(pos = (0, 1), size = (200, 24), font=1, flags = RT_HALIGN_LEFT, text = 1), # index 1 is the name
530 MultiContentEntryText(pos = (210, 1), size = (150, 24), font=1, flags = RT_HALIGN_RIGHT, text = 2), # index 2 is the state
531 MultiContentEntryProgress(pos = (370, 1), size = (100, 24), percent = -3), # index 3 should be progress
532 MultiContentEntryText(pos = (480, 1), size = (100, 24), font=1, flags = RT_HALIGN_RIGHT, text = 4), # index 4 is the percentage
534 "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
539 <ePixmap position="100,500" size="100,40" zPosition="0" pixmap="~/plugin.png" alphatest="on" transparent="1" />
540 <ePixmap position="220,500" zPosition="4" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" />
541 <widget name="key_red" position="220,500" zPosition="5" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
544 def __init__(self, session, plugin_path, tasklist):
545 Screen.__init__(self, session)
546 self.skin_path = plugin_path
547 self.session = session
548 self.tasklist = tasklist
549 self["tasklist"] = List(self.tasklist)
551 self["shortcuts"] = ActionMap(["ShortcutActions", "WizardActions", "MediaPlayerActions"],
554 "back": self.keyCancel,
555 "red": self.keyCancel,
558 self["key_red"] = Button(_("Close"))
559 self["title"] = Label()
561 self.onLayoutFinish.append(self.layoutFinished)
562 self.onShown.append(self.setWindowTitle)
563 self.onClose.append(self.__onClose)
564 self.Timer = eTimer()
565 self.Timer.callback.append(self.TimerFire)
570 def layoutFinished(self):
571 self["title"].setText(_("MyTubePlayer active video downloads"))
572 self.Timer.startLongTimer(2)
573 #self.Timer.start(1000)
577 self.rebuildTaskList()
579 def rebuildTaskList(self):
581 for job in job_manager.getPendingJobs():
582 self.tasklist.append((job,job.name,job.getStatustext(),int(100*job.progress/float(job.end)) ,str(100*job.progress/float(job.end)) + "%" ))
583 self['tasklist'].setList(self.tasklist)
584 self['tasklist'].updateList(self.tasklist)
585 self.Timer.startLongTimer(2)
587 def setWindowTitle(self):
588 self.setTitle(_("MyTubePlayer active video downloads"))
591 current = self["tasklist"].getCurrent()
595 from Screens.TaskView import JobView
596 self.session.openWithCallback(self.JobViewCB, JobView, job)
598 def JobViewCB(self, why):
608 class MyTubeHistoryScreen(Screen):
610 <screen name="MyTubeHistoryScreen" position="60,93" zPosition="6" size="610,160" flags="wfNoBorder" >
611 <ePixmap position="0,0" zPosition="-1" size="610,160" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MyTube/suggestions_bg.png" alphatest="on" transparent="1" backgroundColor="transparent"/>
612 <widget source="historylist" render="Listbox" position="10,5" zPosition="7" size="580,150" scrollbarMode="showOnDemand" transparent="1" >
613 <convert type="TemplatedMultiContent">
615 MultiContentEntryText(pos = (0, 1), size = (340, 24), font=0, flags = RT_HALIGN_LEFT, text = 0), # index 0 is the name
617 "fonts": [gFont("Regular", 22),gFont("Regular", 18)],
624 def __init__(self, session):
625 Screen.__init__(self, session)
626 self.session = session
627 self.historylist = []
628 print "self.historylist",self.historylist
629 self["historylist"] = List(self.historylist)
630 self.activeState = False
634 self.activeState = True
635 self.history = config.plugins.mytube.general.history.value.split(',')
636 if self.history[0] == '':
638 print "self.history",self.history
639 self.historylist = []
640 for entry in self.history:
641 self.historylist.append(( str(entry),))
642 self["historylist"].setList(self.historylist)
643 self["historylist"].updateList(self.historylist)
645 def deactivate(self):
647 self.activeState = False
650 print self.activeState
651 return self.activeState
653 def getSelection(self):
654 if self["historylist"].getCurrent() is None:
656 print self["historylist"].getCurrent()[0]
657 return self["historylist"].getCurrent()[0]
661 self["historylist"].selectPrevious()
662 return self.getSelection()
666 self["historylist"].selectNext()
667 return self.getSelection()
671 self["historylist"].selectPrevious()
672 return self.getSelection()
676 self["historylist"].selectNext()
677 return self.getSelection()