Source code for bibliopixel.control.editor

import weakref
from . address import number, Address
from . receiver import Receiver
from .. util import deprecated


[docs]class Editor(Receiver): """ A `Editor` is a `Receiver` which gets and sets `Address`es, perhaps using an an optional `EditQueue` for the setting. When the `set_project` method is called, `Editor` searches down through the address and stores the most recent `edit_queue` method it finds. """ def __init__(self, address=None, project=None): self.address = Address(address) if project is not None: self.set_project(project)
[docs] def set_project(self, project): self.project = weakref.ref(project) self.segments = self.address.segments[:] self.last_segment = self.address.segments.pop() self.edit_queue = None for segment in self.address.segments: self.edit_queue = getattr(project, 'edit_queue', self.edit_queue) project = segment.get(project)
[docs] def receive(self, msg): """ Receives a message, and either sets it immediately, or puts it on the edit queue if there is one. """ if self.edit_queue: self.edit_queue.put_edit(self._set, msg) else: self._set(msg)
[docs] def get(self): return self.last_segment.get(self._get())
[docs] def set(self, value): self.receive((number(value),))
def __bool__(self): return bool(self.address) def __str__(self): return str(self.address) def _get(self): project = self.project and self.project() if project: for segment in self.address.segments: project = segment.get(project) return project def _set(self, values): args = self.address.assignment + values self.last_segment.set(self._get(), *args)