X-Git-Url: http://git.maemo.org/git/?p=jamaendo;a=blobdiff_plain;f=jamaui%2Fplayerwindow.py;h=ea7f76c915c583a55643630dedc767142b176d63;hp=ce1349441e620ef15af7a04285ae13dbb40e637c;hb=28e536cd57640a4375d8e05cfb5e0d6ba91f8f70;hpb=facd2a5710fb05ac80d55ed8e1af8184fb496c02 diff --git a/jamaui/playerwindow.py b/jamaui/playerwindow.py index ce13494..ea7f76c 100644 --- a/jamaui/playerwindow.py +++ b/jamaui/playerwindow.py @@ -23,9 +23,14 @@ # import gtk import gobject -import hildon +try: + import hildon +except: + import helldon as hildon import util +import datetime import pango +import jamaendo from settings import settings from postoffice import postoffice from player import Playlist, the_player @@ -33,41 +38,47 @@ import logging import cgi from songposition import SongPosition - +from listbox import ListDialog +import colors log = logging.getLogger(__name__) class PlayerWindow(hildon.StackableWindow): + instance = None + def __init__(self): hildon.StackableWindow.__init__(self) self.set_title("jamaendo") + PlayerWindow.instance = self + self.connect('destroy', self.on_destroy) self.player = the_player self.playlist = the_player.playlist - vbox = gtk.VBox() + vbox = gtk.VBox(False, 8) - hbox = gtk.HBox(False, 8) + hbox = gtk.HBox(False) self.cover = gtk.Image() - tmp = util.find_resource('album.png') - if tmp: - self.cover.set_from_file(tmp) + self.set_default_cover() vbox2 = gtk.VBox() self.playlist_pos = gtk.Label() self.playlist_pos.set_alignment(1.0,0) self.track = gtk.Label() - self.track.set_alignment(0,0) + self.track.set_alignment(0,1) self.track.set_ellipsize(pango.ELLIPSIZE_END) self.artist = gtk.Label() - self.artist.set_alignment(0,0) + self.artist.set_alignment(0,0.5) self.artist.set_ellipsize(pango.ELLIPSIZE_END) self.album = gtk.Label() self.album.set_alignment(0,0) self.album.set_ellipsize(pango.ELLIPSIZE_END) + self.playtime = gtk.Label() + self.playtime.set_alignment(1,0) + self.playtime.set_ellipsize(pango.ELLIPSIZE_END) self.progress = SongPosition() self.set_labels('', '', '', 0, 0) @@ -78,8 +89,11 @@ class PlayerWindow(hildon.StackableWindow): vbox2.pack_start(self.track, True) vbox2.pack_start(self.artist, True) vbox2.pack_start(self.album, True) + vbox2.pack_start(self.playtime, False, True) + vbox2.pack_start(self.progress, False, True) - hbox.pack_start(self.cover, False, True, 0) + hbox.set_border_width(8) + hbox.pack_start(self.cover, False, True, 8) hbox.pack_start(vbox2, True, True, 0) vbox.pack_start(hbox, True, True, 0) @@ -89,25 +103,18 @@ class PlayerWindow(hildon.StackableWindow): vbox.pack_start(btns, False, True, 0) - vbox.pack_start(self.progress, False) - self.add_stock_button(btns, gtk.STOCK_MEDIA_PREVIOUS, self.on_prev) self.add_play_button(btns) self.add_stock_button(btns, gtk.STOCK_MEDIA_STOP, self.on_stop) self.add_stock_button(btns, gtk.STOCK_MEDIA_NEXT, self.on_next) - #self.volume = hildon.VVolumebar() - #self.volume.set_property('can-focus', False) - #self.volume.connect('level_changed', self.volume_changed_hildon) - #self.volume.connect('mute_toggled', self.mute_toggled) - #hbox.pack_start(self.volume, False) + self.controls = btns + self.add(vbox) postoffice.connect('album-cover', self, self.set_album_cover) postoffice.connect(['next', 'prev', 'play', 'pause', 'stop'], self, self.on_state_changed) - #print "Created player window, playlist: %s" % (self.playlist) - self.on_state_changed() self.create_menu() @@ -116,14 +123,12 @@ class PlayerWindow(hildon.StackableWindow): self.menu = hildon.AppMenu() def to_artist(*args): - import jamaendo from showartist import ShowArtist track = self.playlist.current() artist = jamaendo.get_artist(int(track.artist_id)) wnd = ShowArtist(artist) wnd.show_all() def to_album(*args): - import jamaendo from showalbum import ShowAlbum track = self.playlist.current() album = jamaendo.get_album(int(track.album_id)) @@ -140,6 +145,11 @@ class PlayerWindow(hildon.StackableWindow): b.connect("clicked", to_album) self.menu.append(b) + b = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) + b.set_label("Add to playlist") + b.connect("clicked", self.on_add_to_playlist) + self.menu.append(b) + self.menu.show_all() self.set_app_menu(self.menu) @@ -163,12 +173,14 @@ class PlayerWindow(hildon.StackableWindow): return None def on_destroy(self, wnd): + PlayerWindow.instance = None self.stop_position_timer() postoffice.disconnect(['album-cover', 'next', 'prev', 'play', 'stop'], self) def add_stock_button(self, btns, stock, cb): btn = hildon.GtkButton(gtk.HILDON_SIZE_FINGER_HEIGHT) btn.set_relief(gtk.RELIEF_NONE) + btn.set_focus_on_click(False) sz = gtk.ICON_SIZE_BUTTON btn.set_image(gtk.image_new_from_stock(stock, sz)) btn.connect('clicked', cb) @@ -199,11 +211,35 @@ class PlayerWindow(hildon.StackableWindow): self.playbtn.set_data('state', 'play') def set_labels(self, track, artist, album, playlist_pos, playlist_size): - self.playlist_pos.set_markup('Track %s of %s'%(int(playlist_pos)+1, playlist_size)) - self.track.set_markup('%s'%(cgi.escape(track))) - self.artist.set_markup('%s'%(cgi.escape(artist))) - self.album.set_markup('%s'%(cgi.escape(album))) + if self.playlist.radio_mode: + ppstr = 'Radio: %s'%(cgi.escape(self.playlist.radio_name)) + elif playlist_size > 0: + ppstr = 'Track %s of %s'%(int(playlist_pos)+1, playlist_size) + else: + ppstr = "No playlist" + ppstr = '%s'%(colors.SmallSystemFont(), colors.SecondaryTextColor(), ppstr) + self.playlist_pos.set_markup(ppstr) + self.track.set_markup('%s'%(colors.LargeSystemFont(), cgi.escape(track))) + self.artist.set_markup('%s'%(cgi.escape(artist))) + self.album.set_markup('%s'%(colors.SecondaryTextColor(), cgi.escape(album))) + + if not track: + txt = '%s' % \ + (colors.XXLargeSystemFont(), + colors.SecondaryTextColor(), + '00:00' + ) + self.playtime.set_markup(txt) + + def show_banner(self, message, timeout = 2000): + banner = hildon.hildon_banner_show_information(self, '', message) + banner.set_timeout(2000) + + def on_add_to_playlist(self, button, user_data=None): + track = self.player.playlist.current() + from playlists import add_to_playlist + add_to_playlist(self, track) def volume_changed_hildon(self, widget): settings.volume = widget.get_level()/100.0 @@ -234,33 +270,83 @@ class PlayerWindow(hildon.StackableWindow): def clear_position(self): self.progress.set_position(0) + def nanosecs_to_str(self, ns): + time_secs = int(float(ns)/1000000000.0) + if time_secs <= 59: + return "00:%02d"%(time_secs) + time_mins = int(time_secs/60.0) + time_secs -= time_mins*60 + if time_mins <= 59: + return "%02d:%02d"%(time_mins, time_secs) + + time_hrs = int(time_mins/60.0) + time_mins -= time_hrs*60 + return "%d:%02d:%02d"%(time_hrs, time_secs, time_mins) + def set_song_position(self, time_elapsed, total_time): value = (float(time_elapsed) / float(total_time)) if total_time else 0 self.progress.set_position(value) + + txt = '%s' % \ + (colors.XXLargeSystemFont(), + colors.SecondaryTextColor(), + self.nanosecs_to_str(time_elapsed) + ) + self.playtime.set_markup(txt) + + def set_default_cover(self): + tmp = util.find_resource('album.png') + if tmp: + log.debug("Setting cover to %s", tmp) + self.cover.set_from_file(tmp) + def update_state(self): item = self.playlist.current() if item: + hildon.hildon_gtk_window_set_progress_indicator(self, 0) if not item.name: item.load() self.set_labels(item.name, item.artist_name, item.album_name, self.playlist.current_index(), self.playlist.size()) + self.set_default_cover() postoffice.notify('request-album-cover', int(item.album_id), 300) else: self.set_labels('', '', '', 0, 0) - tmp = util.find_resource('album.png') - if tmp: - self.cover.set_from_file(tmp) + self.set_default_cover() + state = bool(item) + for btn in self.controls: + if isinstance(btn, hildon.GtkButton): + btn.set_sensitive(state) def set_album_cover(self, albumid, size, cover): if size == 300: playing = self.get_album_id() if playing and albumid and (int(playing) == int(albumid)): + log.debug("Setting cover to %s", cover) self.cover.set_from_file(cover) + def play_radio(self, radio_name, radio_id): + playlist = Playlist([]) + playlist.radio_mode = True + playlist.radio_name = radio_name + playlist.radio_id = radio_id + hildon.hildon_gtk_window_set_progress_indicator(self, 1) + self.__play_tracks(playlist) + #log.debug("Playlist current: %s, playing? %s", + # playlist.current_index(), + # self.player.playing()) + def play_tracks(self, tracks): + self.__play_tracks(tracks) + + def __play_tracks(self, tracks): self.clear_position() - self.playlist = Playlist(tracks) + if isinstance(tracks, Playlist): + self.playlist = tracks + else: + self.playlist = Playlist(tracks) + log.debug("Playing: %s", self.playlist) self.player.stop() self.player.play(self.playlist) @@ -280,6 +366,15 @@ class PlayerWindow(hildon.StackableWindow): self.player.stop() def open_playerwindow(): - player = PlayerWindow() - player.show_all() + if PlayerWindow.instance: + player = PlayerWindow.instance + stack = player.get_stack() + sz = stack.size() + windows = stack.pop(sz) + windows.remove(player) + windows.append(player) + stack.push_list(windows) + else: + player = PlayerWindow() + player.show_all() return player