Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@member.fsf.org>2009-02-11 01:33:37 (GMT)
committer Aleksey Lim <alsroot@member.fsf.org>2009-02-11 01:33:37 (GMT)
commitbdd7ec2b70603ae866fc2d45148c71a43b04b0f3 (patch)
tree3dc4d0b1b66b17b33bbe5d202e514663bec8caa9
parentd3d4f5937ec7bb7ca762eb14d4d4992d7a7acdc9 (diff)
Use overlap stack for keyframes
-rw-r--r--flipsticks.py55
-rw-r--r--model.py7
-rw-r--r--screen.py6
3 files changed, 41 insertions, 27 deletions
diff --git a/flipsticks.py b/flipsticks.py
index dd1310e..c1014a9 100644
--- a/flipsticks.py
+++ b/flipsticks.py
@@ -115,7 +115,7 @@ class flipsticks:
if _inarea(x,y,DRAWWIDTH,DRAWHEIGHT):
xdiff = x-self.key.middle[0]
ydiff = y-self.key.middle[1]
- self.shiftjoints(xdiff,ydiff)
+ self.key.move(xdiff, ydiff)
self.key.middle = (x,y)
self.drawmainframe()
elif self.rotatepressed:
@@ -161,12 +161,14 @@ class flipsticks:
state = event.state
if state & gtk.gdk.BUTTON1_MASK and self.pixmap != None:
if self.kfpressed >= 0:
- if _inarea(x,y,KEYFRAMEWIDTH,KEYFRAMEHEIGHT):
+ if _inarea(x, y, KEYFRAMEWIDTH, KEYFRAMEHEIGHT):
xdiff = int(x - self.kf_mouse_pos)
- self.shiftjoints(xdiff,0, model.keys[self.kfpressed].scaled_joints)
- model.keys[self.kfpressed].x += xdiff
+ frame = model.keys[self.kfpressed]
+ if frame.x + xdiff > KEYFRAME_RADIUS \
+ and frame.x + xdiff < KEYFRAMEWIDTH-KEYFRAME_RADIUS:
+ frame.move(xdiff)
+ self.drawkeyframe()
self.kf_mouse_pos = x
- self.drawkeyframe()
return True
def button_press_event(self, widget, event):
@@ -191,7 +193,7 @@ class flipsticks:
def kf_button_press_event(self, widget, event):
if event.button == 1 and self.pixmap != None:
- kfnum = _inkeyframe(event.x, event.y)
+ kfnum = self._inkeyframe(event.x, event.y)
if kfnum >= 0:
self.kf_mouse_pos = event.x
self.kfpressed = kfnum
@@ -305,16 +307,6 @@ class flipsticks:
model.keys[self.kfselected].clear()
self.drawkeyframe()
- def shiftjoints(self,xdiff,ydiff,joints=None):
- if not joints:
- joints = self.key.joints
- for jname in joints:
- #if isinstance(self.key.joints[jname],tuple):
- (jx,jy) = joints[jname]
- njx = jx + xdiff
- njy = jy + ydiff
- joints[jname] = (njx,njy)
-
def drawmainframe(self):
area = self.toplevel.window
drawgc = area.new_gc()
@@ -416,8 +408,9 @@ class flipsticks:
self.kfpixmap.draw_arc(drawgc,True,x-5,y-5,10,10,0,360*64)
x = width-10
self.kfpixmap.draw_arc(drawgc,True,x-5,y-5,10,10,0,360*64)
+
# draw the keyframe circles
- for i in range(len(model.keys)):
+ for i in list(reversed(self.keys_overlap_stack
# first the outer circle
x = model.keys[i].x
if i == self.kfselected:
@@ -566,6 +559,10 @@ class flipsticks:
self.mdirpath = mdirpath
self.stickselected = 'RIGHT SHOULDER'
+ self.keys_overlap_stack = []
+ for i in range(len(model.keys)):
+ self.keys_overlap_stack.append(i)
+
self.key = screen.ScreenFrame()
self.kfselected = 0
@@ -825,7 +822,20 @@ class flipsticks:
lhsize = parts['LEFT HAND']
self.drawstickman(drawgc, pixmap, middle, joints, hsize, rhsize, lhsize)
-def _inarea(x,y,awidth,aheight):
+ def _inkeyframe(self, x, y):
+ dy = math.pow(abs(y - KEYFRAMEHEIGHT/2), 2)
+
+ for i, key in enumerate(self.keys_overlap_stack):
+ dx = math.pow(abs(x - model.keys[key].x), 2)
+ l = math.sqrt(dx + dy)
+ if int(l) <= KEYFRAME_RADIUS:
+ self.keys_overlap_stack.pop(i)
+ self.keys_overlap_stack.insert(0, key)
+ return key
+
+ return -1
+
+def _inarea(x, y, awidth, aheight):
if x+5 > awidth:
return False
if y+5 > aheight:
@@ -835,12 +845,3 @@ def _inarea(x,y,awidth,aheight):
if x < 5:
return False
return True
-
-def _inkeyframe(x, y):
- dy = math.pow(abs(y - KEYFRAMEHEIGHT/2), 2)
- for i in range(len(model.keys)):
- dx = math.pow(abs(x - model.keys[i].x), 2)
- l = math.sqrt(dx + dy)
- if int(l) <= KEYFRAME_RADIUS:
- return i
- return -1
diff --git a/model.py b/model.py
index b031c89..479af62 100644
--- a/model.py
+++ b/model.py
@@ -44,6 +44,13 @@ class KeyFrame:
self.joints = None
self.scaled_joints = None
+ def move(self, dx):
+ if self.scaled_joints:
+ for jname in self.scaled_joints:
+ (jx, jy) = self.scaled_joints[jname]
+ self.scaled_joints[jname] = (jx+dx, jy)
+ self.x += dx
+
def save(filename):
out = []
diff --git a/screen.py b/screen.py
index 64b3860..a818a5e 100644
--- a/screen.py
+++ b/screen.py
@@ -76,6 +76,12 @@ class ScreenFrame:
return True
return False
+ def move(self, dx, dy):
+ if self.joints:
+ for jname in self.joints:
+ (jx, jy) = self.joints[jname]
+ self.joints[jname] = (jx+dx, jy+dy)
+
def _initjoints():
joints = {}
for stickname in theme.JOINTS: