Source code for pyface.wizard.wizard_controller
# (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!
""" A wizard controller that has a static list of pages. """
from traits.api import (
Bool, HasTraits, Instance, List, Property, provides, observe
)
from .i_wizard_controller import IWizardController
from .i_wizard_page import IWizardPage
[docs]@provides(IWizardController)
class WizardController(HasTraits):
""" A wizard controller that has a static list of pages. """
# 'IWizardController' interface ----------------------------------------
# The pages under the control of this controller.
pages = Property(List(IWizardPage))
# The current page.
current_page = Instance(IWizardPage)
# Set if the wizard is complete.
complete = Bool(False)
# Protected 'IWizardController' interface -----------------------------#
# Shadow trait for the 'pages' property.
_pages = List(IWizardPage)
# ------------------------------------------------------------------------
# 'IWizardController' interface.
# ------------------------------------------------------------------------
[docs] def get_first_page(self):
""" Returns the first page. """
if self._pages:
return self._pages[0]
return None
[docs] def get_next_page(self, page):
""" Returns the next page. """
if page.last_page:
pass
elif page.next_id:
for p in self._pages:
if p.id == page.next_id:
return p
else:
index = self._pages.index(page) + 1
if index < len(self._pages):
return self._pages[index]
return None
[docs] def get_previous_page(self, page):
""" Returns the previous page. """
for p in self._pages:
next = self.get_next_page(p)
if next is page:
return p
return None
[docs] def is_first_page(self, page):
""" Is the page the first page? """
return page is self._pages[0]
[docs] def is_last_page(self, page):
""" Is the page the last page? """
if page.last_page:
return True
if page.next_id:
return False
return page is self._pages[-1]
[docs] def dispose_pages(self):
""" Dispose the wizard pages. """
for page in self._pages:
page.dispose_page()
return
# ------------------------------------------------------------------------
# 'WizardController' interface.
# ------------------------------------------------------------------------
def _get_pages(self):
""" Returns the pages in the wizard. """
return self._pages[:]
def _set_pages(self, pages):
""" Sets the pages in the wizard. """
self._pages = pages
# Make sure the current page is valid.
# If the current page is None (i.e., the current page has
# not been set yet), do not set it here. The current page will
# get set when the wizard calls _show_page.
if (
self.current_page is not None
and self.current_page not in self._pages
):
self.current_page = self._pages[0]
else:
self._update()
return
# ------------------------------------------------------------------------
# Private interface.
# ------------------------------------------------------------------------
def _update(self):
""" Checks the completion status of the controller. """
# The entire wizard is complete when the last page is complete.
if self.current_page is None:
self.complete = False
elif self.is_last_page(self.current_page):
self.complete = self.current_page.complete
else:
self.complete = False
return
# Trait event handlers -------------------------------------------------
# Static ----
@observe("current_page")
def _reset_observers_on_current_page_and_update(self, event):
""" Called when the current page is changed. """
old, new = event.old, event.new
if old is not None:
old.observe(
self._on_page_complete, "complete", remove=True
)
if new is not None:
new.observe(self._on_page_complete, "complete")
self._update()
return
# Dynamic ----
def _on_page_complete(self, event):
""" Called when the current page is complete. """
self._update()
return