home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / lib / python2.4 / site-packages / serpentine / mainwindow.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-08-31  |  17.4 KB  |  442 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. import gtk
  5. import os
  6. import os.path as os
  7. import gobject
  8. import operations
  9. import gaw
  10. import gtkutil
  11. from components import Component
  12. from operations import MapProxy, OperationListener
  13. from mastering import AudioMastering
  14. from serpentine.common import SerpentineNotSupportedError, validate_music_list
  15. from serpentine.common import SerpentineCacheError
  16. from gettext import gettext as _
  17.  
  18. class GladeComponent(Component):
  19.     
  20.     def _setup_glade(self, g):
  21.         '''This method is called when the SerpentineWindow object is created.'''
  22.         pass
  23.  
  24.  
  25.  
  26. class FileDialogComponent(GladeComponent):
  27.     
  28.     def __init__(self, parent):
  29.         super(FileDialogComponent, self).__init__(parent)
  30.         self.file_dlg = gtk.FileChooserDialog(parent = self.parent, buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
  31.         self.file_dlg.set_title('')
  32.         self.file_dlg.set_transient_for(self.parent)
  33.         self.file_dlg.set_current_folder(os.path.expanduser('~'))
  34.         self._FileDialogComponent__file_filters = None
  35.  
  36.     
  37.     def run_dialog(self, *args):
  38.         self._FileDialogComponent__sync_file_filters()
  39.         if self.file_dlg.run() == gtk.RESPONSE_OK:
  40.             self._on_response_ok()
  41.         
  42.         self._on_response_fail()
  43.         self.file_dlg.unselect_all()
  44.         self.file_dlg.hide()
  45.  
  46.     
  47.     def _on_response_ok(self):
  48.         pass
  49.  
  50.     
  51.     def _on_response_fail(self):
  52.         pass
  53.  
  54.     
  55.     def _get_file_filter(self):
  56.         raise NotImplementedError
  57.  
  58.     
  59.     def __sync_file_filters(self):
  60.         file_filters = self._get_file_filters()
  61.         if file_filters == self._FileDialogComponent__file_filters:
  62.             return None
  63.         
  64.         for filter in self.file_dlg.list_filters():
  65.             self.file_dlg.remove_filter(filter)
  66.         
  67.         self._FileDialogComponent__file_filters = file_filters
  68.         for filter in file_filters:
  69.             self.file_dlg.add_filter(filter)
  70.         
  71.  
  72.  
  73.  
  74. class AddFileComponent(FileDialogComponent):
  75.     
  76.     def _setup_glade(self, g):
  77.         g.get_widget('add').connect('clicked', self.run_dialog)
  78.         g.get_widget('add_mni').connect('activate', self.run_dialog)
  79.         self.file_dlg.set_select_multiple(True)
  80.  
  81.     
  82.     def _on_response_ok(self):
  83.         files = self.file_dlg.get_uris()
  84.         self.parent.music_list_widget.music_list_gateway.add_files(files).start()
  85.  
  86.     
  87.     _get_file_filters = lambda self: self.parent.application.music_file_filters
  88.  
  89.  
  90. class PlaylistComponent(FileDialogComponent):
  91.     
  92.     def _setup_glade(self, g):
  93.         g.get_widget('open_playlist_mni').connect('activate', self.run_dialog)
  94.  
  95.     
  96.     _get_file_filters = lambda self: self.parent.application.playlist_file_filters
  97.     
  98.     def _on_response_ok(self):
  99.         playlist = self.file_dlg.get_uri()
  100.         self.parent.music_list_widget.music_list_gateway.add_files([
  101.             playlist]).start()
  102.         self.parent.clear_files()
  103.  
  104.  
  105.  
  106. class SavePlaylistComponent(GladeComponent):
  107.     
  108.     def _setup_glade(self, g):
  109.         g.get_widget('save_playlist_mni').connect('activate', self.run_dialog)
  110.         self.file_dlg = gtk.FileChooserDialog(action = gtk.FILE_CHOOSER_ACTION_SAVE, buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK))
  111.         self.file_dlg.set_title('')
  112.         self.file_dlg.set_transient_for(self.parent)
  113.         self.file_dlg.set_current_folder(os.path.expanduser('~'))
  114.         hbox = gtk.HBox(spacing = 6)
  115.         hbox.show()
  116.         lbl = gtk.Label(_('Save playlist in format:'))
  117.         lbl.show()
  118.         hbox.pack_start(lbl, False, False)
  119.         store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
  120.         cmb = gtk.ComboBox(store)
  121.         cmb.show()
  122.         cell = gtk.CellRendererText()
  123.         cmb.pack_start(cell, True)
  124.         cmb.add_attribute(cell, 'text', 0)
  125.         self.combo = cmb
  126.         hbox.pack_start(cmb, False, False)
  127.         self.store = store
  128.         store.append((_('Detect by extension'), ''))
  129.         cmb.set_active(0)
  130.         self.file_dlg.set_extra_widget(hbox)
  131.         app = self.parent.application
  132.         app.savePlaylist.listeners.append(self)
  133.         self._SavePlaylistComponent__sync = True
  134.  
  135.     
  136.     def on_registred(self, factory, extension, description):
  137.         self._SavePlaylistComponent__sync = True
  138.         self.store.append(('%s (%s)' % (description, extension), extension))
  139.  
  140.     
  141.     def on_finished(self, evt):
  142.         win = self.parent
  143.         if evt.id != operations.SUCCESSFUL:
  144.             gtkutil.dialog_error(_('Playlist Not Saved'), _('There was an error while saving the playlist.'), parent = win)
  145.         
  146.  
  147.     
  148.     def __sync_file_filters(self):
  149.         if not self._SavePlaylistComponent__sync:
  150.             return None
  151.         
  152.         app = self.parent.application
  153.         for f in self.file_dlg.list_filters():
  154.             self.file_dlg.remove_filter(f)
  155.         
  156.         for f in app.savePlaylist.file_filters:
  157.             self.file_dlg.add_filter(f)
  158.         
  159.         self._SavePlaylistComponent__sync = False
  160.  
  161.     
  162.     def run_dialog(self, *args):
  163.         app = self.parent.application
  164.         win = self.parent
  165.         self._SavePlaylistComponent__sync_file_filters()
  166.         while self.file_dlg.run() == gtk.RESPONSE_OK:
  167.             filename = self.file_dlg.get_filename()
  168.             basename = os.path.basename(filename)
  169.             index = self.combo.get_active()
  170.             if index == 0:
  171.                 extension = None
  172.             else:
  173.                 extension = self.store[index][1]
  174.             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:
  175.                 self.file_dlg.unselect_all()
  176.                 self.file_dlg.hide()
  177.                 return None
  178.             
  179.             
  180.             try:
  181.                 oper = app.savePlaylist.save(filename, extension)
  182.                 oper.listeners.append(self)
  183.                 oper.start()
  184.             continue
  185.             except SerpentineNotSupportedError:
  186.                 if extension is None:
  187.                     items = map((lambda row: row[0]), self.store)
  188.                     del items[0]
  189.                     (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)
  190.                     if len(indexes) != 0:
  191.                         (index,) = indexes
  192.                         index += 1
  193.                         row = self.store[index]
  194.                         extension = row[1]
  195.                         oper = app.savePlaylist.save(filename, extension)
  196.                         oper.listeners.append(self)
  197.                         oper.start()
  198.                         self.combo.set_active(index)
  199.                         break
  200.                     
  201.                 else:
  202.                     gtkutil.dialog_error(_('Unsupported Format'), _('The playlist format you used (by the file extension) is currently not supported.'), parent = win)
  203.                 extension is None
  204.             
  205.  
  206.             None<EXCEPTION MATCH>SerpentineNotSupportedError
  207.         self.file_dlg.unselect_all()
  208.         self.file_dlg.hide()
  209.  
  210.  
  211.  
  212. class ToolbarComponent(GladeComponent):
  213.     Style = {
  214.         'both': gtk.TOOLBAR_BOTH,
  215.         'both-horiz': gtk.TOOLBAR_BOTH_HORIZ,
  216.         'icons': gtk.TOOLBAR_ICONS,
  217.         'text': gtk.TOOLBAR_TEXT }
  218.     
  219.     def _setup_glade(self, g):
  220.         self._ToolbarComponent__style = gaw.GConfValue(key = '/desktop/gnome/interface/toolbar_style', data_spec = gaw.Spec.STRING)
  221.         self._ToolbarComponent__style.set_callback(self._ToolbarComponent__on_style_change)
  222.         self._ToolbarComponent__detachable = gaw.GConfValue(key = '/desktop/gnome/interface/toolbar_detachable', data_spec = gaw.Spec.BOOL)
  223.         self._ToolbarComponent__detachable.set_callback(self._ToolbarComponent__on_detachable_change)
  224.         self.toolbar = g.get_widget('main_toolbar')
  225.         self.handle = g.get_widget('main_handle')
  226.         self.wrapper = g.get_widget('main_toolbar_wrapper')
  227.         view_toolbar = g.get_widget('view_toolbar_mni')
  228.         self._ToolbarComponent__visible = gaw.data_toggle_button(toggle = view_toolbar, key = '/apps/serpentine/view_toolbar', default = True)
  229.         view_toolbar.connect('toggled', self._ToolbarComponent__on_toolbar_visible)
  230.         self._ToolbarComponent__on_style_change()
  231.         self._ToolbarComponent__on_detachable_change()
  232.         self._ToolbarComponent__on_toolbar_visible()
  233.  
  234.     
  235.     def __on_toolbar_visible(self, *args):
  236.         if self._ToolbarComponent__visible.data:
  237.             self.wrapper.show()
  238.         else:
  239.             self.wrapper.hide()
  240.  
  241.     
  242.     def __on_detachable_change(self, *args):
  243.         widget = self.wrapper.get_children()[0]
  244.         if self.detachable:
  245.             if widget == self.handle:
  246.                 return None
  247.             
  248.             self.wrapper.remove(widget)
  249.             self.wrapper.add(self.handle)
  250.             self.handle.add(self.toolbar)
  251.         elif widget == self.toolbar:
  252.             return None
  253.         
  254.         self.handle.remove(self.toolbar)
  255.         self.wrapper.remove(widget)
  256.         self.wrapper.add(self.toolbar)
  257.  
  258.     
  259.     def __on_style_change(self, *args):
  260.         self.toolbar.set_style(self.style)
  261.  
  262.     
  263.     def detachable(self):
  264.         
  265.         try:
  266.             detachable = self._ToolbarComponent__detachable.data
  267.         except:
  268.             detachable = False
  269.  
  270.         if not isinstance(detachable, bool):
  271.             detachable = False
  272.         
  273.         return detachable
  274.  
  275.     detachable = property(detachable)
  276.     
  277.     def style(self):
  278.         
  279.         try:
  280.             style = self._ToolbarComponent__style.data
  281.         except:
  282.             style = 'both'
  283.  
  284.         if style in ToolbarComponent.Style:
  285.             return ToolbarComponent.Style[style]
  286.         else:
  287.             return ToolbarComponent.Style['both']
  288.  
  289.     style = property(style)
  290.  
  291.  
  292. class SerpentineWindow(gtk.Window, OperationListener, operations.Operation, Component):
  293.     components = (AddFileComponent, PlaylistComponent, SavePlaylistComponent, ToolbarComponent)
  294.     
  295.     def __init__(self, application):
  296.         gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
  297.         operations.Operation.__init__(self)
  298.         Component.__init__(self, application)
  299.         self._SerpentineWindow__application = application
  300.         self._SerpentineWindow__masterer = AudioMastering(application)
  301.         self._SerpentineWindow__running = False
  302.         self.connect('show', self._SerpentineWindow__on_show)
  303.         self.music_list_widget.listeners.append(self)
  304.         glade_file = application.locations.get_data_file('serpentine.glade')
  305.         g = gtk.glade.XML(glade_file, 'main_window_container')
  306.         for c in self._components:
  307.             if hasattr(c, '_setup_glade'):
  308.                 c._setup_glade(g)
  309.                 continue
  310.         
  311.         self.add(g.get_widget('main_window_container'))
  312.         self.set_title('Serpentine')
  313.         self.set_default_size(450, 350)
  314.         self.set_icon_name('gnome-dev-cdrom-audio')
  315.         self._SerpentineWindow__write_to_disc = MapProxy(dict(button = g.get_widget('write_to_disc'), menu = g.get_widget('write_to_disc_mni')))
  316.         self._SerpentineWindow__write_to_disc.set_sensitive(False)
  317.         self._SerpentineWindow__write_to_disc['button'].connect('clicked', self._SerpentineWindow__on_write_files)
  318.         self._SerpentineWindow__write_to_disc['menu'].connect('activate', self._SerpentineWindow__on_write_files)
  319.         box = self.get_child()
  320.         self.music_list_widget.show()
  321.         box.add(self.music_list_widget)
  322.         g.get_widget('preferences_mni').connect('activate', self._SerpentineWindow__on_preferences)
  323.         self.remove = MapProxy({
  324.             'menu': g.get_widget('remove_mni'),
  325.             'button': g.get_widget('remove') })
  326.         self.remove['menu'].connect('activate', self._SerpentineWindow__on_remove_file)
  327.         self.remove['button'].connect('clicked', self._SerpentineWindow__on_remove_file)
  328.         self.remove.set_sensitive(False)
  329.         self.clear = MapProxy({
  330.             'menu': g.get_widget('clear_mni'),
  331.             'button': g.get_widget('clear') })
  332.         self.clear['button'].connect('clicked', self.clear_files)
  333.         self.clear['menu'].connect('activate', self.clear_files)
  334.         self.clear.set_sensitive(False)
  335.         g.get_widget('quit_mni').connect('activate', self.stop)
  336.         self.connect('delete-event', self.stop)
  337.         g.get_widget('about_mni').connect('activate', self._SerpentineWindow__on_about)
  338.         self.on_contents_changed()
  339.         if self._SerpentineWindow__application.preferences.drive is None:
  340.             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)
  341.             g.get_widget('preferences_mni').set_sensitive(False)
  342.             self._SerpentineWindow__write_to_disc.set_sensitive(False)
  343.         
  344.         self._SerpentineWindow__load_playlist()
  345.  
  346.     music_list_widget = property((lambda self: self._SerpentineWindow__masterer))
  347.     music_list = property((lambda self: self._SerpentineWindow__masterer.music_list))
  348.     can_start = property((lambda self: True))
  349.     can_stop = property((lambda self: True))
  350.     masterer = property((lambda self: self._SerpentineWindow__masterer))
  351.     application = property((lambda self: self._SerpentineWindow__application))
  352.     
  353.     def __on_show(self, *args):
  354.         self._SerpentineWindow__running = True
  355.  
  356.     
  357.     def __load_playlist(self):
  358.         '''Private method for loading the internal playlist.'''
  359.         
  360.         try:
  361.             self._SerpentineWindow__application.preferences.loadPlaylist(self.music_list_widget.source)
  362.         except:
  363.             import traceback
  364.             traceback.print_exc()
  365.  
  366.  
  367.     
  368.     def on_selection_changed(self, *args):
  369.         self.remove.set_sensitive(self.music_list_widget.count_selected() > 0)
  370.  
  371.     
  372.     def on_contents_changed(self, *args):
  373.         is_sensitive = len(self.music_list_widget.source) > 0
  374.         self.clear.set_sensitive(is_sensitive)
  375.         if self._SerpentineWindow__application.preferences.drive is not None:
  376.             self._SerpentineWindow__write_to_disc.set_sensitive(is_sensitive)
  377.         
  378.  
  379.     
  380.     def __on_remove_file(self, *args):
  381.         self.music_list_widget.remove_selected()
  382.  
  383.     
  384.     def clear_files(self, *args):
  385.         self.music_list_widget.source.clear()
  386.  
  387.     
  388.     def __on_preferences(self, *args):
  389.         self._SerpentineWindow__application.preferences.dialog.run()
  390.         self._SerpentineWindow__application.preferences.dialog.hide()
  391.  
  392.     
  393.     def __on_about(self, widget, *args):
  394.         a = gtk.AboutDialog()
  395.         a.set_name('Serpentine')
  396.         a.set_version(self._SerpentineWindow__application.preferences.version)
  397.         a.set_website('http://s1x.homelinux.net/projects/serpentine')
  398.         a.set_copyright('2004-2006 Tiago Cogumbreiro')
  399.         a.set_transient_for(self)
  400.         a.run()
  401.         a.hide()
  402.  
  403.     
  404.     def __on_write_files(self, *args):
  405.         
  406.         try:
  407.             validate_music_list(self.music_list_widget.source, self.application.preferences)
  408.         except SerpentineCacheError:
  409.             err = None
  410.             show_prefs = False
  411.             if err.error_id == SerpentineCacheError.INVALID:
  412.                 title = _('Cache directory location unavailable')
  413.                 show_prefs = True
  414.             elif err.error_id == SerpentineCacheError.NO_SPACE:
  415.                 title = _('Not enough space on cache directory')
  416.             
  417.             gtkutil.dialog_warn(title, err.error_message, parent = self)
  418.             return None
  419.  
  420.         if self.music_list_widget.source.total_duration > self.music_list_widget.disc_size:
  421.             title = _('Do you want to overburn your disc?')
  422.             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.")
  423.             btn = _('Write to Disc (Overburning)')
  424.             self._SerpentineWindow__application.preferences.overburn = True
  425.         else:
  426.             title = _('Do you want to record your music?')
  427.             msg = _('You are about to record a media disc. Canceling a writing operation will make your disc unusable.')
  428.             btn = _('Write to Disc')
  429.             self._SerpentineWindow__application.preferences.overburn = False
  430.         if gtkutil.dialog_ok_cancel(title, msg, parent = self, ok_button = btn) != gtk.RESPONSE_OK:
  431.             return None
  432.         
  433.         self.application.write_files().start()
  434.  
  435.     start = gtk.Window.show
  436.     
  437.     def stop(self, *args):
  438.         self._send_finished_event(operations.SUCCESSFUL)
  439.         self.hide()
  440.  
  441.  
  442.