From 18c625a0d3d8e701682676458109270ecf827f4e Mon Sep 17 00:00:00 2001 From: Terry Stewart Date: Wed, 30 May 2018 21:27:17 -0400 Subject: [PATCH 1/2] Added hooks registered per model --- nengo_gui/__init__.py | 1 + nengo_gui/components/sim_control.py | 8 ++++++++ nengo_gui/guibackend.py | 1 + nengo_gui/page.py | 7 +++++++ 4 files changed, 17 insertions(+) diff --git a/nengo_gui/__init__.py b/nengo_gui/__init__.py index a75e8070..92b1c6f0 100644 --- a/nengo_gui/__init__.py +++ b/nengo_gui/__init__.py @@ -3,3 +3,4 @@ from .version import version as __version__ from .namefinder import NameFinder from .main import main, old_main +from . import hooks diff --git a/nengo_gui/components/sim_control.py b/nengo_gui/components/sim_control.py index b05a80c1..06d99714 100644 --- a/nengo_gui/components/sim_control.py +++ b/nengo_gui/components/sim_control.py @@ -9,6 +9,7 @@ from nengo_gui.components.component import Component import nengo_gui.exec_env from nengo_gui.server import WebSocketFrame +import nengo_gui.hooks class SimControl(Component): @@ -190,11 +191,18 @@ def javascript(self): def message(self, msg): if msg == 'pause': self.paused = True + nengo_gui.hooks.on_pause.trigger(self.page.model, + self.page.sim) elif msg == 'config': self.send_config_options = True elif msg == 'continue': if self.page.sim is None: self.page.rebuild = True + nengo_gui.hooks.on_start.trigger(self.page.model, + self.page.sim) + else: + nengo_gui.hooks.on_continue.trigger(self.page.model, + self.page.sim) self.paused = False elif msg == 'reset': self.paused = True diff --git a/nengo_gui/guibackend.py b/nengo_gui/guibackend.py index d7920fe9..7a8ed807 100644 --- a/nengo_gui/guibackend.py +++ b/nengo_gui/guibackend.py @@ -432,6 +432,7 @@ def create_page(self, filename, reset_cfg=False): def remove_page(self, page): self._last_access = time.time() + page.close() self.pages.remove(page) if (not self._shutting_down and self.settings.auto_shutdown > 0 and len(self.pages) <= 0): diff --git a/nengo_gui/page.py b/nengo_gui/page.py index b2095382..02e80b0d 100644 --- a/nengo_gui/page.py +++ b/nengo_gui/page.py @@ -13,6 +13,7 @@ import nengo_gui import nengo_gui.user_action import nengo_gui.config +import nengo_gui.hooks import nengo_gui.seed_generation @@ -513,6 +514,7 @@ def runner(self): self.sim.run_steps(self.sim.max_steps) else: self.sim.step() + nengo_gui.hooks.on_step.trigger(self.model, self.sim) except Exception as err: if self.finished: return @@ -520,8 +522,13 @@ def runner(self): self.error = dict(trace=traceback.format_exc(), line=line) self.sim = None while self.sims_to_close: + nengo_gui.hooks.on_close.trigger(self.model, self.sim) self.sims_to_close.pop().close() if self.rebuild: self.build() self.sim = None + + def close(self): + if self.sim is not None: + nengo_gui.hooks.on_close.trigger(self.model, self.sim) From 22e8f03a1bfa938ee60da1ec191b8c73f8c4d66b Mon Sep 17 00:00:00 2001 From: Terry Stewart Date: Wed, 30 May 2018 21:36:38 -0400 Subject: [PATCH 2/2] fixup! Added hooks registered per model --- nengo_gui/hooks.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 nengo_gui/hooks.py diff --git a/nengo_gui/hooks.py b/nengo_gui/hooks.py new file mode 100644 index 00000000..86f31f66 --- /dev/null +++ b/nengo_gui/hooks.py @@ -0,0 +1,22 @@ +import weakref + +class Hook(object): + def __init__(self): + self.callbacks = weakref.WeakKeyDictionary() + def trigger(self, model, sim): + items = self.callbacks.get(model, []) + for callback in items: + callback(sim) + def __call__(self, model): + def register(fn, model=model, callbacks=self.callbacks): + if model not in callbacks: + callbacks[model] = [fn] + else: + callbacks[model].append(fn) + return register + +on_step = Hook() +on_start = Hook() +on_pause = Hook() +on_continue = Hook() +on_close = Hook()