class EmbeddedPlayerPanel(wx.Panel): """ The Embedded Player consists of a VLCLogoWindow and the media controls such as Play/Pause buttons and Volume Control. """ VIDEO_SIZE = (320, 240) def __init__(self, parent, utility, vlcwrap, bg, border=True): wx.Panel.__init__(self, parent, -1) self.__check_thread() self.utility = utility self.parent = parent self.border = border self.SetBackgroundColour(DEFAULT_BACKGROUND) self.volume = 0.48 self.oldvolume = 0.48 self.estduration = None self.fullscreen_enabled = False self.fullscreenwindow = None self.play_enabled = False self.stop_enabled = False self.scroll_enabled = False vSizer = wx.BoxSizer(wx.VERTICAL) if border: self.SetMinSize((34, -1)) images = ("minimize.png", "maximize.png") images = [ os.path.join(self.utility.getPath(), LIBRARYNAME, "Main", "vwxGUI", "images", image) for image in images ] self.header = PlayerHeader(self, self, bg, [], images[0], images[1]) vSizer.Add(self.header, 0, wx.EXPAND) hSizer = wx.BoxSizer(wx.HORIZONTAL) self.leftLine = wx.Panel(self, size=(1, -1)) self.leftLine.SetBackgroundColour(bg) mainbox = wx.BoxSizer(wx.VERTICAL) self.rightLine = wx.Panel(self, size=(1, -1)) self.rightLine.SetBackgroundColour(bg) hSizer.Add(self.leftLine, 0, wx.EXPAND) hSizer.Add(mainbox, 1, wx.EXPAND) hSizer.Add(self.rightLine, 0, wx.EXPAND) vSizer.Add(hSizer, 1, wx.EXPAND) footer = ListFooter(self) footer.SetBackgroundColour(bg) vSizer.Add(footer, 0, wx.EXPAND) else: mainbox = vSizer self.vlcwrap = vlcwrap if vlcwrap is not None: self.vlcwin = VLCLogoWindow(self, utility, vlcwrap, bg, animate=True) self.vlcwin.SetMinSize(EmbeddedPlayerPanel.VIDEO_SIZE) if border: player_img = os.path.join(self.utility.getPath(), LIBRARYNAME, "Main", "vwxGUI", 'images', 'player.png') self.player_img = wx.StaticBitmap( self, -1, wx.BitmapFromImage(wx.Image(player_img, wx.BITMAP_TYPE_ANY))) mainbox.Add(self.player_img, 0, wx.ALIGN_CENTER | wx.TOP, 5) mainbox.Add(self.vlcwin, 1, wx.EXPAND, 0) self.ctrlsizer = wx.BoxSizer(wx.HORIZONTAL) self.slider = ProgressSlider(self, self.utility) self.slider.SetRange(0, 1) self.slider.SetValue(0) self.mute = SwitchButton(self, name='mt') self.mute.Bind(wx.EVT_LEFT_UP, self.MuteClicked) self.ppbtn = PlayerSwitchButton( self, os.path.join(self.utility.getPath(), LIBRARYNAME, 'Video', 'Images'), 'pause', 'play') self.ppbtn.Bind(wx.EVT_LEFT_UP, self.PlayPause) self.ppbtn.setSelected(2) self.sbtn = PlayerButton( self, os.path.join(self.utility.getPath(), LIBRARYNAME, 'Video', 'Images'), 'stop') self.sbtn.Bind(wx.EVT_LEFT_UP, self.OnStop) self.sbtn.setSelected(2) volumebox = wx.BoxSizer(wx.HORIZONTAL) self.vol1 = PlayerButton( self, os.path.join(self.utility.getPath(), LIBRARYNAME, 'Video', 'Images'), 'vol1') self.vol1.Bind(wx.EVT_MOUSE_EVENTS, self.mouseAction) self.vol2 = PlayerButton( self, os.path.join(self.utility.getPath(), LIBRARYNAME, 'Video', 'Images'), 'vol2') self.vol2.Bind(wx.EVT_MOUSE_EVENTS, self.mouseAction) self.vol3 = PlayerButton( self, os.path.join(self.utility.getPath(), LIBRARYNAME, 'Video', 'Images'), 'vol3') self.vol3.Bind(wx.EVT_MOUSE_EVENTS, self.mouseAction) self.vol4 = PlayerButton( self, os.path.join(self.utility.getPath(), LIBRARYNAME, 'Video', 'Images'), 'vol4') self.vol4.Bind(wx.EVT_MOUSE_EVENTS, self.mouseAction) self.vol5 = PlayerButton( self, os.path.join(self.utility.getPath(), LIBRARYNAME, 'Video', 'Images'), 'vol5') self.vol5.Bind(wx.EVT_MOUSE_EVENTS, self.mouseAction) self.vol6 = PlayerButton( self, os.path.join(self.utility.getPath(), LIBRARYNAME, 'Video', 'Images'), 'vol6') self.vol6.Bind(wx.EVT_MOUSE_EVENTS, self.mouseAction) volumebox.Add(self.vol1, 0, wx.ALIGN_CENTER_VERTICAL) volumebox.Add(self.vol2, 0, wx.ALIGN_CENTER_VERTICAL) volumebox.Add(self.vol3, 0, wx.ALIGN_CENTER_VERTICAL) volumebox.Add(self.vol4, 0, wx.ALIGN_CENTER_VERTICAL) volumebox.Add(self.vol5, 0, wx.ALIGN_CENTER_VERTICAL) volumebox.Add(self.vol6, 0, wx.ALIGN_CENTER_VERTICAL) self.updateVol(self.volume) self.fsbtn = PlayerButton( self, os.path.join(self.utility.getPath(), LIBRARYNAME, 'Video', 'Images'), 'fullScreen') self.fsbtn.Bind(wx.EVT_LEFT_UP, self.FullScreen) self.fsbtn.setSelected(2) self.ctrlsizer.Add(self.ppbtn, 0, wx.ALIGN_CENTER_VERTICAL) self.ctrlsizer.Add(self.sbtn, 0, wx.ALIGN_CENTER_VERTICAL) self.ctrlsizer.Add(self.slider, 1, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND) self.ctrlsizer.Add(self.mute, 0, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND) self.ctrlsizer.Add(volumebox, 0, wx.ALIGN_CENTER_VERTICAL | wx.EXPAND) self.ctrlsizer.Add(self.fsbtn, 0, wx.ALIGN_CENTER_VERTICAL) mainbox.Add(self.ctrlsizer, 0, wx.ALIGN_BOTTOM | wx.EXPAND | wx.LEFT | wx.RIGHT, 3) if border: self.vlcwin.Show(False) self.ctrlsizer.ShowItems(False) # Arno: until we figure out how to show in-playback prebuffering info self.statuslabel = wx.StaticText(self) vSizer.Add(self.statuslabel, 0, wx.EXPAND) self.SetSizer(vSizer) self.playtimer = None self.update = False self.timer = None def mouseAction(self, event): if event.LeftDown(): if self.mute.isToggled(): # unmute self.mute.setToggled(False) if event.GetEventObject().GetImageName() == 'vol1': self.volume = 0.16 if event.GetEventObject().GetImageName() == 'vol2': self.volume = 0.32 if event.GetEventObject().GetImageName() == 'vol3': self.volume = 0.48 if event.GetEventObject().GetImageName() == 'vol4': self.volume = 0.64 if event.GetEventObject().GetImageName() == 'vol5': self.volume = 0.80 if event.GetEventObject().GetImageName() == 'vol6': self.volume = 1.00 self.oldvolume = self.volume self.updateVol(self.volume) self.SetVolume(self.volume) elif event.Entering(): if event.GetEventObject().GetImageName() == 'vol1': volume = 0.16 if event.GetEventObject().GetImageName() == 'vol2': volume = 0.32 if event.GetEventObject().GetImageName() == 'vol3': volume = 0.48 if event.GetEventObject().GetImageName() == 'vol4': volume = 0.64 if event.GetEventObject().GetImageName() == 'vol5': volume = 0.80 if event.GetEventObject().GetImageName() == 'vol6': volume = 1.00 self.updateVol(volume) elif event.Leaving(): self.updateVol(self.volume) def MuteClicked(self, event): if self.mute.isToggled(): self.volume = self.oldvolume else: self.volume = 0 self.updateVol(self.volume) self.SetVolume(self.volume) self.mute.setToggled(not self.mute.isToggled()) def updateVol(self, volume): # updates the volume bars in the gui self.vol1.setSelected(volume >= 0.16) self.vol2.setSelected(volume >= 0.32) self.vol3.setSelected(volume >= 0.48) self.vol4.setSelected(volume >= 0.64) self.vol5.setSelected(volume >= 0.80) self.vol6.setSelected(volume >= 1.00) def Load(self, url, streaminfo=None): self.__check_thread() if DEBUG: print >> sys.stderr, "embedplay: Load:", url, streaminfo, currentThread( ).getName() ##self.SetPlayerStatus('') if streaminfo is not None: self.estduration = streaminfo.get('estduration', None) # 19/02/10 Boudewijn: no self.slider when self.vlcwrap is None # 26/05/09 Boudewijn: when using the external player we do not have a vlcwrap if self.vlcwrap: # Arno: hack: disable dragging when not playing from file. if url is None or url.startswith('http:'): self.slider.DisableDragging() else: self.slider.EnableDragging() # Arno, 2009-02-17: If we don't do this VLC gets the wrong playlist somehow self.vlcwrap.stop() self.vlcwrap.playlist_clear() self.vlcwrap.load(url, streaminfo=streaminfo) # Enable update of progress slider self.update = True wx.CallAfter(self.slider.SetValue, 0) if self.timer is None: self.timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.UpdateSlider) self.timer.Start(500) self.enableFullScreen() self.enablePlay() self.enableStop() self.enableScroll() def StartPlay(self): """ Start playing the new item after VLC has stopped playing the old one """ if DEBUG: print >> sys.stderr, "embedplay: PlayWhenStopped" self.playtimer = DelayTimer(self) def Play(self, evt=None): self.__check_thread() if DEBUG: print >> sys.stderr, "embedplay: Play pressed" self.OnMaximize() # Boudewijn, 26/05/09: when using the external player we do not have a vlcwrap if self.vlcwrap: if self.GetState() != MEDIASTATE_PLAYING: self.vlcwin.stop_animation() self.ppbtn.setToggled(False) self.vlcwrap.start() elif DEBUG: print >> sys.stderr, "embedplay: Play pressed, already playing" def Pause(self, evt=None): self.__check_thread() """ Toggle between playing and pausing of current item """ if DEBUG: print >> sys.stderr, "embedplay: Pause pressed" # Boudewijn, 26/05/09: when using the external player we do not have a vlcwrap if self.vlcwrap: if self.GetState() == MEDIASTATE_PLAYING: self.ppbtn.setToggled(True) self.vlcwrap.pause() elif DEBUG: print >> sys.stderr, "embedplay: Pause pressed, not playing" def Resume(self, evt=None): self.__check_thread() if DEBUG: print >> sys.stderr, "embedplay: Resume pressed" if self.vlcwrap: if self.GetState() != MEDIASTATE_PLAYING: self.vlcwin.stop_animation() self.ppbtn.setToggled(False) self.vlcwrap.resume() def PlayPause(self, evt=None): self.__check_thread() """ Toggle between playing and pausing of current item """ if DEBUG: print >> sys.stderr, "embedplay: PlayPause pressed" # Boudewijn, 26/05/09: when using the external player we do not have a vlcwrap if self.vlcwrap: self.vlcwrap.resume() self.ppbtn.setToggled(not self.ppbtn.isToggled()) def Seek(self, evt=None): self.__check_thread() if DEBUG: print >> sys.stderr, "embedplay: Seek" # Boudewijn, 26/05/09: when using the external player we do not have a vlcwrap if self.vlcwrap: oldsliderpos = self.slider.GetValue() #print >>sys.stderr, 'embedplay: Seek: GetValue returned,',oldsliderpos pos = int(oldsliderpos * 1000.0) #print >>sys.stderr, 'embedplay: Seek: newpos',pos try: if self.GetState() == MEDIASTATE_STOPPED: self.vlcwrap.start(pos) else: self.vlcwrap.set_media_position(pos) except: print_exc() if DEBUG: print >> sys.stderr, 'embedplay: could not seek' self.slider.SetValue(oldsliderpos) self.update = True def enableScroll(self): self.scroll_enabled = True # 19/02/10 Boudewijn: no self.slider when self.vlcwrap is None if self.vlcwrap: self.slider.EnableDragging() def disableScroll(self): self.scroll_enabled = False # 19/02/10 Boudewijn: no self.slider when self.vlcwrap is None if self.vlcwrap: self.slider.DisableDragging() def enablePlay(self): self.play_enabled = True self.ppbtn.setSelected(False) def disablePlay(self): self.play_enabled = False self.ppbtn.setSelected(2) def enableStop(self): self.stop_enabled = True self.sbtn.setSelected(False) def disableStop(self): self.stop_enabled = False self.sbtn.setSelected(2) def enableFullScreen(self): self.fullscreen_enabled = True self.fsbtn.setSelected(False) def disableFullScreen(self): self.fullscreen_enabled = False self.fsbtn.setSelected(2) def FullScreen(self, evt=None): # Boudewijn, 26/05/09: when using the external player we do not have a vlcwrap if self.vlcwrap and self.fullscreen_enabled: self._ToggleFullScreen() def OnFullScreenKey(self, event): if event.GetUnicodeKey() == wx.WXK_ESCAPE: self._ToggleFullScreen() elif event.GetUnicodeKey() == wx.WXK_SPACE: self._TogglePause() def _TogglePause(self): if self.GetState() == MEDIASTATE_PLAYING: self.vlcwrap.pause() else: self.vlcwrap.resume() def _ToggleFullScreen(self): self.__check_thread() if isinstance(self.parent, wx.Frame): #are we shown in popup frame if self.ctrlsizer.IsShown( 0): #we are not in fullscreen -> ctrlsizer is showing self.parent.ShowFullScreen(True) self.ctrlsizer.ShowItems(False) self.statuslabel.Show(False) self.Layout() #Niels: 07-03-2012, only evt_close seems to work :( quitId = wx.NewId() pauseId = wx.NewId() self.parent.Bind(wx.EVT_MENU, lambda event: self._ToggleFullScreen(), id=quitId) self.parent.Bind(wx.EVT_MENU, lambda event: self._TogglePause(), id=pauseId) self.parent.Bind(wx.EVT_CLOSE, lambda event: self._ToggleFullScreen()) self.parent.Bind(wx.EVT_LEFT_DCLICK, lambda event: self._ToggleFullScreen()) accelerators = [(wx.ACCEL_NORMAL, wx.WXK_ESCAPE, quitId), (wx.ACCEL_CTRL, wx.WXK_SPACE, pauseId)] self.parent.SetAcceleratorTable( wx.AcceleratorTable(accelerators)) else: self.parent.ShowFullScreen(False) self.ctrlsizer.ShowItems(True) self.statuslabel.Show(True) self.Layout() self.parent.SetAcceleratorTable(wx.NullAcceleratorTable) self.parent.Unbind(wx.EVT_CLOSE) else: #saving media player state cur_time = self.vlcwrap.get_media_position() cur_state = self.vlcwrap.get_our_state() self.vlcwrap.stop() if not self.fullscreenwindow: # create a new top level frame where to attach the vlc widget and # render the fullscreen video self.fullscreenwindow = wx.Frame(None, title="FullscreenVLC") self.fullscreenwindow.SetBackgroundColour("BLACK") eventPanel = wx.Panel(self.fullscreenwindow) eventPanel.SetBackgroundColour(wx.BLACK) eventPanel.Bind(wx.EVT_KEY_DOWN, lambda event: self.OnFullScreenKey(event)) self.fullscreenwindow.Bind( wx.EVT_CLOSE, lambda event: self._ToggleFullScreen()) self.fullscreenwindow.ShowFullScreen(True) eventPanel.SetFocus() self.vlcwrap.set_window(self.fullscreenwindow) else: self.TellLVCWrapWindow4Playback() self.fullscreenwindow.Destroy() self.fullscreenwindow = None #restoring state if cur_state == MEDIASTATE_PLAYING: self.vlcwrap.start(cur_time) elif cur_state == MEDIASTATE_PAUSED: self.vlcwrap.start(cur_time) def doPause(cur_time): self.vlcwrap.pause() self.vlcwrap.set_media_position(cur_time) wx.CallLater(500, doPause, cur_time) def Save(self, evt=None): # save media content in different directory if self.save_button.isToggled(): self.save_callback() def SetVolume(self, volume, evt=None): if DEBUG: print >> sys.stderr, "embedplay: SetVolume:", self.volume # Boudewijn, 26/05/09: when using the external player we do not have a vlcwrap if self.vlcwrap: self.vlcwrap.sound_set_volume( volume) ## float(self.volume.GetValue()) / 100 def OnStop(self, event): if self.vlcwrap and self.stop_enabled: self.Stop() self.disableStop() def Stop(self): self.__check_thread() if DEBUG: print >> sys.stderr, "embedplay: Stop" self.OnMinimize() # Boudewijn, 26/05/09: when using the external player we do not have a vlcwrap if self.vlcwrap: self.vlcwrap.stop() self.ppbtn.SetLabel(self.utility.lang.get('playprompt')) self.slider.ResetTime() self.slider.SetValue(0) self.disableFullScreen() self.disablePlay() self.disableScroll() if self.timer is not None: self.timer.Stop() def GetState(self): """ Returns the state of VLC as summarized by Fabian: MEDIASTATE_PLAYING, MEDIASTATE_PAUSED, MEDIASTATE_STOPPED """ # Boudewijn, 26/05/09: when using the external player we do not have a vlcwrap if self.vlcwrap: status = self.vlcwrap.get_our_state() if DEBUG: print >> sys.stderr, "embedplay: GetState", status return status # catchall return MEDIASTATE_STOPPED def Reset(self): self.Stop() self.UpdateProgressSlider([False]) # # Control on-screen information # @forceWxThread def UpdateStatus(self, playerstatus, pieces_complete): self.SetPlayerStatus(playerstatus) if self.vlcwrap is not None: self.UpdateProgressSlider(pieces_complete) def SetPlayerStatus(self, s): if sys.platform == 'win32': s = "\n".join(wrap(s, 64)) self.SetLoadingText(s) def SetContentName(self, s): self.vlcwin.set_content_name(s) def SetContentImage(self, wximg): self.vlcwin.set_content_image(wximg) def SetLoadingText(self, text): if text == None: text = '' if text != self.statuslabel.GetLabel(): self.statuslabel.SetLabel(text) self.statuslabel.Refresh() self.Layout() # # Internal methods # def UpdateProgressSlider(self, pieces_complete): # 19/02/10 Boudewijn: no self.slider when self.vlcwrap is None if self.vlcwrap: self.slider.setBufferFromPieces(pieces_complete) self.slider.Refresh() def DisableInput(self): # return # Not currently used self.ppbtn.Disable() # 19/02/10 Boudewijn: no self.slider when self.vlcwrap is None if self.vlcwrap: self.slider.Disable() self.fsbtn.Disable() def UpdateSlider(self, evt): self.__check_thread() ##if not self.volumeicon.isToggled(): ## self.volume.SetValue(int(self.vlcwrap.sound_get_volume() * 100)) # Boudewijn, 26/05/09: when using the external player we do not have a vlcwrap if self.vlcwrap: if self.update and self.GetState() != MEDIASTATE_STOPPED: len = self.vlcwrap.get_stream_information_length() if len == -1 or len == 0: if self.estduration is None: return else: len = int(self.estduration) else: len /= 1000 cur = self.vlcwrap.get_media_position() / 1000 self.slider.SetRange(0, len) self.slider.SetValue(cur) self.slider.SetTimePosition(float(cur), len) def StopSliderUpdate(self, evt): self.update = False def TellLVCWrapWindow4Playback(self): if self.vlcwrap is not None: self.vlcwin.tell_vclwrap_window_for_playback() def ShowLoading(self): if self.vlcwrap: self.vlcwin.show_loading() self.OnMaximize() def OnMinimize(self): if self.vlcwrap and self.border: self.SetMinSize((34, -1)) self.vlcwin.Show(False) self.ctrlsizer.ShowItems(False) self.header.ShowMinimized(False) self.statuslabel.Show(False) self.player_img.Show(True) self.utility.guiUtility.frame.Layout() def OnMaximize(self): if self.vlcwrap and self.border: self.SetMinSize((EmbeddedPlayerPanel.VIDEO_SIZE[0], -1)) self.vlcwin.Show(True) self.ctrlsizer.ShowItems(True) self.header.ShowMinimized(True) self.statuslabel.Show(True) self.player_img.Show(False) self.utility.guiUtility.frame.Layout() def __check_thread(self): if __debug__ and currentThread().getName() != "MainThread": print >> sys.stderr, "EmbeddedPlayer: __check_thread thread", currentThread( ).getName(), "is NOT MainThread" print_stack()
class SearchDetailsPanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent, -1) self.guiUtility = GUIUtility.getInstance() self.addComponents() def addComponents(self): self.hSizer = wx.BoxSizer(wx.HORIZONTAL) #(self, -1, wx.DefaultPosition, wx.Size(16,16),name='down') self.stopMoreButton = SwitchButton(self, -1, wx.DefaultPosition, wx.DefaultSize, name='searchStop') self.stopMoreButton.Bind(wx.EVT_LEFT_UP, self.stopMoreClicked) self.stopMoreButton.SetToolTipString( self.guiUtility.utility.lang.get('searchStop')) self.clearButton = tribler_topButton(self, -1, wx.DefaultPosition, wx.DefaultSize, name='searchClear') self.clearButton.SetToolTipString( self.guiUtility.utility.lang.get('searchClear')) self.hSizer.Add([9, 5], 0, wx.EXPAND | wx.FIXED_MINSIZE, 0) self.hSizer.Add(self.stopMoreButton, 0, wx.ALL, 1) self.hSizer.Add(self.clearButton, 0, wx.ALL, 1) self.hSizer.Add([8, 5], 0, wx.EXPAND | wx.FIXED_MINSIZE, 0) self.textPanel = wx.Panel(self) sizer = wx.BoxSizer(wx.HORIZONTAL) self.text = wx.StaticText(self.textPanel, -1, '') self.text.SetForegroundColour(wx.Colour(255, 255, 255)) sizer.Add(self.text, 1, wx.ALL, 0) self.textPanel.SetSizer(sizer) self.textPanel.SetAutoLayout(1) self.textPanel.SetForegroundColour(wx.WHITE) self.textPanel.SetBackgroundColour(wx.Colour(53, 53, 53)) self.text.SetSize((-1, 15)) self.hSizer.Add(self.textPanel, 1, wx.TOP | wx.EXPAND, 3) self.SetSizer(self.hSizer) self.SetAutoLayout(1) self.SetMinSize((-1, 19)) self.SetBackgroundColour(wx.Colour(53, 53, 53)) self.hSizer.Layout() self.Layout() self.searchBusy = True #?? #self.Show(True) self.results = {} def setMessage(self, stype, finished, num, keywords=[]): if stype: self.results[stype] = num total = sum([v for v in self.results.values() if v != -1]) if keywords: if type(keywords) == list: self.keywords = " ".join(keywords) else: self.keywords = keywords if finished: msg = self.guiUtility.utility.lang.get('finished_search') % ( self.keywords, total) #self.stopMoreClicked() else: msg = self.guiUtility.utility.lang.get('going_search') % ( self.keywords, total) self.text.SetLabel(msg) tt = [] for pair in self.results.items(): key, value = pair if value == -1: continue tt.append( self.guiUtility.utility.lang.get('search_' + key) % value) tt.sort() tt = os.linesep.join(tt) self.textPanel.SetToolTipString(tt) self.text.SetToolTipString(tt) def startSearch(self): self.stopMoreButton.setToggled(False) self.searchBusy = True def stopSearch(self): # call remoteSearch and Web2.0 search to stop self.guiUtility.stopSearch() # def findMoreSearch(self): # # call remoteSearch and Web2.0 search to find more # self.startSearch() # grid = self.guiUtility.standardOverview.getGrid() # if grid.dod: # grid.dod.requestMore(grid.items) def searchFinished(self): self.searchBusy = False self.stopMoreButton.setToggled(True) self.setMessage(None, True, 0, None) def stopMoreClicked(self, event=None): if event: event.Skip() if self.searchBusy: self.stopSearch() self.searchFinished()