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):
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
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()
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__":
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."
import dbus
import gobject
from dbus import glib
-import random
import gtk
+from dbus.exceptions import DBusException
gobject.threads_init()
glib.init_threads()
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()