Source code for fsleyes.state

#
# state.py - Functions for saving/restoring the state of *FSLeyes*.
#
# Author: Paul McCarthy <pauldmccarthy@gmail.com>
#
"""This module provides two functions, :func:`getState` and :func:`setState`.
These functions may be used to get/set the state of *FSLeyes*.
"""


import logging

import fsleyes.actions.showcommandline  as showcommandline
import fsleyes.actions.applycommandline as applycommandline
import fsleyes.views.canvaspanel        as canvaspanel
import fsleyes.layouts                  as layouts


log = logging.getLogger(__name__)


SEP = '\n------\n'
"""String used to separate different parts of the state string. """


CLISEP = '\t'
"""String used to separate different command line arguments, within the state
string.
"""


[docs]def getState(frame): """Generate a string which describes the current state of FSLeyes. The string contains: - A layout specification string, as generated by the :func:`.layouts.serialiseLayout` function. - A set of command line arguments describing the overlays that are loaded, generated by the :func:`.genCommandLineArgs` function. - A set of command line arguments for each :class:`.CanvasPanel`, describing the panel settings, and any panel-specific overlay settings. :arg frame: The :class:`.FSLeyesFrame` :returns: A string describing FSLeyes. """ displayCtx = frame.displayCtx overlayList = frame.overlayList layout = layouts.serialiseLayout(frame) cli = [showcommandline.genCommandLineArgs(overlayList, displayCtx)] for i, panel in enumerate(frame.viewPanels): if not isinstance(panel, canvaspanel.CanvasPanel): continue argv = showcommandline.genCommandLineArgs( overlayList, panel.displayCtx, panel) cli.append(argv) cli = [[a.strip('"') for a in argv[1:]] for argv in cli] cli = [CLISEP.join(c) for c in cli] state = SEP.join([layout] + cli) return state
[docs]def setState(frame, state): """Set the state of FSLeyes from the given ``state`` string. .. warning:: This function will remove all view panels, and remove all overlays, before loading the new state. :arg frame: The :class:`.FSLeyesFrame` :arg state: A FSLeyes state string, generated by :func:`getState`. """ displayCtx = frame.displayCtx overlayList = frame.overlayList bits = state.split(SEP) layout = bits[0] cli = bits[1:] cli = [c.split(CLISEP) for c in cli] # First clear the current state frame.removeAllViewPanels() overlayList.clear() # Then load all new overlays applycommandline.applyCommandLineArgs( overlayList, displayCtx, cli[0], blocking=True) # After overlays have been loaded, # apply the new layout, and apply # view-specific overlay arguments. layouts.applyLayout(frame, 'state', layout) panels = [p for p in frame.viewPanels if isinstance(p, canvaspanel.CanvasPanel)] for i, panel in enumerate(panels, 1): applycommandline.applyCommandLineArgs( overlayList, panel.displayCtx, cli[i], panel, loadOverlays=False)