Пример #1
0
    def __init__(self):
        self.accelgroup = gtk.AccelGroup()

        self.master = master = gtk.Window()
        master.add_accel_group(self.accelgroup)
        master.set_title("nasu ~")
        master.set_position(gtk.WIN_POS_CENTER)
        master.connect("destroy", gtk.main_quit)

        self.playlist = Playlist(self)
        self.playlist.connect("media-selected", self.play_media)
        self.playlist.connect("media-searched", self.searched_media)

        self.player = VLCWidget() #gtk.DrawingArea()
        self.player.w.add_accel_group(self.accelgroup)

        self.player.set_size_request(400, 300)
        self.player.modify_bg(gtk.STATE_NORMAL,
                              gtk.gdk.color_parse("brown"))
        self.player.connect('play-started', self.play_started)
        self.player.connect('play-ended', self.playlist.jump_to_next)

        self.pos = gtk.HScale()
        self.pos.set_range(0, 100)
        self.pos.set_increments(1, 10)
        self.pos.set_digits(0)

        self.volume = gtk.VScale()
        self.volume.set_range(0, 10)
        self.volume.set_digits(0)

        player_control_box = gtk.HBox(False, 5)
        player_control_box.pack_start(self.pos, True, True)
        player_control_box.pack_start(self.volume, False)

        self.actiongroup = gtk.ActionGroup('')
        menubar = self._create_menu_bar(self.actiongroup)

        player_box = gtk.VBox(False, 5)
        player_box.pack_start(self.player, True, True)
        #player_box.pack_start(player_control_box, False)

        main_box = gtk.HBox(False, 5)
        main_box.pack_start(player_box, True, True)
        main_box.pack_start(self.playlist, False)

        window_box = gtk.VBox(False, 5)
        window_box.pack_start(menubar, False, False)
        window_box.pack_start(main_box, True, True)
        self.master.add(window_box)
        self.master.show_all()

        self.playlist_mode = self.PlaylistMode(self)
        self.play_fullscreen_mode = self.PlayFullscreenMode(self)
        self.searchlist_mode = self.SearchlistMode(self)
        self.current_mode = self.Mode()
        self.switch_mode(self.playlist_mode)
