Initial support for multiple query services
[maevies] / ui / maeviesui / maeviesui / gui.py
index 41cc7b0..0fb52fd 100644 (file)
@@ -19,6 +19,7 @@
 ###########################################################################
 
 import pygtk
+import os
 pygtk.require('2.0')
 import gtk
 import hildon
@@ -26,8 +27,12 @@ import pango
 import gobject
 
 from maeviesui.util import constants
+from maeviesui.util.asyncworker import AsyncWorker, AsyncItem
+from maeviesui.util.util import image_downloader
 from maeviesui.util.moviemanager import MovieManager
 
+moviemanager = MovieManager()
+
 class Maevies(hildon.StackableWindow):
 
     ACTION_SEARCH = 0
@@ -82,8 +87,9 @@ class Maevies(hildon.StackableWindow):
         if action == self.ACTION_SEARCH:
             search_dialog = SearchDialog(self)
             if search_dialog.run() == gtk.RESPONSE_ACCEPT:
-                ResultsWindow(search_dialog.get_search_term(),
-                              search_dialog.get_search_category())
+                results_window = ResultsWindow()
+                results_window.start_search(search_dialog.get_search_term(),
+                                            search_dialog.get_search_category())
             search_dialog.destroy()
         elif action == self.ACTION_ABOUT:
             about_dialog = AboutDialog(self)
@@ -108,10 +114,10 @@ class Maevies(hildon.StackableWindow):
 
 class SearchDialog(gtk.Dialog):
 
-    _search_fields = [
-           'Movies',
-           'People',
-           ]
+    TMDB_SEARCH = 0
+    WATC_SEARCH = 1
+    search_fields = {TMDB_SEARCH:'TMDb',
+                      WATC_SEARCH:'WATC'}
 
     def __init__(self, parent):
         super(SearchDialog, self).__init__(parent=parent,
@@ -139,13 +145,13 @@ class SearchDialog(gtk.Dialog):
     def _create_picker_button(self):
         self._picker_button = hildon.PickerButton(gtk.HILDON_SIZE_FINGER_HEIGHT,
                                                   hildon.BUTTON_ARRANGEMENT_HORIZONTAL)
-        self._picker_button.set_title('Search for')
+        self._picker_button.set_title('Search on')
 
         selector = hildon.TouchSelector(text=True)
         selector.set_column_selection_mode(hildon.TOUCH_SELECTOR_SELECTION_MODE_SINGLE)
 
-        for field in self._search_fields:
-            selector.append_text(field)
+        for search_method in [self.TMDB_SEARCH, self.WATC_SEARCH]:
+            selector.append_text(self.search_fields[search_method])
 
         self._picker_button.set_selector(selector)
         self._picker_button.set_active(0)
@@ -156,18 +162,17 @@ class SearchDialog(gtk.Dialog):
         return self._search_entry.get_text()
 
     def get_search_category(self):
-        return self._search_fields[self._picker_button.get_active()]
+        return self._picker_button.get_active()
 
 class ResultsWindow(hildon.StackableWindow):
 
-    def __init__(self, search_term, search_category):
+    def __init__(self):
         super(ResultsWindow, self).__init__()
         self.set_title('Search results')
 
         self.add(self._create_contents())
 
-        self.moviemanager = MovieManager(response_received_cb=self._response_received_cb)
-        self._start_search(search_term, search_category)
+        moviemanager.response_received_cb = self._response_received_cb
         self.show_all()
 
     def _create_contents(self):
@@ -182,18 +187,18 @@ class ResultsWindow(hildon.StackableWindow):
         movie = view.get_movie_from_path(path)
         MovieWindow(movie)
 
-    def _start_search(self, search_term, search_category):
+    def start_search(self, search_term, search_category):
         self._show_banner(search_term, search_category)
         hildon.hildon_gtk_window_set_progress_indicator(self, True)
-        self.moviemanager.query(search_term)
+        moviemanager.query(search_term, search_category)
 
     def _response_received_cb(self, movies):
         self._movies_view.add_movies(movies)
         hildon.hildon_gtk_window_set_progress_indicator(self, False)
 
     def _show_banner(self, search_term, search_category):
-        message = ('Searching <i>%(category)s</i> for <i>%(term)s</i>' %
-                   {'category': search_category,
+        message = ('Searching on <i>%(category)s</i> for <i>%(term)s</i>' %
+                   {'category': SearchDialog.search_fields[search_category],
                     'term' : search_term})
         banner = hildon.hildon_banner_show_information_with_markup(self,
                                                                    'ignored',
@@ -222,7 +227,8 @@ class MoviesView(gtk.TreeView):
 
     def add_movies(self, movie_list):
         model = self.get_model()
-        model.add(movie_list)
+        if model:
+            model.add(movie_list)
 
     def get_movie_from_path(self, path):
         model = self.get_model()
@@ -242,7 +248,7 @@ class MoviesListStore(gtk.ListStore):
     def add(self, movies_found):
         self.clear()
         for movie in movies_found:
-            row = {self.IMAGE_COLUMN: movie.get_image(),
+            row = {self.IMAGE_COLUMN: movie.get_placeholder_image(),
                    self.INFO_COLUMN: movie.get_info(),
                    self.MOVIE_COLUMN: movie,
                   }
@@ -259,6 +265,41 @@ class AboutDialog(gtk.Dialog):
 
 class MovieWindow(hildon.StackableWindow):
 
+    def _fetch_movie_image(self, movie):
+        image = gtk.Image()
+
+        movie_image = movie.get_image('poster', 'mid')
+        image_file = os.path.abspath('/tmp/' + movie_image.get_id() + '.jpg')
+
+        if os.path.isfile(image_file):
+            image.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(image_file,
+                                                                       256,
+                                                                       256))
+        else:
+            image.set_from_pixbuf(gtk.IconTheme().load_icon('general_video',
+                                                            256, 0))
+            banner = hildon.hildon_banner_show_information_with_markup(self,
+                                                                       'ignored',
+                                                                       'Fetching movie poster')
+            banner.set_timeout(constants.TIMEOUT_TIME_MILLIS)
+            hildon.hildon_gtk_window_set_progress_indicator(self, True)
+
+            async_item = AsyncItem(image_downloader, (movie_image.get_url(),
+                                                      '/tmp/' + movie_image.get_id()),
+                                   self._set_fetched_image, (image,))
+            self.async_worker.queue.put(async_item)
+            self.async_worker.start()
+
+        return image
+
+    def _set_fetched_image(self, image, target, error):
+        if not error:
+            image_file = os.path.abspath(target)
+            image.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(image_file,
+                                                                       256,
+                                                                       256))
+        hildon.hildon_gtk_window_set_progress_indicator(self, False)
+
     def _create_contents(self, movie):
         main_area = hildon.PannableArea()
 
@@ -267,9 +308,7 @@ class MovieWindow(hildon.StackableWindow):
         upper_content = gtk.HBox(False, 40)
         upper_content.set_border_width(20)
 
-        image = gtk.Image()
-        image.set_from_pixbuf(gtk.IconTheme().load_icon('mediaplayer_default_album',
-                                                        256, 0))
+        image = self._fetch_movie_image(movie)
 
         side_content = gtk.VBox(False, 30)
 
@@ -306,6 +345,7 @@ class MovieWindow(hildon.StackableWindow):
 
     def __init__(self, movie):
         super(MovieWindow, self).__init__()
+        self.async_worker = AsyncWorker()
         self.set_title('Movie info')
         self.add(self._create_contents(movie))
         self.show_all()