Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/TurtleArt
diff options
context:
space:
mode:
Diffstat (limited to 'TurtleArt')
-rw-r--r--TurtleArt/sprites.py9
-rw-r--r--TurtleArt/taconstants.py2
-rw-r--r--TurtleArt/talogo.py32
-rw-r--r--TurtleArt/tawindow.py45
4 files changed, 71 insertions, 17 deletions
diff --git a/TurtleArt/sprites.py b/TurtleArt/sprites.py
index 7483c12..3f5d7df 100644
--- a/TurtleArt/sprites.py
+++ b/TurtleArt/sprites.py
@@ -106,7 +106,7 @@ class Sprites:
def length_of_list(self):
''' How many sprites are there? '''
- return(len(self.list))
+ return len(self.list)
def append_to_list(self, spr):
''' Append a new sprite to the end of the list. '''
@@ -122,9 +122,7 @@ class Sprites:
self.list.insert(i, spr)
def find_in_list(self, spr):
- if spr in self.list:
- return True
- return False
+ return (spr in self.list)
def remove_from_list(self, spr):
''' Remove a sprite from the list. '''
@@ -258,7 +256,8 @@ class Sprite:
if layer is not None:
self.layer = layer
for i in range(self._sprites.length_of_list()):
- if self.layer < self._sprites.get_sprite(i).layer:
+ spr = self._sprites.get_sprite(i)
+ if spr is not None and self.layer < spr.layer:
self._sprites.insert_in_list(self, i)
self.inval()
return
diff --git a/TurtleArt/taconstants.py b/TurtleArt/taconstants.py
index 4cedb34..78cb9e1 100644
--- a/TurtleArt/taconstants.py
+++ b/TurtleArt/taconstants.py
@@ -287,7 +287,7 @@ OVERLAY_SHAPES = ['Cartesian', 'Cartesian_labeled', 'polar', 'metric']
STATUS_SHAPES = ['status', 'info', 'nostack', 'dupstack', 'noinput',
'emptyheap', 'emptybox', 'nomedia', 'nocode', 'overflowerror',
'negroot', 'syntaxerror', 'nofile', 'nojournal', 'zerodivide',
- 'notanumber', 'incompatible', 'help', 'print']
+ 'notanumber', 'incompatible', 'help', 'print', 'noconnection']
# Emulate Sugar toolbar when running from outside of Sugar
TOOLBAR_SHAPES = ['hideshowoff', 'eraseron', 'run-fastoff',
diff --git a/TurtleArt/talogo.py b/TurtleArt/talogo.py
index ba76085..67aa32c 100644
--- a/TurtleArt/talogo.py
+++ b/TurtleArt/talogo.py
@@ -29,6 +29,8 @@ from operator import isNumberType
import os
from os.path import exists as os_path_exists
from UserDict import UserDict
+import urllib2
+import tempfile
try:
from sugar.graphics import style
@@ -1060,6 +1062,36 @@ class LogoCode:
gobject.idle_add(self.tw.send_event, event)
os.remove(tmp_file)
+ def get_from_url(self, url):
+ """ Get contents of URL as text or tempfile to image """
+ if "://" not in url: # no protocol
+ url = "http://" + url # assume HTTP
+ try:
+ req = urllib2.urlopen(url)
+ except urllib2.HTTPError, e:
+ debug_output("Couldn't open %s: %s" % (url, e),
+ self.tw.running_sugar)
+ raise logoerror(url + ' [%d]' % (e.code))
+ except urllib2.URLError, e:
+ if hasattr(e, 'code'):
+ debug_output("Couldn't open %s: %s" % (url, e),
+ self.tw.running_sugar)
+ raise logoerror(url + ' [%d]' % (e.code))
+ else: # elif hasattr(e, 'reason'):
+ debug_output("Couldn't reach server: %s" % (e),
+ self.tw.running_sugar)
+ raise logoerror('#noconnection')
+
+ if req.info().getheader("Content-Type")[0:5] == "image":
+ # it can't be deleted immediately, or else we won't ever access it
+ tmp = tempfile.NamedTemporaryFile(delete=False)
+ tmp.write(req.read()) # prepare for writing
+ tmp.flush() # actually write it
+ obj = Media('media', value=tmp.name)
+ return obj
+ else:
+ return req.read()
+
def showlist(self, objects):
""" Display list of media objects """
x = (self.tw.turtles.get_active_turtle().get_xy()[0] /
diff --git a/TurtleArt/tawindow.py b/TurtleArt/tawindow.py
index 5b9a1c6..2aa8f89 100644
--- a/TurtleArt/tawindow.py
+++ b/TurtleArt/tawindow.py
@@ -1662,9 +1662,20 @@ before making changes to your program'))
name = blk.name
# You can only have one instance of some blocks
if blk.name in ['start', 'hat1', 'hat2']:
- if len(self.block_list.get_similar_blocks(
- 'block', blk.name)) > 0:
+ blk_list = self.block_list.get_similar_blocks(
+ 'block', blk.name)
+ if len(blk_list) > 0:
self.showlabel('dupstack')
+ if blk.name == 'start':
+ # Recenter the screen and move the start
+ # stack to the center of the screen
+ if self.running_sugar:
+ self.activity.recenter()
+ dx = 200 - blk_list[0].spr.get_xy()[0]
+ dy = 200 - blk_list[0].spr.get_xy()[1]
+ drag_group = find_group(blk_list[0])
+ for dblk in drag_group:
+ dblk.spr.move_relative((dx, dy))
return True
# We need to check to see if there is already a
# similarly default named stack
@@ -2176,7 +2187,7 @@ before making changes to your program'))
for gblk in group:
if gblk.name == 'sandwichclampcollapsed':
restore_clamp(gblk)
- self.resize_parent_clamps(gblk)
+ self._resize_parent_clamps(gblk)
for gblk in group:
gblk.rescale(self.block_scale)
@@ -3217,6 +3228,13 @@ before making changes to your program'))
if len(self.block_list.get_similar_blocks('block', 'forever')) > 0:
debug_output('WARNING: Projects with forever blocks \
may not terminate.', False)
+ else:
+ self._hide_text_entry()
+ self.parent.get_window().set_cursor(
+ gtk.gdk.Cursor(gtk.gdk.WATCH))
+ gobject.idle_add(self.__run_stack, blk)
+
+ def __run_stack(self, blk):
if self.status_spr is not None:
self.status_spr.hide()
self._autohide_shape = True
@@ -3229,12 +3247,16 @@ before making changes to your program'))
self.start_plugins() # Let the plugins know we are running.
top = find_top_block(blk)
code = self.lc.generate_code(top, self.just_blocks())
+ if self.interactive_mode:
+ self.parent.get_window().set_cursor(
+ gtk.gdk.Cursor(gtk.gdk.LEFT_PTR))
self.lc.run_blocks(code)
if self.interactive_mode:
gobject.idle_add(self.lc.doevalstep)
else:
while self.lc.doevalstep():
pass
+ self.running_blocks = False
def _snap_to_dock(self):
''' Snap a block (selected_block) to the dock of another block
@@ -3810,11 +3832,8 @@ before making changes to your program'))
self._snap_to_dock()
self.drag_group = None
- def _test_number(self):
- ''' Make sure a 'number' block contains a number. '''
+ def _hide_text_entry(self):
if hasattr(self, '_text_entry'):
- bounds = self._text_buffer.get_bounds()
- text = self._text_buffer.get_text(bounds[0], bounds[1])
if self._focus_out_id is not None:
self._text_entry.disconnect(self._focus_out_id)
self._focus_out_id = None
@@ -3822,6 +3841,13 @@ before making changes to your program'))
self._text_buffer.disconnect(self._insert_text_id)
self._insert_text_id = None
self._text_entry.hide()
+
+ def _test_number(self):
+ ''' Make sure a 'number' block contains a number. '''
+ if hasattr(self, '_text_entry'):
+ bounds = self._text_buffer.get_bounds()
+ text = self._text_buffer.get_text(bounds[0], bounds[1])
+ self._hide_text_entry()
else:
text = self.selected_blk.spr.labels[0]
self._number_check(text)
@@ -3868,12 +3894,9 @@ before making changes to your program'))
def _test_string(self):
if hasattr(self, '_text_entry'):
- if self._focus_out_id is not None:
- self._text_entry.disconnect(self._focus_out_id)
- self._focus_out_id = None
bounds = self._text_buffer.get_bounds()
text = self._text_buffer.get_text(bounds[0], bounds[1])
- self._text_entry.hide()
+ self._hide_text_entry()
else:
text = self.selected_blk.spr.labels[0]
self.selected_blk.spr.set_label(text.replace('\12', RETURN))