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 / gaw.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-08-31  |  12.8 KB  |  363 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. """
  5. GConf Widget Persistency is a module for maintaining persistency between your
  6. existing widgets and the GConf keys. Not only it forces the schema you've
  7. defined for the key but also preserves the widget state, for example making it
  8. insensitive when the GConf key is insensitive.
  9.  
  10. It also implements a representation of a gconf key (GConfValue) that handles
  11. the repetitive hassles of a maintaining its integrity. 
  12. """
  13. import gconf
  14. import gobject
  15.  
  16. class Spec(object):
  17.     
  18.     def __init__(self, name, gconf_type, py_type, default):
  19.         self._Spec__gconf_type = gconf_type
  20.         self._Spec__py_type = py_type
  21.         self._Spec__default = default
  22.         self._Spec__name = name
  23.  
  24.     gconf_type = property((lambda self: self._Spec__gconf_type))
  25.     py_type = property((lambda self: self._Spec__py_type))
  26.     default = property((lambda self: self._Spec__default))
  27.     name = property((lambda self: self._Spec__name))
  28.  
  29. Spec.STRING = Spec('string', gconf.VALUE_STRING, str, '')
  30. Spec.FLOAT = Spec('float', gconf.VALUE_FLOAT, float, 0.0)
  31. Spec.INT = Spec('int', gconf.VALUE_INT, int, 0)
  32. Spec.BOOL = Spec('bool', gconf.VALUE_BOOL, bool, True)
  33.  
  34. def data_file_chooser(button, key, use_directory = False, use_uri = True, default = None, client = None):
  35.     """
  36.     Returns a gaw.Data.
  37.     
  38.     use_directory - boolean variable setting if it's we're using files or directories.
  39.     use_uri - boolean variable setting if we're using URI's or normal filenames.
  40.     
  41.     Associates a gaw.Data to a gtk.FileChooserButton. 
  42.     """
  43.     if not use_directory and not use_uri:
  44.         getter = button.get_filename
  45.         setter = button.set_filename
  46.     elif not use_directory and use_uri:
  47.         getter = button.get_uri
  48.         setter = button.set_uri
  49.     elif use_directory and not use_uri:
  50.         getter = button.get_current_folder
  51.         setter = button.set_current_folder
  52.     elif use_directory and use_uri:
  53.         getter = button.get_current_folder_uri
  54.         setter = button.set_current_folder_uri
  55.     
  56.     return Data(button, getter, setter, 'selection-changed', GConfValue(key, Spec.STRING, default = default, client = client))
  57.  
  58.  
  59. def data_entry(entry, key, data_spec = Spec.STRING, default = None, client = None):
  60.     return Data(entry, entry.get_text, entry.set_text, 'changed', GConfValue(key, data_spec, default, client))
  61.  
  62.  
  63. def data_spin_button(spinbutton, key, use_int = True, default = None, client = None):
  64.     if use_int:
  65.         return Data(spinbutton, spinbutton.get_value_as_int, spinbutton.set_value, 'value-changed', GConfValue(key, Spec.INT, default, client))
  66.     else:
  67.         return Data(spinbutton, spinbutton.get_value, spinbutton.set_value, 'value-changed', GConfValue(key, Spec.FLOAT, default, client))
  68.  
  69.  
  70. def data_toggle_button(toggle, key, default = None, client = None):
  71.     return Data(toggle, toggle.get_active, toggle.set_active, 'toggled', GConfValue(key, Spec.BOOL, default, client))
  72.  
  73.  
  74. class GConfValue(object):
  75.     '''
  76.     The GConfValue represents the GConf key\'s data. You define a certain schema
  77.     (or type of data) and GConfValue keeps track of its integrity. It adds the
  78.     possibility to define a default value to be used when the key is inexistent
  79.     or contains an invalid data type. You can also define callbacks that notify
  80.     you when the key is altered.
  81.     
  82.     Taken from http://s1x.homelinux.net/documents/gaw_intro :
  83.         import gaw, gconf, gtk
  84.         gconf.client_get_default ().add_dir ("/apps/gaw", gconf.CLIENT_PRELOAD_NONE)
  85.  
  86.         key_str = gaw.GConfValue (
  87.           key = "/apps/gaw/key_str",
  88.           data_spec = gaw.Spec.STRING
  89.         )
  90.  
  91.         def on_changed (*args):
  92.           global key_str
  93.           print key_str.key, "=", key_str.data
  94.           gtk.main_quit ()
  95.           
  96.         tmp.set_callback (on_changed)
  97.         tmp.data = "Hello world"
  98.  
  99.         gtk.main ()
  100.     '''
  101.     
  102.     def __init__(self, key, data_spec, default = None, client = None):
  103.         if not client:
  104.             client = gconf.client_get_default()
  105.         
  106.         self.client = client
  107.         self.key = key
  108.         self.data_spec = data_spec
  109.         self._GConfValue__notify_id = None
  110.         if default is not None:
  111.             self.default = default
  112.         
  113.  
  114.     __setter = property((lambda self: getattr(self.client, 'set_' + self.data_spec.name)))
  115.     
  116.     def __get_data(self):
  117.         val = self.client.get(self.key)
  118.         if val is None:
  119.             return self.get_default()
  120.         
  121.         return getattr(val, 'get_' + self.data_spec.name)()
  122.  
  123.     data = property(fget = __get_data, fset = (lambda self, value: self._GConfValue__setter(self.key, value)))
  124.     
  125.     def set_callback(self, on_changed):
  126.         if not on_changed is None and callable(on_changed):
  127.             raise AssertionError
  128.         if self._GConfValue__notify_id is not None:
  129.             self.client_notify_remove(self._GConfValue__notify_id)
  130.             self._GConfValue__notify_id = None
  131.         
  132.         if on_changed is not None:
  133.             self._GConfValue__notify_id = self.client.notify_add(self.key, on_changed)
  134.         
  135.  
  136.     
  137.     def __del__(self):
  138.         self.set_callback(None)
  139.  
  140.     
  141.     def reset_default(self):
  142.         self.data = self.data_spec.default
  143.  
  144.     
  145.     def get_default(self):
  146.         return getattr(self, 'default', self.data_spec.default)
  147.  
  148.  
  149.  
  150. class RadioButtonData:
  151.     """A radio_group is a dictionary that associates a gconf boolean key
  152.     with a radio button.
  153.     data = RadioButtonData (
  154.         {
  155.             'cheese': cheese_btn,
  156.             'ham': ham_btn,
  157.             'fish': fish_btn
  158.         },
  159.     )
  160.     data.selected_by_default = 'ham'
  161.     
  162.     selected_value = data.data
  163.     data.data = 'fish'
  164.     """
  165.     selected_by_default = None
  166.     
  167.     def __init__(self, widgets, key, client = None):
  168.         self.widgets = widgets
  169.         self.keys = { }
  170.         self.gconf_value = GConfValue(key, Spec.STRING, client)
  171.         self.gconf_value.set_callback(self._RadioButtonData__on_gconf_changed)
  172.         notify_widget = False
  173.         for key, widget in widgets.iteritems():
  174.             if not notify_widget:
  175.                 widget.connect('toggled', self._RadioButtonData__on_widget_changed)
  176.                 notify_widget = True
  177.             
  178.             widget.connect('destroy', self._RadioButtonData__on_destroy)
  179.             self.keys[widget] = key
  180.         
  181.         self.sync_widget()
  182.  
  183.     
  184.     def __on_destroy(self, widget):
  185.         key = self.keys[widget]
  186.         del self.widgets[key]
  187.         self.keys[widget] = None
  188.  
  189.     
  190.     def _get_active(self):
  191.         for radio in self.keys:
  192.             if radio is not None and radio.get_active():
  193.                 return radio
  194.                 continue
  195.         
  196.  
  197.     
  198.     def __on_widget_changed(self, radio_button):
  199.         self.sync_gconf()
  200.  
  201.     
  202.     def __on_gconf_changed(self, client, conn_id, entry, user_data):
  203.         data_spec = self.gconf_value.data_spec
  204.         for widget in self.keys:
  205.             widget.set_sensitive(client.key_is_writable(self.gconf_value.key))
  206.         
  207.         if entry.value is None or entry.value.type != data_spec.gconf_type:
  208.             self.sync_gconf()
  209.         else:
  210.             self.sync_widget()
  211.  
  212.     
  213.     def sync_widget(self):
  214.         key = self.gconf_value.data
  215.         if key in self.widgets:
  216.             self.widgets[key].set_active(True)
  217.         elif self.selected_by_default is not None:
  218.             self.data = self.selected_by_default
  219.         
  220.         active = self._get_active()
  221.         if active is not None:
  222.             active.set_active(False)
  223.         
  224.         self.sync_gconf()
  225.  
  226.     
  227.     def sync_gconf(self):
  228.         active = self._get_active()
  229.         if active is not None:
  230.             self.gconf_value.data = self.keys[active]
  231.         else:
  232.             self.gconf_value.reset_default()
  233.  
  234.     
  235.     def __set_data(self, value):
  236.         self.sync_gconf()
  237.         self.gconf_value = value
  238.  
  239.     
  240.     def __get_data(self):
  241.         self.sync_gconf()
  242.         return self.gconf_value.data
  243.  
  244.     data = property(__get_data, __set_data)
  245.  
  246.  
  247. class Data(object):
  248.     """
  249.     This utility class acts as a synchronizer between a widget and gconf entry.
  250.     This data is considered to have problematic backends, since widgets can be
  251.     destroyed and gconf can have integrity problems (for example permissions or
  252.     schema change).
  253.     
  254.     To use the gaw.Data object you just need to specify it's associated type
  255.     (the schema) and optionally a default value.
  256.     
  257.     Here's a simple example on how to use it (taken from http://s1x.homelinux.net/documents/gaw_intro): 
  258.     
  259.             
  260.     """
  261.     
  262.     def __init__(self, widget, widget_getter, widget_setter, changed_signal, gconf_value):
  263.         self._Data__widget = widget
  264.         self._Data__widget_setter = widget_setter
  265.         self._Data__widget_getter = widget_getter
  266.         self._Data__gconf_value = gconf_value
  267.         gconf_value.set_callback(self._Data__on_gconf_changed)
  268.         widget.connect(changed_signal, self._Data__on_widget_changed)
  269.         widget.connect('destroy', self._Data__on_destroy)
  270.         if self.widget is not None:
  271.             self.sync_widget()
  272.         
  273.  
  274.     gconf_value = property((lambda self: self._Data__gconf_value))
  275.     widget = property((lambda self: self._Data__widget))
  276.     
  277.     def __get_data(self):
  278.         
  279.         try:
  280.             return self.gconf_value.data
  281.         except gobject.GError:
  282.             if self.widget is not None:
  283.                 val = self._Data__widget_getter()
  284.             else:
  285.                 return self.gconf_value.get_default()
  286.         except:
  287.             self.widget is not None
  288.  
  289.  
  290.     
  291.     def __set_data(self, data):
  292.         if not isinstance(data, self.gconf_value.data_spec.py_type):
  293.             raise AssertionError
  294.         
  295.         try:
  296.             self.gconf_value.data = data
  297.         except gobject.GError:
  298.             pass
  299.  
  300.  
  301.     data = property(__get_data, __set_data, None, 'The data contained in this component.')
  302.     
  303.     def __on_destroy(self, widget):
  304.         self._Data__widget = None
  305.  
  306.     
  307.     def __on_widget_changed(self, *args):
  308.         if self.widget is None:
  309.             return None
  310.         
  311.         self.sync_gconf()
  312.  
  313.     
  314.     def __on_gconf_changed(self, client, conn_id, entry, user_data = None):
  315.         if self.widget is None:
  316.             return None
  317.         
  318.         data_spec = self.gconf_value.data_spec
  319.         self.widget.set_sensitive(client.key_is_writable(self.gconf_value.key))
  320.         if entry.value and entry.value.type == data_spec.gconf_type:
  321.             converter = getattr(entry.value, 'get_' + data_spec.name)
  322.             self._Data__widget_setter(converter())
  323.         else:
  324.             self._Data__widget_setter(self.gconf_value.get_default())
  325.         self.sync_gconf()
  326.  
  327.     
  328.     def sync_widget(self):
  329.         '''
  330.         Synchronizes the widget in favour of the gconf key. You must check if
  331.         there is a valid widget before calling this method.
  332.         '''
  333.         if not self.widget:
  334.             raise AssertionError, "Checking if there's a valid widget is a prerequisite."
  335.         
  336.         try:
  337.             val = self.gconf_value.data
  338.             if val:
  339.                 self._Data__widget_setter(val)
  340.         except gobject.GError:
  341.             self._Data__widget_setter(self.gconf_value.get_default())
  342.  
  343.         self.sync_gconf()
  344.  
  345.     
  346.     def sync_gconf(self):
  347.         '''
  348.         Synchronizes the gconf key in favour of the widget. You must check if
  349.         there is a valid widget before calling this method.
  350.         '''
  351.         if not self.widget:
  352.             raise AssertionError, "Checking if there's a valid widget is a prerequisite."
  353.         val = self._Data__widget_getter()
  354.         
  355.         try:
  356.             self.gconf_value.data = val
  357.             self._Data__widget_setter(self.gconf_value.data)
  358.         except gobject.GError:
  359.             pass
  360.  
  361.  
  362.  
  363.