GUIApplication
==============

The :py:class:`GUIApplication` subclass of the standard Envisage
:py:class:`Application` class uses Pyface's cross-platform GUI tools to ensure
that an appropriate back-end application object is instantiated before plugins
run their :py:meth:`start` methods, and then ensures that the GUI mainloop is
started after the :py:meth:`start` methods have successfully completed.

This allows developers to have a single place to start the application, but have
plugins to listen for the :py:attr:`application_initialized` event to create UI
components.  In particular, Traits UIs can be created in an event listener
method by calling :py:meth:`edit_traits`, something like this::

    class MyViewPlugin(Plugin):

        model = Instance

        ui = Instance('traitsui.ui.UI')

        @on_trait_change('application:application_initialized')
        def create_ui(self):
            # we need to keep a reference to the ui object
            self.ui = self.model.edit_traits()

This is intended to be a cheap and simple way to take an existing application
and start "lifting" it to Envisage, without having to use a more heavyweight
UI framework such as Tasks immediately.  Developers can work on adding
extensibility to the application's model without having to at the same time
add extensibility to their UI.

The :py:class:`GUIApplication` exposes the following public API:

.. py:attribute:: gui

    The Pyface :py:class:`GUI` instance the :py:class:`GUIApplication` creates.

.. py:attribute:: splash_screen

    An optional Pyface :py:class:`ISplashScreen` that gets shown while
    the plugins are started.

.. py:attribute:: application_initialized

    An event which is fired after the UI mainloop has started.
