Beispiel #1
0
 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)
Beispiel #2
0
 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)
Beispiel #3
0
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)
Beispiel #4
0
    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)
Beispiel #5
0
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
Beispiel #6
0
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)
Beispiel #7
0
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