Source code for tagit.program.program

"""

Part of the tagit module.
A copy of the license is provided with the project.
Author: Matthias Baumgartner, 2016

"""
# IMPORTS

# INNER-MODULE IMPORTS

# EXPORTS
__all__ = ('Program', )

## CODE ##

[docs]class Program(object): """ Program State-Machine: States: * uninitialized * initialized * running * paused * stopped Transitions: * uninitialized -> initialized (init) * {initialized, stopped} -> uninitialized (unload) * {initialized, stopped} -> running (start) * {running, paused} -> stopped (stop) * running -> paused (pause) * paused -> running (resume) """ STATE_UNINITIALIZED = 'uninitialized' STATE_INITIALIZED = 'initialized' STATE_RUNNING = 'running' STATE_PAUSED = 'paused' STATE_STOPPED = 'stopped' def __init__(self): self._state = self.STATE_UNINITIALIZED def is_running(self): return self._state in (self.STATE_RUNNING, self.STATE_PAUSED) def init(self, widget, on_start=None, on_stop=None): if self._state != self.STATE_UNINITIALIZED: raise Exception('State machine error') self._state = self.STATE_INITIALIZED self._widget = widget self._stop_clbk = on_stop self._start_clbk = on_start def unload(self): if self._state == self.STATE_STOPPED: pass elif self._state == self.STATE_INITIALIZED: pass #elif self._state == self.STATE_PAUSED: # self.undecorate(self._widget) # self.on_stop() else: raise Exception('State machine error') self._state = self.STATE_UNINITIALIZED self._widget = None def start(self, widget=None): if widget is not None: # Because it's convenient self.init(widget) if self._state not in (self.STATE_INITIALIZED, self.STATE_STOPPED): raise Exception('State machine error') self._state = self.STATE_RUNNING self.decorate(self._widget) self.on_start() self._start_clbk() def stop(self): if self._state == self.STATE_RUNNING: self.undecorate(self._widget) elif self._state == self.STATE_PAUSED: pass else: raise Exception('State machine error') self._state = self.STATE_STOPPED self.on_stop() self._stop_clbk() def pause(self): if self._state not in (self.STATE_RUNNING, ): raise Exception('State machine error') self._state = self.STATE_PAUSED self.undecorate(self._widget) self.on_pause() def resume(self): if self._state not in (self.STATE_PAUSED, ): raise Exception('State machine error') self._state = self.STATE_RUNNING self.decorate(self._widget) self.on_resume()
[docs] def save(self, path): """Save the current state to *path*.""" if self._state not in (self.STATE_RUNNING, self.STATE_PAUSED): raise Exception('State machine error') self.do_save(path)
[docs] def load(self, path): """Load a program state from *path*.""" if self._state not in (self.STATE_INITIALIZED, self.STATE_STOPPED): raise Exception('State machine error') self.start() self.do_load(path) ## PROTOTYPES ##
def on_init(self): pass def on_start(self): pass def on_stop(self): pass def on_pause(self): pass def on_resume(self): pass def do_save(self): pass def do_load(self): pass def decorate(self, wx): pass def undecorate(self, wx): pass ## EOF ##