Ejemplo n.º 1
0
 def setup_translator (self):
     """
     Translators preferences
     """
     frame = uiutils.Frame (_("Translator preferences"))
     frame.show ()
     vbox = gtk.VBox (spacing=6)
     vbox.show ()
     
     hbox = gtk.HBox(spacing=12)
     hbox.show ()
     label = gtk.Label (_("_Preferred translator"))
     label.set_use_underline (True)
     label.set_alignment (0, 0.5)
     label.show ()
     self.left_group.add_widget (label)
     hbox.pack_start (label, False)
     self.w_preferred_translator = TranslatorCombo (self.application)
     self.w_preferred_translator.show ()
     self.right_group.add_widget (self.w_preferred_translator)
     label.set_mnemonic_widget (self.w_preferred_translator)
     hbox.pack_start (self.w_preferred_translator)
     vbox.pack_start (hbox)
     
     frame.add (vbox)
     self.vbox.pack_start (frame)
Ejemplo n.º 2
0
class Settings (gtk.Dialog):
    """
    A dialog allowing the user to modify configuration keys
    """

    @utils.syncronized
    def __init__(self, application):
        gtk.Dialog.__init__ (self, _('Preferences'), application.main_window, 0,
                             (gtk.STOCK_HELP, gtk.RESPONSE_HELP,
                              gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
        self.application = application

        self.set_border_width (6)
        self.set_modal (True)

        self.setup_layout ()
        self.setup_clipboard ()
        self.setup_translator ()
        self.setup_keybindings ()

        self.read_config ()

        self.connect ('response', self.on_response)
        self.show ()

    def setup_layout (self):
        """
        Setup the layout of the dialog.
        Create size groups for ensuring widgets have the same horizontal size.
        """
        self.vbox.set_spacing (6)
        self.left_group = gtk.SizeGroup (gtk.SIZE_GROUP_HORIZONTAL)
        self.right_group = gtk.SizeGroup (gtk.SIZE_GROUP_HORIZONTAL)

    def setup_clipboard (self):
        """
        Clipboard preferences
        """
        frame = uiutils.Frame (_('Clipboard preferences'))
        frame.show ()
        vbox = gtk.VBox (spacing=6)
        vbox.show ()

        description = _("_Get text/url from clipboard automatically")
        self.w_clipboard_get = gtk.CheckButton (description)
        self.w_clipboard_get.show ()
        vbox.pack_start (self.w_clipboard_get, False)

        description = _("_Save translated text/url to clipboard")
        self.w_clipboard_set = gtk.CheckButton (description)
        self.w_clipboard_set.show ()
        vbox.pack_start (self.w_clipboard_set, False)
        
        frame.add (vbox)
        self.vbox.pack_start (frame)

    def setup_translator (self):
        """
        Translators preferences
        """
        frame = uiutils.Frame (_("Translator preferences"))
        frame.show ()
        vbox = gtk.VBox (spacing=6)
        vbox.show ()
        
        hbox = gtk.HBox(spacing=12)
        hbox.show ()
        label = gtk.Label (_("_Preferred translator"))
        label.set_use_underline (True)
        label.set_alignment (0, 0.5)
        label.show ()
        self.left_group.add_widget (label)
        hbox.pack_start (label, False)
        self.w_preferred_translator = TranslatorCombo (self.application)
        self.w_preferred_translator.show ()
        self.right_group.add_widget (self.w_preferred_translator)
        label.set_mnemonic_widget (self.w_preferred_translator)
        hbox.pack_start (self.w_preferred_translator)
        vbox.pack_start (hbox)
        
        frame.add (vbox)
        self.vbox.pack_start (frame)

    def setup_keybindings (self):
        """
        Global keybindings preferences
        """
        frame = uiutils.Frame (_('Key bindings'))
        frame.show ()
        vbox = gtk.VBox (spacing=6)
        vbox.show ()

        hbox = gtk.HBox(spacing=12)
        hbox.show ()
        label = gtk.Label (_("_Translate from clipboard"))
        label.set_use_underline (True)
        label.set_alignment (0, 0.5)
        label.show ()
        self.left_group.add_widget (label)
        hbox.pack_start (label, False)

        model = gtk.ListStore (int, int, bool)
        self.w_key_binding = gtk.TreeView (model)
        self.w_key_binding.set_headers_visible (False)
        self.w_key_binding.show ()
        renderer = gtk.CellRendererAccel ()
        renderer.connect ('accel-edited', self.on_key_binding_edited)
        renderer.connect ('accel-cleared', self.on_key_binding_cleared)
        column = gtk.TreeViewColumn (None, None)
        column.pack_start (renderer, True)
        column.set_attributes (renderer, accel_key=0, accel_mods=1, editable=2)
        self.w_key_binding.append_column (column)
        # Grab keyboard focus when clicked,
        # otherwise the user can't set the accel (GTK+ bug?)
        self.w_key_binding.connect ('button-press-event',
                                    self.on_key_binding_press)
        self.right_group.add_widget (self.w_key_binding)

        hbox.pack_start (self.w_key_binding)
        vbox.pack_start (hbox)
        
        frame.add (vbox)
        self.vbox.pack_start (frame)

    # Events

    def on_key_binding_edited (self, renderer, path,
                               keyval, modifiers, keycode):
        """
        Set the new key binding
        """
        row = self.w_key_binding.get_model()[0]
        row[0] = keyval
        row[1] = modifiers

    def on_key_binding_cleared (self, renderer, path):
        """
        Disable the key binding
        """
        row = self.w_key_binding.get_model()[0]
        row[0] = 0
        row[1] = 0

    def on_key_binding_press (self, *args):
        """
        The treeview has been pressed.
        This is an hack as GTK+ doesn't give focus to the treeview when the
        AccelCell has been selected.
        """
        self.w_key_binding.grab_focus ()

    def read_config (self):
        # Clipboard
        value = self.application.config.get ('get_clipboard')
        self.w_clipboard_get.set_active (value)
        value = self.application.config.get ('set_clipboard')
        self.w_clipboard_set.set_active (value)

        # Translator
        default_translator = self.application.translators_manager.get_default ()
        self.w_preferred_translator.set_active_translator (default_translator)

        # Key binding
        accelerator = self.application.config.get ("key_binding")
        keyval, modifiers = gtk.accelerator_parse (accelerator)
        self.w_key_binding.get_model().append ([keyval, modifiers, True])
        # Having a white background is ugly
        model = self.w_key_binding.get_model ()
        self.w_key_binding.get_selection().select_iter (model[0].iter)

    def write_config (self):
        # Clipboard
        self.application.config.set ('get_clipboard',
                                     self.w_clipboard_get.get_active ())
        self.application.config.set ('set_clipboard',
                                     self.w_clipboard_set.get_active ())

        # Translator
        translator = self.w_preferred_translator.get_active_translator ()
        if translator:
            self.application.config.set ('default_translator',
                                         translator.module_name)
        else:
            self.application.config.set ('default_translator', '')
            
        # Key binding
        row = self.w_key_binding.get_model()[0]
        keyval, modifiers = row[0], row[1]
        if keyval <= 0:
            self.application.config.set ('key_binding', 'disabled')
        else:
            self.application.config.set ('key_binding',
                                         gtk.accelerator_name (keyval, modifiers))

    def on_response (self, dialog, response):
        """
        Dialog response will open the Help if necessary, otherwise save the
        configuration.
        """
        if response == gtk.RESPONSE_HELP:
            gtk.show_uri (self.window.get_screen(), "ghelp:freespeak?freespeak-prefs", 0)
            return

        self.write_config ()
        self.destroy()