Retrieving album art in a callback
[mussorgsky] / src / aa_selection_dialog.py
1 import hildon
2 import gtk
3 import gobject
4 from album_art 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.artist = artist
18         self.album = album
19         self.size = size
20         self.__create_view (size)
21
22         if (downloader):
23             self.downloader = downloader
24         else:
25             self.downloader = MussorgskyAlbumArt ()
26
27         gobject.idle_add (self.__get_alternatives_async)
28         self.selection_img = None
29         self.selection_thumb = None
30         hildon.hildon_gtk_window_set_progress_indicator (self, 1)
31
32     def __create_view (self, size):
33         hbox = gtk.HBox (homogeneous=True)
34
35         self.images = []
36         self.event_boxes = []
37         for i in range (0, size):
38             img = gtk.Image ()
39             img.set_size_request (124, 124)
40             self.images.append (img)
41
42             event_box = gtk.EventBox ()
43             event_box.add (img)
44             event_box.connect ("button-release-event", self.click_on_img, i)
45             event_box.set_sensitive (False)
46             self.event_boxes.append (event_box)
47             
48             hbox.pack_start (event_box, expand=False, fill=True)
49
50         self.vbox.add (hbox)
51
52     def __get_alternatives_async (self):
53         self.paths = self.downloader.get_alternatives (self.album, self.artist, 4)
54         self.__populate (self.paths)        
55         hildon.hildon_gtk_window_set_progress_indicator (self, 0)
56
57     def __populate (self, paths):
58
59         for i in range (0, self.size):
60             if (len(paths) > i):
61                 self.images[i].set_from_file (paths[i])
62                 self.event_boxes[i].set_sensitive (True)
63             else:
64                 self.images[i].set_from_stock (gtk.STOCK_CDROM, gtk.ICON_SIZE_DIALOG)
65
66     def click_on_img (self, widget, event, position):
67         self.selection_img, self.selection_thumb = self.downloader.save_alternative (self.artist,
68                                                                                      self.album,
69                                                                                      self.paths[position])
70         self.response (position)
71
72     def get_selection (self):
73         return (self.selection_img, self.selection_thumb)
74
75     
76
77 if __name__ == "__main__":
78
79     import time
80     class MockDownloader:
81         def __init__ (self):
82             self.alt = ["../hendrix.jpeg", "../hoover.jpeg", "../dylan.jpeg"]
83         def get_alternatives (self, album, artist, amount):
84             time.sleep (5)
85             return self.alt [0:amount]
86         def save_alternative (self, artist, album, img):
87             return ("/home/user/.cache/media-art/" + img, "/home/user/.thumbnails/normal/" + img)
88                               
89
90     def clicked_button (self):
91         aadd = AlbumArtSelectionDialog (w, "rory gallagher", "irish tour", 4, MockDownloader ())
92         aadd.show_all ()
93         response = aadd.run ()
94         if response == gtk.RESPONSE_CLOSE or response == gtk.RESPONSE_DELETE_EVENT or response == gtk.RESPONSE_REJECT:
95             print "Noooo"
96         else:
97             print "Selected", aadd.get_selection ()
98         aadd.hide ()
99         
100     w = gtk.Window ()
101     w.connect ("destroy", gtk.main_quit)
102     box = gtk.VBox ()
103
104     button = gtk.Button ("click")
105     button.connect ("clicked", clicked_button)
106     box.add (button)
107
108     w.add (box)
109     w.show_all ()
110
111
112     gtk.main ()
113