Custom text to search album art (ugly UI)
[mussorgsky] / src / aa_selection_dialog.py
1 import hildon
2 import gtk
3 import gobject
4 from album_art_thread import MussorgskyAlbumArt
5
6 RESPONSE_CLICK = 1
7
8 class ClickableImage (gtk.EventBox):
9
10     def __init__ (self, isRemoveOption=False):
11         gtk.EventBox.__init__ (self)
12
13         self.isRemoveOption = isRemoveOption
14
15         self.img = gtk.Image ()
16         self.img.set_size_request (124, 124)
17         self.add (self.img)
18         self.set_sensitive (False)
19
20         self.img_path = None
21         self.thumb_path = None
22
23         if (self.isRemoveOption):
24             self.img.set_from_icon_name ("mediaplayer_default_album",
25                                          gtk.ICON_SIZE_MENU)
26             self.img.set_pixel_size (124)
27             self.set_sensitive (True)
28             
29     def set_image (self, tmp_img, tmp_thumb):
30         assert not self.isRemoveOption
31         self.img_path = tmp_img
32         self.thumb_path = tmp_thumb
33         self.img.set_from_file (self.thumb_path)
34         self.set_sensitive (True)
35
36     def set_default_image (self):
37         self.img.set_from_stock (gtk.STOCK_CDROM, gtk.ICON_SIZE_DIALOG)
38
39     def get_paths (self):
40         return self.img_path, self.thumb_path
41
42     def is_remove_option (self):
43         return self.isRemoveOption
44         
45
46 class AlbumArtSelectionDialog (gtk.Dialog):
47
48     def __init__ (self, parent, artist, album, size, downloader=None):
49         """
50         parent window, amount of images to offer
51         Optionally downloader (for testing porpouses)
52         """
53         gtk.Dialog.__init__ (self,
54                              "Select album art", parent,
55                              gtk.DIALOG_DESTROY_WITH_PARENT,
56                              (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))
57         self.artist = artist
58         self.album = album
59         self.size = size
60         self.__create_view (size)
61         self.cancel = False
62         self.connect ("response", self.handle_response)
63
64         if (downloader):
65             self.downloader = downloader
66         else:
67             self.downloader = MussorgskyAlbumArt ()
68
69         gobject.idle_add (self.__get_alternatives_async)
70         self.selection_img = None
71         self.selection_thumb = None
72         hildon.hildon_gtk_window_set_progress_indicator (self, 1)
73
74
75     def __create_view (self, size):
76         hbox = gtk.HBox (homogeneous=True)
77
78         self.images = []
79         for i in range (0, size):
80             image = ClickableImage ()
81             image.connect ("button-release-event", self.click_on_img)
82             self.images.append (image)
83             hbox.pack_start (image, expand=False, fill=True)
84             
85         # default empty option
86         image = ClickableImage (isRemoveOption=True)
87         image.connect ("button-release-event", self.click_on_img)
88         self.images.append (image)
89         hbox.pack_start (image, expand=False, fill=True)
90
91         self.vbox.pack_start (hbox)
92
93         label = gtk.Label ("Search:")
94         entry = hildon.Entry (gtk.HILDON_SIZE_FINGER_HEIGHT)
95         entry.set_text (self.artist + " " +  self.album)
96         entry.grab_focus ()
97         button = hildon.Button (gtk.HILDON_SIZE_FINGER_HEIGHT,
98                                 hildon.BUTTON_ARRANGEMENT_HORIZONTAL)
99         button.set_text ("Go", "")
100         button.connect ("clicked", self.user_text_search_cb, entry)
101         self.hbox_research = gtk.HBox (homogeneous=False)
102         self.hbox_research.pack_start (label, expand=False)
103         self.hbox_research.pack_start (entry)
104         self.hbox_research.pack_start (button, expand=False)
105         self.hbox_research.set_sensitive (False)
106         self.vbox.pack_start (self.hbox_research)
107
108     def __get_alternatives_async (self):
109         results = self.downloader.get_alternatives (self.album,
110                                                     self.artist,
111                                                     self.size)
112         self.__show_results (results)
113         
114     def __show_results (self, generator):
115         counter = 0
116         for (path, thumb) in generator:
117             print path, thumb
118             if (self.cancel):
119                 return False
120             if (thumb):
121                 print "Setting", thumb, "as image"
122                 self.images[counter].set_image (path, thumb)
123             else:
124                 continue
125             counter += 1
126             while (gtk.events_pending()):
127                 gtk.main_iteration()
128
129         while (counter < self.size):
130                 self.images[counter].set_default_image ()
131                 counter += 1
132                 
133         hildon.hildon_gtk_window_set_progress_indicator (self, 0)
134         self.hbox_research.set_sensitive (True)
135
136     def user_text_search_cb (self, w, entry):
137         user_text = entry.get_text ()
138         if user_text and len (user_text) > 0:
139             for ev in self.images[:-1]:
140                 ev.set_sensitive (False)
141                 #ev.set_default_image ()
142             while (gtk.events_pending()):
143                 gtk.main_iteration()
144
145             hildon.hildon_gtk_window_set_progress_indicator (self, 1)
146             results = self.downloader.get_alternatives_free_text (user_text,
147                                                                   self.size)
148             self.__show_results (results)
149             
150
151     def click_on_img (self, image, event):
152         if (image.is_remove_option ()):
153             self.selection_img = None
154             self.selection_thumb = None
155             self.downloader.reset_alternative (self.artist, self.album)
156         else:
157             tmp_img, tmp_thumb = image.get_paths ()
158             img, thumb = self.downloader.save_alternative (self.artist,
159                                                            self.album,
160                                                            tmp_img,
161                                                            tmp_thumb)
162             self.selection_img, self.selection_thumb = img, thumb
163         self.response (RESPONSE_CLICK)
164
165     def get_selection (self):
166         return (self.selection_img, self.selection_thumb)
167     
168     def handle_response (self, widget, response_id):
169         self.cancel = True
170         # Return False to continue propagating the signal
171         return False
172
173 if __name__ == "__main__":
174
175     import time
176     class MockDownloader:
177         def __init__ (self):
178             self.alt = [("../hendrix.jpeg", "../hendrix-thumb.jpeg"),
179                         ("../hoover.jpeg", "../hoover-thumb.jpeg"),
180                         ("../backbeat.jpeg", "../backbeat-thumb.jpeg"),
181                         ("../dylan.jpeg", "../dylan-thumb.jpeg")]
182         def get_alternatives (self, album, artist, amount):
183             for a in self.alt:
184                 time.sleep (1)
185                 yield a
186         def get_alternatives_free_text (self, user_text, amount=4):
187             for a in [("free%d" % i, "thumb%d" %i) for i in range (0, amount)]:
188                 time.sleep (1)
189                 yield a
190         def save_alternative (self, artist, album, img, thumb):
191             return ("/home/user/.cache/media-art/" + img, "/home/user/.thumbnails/normal/" + thumb)
192         def reset_alternative (self, artist, album):
193             print "Removing the album-art and the thumbnail"
194                               
195
196     def clicked_button (self):
197         aadd = AlbumArtSelectionDialog (w, "rory gallagher", "irish tour", 4, MockDownloader ())
198         aadd.show_all ()
199         response = aadd.run ()
200         if response == gtk.RESPONSE_CLOSE or response == gtk.RESPONSE_DELETE_EVENT or response == gtk.RESPONSE_REJECT:
201             print "Noooo"
202         else:
203             print "RESPONSE_CLICK", response == RESPONSE_CLICK
204             print "Selected", aadd.get_selection ()
205         aadd.hide ()
206         
207     w = gtk.Window ()
208     w.connect ("destroy", gtk.main_quit)
209     box = gtk.VBox ()
210
211     button = gtk.Button ("click")
212     button.connect ("clicked", clicked_button)
213     box.add (button)
214
215     w.add (box)
216     w.show_all ()
217
218
219     gtk.main ()
220