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)
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()