6384b1ebaf8a6f117b85bd5164f049b7c2a42c3d
[jamaendo] / jamaui / playlists.py
1 #!/usr/bin/env python
2 #
3 # This file is part of Jamaendo.
4 # Copyright (c) 2010 Kristoffer Gronlund
5 #
6 # Jamaendo is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # Jamaendo is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with Jamaendo.  If not, see <http://www.gnu.org/licenses/>.
18 #
19 # Player code heavily based on http://thpinfo.com/2008/panucci/:
20 #  A resuming media player for Podcasts and Audiobooks
21 #  Copyright (c) 2008-05-26 Thomas Perl <thpinfo.com>
22 #  (based on http://pygstdocs.berlios.de/pygst-tutorial/seeking.html)
23 #
24 import gtk
25 try:
26     import hildon
27 except:
28     import helldon as hildon
29 import jamaendo
30 from settings import settings
31 import logging
32 from albumlist import PlaylistList
33 from postoffice import postoffice
34
35 log = logging.getLogger(__name__)
36
37 def _alist(l, match):
38     for key, value in l:
39         if key == match:
40             return value
41     return None
42
43 def _show_banner(parent, message, timeout = 2000):
44     banner = hildon.hildon_banner_show_information(parent, '', message)
45     banner.set_timeout(2000)
46
47 show_banner = _show_banner
48
49 from listbox import ListDialog
50
51 def add_to_playlist(wnd, track):
52     if not track:
53         _show_banner(wnd, "Nothing to add")
54         return
55
56     dialog = ListDialog('Add to playlist', wnd)
57     for name,_ in settings.playlists.iteritems():
58         dialog.listbox.append(name)
59     dialog.listbox.append("New...")
60     try:
61         dialog.show_all()
62         if dialog.run() == gtk.RESPONSE_OK:
63             selected_playlist = dialog.selected
64             if selected_playlist == "New...":
65                 dialog.hide()
66                 selected_playlist = create_new_playlist(wnd)
67             if track and selected_playlist:
68                 if isinstance(track, (list, tuple)):
69                     for t in track:
70                         settings.add_to_playlist(selected_playlist, {'id':t.ID, 'data':t.get_data()})
71                 else:
72                     settings.add_to_playlist(selected_playlist, {'id':track.ID, 'data':track.get_data()})
73                 settings.save()
74                 _show_banner(wnd, "Added to playlist '%s'" % (selected_playlist))
75     finally:
76         dialog.destroy()
77
78 def create_new_playlist(wnd):
79     dia_name = gtk.Dialog()
80     dia_name.set_title("New playlist")
81     dia_name.add_button( gtk.STOCK_OK, gtk.RESPONSE_OK )
82     entry = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT)
83     entry.set_placeholder("Enter name")
84     entry.set_max_length(32)
85     entry.connect('activate', lambda entry, dialog: dialog.response(gtk.RESPONSE_OK), dia_name)
86     dia_name.vbox.pack_start(entry, True, True, 0)
87     dia_name.show_all()
88     if dia_name.run() != gtk.RESPONSE_OK:
89         return False
90     selected_playlist = entry.get_text()
91     dia_name.destroy()
92     if selected_playlist == '' or selected_playlist == 'New...':
93         return False
94     elif settings.get_playlist(selected_playlist):
95         _show_banner(wnd, "Playlist '%s' already exists!" % (selected_playlist))
96         return False
97     return selected_playlist
98
99
100 class PlaylistsWindow(hildon.StackableWindow):
101     def __init__(self):
102         hildon.StackableWindow.__init__(self)
103         self.set_title("Playlists")
104         self.connect('destroy', self.on_destroy)
105
106         #self.deltoolbar = hildon.EditToolbar("Choose playlists to delete", "Delete")
107         #self.set_edit_toolbar(self.deltoolbar)
108         #self.deltoolbar.connect("button-clicked", self.on_delete_button)
109         #self.deltoolbar.connect_swapped("arrow-clicked", gtk.widget_destroy, window)
110
111         self.panarea = hildon.PannableArea()
112         self.playlistlist = PlaylistList()
113         self.playlistlist.loading_message = "Loading playlists"
114         self.playlistlist.empty_message = "No playlists found"
115         self.playlistlist.connect('row-activated', self.row_activated)
116         self.panarea.add(self.playlistlist)
117         self.add(self.panarea)
118
119         self.populate()
120
121         self.create_menu()
122
123         postoffice.connect('settings-changed', self, self.settings_changed)
124
125     def on_destroy(self, wnd):
126         postoffice.disconnect('settings-changed', self)
127
128     def create_menu(self):
129         def on_player(*args):
130             from playerwindow import open_playerwindow
131             open_playerwindow()
132         self.menu = hildon.AppMenu()
133         player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
134         player.set_label("Open player")
135         player.connect("clicked", on_player)
136         self.menu.append(player)
137
138         #player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
139         #player.set_label("Delete playlists")
140         #player.connect("clicked", self.on_delete_playlists)
141         #self.menu.append(player)
142
143         # bah, I haven't decided how I want to do this yet
144         # lets just hide it for now
145         #player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
146         #player.set_label("Manage playlists")
147         #player.connect("clicked", self.on_manage_playlists)
148         #self.menu.append(player)
149         #player = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
150         #player.set_label("Export...")
151         #player.connect("clicked", self.on_export_playlists)
152         #self.menu.append(player)
153         self.menu.show_all()
154         self.set_app_menu(self.menu)
155
156     def populate(self):
157         for key, lst in sorted(list(settings.playlists.iteritems())):
158             self.playlistlist.add_playlist(key, lst)
159         self.playlistlist.set_loading(False)
160
161     def settings_changed(self, setting, *args):
162         if setting == 'playlists':
163             self.playlistlist.set_loading(True)
164             self.playlistlist.get_model().clear()
165             self.populate()
166
167     #def on_delete_playlists(self, *args):
168     #    self.deltoolbar.show()
169     #    self.playlistlist.set_hildon_ui_mode(hildon.UI_MODE_EDIT)
170
171     #def on_delete_button(self, btn):
172     #    pass
173
174     #def on_export_playlists(self, *args):
175     #    _show_banner(self, "TODOO")
176
177
178     def row_activated(self, treeview, path, view_column):
179         sel = self.playlistlist.get_playlist_name(path)
180         pl = settings.get_playlist(sel)
181         if pl:
182             from showplaylist import ShowPlaylist
183             wnd = ShowPlaylist(sel, pl)
184             wnd.show_all()
185             #from playerwindow import open_playerwindow
186             #wnd = open_playerwindow()
187             #wnd.play_tracks(pl)