class ToggleGroup(set): def __init__(self, default=None): set.__init__(self) self._value = None self._curSelect = None self._default = default self._byValue = {} self._toggleProxies = {} self.changed = Event() def _itemToggled(self, item, value, isSet): if self._curSelect and self._curSelect is not item: self._curSelect._toggleInner(False) if isSet: self._value = value self._curSelect = item else: self._value = self._default self._curSelect = None self.changed.trigger(self._value) def remove(self, x): x.toggled.removeResponder(self._toggleProxies[x]) if self._curSelect is x: self._itemToggled(x, None, False) del self._byValue[x._value] set.remove(self, x) def add(self, x): if self._byValue.has_key(x._value): raise KeyError("This ToggleGroup already has a Toggle with value "+x._value) self._toggleProxies[x] = lambda value, isSet: self._itemToggled(x, value, isSet) x.toggled.addResponder(self._toggleProxies[x]) set.add(self, x) self._byValue[x._value] = x
def __init__(self): Widget.__init__(self) self._mouseIn = False self._focusLock = False self.mouseOver.addResponder(self._focused) self.mouseOut.addResponder(self._unfocused) self.focus = Event() self.unfocus = Event()
def __init__(self): self.lastpos = None self.pos = None self.move = Event() self.down = Event() self.up = Event() self.items = [self.move, self.down, self.up]
class Keyboard(Input): def __init__(self): self.down = Event() self.up = Event() self.items = [self.down, self.up] def update(self, e): if e.type == KEYDOWN: self.down.trigger(e.key) elif e.type == KEYUP: self.up.trigger(e.key)
def __init__(self, default=None): set.__init__(self) self._value = None self._curSelect = None self._default = default self._byValue = {} self._toggleProxies = {} self.changed = Event()
class Clickable(MouseTracking): def __init__(self): MouseTracking.__init__(self) self._clicking = False self.mouseDown.addResponder(self._clickStart) self.mouseUp.addResponder(self._clickEnd) self.clicked = Event() def _clickStart(self, button): if self._focused and not self._clicking: self._clicking = button self._focusLock = True def _clickEnd(self, button): if self._focused and self._clicking == button: self.clicked.trigger(button) self._clicking = False self._focusLock = False
class MouseTracking(Widget): def __init__(self): Widget.__init__(self) self._mouseIn = False self._focusLock = False self.mouseOver.addResponder(self._focused) self.mouseOut.addResponder(self._unfocused) self.focus = Event() self.unfocus = Event() def _focused(self): if not self._mouseIn: self._mouseIn = True self.focus.trigger() def _unfocused(self): if self._mouseIn and not self._focusLock: self._mouseIn = False self.unfocus.trigger()
def __init__(self, curves=None): if not hasattr(curves, '__len__') and curves is not None: self._curve = curves curves = [curves] if curves is None: curves = [] self._curves = filter(lambda c: c is not None, curves) self._lastUpdate = 0 self.updated = Event() # these are triggered by Timelines self.started = Event() self.finished = Event()
class Toggle(Rectangle, Clickable): def __init__(self, unsetColor=(1.0,1.0,1.0), setColor=(0.0,0.0,0.0), opacity=1.0, borderColor=(0.0,0.0,0.0), borderWidth=1.0, value=True): Rectangle.__init__(self) Clickable.__init__(self) self.clicked.addResponder(self._clicked) self.toggled = Event() self._value = value self._isSet = False self.unsetColor = unsetColor self.setColor = setColor self._setFillColor() self.fillOpacity = opacity self.borderColor = borderColor self.borderWidth = borderWidth def _setFillColor(self): if self._isSet: self.fillColor = self.setColor else: self.fillColor = self.unsetColor def _clicked(self, button): if button == 1: self.toggle() def _toggleInner(self, isSet): self._isSet = isSet self._setFillColor() def toggle(self, isSet=None): if isSet is None: isSet = (not self._isSet) self._toggleInner(isSet) self.toggled.trigger(self._value, self._isSet)
class Action: def __init__(self, curves=None): if not hasattr(curves, '__len__') and curves is not None: self._curve = curves curves = [curves] if curves is None: curves = [] self._curves = filter(lambda c: c is not None, curves) self._lastUpdate = 0 self.updated = Event() # these are triggered by Timelines self.started = Event() self.finished = Event() def conflictsWith(self, other): return False def overlaps(self, other): return ((other.start() <= self.start() <= other.end()) or (other.start() <= self.end() <= other.end())) def start(self): return min([c.start() for c in self._curves]) def end(self): if self._curves is None: return None return max([c.end() for c in self._curves]) def length(self): return self.end() - self.start() def _innerStarted(self): return self._lastUpdate >= self.start() def _innerFinished(self): return self._lastUpdate >= self.end() def started(self): c = Condition(self._innerStarted) self.updated.addResponder(c.poll) return c def finished(self): c = Condition(self._innerFinished) self.updated.addResponder(c.poll) return c def update(self, time): self._lastUpdate = time self.updated.trigger()
def __init__(self, unsetColor=(1.0,1.0,1.0), setColor=(0.0,0.0,0.0), opacity=1.0, borderColor=(0.0,0.0,0.0), borderWidth=1.0, value=True): Rectangle.__init__(self) Clickable.__init__(self) self.clicked.addResponder(self._clicked) self.toggled = Event() self._value = value self._isSet = False self.unsetColor = unsetColor self.setColor = setColor self._setFillColor() self.fillOpacity = opacity self.borderColor = borderColor self.borderWidth = borderWidth
class Mouse(Input): def __init__(self): self.lastpos = None self.pos = None self.move = Event() self.down = Event() self.up = Event() self.items = [self.move, self.down, self.up] def update(self, e): if e.type == MOUSEMOTION: self.lastpos = self.pos # solidfuel mouse is y-flipped self.pos = (e.pos[0], getDisplay().h - e.pos[1]) self.move.trigger(e.rel) elif e.type == MOUSEBUTTONDOWN: self.down.trigger(e.button) elif e.type == MOUSEBUTTONUP: self.up.trigger(e.button)
def __init__(self): MouseTracking.__init__(self) self._clicking = False self.mouseDown.addResponder(self._clickStart) self.mouseUp.addResponder(self._clickEnd) self.clicked = Event()
def __init__(self): self.down = Event() self.up = Event() self.items = [self.down, self.up]