4 from album_art_thread import MussorgskyAlbumArt
8 class ClickableImage (gtk.EventBox):
10 def __init__ (self, isRemoveOption=False):
11 gtk.EventBox.__init__ (self)
13 self.isRemoveOption = isRemoveOption
15 self.img = gtk.Image ()
16 self.img.set_size_request (124, 124)
18 self.set_sensitive (False)
21 self.thumb_path = None
23 if (self.isRemoveOption):
24 self.img.set_from_icon_name ("mediaplayer_default_album",
26 self.img.set_pixel_size (124)
27 self.set_sensitive (True)
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)
36 def set_default_image (self):
37 self.img.set_from_stock (gtk.STOCK_CDROM, gtk.ICON_SIZE_DIALOG)
40 return self.img_path, self.thumb_path
42 def is_remove_option (self):
43 return self.isRemoveOption
46 class AlbumArtSelectionDialog (gtk.Dialog):
48 def __init__ (self, parent, artist, album, size, downloader=None):
50 parent window, amount of images to offer
51 Optionally downloader (for testing porpouses)
53 gtk.Dialog.__init__ (self,
54 "Select album art", parent,
55 gtk.DIALOG_DESTROY_WITH_PARENT,
56 (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT))
60 self.__create_view (size)
62 self.connect ("response", self.handle_response)
65 self.downloader = downloader
67 self.downloader = MussorgskyAlbumArt ()
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)
75 def __create_view (self, size):
76 hbox = gtk.HBox (homogeneous=True)
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)
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)
91 self.vbox.pack_start (hbox)
93 label = gtk.Label ("Search:")
94 entry = hildon.Entry (gtk.HILDON_SIZE_FINGER_HEIGHT)
95 entry.set_text (self.artist + " " + self.album)
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)
108 def __get_alternatives_async (self):
109 results = self.downloader.get_alternatives (self.album,
112 self.__show_results (results)
114 def __show_results (self, generator):
116 for (path, thumb) in generator:
121 print "Setting", thumb, "as image"
122 self.images[counter].set_image (path, thumb)
126 while (gtk.events_pending()):
129 while (counter < self.size):
130 self.images[counter].set_default_image ()
133 hildon.hildon_gtk_window_set_progress_indicator (self, 0)
134 self.hbox_research.set_sensitive (True)
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()):
145 hildon.hildon_gtk_window_set_progress_indicator (self, 1)
146 results = self.downloader.get_alternatives_free_text (user_text,
148 self.__show_results (results)
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)
157 tmp_img, tmp_thumb = image.get_paths ()
158 img, thumb = self.downloader.save_alternative (self.artist,
162 self.selection_img, self.selection_thumb = img, thumb
163 self.response (RESPONSE_CLICK)
165 def get_selection (self):
166 return (self.selection_img, self.selection_thumb)
168 def handle_response (self, widget, response_id):
170 # Return False to continue propagating the signal
173 if __name__ == "__main__":
176 class MockDownloader:
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):
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)]:
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"
196 def clicked_button (self):
197 aadd = AlbumArtSelectionDialog (w, "rory gallagher", "irish tour", 4, MockDownloader ())
199 response = aadd.run ()
200 if response == gtk.RESPONSE_CLOSE or response == gtk.RESPONSE_DELETE_EVENT or response == gtk.RESPONSE_REJECT:
203 print "RESPONSE_CLICK", response == RESPONSE_CLICK
204 print "Selected", aadd.get_selection ()
208 w.connect ("destroy", gtk.main_quit)
211 button = gtk.Button ("click")
212 button.connect ("clicked", clicked_button)