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 / preferences.py < prev    next >
Encoding:
Python Source  |  2006-08-23  |  10.9 KB  |  378 lines

  1. # Copyright (C) 2004 Tiago Cogumbreiro <cogumbreiro@users.sf.net>
  2. #
  3. # This program is free software; you can redistribute it and/or modify
  4. # it under the terms of the GNU General Public License as published by
  5. # the Free Software Foundation; either version 2 of the License, or
  6. # (at your option) any later version.
  7. #
  8. # This program is distributed in the hope that it will be useful,
  9. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. # GNU General Public License for more details.
  12. #
  13. # You should have received a copy of the GNU General Public License
  14. # along with this program; if not, write to the Free Software
  15. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  16. #
  17. # Authors: Tiago Cogumbreiro <cogumbreiro@users.sf.net>
  18.  
  19. import nautilusburn
  20. import os
  21. import gconf
  22. import gtk
  23.  
  24. from gtk import glade
  25. from os import path
  26. from types import StringType
  27. from gettext import gettext as _
  28.  
  29. # Local imports
  30. import gaw
  31. import xspf
  32. import gtkutil
  33. import release
  34. import urlutil
  35.  
  36. from converting import GvfsMusicPool
  37. from common import SafeFileWrite
  38.  
  39. GCONF_DIR = "/apps/serpentine"
  40. RAT_GCONF_DIR = "/apps/rat"
  41. NCB_GCONF_DIR = "/apps/nautilus-cd-burner"
  42.  
  43. for gconf_dir in (GCONF_DIR, RAT_GCONF_DIR, NCB_GCONF_DIR):
  44.     gconf.client_get_default ().add_dir (gconf_dir, gconf.CLIENT_PRELOAD_NONE)
  45.  
  46. def recordingPreferencesWindow (preferences):
  47.     prefs_widget = gtkutil.find_child_widget (preferences.dialog, "preferences")
  48.     prefs_widget.show ()
  49.     
  50.     assert prefs_widget is not None
  51.     parent = prefs_widget.get_parent ()
  52.     parent.remove (prefs_widget)
  53.     
  54.     win = gtk.Window (gtk.WINDOW_TOPLEVEL)
  55.     win.set_border_width (12)
  56.     win.set_title (_("Serpentine Preferences"))
  57.     
  58.     vbox = gtk.VBox ()
  59.     vbox.set_spacing (18)
  60.     vbox.show ()
  61.     win.add (vbox)
  62.     
  63.     vbox.pack_start (prefs_widget)
  64.     
  65.     # Add a close button
  66.     bbox = gtk.HButtonBox ()
  67.     bbox.set_layout (gtk.BUTTONBOX_END)
  68.     bbox.show ()
  69.     vbox.add (bbox)
  70.     
  71.     close_btn = gtk.Button (stock = "gtk-close")
  72.     close_btn.show ()
  73.     close_btn.connect ("clicked", gtk.main_quit)
  74.     bbox.add (close_btn)
  75.     
  76.     return win
  77.  
  78. class HideCloseButton:
  79.     """
  80.     Monitors the 'rat' key for showing/hiding the close button.
  81.     """
  82.     def __init__(self, close_button):
  83.         self.button = close_button
  84.         self.use_button = gaw.GConfValue (
  85.             key = RAT_GCONF_DIR + "/use_close_button",
  86.             data_spec = gaw.Spec.BOOL,
  87.             default = True
  88.         )
  89.         self.use_button.set_callback(self.on_update)
  90.         self.on_update()
  91.     
  92.     def on_update(self, *args):
  93.         if not self.use_button.data:
  94.             self.button.hide()
  95.         else:
  96.             self.button.show()
  97.  
  98. class WriteSpeed:
  99.     """
  100.     Handles and monitors writing speed related widgets state.
  101.     """
  102.     def __init__(self, g, get_drive):
  103.         self.get_drive = get_drive
  104.         
  105.         self.__speed = gaw.data_spin_button (g.get_widget("speed"),
  106.                                              GCONF_DIR + "/write_speed")
  107.         
  108.         self.__specify_speed = g.get_widget ("specify_speed_wrapper")
  109.                                              
  110.         specify_speed = g.get_widget ("specify_speed")
  111.         
  112.         self.__speed_select = gaw.RadioButtonData (
  113.             widgets = dict (
  114.                 specify_speed = specify_speed,
  115.                 use_max_speed = g.get_widget ("use_max_speed")
  116.             ),
  117.             
  118.             key = GCONF_DIR + "/speed_select"
  119.         )
  120.         self.__speed_select.seleted_by_default = "use_max_speed"
  121.         
  122.         specify_speed.connect ("toggled", self.__on_specify_speed)
  123.         g.get_widget ("refresh_speed").connect ("clicked", self.__on_refresh_speed)
  124.         
  125.         # init specify speed box sensitivity
  126.         self.__on_specify_speed (specify_speed)
  127.         
  128.         # No default value set, set it to 99
  129.         if self.__speed.data == 0:
  130.             self.__speed.data = 99
  131.  
  132.         self.__update_speed ()
  133.         self.__speed.sync_widget()
  134.         self.__speed.widget.set_sensitive (specify_speed.get_active ())
  135.         
  136.     def get(self):
  137.         assert self.get_drive() is not None
  138.         self.__update_speed()
  139.  
  140.         if self.__speed_select.data == "use_max_speed":
  141.             return self.get_drive().get_max_speed_write ()
  142.         return self.__speed.data
  143.  
  144.     def __on_refresh_speed (self, *args):
  145.         self.__update_speed ()
  146.  
  147.     def __update_speed (self):
  148.         drive = self.get_drive()
  149.         if drive is None:
  150.             self.__speed.widget.set_sensitive (False)
  151.             return
  152.             
  153.         speed = drive.get_max_speed_write ()
  154.         assert speed >= 0, speed
  155.  
  156.         val = self.__speed.data
  157.  
  158.         self.__speed.widget.set_range (1, speed)
  159.         self.__speed.data = val
  160.         
  161.     def __on_specify_speed (self, widget, *args):
  162.         self.__specify_speed.set_sensitive (widget.get_active ())
  163.     
  164.  
  165. class RecordingPreferences (object):
  166.     debug = False
  167.     overburn = False
  168.     simulate = False
  169.     
  170.     def __init__ (self, locations):
  171.         # By default use burnproof
  172.         self.__write_flags = nautilusburn.RECORDER_WRITE_BURNPROOF
  173.         # Sets up data dir and version
  174.         self.version = release.version
  175.  
  176.         # setup ui
  177.         filename = locations.get_data_file("serpentine.glade")
  178.         g = glade.XML (filename, "preferences_dialog")
  179.         self.__dialog = g.get_widget ("preferences_dialog")
  180.         self.dialog.connect ("destroy-event", self.__on_destroy)
  181.         self.dialog.set_title ("")
  182.         
  183.         # Drive selection
  184.         drv = g.get_widget ("drive")
  185.         cmb_drv = nautilusburn.DriveSelection ()
  186.         cmb_drv.set_property ("show-recorders-only", True)
  187.         cmb_drv.show ()
  188.         
  189.         self.__drive_selection = cmb_drv
  190.         drv.pack_start (cmb_drv, False, False)
  191.         
  192.         # Speed selection
  193.         self.__speed = WriteSpeed(g, self.__drive_selection.get_drive)
  194.         
  195.         # eject checkbox
  196.         self.__eject = gaw.data_toggle_button (g.get_widget ("eject"),
  197.                                                GCONF_DIR + "/eject")
  198.         
  199.         # use gap checkbox
  200.         self.__use_gap = gaw.data_toggle_button (
  201.             g.get_widget ("use_gap"),
  202.             GCONF_DIR + "/use_gap",
  203.             default = True
  204.         )
  205.         
  206.         # temp
  207.         ncb_temp_dir = NCB_GCONF_DIR + "/temp_iso_dir"
  208.         gconf.client_get_default ().add_dir (ncb_temp_dir, gconf.CLIENT_PRELOAD_NONE)
  209.         self.__tmp = gaw.GConfValue (
  210.             key = ncb_temp_dir,
  211.             data_spec = gaw.Spec.STRING,
  212.             default = "file:///tmp"
  213.         )
  214.         
  215.         # debug
  216.         self.__debug = gaw.GConfValue (
  217.             key = GCONF_DIR + "/debug_mode",
  218.             data_spec = gaw.Spec.BOOL,
  219.             default = False
  220.         )
  221.         
  222.         # Pool
  223.         self.__pool = GvfsMusicPool ()
  224.         
  225.         # Close button
  226.         self.__close_button_handler = HideCloseButton(g.get_widget("close_btn"))
  227.  
  228.     
  229.     ############################################################################
  230.     # Properties
  231.     
  232.     ############
  233.     # configDir
  234.     __config_dir = path.join (path.expanduser ("~"), ".serpentine")
  235.     def getConfigDir (self):
  236.         return self.__config_dir
  237.         
  238.     configDir = property (lambda self: self.__config_dir)
  239.     
  240.     #########
  241.     # dialog
  242.     def getDialog (self):
  243.         return self.__dialog
  244.         
  245.     dialog = property (getDialog)
  246.     
  247.     ##########
  248.     # version
  249.     def setVersion (self, version):
  250.         assert isinstance (version, StringType)
  251.         self.__version = version
  252.         
  253.     def getVersion (self):
  254.         return self.__version
  255.         
  256.     version = property (getVersion, setVersion)
  257.     
  258.     ########
  259.     # drive
  260.     def getDrive (self):
  261.         return self.__drive_selection.get_drive()
  262.         
  263.     drive = property (getDrive)
  264.     
  265.     ##############
  266.     # useGnomeVfs
  267.     def getUseGnomeVfs(self):
  268.         return self.__pool.use_gnomevfs
  269.     
  270.     def setUseGnomeVfs(self, use_gnomevfs):
  271.         self.__pool.use_gnomevfs = use_gnomevfs
  272.     
  273.     useGnomeVfs = property(getUseGnomeVfs, setUseGnomeVfs)
  274.     
  275.     ###############
  276.     # temporaryDir
  277.     def getTemporaryDir (self):
  278.         tmp = self.__tmp.data
  279.         url = urlutil.UrlParse(tmp)
  280.         if url.is_local:
  281.             return url.path
  282.             
  283.         
  284.     temporaryDir = property (getTemporaryDir)
  285.     
  286.     ##############
  287.     # useGap
  288.     def getUseGap(self):
  289.         return self.__use_gap.data
  290.     
  291.     useGap = property(getUseGap)
  292.  
  293.     #########
  294.     # pool
  295.     def getPool (self):
  296.         return self.__pool
  297.         
  298.     pool = property (getPool)
  299.  
  300.     ##############
  301.     # speedWrite
  302.     def getSpeedWrite (self):
  303.         return self.__speed.get()
  304.         
  305.     speedWrite = property (getSpeedWrite)
  306.     
  307.     ################
  308.     # writeFlags
  309.     def getWriteFlags (self):
  310.         ret = self.__write_flags
  311.         if not self.__use_gap.data:
  312.             ret |= nautilusburn.RECORDER_WRITE_DISC_AT_ONCE
  313.         if self.__eject.data:
  314.             ret |= nautilusburn.RECORDER_WRITE_EJECT
  315.         if self.debug:
  316.             ret |= nautilusburn.RECORDER_WRITE_DEBUG
  317.         if self.overburn:
  318.             ret |= nautilusburn.RECORDER_WRITE_OVERBURN
  319.         if self.simulate:
  320.             ret |= nautilusburn.RECORDER_WRITE_DUMMY_WRITE
  321.  
  322.         return ret
  323.         
  324.     writeFlags = property (getWriteFlags)
  325.  
  326.     ####################
  327.     # temporaryDirIsOk
  328.     def getTemporaryDirIsOk (self):
  329.         tmp = self.temporaryDir
  330.         # Try to open the local file
  331.         try:
  332.             is_ok = path.isdir (tmp) and os.access (tmp, os.W_OK)
  333.         except OSError, err:
  334.             print err
  335.             is_ok = False
  336.         return is_ok
  337.         
  338.     temporaryDirIsOk = property (getTemporaryDirIsOk,
  339.                                     doc=("Tests if temporary directory exists "
  340.                                     "and has write permissions."))
  341.     
  342.     
  343.     #############################
  344.     # Methods
  345.     def __on_destroy (self, *args):
  346.         self.dialog.hide ()
  347.         return False
  348.  
  349.     def savePlaylist (self, source):
  350.         if not path.exists (self.configDir):
  351.             os.makedirs (self.configDir)
  352.         p = xspf.Playlist (title=_("Serpentine's playlist"), creator="Serpentine " + self.version)
  353.         source.to_playlist (p)
  354.         doc = p.toxml()
  355.         
  356.         out = SafeFileWrite (path.join (self.configDir, "playlist.xml"))
  357.         try:
  358.             doc.writexml (out, addindent = "\t", newl = "\n")
  359.             del p
  360.             out.close()
  361.         except:
  362.             out.abort ()
  363.             return False
  364.             
  365.         return True
  366.     
  367.     def loadPlaylist (self, source):
  368.         if not path.exists (self.configDir):
  369.             os.makedirs (self.configDir)
  370.         p = xspf.Playlist (title=_("Serpentine's playlist"), creator="Serpentine " + self.version)
  371.         
  372.         try:
  373.             p.parse (path.join (self.configDir, "playlist.xml"))
  374.         except IOError:
  375.             return
  376.             
  377.         source.from_playlist (p)
  378.