Пример #2
0
class MainForm(object):
    class Mode(object):
        def enter(self): pass
        def leave(self): pass

        def toggle_fullscreen(self): pass

    class PlaylistMode(Mode):
        def __init__(self, mainfrm):
            self.m = mainfrm

        def enter(self):
            self.m.playlist.enter_list_mode()

        def toggle_fullscreen(self):
            self.m.switch_mode(self.m.play_fullscreen_mode)
            self.m.playlist.enter_list_mode()

    class PlayFullscreenMode(Mode):
        def __init__(self, mainfrm):
            self.m = mainfrm

        def enter(self):
            self.m.player.fullscreen()

        def toggle_fullscreen(self):
            self.m.player.unfullscreen()
            self.m.switch_mode(self.m.playlist_mode)

    class SearchlistMode(Mode):
        def __init__(self, mainfrm):
            self.m = mainfrm

        def enter(self):
            self.m.player.unfullscreen()
            self.m.master.remove_accel_group(self.m.accelgroup)
            self.m.playlist.enter_search_mode()
            self.m.master.present()

        def leave(self):
            self.m.master.add_accel_group(self.m.accelgroup)

        def toggle_fullscreen(self):
            print "SearchListMode: invalid"



    def __init__(self):
        self.accelgroup = gtk.AccelGroup()

        self.master = master = gtk.Window()
        master.add_accel_group(self.accelgroup)
        master.set_title("nasu ~")
        master.set_position(gtk.WIN_POS_CENTER)
        master.connect("destroy", gtk.main_quit)

        self.playlist = Playlist(self)
        self.playlist.connect("media-selected", self.play_media)
        self.playlist.connect("media-searched", self.searched_media)

        self.player = VLCWidget() #gtk.DrawingArea()
        self.player.w.add_accel_group(self.accelgroup)

        self.player.set_size_request(400, 300)
        self.player.modify_bg(gtk.STATE_NORMAL,
                              gtk.gdk.color_parse("brown"))
        self.player.connect('play-started', self.play_started)
        self.player.connect('play-ended', self.playlist.jump_to_next)

        self.pos = gtk.HScale()
        self.pos.set_range(0, 100)
        self.pos.set_increments(1, 10)
        self.pos.set_digits(0)

        self.volume = gtk.VScale()
        self.volume.set_range(0, 10)
        self.volume.set_digits(0)

        player_control_box = gtk.HBox(False, 5)
        player_control_box.pack_start(self.pos, True, True)
        player_control_box.pack_start(self.volume, False)

        self.actiongroup = gtk.ActionGroup('')
        menubar = self._create_menu_bar(self.actiongroup)

        player_box = gtk.VBox(False, 5)
        player_box.pack_start(self.player, True, True)
        #player_box.pack_start(player_control_box, False)

        main_box = gtk.HBox(False, 5)
        main_box.pack_start(player_box, True, True)
        main_box.pack_start(self.playlist, False)

        window_box = gtk.VBox(False, 5)
        window_box.pack_start(menubar, False, False)
        window_box.pack_start(main_box, True, True)
        self.master.add(window_box)
        self.master.show_all()

        self.playlist_mode = self.PlaylistMode(self)
        self.play_fullscreen_mode = self.PlayFullscreenMode(self)
        self.searchlist_mode = self.SearchlistMode(self)
        self.current_mode = self.Mode()
        self.switch_mode(self.playlist_mode)

    def switch_mode(self, new_mode):
        old_mode, self.current_mode = self.current_mode, new_mode
        old_mode.leave()
        new_mode.enter()
        print 'switch_mode: %s -> %s' % (old_mode, new_mode)
        return new_mode

    def _create_menu_bar(self, actiongroup):
        menubar = gtk.MenuBar()

        media_action = gtk.Action('Media', 'Media', None, None)
        actiongroup.add_action(media_action)
        media_menuitem = media_action.create_menu_item()
        menubar.append(media_menuitem)
        media_menu = gtk.Menu()
        media_menuitem.set_submenu(media_menu)
        media_menu.append(self.create_menu_item(
                SHORT_KEY['ADD_FOLDER'], self.add_mediafiles_from_folder))
        media_menu.append(self.create_menu_item(
                SHORT_KEY['REMOVE_SELECTED'], self.playlist.remove_selected_media))
        media_menu.append(self.create_menu_item(
                SHORT_KEY['LOAD_LIST'], self.load_playlist_from_file))
        media_menu.append(self.create_menu_item(
                SHORT_KEY['SAVE_LIST'], self.save_playlist_to_file))
        media_menu.append(self.create_menu_item(
                SHORT_KEY['EXIT'], gtk.main_quit))

        playback_action = gtk.Action('Playback', 'Playback', None, None)
        actiongroup.add_action(playback_action)
        playback_menuitem = playback_action.create_menu_item()
        menubar.append(playback_menuitem)
        playback_menu = gtk.Menu()
        playback_menuitem.set_submenu(playback_menu)
        playback_menu.append(self.create_menu_item(
                SHORT_KEY['TOGGLE_PAUSE'], self.player.toggle_pause))
        playback_menu.append(self.create_menu_item(
                SHORT_KEY['STOP'], self.player.stop))
        playback_menu.append(self.create_menu_item(
                SHORT_KEY['PREV'], self.playlist.jump_to_prev))
        playback_menu.append(self.create_menu_item(
                SHORT_KEY['NEXT'], self.playlist.jump_to_next))
        playback_menu.append(self.create_menu_item(
                SHORT_KEY['JUMP_MEDIA'],
                lambda _: self.switch_mode(self.searchlist_mode)))
        playback_menu.append(self.create_menu_item(
                SHORT_KEY['JUMP_FWD'],
                partial(self.player.jump_relative, JUMP['FORWARD'])))
        playback_menu.append(self.create_menu_item(
                SHORT_KEY['JUMP_SHORT_FWD'],
                partial(self.player.jump_relative, JUMP['SHORT_FORWARD'])))
        playback_menu.append(self.create_menu_item(
                SHORT_KEY['JUMP_BKD'],
                partial(self.player.jump_relative, -JUMP['BACKWARD'])))
        playback_menu.append(self.create_menu_item(
                SHORT_KEY['JUMP_SHORT_BKD'],
                partial(self.player.jump_relative, -JUMP['SHORT_BACKWARD'])))

        #playback_menu.append(self.create_menu_item('Jump to time', 't', self.do_somth))
        playback_menu.append(self.create_menu_item(
                SHORT_KEY['FULLSCREEN'],
                lambda _: self.current_mode.toggle_fullscreen()))

        audio_action = gtk.Action('Audio', 'Audio', None, None)
        actiongroup.add_action(audio_action)
        audio_menuitem = audio_action.create_menu_item()
        menubar.append(audio_menuitem)
        audio_menu = gtk.Menu()
        audio_menuitem.set_submenu(audio_menu)
        audio_menu.append(self.create_menu_item(
                SHORT_KEY['AUDIO_VOLUME_INC'],
                partial(self.player.set_volume, AUDIO_VOLUME['INCREASE'])))
        audio_menu.append(self.create_menu_item(
                SHORT_KEY['AUDIO_VOLUME_DEC'],
                partial(self.player.set_volume, AUDIO_VOLUME['DECREASE'])))
        audio_menu.append(self.create_menu_item(SHORT_KEY['AUDIO_MUTE'],
                                                self.player.toggle_mute))
        audiovisual_action = gtk.Action('Visualisation', 'Visualisation', None, None)
        actiongroup.add_action(audiovisual_action)
        audiovisual_menuitem = audiovisual_action.create_menu_item()
        audio_menu.append(audiovisual_menuitem)
        audiovisual_menu = gtk.Menu()
        audiovisual_menuitem.set_submenu(audiovisual_menu)
        radio_group = None
        for x, i in zip(AUDIO_VISUALIZATION, range(0, len(AUDIO_VISUALIZATION))):
            ra = gtk.RadioAction(x, x, None, None, i)
            radio_group = radio_group or ra
            if radio_group != ra:
                ra.set_group(radio_group)
            ra.connect('activate',
                       lambda action:
                           self.player.set_audio_visualization(action.get_name()))
            self.actiongroup.add_action(ra)
            ra_menuitem = ra.create_menu_item()
            audiovisual_menu.append(ra_menuitem)
        radio_group.activate()
        return menubar

    def create_menu_item(self, name_accelerator, callback):
        name, accelerator = name_accelerator
        action = gtk.Action(name, name, name, None)
        action.connect('activate', callback)
        self.actiongroup.add_action_with_accel(action, accelerator)
        action.set_accel_group(self.accelgroup)
        action.connect_accelerator()
        return action.create_menu_item()

    def set_title(self, text):
        self.master.set_title("nasu ~" + text)

    def add_mediafiles(self, files):
        self.playlist.add_media_files(files)

    def play_media(self, playlist, file_name, file_path):
        print 'play_media:', file_name, file_path
        curr, count = self.playlist.get_selected()
        self.set_title('%s/%s : %s' % (curr, count, file_name))
        self.player.play(file_path)

    def searched_media(self, playlist, file_name, file_path):
        print 'search_media:', file_name, file_path
        self.switch_mode(self.playlist_mode)
        if file_path:
            self.playlist.select_media(file_path)

    def add_mediafiles_from_folder(self, *args):
        dialog = gtk.FileChooserDialog('Add Medias from Folder',
                                       self.master,
                                       gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
                                       (gtk.STOCK_OK, gtk.RESPONSE_OK,
                                        gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
                                       )
        folder = None
        if dialog.run() == gtk.RESPONSE_OK:
            folder = dialog.get_filename()
            print 'selected_folder:', folder
        dialog.destroy()
        self.add_mediafiles(dir_files([folder]))

    def save_playlist_to_file(self, *args):
        dialog = gtk.FileChooserDialog('Save Playlist to File',
                                       self.master,
                                       gtk.FILE_CHOOSER_ACTION_SAVE,
                                       (gtk.STOCK_OK, gtk.RESPONSE_OK,
                                        gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
                                       )
        filter_ = gtk.FileFilter()
        filter_.add_pattern('*.nasu')
        dialog.set_filter(filter_)
        f = None
        if dialog.run() == gtk.RESPONSE_OK:
            f = dialog.get_filename() + '.nasu'
            print 'selected_file_to_save:', f
        dialog.destroy()

        with open(f, 'w+') as fp:
            self.playlist.save_to(fp)

    def load_playlist_from_file(self, *args):
        dialog = gtk.FileChooserDialog('Load Playlist to File',
                                       self.master,
                                       gtk.FILE_CHOOSER_ACTION_OPEN,
                                       (gtk.STOCK_OK, gtk.RESPONSE_OK,
                                        gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
                                       )
        filter_ = gtk.FileFilter()
        filter_.add_pattern('*.nasu')
        dialog.set_filter(filter_)
        f = None
        if dialog.run() == gtk.RESPONSE_OK:
            f = dialog.get_filename()
            print 'selected_file_to_load:', f
        dialog.destroy()
        with open(f, 'r') as fp:
            self.playlist.load_from(fp)

    def play_started(self, *args):
        pass

    def do_somth(self, action):
        print 'do_soooo', action.get_name()