Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/tasprites.py
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 /tasprites.py
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
Diffstat (limited to 'tasprites.py')
-rw-r--r--tasprites.py272
1 files changed, 142 insertions, 130 deletions
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