UI: Added simulated results
authorSimón Pena <spenap@gmail.com>
Sun, 23 May 2010 19:06:30 +0000 (21:06 +0200)
committerSimón Pena <spenap@gmail.com>
Mon, 24 May 2010 17:17:21 +0000 (19:17 +0200)
* Added a GtkTreeView in a pannable area to show the movies
* Created a class to get 'decorated' movies, temporarily shown as
search results
* Added a timeout call to simulate the results retrieval
* Created a constants module with some constants used

ui/maeviesui/maeviesui/gui.py
ui/maeviesui/util/constants.py [new file with mode: 0644]

index 4865572..270c8c2 100644 (file)
 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ###########################################################################
 
+from maeviesui.util import constants
+
 import hildon
 import pygtk
+import pango
+import gobject
+from random import randint
+import random
 pygtk.require("2.0")
 import gtk
 
@@ -103,7 +109,7 @@ class Maevies(hildon.StackableWindow):
 
 class SearchDialog(gtk.Dialog):
 
-    fields = [
+    _search_fields = [
            "Movies",
            "People",
            ]
@@ -122,10 +128,12 @@ class SearchDialog(gtk.Dialog):
         self._search_entry = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT)
         search_button = self._create_picker_button()
 
-        search_contents = gtk.VBox(False, 0)
+        search_contents = gtk.VBox()
 
-        search_contents.pack_start(self._search_entry, True, True, 0)
-        search_contents.pack_start(search_button, True, True, 0)
+        search_contents.pack_start(self._search_entry,
+                                   expand = True, fill = True)
+        search_contents.pack_start(search_button,
+                                   expand = True, fill = True)
 
         return search_contents
 
@@ -137,7 +145,7 @@ class SearchDialog(gtk.Dialog):
         selector = hildon.TouchSelector(text = True)
         selector.set_column_selection_mode(hildon.TOUCH_SELECTOR_SELECTION_MODE_SINGLE)
 
-        for field in self.fields:
+        for field in self._search_fields:
             selector.append_text(field)
 
         self._picker_button.set_selector(selector)
@@ -149,12 +157,10 @@ class SearchDialog(gtk.Dialog):
         return self._search_entry.get_text()
 
     def get_search_category(self):
-        return self.fields[self._picker_button.get_active()]
+        return self._search_fields[self._picker_button.get_active()]
 
 class ResultsWindow(hildon.StackableWindow):
 
-    TIMEOUT_TIME = 2000
-
     def __init__(self, search_term, search_category):
         super(ResultsWindow, self).__init__()
         self.set_title("Search results")
@@ -162,19 +168,84 @@ class ResultsWindow(hildon.StackableWindow):
         self.search_term = search_term
         self.search_category = search_category
 
-        self._show_banner()
+        self._simulate_search()
+        content_area = hildon.PannableArea()
+        self._movies_view = MoviesView()
+
+        content_area.add(self._movies_view)
+        self.add(content_area)
 
         self.show_all()
 
+    def _simulate_search(self):
+        self._show_banner()
+        hildon.hildon_gtk_window_set_progress_indicator(self, True)
+        gobject.timeout_add(constants.TIMEOUT_TIME_MILLIS, self._populate_view)
+
+    def _populate_view(self):
+        self._movies_view.add_movies([MovieDecorator("The Lord of the Rings"),
+                                      MovieDecorator("The Lord of the flies"),
+                                      MovieDecorator("Gone by the wind"),
+                                      MovieDecorator("Madagascar"),
+                                      MovieDecorator("Madagascar 2"),
+                                      MovieDecorator("2 Fast 2 Furious"),
+                                      MovieDecorator("Fast &amp; Furious"),
+                                      MovieDecorator("Pitch Black"),
+                                      ])
+        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}
         banner = hildon.hildon_banner_show_information_with_markup(self,
                                                                    "ignored",
                                                                    message)
-        banner.set_timeout(self.TIMEOUT_TIME)
+        banner.set_timeout(constants.TIMEOUT_TIME_MILLIS)
         pass
 
+class MoviesView(gtk.TreeView):
+
+    def __init__(self):
+        super(MoviesView, self).__init__()
+        model = MoviesListStore()
+        self.set_model(model)
+
+        movie_image_renderer = gtk.CellRendererPixbuf()
+        column = gtk.TreeViewColumn('Image', movie_image_renderer, pixbuf = model.IMAGE_COLUMN)
+        self.append_column(column)
+
+        movie_text_renderer = gtk.CellRendererText()
+        movie_text_renderer.set_property('ellipsize', pango.ELLIPSIZE_END)
+        column = gtk.TreeViewColumn('Name', movie_text_renderer, markup = model.INFO_COLUMN)
+        self.append_column(column)
+
+        self.show_all()
+
+    def add_movies(self, movie_list):
+        model = self.get_model()
+        model.add(movie_list)
+
+class MoviesListStore(gtk.ListStore):
+
+    IMAGE_COLUMN = 0
+    INFO_COLUMN = 1
+    MOVIE_COLUMN = 2
+
+    def __init__(self):
+        super(MoviesListStore, self).__init__(gtk.gdk.Pixbuf,
+                                              str,
+                                              gobject.TYPE_PYOBJECT)
+
+    def add(self, movies_found):
+        self.clear()
+        for movie in movies_found:
+            row = {self.IMAGE_COLUMN: movie.get_image(),
+                   self.INFO_COLUMN: movie.get_info(),
+                   self.MOVIE_COLUMN: movie,
+                  }
+            self.append(row.values())
+
 if __name__ == "__main__":
     maevies = Maevies()
     maevies.run()
@@ -186,3 +257,33 @@ class AboutDialog(gtk.Dialog):
                                           flags = gtk.DIALOG_DESTROY_WITH_PARENT)
         self.set_title("About Maevies")
         self.show_all()
+
+class MovieDecorator:
+
+    def __init__(self, name):
+        self._name = name
+        pass
+
+    def get_name(self):
+        return self._name
+
+    def get_length(self):
+        return "%sh:%sm" % (random.randrange(1, 2), random.randrange(0, 59))
+
+    def get_score(self):
+        return "%s" % (random.randrange(6, 9))
+
+    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())
+
+    def get_image(self):
+        return self._get_placeholder_pixbuf()
+
+    def _get_placeholder_pixbuf(self):
+        pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(constants.PLACEHOLDER_IMAGE,
+                                                    constants.IMAGE_WIDTH,
+                                                    constants.IMAGE_HEIGHT)
+        return pixbuf
diff --git a/ui/maeviesui/util/constants.py b/ui/maeviesui/util/constants.py
new file mode 100644 (file)
index 0000000..0c09a6c
--- /dev/null
@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+
+###########################################################################
+#    Maevies
+#    Copyright (C) 2010 Simón Pena <spenap@gmail.com>
+#
+#    This program is free software: you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation, either version 3 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+###########################################################################
+
+import os
+
+LOCAL_DATA_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__),
+                                              os.pardir,
+                                              os.pardir,
+                                              os.pardir,
+                                              'data'))
+
+PLACEHOLDER_IMAGE = os.path.join(LOCAL_DATA_DIR, 'placeholderimage.png')
+
+IMAGE_WIDTH = 100
+
+IMAGE_HEIGHT = 60
+
+TIMEOUT_TIME_MILLIS = 2000