Select text in the 'search again' entry
[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         self.vbox.pack_start (hbox, padding=6)
91         
92         label = gtk.Label ("New search:")
93         self.entry = hildon.Entry (gtk.HILDON_SIZE_FINGER_HEIGHT)
94         self.entry.set_text (self.artist + " " +  self.album)
95
96         img = gtk.Image ()
97         img.set_from_icon_name ("general_search", gtk.ICON_SIZE_LARGE_TOOLBAR)
98         button = hildon.Button (gtk.HILDON_SIZE_FINGER_HEIGHT,
99                                 hildon.BUTTON_ARRANGEMENT_HORIZONTAL)
100         button.set_image (img)
101         button.connect ("clicked", self.user_text_search_cb, self.entry)
102         self.hbox_research = gtk.HBox (homogeneous=False, spacing=6)
103         self.hbox_research.pack_start (label, expand=False)
104         self.hbox_research.pack_start (self.entry)
105         self.hbox_research.pack_start (button, expand=False)
106         self.hbox_research.set_sensitive (False)
107         self.vbox.pack_start (self.hbox_research, padding=6)
108
109     def __get_alternatives_async (self):
110         results = self.downloader.get_alternatives (self.album,
111                                                     self.artist,
112                                                     self.size)
113         self.__show_results (results)
114         
115     def __show_results (self, generator):
116         counter = 0
117         for (path, thumb) in generator:
118             print path, thumb
119             if (self.cancel):
120                 return False
121             if (thumb):
122                 print "Setting", thumb, "as image"
123                 self.images[counter].set_image (path, thumb)
124             else:
125                 continue
126             counter += 1
127             while (gtk.events_pending()):
128                 gtk.main_iteration()
129
130         while (counter < self.size):
131                 self.images[counter].set_default_image ()
132                 counter += 1
133                 
134         hildon.hildon_gtk_window_set_progress_indicator (self, 0)
135         self.hbox_research.set_sensitive (True)
136         self.entry.grab_focus ()
137         self.entry.select_region (0, -1)
138         
139     def user_text_search_cb (self, w, entry):
140         user_text = entry.get_text ()
141         if user_text and len (user_text) > 0:
142             hildon.hildon_gtk_window_set_progress_indicator (self, 1)
143             for ev in self.images[:-1]:
144                 ev.set_sensitive (False)
145             self.hbox_research.set_sensitive (False)
146             while (gtk.events_pending()):
147                 gtk.main_iteration()
148
149             results = self.downloader.get_alternatives_free_text (user_text,
150                                                                   self.size)
151             self.__show_results (results)
152             
153
154     def click_on_img (self, image, event):
155         if (image.is_remove_option ()):
156             self.selection_img = None
157             self.selection_thumb = None
158             self.downloader.reset_alternative (self.artist, self.album)
159         else:
160             tmp_img, tmp_thumb = image.get_paths ()
161             img, thumb = self.downloader.save_alternative (self.artist,
162                                                            self.album,
163                                                            tmp_img,
164                                                            tmp_thumb)
165             self.selection_img, self.selection_thumb = img, thumb
166         self.response (RESPONSE_CLICK)
167
168     def get_selection (self):
169         return (self.selection_img, self.selection_thumb)
170     
171     def handle_response (self, widget, response_id):
172         self.cancel = True
173         # Return False to continue propagating the signal
174         return False
175
176 if __name__ == "__main__":
177
178     import time
179     class MockDownloader:
180         def __init__ (self):
181             self.alt = [("../hendrix.jpeg", "../hendrix-thumb.jpeg"),
182                         ("../hoover.jpeg", "../hoover-thumb.jpeg"),
183                         ("../backbeat.jpeg", "../backbeat-thumb.jpeg"),
184                         ("../dylan.jpeg", "../dylan-thumb.jpeg")]
185         def get_alternatives (self, album, artist, amount):
186             for a in self.alt:
187                 time.sleep (1)
188                 yield a
189         def get_alternatives_free_text (self, user_text, amount=4):
190             for a in [("free%d" % i, "thumb%d" %i) for i in range (0, amount)]:
191                 time.sleep (1)
192                 yield a
193         def save_alternative (self, artist, album, img, thumb):
194             return ("/home/user/.cache/media-art/" + img, "/home/user/.thumbnails/normal/" + thumb)
195         def reset_alternative (self, artist, album):
196             print "Removing the album-art and the thumbnail"
197                               
198
199     def clicked_button (self):
200         aadd = AlbumArtSelectionDialog (w, "rory gallagher", "irish tour", 4, MockDownloader ())
201         aadd.show_all ()
202         response = aadd.run ()
203         if response == gtk.RESPONSE_CLOSE or response == gtk.RESPONSE_DELETE_EVENT or response == gtk.RESPONSE_REJECT:
204             print "Noooo"
205         else:
206             print "RESPONSE_CLICK", response == RESPONSE_CLICK
207             print "Selected", aadd.get_selection ()
208         aadd.hide ()
209         
210     w = gtk.Window ()
211     w.connect ("destroy", gtk.main_quit)
212     box = gtk.VBox ()
213
214     button = gtk.Button ("click")
215     button.connect ("clicked", clicked_button)
216     box.add (button)
217
218     w.add (box)
219     w.show_all ()
220
221
222     gtk.main ()
223