Source code for envisage.ui.tasks.preferences_pane
# (C) Copyright 2007-2024 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
# Enthought library imports.
from apptools.preferences.api import PreferencesHelper
from traits.api import Callable, Instance, Str
from traitsui.api import Controller
[docs]class PreferencesPane(Controller):
"""A panel for configuring application preferences."""
#### 'Controller' interface ###############################################
#: The preferences helper for which this pane is a view.
model = Instance(PreferencesHelper)
#### 'PreferencesPane' interface ##########################################
#: An identifier for the pane (unique within a category).
id = Str
#: The ID of the category in which to place the pane.
category = Str("General")
#: The pane appears after the pane with this ID.
before = Str
#: The pane appears after the pane with this ID.
after = Str
#: The preferences dialog to which the pane belongs. Set by the framework.
dialog = Instance("envisage.ui.tasks.preferences_dialog.PreferencesDialog")
#: The factory to use for creating the preferences model object, of form:
#:
#: ``callable(**traits) -> PreferencesHelper``
#:
#: If not specified, the preferences helper must be supplied manually.
model_factory = Callable
#### Private interface ####################################################
_model = Instance(PreferencesHelper)
###########################################################################
# 'HasTraits' interface.
###########################################################################
[docs] def trait_context(self):
"""Re-implemented to use a copy of the model that is not connected to
the preferences node.
"""
if self.model is None:
if self.model_factory is not None:
preferences = self.dialog.application.preferences
self.model = self.model_factory(preferences=preferences)
else:
raise ValueError("A preferences pane must have a model!")
# Make sure that we don't clone the preferences trait, since that
# can lead to the preferences node being updated prematurely.
# xref: enthought/envisage#582
traits_to_clone = [
trait_name
for trait_name in self.model.copyable_trait_names()
if trait_name != "preferences"
]
self._model = self.model.clone_traits(traits_to_clone)
self._model.preferences = None
return {"object": self._model, "controller": self, "handler": self}
###########################################################################
# 'Handler' interface.
###########################################################################
[docs] def apply(self, info=None):
"""Handles the Apply button being clicked."""
trait_names = list(
filter(self._model._is_preference_trait, self._model.trait_names())
)
self.model.copy_traits(self._model, trait_names)
[docs] def close(self, info, is_ok):
"""
Handles the user attempting to close a dialog-based user interface.
"""
if is_ok:
self.apply()
return super().close(info, is_ok)