Can select dir to scan for library. Can quit after current track

git-svn-id: file:///home/anna/Desktop/ocarina-legacy/mithos/ocarina@19 1daee41c-8060-4895-b1f0-2197c00d777a
This commit is contained in:
bjschuma 2009-06-05 16:51:18 +00:00
parent 93f2dacf83
commit 3a2da68561
5 changed files with 210 additions and 98 deletions

View File

@ -31,7 +31,7 @@ class Library():
#self.prnt(["Directory not found: "+dir]) #self.prnt(["Directory not found: "+dir])
print "Directory not found: %s" % dir print "Directory not found: %s" % dir
return return
self.prnt(["Scanning: "+self.data.path]) print "Scanning: "+self.data.path
self.traverse("") self.traverse("")
num = len(self.data.files) num = len(self.data.files)
#self.prnt(["Found "+str(num)+" files!"]) #self.prnt(["Found "+str(num)+" files!"])

View File

@ -13,6 +13,7 @@ from library import Library
from operations import Operations from operations import Operations
from playlist import Playlist from playlist import Playlist
from songInfo import SongInfo from songInfo import SongInfo
from window import Window
#gtk.gdk.threads_init() #gtk.gdk.threads_init()
gobject.threads_init() gobject.threads_init()
@ -20,8 +21,7 @@ gobject.threads_init()
class main: class main:
def __init__(self,argv): def __init__(self,argv):
self.ops = Operations() self.ops = Operations(self.quit)
self.makeWindow()
self.library = Library() self.library = Library()
self.plist = Playlist() self.plist = Playlist()
@ -29,11 +29,9 @@ class main:
self.ops.plist = self.plist self.ops.plist = self.plist
self.ops.library = self.library self.ops.library = self.library
#self.ops.plist.random = True window = Window(self.quit,self.ops)
if self.ops.plist.random==True: self.ops.setInfo = window.changeInfo
# Toggle random status because set_active toggles it back self.ops.resetInfo = window.resetInfo
self.ops.random(None,None)
self.randomButton.set_active(1)
song = None song = None
# If we were given a song as input, check that it exists and begin playback # If we were given a song as input, check that it exists and begin playback
@ -53,104 +51,17 @@ class main:
self.ops.song = song self.ops.song = song
self.ops.next("","") self.ops.next("","")
#gobject.idle_add(self.markProgress,self.pbar,"progress")
# Call gtk main # Call gtk main
gtk.main() gtk.main()
# Make the main window # Eventually replace "delete_event" with this
def makeWindow(self): def quit(self,widget,event,data=None):
# Make window
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_title("Ocarina")
self.window.connect("delete_event",self.delete_event)
self.window.set_border_width(0)
self.window.set_icon_from_file("images/ocarina.png")
# Make a control box for buttons
self.control = gtk.VBox(False,0)
self.infoFrame = gtk.Frame("Song Info Goes Here")
infoLabel = gtk.Label("test")
self.infoFrame.add(infoLabel)
infoLabel.show()
self.infoFrame.show()
self.inside = gtk.HBox(False,0)
self.window.add(self.control)
# Make buttons
self.randomButton = gtk.CheckButton(label="Random")
self.randomButton.connect("toggled",self.ops.random,"randomButton")
# Start with random enabled
self.randomButton.show()
self.playButton = self.makeButton("playButton","images/play.png",None,self.ops.play)
self.pauseButton = self.makeButton("pauseButton","images/pause.png",None,self.ops.pause)
self.nextButton = self.makeButton("nextButton","images/next.png",None,self.ops.next)
self.thisButton = self.makeButton("thisButton",None,"This",self.ops.this)
self.infoButton = self.makeButton("infoButton",None,"Info",self.ops.info)
# Add buttons to window
self.inside.pack_start(self.playButton,False,False,0)
self.inside.pack_start(self.pauseButton,False,False,0)
self.inside.pack_start(self.nextButton,False,False,0)
self.inside.pack_start(self.thisButton,False,False,0)
self.inside.pack_start(self.infoButton,False,False,0)
self.inside.pack_start(self.randomButton,False,False,0)
self.inside.show()
# Top row
self.control.pack_start(self.infoFrame,False,False,0)
self.control.pack_start(self.inside,False,False,0)
self.pbar = gtk.ProgressBar()
self.pbar.set_fraction(0)
self.pbar.show()
# Update the progress bar every 100 ms
gobject.timeout_add(100,self.ops.markProgress,self.pbar,"progress")
self.control.pack_start(self.pbar,False,False,0)
# Tray
#self.statusIcon = gtk.StatusIcon()
#self.statusIcon.set_from_file("images/ocarina.png")
#self.statusIcon.set_tooltip("Ocarina")
#self.statusIcon.show()
self.control.show()
self.window.show()
# Called before exiting
def delete_event(self,widget,event,data=None):
print "Quitting..." print "Quitting..."
self.library.dump() self.library.dump()
gtk.main_quit() gtk.main_quit()
return False return False
# Use this to make a button
# Give the name, image path, text, and callback function
def makeButton(self,name,path,text,func):
button = gtk.Button()
box = gtk.HBox(False,0)
box.set_border_width(0)
if path != None:
image = gtk.Image()
image.set_from_file(path)
image.show()
box.pack_start(image,False,False,0)
if text != None:
label = gtk.Label(text)
label.show()
box.pack_start(label,False,False,0)
box.show()
button.add(box)
button.connect("clicked",func,name)
button.show()
return button
def scanLib(self,dir):
if dir == "":
print "Please include a library directory"
return
self.library.scan(dir)
if __name__=='__main__':main(sys.argv[1:]) if __name__=='__main__':main(sys.argv[1:])

