Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaúl Gutiérrez S <rgs@paraguayeduca.org>2009-12-08 20:35:51 (GMT)
committer Raúl Gutiérrez S <rgs@paraguayeduca.org>2009-12-08 20:35:51 (GMT)
commit1e00234eb98fd7e6839048c465fb08bfc5a4325e (patch)
tree1711ed18e310f4701ea7ba6955febe9060d08206
parentb0c68db5e4adce027d9e83e054240c6a5a247f94 (diff)
More cleanup. Now we have the Sprite class where all the selected, copied, paste, etc. logic should go. Cleaned the corresponding client code as well, not thoroughfully tested , though
-rw-r--r--talogo.py18
-rw-r--r--taproject.py6
-rw-r--r--tasetup.py30
-rw-r--r--tasprites.py272
-rw-r--r--taturtle.py12
-rw-r--r--tawindow.py247
6 files changed, 296 insertions, 289 deletions
diff --git a/talogo.py b/talogo.py
index 16002d7..849e1e7 100644
--- a/talogo.py
+++ b/talogo.py
@@ -158,7 +158,7 @@ def readline(lc, line):
return res
def setup_cmd(lc, str):
- setlayer(lc.tw.turtle.spr,100)
+ lc.tw.turtle.spr.setlayer(100)
lc.procstop=False
list = readline(lc, str)
lc.step = start_eval(lc, list)
@@ -176,11 +176,11 @@ def evline(lc, list):
lc.arglist = None
while lc.iline:
if lc.tw.step_time > 0:
- setlayer(lc.tw.turtle.spr,630)
+ lc.tw.turtle.spr.setlayer(630)
endtime = millis()+an_int(lc,lc.tw.step_time)*100
while millis()<endtime:
yield True
- setlayer(lc.tw.turtle.spr,100)
+ lc.tw.turtle.spr.setlayer(100)
token = lc.iline[0]
if token==lc.symopar: token=lc.iline[1]
icall(lc, eval); yield True
@@ -274,7 +274,7 @@ def debug_trace(lc, token):
shp = 'info'
setshape(lc.tw.status_spr, lc.tw.status_shapes[shp])
setlabel(lc.tw.status_spr, _(my_string))
- setlayer(lc.tw.status_spr, 710)
+ lc.tw.status_spr.setlayer(710)
return
def undefined_check(lc, token):
@@ -286,11 +286,11 @@ def no_args_check(lc):
raise logoerror("#noinput")
def prim_wait(lc,time):
- setlayer(lc.tw.turtle.spr,630)
+ lc.tw.turtle.spr.setlayer(630)
endtime = millis()+an_int(lc,time*1000)
while millis()<endtime:
yield True
- setlayer(lc.tw.turtle.spr,100)
+ lc.tw.turtle.spr.setlayer(100)
ireturn(lc); yield True
def prim_repeat(lc, num, list):
@@ -989,11 +989,11 @@ def doevalstep(lc):
try:
lc.step.next()
except StopIteration:
- setlayer(lc.tw.turtle.spr,630)
+ lc.tw.turtle.spr.setlayer(630)
return False
except logoerror, e:
showlabel(lc, str(e)[1:-1])
- setlayer(lc.tw.turtle.spr,630)
+ lc.tw.turtle.spr.setlayer(630)
return False
return True
@@ -1069,7 +1069,7 @@ def showlabel(lc,label):
shp = 'status'
setshape(lc.tw.status_spr, lc.tw.status_shapes[shp])
setlabel(lc.tw.status_spr, label)
- setlayer(lc.tw.status_spr, 710)
+ lc.tw.status_spr.setlayer(710)
def stop_logo(tw):
tw.step_time = 0
diff --git a/taproject.py b/taproject.py
index 28b885e..8fde7c7 100644
--- a/taproject.py
+++ b/taproject.py
@@ -59,7 +59,7 @@ shape_dict = {'journal':'texton', \
def new_project(tw):
stop_logo(tw)
for b in blocks(tw): hide(b)
- setlayer(tw.turtle.canvas, 600)
+ tw.turtle.canvas.setlayer(600)
clearscreen(tw.turtle)
tw.save_file_name = None
@@ -162,7 +162,7 @@ def load_spr(tw,b):
media = label
label = None
proto = tw.protodict[btype]
- spr = sprNew(tw,b[2]+tw.turtle.canvas.x,b[3]+tw.turtle.canvas.y, \
+ spr = Sprite(tw,b[2]+tw.turtle.canvas.x,b[3]+tw.turtle.canvas.y, \
proto.image)
spr.type = 'block'
spr.proto = proto
@@ -181,7 +181,7 @@ def load_spr(tw,b):
dsobject.destroy()
except:
print "couldn't open dsobject (" + str(spr.ds_id) + ")"
- setlayer(spr,650)
+ spr.setlayer(650)
return spr
def load_turtle(tw,b):
diff --git a/tasetup.py b/tasetup.py
index 174c897..767ac7a 100644
--- a/tasetup.py
+++ b/tasetup.py
@@ -262,14 +262,14 @@ def setup_selectors(tw,s):
tw.selbuttons.append(cat)
def setup_misc(tw):
- tw.category_spr = sprNew(tw,0, 0, tw.selbuttons[0].group)
+ tw.category_spr = Sprite(tw,0, 0, tw.selbuttons[0].group)
tw.category_spr.type = 'category'
- setlayer(tw.category_spr,660)
+ tw.category_spr.setlayer(660)
# masks get positioned on top of other blocks
- tw.select_mask = sprNew(tw,100,100,\
+ tw.select_mask = Sprite(tw,100,100,\
load_image(tw, tw.path, '', 'masknumber'))
tw.select_mask.type = 'selectmask'
- tw.select_mask_string = sprNew(tw,100,100,load_image(tw, tw.path, '', \
+ tw.select_mask_string = Sprite(tw,100,100,load_image(tw, tw.path, '', \
'maskstring'))
tw.select_mask_string.type = 'selectmask'
# used to hide the palette
@@ -284,16 +284,16 @@ def setup_misc(tw):
tw.media_shapes['pythonloaded'] = \
load_image(tw, tw.path_lang, 'sensors', 'nop-loaded')
# coordinare systems
- tw.cartesian_coordinates_spr = sprNew(tw, tw.width/2-600, tw.height/2-450, \
+ tw.cartesian_coordinates_spr = Sprite(tw, tw.width/2-600, tw.height/2-450, \
load_image(tw, tw.path, '', "Cartesian"))
tw.cartesian_coordinates_spr.type = 'coordinates'
- setlayer(tw.cartesian_coordinates_spr, 610)
- hide(tw.cartesian_coordinates_spr)
- tw.polar_coordinates_spr = sprNew(tw, tw.width/2-600, tw.height/2-450, \
+ tw.cartesian_coordinates_spr.setlayer(610)
+ tw.cartesian_coordinates_spr.hide()
+ tw.polar_coordinates_spr = Sprite(tw, tw.width/2-600, tw.height/2-450, \
load_image(tw, tw.path, '', "polar"))
tw.polar_coordinates_spr.type = 'coordinates'
- setlayer(tw.polar_coordinates_spr, 610)
- hide(tw.polar_coordinates_spr)
+ tw.polar_coordinates_spr.setlayer(610)
+ tw.polar_coordinates_spr.hide()
# status shapes get positioned at the bottom of the screen
tw.status_shapes = {}
tw.status_shapes['status'] = load_image(tw, tw.path, '', 'status')
@@ -307,11 +307,11 @@ def setup_misc(tw):
tw.status_shapes['overflowerror'] = \
load_image(tw, tw.path, '', 'overflowerror')
tw.status_shapes['syntaxerror'] = load_image(tw, tw.path, '', 'syntaxerror')
- tw.status_spr = sprNew(tw,0,(tw.height-175), \
+ tw.status_spr = Sprite(tw,0,(tw.height-175), \
tw.status_shapes['status'],True)
tw.status_spr.type = 'status'
- setlayer(tw.status_spr,900)
- hide(tw.status_spr)
+ tw.status_spr.setlayer(900)
+ tw.status_spr.hide()
# everything should be loaded at this point
# print tw.status_shapes
tw.loaded = True
@@ -320,8 +320,8 @@ def setup_selector(tw,name,y,blockdescriptions):
# selector tabs
offshape = load_image(tw, tw.path, 'palette', name+'off')
onshape = load_image(tw, tw.path, 'palette', name+'on')
- spr = sprNew(tw,143,y,offshape)
- setlayer(spr,800)
+ spr = Sprite(tw,143,y,offshape)
+ spr.setlayer(800)
spr.offshape = offshape
spr.onshape = onshape
# print 'setting up selector ' + name
diff --git a/tasprites.py b/tasprites.py
index 7310655..6a7a44f 100644
--- a/tasprites.py
+++ b/tasprites.py
@@ -26,7 +26,7 @@ pygtk.require('2.0')
import gtk
import gobject
import pango
-class taSprite: pass
+import tasetup
# Don't display the label for these blocks
nolabel = ['audiooff', 'descriptionoff','journal']
@@ -35,140 +35,152 @@ def findsprite(tw,pos):
list = tw.sprites[:]
list.reverse()
for s in list:
- if hit(s,pos): return s
+ if s.hit(pos): return s
return None
def redrawsprites(tw):
- for s in tw.sprites: draw(s)
-
-def sprNew(tw,x,y,image,altlabel=False):
- spr = taSprite()
- spr.tw, spr.x, spr.y = tw,x,y
- setimage(spr,image)
- spr.label = None
- spr.ds_id = None
- if altlabel:
- spr.draw_label = draw_label2
- else: spr.draw_label = draw_label1
- return spr
-
-def setimage(spr,image):
- spr.image = image
- if isinstance(image,gtk.gdk.Pixbuf):
- spr.width = image.get_width()
- spr.height = image.get_height()
- else: spr.width,spr.height=image.get_size()
-
-def move(spr,pos):
- inval(spr)
- spr.x,spr.y = pos
- inval(spr)
-
-def setshape(spr,image):
- inval(spr)
- setimage(spr,image)
- inval(spr)
-
-def setshapex(spr):
- inval(spr)
-
-def setlayer(spr, layer):
- sprites = spr.tw.sprites
- if spr in sprites: sprites.remove(spr)
- spr.layer = layer
- for i in range(len(sprites)):
- if layer < sprites[i].layer:
- sprites.insert(i, spr)
- inval(spr)
- return
- sprites.append(spr)
- inval(spr)
-
-def hide(spr):
- if spr not in spr.tw.sprites: return
- inval(spr)
- spr.tw.sprites.remove(spr)
-
-def setlabel(spr,label):
- spr.label = label
- inval(spr)
-
-def inval(spr):
- spr.tw.area.invalidate_rect(gtk.gdk.Rectangle(spr.x,spr.y,spr.width, \
- spr.height), False)
-
-def draw(spr):
- if isinstance(spr.image,gtk.gdk.Pixbuf):
- spr.tw.area.draw_pixbuf(spr.tw.gc, spr.image, 0, 0, spr.x, spr.y)
- else:
- spr.tw.area.draw_drawable(spr.tw.gc,spr.image,0,0,spr.x,spr.y,-1,-1)
- if spr.label!=None:
- if hasattr(spr, 'proto') and hasattr(spr.proto, 'name'):
- name = spr.proto.name
+ for s in tw.sprites: s.draw()
+
+
+class Sprite():
+
+ def __init__(self, tw, x, y, image, altlabel=False):
+ self.tw, self.x, self.y = tw,x,y
+ self.setimage(image)
+ self.label = None
+ self.ds_id = None
+ if altlabel:
+ self.draw_label = self.draw_label2
+ else: self.draw_label = self.draw_label1
+
+ '''
+ mark block as selected or un-selected
+ FIXME: how we'll we create the images for selected blocks
+ '''
+ def set_selected(self, selected):
+ if selected:
+ img = tasetup.load_image(self.tw, self.tw.path, '', 'audioon')
else:
- name = ""
- if name not in nolabel:
- spr.draw_label(spr,str(spr.label))
-
-def hit(spr,pos):
- x, y = pos
- if x<spr.x: return False
- if x>spr.x+spr.width-1: return False
- if y<spr.y: return False
- if y>spr.y+spr.height-1: return False
- if isinstance(spr.image,gtk.gdk.Pixmap): return True
- if hasattr(spr, 'proto') and hasattr(spr.proto, 'name') and \
- spr.proto.name == 'journal':
- return True
- dx, dy = x-spr.x, y-spr.y
- try:
- return ord(spr.image.get_pixels()[(dy*spr.width+dx)*4+3]) == 255
- except IndexError:
- if hasattr(spr, 'proto') and hasattr(spr.proto, 'name'):
- print spr.proto.name
- print "IndexError: string index out of range: " + str(dx) + " " \
- + str(dy) + " " + str(spr.width) + " " + str(spr.height)
- return True
-
-def draw_label(spr, label, myscale, center_flag, truncate_flag):
- fd = pango.FontDescription('Sans')
- fd.set_size(int(myscale*spr.tw.scale*pango.SCALE))
- if type(label) == str or type(label) == unicode:
- mylabel = label.replace("\0"," ")
- l = len(mylabel)
- if truncate_flag and l > 8:
- pl = spr.tw.window.create_pango_layout("..."+mylabel[l-8:])
+ img = tasetup.load_image(self.tw, self.tw.path, '', 'audioon')
+ self.setimage(img)
+
+ def setimage(self, image):
+ self.image = image
+ if isinstance(image,gtk.gdk.Pixbuf):
+ self.width = image.get_width()
+ self.height = image.get_height()
+ else: self.width,self.height=image.get_size()
+
+ def move(self, pos):
+ self.inval()
+ self.x,self.y = pos
+ self.inval()
+
+ def inval(self):
+ rect = gtk.gdk.Rectangle(self.x, self.y, self.width, self.height)
+ self.tw.area.invalidate_rect(rect, False)
+
+ def setshape(self, image):
+ self.inval()
+ self.setimage(image)
+ self.inval()
+
+ def setshapex(self):
+ self.inval()
+
+ def setlayer(self, layer):
+ sprites = self.tw.sprites
+ if self in sprites: sprites.remove(self)
+ self.layer = layer
+ for i in range(len(sprites)):
+ if layer < sprites[i].layer:
+ sprites.insert(i, self)
+ self.inval()
+ return
+ sprites.append(self)
+ self.inval()
+
+ def hide(self):
+ if self not in self.tw.sprites: return
+ self.inval()
+ self.tw.sprites.remove(self)
+
+ def setlabel(self, label):
+ self.label = label
+ self.inval()
+
+ def draw(self):
+ if isinstance(self.image,gtk.gdk.Pixbuf):
+ self.tw.area.draw_pixbuf(self.tw.gc, self.image, 0, 0, self.x, self.y)
else:
- pl = spr.tw.window.create_pango_layout(mylabel)
- pl.set_font_description(fd)
- if center_flag:
- swidth = pl.get_size()[0]/pango.SCALE
- centerx = spr.x+spr.width/2
- x = int(centerx-swidth/2)
+ self.tw.area.draw_drawable(self.tw.gc,self.image,0,0,self.x,self.y,-1,-1)
+ if self.label!=None:
+ if hasattr(self, 'proto') and hasattr(self.proto, 'name'):
+ name = self.proto.name
+ else:
+ name = ""
+ if name not in nolabel:
+ self.draw_label1(str(self.label))
+
+ def hit(self, pos):
+ x, y = pos
+ if x<self.x: return False
+ if x>self.x+self.width-1: return False
+ if y<self.y: return False
+ if y>self.y+self.height-1: return False
+ if isinstance(self.image,gtk.gdk.Pixmap): return True
+ if hasattr(self, 'proto') and hasattr(self.proto, 'name') and \
+ self.proto.name == 'journal':
+ return True
+ dx, dy = x-self.x, y-self.y
+ try:
+ return ord(self.image.get_pixels()[(dy*self.width+dx)*4+3]) == 255
+ except IndexError:
+ if hasattr(spr, 'proto') and hasattr(self.proto, 'name'):
+ print self.proto.name
+ print "IndexError: string index out of range: " + str(dx) + " " \
+ + str(dy) + " " + str(self.width) + " " + str(self.height)
+ return True
+
+ def real_draw_label(self, label, myscale, center_flag, truncate_flag):
+ fd = pango.FontDescription('Sans')
+ fd.set_size(int(myscale*self.tw.scale*pango.SCALE))
+ if type(label) == str or type(label) == unicode:
+ mylabel = label.replace("\0"," ")
+ l = len(mylabel)
+ if truncate_flag and l > 8:
+ pl = self.tw.window.create_pango_layout("..."+mylabel[l-8:])
+ else:
+ pl = self.tw.window.create_pango_layout(mylabel)
+ pl.set_font_description(fd)
+ if center_flag:
+ swidth = pl.get_size()[0]/pango.SCALE
+ centerx = self.x+self.width/2
+ x = int(centerx-swidth/2)
+ else:
+ x = self.x+70
+ sheight = pl.get_size()[1]/pango.SCALE
+ centery = self.y+self.height/2
+ y = int(centery-sheight/2)
+ self.tw.gc.set_foreground(self.tw.msgcolor)
+ self.tw.area.draw_layout(self.tw.gc, x, y, pl)
else:
- x = spr.x+70
- sheight = pl.get_size()[1]/pango.SCALE
- centery = spr.y+spr.height/2
- y = int(centery-sheight/2)
- spr.tw.gc.set_foreground(spr.tw.msgcolor)
- spr.tw.area.draw_layout(spr.tw.gc, x, y, pl)
- else:
- print type(label)
-
-# used for most things
-def draw_label1(spr, label):
- draw_label(spr, label, 7, True, True)
-
-# used for status blocks
-def draw_label2(spr, label):
- draw_label(spr, str(label), 9, False, False)
-
-# used to get pixel value from mask for category selector
-def getpixel(image,x,y):
- array = image.get_pixels()
- offset = (y*image.get_width()+x)*4
- r,g,b,a = ord(array[offset]),ord(array[offset+1]),ord(array[offset+2]), \
- ord(array[offset+3])
- return (a<<24)+(b<<16)+(g<<8)+r
+ print type(label)
+
+ # used for most things
+ def draw_label1(self, label):
+ self.real_draw_label(label, 7, True, True)
+
+ # used for status blocks
+ def draw_label2(self, label):
+ self.real_draw_label(str(label), 9, False, False)
+
+ # used to get pixel value from mask for category selector
+ def getpixel(self, image,x,y):
+ array = image.get_pixels()
+ offset = (y*image.get_width()+x)*4
+ r,g,b,a = ord(array[offset]),ord(array[offset+1]),ord(array[offset+2]), \
+ ord(array[offset+3])
+ return (a<<24)+(b<<16)+(g<<8)+r
diff --git a/taturtle.py b/taturtle.py
index 42447c3..524a35f 100644
--- a/taturtle.py
+++ b/taturtle.py
@@ -54,14 +54,14 @@ color_table = (
def tNew(tw,w,h):
t = taTurtle()
t.tw, t.width, t.height = tw, w, h
- t.canvas = sprNew(tw,0,0,gtk.gdk.Pixmap(tw.area,w,h,-1))
+ t.canvas = Sprite(tw,0,0,gtk.gdk.Pixmap(tw.area,w,h,-1))
t.canvas.type = 'canvas'
- setlayer(t.canvas,600)
+ t.canvas.setlayer(600)
t.shapelist = \
[load_image(tw, tw.path, 'shapes','t'+str(i)) for i in range(36)]
- t.spr = sprNew(tw,100,100,t.shapelist[0])
+ t.spr = Sprite(tw,100,100,t.shapelist[0])
t.spr.type = 'turtle'
- setlayer(t.spr, 630)
+ t.spr.setlayer(630)
t.gc = t.canvas.image.new_gc()
t.shade = 0
clearscreen(t)
@@ -292,11 +292,11 @@ def draw_line(t,x1,y1,x2,y2):
h+t.pensize*t.tw.coord_scale+6)
def turn_turtle(t):
- setshape(t.spr, t.shapelist[(int(t.heading+5)%360)/10])
+ t.spr.setshape(t.shapelist[(int(t.heading+5)%360)/10])
def move_turtle(t):
x,y = t.width/2+int(t.xcor), t.height/2-int(t.ycor)
- move(t.spr, (t.canvas.x+x-30,t.canvas.y+y-30))
+ t.spr.move((t.canvas.x+x-30,t.canvas.y+y-30))
invalt(t,x-30,y-30,60,60)
def invalt(t,x,y,w,h):
diff --git a/tawindow.py b/tawindow.py
index 5af0600..4b8f485 100644
--- a/tawindow.py
+++ b/tawindow.py
@@ -23,11 +23,10 @@
# TODO:
+# - better comments!
+# - many methods could have their logic simplified!
# - we need a method to know if we are running inside Sugar (vs. stand-alone)
-# - we need helper methods to discriminate what XO version we are using (if any)
# - verbose flag should be in the scope of the object instance
-# - better comments!
-#
import pygtk
@@ -39,10 +38,6 @@ import os
import os.path
import time
-# Import from Journal for these blocks
-importblocks = ['audiooff', 'descriptionoff','journal']
-
-
from math import atan2, pi
DEGTOR = 2*pi/360
@@ -59,29 +54,41 @@ except:
from tahoverhelp import *
from gettext import gettext as _
-# dead key dictionaries
-dead_grave = {'A':192,'E':200,'I':204,'O':210,'U':217,'a':224,'e':232,'i':236,\
- 'o':242,'u':249}
-dead_acute = {'A':193,'E':201,'I':205,'O':211,'U':218,'a':225,'e':233,'i':237,\
- 'o':243,'u':250}
-dead_circumflex = {'A':194,'E':202,'I':206,'O':212,'U':219,'a':226,'e':234,\
- 'i':238,'o':244,'u':251}
-dead_tilde = {'A':195,'O':211,'N':209,'U':360,'a':227,'o':245,'n':241,'u':361}
-dead_diaeresis = {'A':196,'E':203,'I':207,'O':211,'U':218,'a':228,'e':235,\
- 'i':239,'o':245,'u':252}
-dead_abovering = {'A':197,'a':229}
-
-# Time out for triggering help
-timeout_tag = [0]
-
-
"""
TurtleArt Window class abstraction
"""
class TurtleArtWindow():
+ # Import from Journal for these blocks
+ importblocks = ['audiooff', 'descriptionoff','journal']
+
+ # dead key dictionaries
+ dead_grave = {'A':192,'E':200,'I':204,'O':210,'U':217,'a':224,'e':232,'i':236,\
+ 'o':242,'u':249}
+ dead_acute = {'A':193,'E':201,'I':205,'O':211,'U':218,'a':225,'e':233,'i':237,\
+ 'o':243,'u':250}
+ dead_circumflex = {'A':194,'E':202,'I':206,'O':212,'U':219,'a':226,'e':234,\
+ 'i':238,'o':244,'u':251}
+ dead_tilde = {'A':195,'O':211,'N':209,'U':360,'a':227,'o':245,'n':241,'u':361}
+ dead_diaeresis = {'A':196,'E':203,'I':207,'O':211,'U':218,'a':228,'e':235,\
+ 'i':239,'o':245,'u':252}
+ dead_abovering = {'A':197,'a':229}
+
+ # Time out for triggering help
+ timeout_tag = [0]
+
+
def __init__(self, win, path, lang, parent=None):
+ self._setup_initial_values(win, path, lang, parent)
+ prep_selectors(self) # i wonder where this method belongs
+ for s in selectors:
+ setup_selectors(self,s)
+ setup_misc(self)
+ self._select_category(self.selbuttons[0])
+
+
+ def _setup_initial_values(self, win, path, lang, parent):
self.window = win
self.path = os.path.join(path,'images')
self.path_lang = os.path.join(path,'images',lang)
@@ -89,13 +96,13 @@ class TurtleArtWindow():
self.load_save_folder = os.path.join(path,'samples')
self.save_folder = None
self.save_file_name = None
- win.set_flags(gtk.CAN_FOCUS)
+ self.window.set_flags(gtk.CAN_FOCUS)
self.width = gtk.gdk.screen_width()
self.height = gtk.gdk.screen_height()
# starting from command line
if parent is None:
- win.show_all()
+ self.window.show_all()
# starting from Sugar
else:
parent.show_all()
@@ -108,8 +115,7 @@ class TurtleArtWindow():
self.area = self.window.window
self.gc = self.area.new_gc()
# on an OLPC-XO-1, there is a scaling factor
- if os.path.exists('/etc/olpc-release') or \
- os.path.exists('/sys/power/olpc-pm'):
+ if self._is_XO_1():
self.lead = 1.6
self.scale = 1.0
else:
@@ -125,17 +131,12 @@ class TurtleArtWindow():
self.sprites = []
self.selected_block = None
self.draggroup = None
- prep_selectors(self)
self.myblock = None
self.nop = 'nop'
self.loaded = 0
- for s in selectors:
- setup_selectors(self,s)
- setup_misc(self)
self.step_time = 0
self.hide = False
self.palette = True
- self._select_category(self.selbuttons[0])
self.coord_scale = 1
self.turtle = tNew(self,self.width,self.height)
self.lc = lcNew(self)
@@ -146,7 +147,6 @@ class TurtleArtWindow():
self.polar = False
self.spr = None # "currently selected spr"
-
"""
DEPRECATED
"""
@@ -157,7 +157,7 @@ class TurtleArtWindow():
eraser_button: hide status block
"""
def eraser_button(self):
- setlayer(self.status_spr,400)
+ self.status_spr.setlayer(400)
clear(self.lc)
display_coordinates(self)
@@ -167,7 +167,6 @@ class TurtleArtWindow():
def stop_button(self):
stop_logo(self)
-
"""
change the icon for user-defined blocks after Python code is loaded
"""
@@ -178,19 +177,18 @@ class TurtleArtWindow():
setimage(spr,self.media_shapes['pythonloaded'])
self.nop = 'pythonloaded'
-
"""
hideshow button
"""
def hideshow_button(self):
if self.hide is False:
- for b in self._blocks(): setlayer(b,100)
+ for b in self._blocks(): b.setlayer(100)
self._hide_palette()
- hide(self.select_mask)
- hide(self.select_mask_string)
+ self.select_mask.hide()
+ self.select_mask_string.hide()
self.hide = True
else:
- for b in self._blocks(): setlayer(b,650)
+ for b in self._blocks(): b.setlayer(650)
self.show_palette()
self.hide = False
inval(self.turtle.canvas)
@@ -227,7 +225,7 @@ class TurtleArtWindow():
if self.selected_block != None:
self._unselect()
else:
- setlayer(self.status_spr,400)
+ self.status_spr.setlayer(400)
spr = findsprite(self,(x,y))
self.x, self.y = x,y
self.dx = 0
@@ -246,7 +244,6 @@ class TurtleArtWindow():
self._turtle_pressed(x,y)
self.spr = spr
-
"""
hideshow_palette
"""
@@ -268,10 +265,12 @@ class TurtleArtWindow():
show palette
"""
def show_palette(self):
- for i in self.selbuttons: setlayer(i,800)
+ for i in self.selbuttons: i.setlayer(800)
self._select_category(self.selbuttons[0])
self.palette = True
+ def xy(self, event):
+ return map(int, event.get_coords())
"""
unselect
@@ -294,30 +293,28 @@ class TurtleArtWindow():
except ValueError:
pass
- hide(self.select_mask)
- hide(self.select_mask_string)
+ self.select_mask.hide()
+ self.select_mask_string.hide()
self.selected_block = None
-
"""
select category
"""
def _select_category(self, spr):
if hasattr(self, 'current_category'):
- setshape(self.current_category, self.current_category.offshape)
- setshape(spr, spr.onshape)
+ self.current_category.setshape(self.current_category.offshape)
+ spr.setshape(spr.onshape)
self.current_category = spr
- setshape(self.category_spr,spr.group)
+ self.category_spr.setshape(spr.group)
"""
hide palette
"""
def _hide_palette(self):
- for i in self.selbuttons: hide(i)
- setshape(self.category_spr, self.hidden_palette_icon)
+ for i in self.selbuttons: i.hide()
+ self.category_spr.setshape(self.hidden_palette_icon)
self.palette = False
-
"""
register the events we listen to
"""
@@ -332,9 +329,11 @@ class TurtleArtWindow():
self.window.connect("motion-notify-event", self._move_cb)
self.window.connect("key_press_event", self._keypress_cb)
- def xy(self, event):
- return map(int, event.get_coords())
-
+ """
+ XO-1 ?
+ """
+ def _is_XO_1(self):
+ return os.path.exists('/etc/olpc-release') or os.path.exists('/sys/power/olpc-pm')
"""
find a stack to run (any stack without a hat)
@@ -375,7 +374,6 @@ class TurtleArtWindow():
ret = True
return ret
-
"""
Mouse move
"""
@@ -414,7 +412,7 @@ class TurtleArtWindow():
dx += -(b.x+dx)
# move the stack
for b in self.draggroup:
- move(b,(b.x+dx, b.y+dy))
+ b.move((b.x+dx, b.y+dy))
elif spr.type=='turtle':
type,dragx,dragy = self.dragpos
if type == 'move':
@@ -422,7 +420,7 @@ class TurtleArtWindow():
dx,dy = mdx,mdy
else:
dx,dy = x-dragx-spr.x,y-dragy-spr.y
- move(spr, (spr.x+dx, spr.y+dy))
+ spr.move((spr.x+dx, spr.y+dy))
else:
if mdx != 0 or mdy != 0:
dx,dy = mdx,mdy
@@ -440,7 +438,7 @@ class TurtleArtWindow():
"""
def _get_proto_from_category(self, x, y):
dx, dy = x-self.category_spr.x, y-self.category_spr.y,
- pixel = getpixel(self.current_category.mask,dx,dy)
+ pixel = self.current_category.getpixel(self.current_category.mask,dx,dy)
index = ((pixel%256)>>3)-1
if index==0:
return 'hide'
@@ -457,46 +455,46 @@ class TurtleArtWindow():
if spr and spr.type == 'category':
proto = self._get_proto_from_category(x, y)
if proto and proto!='hide':
- if timeout_tag[0] == 0:
- timeout_tag[0] = self._do_show_popup(proto.name)
+ if self.timeout_tag[0] == 0:
+ self.timeout_tag[0] = self._do_show_popup(proto.name)
self.spr = spr
return
else:
- if timeout_tag[0] > 0:
+ if self.timeout_tag[0] > 0:
try:
- gobject.source_remove(timeout_tag[0])
- timeout_tag[0] = 0
+ gobject.source_remove(self.timeout_tag[0])
+ self.timeout_tag[0] = 0
except:
- timeout_tag[0] = 0
+ self.timeout_tag[0] = 0
elif spr and spr.type == 'selbutton':
- if timeout_tag[0] == 0:
- timeout_tag[0] = self._do_show_popup(spr.name)
+ if self.timeout_tag[0] == 0:
+ self.timeout_tag[0] = self._do_show_popup(spr.name)
self.spr = spr
else:
- if timeout_tag[0] > 0:
+ if self.timeout_tag[0] > 0:
try:
- gobject.source_remove(timeout_tag[0])
- timeout_tag[0] = 0
+ gobject.source_remove(self.timeout_tag[0])
+ self.timeout_tag[0] = 0
except:
- timeout_tag[0] = 0
+ self.timeout_tag[0] = 0
elif spr and spr.type == 'block':
- if timeout_tag[0] == 0:
- timeout_tag[0] = self._do_show_popup(spr.proto.name)
+ if self.timeout_tag[0] == 0:
+ self.timeout_tag[0] = self._do_show_popup(spr.proto.name)
self.spr = spr
else:
- if timeout_tag[0] > 0:
+ if self.timeout_tag[0] > 0:
try:
- gobject.source_remove(timeout_tag[0])
- timeout_tag[0] = 0
+ gobject.source_remove(self.timeout_tag[0])
+ self.timeout_tag[0] = 0
except:
- timeout_tag[0] = 0
+ self.timeout_tag[0] = 0
else:
- if timeout_tag[0] > 0:
+ if self.timeout_tag[0] > 0:
try:
- gobject.source_remove(timeout_tag[0])
- timeout_tag[0] = 0
+ gobject.source_remove(self.timeout_tag[0])
+ self.timeout_tag[0] = 0
except:
- timeout_tag[0] = 0
+ self.timeout_tag[0] = 0
"""
fetch the help text and display it
@@ -517,7 +515,6 @@ class TurtleArtWindow():
self.win.set_title(_("Turtle Art") + " — " + label)
return 0
-
"""
Keyboard
"""
@@ -613,7 +610,7 @@ class TurtleArtWindow():
elif keyname == 'KP_Page_Down':
if self.draggroup == None:
self.draggroup = findgroup(self.spr)
- for b in self.draggroup: hide(b)
+ for b in self.draggroup: b.hide()
self.draggroup = None
elif self.spr.type == 'selbutton':
if keyname == 'Return' or keyname == 'KP_Page_Up':
@@ -623,7 +620,7 @@ class TurtleArtWindow():
(x,y) = self.window.get_pointer()
self._block_selector_pressed(x, y)
for b in self.draggroup:
- move(b, (b.x+200, b.y))
+ b.move((b.x+200, b.y))
self.draggroup = None
return True
if self.selected_block is None:
@@ -654,17 +651,17 @@ class TurtleArtWindow():
elif keyname is not '':
# Hack until I sort out input and unicode + dead keys
if self.dead_key == 'dead_grave':
- keyunicode = dead_grave[keyname]
+ keyunicode = self.dead_grave[keyname]
elif self.dead_key == 'dead_acute':
- keyunicode = dead_acute[keyname]
+ keyunicode = self.dead_acute[keyname]
elif self.dead_key == 'dead_circumflex':
- keyunicode = dead_circumflex[keyname]
+ keyunicode = self.dead_circumflex[keyname]
elif self.dead_key == 'dead_tilde':
- keyunicode = dead_tilde[keyname]
+ keyunicode = self.dead_tilde[keyname]
elif self.dead_key == 'dead_diaeresis':
- keyunicode = dead_diaeresis[keyname]
+ keyunicode = self.dead_diaeresis[keyname]
elif self.dead_key == 'dead_abovering':
- keyunicode = dead_abovering[keyname]
+ keyunicode = self.dead_abovering[keyname]
self.dead_key = ""
if self.firstkey:
newnum = selblock.check(unichr(keyunicode), \
@@ -680,9 +677,6 @@ class TurtleArtWindow():
self.firstkey = False
return True
-
-
-
"""
Button release
"""
@@ -717,33 +711,36 @@ class TurtleArtWindow():
display_coordinates(self)
self.draggroup = None
return
- if self.block_operation=='move' and hit(self.category_spr, (x,y)):
- for b in self.draggroup: hide(b)
+ if self.block_operation=='move' and self.category_spr.hit((x,y)):
+ for b in self.draggroup: b.hide()
self.draggroup = None
return
if self.block_operation=='new':
for b in self.draggroup:
- move(b, (b.x+200, b.y))
+ b.move((b.x+200, b.y))
self._snap_to_dock()
- for b in self.draggroup: setlayer(b,650)
+ for b in self.draggroup: b.setlayer(650)
self.draggroup = None
if self.block_operation=='click':
if self.spr.proto.name=='number':
self.selected_block = spr
- move(self.select_mask, (spr.x-5,spr.y-5))
- setlayer(self.select_mask, 660)
+ self.select_mask.move((spr.x-5,spr.y-5))
+ self.select_mask.setlayer(660)
self.firstkey = True
elif self.defdict.has_key(spr.proto.name):
self.selected_block = spr
if self.spr.proto.name=='string':
- move(self.select_mask_string, (spr.x-5,spr.y-5))
- setlayer(self.select_mask_string, 660)
+ self.select_mask_string.move((spr.x-5,spr.y-5))
+ self.select_mask_string.setlayer(660)
self.firstkey = True
- elif self.spr.proto.name in importblocks:
+ elif self.spr.proto.name in self.importblocks:
self._import_from_journal(spr)
elif self.spr.proto.name=='nop' and self.myblock==None:
self.activity.import_py()
- else: self._run_stack(spr)
+ else:
+ # TODO: mark block as selected
+ spr.set_selected(True)
+ self._run_stack(spr)
"""
click block
@@ -751,16 +748,16 @@ class TurtleArtWindow():
def _click_block(self):
if self.spr.proto.name=='number':
self.selected_block = self.spr
- move(self.select_mask, (self.spr.x-5,self.spr.y-5))
- setlayer(self.select_mask, 660)
+ self.select_mask.move((self.spr.x-5,self.spr.y-5))
+ self.select_mask.setlayer(660)
self.firstkey = True
elif self.defdict.has_key(self.spr.proto.name):
self.selected_block = self.spr
if self.spr.proto.name=='string':
- move(self.select_mask_string, (self.spr.x-5,self.spr.y-5))
- setlayer(self.select_mask_string, 660)
+ self.select_mask_string.move((self.spr.x-5,self.spr.y-5))
+ self.select_mask_string.setlayer(660)
self.firstkey = True
- elif self.spr.proto.name in importblocks:
+ elif self.spr.proto.name in self.importblocks:
self._import_from_journal(self.spr)
elif self.spr.proto.name=='nop' and self.myblock==None:
self.activity.import_py()
@@ -770,7 +767,6 @@ class TurtleArtWindow():
Repaint
"""
def _expose_cb(self, win, event):
- # FIXME
redrawsprites(self)
return True
@@ -791,7 +787,6 @@ class TurtleArtWindow():
self.activity._send_event("p:"+str(x)+":"+str(y)+":"+'F')
return True
-
"""
snap_to_dock
"""
@@ -813,11 +808,11 @@ class TurtleArtWindow():
bestmydockn=mydockn
if d<200:
for b in self.draggroup:
- move(b,(b.x+bestxy[0],b.y+bestxy[1]))
+ b.move((b.x+bestxy[0],b.y+bestxy[1]))
blockindock=bestyou.connections[bestyourdockn]
if blockindock!=None:
for b in findgroup(blockindock):
- hide(b)
+ b.hide()
bestyou.connections[bestyourdockn]=me
me.connections[bestmydockn]=bestyou
@@ -875,19 +870,23 @@ class TurtleArtWindow():
else:
self.hideshow_palette(False)
-
"""
new block from category
"""
def _new_block_from_category(self, proto, x, y):
if proto is None:
return True
+
+ #
+ # Create new instance of the block
+ #
+
# load alternative image of nop block if python code is loaded
if proto.name == 'nop' and self.nop == 'pythonloaded':
- newspr = sprNew(self,x-20,y-20,self.media_shapes['pythonloaded'])
+ newspr = Sprite(self,x-20,y-20,self.media_shapes['pythonloaded'])
else:
- newspr = sprNew(self,x-20,y-20,proto.image)
- setlayer(newspr,2000)
+ newspr = Sprite(self,x-20,y-20,proto.image)
+ newspr.setlayer(2000)
self.dragpos = 20,20
newspr.type = 'block'
newspr.proto = proto
@@ -899,24 +898,25 @@ class TurtleArtWindow():
argproto = self.protodict[self.valdict[dock[0]]]
argdock = argproto.docks[0]
nx,ny = newspr.x+dock[2]-argdock[2],newspr.y+dock[3]-argdock[3]
- argspr = sprNew(self,nx,ny,argproto.image)
+ argspr = Sprite(self,nx,ny,argproto.image)
argspr.type = 'block'
argspr.proto = argproto
argspr.label = str(proto.defaults[i])
- setlayer(argspr,2000)
+ argspr.setlayer(2000)
argspr.connections = [newspr,None]
newspr.connections[i+1] = argspr
self.draggroup = findgroup(newspr)
- self.block_operation = 'new'
+ self.block_operation = 'new'
"""
block pressed
+ TODO: mark block as selected
"""
def _block_pressed(self, mask, x, y, spr):
if spr is not None:
self.draggroup = findgroup(spr)
- for b in self.draggroup: setlayer(b,2000)
+ for b in self.draggroup: b.setlayer(2000)
if spr.connections[0] != None and spr.proto.name == 'lock':
b = self._find_top_block(spr)
self.dragpos = x-b.x,y-b.y
@@ -924,7 +924,6 @@ class TurtleArtWindow():
self.dragpos = x-spr.x,y-spr.y
self._disconnect(spr)
-
"""
disconnect block
"""
@@ -959,7 +958,6 @@ class TurtleArtWindow():
else:
setimage(spr, self.media_shapes['texton'])
-
"""
dock_dx_dy
"""
@@ -1037,13 +1035,10 @@ class TurtleArtWindow():
dx += -(b.x+dx)
# move the stack
for b in self.draggroup:
- move(b,(b.x+dx, b.y-dy))
+ b.move((b.x+dx, b.y-dy))
self._snap_to_dock()
self.draggroup = None
-
-
-