def _create_aspect_ratio_textures(self): ''' Create textures that which are displayed when user changes aspect ratio. ''' texture_1 = Texture(self.theme.getImage("native_aspect_ratio")) texture_1.hide() self.add(texture_1) texture_2 = Texture(self.theme.getImage("widescreen_aspect_ratio")) texture_2.hide() self.add(texture_2) texture_3 = Texture(self.theme.getImage("zoom_aspect_ratio")) texture_3.hide() self.add(texture_3) texture_4 = Texture(self.theme.getImage("compromise_aspect_ratio")) texture_4.hide() self.add(texture_4) self.aspect_textures = [texture_1, texture_2, texture_3, texture_4] self.timeout_key = None # This is used when canceling timeouts for texture in self.aspect_textures: texture.position = ( float(self.config.stage_width - texture.get_width()) / (self.config.stage_width * 2), 0.67)
class VideoOSD(Screen): '''Screen is displayed when video is being watched. Usually this screen doesn't have any visible elements. User actions such as pause and rewind are displayed as on-screen-graphics.''' def __init__(self, media_player): Screen.__init__(self, 'VideoOSD', kind=Screen.OSD) self.theme = self.config.theme self.media_player = media_player self.media_player.connect('play', self._handle_play_pause) self.media_player.connect('pause', self._handle_play_pause) self.media_player.connect('skip-forward', self._handle_skip_forward) self.media_player.connect('skip-backward', self._handle_skip_backward) self._progress_bar = self._create_progress_bar() self.add(self._progress_bar) self.aspect_textures = None self.pause_texture = None self.seekbackward_texture = None self.seekforward_texture = None self.timeout_key = None self.progress_bar_timeout_key = None self.event_handlers.update({ UserEvent.PLAYER_PLAY_PAUSE: self._handle_play_pause, UserEvent.PLAYER_SKIP_BACKWARD: self._handle_skip_backward, UserEvent.PLAYER_SKIP_FORWARD: self._handle_skip_forward, UserEvent.PLAYER_STOP: self._handle_stop, UserEvent.USE_ASPECT_RATIO_1: self._handle_ratio_1, UserEvent.USE_ASPECT_RATIO_2: self._handle_ratio_2, UserEvent.USE_ASPECT_RATIO_3: self._handle_ratio_3, UserEvent.USE_ASPECT_RATIO_4: self._handle_ratio_4 }) self._create_aspect_ratio_textures() self._create_navigation_textures() def _create_navigation_textures(self): '''Create the pause, seek-backward & seek-forward textures.''' self.pause_texture = Texture( self.theme.getImage("media-playback-pause"), 0.5, 0.5) self.pause_texture.set_anchor_point_from_gravity( clutter.GRAVITY_CENTER) self.pause_texture.hide() self.add(self.pause_texture) pause_in_time = clutter.Timeline(1000) in_alpha_pause = clutter.Alpha(pause_in_time, clutter.EASE_IN_OUT_SINE) self.pause_in_opacity = clutter.BehaviourOpacity(alpha=in_alpha_pause, opacity_start=100, opacity_end=255) self.pause_in_scale = clutter.BehaviourScale(1.0, 1.0, 1.4, 1.4, in_alpha_pause) self.pause_in_opacity.apply(self.pause_texture) self.pause_in_scale.apply(self.pause_texture) pause_out_time = clutter.Timeline(1000) out_alpha_pause = clutter.Alpha(pause_out_time, clutter.EASE_IN_OUT_SINE) self.pause_out_opacity = clutter.BehaviourOpacity( alpha=out_alpha_pause, opacity_start=255, opacity_end=100) self.pause_out_scale = clutter.BehaviourScale(1.4, 1.4, 1.0, 1.0, out_alpha_pause) self.pause_out_opacity.apply(self.pause_texture) self.pause_out_scale.apply(self.pause_texture) self.score = clutter.Score() self.score.set_loop(True) self.score.append(timeline=pause_in_time) self.score.append(timeline=pause_out_time, parent=pause_in_time) self.score.start() self.seekbackward_texture = Texture( self.theme.getImage("media-seek-backward"), 0.1, 0.5) self.seekbackward_texture.set_anchor_point_from_gravity( clutter.GRAVITY_CENTER) self.seekbackward_texture.set_opacity(0) self.add(self.seekbackward_texture) self.seekbackward_timeline = clutter.Timeline(1000) alpha_seekbackward = clutter.Alpha(self.seekbackward_timeline, clutter.EASE_IN_OUT_SINE) self.seekbackward_opacity = clutter.BehaviourOpacity( alpha=alpha_seekbackward, opacity_start=255, opacity_end=0) self.seekbackward_opacity.apply(self.seekbackward_texture) self.seekforward_texture = Texture( self.theme.getImage("media-seek-forward"), 0.9, 0.5) self.seekforward_texture.set_anchor_point_from_gravity( clutter.GRAVITY_CENTER) self.seekforward_texture.set_opacity(0) self.add(self.seekforward_texture) self.seekforward_timeline = clutter.Timeline(1000) alpha_seekforward = clutter.Alpha(self.seekforward_timeline, clutter.EASE_IN_OUT_SINE) self.seekforward_opacity = clutter.BehaviourOpacity( alpha=alpha_seekforward, opacity_start=255, opacity_end=0) self.seekforward_opacity.apply(self.seekforward_texture) def _create_progress_bar(self): '''Create the progress bar.''' progress_bar = ProgressBar(0.5, 0.9, 0.40, 0.04) progress_bar.auto_display = True progress_bar.media_player = self.media_player progress_bar.visible = True return progress_bar def _create_aspect_ratio_textures(self): ''' Create textures that which are displayed when user changes aspect ratio. ''' texture_1 = Texture(self.theme.getImage("native_aspect_ratio")) texture_1.hide() self.add(texture_1) texture_2 = Texture(self.theme.getImage("widescreen_aspect_ratio")) texture_2.hide() self.add(texture_2) texture_3 = Texture(self.theme.getImage("zoom_aspect_ratio")) texture_3.hide() self.add(texture_3) texture_4 = Texture(self.theme.getImage("compromise_aspect_ratio")) texture_4.hide() self.add(texture_4) self.aspect_textures = [texture_1, texture_2, texture_3, texture_4] self.timeout_key = None # This is used when canceling timeouts for texture in self.aspect_textures: texture.position = ( float(self.config.stage_width - texture.get_width()) / (self.config.stage_width * 2), 0.67) def _hide_aspect_ratio_logo(self, number): ''' Hide aspect ratio texture. This is a callback function and shouldn't be called directly. ''' self.aspect_textures[number].hide() self.timeout_key = None return False def _display_aspect_ratio_logo(self, number): '''Display aspect ratio logo on screen when ratio is changed.''' if self.timeout_key is not None: gobject.source_remove(self.timeout_key) for texture in self.aspect_textures: texture.hide() self.aspect_textures[number].show() self.timeout_key = gobject.timeout_add(2000, self._hide_aspect_ratio_logo, number) def _handle_play_pause(self, event=None): '''Handle UserEvent.PLAYER_PLAY_PAUSE.''' if self.media_player.is_playing: self.pause_texture.hide() else: self.pause_texture.show() self._progress_bar.visible = True def _handle_skip_backward(self, event=None): '''Handle UserEvent.PLAYER_SKIP_BACKWARD.''' self._progress_bar.visible = True self.seekbackward_timeline.start() def _handle_skip_forward(self, event=None): '''Handle UserEvent.PLAYER_SKIP_FORWARD.''' self._progress_bar.visible = True self.seekforward_timeline.start() def _handle_stop(self): '''Handle UserEvent.PLAYER_STOP.''' self._progress_bar.visible = True self.pause_texture.hide() def _handle_ratio_1(self): '''Handle UserEvent.USE_ASPECT_RATIO_1.''' self._display_aspect_ratio_logo(0) def _handle_ratio_2(self): '''Handle UserEvent.USE_ASPECT_RATIO_2.''' self._display_aspect_ratio_logo(1) def _handle_ratio_3(self): '''Handle UserEvent.USE_ASPECT_RATIO_3.''' self._display_aspect_ratio_logo(2) def _handle_ratio_4(self): '''Handle UserEvent.USE_ASPECT_RATIO_4.''' self._display_aspect_ratio_logo(3)
def create_movie_information(self): '''Create clutter parts related to movie information''' # Movie art texture if self.movie.has_cover_art(): pixbuf = gtk.gdk.pixbuf_new_from_file(self.movie.cover_art_url) else: pixbuf = gtk.gdk.pixbuf_new_from_file( self.theme.getImage("default_movie_art")) movie_art = EyeCandyTexture(0.33, 0.1, 0.1, 0.25, pixbuf) self.add(movie_art) # Movie title title = Label(0.04, "title", 0.47, 0.1, self.movie.title, font_weight="bold") title.set_ellipsize(pango.ELLIPSIZE_END) title.set_size(0.5124, 0.05208) self.add(title) # Movie release year year_text = _("Released in %(year)s") % {'year': self.movie.year} year = Label(0.032, "subtitle", 0.47, 0.3, year_text) year.set_ellipsize(pango.ELLIPSIZE_END) year.set_size(0.5124, 0.05208) self.add(year) # Show only 2 genres (or one if there is only one) genres_list = self.movie.genres if len(genres_list) == 0: genres_text = _("Unknown") else: genres_text = "/".join(genres_list[:2]) # Runtime and genres info_text = _("%(runtime)s min, %(genre)s") % \ {'runtime': self.movie.runtime, 'genre': genres_text} info = Label(0.032, "subtitle", 0.47, 0.24, info_text) info.set_ellipsize(pango.ELLIPSIZE_END) info.set_size(0.5124, 0.05208) self.add(info) # Stars (rating) star = Texture(self.theme.getImage("star")) star.hide() self.add(star) star2 = Texture(self.theme.getImage("star2")) star2.hide() self.add(star2) for i in range(self.movie.rating): tex = clutter.Clone(star) tex.set_position( self.get_abs_x(0.47) + (self.get_abs_x(0.0366) * i), self.get_abs_y(0.17)) tex.set_size(self.get_abs_x(0.024), self.get_abs_y(0.04)) self.add(tex) dark_star = 5 - self.movie.rating for i in range(dark_star): tex = clutter.Clone(star2) tex.set_position(self.get_abs_x(0.47) + (self.get_abs_x(0.0366) * \ (i + self.movie.rating)), self.get_abs_y(0.17)) tex.set_size(self.get_abs_x(0.024), self.get_abs_y(0.04)) self.add(tex) # Plot plot = Label(0.029, "subtitle", 0, 0, self.movie.plot) plot.set_justify(True) plot.set_line_wrap_mode(pango.WRAP_WORD) plot.set_line_wrap(True) plot.width = 0.5124 self.scroll_area = ScrollArea(0.33, 0.38, 0.5124, 0.3516, plot) self.add(self.scroll_area) # Actors self.add(Label(0.032, "title", 0.33, 0.8, _("Starring"))) actors_list = self.movie.actors if len(actors_list) == 0: actors_text = _("Unknown") else: actors_text = ", ".join(actors_list[:5]) actors = Label(0.032, "subtitle", 0.46, 0.8, actors_text) actors.set_ellipsize(pango.ELLIPSIZE_END) actors.set_size(0.5124, 0.05208) self.add(actors) # Directors self.add(Label(0.032, "title", 0.33, 0.86, _("Directed by"))) directors_list = self.movie.directors if len(directors_list) == 0: directors_text = _("Unknown") else: directors_text = ", ".join(directors_list[:2]) directors = Label(0.032, "subtitle", 0.46, 0.86, directors_text) directors.set_ellipsize(pango.ELLIPSIZE_END) directors.set_size(0.5124, 0.05208) self.add(directors) # Writers self.add(Label(0.032, "title", 0.33, 0.92, _("Written by"))) writers_list = self.movie.writers if len(directors_list) == 0: writers_text = _("Unknown") else: writers_text = ", ".join(writers_list[:2]) writers = Label(0.032, "subtitle", 0.46, 0.92, writers_text) writers.set_ellipsize(pango.ELLIPSIZE_END) writers.set_size(0.5124, 0.05208) self.add(writers)
class ImageMenu(GridMenu): """A grid menu that contains images.""" __gsignals__ = { 'filled': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()), } def __init__(self, x=0, y=0, item_width=0.2, item_height=0.1): GridMenu.__init__(self, x, y, item_width, item_height) self.cursor_below = False self.horizontal = True self.items_per_col = 4 self.visible_rows = 3 self.visible_cols = 5 c = clutter.Rectangle() c.set_size(100, 100) c.set_color((255, 255, 255, 128)) self.cursor = c pix_buffer = gtk.gdk.pixbuf_new_from_file( self.config.theme.getImage("default_movie_art")) self.movie_default = RoundedTexture(0.0, 0.0, 0.1, 0.25, pix_buffer) self.movie_default.hide() self.add(self.movie_default) self.album_default = Texture( self.config.theme.getImage("default_album_art")) self.album_default.hide() self.add(self.album_default) def add_item(self, texture, data): """Add a ImageMenuItem from a Texture.""" item = ImageMenuItem(self._item_width, self._item_height, texture) item.userdata = data self.raw_add_item(item) def async_add(self, items): """ Add asynchronously ImageMenuItem using a list. The list should be : [[texture1, data1], [texture2, data2], etc] texture1, texture2 : are Texture objects. data1, data2: are the data that will be accessible from the menu item. (see MenuItem Class) """ if len(items) > 0: item = items[0] self.add_item(item[0], item[1]) # Recursive call, remove first element from the list gobject.timeout_add(15, self.async_add, items[1:]) else: self.emit("filled") return False # XXX: This needs to be changed. An ImageMenu should know nothing about # special video items. def async_add_videos(self, items): """ Add asynchronously ImageMenuItem using a list. The created ImageMenuItem fits movies and series requirements. See also async_add comments. """ if len(items) > 0: item = items[0] if item[1].has_cover_art(): pix_buffer = gtk.gdk.pixbuf_new_from_file(item[0]) texture = RoundedTexture(0.0, 0.0, 0.1, 0.25, pix_buffer) else: texture = clutter.Clone(self.movie_default) self.add_item(texture, item[1]) # Recursive call, remove first element from the list gobject.timeout_add(10, self.async_add_videos, items[1:]) else: self.emit("filled") return False # XXX: This needs to be changed. An ImageMenu should know nothing about # special album items. def async_add_albums(self, items): """ Add asynchronously ImageMenuItem using a list. The created ImageMenuItem fits albums requirements. See also async_add comments. """ if len(items) > 0: item = items[0] if item[1].has_album_art(): texture = Texture(item[0]) else: texture = clutter.Clone(self.album_default) self.add_item(texture, item[1]) # Recursive call, remove first element from the list gobject.timeout_add(10, self.async_add_albums, items[1:]) else: self.emit("filled") return False # XXX: This needs to be changed. An ImageMenu should know nothing about # special clip items. def async_add_clips(self, items): """ Add asynchronously ImageMenuItem using a list. The created ImageMenuItem fits clips requirements. See also async_add comments. """ if len(items) > 0: item = items[0] pix_buffer = gtk.gdk.pixbuf_new_from_file(item[0]) texture = RoundedTexture(0.0, 0.0, 0.23, self.y_for_x(0.23) * 0.7, pix_buffer) self.add_item(texture, item[1]) # Recursive call, remove first element from the list gobject.timeout_add(10, self.async_add_clips, items[1:]) else: self.emit("filled") return False
class VideoOSD(Screen): '''Screen is displayed when video is being watched. Usually this screen doesn't have any visible elements. User actions such as pause and rewind are displayed as on-screen-graphics.''' def __init__(self, media_player): Screen.__init__(self, 'VideoOSD', kind=Screen.OSD) self.theme = self.config.theme self.media_player = media_player self.media_player.connect('play', self._handle_play_pause) self.media_player.connect('pause', self._handle_play_pause) self.media_player.connect('skip-forward', self._handle_skip_forward) self.media_player.connect('skip-backward', self._handle_skip_backward) self._progress_bar = self._create_progress_bar() self.add(self._progress_bar) self.aspect_textures = None self.pause_texture = None self.seekbackward_texture = None self.seekforward_texture = None self.timeout_key = None self.progress_bar_timeout_key = None self.event_handlers.update({ UserEvent.PLAYER_PLAY_PAUSE : self._handle_play_pause, UserEvent.PLAYER_SKIP_BACKWARD : self._handle_skip_backward, UserEvent.PLAYER_SKIP_FORWARD : self._handle_skip_forward, UserEvent.PLAYER_STOP : self._handle_stop, UserEvent.USE_ASPECT_RATIO_1 : self._handle_ratio_1, UserEvent.USE_ASPECT_RATIO_2 : self._handle_ratio_2, UserEvent.USE_ASPECT_RATIO_3 : self._handle_ratio_3, UserEvent.USE_ASPECT_RATIO_4 : self._handle_ratio_4 }) self._create_aspect_ratio_textures() self._create_navigation_textures() def _create_navigation_textures(self): '''Create the pause, seek-backward & seek-forward textures.''' self.pause_texture = Texture( self.theme.getImage("media-playback-pause"), 0.5, 0.5) self.pause_texture.set_anchor_point_from_gravity(clutter.GRAVITY_CENTER) self.pause_texture.hide() self.add(self.pause_texture) pause_in_time = clutter.Timeline(1000) in_alpha_pause = clutter.Alpha(pause_in_time, clutter.EASE_IN_OUT_SINE) self.pause_in_opacity = clutter.BehaviourOpacity(alpha=in_alpha_pause, opacity_start=100, opacity_end=255) self.pause_in_scale = clutter.BehaviourScale(1.0, 1.0, 1.4, 1.4, in_alpha_pause) self.pause_in_opacity.apply(self.pause_texture) self.pause_in_scale.apply(self.pause_texture) pause_out_time = clutter.Timeline(1000) out_alpha_pause = clutter.Alpha(pause_out_time, clutter.EASE_IN_OUT_SINE) self.pause_out_opacity = clutter.BehaviourOpacity(alpha=out_alpha_pause, opacity_start=255, opacity_end=100) self.pause_out_scale = clutter.BehaviourScale(1.4, 1.4, 1.0, 1.0, out_alpha_pause) self.pause_out_opacity.apply(self.pause_texture) self.pause_out_scale.apply(self.pause_texture) self.score = clutter.Score() self.score.set_loop(True) self.score.append(timeline=pause_in_time) self.score.append(timeline=pause_out_time, parent=pause_in_time) self.score.start() self.seekbackward_texture = Texture( self.theme.getImage("media-seek-backward"), 0.1, 0.5) self.seekbackward_texture.set_anchor_point_from_gravity( clutter.GRAVITY_CENTER) self.seekbackward_texture.set_opacity(0) self.add(self.seekbackward_texture) self.seekbackward_timeline = clutter.Timeline(1000) alpha_seekbackward = clutter.Alpha(self.seekbackward_timeline, clutter.EASE_IN_OUT_SINE) self.seekbackward_opacity = clutter.BehaviourOpacity( alpha=alpha_seekbackward, opacity_start=255, opacity_end=0) self.seekbackward_opacity.apply(self.seekbackward_texture) self.seekforward_texture = Texture( self.theme.getImage("media-seek-forward"), 0.9, 0.5) self.seekforward_texture.set_anchor_point_from_gravity( clutter.GRAVITY_CENTER) self.seekforward_texture.set_opacity(0) self.add(self.seekforward_texture) self.seekforward_timeline = clutter.Timeline(1000) alpha_seekforward = clutter.Alpha(self.seekforward_timeline, clutter.EASE_IN_OUT_SINE) self.seekforward_opacity = clutter.BehaviourOpacity( alpha=alpha_seekforward, opacity_start=255, opacity_end=0) self.seekforward_opacity.apply(self.seekforward_texture) def _create_progress_bar(self): '''Create the progress bar.''' progress_bar = ProgressBar(0.5, 0.9, 0.40, 0.04) progress_bar.auto_display = True progress_bar.media_player = self.media_player progress_bar.visible = True return progress_bar def _create_aspect_ratio_textures(self): ''' Create textures that which are displayed when user changes aspect ratio. ''' texture_1 = Texture(self.theme.getImage("native_aspect_ratio")) texture_1.hide() self.add(texture_1) texture_2 = Texture(self.theme.getImage("widescreen_aspect_ratio")) texture_2.hide() self.add(texture_2) texture_3 = Texture(self.theme.getImage("zoom_aspect_ratio")) texture_3.hide() self.add(texture_3) texture_4 = Texture(self.theme.getImage("compromise_aspect_ratio")) texture_4.hide() self.add(texture_4) self.aspect_textures = [texture_1, texture_2, texture_3, texture_4] self.timeout_key = None # This is used when canceling timeouts for texture in self.aspect_textures: texture.position = ( float(self.config.stage_width - texture.get_width()) / (self.config.stage_width * 2), 0.67) def _hide_aspect_ratio_logo(self, number): ''' Hide aspect ratio texture. This is a callback function and shouldn't be called directly. ''' self.aspect_textures[number].hide() self.timeout_key = None return False def _display_aspect_ratio_logo(self, number): '''Display aspect ratio logo on screen when ratio is changed.''' if self.timeout_key is not None: gobject.source_remove(self.timeout_key) for texture in self.aspect_textures: texture.hide() self.aspect_textures[number].show() self.timeout_key = gobject.timeout_add(2000, self._hide_aspect_ratio_logo, number) def _handle_play_pause(self, event=None): '''Handle UserEvent.PLAYER_PLAY_PAUSE.''' if self.media_player.is_playing: self.pause_texture.hide() else: self.pause_texture.show() self._progress_bar.visible = True def _handle_skip_backward(self, event=None): '''Handle UserEvent.PLAYER_SKIP_BACKWARD.''' self._progress_bar.visible = True self.seekbackward_timeline.start() def _handle_skip_forward(self, event=None): '''Handle UserEvent.PLAYER_SKIP_FORWARD.''' self._progress_bar.visible = True self.seekforward_timeline.start() def _handle_stop(self): '''Handle UserEvent.PLAYER_STOP.''' self._progress_bar.visible = True self.pause_texture.hide() def _handle_ratio_1(self): '''Handle UserEvent.USE_ASPECT_RATIO_1.''' self._display_aspect_ratio_logo(0) def _handle_ratio_2(self): '''Handle UserEvent.USE_ASPECT_RATIO_2.''' self._display_aspect_ratio_logo(1) def _handle_ratio_3(self): '''Handle UserEvent.USE_ASPECT_RATIO_3.''' self._display_aspect_ratio_logo(2) def _handle_ratio_4(self): '''Handle UserEvent.USE_ASPECT_RATIO_4.''' self._display_aspect_ratio_logo(3)
class ImageMenu(GridMenu): """A grid menu that contains images.""" __gsignals__ = { 'filled' : ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, () ), } def __init__(self, x=0, y=0, item_width=0.2, item_height=0.1): GridMenu.__init__(self, x, y, item_width, item_height) self.cursor_below = False self.horizontal = True self.items_per_col = 4 self.visible_rows = 3 self.visible_cols = 5 c = clutter.Rectangle() c.set_size(100, 100) c.set_color((255, 255, 255, 128)) self.cursor = c pix_buffer = gtk.gdk.pixbuf_new_from_file( self.config.theme.getImage("default_movie_art")) self.movie_default = RoundedTexture(0.0, 0.0, 0.1, 0.25, pix_buffer) self.movie_default.hide() self.add(self.movie_default) self.album_default = Texture( self.config.theme.getImage("default_album_art")) self.album_default.hide() self.add(self.album_default) def add_item(self, texture, data): """Add a ImageMenuItem from a Texture.""" item = ImageMenuItem(self._item_width, self._item_height, texture) item.userdata = data self.raw_add_item(item) def async_add(self, items): """ Add asynchronously ImageMenuItem using a list. The list should be : [[texture1, data1], [texture2, data2], etc] texture1, texture2 : are Texture objects. data1, data2: are the data that will be accessible from the menu item. (see MenuItem Class) """ if len(items) > 0: item = items[0] self.add_item(item[0], item[1]) # Recursive call, remove first element from the list gobject.timeout_add(15, self.async_add, items[1:]) else: self.emit("filled") return False # XXX: This needs to be changed. An ImageMenu should know nothing about # special video items. def async_add_videos(self, items): """ Add asynchronously ImageMenuItem using a list. The created ImageMenuItem fits movies and series requirements. See also async_add comments. """ if len(items) > 0: item = items[0] if item[1].has_cover_art(): pix_buffer = gtk.gdk.pixbuf_new_from_file(item[0]) texture = RoundedTexture(0.0, 0.0, 0.1, 0.25, pix_buffer) else: texture = clutter.Clone(self.movie_default) self.add_item(texture, item[1]) # Recursive call, remove first element from the list gobject.timeout_add(10, self.async_add_videos, items[1:]) else: self.emit("filled") return False # XXX: This needs to be changed. An ImageMenu should know nothing about # special album items. def async_add_albums(self, items): """ Add asynchronously ImageMenuItem using a list. The created ImageMenuItem fits albums requirements. See also async_add comments. """ if len(items) > 0: item = items[0] if item[1].has_album_art(): texture = Texture(item[0]) else: texture = clutter.Clone(self.album_default) self.add_item(texture, item[1]) # Recursive call, remove first element from the list gobject.timeout_add(10, self.async_add_albums, items[1:]) else: self.emit("filled") return False # XXX: This needs to be changed. An ImageMenu should know nothing about # special clip items. def async_add_clips(self, items): """ Add asynchronously ImageMenuItem using a list. The created ImageMenuItem fits clips requirements. See also async_add comments. """ if len(items) > 0: item = items[0] pix_buffer = gtk.gdk.pixbuf_new_from_file(item[0]) texture = RoundedTexture(0.0, 0.0, 0.23, self.y_for_x(0.23) * 0.7, pix_buffer) self.add_item(texture, item[1]) # Recursive call, remove first element from the list gobject.timeout_add(10, self.async_add_clips, items[1:]) else: self.emit("filled") return False