Source code for pyface.wizard.i_wizard

# (C) Copyright 2005-2023 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!

""" The interface for all pyface wizards. """


from traits.api import Bool, HasTraits, Instance, List, Str
from pyface.i_dialog import IDialog


from .i_wizard_controller import IWizardController
from .i_wizard_page import IWizardPage


[docs]class IWizard(IDialog): """ The interface for all pyface wizards. """ # 'IWizard' interface -------------------------------------------------# # The pages in the wizard. pages = List(IWizardPage) # The wizard controller provides the pages displayed in the wizard, and # determines when the wizard is complete etc. controller = Instance(IWizardController) # Should the 'Cancel' button be displayed? show_cancel = Bool(True) # 'IWindow' interface -------------------------------------------------# # The dialog title. title = Str("Wizard") # ------------------------------------------------------------------------ # 'IWizard' interface. # ------------------------------------------------------------------------
[docs] def next(self): """ Advance to the next page in the wizard. """
[docs] def previous(self): """ Return to the previous page in the wizard. """
[docs]class MWizard(HasTraits): """ The mixin class that contains common code for toolkit specific implementations of the IWizard interface. Implements: next(), previous() Reimplements: _create_contents() """ # ------------------------------------------------------------------------ # 'IWizard' interface. # ------------------------------------------------------------------------
[docs] def next(self): """ Advance to the next page in the wizard. """ page = self.controller.get_next_page(self.controller.current_page) self._show_page(page)
[docs] def previous(self): """ Return to the previous page in the wizard. """ page = self.controller.get_previous_page(self.controller.current_page) self._show_page(page) return
# ------------------------------------------------------------------------ # Protected 'IWindow' interface. # ------------------------------------------------------------------------ def _create_contents(self, parent): """ Creates the window contents. """ # This creates the dialog and button areas. super()._create_contents(parent) # Wire up the controller. self._initialize_controller(self.controller) # Show the first page. self._show_page(self.controller.get_first_page()) return # ------------------------------------------------------------------------ # Protected MWizard interface. # ------------------------------------------------------------------------ def _show_page(self, page): """ Show the specified page. """ # Set the current page in the controller. # # fixme: Shouldn't this interface be reversed? Maybe calling # 'next_page' on the controller should cause it to set its own current # page? self.controller.current_page = page def _update(self, event): """ Enables/disables buttons depending on the state of the wizard. """ pass # ------------------------------------------------------------------------ # Private interface. # ------------------------------------------------------------------------ def _initialize_controller(self, controller): """ Initializes the wizard controller. """ controller.observe(self._update, "complete") controller.observe(self._on_current_page_changed, "current_page") return # Trait event handlers ------------------------------------------------- def _on_current_page_changed(self, event): """ Called when the current page is changed. """ if event.old is not None: event.old.observe(self._update, "complete", remove=True) if event.new is not None: event.new.observe(self._update, "complete") self._update(event=None) def _on_closed_changed(self): """ Called when the wizard is closed. """ self.controller.dispose_pages() return