Source code for elide.dummy
# This file is part of Elide, frontend to Lisien, a framework for life simulation games.
# Copyright (c) Zachary Spector, public@zacharyspector.com
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
from kivy.logger import Logger
from kivy.properties import (
NumericProperty,
ObjectProperty,
ReferenceListProperty,
StringProperty,
)
from . import menu # for kv
from .kivygarden.texturestack import ImageStack
from .util import load_string_once
[docs]
class Dummy(ImageStack):
"""A widget that looks like the ones on the graph, which, when dragged
onto the graph, creates one of them.
"""
_touch = ObjectProperty(None, allownone=True)
name = StringProperty()
prefix = StringProperty()
num = NumericProperty()
x_start = NumericProperty(0)
y_start = NumericProperty(0)
pos_start = ReferenceListProperty(x_start, y_start)
x_down = NumericProperty(0)
y_down = NumericProperty(0)
pos_down = ReferenceListProperty(x_down, y_down)
x_up = NumericProperty(0)
y_up = NumericProperty(0)
pos_up = ReferenceListProperty(x_up, y_up)
x_center_up = NumericProperty(0)
y_center_up = NumericProperty(0)
center_up = ReferenceListProperty(x_center_up, y_center_up)
right_up = NumericProperty(0)
top_up = NumericProperty(0)
[docs]
def on_paths(self, *args, **kwargs):
super().on_paths(*args, **kwargs)
Logger.debug("Dummy: {} got paths {}".format(self.name, self.paths))
[docs]
def on_touch_down(self, touch):
"""If hit, record my starting position, that I may return to it in
``on_touch_up`` after creating a real :class:`graph.Spot` or
:class:`graph.Pawn` instance.
"""
if not self.collide_point(*touch.pos):
return False
self.pos_start = self.pos
self.pos_down = (self.x - touch.x, self.y - touch.y)
touch.grab(self)
self._touch = touch
return True
[docs]
def on_touch_move(self, touch):
"""Follow the touch"""
if touch is not self._touch:
return False
self.pos = (touch.x + self.x_down, touch.y + self.y_down)
return True
[docs]
def on_touch_up(self, touch):
"""Return to ``pos_start``, but first, save my current ``pos`` into
``pos_up``, so that the layout knows where to put the real
:class:`graph.Spot` or :class:`graph.Pawn` instance.
"""
if touch is not self._touch:
return False
self.pos_up = self.pos
self.pos = self.pos_start
self._touch = None
return True
load_string_once("""
<Dummy>:
name: "".join((self.prefix, str(self.num)))
x_center_up: self.x_up + self.width / 2
y_center_up: self.y_up + self.height / 2
right_up: self.x_up + self.width
top_up: self.y_up + self.height
""")