ocarina/trunk/src/contentPane.py

303 lines
7.4 KiB
Python

# Eventually this and rightPane should probably be merged...
import gtk
import gobject
from label import Label
from queue import Queue
from playlist import Playlist
from liblist import LibList
from image import Image
from check import CheckButton
from button import Button
#from libView import LibView
from scrobbler import Scrobbler
#from plistView import PlistView
from controlPanel import ControlPanel
#from rightPane import RightPane
class ContentPane(gtk.HBox):
def __init__(self,data):
gtk.HBox.__init__(self,False,0)
self.data = data
self.divider = gtk.HPaned()
self.divider.set_position(self.data.divider)
self.divider.show()
self.add(self.divider)
self.makeLeftSide()
self.makeRightSide()
self.show()
def makeLeftSide(self):
self.data.scrobbler = Scrobbler(self.data)
self.divider.add1(self.data.scrobbler)
def makeRightSide(self):
vbox = gtk.VBox(False,0)
vbox.show()
#self.right = RightPane(self.data)
self.divider.add2(vbox)
self.title = Label("",13000,700)
self.album = Label("",10000,400)
self.artist = Label("",10000,400)
self.setLabels()
infobox = gtk.HBox(False,0)
infobox.show()
infolabels = gtk.VBox(False,0)
infolabels.show()
infobox.pack_start(infolabels,False,False,0)
infolabels.pack_start(self.title,False,False,0)
infolabels.pack_start(self.album,False,False,0)
infolabels.pack_start(self.artist,False,False,0)
self.searchBar = gtk.Entry()
self.searchBar.show()
self.searchBar.connect("changed",self.textTyped)
searchalign = gtk.Alignment(1,1,0,0)
searchalign.show()
searchalign.add(self.searchBar)
infobox.pack_end(searchalign,False,False,0)
vbox.pack_start(infobox,False,False,0)
self.makeTabs(vbox)
self.makeControls(vbox)
hbox = gtk.HBox(False,0)
hbox.pack_start(self.library.pbaralign,False,False,0)
hbox.pack_end(self.playlist.align,False,False,0)
hbox.pack_end(self.queue.align,False,False,0)
hbox.pack_end(self.library.align,False,False,0)
vbox.pack_start(hbox,False,False,0)
hbox.show()
#self.changedTab(None,None,0)
self.status = ""
self.filterCount = 0
def setLabels(self):
title = ""
album = ""
artist = ""
if self.data.song:
title = self.data.song.info.title
album = "from "+self.data.song.info.album
artist = "by "+self.data.song.info.artist
self.title.set_text(title)
self.album.set_text(album)
self.artist.set_text(artist)
def makeTabs(self,box):
self.tabs = gtk.Notebook()
box.add(self.tabs)
self.tabs.show()
self.queue = Queue(self.data,self.next,self.setLabels,self.plause)
self.playlist = Playlist(self.data,self.queue,self.next,self.setLabels,self.plause)
self.playlist.visible("show")
self.library = LibList(self.data,self.playlist,self.queue,self.next,self.setLabels,self.plause)
self.data.library.libview = self.library
self.tabs.append_page(self.playlist,self.playlist.label)
self.tabs.append_page(self.queue,self.queue.label)
self.tabs.append_page(self.library,self.library.label)
self.curTab = 0
self.tabs.connect("switch-page",self.changedTab)
#self.filter("")
def makeControls(self,vbox):
box = gtk.HBox(False,0)
box.show()
self.pauseImg = Image(None,gtk.STOCK_MEDIA_PAUSE)
box.pack_start(CheckButton("Random",self.toggleRand,self.data.random),False,False,0)
hbox = gtk.VBox()
hbox.show()
pbar = gtk.ProgressBar()
pbar.show()
pbar.set_fraction(0)
event = gtk.EventBox()
event.show()
event.add(pbar)
hbox.pack_start(event,True,False,0)
event.connect("button_release_event",self.pbarclick,pbar)
box.pack_start(hbox,True,True,0)
gobject.timeout_add(500,self.updatePBar,pbar)
(self.playImg,self.plauseBtn) = self.makeButton("plause",gtk.STOCK_MEDIA_PLAY,self.plause,box)
(self.stopImg,self.stopBtn) = self.makeButton("stop",gtk.STOCK_MEDIA_STOP,self.stop,box)
(self.nextImg,self.nextBtn) = self.makeButton("next",gtk.STOCK_MEDIA_NEXT,self.next,box)
vbox.pack_start(box,False,False,0)
def makeButton(self,name,img,func,box):
image = Image(None,img)
button = Button(name,image,None,func)
box.pack_start(button,False,False,0)
return image,button
def toggleRand(self,widgit):
self.data.random = not self.data.random
def pbarclick(self,widgit,data,pbar):
if data.button==1:
prcnt = float(data.x) / float(pbar.get_allocation()[2])
self.data.song.seek(int(prcnt * self.data.song.info.duration * 1000000000))
def updatePBar(self,pbar):
time = 0
if not self.data.song:
return True
try:
time = self.data.song.curTime()
except:
time = 0
if self.data.song.info.duration > 0:
pbar.set_fraction(float(time)/self.data.song.info.duration)
pbar.set_text(self.data.song.info.fixTime(time) + " / " + self.data.song.info.length)
return True
def plause(self,widgit,data):
self.data.song.plause()
self.changeImg()
def stop(self,widgit,data):
self.data.song.stop()
self.changeImg()
def next(self,widgit,data):
loaded = self.queue.getNext()
#print loaded
if loaded == False:
loaded = self.playlist.getNext()
if not (self.status == "pafter") and (loaded==True):
self.plause(None,None)
self.data.scrobbler.nowPlaying(self.data.song.info)
self.gotoCurSong()
self.status = ""
self.data.dump()
# Scroll to the current song
def gotoCurSong(self):
print "here!"
self.playlist.gotoCurSong()
self.queue.gotoCurSong()
self.library.gotoCurSong()
# Change the state of the play/pause button
def changeImg(self):
self.plauseBtn.set_image(self.playImg)
if self.data.song.playing == True:
self.plauseBtn.set_image(self.pauseImg)
# This is called when a user changes tabs
# Do nothing if the user selects the same tab
# Otherwise, hide objects on the old visible tab and show the new visible tab
# Also updates self.curTab
def changedTab(self,widgit,page,pagenum):
if self.curTab == pagenum:
return
if self.curTab == 0:
self.playlist.visible("hide")
elif self.curTab == 1:
self.queue.visible("hide")
else:
self.library.visible("hide")
self.curTab = pagenum
if pagenum == 0:
self.playlist.visible("show")
elif pagenum == 1:
self.queue.visible("show")
else:
self.library.visible("show")
self.textTyped(self.searchBar)
def dumpLib(self):
self.library.drop()
self.playlist.drop()
self.queue.drop()
# text was typed, refilter rows
# Arrange to filter rows in 250ms, as long as no additional text has been typed
def textTyped(self,entry):
search = entry.get_text().lower()
self.filterCount+=1
gobject.timeout_add(250,self.filter,search)
# Filter the rows of the current tab
# Do a quickFilter on nonvisible tabs
# Decrements self.filterCount
def filter(self,search):
# If filterCount is 0, no additional text has been typed
self.filterCount -= 1
if self.filterCount > 0:
return
# It is ok to filter rows
if self.curTab == 0:
self.playlist.filterRows(search)
tabs = [1,2]
elif self.curTab == 1:
self.queue.filterRows(search)
tabs = [0,2]
else:
self.library.filterRows(search)
tabs = [0,1]
for tab in tabs:
if tab == 0:
self.playlist.filterQuick(search)
elif tab == 1:
self.queue.filterQuick(search)
else:
self.library.filterQuick(search)
# Coose to pause after the current song or not
def setStatus(self,status):
if status == "pafter":
self.status = "pafter"
else:
print status
# Store the width of the current tabs columns
def storeCols(self):
if self.curTab == 0:
self.playlist.storeCols()
elif self.curTab == 1:
self.queue.storeCols()
else:
self.library.storeCols()