Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalter Bender <walter@walter-laptop.(none)>2010-01-21 15:05:11 (GMT)
committer Walter Bender <walter@walter-laptop.(none)>2010-01-21 15:05:11 (GMT)
commit5fb4e26f2329c8522047fb13a9f4975b309ce7d8 (patch)
treec8f6a5509eb7ee7ccaece0e074cfe0fc24ba0c18
parente072a53788f8f4b738f54d85565ac2377cfa2893 (diff)
fixed findsprite bug
-rw-r--r--TurtleArtActivity.py6
-rw-r--r--block.py20
-rw-r--r--constants.py11
-rwxr-xr-xsprite_factory.py59
-rw-r--r--sprites.py5
-rw-r--r--talogo.py21
-rw-r--r--taproject.py3
-rw-r--r--tasetup.py13
-rw-r--r--taturtle.py12
-rw-r--r--tawindow.py30
10 files changed, 143 insertions, 37 deletions
diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py
index 15bd409..d5b5ed2 100644
--- a/TurtleArtActivity.py
+++ b/TurtleArtActivity.py
@@ -63,6 +63,8 @@ from taexporthtml import *
from taexportlogo import *
import re
+from constants import *
+
SERVICE = 'org.laptop.TurtleArtActivity'
IFACE = SERVICE
PATH = '/org/laptop/TurtleArtActivity'
@@ -419,7 +421,7 @@ class TurtleArtActivity(activity.Activity):
self.tw.cartesian_coordinates_spr.hide()
self.tw.cartesian = False
else:
- self.tw.cartesian_coordinates_spr.set_layer(610)
+ self.tw.cartesian_coordinates_spr.set_layer(OVERLAY_LAYER)
self.tw.cartesian = True
def _do_polar_cb(self, button):
@@ -427,7 +429,7 @@ class TurtleArtActivity(activity.Activity):
self.tw.polar_coordinates_spr.hide()
self.tw.polar = False
else:
- self.tw.polar_coordinates_spr.set_layer(610)
+ self.tw.polar_coordinates_spr.set_layer(OVERLAY_LAYER)
self.tw.polar = True
"""
diff --git a/block.py b/block.py
index f88dd27..02fcaf4 100644
--- a/block.py
+++ b/block.py
@@ -93,7 +93,7 @@ class Block:
else:
print "%s %s (%d %d)" % (name, labels[0], x, y)
- svg = block_factory.SVG()
+ svg = sprite_factory.SVG()
if name in TURTLE_PALETTE:
svg.set_colors(TURTLE_COLORS)
elif name in PEN_PALETTE:
@@ -167,6 +167,24 @@ class Block:
for label in labels:
self.spr.set_label(label, labels.index(label))
+ self.type = 'block'
+
+class Turtle:
+ def __init__(self, blocks, orientation=0, scale=1.0):
+ self.blocks = blocks
+ self.spr = None
+ self._new_turtle_from_prototype(orientation, scale)
+ self.blocks.append_to_list(self)
+ self.orientation = orientation
+
+ def _new_turtle_from_prototype(self, orientation, scale):
+ svg = sprite_factory.SVG()
+ svg.set_scale(scale)
+ svg.set_orientation(orientation)
+ self.spr = sprites.Sprite(self.blocks.sprites, 0, 0,
+ svg_str_to_pixbuf(svg.turtle()))
+ self.type = 'turtle'
+
#
# Load pixbuf from SVG string
#
diff --git a/constants.py b/constants.py
index 47d6b86..41e11dd 100644
--- a/constants.py
+++ b/constants.py
@@ -13,6 +13,17 @@
from gettext import gettext as _
+# sprite layers
+CANVAS_LAYER = 600
+TURTLE_LAYER = 630
+HIDE_LAYER = 100
+OVERLAY_LAYER = 615
+STATUS_LAYER = 710
+TOP_LAYER = 2000
+BLOCK_LAYER = 650
+CATEGORY_LAYER = 660
+TAB_LAYER = 670
+
# block to proto tables
BASIC_STYLE_HEAD = ['start', 'action 1', 'action 2']
BASIC_STYLE_TAIL = ['stop action']
diff --git a/sprite_factory.py b/sprite_factory.py
index 061d624..e56ff09 100755
--- a/sprite_factory.py
+++ b/sprite_factory.py
@@ -34,6 +34,7 @@ class SVG:
self._width = 0
self._height = 0
self._scale = 1
+ self._orientation = 0
self._radius = 8
self._stroke_width = 1
self._innie = [False]
@@ -197,6 +198,43 @@ class SVG:
svg += self._end_boolean()
return self._header() + svg
+ def turtle(self):
+ self._fill, self._stroke = "#D0D000", "none"
+ svg = self._rect(21, 21, 19.5, 18)
+ self._fill = "#808000"
+ svg += self._rect(3, 3, 30, 24)
+ svg += self._rect(3, 3, 24, 24)
+ svg += self._rect(3, 3, 30, 30)
+ svg += self._rect(3, 3, 24, 30)
+ svg += self._rect(3, 3, 27, 27)
+ svg += self._rect(3, 3, 21, 27)
+ svg += self._rect(3, 3, 33, 27)
+ svg += self._rect(3, 3, 27, 21)
+ svg += self._rect(3, 3, 21, 21)
+ svg += self._rect(3, 3, 33, 21)
+ svg += self._rect(3, 3, 27, 33)
+ svg += self._rect(3, 3, 21, 33)
+ svg += self._rect(3, 3, 33, 33)
+ svg += self._rect(3, 3, 30, 36)
+ svg += self._rect(3, 3, 24, 36)
+ svg += self._rect(3, 3, 30, 18)
+ svg += self._rect(3, 3, 24, 18)
+ svg += self._rect(3, 3, 36, 24)
+ svg += self._rect(3, 3, 36, 30)
+ svg += self._rect(3, 3, 36, 18)
+ svg += self._rect(3, 3, 36, 36)
+ self._fill, self._stroke = "#008000", "#008000"
+ svg += self._turtle_body()
+ self._fill, self._stroke = "#00a000", "#00a000"
+ svg += self._turtle_shell()
+ self._fill, self._stroke = "#000000", "#000000"
+ svg += self._circle(1.25,32.5,8)
+ svg += self._circle(1.25,27.5,8)
+ svg += self._footer()
+ self._width, self._height = 60, 60
+ # TODO: Add orientation
+ return self._header() + svg
+
#
# Utility methods
#
@@ -204,6 +242,9 @@ class SVG:
def set_scale(self, scale=1):
self._scale = scale
+ def set_orientation(self, orientation=0):
+ self._orientation = orientation
+
def expand(self, w=0, h=0):
self._expand_x = w
self._expand_y = h
@@ -319,6 +360,24 @@ class SVG:
"stroke-linecap:square;",
"stroke-opacity:1;\" />\n")
+ def _circle(self, r, cx, cy):
+ return "%s%s%s%s%s%f%s%f%s%f%s" % ("<circle style=\"fill:",
+ self._fill, ";stroke:", self._stroke, ";\" r=\"", r, "\" cx=\"",
+ cx, "\" cy=\"", cy, "\" />")
+
+ def _rect(self, w, h, x, y):
+ return "%s%s%s%s%s%f%s%f%s%f%s%f%s" % ("<rect style=\"fill:",
+ self._fill, ";stroke:", self._stroke, ";\" width=\"", w,
+ "\" height=\"", h,"\" x=\"", x, "\" y=\"", y, "\" />")
+
+ def _turtle_body(self):
+ return "%s%s%s%s%s" % ("<path style=\"", self._fill, ";stroke:",
+ self._stroke, "\" d=\"M 20,42 C 21,41 23,40 24,40 C 24,39 24,40 26,41 C 28,43 31,43 34,41 C 35,40 35,39 36,40 C 36,40 38,41 39,42 C 41,42 45,43 46,43 C 47,43 46,41 43,39 L 39,36 L 42,34 C 44,30 45,28 43,25 L 41,22 L 46,18 C 48,16 47.5,13.5 47,13 C 46.5,12.5 46,13 45,13 C 44,13 43.5,14 42.5,15 C 39.5,17 40,18 37,17 C 32,16 31.5,15 34.5,12 C 36.5,10 36,7 34,6 C 32,3 28,4 26,6 C 24,8 23,10 25,12 C 28,15 27,16 22,17 C 18,18 19,17 17,15 C 16,14 16,13 15,13 C 14,13 13,13 13,13 C 12,13 11,16 14,18 L 19,22 L 17,25 C 15,28 16,30 18,34 L 20,36 L 16,39 C 13,41 12,43 13,43 C 14,43 18,42 20,42 z M 30,18 C 32,18 36,19 38,20 C 40,22 39.5,25 39.5,28 C 39.5,30 40,32.5 38.5,35 C 37,36.5 36.5,37.5 35,38 C 33.5,38.5 31,39 30,39 C 28,39 26,39 25,38 C 23,37 22.5,37 21.5,35 C 20.5,33 20.5,30 20.5,28 C 20.5,25 20,22 22,20 C 24,19 27,18 30,18 z\" />")
+
+ def _turtle_shell(self):
+ return "%s%s%s%s%s" % ("<path style=\"", self._fill, ";stroke:",
+ self._stroke, "\" d=\"M 33,10 C 33,11 31.5,12 30,12 C 28,12 27,11 27,10 C 27,9 28,8 30,8 C 31.5,8 33,9 33,10 z\" />")
+
def _check_min_max(self):
if self._x < self._min_x:
self._min_x = self._x
diff --git a/sprites.py b/sprites.py
index 2b5e9ad..23626c5 100644
--- a/sprites.py
+++ b/sprites.py
@@ -67,7 +67,7 @@ class Sprites:
self.list.remove(spr)
def find_sprite(self, pos):
- list = self.list
+ list = self.list[:]
list.reverse()
for spr in list:
if spr.hit(pos): return spr
@@ -171,10 +171,12 @@ class Sprite:
self.sprites.remove_from_list(self)
def inval(self):
+ # print "inval (%f,%f) (%f,%f)" % (self.x,self.y,self.width,self.height)
self.sprites.area.invalidate_rect(
gtk.gdk.Rectangle(self.x,self.y,self.width,self.height), False)
def draw(self):
+ # print "draw (%f,%f)" % (self.x,self.y)
if isinstance(self.image, gtk.gdk.Pixbuf):
self.sprites.area.draw_pixbuf(
self.sprites.gc, self.image, 0, 0, self.x, self.y)
@@ -183,7 +185,6 @@ class Sprite:
self.sprites.gc, self.image, 0, 0, self.x, self.y, -1, -1)
if len(self.labels) > 0:
self.draw_label()
- # self.inval()
def hit(self, pos):
x, y = pos
diff --git a/talogo.py b/talogo.py
index 1a54be5..bbb91d9 100644
--- a/talogo.py
+++ b/talogo.py
@@ -44,6 +44,9 @@ from tajail import *
from gettext import gettext as _
+from constants import *
+
+
procstop = False
class symbol:
@@ -158,7 +161,7 @@ def readline(lc, line):
return res
def setup_cmd(lc, str):
- lc.tw.turtle.spr.set_layer(100)
+ lc.tw.turtle.spr.set_layer(HIDE_LAYER)
lc.procstop=False
list = readline(lc, str)
lc.step = start_eval(lc, list)
@@ -176,11 +179,11 @@ def evline(lc, list):
lc.arglist = None
while lc.iline:
if lc.tw.step_time > 0:
- lc.tw.turtle.spr.set_layer(630)
+ lc.tw.turtle.spr.set_layer(TURTLE_LAYER)
endtime = millis()+an_int(lc,lc.tw.step_time)*100
while millis()<endtime:
yield True
- lc.tw.turtle.spr.set_layer(100)
+ lc.tw.turtle.spr.set_layer(HIDE_LAYER)
token = lc.iline[0]
if token==lc.symopar: token=lc.iline[1]
icall(lc, eval); yield True
@@ -274,7 +277,7 @@ def debug_trace(lc, token):
shp = 'info'
lc.tw.status_spr.set_shape(lc.tw.status_shapes[shp])
lc.tw.status_spr.set_label(_(my_string))
- lc.tw.status_spr.set_layer(710)
+ lc.tw.status_spr.set_layer(STATUS_LAYER)
return
def undefined_check(lc, token):
@@ -286,11 +289,11 @@ def no_args_check(lc):
raise logoerror("#noinput")
def prim_wait(lc,time):
- lc.tw.turtle.spr.set_layer(630)
+ lc.tw.turtle.spr.set_layer(TURTLE_LAYER)
endtime = millis()+an_int(lc,time*1000)
while millis()<endtime:
yield True
- lc.tw.turtle.spr.set_layer(100)
+ lc.tw.turtle.spr.set_layer(HIDE_LAYER)
ireturn(lc); yield True
def prim_repeat(lc, num, list):
@@ -989,11 +992,11 @@ def doevalstep(lc):
try:
lc.step.next()
except StopIteration:
- lc.tw.turtle.spr.set_layer(630)
+ lc.tw.turtle.spr.set_layer(TURTLE_LAYER)
return False
except logoerror, e:
showlabel(lc, str(e)[1:-1])
- lc.tw.turtle.spr.set_layer(630)
+ lc.tw.turtle.spr.set_layer(TURTLE_LAYER)
return False
return True
@@ -1069,7 +1072,7 @@ def showlabel(lc,label):
shp = 'status'
lc.tw.status_spr.set_shape(lc.tw.status_shapes[shp])
lc.tw.status_spr.set_label(label)
- lc.tw.status_spr.set_layer(710)
+ lc.tw.status_spr.set_layer(STATUS_LAYER)
def stop_logo(tw):
tw.step_time = 0
diff --git a/taproject.py b/taproject.py
index f550dd6..2b1db79 100644
--- a/taproject.py
+++ b/taproject.py
@@ -52,6 +52,7 @@ except:
pass
import block
import sprites
+from constants import *
nolabel = ['audiooff', 'descriptionoff', 'journal']
shape_dict = {'journal':'texton', \
@@ -192,7 +193,7 @@ def load_spr(tw,b):
except:
if hasattr(spr,"ds_id"):
print "couldn't open dsobject (" + str(spr.ds_id) + ")"
- spr.set_layer(650)
+ spr.set_layer(BLOCK_LAYER)
return spr
def load_turtle(tw,b):
diff --git a/tasetup.py b/tasetup.py
index 8661f31..7fd22cd 100644
--- a/tasetup.py
+++ b/tasetup.py
@@ -33,6 +33,7 @@ from gettext import gettext as _
import block
import sprites
+from constants import *
def numcheck(new, old):
if new is '': return "0"
@@ -268,16 +269,18 @@ def setup_misc(tw):
# tw.category_spr = Sprite(tw, 0, 0, tw.selbuttons[0].group)
tw.category_spr = sprites.Sprite(tw.sprites, 0, 0, tw.selbuttons[0].group)
tw.category_spr.type = 'category'
- tw.category_spr.set_layer(660)
+ tw.category_spr.set_layer(CATEGORY_LAYER)
# masks get positioned on top of other blocks
# tw.select_mask = Sprite(tw,100,100,\
tw.select_mask = sprites.Sprite(tw.sprites, 100, 100,\
load_image(tw, tw.path, '', 'masknumber'))
tw.select_mask.type = 'selectmask'
+ tw.select_mask.hide()
# tw.select_mask_string = Sprite(tw,100,100,\
tw.select_mask_string = sprites.Sprite(tw.sprites, 100, 100,\
load_image(tw, tw.path, '', 'maskstring'))
tw.select_mask_string.type = 'selectmask'
+ tw.select_mask_string.hide()
# used to hide the palette
tw.hidden_palette_icon = load_image(tw, tw.path, '','blocks-')
# media blocks get positioned into other blocks
@@ -294,13 +297,13 @@ def setup_misc(tw):
tw.cartesian_coordinates_spr = sprites.Sprite(tw.sprites, tw.width/2-600, tw.height/2-450, \
load_image(tw, tw.path, '', "Cartesian"))
tw.cartesian_coordinates_spr.type = 'coordinates'
- tw.cartesian_coordinates_spr.set_layer(610)
+ tw.cartesian_coordinates_spr.set_layer(OVERLAY_LAYER)
tw.cartesian_coordinates_spr.hide()
# tw.polar_coordinates_spr = Sprite(tw, tw.width/2-600, tw.height/2-450, \
tw.polar_coordinates_spr = sprites.Sprite(tw.sprites, tw.width/2-600, tw.height/2-450, \
load_image(tw, tw.path, '', "polar"))
tw.polar_coordinates_spr.type = 'coordinates'
- tw.polar_coordinates_spr.set_layer(610)
+ tw.polar_coordinates_spr.set_layer(OVERLAY_LAYER)
tw.polar_coordinates_spr.hide()
# status shapes get positioned at the bottom of the screen
tw.status_shapes = {}
@@ -321,7 +324,7 @@ def setup_misc(tw):
tw.status_spr.set_label("test")
# tw.status_spr.set_label_attributes(1.0, True, "left")
tw.status_spr.type = 'status'
- tw.status_spr.set_layer(900)
+ tw.status_spr.set_layer(HIDE_LAYER)
tw.status_spr.hide()
# everything should be loaded at this point
# print tw.status_shapes
@@ -333,7 +336,7 @@ def setup_selector(tw,name,y,blockdescriptions):
onshape = load_image(tw, tw.path, 'palette', name+'on')
# spr = Sprite(tw,143,y,offshape)
spr = sprites.Sprite(tw.sprites, 143, y, offshape)
- spr.set_layer(800)
+ spr.set_layer(TAB_LAYER)
spr.offshape = offshape
spr.onshape = onshape
# print 'setting up selector ' + name
diff --git a/taturtle.py b/taturtle.py
index f11b579..823e8f8 100644
--- a/taturtle.py
+++ b/taturtle.py
@@ -26,8 +26,11 @@ class taTurtle: pass
# from tasprites import *
from tasetup import load_image
import sprites
+import block
import pango
+from constants import *
+
colors = {}
DEGTOR = 2*pi/360
@@ -59,13 +62,15 @@ def tNew(tw,w,h):
# t.canvas = Sprite(tw,0,0,gtk.gdk.Pixmap(tw.area,w,h,-1))
t.canvas = sprites.Sprite(tw.sprites, 0, 0, gtk.gdk.Pixmap(tw.area,w,h,-1))
t.canvas.type = 'canvas'
- t.canvas.set_layer(600)
+ t.canvas.set_layer(CANVAS_LAYER)
t.shapelist = \
[load_image(tw, tw.path, 'shapes','t'+str(i)) for i in range(36)]
# t.spr = Sprite(tw,100,100,t.shapelist[0])
- t.spr = sprites.Sprite(tw.sprites, 100, 100, t.shapelist[0])
+ # t.spr = sprites.Sprite(tw.sprites, 100, 100, t.shapelist[0])
+ t.blk = block.Turtle(tw.blocks)
+ t.spr = t.blk.spr
t.spr.type = 'turtle'
- t.spr.set_layer(630)
+ t.spr.set_layer(TURTLE_LAYER)
t.gc = t.canvas.image.new_gc()
t.shade = 0
clearscreen(t)
@@ -85,6 +90,7 @@ def clearscreen(t):
t.pendown = True
move_turtle(t)
turn_turtle(t)
+ # t.tw.sprites.redraw_sprites()
return None
def forward(t, n):
diff --git a/tawindow.py b/tawindow.py
index 5da2cf8..53aa435 100644
--- a/tawindow.py
+++ b/tawindow.py
@@ -166,8 +166,7 @@ class TurtleArtWindow():
change the icon for user-defined blocks after Python code is loaded
"""
def set_userdefined(self):
- list = self.sprites.list[:]
- for spr in list:
+ for spr in self.sprites.list:
if hasattr(spr,'proto') and spr.proto.name == 'nop':
setimage(spr,self.media_shapes['pythonloaded'])
self.nop = 'pythonloaded'
@@ -177,13 +176,13 @@ class TurtleArtWindow():
"""
def hideshow_button(self):
if self.hide is False:
- for b in self._blocks(): b.set_layer(100)
+ for b in self._blocks(): b.set_layer(HIDE_LAYER)
self._hide_palette()
self.select_mask.hide()
self.select_mask_string.hide()
self.hide = True
else:
- for b in self._blocks(): b.set_layer(650)
+ for b in self._blocks(): b.set_layer(BLOCK_LAYER)
self.show_palette()
self.hide = False
self.turtle.canvas.inval()
@@ -220,13 +219,16 @@ class TurtleArtWindow():
if self.selected_block != None:
self._unselect()
else:
- self.status_spr.set_layer(400)
+ self.status_spr.set_layer(HIDE_LAYER)
spr = self.sprites.find_sprite((x,y))
+ print "found %s at (%d,%d)" % (str(spr),x,y)
self.x, self.y = x,y
self.dx = 0
self.dy = 0
if spr is None:
return True
+ if hasattr(spr, 'type'):
+ print "type: %s" % (spr.type)
if spr.type == "canvas":
return True
elif spr.type == 'selbutton':
@@ -260,7 +262,7 @@ class TurtleArtWindow():
show palette
"""
def show_palette(self):
- for i in self.selbuttons: i.set_layer(800)
+ for i in self.selbuttons: i.set_layer(TAB_LAYER)
self._select_category(self.selbuttons[0])
self.palette = True
@@ -705,19 +707,19 @@ class TurtleArtWindow():
for b in self.draggroup:
b.move((b.x+200, b.y))
self._snap_to_dock()
- for b in self.draggroup: b.set_layer(650)
+ for b in self.draggroup: b.set_layer(BLOCK_LAYER)
self.draggroup = None
if self.block_operation=='click':
if self.spr.proto.name=='number':
self.selected_block = spr
self.select_mask.move((spr.x-5,spr.y-5))
- self.select_mask.set_layer(660)
+ self.select_mask.set_layer(MASK_LAYER)
self.firstkey = True
elif self.defdict.has_key(spr.proto.name):
self.selected_block = spr
if self.spr.proto.name=='string':
self.select_mask_string.move((spr.x-5,spr.y-5))
- self.select_mask_string.set_layer(660)
+ self.select_mask_string.set_layer(MASK_LAYER)
self.firstkey = True
elif self.spr.proto.name in self.importblocks:
self._import_from_journal(spr)
@@ -735,13 +737,13 @@ class TurtleArtWindow():
if self.spr.proto.name=='number':
self.selected_block = self.spr
self.select_mask.move((self.spr.x-5,self.spr.y-5))
- self.select_mask.set_layer(660)
+ self.select_mask.set_layer(MASK_LAYER)
self.firstkey = True
elif self.defdict.has_key(self.spr.proto.name):
self.selected_block = self.spr
if self.spr.proto.name=='string':
self.select_mask_string.move((self.spr.x-5,self.spr.y-5))
- self.select_mask_string.set_layer(660)
+ self.select_mask_string.set_layer(MASK_LAYER)
self.firstkey = True
elif self.spr.proto.name in self.importblocks:
self._import_from_journal(self.spr)
@@ -877,7 +879,7 @@ class TurtleArtWindow():
newblk = block.Block(self.blocks,proto.name,x-20,y-20,[proto.name])
newspr = newblk.spr
- newspr.set_layer(2000)
+ newspr.set_layer(TOP_LAYER)
self.dragpos = 20,20
newspr.type = 'block'
newspr.proto = proto
@@ -895,7 +897,7 @@ class TurtleArtWindow():
argspr.type = 'block'
argspr.proto = argproto
argspr.set_label(str(proto.defaults[i]))
- argspr.set_layer(2000)
+ argspr.set_layer(TOP_LAYER)
argspr.connections = [newspr,None]
newspr.connections[i+1] = argspr
self.draggroup = findgroup(newspr)
@@ -909,7 +911,7 @@ class TurtleArtWindow():
def _block_pressed(self, mask, x, y, spr):
if spr is not None:
self.draggroup = findgroup(spr)
- for b in self.draggroup: b.set_layer(2000)
+ for b in self.draggroup: b.set_layer(TOP_LAYER)
if spr.connections[0] != None and spr.proto.name == 'lock':
b = self._find_top_block(spr)
self.dragpos = x-b.x,y-b.y