# 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)