use new box depending rcs in HelpMenu (not yet 100% correct, needs
[enigma2.git] / lib / python / Screens / InfoBar.py
1 from Tools.Profile import profile
2
3 from Screen import Screen
4
5 profile("LOAD:enigma")
6 from enigma import iPlayableService
7
8 profile("LOAD:ChannelSelectionRadio")
9 from Screens.ChannelSelection import ChannelSelectionRadio
10 profile("LOAD:MovieSelection")
11 from Screens.MovieSelection import MovieSelection
12 profile("LOAD:ChoiceBox")
13 from Screens.ChoiceBox import ChoiceBox
14
15 profile("LOAD:InfoBarGenerics")
16 from Screens.InfoBarGenerics import InfoBarShowHide, \
17         InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarRdsDecoder, \
18         InfoBarEPG, InfoBarSeek, InfoBarInstantRecord, \
19         InfoBarAudioSelection, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, \
20         InfoBarSubserviceSelection, InfoBarShowMovies, InfoBarTimeshift,  \
21         InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, InfoBarSimpleEventView, \
22         InfoBarSummarySupport, InfoBarMoviePlayerSummarySupport, InfoBarTimeshiftState, InfoBarTeletextPlugin, InfoBarExtensions, \
23         InfoBarSubtitleSupport, InfoBarPiP, InfoBarPlugins, InfoBarSleepTimer, InfoBarServiceErrorPopupSupport
24
25 profile("LOAD:InitBar_Components")
26 from Components.ActionMap import HelpableActionMap
27 from Components.config import config
28 from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
29
30 profile("LOAD:HelpableScreen")
31 from Screens.HelpMenu import HelpableScreen
32
33 class InfoBar(InfoBarBase, InfoBarShowHide,
34         InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder,
35         InfoBarInstantRecord, InfoBarAudioSelection, 
36         HelpableScreen, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish,
37         InfoBarSubserviceSelection, InfoBarTimeshift, InfoBarSeek,
38         InfoBarSummarySupport, InfoBarTimeshiftState, InfoBarTeletextPlugin, InfoBarExtensions,
39         InfoBarPiP, InfoBarPlugins, InfoBarSubtitleSupport, InfoBarSleepTimer, InfoBarServiceErrorPopupSupport,
40         Screen):
41         
42         ALLOW_SUSPEND = True
43         instance = None
44
45         def __init__(self, session):
46                 Screen.__init__(self, session)
47                 self["actions"] = HelpableActionMap(self, "InfobarActions",
48                         {
49                                 "showMovies": (self.showMovies, _("Play recorded movies...")),
50                                 "showRadio": (self.showRadio, _("Show the radio player...")),
51                                 "showTv": (self.showTv, _("Show the tv player...")),
52                         }, prio=2)
53                 
54                 for x in HelpableScreen, \
55                                 InfoBarBase, InfoBarShowHide, \
56                                 InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder, \
57                                 InfoBarInstantRecord, InfoBarAudioSelection, \
58                                 InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarSubserviceSelection, \
59                                 InfoBarTimeshift, InfoBarSeek, InfoBarSummarySupport, InfoBarTimeshiftState, \
60                                 InfoBarTeletextPlugin, InfoBarExtensions, InfoBarPiP, InfoBarSubtitleSupport, InfoBarSleepTimer, \
61                                 InfoBarPlugins, InfoBarServiceErrorPopupSupport:
62                         x.__init__(self)
63
64                 self.helpList.append((self["actions"], "InfobarActions", [("showMovies", _("view recordings..."))]))
65                 self.helpList.append((self["actions"], "InfobarActions", [("showRadio", _("hear radio..."))]))
66
67                 self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
68                         {
69                                 iPlayableService.evUpdatedEventInfo: self.__eventInfoChanged
70                         })
71
72                 self.current_begin_time=0
73                 assert InfoBar.instance is None, "class InfoBar is a singleton class and just one instance of this class is allowed!"
74                 InfoBar.instance = self
75
76         def __onClose(self):
77                 InfoBar.instance = None
78
79         def __eventInfoChanged(self):
80                 if self.execing:
81                         service = self.session.nav.getCurrentService()
82                         old_begin_time = self.current_begin_time
83                         info = service and service.info()
84                         ptr = info and info.getEvent(0)
85                         self.current_begin_time = ptr and ptr.getBeginTime() or 0
86                         if config.usage.show_infobar_on_event_change.value:
87                                 if old_begin_time and old_begin_time != self.current_begin_time:
88                                         self.doShow()
89
90         def __checkServiceStarted(self):
91                 self.__serviceStarted(True)
92                 self.onExecBegin.remove(self.__checkServiceStarted)
93
94         def serviceStarted(self):  #override from InfoBarShowHide
95                 new = self.servicelist.newServicePlayed()
96                 if self.execing:
97                         InfoBarShowHide.serviceStarted(self)
98                         self.current_begin_time=0
99                 elif not self.__checkServiceStarted in self.onShown and new:
100                         self.onShown.append(self.__checkServiceStarted)
101
102         def __checkServiceStarted(self):
103                 self.serviceStarted()
104                 self.onShown.remove(self.__checkServiceStarted)
105
106         def showTv(self):
107                 self.showTvChannelList(True)
108
109         def showRadio(self):
110                 if config.usage.e1like_radio_mode.value:
111                         self.showRadioChannelList(True)
112                 else:
113                         self.rds_display.hide() # in InfoBarRdsDecoder
114                         self.session.openWithCallback(self.ChannelSelectionRadioClosed, ChannelSelectionRadio, self)
115
116         def ChannelSelectionRadioClosed(self, *arg):
117                 self.rds_display.show()  # in InfoBarRdsDecoder
118
119         def showMovies(self):
120                 self.session.openWithCallback(self.movieSelected, MovieSelection)
121
122         def movieSelected(self, service):
123                 if service is not None:
124                         self.session.open(MoviePlayer, service)
125
126 class MoviePlayer(InfoBarBase, InfoBarShowHide, \
127                 InfoBarMenu, \
128                 InfoBarSeek, InfoBarShowMovies, InfoBarAudioSelection, HelpableScreen, InfoBarNotifications,
129                 InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, InfoBarSimpleEventView,
130                 InfoBarMoviePlayerSummarySupport, InfoBarSubtitleSupport, Screen, InfoBarTeletextPlugin,
131                 InfoBarServiceErrorPopupSupport):
132
133         ENABLE_RESUME_SUPPORT = True
134         ALLOW_SUSPEND = True
135                 
136         def __init__(self, session, service):
137                 Screen.__init__(self, session)
138                 
139                 self["actions"] = HelpableActionMap(self, "MoviePlayerActions",
140                         {
141                                 "leavePlayer": (self.leavePlayer, _("leave movie player..."))
142                         })
143                 
144                 for x in HelpableScreen, InfoBarShowHide, InfoBarMenu, \
145                                 InfoBarBase, InfoBarSeek, InfoBarShowMovies, \
146                                 InfoBarAudioSelection, InfoBarNotifications, InfoBarSimpleEventView, \
147                                 InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, \
148                                 InfoBarMoviePlayerSummarySupport, InfoBarSubtitleSupport, \
149                                 InfoBarTeletextPlugin, InfoBarServiceErrorPopupSupport:
150                         x.__init__(self)
151
152                 self.lastservice = self.session.nav.getCurrentlyPlayingServiceReference()
153                 self.session.nav.playService(service)
154                 self.returning = False
155                 self.onClose.append(self.__onClose)
156
157         def __onClose(self):
158                 self.session.nav.playService(self.lastservice)
159
160         def leavePlayer(self):
161                 self.is_closing = True
162
163                 if config.usage.on_movie_stop.value == "ask":
164                         list = []
165                         list.append((_("Yes"), "quit"))
166                         if config.usage.setup_level.index >= 2: # expert+
167                                 list.append((_("Yes, returning to movie list"), "movielist"))
168                         list.append((_("No"), "continue"))
169                         if config.usage.setup_level.index >= 2: # expert+
170                                 list.append((_("No, but restart from begin"), "restart"))
171                         self.session.openWithCallback(self.leavePlayerConfirmed, ChoiceBox, title=_("Stop playing this movie?"), list = list)
172                 else:
173                         self.leavePlayerConfirmed([True, config.usage.on_movie_stop.value])
174
175         def leavePlayerConfirmed(self, answer):
176                 answer = answer and answer[1]
177                 if answer == "quit":
178                         config.movielist.last_videodir.cancel()
179                         self.close()
180                 elif answer == "movielist":
181                         ref = self.session.nav.getCurrentlyPlayingServiceReference()
182                         self.returning = True
183                         self.session.openWithCallback(self.movieSelected, MovieSelection, ref)
184                 elif answer == "restart":
185                         self.doSeek(0)
186
187         def doEofInternal(self, playing):
188                 if not self.execing:
189                         return
190                 if not playing :
191                         return
192                 self.is_closing = True
193                 if config.usage.on_movie_eof.value == "ask":
194                         list = []
195                         list.append((_("Yes"), "quit"))
196                         if config.usage.setup_level.index >= 2: # expert+
197                                 list.append((_("Yes, returning to movie list"), "movielist"))
198                         list.append((_("No"), "continue"))
199                         if config.usage.setup_level.index >= 2: # expert+
200                                 list.append((_("No, but restart from begin"), "restart"))
201                         self.session.openWithCallback(self.leavePlayerConfirmed, ChoiceBox, title=_("Stop playing this movie?"), list = list)
202                 else:
203                         self.leavePlayerConfirmed([True, config.usage.on_movie_eof.value])
204
205         def showMovies(self):
206                 ref = self.session.nav.getCurrentlyPlayingServiceReference()
207                 self.session.openWithCallback(self.movieSelected, MovieSelection, ref)
208
209         def movieSelected(self, service):
210                 if service is not None:
211                         self.is_closing = False
212                         self.session.nav.playService(service)
213                         self.returning = False
214                 elif self.returning:
215                         self.close()