From e5b8bd80569bb8b7df86a87cdda61b5695a23249 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sim=C3=B3n=20Pena?= Date: Tue, 1 Jun 2010 10:32:08 +0200 Subject: [PATCH] ui: Completed basic search functionality The UI is now connected with the moviemanager, and clicking on a row brings the item's info --- ui/maeviesui/maeviesui/gui.py | 64 +++++++++++++----------- ui/maeviesui/util/constants.py | 15 +++--- ui/maeviesui/util/moviemanager.py | 100 +++++++++++++++++++++++++------------ 3 files changed, 110 insertions(+), 69 deletions(-) diff --git a/ui/maeviesui/maeviesui/gui.py b/ui/maeviesui/maeviesui/gui.py index 925a110..f7781de 100644 --- a/ui/maeviesui/maeviesui/gui.py +++ b/ui/maeviesui/maeviesui/gui.py @@ -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 %(category)s for %(term)s" % {'category': self.search_category, - 'term' : self.search_term} + def _show_banner(self, search_term, search_category): + message = "Searching %(category)s for %(term)s" % {'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("%(field)s: %(value)s" % {'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("%(field)s:\n %(value)s" % {'field' : 'Overview', - 'value' : movie['Overview']}) + label.set_markup("Overview:") 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__": diff --git a/ui/maeviesui/util/constants.py b/ui/maeviesui/util/constants.py index 7b71306..e446d50 100644 --- a/ui/maeviesui/util/constants.py +++ b/ui/maeviesui/util/constants.py @@ -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." diff --git a/ui/maeviesui/util/moviemanager.py b/ui/maeviesui/util/moviemanager.py index 3d73948..4689eee 100644 --- a/ui/maeviesui/util/moviemanager.py +++ b/ui/maeviesui/util/moviemanager.py @@ -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 "%s\nLength: %s || Score: %s" % ( - self.get_name(), - self.get_length(), - self.get_score()) + return "%(title)s\nPopularity: %(popularity)s\ + Rating: %(rating)s Released: %(released)s" % {'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() -- 1.7.9.5