860022a1fd4c10d1aca5d0eb8947b360f004c178
[vuplus_dvbapp] / lib / python / Screens / InfoBar.py
1 from Tools.Profile import profile
2
3 # workaround for required config entry dependencies.
4 from Screens.MovieSelection import MovieSelection
5
6 from Screen import Screen
7
8 profile("LOAD:enigma")
9 from enigma import iPlayableService
10
11 profile("LOAD:InfoBarGenerics")
12 from Screens.InfoBarGenerics import InfoBarShowHide, \
13         InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarRdsDecoder, \
14         InfoBarEPG, InfoBarSeek, InfoBarInstantRecord, \
15         InfoBarAudioSelection, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarUnhandledKey, \
16         InfoBarSubserviceSelection, InfoBarShowMovies, InfoBarTimeshift,  \
17         InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, InfoBarSimpleEventView, \
18         InfoBarSummarySupport, InfoBarMoviePlayerSummarySupport, InfoBarTimeshiftState, InfoBarTeletextPlugin, InfoBarExtensions, \
19         InfoBarSubtitleSupport, InfoBarPiP, InfoBarPlugins, InfoBarServiceErrorPopupSupport, InfoBarJobman
20
21 profile("LOAD:InitBar_Components")
22 from Components.ActionMap import HelpableActionMap
23 from Components.config import config
24 from Components.ServiceEventTracker import ServiceEventTracker, InfoBarBase
25
26 profile("LOAD:HelpableScreen")
27 from Screens.HelpMenu import HelpableScreen
28
29 class InfoBar(InfoBarBase, InfoBarShowHide,
30         InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder,
31         InfoBarInstantRecord, InfoBarAudioSelection, 
32         HelpableScreen, InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarUnhandledKey,
33         InfoBarSubserviceSelection, InfoBarTimeshift, InfoBarSeek,
34         InfoBarSummarySupport, InfoBarTimeshiftState, InfoBarTeletextPlugin, InfoBarExtensions,
35         InfoBarPiP, InfoBarPlugins, InfoBarSubtitleSupport, InfoBarServiceErrorPopupSupport, InfoBarJobman,
36         Screen):
37         
38         ALLOW_SUSPEND = True
39         instance = None
40
41         def __init__(self, session):
42                 Screen.__init__(self, session)
43                 self["actions"] = HelpableActionMap(self, "InfobarActions",
44                         {
45                                 "showMovies": (self.showMovies, _("Play recorded movies...")),
46                                 "showRadio": (self.showRadio, _("Show the radio player...")),
47                                 "showTv": (self.showTv, _("Show the tv player...")),
48                                 #       ikseong action for subtitle hotkey
49                                 "showSubtitle":(self.showSubtitle, _("Show the Subtitle...")),
50                         }, prio=2)
51                 
52                 self.allowPiP = True
53                 
54                 for x in HelpableScreen, \
55                                 InfoBarBase, InfoBarShowHide, \
56                                 InfoBarNumberZap, InfoBarChannelSelection, InfoBarMenu, InfoBarEPG, InfoBarRdsDecoder, \
57                                 InfoBarInstantRecord, InfoBarAudioSelection, InfoBarUnhandledKey, \
58                                 InfoBarAdditionalInfo, InfoBarNotifications, InfoBarDish, InfoBarSubserviceSelection, \
59                                 InfoBarTimeshift, InfoBarSeek, InfoBarSummarySupport, InfoBarTimeshiftState, \
60                                 InfoBarTeletextPlugin, InfoBarExtensions, InfoBarPiP, InfoBarSubtitleSupport, InfoBarJobman, \
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                         from Screens.ChannelSelection import ChannelSelectionRadio
115                         self.session.openWithCallback(self.ChannelSelectionRadioClosed, ChannelSelectionRadio, self)
116
117         def ChannelSelectionRadioClosed(self, *arg):
118                 self.rds_display.show()  # in InfoBarRdsDecoder
119
120         def showMovies(self):
121                 from Screens.MovieSelection import MovieSelection
122                 self.session.openWithCallback(self.movieSelected, MovieSelection)
123
124         def movieSelected(self, service):
125                 if service is not None:
126                         self.session.open(MoviePlayer, service)
127
128         #       ikseong action for subtitle hotkey
129         def showSubtitle(self):
130                 from Screens.Subtitles import Subtitles
131                 self.session.open(Subtitles)
132
133 class MoviePlayer(InfoBarBase, InfoBarShowHide, \
134                 InfoBarMenu, \
135                 InfoBarSeek, InfoBarShowMovies, InfoBarAudioSelection, HelpableScreen, InfoBarNotifications,
136                 InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, InfoBarSimpleEventView,
137                 InfoBarMoviePlayerSummarySupport, InfoBarSubtitleSupport, Screen, InfoBarTeletextPlugin,
138                 InfoBarServiceErrorPopupSupport, InfoBarExtensions, InfoBarPlugins, InfoBarPiP):
139
140         ENABLE_RESUME_SUPPORT = True
141         ALLOW_SUSPEND = True
142                 
143         def __init__(self, session, service):
144                 Screen.__init__(self, session)
145                 
146                 self["actions"] = HelpableActionMap(self, "MoviePlayerActions",
147                         {
148                                 #       ikseong action for subtitle hotkey
149                                 "showSubtitle":(self.showSubtitle, _("Show the Subtitle...")),
150                                 "leavePlayer": (self.leavePlayer, _("leave movie player..."))
151                         })
152                 
153                 self.allowPiP = False
154                 
155                 for x in HelpableScreen, InfoBarShowHide, InfoBarMenu, \
156                                 InfoBarBase, InfoBarSeek, InfoBarShowMovies, \
157                                 InfoBarAudioSelection, InfoBarNotifications, InfoBarSimpleEventView, \
158                                 InfoBarServiceNotifications, InfoBarPVRState, InfoBarCueSheetSupport, \
159                                 InfoBarMoviePlayerSummarySupport, InfoBarSubtitleSupport, \
160                                 InfoBarTeletextPlugin, InfoBarServiceErrorPopupSupport, InfoBarExtensions, \
161                                 InfoBarPlugins, InfoBarPiP:
162                         x.__init__(self)
163
164                 self.lastservice = session.nav.getCurrentlyPlayingServiceReference()
165                 session.nav.playService(service)
166                 self.returning = False
167                 self.onClose.append(self.__onClose)
168
169         def __onClose(self):
170                 self.session.nav.playService(self.lastservice)
171
172         def handleLeave(self, how):
173                 self.is_closing = True
174                 if how == "ask":
175                         if config.usage.setup_level.index < 2: # -expert
176                                 list = (
177                                         (_("Yes"), "quit"),
178                                         (_("No"), "continue")
179                                 )
180                         else:
181                                 list = (
182                                         (_("Yes"), "quit"),
183                                         (_("Yes, returning to movie list"), "movielist"),
184                                         (_("Yes, and delete this movie"), "quitanddelete"),
185                                         (_("No"), "continue"),
186                                         (_("No, but restart from begin"), "restart")
187                                 )
188
189                         from Screens.ChoiceBox import ChoiceBox
190                         self.session.openWithCallback(self.leavePlayerConfirmed, ChoiceBox, title=_("Stop playing this movie?"), list = list)
191                 else:
192                         self.leavePlayerConfirmed([True, how])
193
194         def leavePlayer(self):
195                 self.handleLeave(config.usage.on_movie_stop.value)
196
197         def deleteConfirmed(self, answer):
198                 if answer:
199                         self.leavePlayerConfirmed((True, "quitanddeleteconfirmed"))
200
201         def leavePlayerConfirmed(self, answer):
202                 answer = answer and answer[1]
203
204                 if answer in ("quitanddelete", "quitanddeleteconfirmed"):
205                         ref = self.session.nav.getCurrentlyPlayingServiceReference()
206                         from enigma import eServiceCenter
207                         serviceHandler = eServiceCenter.getInstance()
208                         info = serviceHandler.info(ref)
209                         name = info and info.getName(ref) or _("this recording")
210
211                         if answer == "quitanddelete":
212                                 from Screens.MessageBox import MessageBox
213                                 self.session.openWithCallback(self.deleteConfirmed, MessageBox, _("Do you really want to delete %s?") % name)
214                                 return
215
216                         elif answer == "quitanddeleteconfirmed":
217                                 offline = serviceHandler.offlineOperations(ref)
218                                 if offline.deleteFromDisk(0):
219                                         from Screens.MessageBox import MessageBox
220                                         self.session.openWithCallback(self.close, MessageBox, _("You cannot delete this!"), MessageBox.TYPE_ERROR)
221                                         return
222
223                 if answer in ("quit", "quitanddeleteconfirmed"):
224                         self.close()
225                 elif answer == "movielist":
226                         ref = self.session.nav.getCurrentlyPlayingServiceReference()
227                         self.returning = True
228                         from Screens.MovieSelection import MovieSelection
229                         self.session.openWithCallback(self.movieSelected, MovieSelection, ref)
230                         self.session.nav.stopService()
231                 elif answer == "restart":
232                         self.doSeek(0)
233                         self.setSeekState(self.SEEK_STATE_PLAY)
234
235         def doEofInternal(self, playing):
236                 if not self.execing:
237                         return
238                 if not playing :
239                         return
240                 self.handleLeave(config.usage.on_movie_eof.value)
241
242         def showMovies(self):
243                 ref = self.session.nav.getCurrentlyPlayingServiceReference()
244                 from Screens.MovieSelection import MovieSelection
245                 self.session.openWithCallback(self.movieSelected, MovieSelection, ref)
246
247         def movieSelected(self, service):
248                 if service is not None:
249                         self.is_closing = False
250                         self.session.nav.playService(service)
251                         self.returning = False
252                 elif self.returning:
253                         self.close()
254                         
255         #       ikseong action for subtitle hotkey
256         def showSubtitle(self):
257                 from Screens.Subtitles import Subtitles
258                 self.session.open(Subtitles)