View File

@ -2,10 +2,12 @@ from song import Song
# Use to define various operations # Use to define various operations
class Operations: class Operations:
def __init__(self): def __init__(self,exit):
self.song = None self.song = None
self.plist = None self.plist = None
self.library = None self.library = None
self.exit = exit
self.quitAfter = False
# Begin playback # Begin playback
@ -22,11 +24,17 @@ class Operations:
self.song.pause() self.song.pause()
def afterTrack(self,widget,data):
if data=="qafter":
self.quitAfter = True
# Advance to the next song # Advance to the next song
def next(self,widget,data): def next(self,widget,data):
# Close open songs # Close open songs
if self.song != None: if self.song != None:
self.song.close() self.song.close()
if self.quitAfter == True:
self.exit(None,None)
# Get next song # Get next song
index = self.plist.next() index = self.plist.next()
if index > -1: if index > -1:
@ -34,6 +42,7 @@ class Operations:
info = self.library.data.files[index] info = self.library.data.files[index]
self.song = Song(info,self.next) self.song = Song(info,self.next)
if index > -2: if index > -2:
self.song.setInfo = self.setInfo
self.song.play() self.song.play()
@ -79,3 +88,7 @@ class Operations:
# Toggle random # Toggle random
def random(self,widget,data): def random(self,widget,data):
self.plist.random = not self.plist.random self.plist.random = not self.plist.random
def scanLib(self,dir):
self.library.scan(dir)

View File

@ -13,6 +13,8 @@ class Song():
#self.prnt=prnt #self.prnt=prnt
self.info = info self.info = info
self.info.tags = dict() self.info.tags = dict()
self.setInfo = None
self.getNext = None
# initialize player pipeline # initialize player pipeline
self.player = gst.Pipeline("player") self.player = gst.Pipeline("player")
bin = gst.element_factory_make("playbin",None) bin = gst.element_factory_make("playbin",None)
@ -46,12 +48,15 @@ class Song():
#if self.prnt != None: #if self.prnt != None:
# self.prnt(["Error: "+ str(err) + " " +str(debug)]) # self.prnt(["Error: "+ str(err) + " " +str(debug)])
print "Error: %s" % err, debug print "Error: %s" % err, debug
print "Trying next song"
self.getNext(None,None)
#if self.quit != None: #if self.quit != None:
# self.quit("") # self.quit("")
elif t == gst.MESSAGE_TAG: elif t == gst.MESSAGE_TAG:
tags = message.parse_tag() tags = message.parse_tag()
for tag in tags.keys(): for tag in tags.keys():
self.info.tags[tag] = tags[tag] self.info.tags[tag] = tags[tag]
self.setInfo(tags)
#self.taglist = message.parse_tag() #self.taglist = message.parse_tag()
return return

183
trunk/window.py Normal file
View File

