# along with this program. If not, see <http://www.gnu.org/licenses/>.
###########################################################################
-from maeviesui.util import constants
-
-import hildon
import pygtk
+import os
+pygtk.require('2.0')
+import gtk
+import hildon
import pango
import gobject
-import random
-pygtk.require("2.0")
-import gtk
+
+from maeviesui.util import constants
+from maeviesui.util.asyncworker import AsyncWorker, AsyncItem
+from maeviesui.util.util import image_downloader
+from maeviesui.util.moviemanager import MovieManager
+
+moviemanager = MovieManager()
class Maevies(hildon.StackableWindow):
def __init__(self):
super(Maevies, self).__init__()
- self.set_title("Maevies - 0.1")
+ self.set_title('Maevies - 0.1')
self.connect('delete-event',
lambda widget, event: gtk.main_quit())
box.set_border_width(20)
button = hildon.Button(gtk.HILDON_SIZE_THUMB_HEIGHT,
- hildon.BUTTON_ARRANGEMENT_VERTICAL, title, subtitle)
- button.connect("clicked", self._button_clicked, action)
+ hildon.BUTTON_ARRANGEMENT_VERTICAL,
+ title, subtitle)
+ button.connect('clicked', self._button_clicked, action)
- box.pack_start(button,
- expand = True, fill = False)
+ box.pack_start(button, expand=True, fill=False)
return box
contents = gtk.HBox()
contents.set_border_width(60)
contents.set_homogeneous(True)
- contents.pack_start(self._create_button("On Theaters", "Movies playing",
- self.ACTION_THEATERS),
- expand = True, fill = True)
- contents.pack_start(self._create_button("Favorites", "Your saved searches",
- self.ACTION_FAVORITES),
- expand = True, fill = True)
- contents.pack_start(self._create_button("Search", "Enter a new search",
- self.ACTION_SEARCH),
- expand = True, fill = True)
+ contents.pack_start(self._create_button('On Theaters',
+ 'Movies playing',
+ self.ACTION_THEATERS),
+ expand=True, fill=True)
+ contents.pack_start(self._create_button('Favorites',
+ 'Your saved searches',
+ self.ACTION_FAVORITES),
+ expand=True, fill=True)
+ contents.pack_start(self._create_button('Search',
+ 'Enter a new search',
+ self.ACTION_SEARCH),
+ expand=True, fill=True)
return contents;
if action == self.ACTION_SEARCH:
search_dialog = SearchDialog(self)
if search_dialog.run() == gtk.RESPONSE_ACCEPT:
- ResultsWindow(search_term = search_dialog.get_search_term(),
- search_category = search_dialog.get_search_category())
+ results_window = ResultsWindow()
+ results_window.start_search(search_dialog.get_search_term(),
+ search_dialog.get_search_category())
search_dialog.destroy()
elif action == self.ACTION_ABOUT:
about_dialog = AboutDialog(self)
menu = hildon.AppMenu()
about = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
- about.set_label("About")
- about.connect("clicked", self._button_clicked, self.ACTION_ABOUT)
+ about.set_label('About')
+ about.connect('clicked', self._button_clicked, self.ACTION_ABOUT)
menu.append(about)
class SearchDialog(gtk.Dialog):
- _search_fields = [
- "Movies",
- "People",
- ]
+ TMDB_SEARCH = 0
+ WATC_SEARCH = 1
+ search_fields = {TMDB_SEARCH:'TMDb',
+ WATC_SEARCH:'WATC'}
def __init__(self, parent):
- super(SearchDialog, self).__init__(parent = parent,
- flags = gtk.DIALOG_DESTROY_WITH_PARENT)
- self.set_title("Enter search terms")
+ super(SearchDialog, self).__init__(parent=parent,
+ flags=gtk.DIALOG_DESTROY_WITH_PARENT)
+ self.set_title('Enter search terms')
self.vbox.pack_start(self._create_contents(), True, False, 0)
self.add_button(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)
search_contents = gtk.VBox()
search_contents.pack_start(self._search_entry,
- expand = True, fill = True)
+ expand=True, fill=True)
search_contents.pack_start(search_button,
- expand = True, fill = True)
+ 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_HORIZONTAL)
- self._picker_button.set_title("Search for")
+ hildon.BUTTON_ARRANGEMENT_HORIZONTAL)
+ self._picker_button.set_title('Search on')
- selector = hildon.TouchSelector(text = True)
+ selector = hildon.TouchSelector(text=True)
selector.set_column_selection_mode(hildon.TOUCH_SELECTOR_SELECTION_MODE_SINGLE)
- for field in self._search_fields:
- selector.append_text(field)
+ for search_method in [self.TMDB_SEARCH, self.WATC_SEARCH]:
+ selector.append_text(self.search_fields[search_method])
self._picker_button.set_selector(selector)
self._picker_button.set_active(0)
return self._search_entry.get_text()
def get_search_category(self):
- return self._search_fields[self._picker_button.get_active()]
+ return self._picker_button.get_active()
class ResultsWindow(hildon.StackableWindow):
- def __init__(self, search_term, search_category):
+ def __init__(self):
super(ResultsWindow, self).__init__()
- self.set_title("Search results")
+ self.set_title('Search results')
- self.search_term = search_term
- self.search_category = search_category
+ self.add(self._create_contents())
- self._simulate_search()
+ moviemanager.response_received_cb = self._response_received_cb
+ 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.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 _simulate_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)
- 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 & Furious"),
- MovieDecorator("Pitch Black"),
- ])
+ moviemanager.query(search_term, search_category)
+
+ 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 on <i>%(category)s</i> for <i>%(term)s</i>' %
+ {'category': SearchDialog.search_fields[search_category],
+ 'term' : search_term})
banner = hildon.hildon_banner_show_information_with_markup(self,
- "ignored",
+ 'ignored',
message)
banner.set_timeout(constants.TIMEOUT_TIME_MILLIS)
- pass
class MoviesView(gtk.TreeView):
self.set_model(model)
movie_image_renderer = gtk.CellRendererPixbuf()
- column = gtk.TreeViewColumn('Image', movie_image_renderer, pixbuf = model.IMAGE_COLUMN)
+ 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)
+ 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)
+ if 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):
def add(self, movies_found):
self.clear()
for movie in movies_found:
- row = {self.IMAGE_COLUMN: movie.get_image(),
+ row = {self.IMAGE_COLUMN: movie.get_placeholder_image(),
self.INFO_COLUMN: movie.get_info(),
self.MOVIE_COLUMN: movie,
}
class AboutDialog(gtk.Dialog):
def __init__(self, parent):
- super(AboutDialog, self).__init__(parent = parent,
- 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())
+ super(AboutDialog, self).__init__(parent=parent,
+ flags=gtk.DIALOG_DESTROY_WITH_PARENT)
+ self.set_title('About Maevies')
- def get_image(self):
- return self._get_placeholder_pixbuf()
-
- def _get_placeholder_pixbuf(self):
- pixbuf = gtk.IconTheme().load_icon('general_video_file', 48, 0)
- return pixbuf
+ 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 _fetch_movie_image(self, movie):
+ image = gtk.Image()
+
+ movie_image = movie.get_image('poster', 'mid')
+ image_file = os.path.abspath('/tmp/' + movie_image.get_id() + '.jpg')
+
+ if os.path.isfile(image_file):
+ image.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(image_file,
+ 256,
+ 256))
+ else:
+ image.set_from_pixbuf(gtk.IconTheme().load_icon('general_video',
+ 256, 0))
+ banner = hildon.hildon_banner_show_information_with_markup(self,
+ 'ignored',
+ 'Fetching movie poster')
+ banner.set_timeout(constants.TIMEOUT_TIME_MILLIS)
+ hildon.hildon_gtk_window_set_progress_indicator(self, True)
+
+ async_item = AsyncItem(image_downloader, (movie_image.get_url(),
+ '/tmp/' + movie_image.get_id()),
+ self._set_fetched_image, (image,))
+ self.async_worker.queue.put(async_item)
+ self.async_worker.start()
+
+ return image
+
+ def _set_fetched_image(self, image, target, error):
+ if not error:
+ image_file = os.path.abspath(target)
+ image.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(image_file,
+ 256,
+ 256))
+ hildon.hildon_gtk_window_set_progress_indicator(self, False)
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()
- image.set_from_pixbuf(gtk.IconTheme().load_icon('mediaplayer_default_album', 256, 0))
+ image = self._fetch_movie_image(movie)
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]})
- label.set_alignment(constants.LEFT_ALIGNMENT, constants.CENTER_ALIGNMENT)
+ 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, 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_alignment(constants.LEFT_ALIGNMENT, constants.CENTER_ALIGNMENT)
+ 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.async_worker = AsyncWorker()
+ self.set_title('Movie info')
+ self.add(self._create_contents(movie))
self.show_all()
-if __name__ == "__main__":
+if __name__ == '__main__':
maevies = Maevies()
maevies.run()