# Enthought library imports.
from envisage.ui.tasks.api import PreferencesPane, TaskFactory
from apptools.preferences.api import PreferencesHelper
from traits.api import Bool, Dict, Enum, List, Str
from traitsui.api import EnumEditor, HGroup, VGroup, Item, Label, View


class AttractorsPreferences(PreferencesHelper):
    """ The preferences helper for the Attractors application.
    """

    #### 'PreferencesHelper' interface ########################################

    # The path to the preference node that contains the preferences.
    preferences_path = "example.attractors"

    #### Preferences ##########################################################

    # The task to activate on app startup if not restoring an old layout.
    default_task = Str

    # Whether to always apply the default application-level layout.
    # See TasksApplication for more information.
    always_use_default_layout = Bool


class AttractorsPreferencesPane(PreferencesPane):
    """ The preferences pane for the Attractors application.
    """

    #### 'PreferencesPane' interface ##########################################

    # The factory to use for creating the preferences model object.
    model_factory = AttractorsPreferences

    #### 'AttractorsPreferencesPane' interface ################################

    task_map = Dict(Str, Str)

    view = View(
        VGroup(
            HGroup(
                Item("always_use_default_layout"),
                Label("Always use the default active task on startup"),
                show_labels=False,
            ),
            HGroup(
                Label("Default active task:"),
                Item(
                    "default_task", editor=EnumEditor(name="handler.task_map")
                ),
                enabled_when="always_use_default_layout",
                show_labels=False,
            ),
            label="Application startup",
        ),
        resizable=True,
    )

    ###########################################################################
    # Private interface.
    ###########################################################################

    def _task_map_default(self):
        return dict(
            (factory.id, factory.name)
            for factory in self.dialog.application.task_factories
        )
