Source code for fsleyes.controls.atlasmanagementpanel

#
# atlasmanagementpanel.py - The AtlasManagementPanel class.
#
# Author: Paul McCarthy <pauldmccarthy@gmail.com>
#
"""This module provides the :class:`AtlasManagementPanel`, which is a sub-panel
that is used by the :class:`.AtlasPanel`.
"""


import logging

import wx

import fsleyes_widgets.elistbox  as elistbox
import fsl.data.atlases          as atlases
import fsleyes.panel             as fslpanel
import fsleyes.actions.loadatlas as loadatlas


log = logging.getLogger(__name__)


[docs]class AtlasManagementPanel(fslpanel.FSLeyesPanel): """The ``AtlasManagementPanel`` is a sub-panel used by the :class:`.AtlasPanel`. It simply displays a list of all known atlases, and allows the user to add/remove atlases to/from the list. """
[docs] def __init__(self, parent, overlayList, displayCtx, frame, atlasPanel): """Create an ``AtlasManagementPanel``. :arg parent: the :mod:`wx` parent object. :arg overlayList: The :class:`.OverlayList` instance. :arg displayCtx: The :class:`.DisplayContext` instance. :arg frame: The :class:`.FSLeyesFrame` instance. :arg atlasPanel: The :class:`.AtlasPanel` instance that has created this ``AtlasManagementPanel``. """ fslpanel.FSLeyesPanel.__init__( self, parent, overlayList, displayCtx, frame) descs = atlases.listAtlases() names = [d.name for d in descs] paths = [d.specPath for d in descs] self.__atlasList = elistbox.EditableListBox( self, labels=names, clientData=descs, tooltips=paths, vgap=5, style=(elistbox.ELB_NO_MOVE | elistbox.ELB_TOOLTIP_DOWN)) self.__sizer = wx.BoxSizer(wx.HORIZONTAL) self.__sizer.Add(self.__atlasList, flag=wx.EXPAND, proportion=1) self.SetSizer(self.__sizer) self.SetMinSize(self.__sizer.GetMinSize()) self.__atlasList.Bind(elistbox.EVT_ELB_ADD_EVENT, self.__onListAdd) self.__atlasList.Bind(elistbox.EVT_ELB_REMOVE_EVENT, self.__onListRemove) atlases.registry.register(self.name, self.__atlasAdded, 'add') atlases.registry.register(self.name, self.__atlasRemoved, 'remove')
[docs] def destroy(self): """Must be called when this ``AtlasManagementPanel`` is no longer needed. Removes some property/notification listeners, and calls the base class ``destroy`` method. """ fslpanel.FSLeyesPanel.destroy(self) atlases.registry.deregister(self.name, 'add') atlases.registry.deregister(self.name, 'remove')
def __atlasAdded(self, registry, topic, desc): """Called when an atlas is removed from the :class:`.AtlasRegistry`. Removes the corresponding atlas from the list. """ atlasID = desc.atlasID allIDs = [d.atlasID for d in registry.listAtlases()] index = allIDs.index(atlasID) self.__atlasList.Insert(desc.name, index, clientData=desc, tooltip=desc.specPath) def __atlasRemoved(self, registry, topic, desc): """Called when an atlas is removed from the :class:`.AtlasRegistry`. Removes the corresponding atlas from the list. """ index = self.__atlasList.IndexOf(desc) self.__atlasList.Remove(index) def __onListAdd(self, ev): """Called when the user clicks the *Add* button on the list. Calls the :func:`.loadatlas.loadAtlas` function. """ loadatlas.loadAtlas(self.frame) def __onListRemove(self, ev): """Called when the user clicks the *Remove* button on the list. Removes the corresponding atlas from the :class:`.AtlasRegistry`. """ with atlases.registry.skip(self.name, 'remove'): atlases.removeAtlas(ev.data.atlasID)