Extending the Greeter

The greeter is the view the user is presented with when starting Builder. In the following image, you can see the various ways to create a new project in the top left along with existing projects in the main content area.

../_images/greeter1.png

Project Miners

To add projects to the project list section of the greeter, you must implement a project miner. You might want one of these if you would like to show projects that are found through an external service such as gitlab or from mining the users home directory.

To do this, we must implement an Ide.ProjectMiner which emits the Ide.ProjectMiner::discovered() signal when a project has been discovered.

# my_plugin.py

import gi

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

class MyProjectMiner(GObject.Object, Ide.ProjectMiner):

    def do_mine_async(self, cancellable, callback, data):
        task = Gio.Task.new(self, cancellable, callback)

        # ... Now run your discovery code.

        info = Ide.ProjectInfo()
        info.set_name('Secret Project')
        info.set_file(Gio.File.new_for_path('Projects/.secret_project'))
        info.set_languages(['C', 'Python'])

        # If you set the project as recent, it will show up in the upper
        # section rather than "Other Projects"
        info.set_is_recent(True)

        # See libide/projects/ide-project-info.h for more options you
        # can provide on the Ide.ProjectInfo.

        # Now notify of the discovered info.
        self.emit_discovered(info)

        task.return_boolean(True)

    def do_mine_finish(self, task):
        return task.propagate_boolean()

Project Creation Workflows

You can add a new button to the project creation bar using an Ide.GenesisAddin.

Note

Adding buttons to the project creation section does not scale well. If you really think you need something here, talk to our designers so that we can accomidate a new design for your use case.

It is also possible to add a project creation workflow without adding a button to the headerbar. Some plugins such as flatpak use this to clone sources via a hidden gnome-builder command line switch.

# my_plugin.py

import gi

from gi.repository import GObject
from gi.repository import Gio
from gi.repository import Gtk
from gi.repository import Ide

class MyGenisisAddin(GObject.Object, Ide.GenesisAddin):
    widget = None

    def do_get_title(self, application):
        return "Magic Wand"

    def do_get_label(self, application):
        return "Magic Wand"

    def do_get_widget(self, application):
        if not self.widget:
            self.widget = Gtk.Label(label='My New Genesis Addin', visible=True)
        return self.widget

    def do_get_priority(self):
        # for positioning within the buttons
        return 100

    def do_run_async(self, cancellable, callback, data):
        task = Gio.Task.new(self, cancellable, callback)
        # Do async project creation, and then open project.
        task.return_boolean(True)

    def do_run_finish(self, task):
        return task.propagate_boolean()