ui: Completed basic search functionality
authorSimón Pena <spenap@gmail.com>
Tue, 1 Jun 2010 08:32:08 +0000 (10:32 +0200)
committerSimón Pena <spenap@gmail.com>
Tue, 1 Jun 2010 08:40:26 +0000 (10:40 +0200)
The UI is now connected with the moviemanager, and clicking on a
row brings the item's info

ui/maeviesui/maeviesui/gui.py
ui/maeviesui/util/constants.py
ui/maeviesui/util/moviemanager.py

index 925a110..f7781de 100644 (file)
@@ -160,43 +160,40 @@ class ResultsWindow(hildon.StackableWindow):
         super(ResultsWindow, self).__init__()
         self.set_title("Search results")
 
-        self.search_term = search_term
-        self.search_category = search_category
+        self.add(self._create_contents())
 
-        self.moviemanager = MovieManager(self._populate_view)
+        self.moviemanager = MovieManager(response_received_cb = self._response_received_cb)
+        self._start_search(search_term, search_category)
+        self.show_all()
 
+    def _create_contents(self):
         content_area = hildon.PannableArea()
         self._movies_view = MoviesView()
         self._movies_view.connect('row-activated', self._row_activated_cb)
 
         content_area.add(self._movies_view)
-        self.add(content_area)
-
-        self._start_search()
-        self.show_all()
+        return content_area
 
     def _row_activated_cb(self, view, path, column):
-        #movie = view.get_movie_from_path(path)
-        MovieWindow(None)
+        movie = view.get_movie_from_path(path)
+        MovieWindow(movie)
 
-    def _start_search(self):
-        self._show_banner()
+    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(self.search_term)
+        self.moviemanager.query(search_term)
 
-    def _populate_view(self, movies):
+    def _response_received_cb(self, movies):
         self._movies_view.add_movies(movies)
         hildon.hildon_gtk_window_set_progress_indicator(self, False)
-        return False
 
-    def _show_banner(self):
-        message = "Searching <i>%(category)s</i> for <i>%(term)s</i>" % {'category': self.search_category,
-                                                                         'term' : self.search_term}
+    def _show_banner(self, search_term, search_category):
+        message = "Searching <i>%(category)s</i> for <i>%(term)s</i>" % {'category': search_category,
+                                                                         'term' : search_term}
         banner = hildon.hildon_banner_show_information_with_markup(self,
                                                                    "ignored",
                                                                    message)
         banner.set_timeout(constants.TIMEOUT_TIME_MILLIS)
-        pass
 
 class MoviesView(gtk.TreeView):
 
@@ -220,6 +217,10 @@ class MoviesView(gtk.TreeView):
         model = self.get_model()
         model.add(movie_list)
 
+    def get_movie_from_path(self, path):
+        model = self.get_model()
+        return model[path][model.MOVIE_COLUMN]
+
 class MoviesListStore(gtk.ListStore):
 
     IMAGE_COLUMN = 0
@@ -246,20 +247,17 @@ class AboutDialog(gtk.Dialog):
         super(AboutDialog, self).__init__(parent = parent,
                                           flags = gtk.DIALOG_DESTROY_WITH_PARENT)
         self.set_title("About Maevies")
+
         self.show_all()
 
 class MovieWindow(hildon.StackableWindow):
 
-    _zombieland = {'Title' : "Zombieland", 'Release date' : "27 November 2009",
-                   'Genre' : "Action | Adventure | Comedy", 'Score' : "7.8",
-                   'Popularity' : "down 4%", 'Overview' : constants.LOREM_IPSUM}
-
     def _create_contents(self, movie):
         main_area = hildon.PannableArea()
 
         main_box = gtk.VBox(False, 20)
         main_box.set_border_width(20)
-        upper_content = gtk.HBox(False, 20)
+        upper_content = gtk.HBox(False, 40)
         upper_content.set_border_width(20)
 
         image = gtk.Image()
@@ -267,30 +265,38 @@ class MovieWindow(hildon.StackableWindow):
 
         side_content = gtk.VBox(False, 30)
 
