Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/elements/callbacks.py
diff options
context:
space:
mode:
authorWalter Bender <walter@sugarlabs.org>2014-03-07 19:44:11 (GMT)
committer Walter Bender <walter@sugarlabs.org>2014-03-07 19:44:11 (GMT)
commit8ba9d4ae100be129b255230790149f488032fa3c (patch)
tree791c00f957b6a04c8fd32e1c8059ce1e690b8ee7 /elements/callbacks.py
parent3d36a1c34a7c49f4265bb669aefcacededc94e55 (diff)
elements cleanupgtk3
Diffstat (limited to 'elements/callbacks.py')
-rw-r--r--elements/callbacks.py67
1 files changed, 37 insertions, 30 deletions
diff --git a/elements/callbacks.py b/elements/callbacks.py
index 01e9545..d3aae96 100644
--- a/elements/callbacks.py
+++ b/elements/callbacks.py
@@ -8,7 +8,7 @@ Home: http://elements.linuxuser.at
IRC: #elements on irc.freenode.org
Code: http://www.assembla.com/wiki/show/elements
- svn co http://svn2.assembla.com/svn/elements
+ svn co http://svn2.assembla.com/svn/elements
License: GPLv3 | See LICENSE for the full text
This program is free software: you can redistribute it and/or modify
@@ -22,70 +22,78 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
+along with this program. If not, see <http://www.gnu.org/licenses/>.
"""
from locals import *
from elements import box2d
+
class CallbackHandler:
- # List of contact callbacks and shapes to start them - sorted by type for quicker access
- # Callbacks are saved as callbacks[callback_type][[function, parameters], ...]
- callbacks = {}
-
+ # List of contact callbacks and shapes to start them - sorted by
+ # type for quicker access Callbacks are saved as
+ # callbacks[callback_type][[function, parameters], ...]
+ callbacks = {}
+
def __init__(self, parent):
self.parent = parent
-
- # init callback dict to avoid those slow try
+
+ # init callback dict to avoid those slow try
# (especially for self.get, as it is called *often*)
for i in xrange(10):
self.callbacks[i] = []
-
+
def add(self, callback_type, callback_handler, *args):
""" Users can add callbacks for certain (or all) collisions
-
+
Parameters:
- callback_type ......... CALLBACK_CONTACT (nothing else for now)
+ callback_type ......... CALLBACK_CONTACT
+ (nothing else for now)
callback_handler ...... a callback function
- args (optional) ....... a list of parameters which can be used with callbacks.get
-
+ args (optional) ....... a list of parameters which can be
+ used with callbacks.get
+
Return:
callback_id ... used to remove a callback later (int)
"""
# Create contact listener if required
- if callback_type in [CALLBACK_CONTACT_ADD, CALLBACK_CONTACT_PERSIST, CALLBACK_CONTACT_REMOVE]:
- if self.parent.listener == None:
+ if callback_type in [CALLBACK_CONTACT_ADD,
+ CALLBACK_CONTACT_PERSIST,
+ CALLBACK_CONTACT_REMOVE]:
+ if self.parent.listener is None:
self.parent.listener = kContactListener(self.get)
- self.parent.world.SetContactListener( self.parent.listener )
+ self.parent.world.SetContactListener(self.parent.listener)
print "* ContactListener added"
-
+
# Get callback dict for this callback_type
c = self.callbacks[callback_type]
-
+
# Append to the Callback Dictionary
c.append([callback_handler, args])
self.callbacks[callback_type] = c
-
+
# Return Callback ID
# ID = callback_type.callback_index (1...n)
return "%i.%i" % (callback_type, len(c))
-
+
def get(self, callback_type):
return self.callbacks[callback_type]
-
+
def start(self, callback_type, *args):
callbacks = self.get(callback_type)
for c in callbacks:
callback, params = c
callback()
+
class kContactListener(box2d.b2ContactListener):
- def __init__(self, get_callbacks):
+
+ def __init__(self, get_callbacks):
# Init the Box2D b2ContactListener
box2d.b2ContactListener.__init__(self)
# Function to get the current callbacks
self.get_callbacks = get_callbacks
-
+
def check_contact(self, contact_type, point):
# Checks if a callback should be started with this contact point
contacts = self.get_callbacks(contact_type)
@@ -94,9 +102,9 @@ class kContactListener(box2d.b2ContactListener):
for c in contacts:
callback, bodylist = c
if len(bodylist) == 0:
- # Without bodylist it's a universal callback (for all bodies)
+ # Without bodylist it's a universal callback (for all bodies)
callback(point)
-
+
else:
# This is a callback with specified bodies
# See if this contact involves one of the specified
@@ -104,19 +112,18 @@ class kContactListener(box2d.b2ContactListener):
b2 = str(point.shape2.GetBody())
for s in bodylist:
s = str(s)
- if b1 == s or b2 == s:
+ if b1 == s or b2 == s:
# Yes, that's the one :)
callback(point)
-
+
def Add(self, point):
"""Called when a contact point is created"""
self.check_contact(CALLBACK_CONTACT_ADD, point)
-
+
def Persist(self, point):
"""Called when a contact point persists for more than a time step"""
self.check_contact(CALLBACK_CONTACT_PERSIST, point)
-
+
def Remove(self, point):
"""Called when a contact point is removed"""
self.check_contact(CALLBACK_CONTACT_REMOVE, point)
-