Registering Application Preferences

Builder’s preferences are designed in such a way that the core application preferences and extension preferences feel cohesive. This is often not the case with “plugin-based” applications.

To do this, we created the Ide.Preferences interface. Extensions can implement the Ide.PreferencesAddin interface and register preferences with the Ide.Preferences instance. This allows the preferences to be seamlessly merged together based on the desired page, group, and preference type. They are even searchable!

# my_plugin.py

import gi

from gi.repository import GObject
from gi.repository import Ide

_ = Ide.gettext

class MyPreferencesAddin(GObject.Object, Ide.PreferencesAddin):

    def do_load(self, prefs):

        # add a new switch row
        self.completion_id = prefs.add_switch(
                # to the code-insight page
                'code-insight',

                # in the completion group
                'completion',

                # mapping to the gsettings schema
                'org.gnome.builder.extension-type',

                # with the gsettings schema key
                'enabled',

                # And the gsettings path
                '/',

                # The target GVariant value if necessary (usually not)
                None,

                # title
                _("Suggest Python completions"),

                # subtitle
                _("Use Jedi to provide completions for the Python language"),

                # keywords
                _("jedi python search autocompletion API"),

                # with sort priority
                30)

        # there are plenty of other types of things you can add.
        # see dzl-preferences.h for an example of the API you can call
        # such as:
        #
        #  - add_group()
        #  - add_list_group()
        #  - add_font_button()
        #  - add_radio()
        #  - add_spin_button()
        #  - add_file_chooser()
        #  - add_custom() (custom widgets)

    def do_unload(self, prefs):
        prefs.remove_id(self.completion_id)