From 85e98dd8f497099c90411bdbc7c2f6d2280ca1e1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristoffer=20Gr=C3=B6nlund?= Date: Sat, 9 Jan 2010 04:38:33 +0100 Subject: [PATCH] Added primitive playlist viewer (allows for deleting playlists) --- jamaui/playlists.py | 58 +++++++++++++---- jamaui/settings.py | 5 ++ jamaui/showplaylist.py | 164 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 216 insertions(+), 11 deletions(-) create mode 100644 jamaui/showplaylist.py diff --git a/jamaui/playlists.py b/jamaui/playlists.py index cd8edac..6384b1e 100644 --- a/jamaui/playlists.py +++ b/jamaui/playlists.py @@ -30,6 +30,7 @@ import jamaendo from settings import settings import logging from albumlist import PlaylistList +from postoffice import postoffice log = logging.getLogger(__name__) @@ -100,20 +101,30 @@ class PlaylistsWindow(hildon.StackableWindow): def __init__(self): hildon.StackableWindow.__init__(self) self.set_title("Playlists") + self.connect('destroy', self.on_destroy) + + #self.deltoolbar = hildon.EditToolbar("Choose playlists to delete", "Delete") + #self.set_edit_toolbar(self.deltoolbar) + #self.deltoolbar.connect("button-clicked", self.on_delete_button) + #self.deltoolbar.connect_swapped("arrow-clicked", gtk.widget_destroy, window) self.panarea = hildon.PannableArea() self.playlistlist = PlaylistList() - self.playlistlist.empty_message = "No playlists" + self.playlistlist.loading_message = "Loading playlists" + self.playlistlist.empty_message = "No playlists found" self.playlistlist.connect('row-activated', self.row_activated) self.panarea.add(self.playlistlist) self.add(self.panarea) - for key, lst in sorted(list(settings.playlists.iteritems())): - self.playlistlist.add_playlist(key, lst) - self.playlistlist.set_loading(False) + self.populate() self.create_menu() + postoffice.connect('settings-changed', self, self.settings_changed) + + def on_destroy(self, wnd): + postoffice.disconnect('settings-changed', self) + def create_menu(self): def on_player(*args): from playerwindow import open_playerwindow @@ -123,6 +134,12 @@ class PlaylistsWindow(hildon.StackableWindow): player.set_label("Open player") player.connect("clicked", on_player) self.menu.append(player) + + #player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) + #player.set_label("Delete playlists") + #player.connect("clicked", self.on_delete_playlists) + #self.menu.append(player) + # bah, I haven't decided how I want to do this yet # lets just hide it for now #player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) @@ -136,16 +153,35 @@ class PlaylistsWindow(hildon.StackableWindow): self.menu.show_all() self.set_app_menu(self.menu) - def on_manage_playlists(self, *args): - _show_banner(self, "TODOO") + def populate(self): + for key, lst in sorted(list(settings.playlists.iteritems())): + self.playlistlist.add_playlist(key, lst) + self.playlistlist.set_loading(False) + + def settings_changed(self, setting, *args): + if setting == 'playlists': + self.playlistlist.set_loading(True) + self.playlistlist.get_model().clear() + self.populate() + + #def on_delete_playlists(self, *args): + # self.deltoolbar.show() + # self.playlistlist.set_hildon_ui_mode(hildon.UI_MODE_EDIT) + + #def on_delete_button(self, btn): + # pass + + #def on_export_playlists(self, *args): + # _show_banner(self, "TODOO") - def on_export_playlists(self, *args): - _show_banner(self, "TODOO") def row_activated(self, treeview, path, view_column): sel = self.playlistlist.get_playlist_name(path) pl = settings.get_playlist(sel) if pl: - from playerwindow import open_playerwindow - wnd = open_playerwindow() - wnd.play_tracks(pl) + from showplaylist import ShowPlaylist + wnd = ShowPlaylist(sel, pl) + wnd.show_all() + #from playerwindow import open_playerwindow + #wnd = open_playerwindow() + #wnd.play_tracks(pl) diff --git a/jamaui/settings.py b/jamaui/settings.py index 94e10a6..db1a6aa 100644 --- a/jamaui/settings.py +++ b/jamaui/settings.py @@ -77,6 +77,11 @@ class Settings(object): postoffice.notify('settings-changed', 'playlists', self.playlists) log.debug("playlists is now %s", self.playlists) + def delete_playlist(self, name): + if name in self.playlists: + del self.playlists[name] + postoffice.notify('settings-changed', 'playlists', self.playlists) + def load(self): if not os.path.isfile(self.__savename): return diff --git a/jamaui/showplaylist.py b/jamaui/showplaylist.py new file mode 100644 index 0000000..ed43c5a --- /dev/null +++ b/jamaui/showplaylist.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python +# +# This file is part of Jamaendo. +# Copyright (c) 2010 Kristoffer Gronlund +# +# Jamaendo is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Jamaendo is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Jamaendo. If not, see . +# +# Player code heavily based on http://thpinfo.com/2008/panucci/: +# A resuming media player for Podcasts and Audiobooks +# Copyright (c) 2008-05-26 Thomas Perl +# (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html) +# +import gtk +import cgi +try: + import hildon +except: + import helldon as hildon +import jamaendo +from player import Playlist +from playerwindow import open_playerwindow +from settings import settings +from postoffice import postoffice +import util +import logging +import thread +import gobject +from albumlist import TrackList +from fetcher import Fetcher + +import webbrowser + +log = logging.getLogger(__name__) + +class ShowPlaylist(hildon.StackableWindow): + def __init__(self, plname, playlist): + hildon.StackableWindow.__init__(self) + self.set_title(plname) + self.playlist_name = plname + self.playlist = playlist + self.fetcher = None + + self.connect('destroy', self.on_destroy) + + top_hbox = gtk.HBox() + vbox1 = gtk.VBox() + self.cover = gtk.Image() + tmp = util.find_resource('album.png') + if tmp: + self.cover.set_from_file(tmp) + + vbox2 = gtk.VBox() + self.trackarea = hildon.PannableArea() + self.tracks = TrackList(numbers=True) + self.tracks.connect('row-activated', self.row_activated) + self.tracklist = [] + + top_hbox.pack_start(vbox1, False) + top_hbox.pack_start(vbox2, True) + vbox1.pack_start(self.cover, True) + vbox2.pack_start(self.trackarea, True) + self.trackarea.add(self.tracks) + + self.add(top_hbox) + + postoffice.connect('album-cover', self, self.on_album_cover) + if len(self.playlist) > 0: + postoffice.notify('request-album-cover', int(self.playlist[0].album_id), 300) + + self.create_menu() + self.start_track_fetcher() + + def create_menu(self): + def on_player(*args): + from playerwindow import open_playerwindow + open_playerwindow() + self.menu = hildon.AppMenu() + player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) + player.set_label("Open player") + player.connect("clicked", on_player) + self.menu.append(player) + player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO) + player.set_label("Delete playlist") + player.connect("clicked", self.on_delete_pl) + self.menu.append(player) + self.menu.show_all() + self.set_app_menu(self.menu) + + def on_destroy(self, wnd): + postoffice.disconnect('album-cover', self) + if self.fetcher: + self.fetcher.stop() + self.fetcher = None + + def start_track_fetcher(self): + if self.fetcher: + self.fetcher.stop() + self.fetcher = None + self.fetcher = Fetcher(lambda: self.playlist, self, + on_item = self.on_track_result, + on_ok = self.on_track_complete, + on_fail = self.on_track_complete) + self.fetcher.start() + + def on_track_result(self, wnd, item): + if wnd is self: + self.tracklist.append(item) + self.tracks.add_track(item) + + def on_track_complete(self, wnd, error=None): + if wnd is self: + self.fetcher.stop() + self.fetcher = None + + def on_delete_pl(self, btn): + note = hildon.hildon_note_new_confirmation(self, "Do you want to delete '%s' ?" % (self.playlist_name)) + response = note.run() + note.destroy() + print response + if response == gtk.RESPONSE_OK: + settings.delete_playlist(self.playlist_name) + settings.save() + self.destroy() + + def on_album_cover(self, albumid, size, cover): + if size == 300: + self.cover.set_from_file(cover) + + def on_play(self, btn): + self.open_item(self.album) + + def row_activated(self, treeview, path, view_column): + # TODO: wait for all tracks to load + _id = self.tracks.get_track_id(path) + pl = Playlist(self.playlist) + pl.jump_to(_id) + wnd = open_playerwindow() + wnd.show_all() + wnd.play_tracks(pl) + + def open_item(self, item): + if isinstance(item, jamaendo.Album): + tracks = jamaendo.get_tracks(item.ID) + if tracks: + wnd = open_playerwindow() + wnd.play_tracks(tracks) + elif isinstance(item, jamaendo.Artist): + from showartist import ShowArtist + wnd = ShowArtist(item) + wnd.show_all() + elif isinstance(item, jamaendo.Track): + wnd = open_playerwindow() + wnd.play_tracks([item]) -- 1.7.9.5