@ -0,0 +1,183 @@
import gobject
import pygtk
pygtk.require('2.0')
import gtk
class Window(gtk.Window):
def __init__(self,onQuit,ops):
gtk.Window.__init__(self,gtk.WINDOW_TOPLEVEL)
print "Making window!"
self.ops = ops
self.tooltip = gtk.Tooltips()
self.tagLabels = dict()
self.set_title("Ocarina")
# Call quit function when closed
self.connect("delete_event",onQuit)
self.set_icon_from_file("images/ocarina.png")
self.mainLayout = gtk.VBox(False,0)
self.add(self.mainLayout)
self.mainLayout.show()
self.makeMenuBar()
self.makeInfoPane()
self.makeControls()
self.show()
# Make initial info pane
def makeInfoPane(self):
info = gtk.Frame("Current Song:")
box = gtk.VBox(False,0)
info.add(box)
self.tagLabels["title"] = self.makeLabel("Title: ?",box)
self.tagLabels["artist"] = self.makeLabel("Artist: ?",box)
self.tagLabels["album"] = self.makeLabel("Album: ?",box)
box.show()
info.show()
self.mainLayout.add(info)
# Set up a new label, add to container
# Goes into a HBox so that it is left justified
def makeLabel(self,text,container):
box = gtk.HBox(False,0)
label = gtk.Label(text)
self.tooltip.set_tip(label,text,tip_private=None)
label.set_max_width_chars(35)
label.show()
box.pack_start(label,False,False,0)
box.show()
container.pack_start(box,False,False,0)
return label
# Change label info
def changeInfo(self,tags):
keys = tags.keys()
labels = self.tagLabels.keys()
for key in keys:
if (key in labels) == True:
str = key.title()+": "+tags[key]
self.tagLabels[key].set_label(str)
self.tooltip.set_tip(self.tagLabels[key],str,tip_private=None)
self.tagLabels[key].show()
# Reset label info
def resetInfo(self):
labels = self.tagLabels.keys()
for key in labels:
self.tagLabels[key].set_label(key.title()+": ?")
self.tooltip.set_tip(self.tagLabels[key],key.title()+": ?")
self.tagLabels[key].show()
# Use to make play/pause/next/etc buttons
def makeControls(self):
#controls = gtk.VBox(False,0)
topRow = gtk.HBox(False,0)
# Make top row buttons
self.makeButton("play","images/play.png",None,self.ops.play,topRow)
self.makeButton("pause","images/pause.png",None,self.ops.pause,topRow)
self.makeButton("next","images/next.png",None,self.ops.next,topRow)
self.makeButton("this",None,"This",self.ops.this,topRow)
self.makeButton("info",None,"Info",self.ops.info,topRow)
test = gtk.VBox(False,0)
self.makeCheck("Random",self.ops.random,self.ops.plist.random,True,topRow)
topRow.show()
self.mainLayout.pack_start(topRow,False,False,0)
# Make progress bar, add below top row
pbar = gtk.ProgressBar()
pbar.set_fraction(0)
gobject.timeout_add(1000,self.ops.markProgress,pbar,"progress")
pbar.show()
self.mainLayout.pack_start(pbar,False,False,0)
# Show completed controls
#controls.show()
#self.add(controls)
# Make buttons and add to container
# Path is to an image
# Text is label text
# Func is callback function
def makeButton(self,name,path,text,func,container):
button = gtk.Button()
box = gtk.HBox(False,0)
box.set_border_width(0)
if path != None:
image = gtk.Image()
image.set_from_file(path)
image.show()
box.pack_start(image,False,False,0)
if text != None:
label = gtk.Label(text)
label.show()
box.pack_start(label,False,False,0)
box.show()
button.add(box)
button.connect("clicked",func,name)
button.show()
container.pack_start(button,False,False,0)
return button
# Make a checkbox and add to container
# Active is variable to check, status is value it has to mark as active
def makeCheck(self,name,func,active,status,container):
check = gtk.CheckButton(label=name)
if active == status:
check.set_active(1)
check.connect("toggled",func,name)
check.show()
container.pack_start(check,False,False,0)
return check
def makeMenuBar(self):
# Make menu bar
bar = gtk.MenuBar()
# This is the dropdown selections
# Make a new library option
library = gtk.MenuItem("Library")
lib = gtk.Menu()
newLib = gtk.MenuItem(label="New Library")
newLib.connect_object("activate",self.selectDir,self.ops.scanLib)
newLib.show()
lib.append(newLib)
# This shows in the toolbar
library.set_submenu(lib)
library.show()
bar.append(library)
# Make playback option
playback = gtk.MenuItem("Playback")
pback = gtk.Menu()
safter = gtk.MenuItem(label="Quit After Current Track")
safter.connect("activate",self.ops.afterTrack,"qafter")
safter.show()
pback.append(safter)
playback.set_submenu(pback)
playback.show()
bar.append(playback)
# Add to main layout
bar.show()
self.mainLayout.pack_start(bar,False,False,0)
def selectDir(self,func):
dirsel = gtk.FileChooserDialog(None,action=gtk.FILE_CHOOSER_ACTION_OPEN,buttons =(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
dirsel.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
response = dirsel.run()
if response == gtk.RESPONSE_OK:
#print dirsel.get_filename(),'selected'
func(dirsel.get_filename())
dirsel.hide()
#if response == gtk.RESPONSE_CANCEL:
# dirsel.hide()
#elif response == gtk.RESPONSE_OK:
# print module.get_filename(),'selected'
#else:
# print response