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 ##