1477b4815a17e2b28ce1edb69e9900cb013693bd
[mussorgsky] / src / aa_selection_dialog.py
1 import hildon
2 import gtk
3 import gobject
4 from album_art_thread import MussorgskyAlbumArt
5
6 class AlbumArtSelectionDialog (gtk.Dialog):
7
8     def __init__ (self, parent, artist, album, size, downloader=None):
9         """
10         parent window, amount of images to offer
11         Optionally downloader (for testing porpouses)
12         """
13         gtk.Dialog.__init__ (self,
14                              "Select album art", parent,
15                              gtk.DIALOG_DESTROY_WITH_PARENT,
16                              (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))
17         self.DEFAULT_ALBUM = size+1
18         self.artist = artist
19         self.album = album
20         self.size = size
21         self.paths = []
22         self.__create_view (size)
23         self.cancel = False
24         self.connect ("response", self.handle_response)
25
26         if (downloader):
27             self.downloader = downloader
28         else:
29             self.downloader = MussorgskyAlbumArt ()
30
31         gobject.idle_add (self.__get_alternatives_async)
32         self.selection_img = None
33         self.selection_thumb = None
34         hildon.hildon_gtk_window_set_progress_indicator (self, 1)
35
36
37     def __create_view (self, size):
38         hbox = gtk.HBox (homogeneous=True)
39
40         self.images = []
41         self.event_boxes = []
42         for i in range (0, size):
43             img = gtk.Image ()
44             img.set_size_request (124, 124)
45             self.images.append (img)
46
47             event_box = gtk.EventBox ()
48             event_box.add (img)
49             event_box.connect ("button-release-event", self.click_on_img, i)
50             event_box.set_sensitive (False)
51             self.event_boxes.append (event_box)
52             
53             hbox.pack_start (event_box, expand=False, fill=True)
54             
55         # default empty option
56         img = gtk.Image ()
57         img.set_from_icon_name ("mediaplayer_default_album", gtk.ICON_SIZE_MENU)
58         img.set_pixel_size (124)
59         #img.set_size_request (124, 124)
60         self.images.append (img)
61
62         event_box = gtk.EventBox ()
63         event_box.add (img)
64         event_box.connect ("button-release-event", self.click_on_img, self.DEFAULT_ALBUM)
65         event_box.set_sensitive (True)
66         self.event_boxes.append (event_box)
67             
68         hbox.pack_start (event_box, expand=False, fill=True)
69         
70
71         self.vbox.add (hbox)
72
73     def __get_alternatives_async (self):
74         counter = 0
75         for (path, thumb) in self.downloader.get_alternatives (self.album, self.artist, self.size):
76             print path, thumb
77             if (self.cancel):
78                 return False
79             self.paths.insert (counter, (path, thumb))
80             if (thumb):
81                 print "Setting", thumb, "as image"
82                 self.images[counter].set_from_file (thumb)
83                 self.event_boxes [counter].set_sensitive (True)
84             else:
85                 continue
86             counter += 1
87             while (gtk.events_pending()):
88                 gtk.main_iteration()
89
90         while (counter < self.size):
91                 self.images[counter].set_from_stock (gtk.STOCK_CDROM, gtk.ICON_SIZE_DIALOG)
92                 counter += 1
93                 
94         hildon.hildon_gtk_window_set_progress_indicator (self, 0)
95
96
97     def click_on_img (self, widget, event, position):
98         if (position == self.DEFAULT_ALBUM):
99             self.selection_img = None
100             self.selection_thumb = None
101             self.downloader.reset_alternative (self.artist, self.album)
102         else:
103             img, thumb = self.paths[position]
104             self.selection_img, self.selection_thumb = self.downloader.save_alternative (self.artist,
105                                                                                          self.album,
106                                                                                          img, thumb)
107         self.response (position)
108
109     def get_selection (self):
110         return (self.selection_img, self.selection_thumb)
111
112     
113     def handle_response (self, widget, response_id):
114         self.cancel = True
115         # Return False to continue propagating the signal
116         return False
117
118 if __name__ == "__main__":
119
120     import time
121     class MockDownloader:
122         def __init__ (self):
123             self.alt = [("../hendrix.jpeg", "../hendrix-thumb.jpeg"),
124                         ("../hoover.jpeg", "../hoover-thumb.jpeg"),
125                         ("../backbeat.jpeg", "../backbeat-thumb.jpeg"),
126                         ("../dylan.jpeg", "../dylan-thumb.jpeg")]
127         def get_alternatives (self, album, artist, amount):
128             for a in self.alt:
129                 time.sleep (1)
130                 yield a
131         def save_alternative (self, artist, album, img, thumb):
132             return ("/home/user/.cache/media-art/" + img, "/home/user/.thumbnails/normal/" + thumb)
133         def reset_alternative (self, artist, album):
134             print "Removing the album-art and the thumbnail"
135                               
136
137     def clicked_button (self):
138         aadd = AlbumArtSelectionDialog (w, "rory gallagher", "irish tour", 4, MockDownloader ())
139         aadd.show_all ()
140         response = aadd.run ()
141         if response == gtk.RESPONSE_CLOSE or response == gtk.RESPONSE_DELETE_EVENT or response == gtk.RESPONSE_REJECT:
142             print "Noooo"
143         else:
144             print "Selected", aadd.get_selection ()
145         aadd.hide ()
146         
147     w = gtk.Window ()
148     w.connect ("destroy", gtk.main_quit)
149     box = gtk.VBox ()
150
151     button = gtk.Button ("click")
152     button.connect ("clicked", clicked_button)
153     box.add (button)
154
155     w.add (box)
156     w.show_all ()
157
158
159     gtk.main ()
160