#
# removeoverlay.py - Action which removes the current overlay.
#
# Author: Paul McCarthy <pauldmccarthy@gmail.com>
#
"""This module provides the :class:`RemoveOverlayAction` class, and the
:func:`removeOverlay` function, which provides logic to remove an overlay
from the :class:`.OverlayList`.
"""
import fsl.data.image as fslimage
import fsleyes.strings as strings
from . import base
[docs]class RemoveOverlayAction(base.Action):
"""The ``RemoveOverlayAction`` allows the uesr to remove the currently
selected overlay.
"""
[docs] def __init__(self, overlayList, displayCtx, frame):
"""Create a ``RemoveOverlayAction``.
:arg overlayList: The :class:`.OverlayList`.
:arg displayCtx: The :class:`.DisplayContext`.
:arg frame: The :class:`.FSLeyesFrame`.
"""
base.Action.__init__(
self, overlayList, displayCtx, self.__removeOverlay)
self.__name = '{}_{}'.format(type(self).__name__, id(self))
overlayList.addListener('overlays',
self.__name,
self.__overlayListChanged)
[docs] def destroy(self):
"""Must be called when this ``RemoveOverlayAction`` is no longer
needed. Removes property listeners, and then calls
:meth:`.Action.destroy`.
"""
self.overlayList.removeListener('overlays', self.__name)
base.Action.destroy(self)
def __overlayListChanged(self, *a):
"""Called when the :class:`.OverlayList` changes. Updates the
:attr:`.Action.enabled` flag
"""
self.enabled = len(self.overlayList) > 0
def __removeOverlay(self):
"""Removes the currently selected overlay (as defined by the
:attr:`.DisplayContext.selectedOverlay) from the :class:`.OverlayList`.
"""
removeOverlay(self.overlayList, self.displayCtx)
[docs]def removeOverlay(overlayList, displayCtx, overlay=None, stringKey=None):
"""Removes the specified overlay (or the currently selected overlay,
if ``overlay is None``) from the overlay list. If the overlay is not
saved, the user is prompted to confirm the removal.
:arg overlay: Overlay to remove. If ``None``, the currently selected
overlay is removed.
:arg stringKey: Key to use in the :mod:`.strings` module for the
dialog with which the user is prompted if the overlay
has unsaved changes.
:returns: ``True`` if the overlay was removed, ``False`` otherise.
"""
import wx
if overlay is None:
overlay = displayCtx.getSelectedOverlay()
if stringKey is None:
stringKey = 'removeoverlay.unsaved'
if isinstance(overlay, fslimage.Image) and not overlay.saveState:
msg = strings.messages[stringKey]
title = strings.titles[ stringKey]
parent = wx.GetApp().GetTopWindow()
dlg = wx.MessageDialog(parent,
message=msg,
caption=title,
style=(wx.YES_NO |
wx.NO_DEFAULT |
wx.CENTRE |
wx.ICON_WARNING))
dlg.CentreOnParent()
if dlg.ShowModal() == wx.ID_NO:
return False
overlayList.remove(overlay)
return True