-        for key in ["Title", "Release date", "Genre", "Score", "Popularity"]:
+        for key in movie.fields:
             label = gtk.Label()
             label.set_markup("<b>%(field)s:</b> <small>%(value)s</small>" % {'field' : key,
-                                                                             'value' : movie[key]})
+                                                                             'value' : movie.get_value(key)})
             label.set_alignment(constants.LEFT_ALIGNMENT, constants.CENTER_ALIGNMENT)
             side_content.pack_start(label, False, False)
 
         upper_content.pack_start(image, False, False)
-        upper_content.pack_start(side_content, True, True)
+        upper_content.pack_start(side_content, False, False)
+
+        movie_overview = hildon.TextView()
+        movie_overview.set_placeholder("Overview")
+        movie_overview.set_wrap_mode(gtk.WRAP_WORD)
+        movie_overview.get_buffer().set_text(movie.get_overview())
 
         label = gtk.Label()
-        label.set_markup("<b>%(field)s:</b>\n %(value)s" % {'field' : 'Overview',
-                                                            'value' : movie['Overview']})
+        label.set_markup("<b>Overview:</b>")
         label.set_alignment(constants.LEFT_ALIGNMENT, constants.CENTER_ALIGNMENT)
 
         main_box.pack_start(upper_content, False, False)
         main_box.pack_start(label, False, False)
+        main_box.pack_start(movie_overview, False, False)
 
         main_area.add_with_viewport(main_box)
+        main_area.set_size_request_policy(hildon.SIZE_REQUEST_CHILDREN)
+
         return main_area
 
     def __init__(self, movie):
         super(MovieWindow, self).__init__()
-        self.add(self._create_contents(self._zombieland))
+        self.set_title("Movie info")
+        self.add(self._create_contents(movie))
         self.show_all()
 
 if __name__ == "__main__":
index 7b71306..e446d50 100644 (file)
@@ -28,11 +28,10 @@ LOCAL_DATA_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__),
 TIMEOUT_TIME_MILLIS = 500
 LEFT_ALIGNMENT = 0
 CENTER_ALIGNMENT = 0.5
-LOREM_IPSUM = """Lorem ipsum dolor sit amet, consectetur adipiscing 
-elit. Vestibulum sit amet dolor sit amet enim ultricies iaculis eu 
-sed leo. Donec ultrices massa ut leo porttitor facilisis. Fusce 
-neque nisl, varius id vestibulum non, tincidunt eu magna. 
-Curabitur consectetur, nisl nec volutpat iaculis, odio neque 
-venenatis diam, vitae cursus lectus orci a felis. Pellentesque 
-sit amet elementum lorem. Duis tempor pulvinar augue nec bibendum. 
-Suspendisse sit amet placerat lectus."""
+LOREM_IPSUM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. \
+Vestibulum sit amet dolor sit amet enim ultricies iaculis eu sed leo. Donec \
+ultrices massa ut leo porttitor facilisis. Fusce neque nisl, varius id \
+vestibulum non, tincidunt eu magna. Curabitur consectetur, nisl nec volutpat \
+iaculis, odio neque venenatis diam, vitae cursus lectus orci a felis. \
+Pellentesque sit amet elementum lorem. Duis tempor pulvinar augue nec \
+bibendum. Suspendisse sit amet placerat lectus."
index 3d73948..4689eee 100644 (file)
@@ -21,8 +21,8 @@
 import dbus
 import gobject
 from dbus import glib
-import random
 import gtk
+from dbus.exceptions import DBusException
 
 gobject.threads_init()
 glib.init_threads()
@@ -36,52 +36,88 @@ WATC = 1
 
 class MovieManager:
 
-    def __init__(self, callback):
-        self.bus = dbus.SessionBus()
+    def __init__(self, response_received_cb = None):
+        self.response_received_cb = response_received_cb
+        self._bus = None
+        self._provider = None
 
