New year, big checkin
[jamaendo] / jamaui / playerwindow.py
1 import gtk
2 import hildon
3 import jamaendo
4 from settings import settings
5 from player import Playlist, the_player
6
7 class PlayerWindow(hildon.StackableWindow):
8     def __init__(self, playlist=None):
9         hildon.StackableWindow.__init__(self)
10         self.set_title("jamaendo")
11
12         self.connect('hide', self.on_hide)
13         self.connect('destroy', self.on_destroy)
14
15         self.playlist = Playlist(playlist)
16         self.player = the_player
17
18         vbox = gtk.VBox()
19
20         hbox = gtk.HBox()
21
22         self.cover = gtk.Image()
23         self.cover.set_size_request(200, 200)
24         self.cover.set_from_stock(gtk.STOCK_CDROM, gtk.ICON_SIZE_DIALOG)
25
26         vbox2 = gtk.VBox()
27
28         self.playlist_pos = gtk.Label()
29         self.track = gtk.Label()
30         self.progress = hildon.GtkHScale()
31         self.artist = gtk.Label()
32         self.album = gtk.Label()
33
34         if self.player.playlist.current_index() > -1:
35             pl = self.player.playlist
36             track = pl.current()
37             self.set_labels(track.name, track.artist_name, track.album_name, pl.current_index(), pl.size())
38         else:
39             self.set_labels('', '', '', 0, 0)
40
41         vbox2.pack_start(self.track, True)
42         vbox2.pack_start(self.artist, False)
43         vbox2.pack_start(self.album, False)
44         vbox2.pack_start(self.playlist_pos, False)
45         vbox2.pack_start(self.progress, False)
46
47         hbox.pack_start(self.cover, True, True, 0)
48         hbox.pack_start(vbox2, True, True, 0)
49
50         vbox.pack_start(hbox, True, True, 0)
51
52         btns = gtk.HButtonBox()
53         btns.set_property('layout-style', gtk.BUTTONBOX_SPREAD)
54
55         vbox.pack_end(btns, False, True, 0)
56
57         self.add_stock_button(btns, gtk.STOCK_MEDIA_PREVIOUS, self.on_prev)
58         self.add_stock_button(btns, gtk.STOCK_MEDIA_PLAY, self.on_play)
59         self.add_stock_button(btns, gtk.STOCK_MEDIA_PAUSE, self.on_pause)
60         self.add_stock_button(btns, gtk.STOCK_MEDIA_STOP, self.on_stop)
61         self.add_stock_button(btns, gtk.STOCK_MEDIA_NEXT, self.on_next)
62
63         self.volume = hildon.VVolumebar()
64         self.volume.set_property('can-focus', False)
65         self.volume.connect('level_changed', self.volume_changed_hildon)
66         self.volume.connect('mute_toggled', self.mute_toggled)
67         #self.__gui_root.main_window.connect( 'key-press-event',
68         #                                     self.on_key_press )
69         hbox.pack_start(self.volume, False)
70         self.add(vbox)
71
72         print "Created player window, playlist: %s" % (self.playlist)
73
74     def on_hide(self, wnd):
75         print "Hiding player window"
76
77     def on_destroy(self, wnd):
78         print "Destroying player window"
79         if self.player:
80             self.player.stop()
81
82     def add_stock_button(self, btns, stock, cb):
83         btn = hildon.GtkButton(gtk.HILDON_SIZE_FINGER_HEIGHT)
84         btn.set_relief(gtk.RELIEF_NONE)
85         btn.set_image(gtk.image_new_from_stock(stock, gtk.ICON_SIZE_SMALL_TOOLBAR))
86         btn.connect('clicked', cb)
87         btns.add(btn)
88
89     def set_labels(self, track, artist, album, playlist_pos, playlist_size):
90         self.playlist_pos.set_markup('<span size="small">%s/%s songs</span>'%(playlist_pos, playlist_size))
91         self.track.set_markup('<span size="x-large">%s</span>'%(track))
92         self.artist.set_markup('<span size="large">%s</span>'%(artist))
93         self.album.set_markup('<span foreground="#aaaaaa">%s</span>'%(album))
94
95
96     def volume_changed_hildon(self, widget):
97         settings.volume = widget.get_level()/100.0
98
99     def mute_toggled(self, widget):
100         if widget.get_mute():
101             settings.volume = 0
102         else:
103             settings.volume = widget.get_level()/100.0
104
105     def update_state(self):
106         item = self.playlist.current()
107         if item:
108             if not item.name:
109                 item.load()
110             print "current:", item
111             self.set_labels(item.name, item.artist_name, item.album_name,
112                             self.playlist.current_index(), self.playlist.size())
113             coverfile = jamaendo.get_album_cover(int(item.album_id), size=200)
114             print "coverfile:", coverfile
115             self.cover.set_from_file(coverfile)
116
117     def play_tracks(self, tracks):
118         self.playlist = Playlist(tracks)
119         self.player.play(self.playlist)
120         self.update_state()
121
122     def on_play(self, button):
123         self.player.play(self.playlist)
124         self.update_state()
125     def on_pause(self, button):
126         self.player.pause()
127     def on_prev(self, button):
128         self.player.prev()
129         self.update_state()
130     def on_next(self, button):
131         self.player.next()
132         self.update_state()
133     def on_stop(self, button):
134         self.player.stop()
135
136 def open_playerwindow(tracks=None):
137     player = PlayerWindow(tracks)
138     player.show_all()
139     return player