home *** CD-ROM | disk | FTP | other *** search
Wrap
# Source Generated with Decompyle++ # File: in.pyo (Python 2.4) import gtk import os import os.path as os import gobject import operations import gaw import gtkutil from components import Component from operations import MapProxy, OperationListener from mastering import AudioMastering from serpentine.common import SerpentineNotSupportedError, validate_music_list from serpentine.common import SerpentineCacheError from gettext import gettext as _ class GladeComponent(Component): def _setup_glade(self, g): '''This method is called when the SerpentineWindow object is created.''' pass class FileDialogComponent(GladeComponent): def __init__(self, parent): super(FileDialogComponent, self).__init__(parent) self.file_dlg = gtk.FileChooserDialog(parent = self.parent, buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK)) self.file_dlg.set_title('') self.file_dlg.set_transient_for(self.parent) self.file_dlg.set_current_folder(os.path.expanduser('~')) self._FileDialogComponent__file_filters = None def run_dialog(self, *args): self._FileDialogComponent__sync_file_filters() if self.file_dlg.run() == gtk.RESPONSE_OK: self._on_response_ok() self._on_response_fail() self.file_dlg.unselect_all() self.file_dlg.hide() def _on_response_ok(self): pass def _on_response_fail(self): pass def _get_file_filter(self): raise NotImplementedError def __sync_file_filters(self): file_filters = self._get_file_filters() if file_filters == self._FileDialogComponent__file_filters: return None for filter in self.file_dlg.list_filters(): self.file_dlg.remove_filter(filter) self._FileDialogComponent__file_filters = file_filters for filter in file_filters: self.file_dlg.add_filter(filter) class AddFileComponent(FileDialogComponent): def _setup_glade(self, g): g.get_widget('add').connect('clicked', self.run_dialog) g.get_widget('add_mni').connect('activate', self.run_dialog) self.file_dlg.set_select_multiple(True) def _on_response_ok(self): files = self.file_dlg.get_uris() self.parent.music_list_widget.music_list_gateway.add_files(files).start() _get_file_filters = lambda self: self.parent.application.music_file_filters class PlaylistComponent(FileDialogComponent): def _setup_glade(self, g): g.get_widget('open_playlist_mni').connect('activate', self.run_dialog) _get_file_filters = lambda self: self.parent.application.playlist_file_filters def _on_response_ok(self): playlist = self.file_dlg.get_uri() self.parent.music_list_widget.music_list_gateway.add_files([ playlist]).start() self.parent.clear_files() class SavePlaylistComponent(GladeComponent): def _setup_glade(self, g): g.get_widget('save_playlist_mni').connect('activate', self.run_dialog) self.file_dlg = gtk.FileChooserDialog(action = gtk.FILE_CHOOSER_ACTION_SAVE, buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) self.file_dlg.set_title('') self.file_dlg.set_transient_for(self.parent) self.file_dlg.set_current_folder(os.path.expanduser('~')) hbox = gtk.HBox(spacing = 6) hbox.show() lbl = gtk.Label(_('Save playlist in format:')) lbl.show() hbox.pack_start(lbl, False, False) store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING) cmb = gtk.ComboBox(store) cmb.show() cell = gtk.CellRendererText() cmb.pack_start(cell, True) cmb.add_attribute(cell, 'text', 0) self.combo = cmb hbox.pack_start(cmb, False, False) self.store = store store.append((_('Detect by extension'), '')) cmb.set_active(0) self.file_dlg.set_extra_widget(hbox) app = self.parent.application app.savePlaylist.listeners.append(self) self._SavePlaylistComponent__sync = True def on_registred(self, factory, extension, description): self._SavePlaylistComponent__sync = True self.store.append(('%s (%s)' % (description, extension), extension)) def on_finished(self, evt): win = self.parent if evt.id != operations.SUCCESSFUL: gtkutil.dialog_error(_('Playlist Not Saved'), _('There was an error while saving the playlist.'), parent = win) def __sync_file_filters(self): if not self._SavePlaylistComponent__sync: return None app = self.parent.application for f in self.file_dlg.list_filters(): self.file_dlg.remove_filter(f) for f in app.savePlaylist.file_filters: self.file_dlg.add_filter(f) self._SavePlaylistComponent__sync = False def run_dialog(self, *args): app = self.parent.application win = self.parent self._SavePlaylistComponent__sync_file_filters() while self.file_dlg.run() == gtk.RESPONSE_OK: filename = self.file_dlg.get_filename() basename = os.path.basename(filename) index = self.combo.get_active() if index == 0: extension = None else: extension = self.store[index][1] if os.path.exists(filename) and gtkutil.dialog_ok_cancel(_('Replace existing file'), _('A file named <i>%s</i> already exists. Do you want to replace it with the one you are saving?') % basename, parent = win) != gtk.RESPONSE_OK: self.file_dlg.unselect_all() self.file_dlg.hide() return None try: oper = app.savePlaylist.save(filename, extension) oper.listeners.append(self) oper.start() continue except SerpentineNotSupportedError: if extension is None: items = map((lambda row: row[0]), self.store) del items[0] (indexes, response) = gtkutil.choice_dialog(_('Select one playlist format'), _('Serpentine will open any of these formats so the one you choose only matters if you are going to open with other applications.'), one_text_item = _('Do you want to save as the %s format?'), min_select = 1, max_select = 1, parent = win, items = items, ok_button = gtk.STOCK_SAVE) if len(indexes) != 0: (index,) = indexes index += 1 row = self.store[index] extension = row[1] oper = app.savePlaylist.save(filename, extension) oper.listeners.append(self) oper.start() self.combo.set_active(index) break else: gtkutil.dialog_error(_('Unsupported Format'), _('The playlist format you used (by the file extension) is currently not supported.'), parent = win) extension is None None<EXCEPTION MATCH>SerpentineNotSupportedError self.file_dlg.unselect_all() self.file_dlg.hide() class ToolbarComponent(GladeComponent): Style = { 'both': gtk.TOOLBAR_BOTH, 'both-horiz': gtk.TOOLBAR_BOTH_HORIZ, 'icons': gtk.TOOLBAR_ICONS, 'text': gtk.TOOLBAR_TEXT } def _setup_glade(self, g): self._ToolbarComponent__style = gaw.GConfValue(key = '/desktop/gnome/interface/toolbar_style', data_spec = gaw.Spec.STRING) self._ToolbarComponent__style.set_callback(self._ToolbarComponent__on_style_change) self._ToolbarComponent__detachable = gaw.GConfValue(key = '/desktop/gnome/interface/toolbar_detachable', data_spec = gaw.Spec.BOOL) self._ToolbarComponent__detachable.set_callback(self._ToolbarComponent__on_detachable_change) self.toolbar = g.get_widget('main_toolbar') self.handle = g.get_widget('main_handle') self.wrapper = g.get_widget('main_toolbar_wrapper') view_toolbar = g.get_widget('view_toolbar_mni') self._ToolbarComponent__visible = gaw.data_toggle_button(toggle = view_toolbar, key = '/apps/serpentine/view_toolbar', default = True) view_toolbar.connect('toggled', self._ToolbarComponent__on_toolbar_visible) self._ToolbarComponent__on_style_change() self._ToolbarComponent__on_detachable_change() self._ToolbarComponent__on_toolbar_visible() def __on_toolbar_visible(self, *args): if self._ToolbarComponent__visible.data: self.wrapper.show() else: self.wrapper.hide() def __on_detachable_change(self, *args): widget = self.wrapper.get_children()[0] if self.detachable: if widget == self.handle: return None self.wrapper.remove(widget) self.wrapper.add(self.handle) self.handle.add(self.toolbar) elif widget == self.toolbar: return None self.handle.remove(self.toolbar) self.wrapper.remove(widget) self.wrapper.add(self.toolbar) def __on_style_change(self, *args): self.toolbar.set_style(self.style) def detachable(self): try: detachable = self._ToolbarComponent__detachable.data except: detachable = False if not isinstance(detachable, bool): detachable = False return detachable detachable = property(detachable) def style(self): try: style = self._ToolbarComponent__style.data except: style = 'both' if style in ToolbarComponent.Style: return ToolbarComponent.Style[style] else: return ToolbarComponent.Style['both'] style = property(style) class SerpentineWindow(gtk.Window, OperationListener, operations.Operation, Component): components = (AddFileComponent, PlaylistComponent, SavePlaylistComponent, ToolbarComponent) def __init__(self, application): gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) operations.Operation.__init__(self) Component.__init__(self, application) self._SerpentineWindow__application = application self._SerpentineWindow__masterer = AudioMastering(application) self._SerpentineWindow__running = False self.connect('show', self._SerpentineWindow__on_show) self.music_list_widget.listeners.append(self) glade_file = application.locations.get_data_file('serpentine.glade') g = gtk.glade.XML(glade_file, 'main_window_container') for c in self._components: if hasattr(c, '_setup_glade'): c._setup_glade(g) continue self.add(g.get_widget('main_window_container')) self.set_title('Serpentine') self.set_default_size(450, 350) self.set_icon_name('gnome-dev-cdrom-audio') self._SerpentineWindow__write_to_disc = MapProxy(dict(button = g.get_widget('write_to_disc'), menu = g.get_widget('write_to_disc_mni'))) self._SerpentineWindow__write_to_disc.set_sensitive(False) self._SerpentineWindow__write_to_disc['button'].connect('clicked', self._SerpentineWindow__on_write_files) self._SerpentineWindow__write_to_disc['menu'].connect('activate', self._SerpentineWindow__on_write_files) box = self.get_child() self.music_list_widget.show() box.add(self.music_list_widget) g.get_widget('preferences_mni').connect('activate', self._SerpentineWindow__on_preferences) self.remove = MapProxy({ 'menu': g.get_widget('remove_mni'), 'button': g.get_widget('remove') }) self.remove['menu'].connect('activate', self._SerpentineWindow__on_remove_file) self.remove['button'].connect('clicked', self._SerpentineWindow__on_remove_file) self.remove.set_sensitive(False) self.clear = MapProxy({ 'menu': g.get_widget('clear_mni'), 'button': g.get_widget('clear') }) self.clear['button'].connect('clicked', self.clear_files) self.clear['menu'].connect('activate', self.clear_files) self.clear.set_sensitive(False) g.get_widget('quit_mni').connect('activate', self.stop) self.connect('delete-event', self.stop) g.get_widget('about_mni').connect('activate', self._SerpentineWindow__on_about) self.on_contents_changed() if self._SerpentineWindow__application.preferences.drive is None: gtkutil.dialog_warn(_('No recording drive found'), _("No recording drive found on your system, therefore some of Serpentine's functionalities will be disabled."), parent = self) g.get_widget('preferences_mni').set_sensitive(False) self._SerpentineWindow__write_to_disc.set_sensitive(False) self._SerpentineWindow__load_playlist() music_list_widget = property((lambda self: self._SerpentineWindow__masterer)) music_list = property((lambda self: self._SerpentineWindow__masterer.music_list)) can_start = property((lambda self: True)) can_stop = property((lambda self: True)) masterer = property((lambda self: self._SerpentineWindow__masterer)) application = property((lambda self: self._SerpentineWindow__application)) def __on_show(self, *args): self._SerpentineWindow__running = True def __load_playlist(self): '''Private method for loading the internal playlist.''' try: self._SerpentineWindow__application.preferences.loadPlaylist(self.music_list_widget.source) except: import traceback traceback.print_exc() def on_selection_changed(self, *args): self.remove.set_sensitive(self.music_list_widget.count_selected() > 0) def on_contents_changed(self, *args): is_sensitive = len(self.music_list_widget.source) > 0 self.clear.set_sensitive(is_sensitive) if self._SerpentineWindow__application.preferences.drive is not None: self._SerpentineWindow__write_to_disc.set_sensitive(is_sensitive) def __on_remove_file(self, *args): self.music_list_widget.remove_selected() def clear_files(self, *args): self.music_list_widget.source.clear() def __on_preferences(self, *args): self._SerpentineWindow__application.preferences.dialog.run() self._SerpentineWindow__application.preferences.dialog.hide() def __on_about(self, widget, *args): a = gtk.AboutDialog() a.set_name('Serpentine') a.set_version(self._SerpentineWindow__application.preferences.version) a.set_website('http://s1x.homelinux.net/projects/serpentine') a.set_copyright('2004-2006 Tiago Cogumbreiro') a.set_transient_for(self) a.run() a.hide() def __on_write_files(self, *args): try: validate_music_list(self.music_list_widget.source, self.application.preferences) except SerpentineCacheError: err = None show_prefs = False if err.error_id == SerpentineCacheError.INVALID: title = _('Cache directory location unavailable') show_prefs = True elif err.error_id == SerpentineCacheError.NO_SPACE: title = _('Not enough space on cache directory') gtkutil.dialog_warn(title, err.error_message, parent = self) return None if self.music_list_widget.source.total_duration > self.music_list_widget.disc_size: title = _('Do you want to overburn your disc?') msg = _("You are about to record a media disc in overburn mode. This may not work on all drives and shouldn't give you more then a couple of minutes.") btn = _('Write to Disc (Overburning)') self._SerpentineWindow__application.preferences.overburn = True else: title = _('Do you want to record your music?') msg = _('You are about to record a media disc. Canceling a writing operation will make your disc unusable.') btn = _('Write to Disc') self._SerpentineWindow__application.preferences.overburn = False if gtkutil.dialog_ok_cancel(title, msg, parent = self, ok_button = btn) != gtk.RESPONSE_OK: return None self.application.write_files().start() start = gtk.Window.show def stop(self, *args): self._send_finished_event(operations.SUCCESSFUL) self.hide()