-        self.minfo_provider = self.bus.get_object(MINFO_PROVIDER_BUS_NAME,
-                                                  '/MInfoProvider')
-        self.minfo_interface = dbus.Interface(self.minfo_provider,
-                                              dbus_interface = MINFO_PROVIDER_INTERFACE)
-        self.minfo_interface.connect_to_signal("ResponseReceived",
-                                              self._on_response_received)
-        self.callback = callback
+        self._bus = dbus.SessionBus()
+
+    def _get_provider(self):
+        if not self._provider:
+            self._provider = self._create_minfo_provider()
+        return self._provider
+
+    def _create_minfo_provider(self):
+        provider_proxy = self._bus.get_object(MINFO_PROVIDER_BUS_NAME,
+                                             '/MInfoProvider')
+        provider_interface = dbus.Interface(provider_proxy,
+                                            dbus_interface = MINFO_PROVIDER_INTERFACE)
+        provider_interface.connect_to_signal("ResponseReceived",
+                                             self._on_response_received)
+        return provider_interface
 
     def query(self, movie_name = '', query_type = TMDB):
-        self.minfo_interface.Query(query_type, movie_name)
+        try:
+            self._get_provider().Query(query_type, movie_name)
+        except DBusException:
+            self._on_response_received([])
 
-    def _on_response_received(self, object_paths, sender = None):
+    def _on_response_received(self, object_paths):
         movies = []
         for path in object_paths:
-            movies.append(self._create_from_path(path))
+            movies.append(MovieProxy(self._bus, path))
+
+        if self.response_received_cb:
+            self.response_received_cb(movies)
+
+class MovieProxy:
 
-        self.callback(movies)
+    def __init__(self, bus, object_path):
+        self._bus = bus
+        self.interface = self._create_movie_interface(object_path)
+        self.fields = ["Title", "Release date", "Rating", "Popularity"]
 
-    def _create_from_path(self, object_path):
-        dbus_movie = self.bus.get_object(TMDB_MOVIE_BUS_NAME,
-                                         object_path)
-        return MovieDecorator(dbus_movie.GetTitle(dbus_interface = TMDB_MOVIE_INTERFACE))
+    def _create_movie_interface(self, object_path):
+        proxy = self._bus.get_object(TMDB_MOVIE_BUS_NAME,
+                                    object_path)
+        interface = dbus.Interface(proxy,
+                                   dbus_interface = TMDB_MOVIE_INTERFACE)
+        return interface
 
-class MovieDecorator:
+    def get_value(self, field):
+        if field == "Title":
+            return self.get_title()
+        elif field == "Release date":
+            return self.get_released()
+        elif field == "Rating":
+            return self.get_rating()
+        elif field == "Popularity":
+            return self.get_popularity()
+        else:
+            return ""
 
-    def __init__(self, name):
-        self._name = name
-        pass
+    def get_title(self):
+        return self.interface.GetTitle()
 
-    def get_name(self):
-        return self._name
+    def get_popularity(self):
+        return self.interface.GetPopularity()
 
-    def get_length(self):
-        return "%sh:%sm" % (random.randrange(1, 2), random.randrange(0, 59))
+    def get_rating(self):
+        return self.interface.GetRating()
 
-    def get_score(self):
-        return "%s" % (random.randrange(6, 9))
+    def get_released(self):
+        return self.interface.GetReleased()
 
     def get_info(self):
-        return "<b>%s</b>\n<small><i>Length: </i>%s || <i>Score: </i>%s</small>" % (
-                                                                                     self.get_name(),
-                                                                                     self.get_length(),
-                                                                                     self.get_score())
+        return "<b>%(title)s</b>\n<small><i>Popularity: </i>%(popularity)s\
+    <i>Rating: </i>%(rating)s    <i>Released: </i>%(released)s</small>" % {'title' : self.get_title(),
+                                                                           'popularity' : self.get_popularity(),
+                                                                           'rating' : self.get_rating(),
+                                                                           'released' : self.get_released()}
+
+    def get_overview(self):
+        return self.interface.GetOverview()
 
     def get_image(self):
         return self._get_placeholder_pixbuf()