ui: Completed basic search functionality
[maevies] / ui / maeviesui / maeviesui / gui.py
index 4865572..f7781de 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 maeviesui.util.moviemanager import MovieManager
 pygtk.require("2.0")
 import gtk
 
@@ -41,19 +46,15 @@ class Maevies(hildon.StackableWindow):
 
         self.show_all()
 
-    def _create_box(self, title, action):
+    def _create_button(self, title, subtitle, action):
         box = gtk.VBox()
         box.set_border_width(20)
 
-        button = gtk.Button()
+        button = hildon.Button(gtk.HILDON_SIZE_THUMB_HEIGHT,
+                               hildon.BUTTON_ARRANGEMENT_VERTICAL, title, subtitle)
         button.connect("clicked", self._button_clicked, action)
-        foot_label = gtk.Label()
-        foot_label.set_text(title)
 
-        box.pack_start(button,
-                             expand = True, fill = True)
-        box.pack_start(foot_label,
-                             expand = False, fill = False)
+        box.pack_start(button, expand = True, fill = False)
 
         return box
 
@@ -61,14 +62,14 @@ class Maevies(hildon.StackableWindow):
         contents = gtk.HBox()
         contents.set_border_width(60)
         contents.set_homogeneous(True)
-        contents.pack_start(self._create_box(title = "On Theaters",
-                                             action = self.ACTION_THEATERS),
+        contents.pack_start(self._create_button("On Theaters", "Movies playing",
+                                             self.ACTION_THEATERS),
                             expand = True, fill = True)
-        contents.pack_start(self._create_box(title = "Favorites",
-                                             action = self.ACTION_FAVORITES),
+        contents.pack_start(self._create_button("Favorites", "Your saved searches",
+                                             self.ACTION_FAVORITES),
                             expand = True, fill = True)
-        contents.pack_start(self._create_box(title = "Search",
-                                             action = self.ACTION_SEARCH),
+        contents.pack_start(self._create_button("Search", "Enter a new search",
+                                             self.ACTION_SEARCH),
                             expand = True, fill = True)
 
         return contents;
@@ -103,7 +104,7 @@ class Maevies(hildon.StackableWindow):
 
 class SearchDialog(gtk.Dialog):
 
-    fields = [
+    _search_fields = [
            "Movies",
            "People",
            ]
@@ -122,22 +123,24 @@ 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
 
     def _create_picker_button(self):
         self._picker_button = hildon.PickerButton(gtk.HILDON_SIZE_FINGER_HEIGHT,
-                                            hildon.BUTTON_ARRANGEMENT_VERTICAL)
+                                            hildon.BUTTON_ARRANGEMENT_HORIZONTAL)
         self._picker_button.set_title("Search for")
 
         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,35 +152,94 @@ 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")
 
-        self.search_term = search_term
-        self.search_category = search_category
-
-        self._show_banner()
+        self.add(self._create_contents())
 
+        self.moviemanager = MovieManager(response_received_cb = self._response_received_cb)
+        self._start_search(search_term, search_category)
         self.show_all()
 
-    def _show_banner(self):
-        message = "Searching <i>%(category)s</i> for <i>%(term)s</i>" % {'category': self.search_category,
-                                                                         'term' : self.search_term}
+    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)
+        return content_area
+
+    def _row_activated_cb(self, view, path, column):
+        movie = view.get_movie_from_path(path)
+        MovieWindow(movie)
+
+    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)
+
+    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,
+                                                                         'term' : search_term}
         banner = hildon.hildon_banner_show_information_with_markup(self,
                                                                    "ignored",
                                                                    message)
-        banner.set_timeout(self.TIMEOUT_TIME)
-        pass
+        banner.set_timeout(constants.TIMEOUT_TIME_MILLIS)
 
-if __name__ == "__main__":
-    maevies = Maevies()
-    maevies.run()
+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)
+
+    def get_movie_from_path(self, path):
+        model = self.get_model()
+        return model[path][model.MOVIE_COLUMN]
+
+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())
 
 class AboutDialog(gtk.Dialog):
 
@@ -185,4 +247,58 @@ 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):
+
+    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, 40)
+        upper_content.set_border_width(20)
+
+        image = gtk.Image()
+        image.set_from_pixbuf(gtk.IconTheme().load_icon('mediaplayer_default_album', 256, 0))
+
+        side_content = gtk.VBox(False, 30)
+
+        for key in movie.fields:
+            label = gtk.Label()
+            label.set_markup("<b>%(field)s:</b> <small>%(value)s</small>" % {'field' : 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, 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>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.set_title("Movie info")
+        self.add(self._create_contents(movie))
         self.show_all()
+
+if __name__ == "__main__":
+    maevies = Maevies()
+    maevies.run()