Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rw-r--r--TurtleArt/sprites.py2
-rw-r--r--TurtleArt/tablock.py8
-rw-r--r--TurtleArt/talogo.py91
-rw-r--r--TurtleArt/taturtle.py24
-rw-r--r--TurtleArt/tawindow.py4
-rw-r--r--TurtleArtActivity.py34
-rw-r--r--activity/activity.info2
8 files changed, 86 insertions, 80 deletions
diff --git a/NEWS b/NEWS
index f3d288d..48939ad 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,7 @@
* fixed typo in Python sample code (#2449)
* only allow one start block per project
* show box values on box label
+* moved import/export functions off activity toolbar onto journal toolbar
100
diff --git a/TurtleArt/sprites.py b/TurtleArt/sprites.py
index d91fd71..9b12cdd 100644
--- a/TurtleArt/sprites.py
+++ b/TurtleArt/sprites.py
@@ -52,7 +52,7 @@ Example usage:
my_sprite = sprites.Sprite(self.sprite_list, x1, y1, my_pixbuf)
# Move the sprite to a new position.
- my_sprite.move((x1+dx, y1+dy))
+ my_sprite.move_relative((dx, dy))
# Create another "pixbuf".
your_pixbuf = svg_str_to_pixbuf("<svg>...some svg code...</svg>")
diff --git a/TurtleArt/tablock.py b/TurtleArt/tablock.py
index 5f61b5e..0ad00fa 100644
--- a/TurtleArt/tablock.py
+++ b/TurtleArt/tablock.py
@@ -113,13 +113,7 @@ class Blocks:
i += 1
return None
- def get_block_of_same_type_and_name(self, type, name):
- for block in self.list:
- if block.type == type and block.name == name:
- return block
- return None
-
- def get_all_blocks_of_same_type_and_name(self, type, name):
+ def get_similar_blocks(self, type, name):
block_list = []
for block in self.list:
if block.type == type and block.name == name:
diff --git a/TurtleArt/talogo.py b/TurtleArt/talogo.py
index cbd839b..c5f2ab2 100644
--- a/TurtleArt/talogo.py
+++ b/TurtleArt/talogo.py
@@ -274,8 +274,7 @@ def update_label_value(tw, name, value=None):
""" Update the label of value blocks to reflect current value """
if tw.hide or not tw.interactive_mode:
return
- list = tw.block_list.get_all_blocks_of_same_type_and_name(
- 'block', name)
+ list = tw.block_list.get_similar_blocks('block', name)
if value is None:
for block in list:
block.spr.set_label(BLOCK_NAMES[name][0])
@@ -286,7 +285,7 @@ def update_label_value(tw, name, value=None):
valstring = str(value)
for block in list:
block.spr.set_label(BLOCK_NAMES[name][0] + ' = ' + valstring)
-
+ block.resize()
class LogoCode:
""" A class for parsing Logo code """
@@ -299,8 +298,8 @@ class LogoCode:
DEFPRIM = {
'(': [1, lambda self, x: self.prim_opar(x)],
'and': [2, lambda self, x, y: taand(x, y)],
- 'arc': [2, lambda self, x, y: self.tw.canvas.arc(x, y)],
- 'back': [1, lambda self, x: self.tw.canvas.forward(-x)],
+ 'arc': [2, lambda self, x, y: self.prim_move(self.tw.canvas.arc, x, y)],
+ 'back': [1, lambda self, x: self.prim_move(self.tw.canvas.forward, -x)],
'black': [0, lambda self: BLACK],
'blue': [0, lambda self: 70],
'bpos': [0, lambda self: -self.tw.canvas.height / \
@@ -324,7 +323,8 @@ class LogoCode:
'equal?': [2, lambda self,x, y: taequal(x, y)],
'fillscreen': [2, lambda self, x, y: self.tw.canvas.fillscreen(x, y)],
'forever': [1, self.prim_forever, True],
- 'forward': [1, lambda self, x: self.tw.canvas.forward(x)],
+ 'forward': [1, lambda self, x: self.prim_move(self.tw.canvas.forward,
+ x)],
'fullscreen': [0, lambda self: self.tw.set_fullscreen()],
'greater?': [2, lambda self, x, y: tamore(x, y)],
'green': [0, lambda self: 30],
@@ -337,7 +337,7 @@ class LogoCode:
'insertimage': [1, lambda self, x: self.insert_image(x, False)],
'kbinput': [0, lambda self: self.prim_kbinput()],
'keyboard': [0, lambda self: self.keyboard],
- 'left': [1, lambda self, x: self.tw.canvas.right(-x)],
+ 'left': [1, lambda self, x: self.prim_right(-x)],
'leftx': [0, lambda self: self.tw.leftx],
'lpos': [0, lambda self: -self.tw.canvas.width / \
(self.tw.coord_scale * 2)],
@@ -370,7 +370,7 @@ class LogoCode:
'readpixel': [0, lambda self: self.read_pixel()],
'red': [0, lambda self: 0],
'repeat': [2, self.prim_repeat, True],
- 'right': [1, lambda self, x: self.tw.canvas.right(x)],
+ 'right': [1, lambda self, x: self.prim_right(x)],
'rightx': [0, lambda self: self.tw.rightx],
'rpos': [0, lambda self: self.tw.canvas.width / \
(self.tw.coord_scale * 2)],
@@ -378,17 +378,24 @@ class LogoCode:
'savesvg': [1, lambda self, x: self.save_svg(x)],
'scale': [0, lambda self: self.scale],
'see': [0, lambda self: self.see()],
- 'setcolor': [1, lambda self, x: self.tw.canvas.setcolor(x)],
- 'setgray': [1, lambda self, x: self.tw.canvas.setgray(x)],
- 'seth': [1, lambda self, x: self.tw.canvas.seth(x)],
- 'setpensize': [1, lambda self, x: self.tw.canvas.setpensize(x)],
- 'setscale': [1, lambda self, x: self.set_scale(x)],
- 'setshade': [1, lambda self, x: self.tw.canvas.setshade(x)],
+ 'setcolor': [1, lambda self, x: self.prim_set('color',
+ self.tw.canvas.setcolor, x)],
+ 'setgray': [1, lambda self, x: self.prim_set('gray',
+ self.tw.canvas.setgray, x)],
+ 'seth': [1, lambda self, x: self.prim_set('heading',
+ self.tw.canvas.seth, x)],
+ 'setpensize': [1, lambda self, x: self.prim_set('pensize',
+ self.tw.canvas.setpensize, x)],
+ 'setscale': [1, lambda self, x: self.prim_set('scale',
+ self.set_scale, x)],
+ 'setshade': [1, lambda self, x: self.prim_set('shade',
+ self.tw.canvas.setshade, x)],
'settextcolor': [1, lambda self, x: self.tw.canvas.settextcolor(x)],
'settextsize': [1, lambda self, x: self.tw.canvas.settextsize(x)],
- 'setxy2': [2, lambda self, x, y: self.tw.canvas.setxy(x, y)],
- 'setxy': [2, lambda self, x, y: self.tw.canvas.setxy(x, y,
- pendown=False)],
+ 'setxy2': [2, lambda self, x, y: self.prim_move(self.tw.canvas.setxy,
+ x, y)],
+ 'setxy': [2, lambda self, x, y: self.prim_move(self.tw.canvas.setxy, x,
+ y, pendown=False)],
'shade': [0, lambda self: self.tw.canvas.shade],
'show': [1, lambda self, x: self.show(x, True)],
'showaligned': [1,lambda self, x: self.show(x, False)],
@@ -717,7 +724,6 @@ class LogoCode:
def evalsym(self, token):
""" Process primitive associated with symbol token """
- self.debug_trace(token)
self.undefined_check(token)
oldcfun, oldarglist = self.cfun, self.arglist
self.cfun, self.arglist = token, []
@@ -787,31 +793,6 @@ class LogoCode:
""" ijmp """
self.step = fcn(*(args))
- def debug_trace(self, token):
- """ Display debugging information """
- if self.trace:
- if token.name in PALETTES[PALETTE_NAMES.index('turtle')]:
- my_string = "%s\n%s=%d\n%s=%d\n%s=%d\n%s=%d" % \
- (token.name, _('xcor'), int(self.tw.canvas.xcor),
- _('ycor'), int(self.tw.canvas.ycor), _('heading'),
- int(self.tw.canvas.heading), _('scale'), int(self.scale))
- elif token.name in PALETTES[PALETTE_NAMES.index('pen')]:
- if self.tw.canvas.pendown:
- penstatus = _('pen down')
- else:
- penstatus = _('pen up')
- my_string = "%s\n%s\n%s=%d\n%s=%d\n%s=%.1f" % \
- (token.name, penstatus, _('color'),
- int(self.tw.canvas.color), _('shade'),
- int(self.tw.canvas.shade), _('pen size'),
- self.tw.canvas.pensize)
- else:
- my_string = "%s\n" % (token.name)
- for k, v in self.boxes.iteritems():
- my_string += "%s: %s\n" % (k, str(v))
- self.tw.showlabel('info', my_string)
- return
-
def undefined_check(self, token):
""" Make sure token has a definition """
if token.fcn is not None:
@@ -840,7 +821,8 @@ class LogoCode:
self.tw.set_polar(False)
self.tw.set_cartesian(False)
self.hidden_turtle = None
- for name in ['box1', 'box2']:
+ for name in ['box1', 'box2', 'color', 'shade', 'gray', 'scale',
+ 'pensize', 'heading', 'xcor', 'ycor']:
update_label_value(self.tw, name)
def prim_start(self):
@@ -1075,6 +1057,27 @@ class LogoCode:
self.keyboard = 0
self.tw.keypress = ""
+
+ def prim_set(self, name, cmd, value=None):
+ """ Set a value and update the associated value blocks """
+ if value is not None:
+ cmd(value)
+ update_label_value(self.tw, name, value)
+
+ def prim_right(self, value):
+ self.tw.canvas.right(value)
+ update_label_value(self.tw, 'heading', self.tw.canvas.heading)
+
+ def prim_move(self, cmd, value1, value2=None):
+ if value2 is None:
+ cmd(value1)
+ else:
+ cmd(value1, value2)
+ update_label_value(self.tw, 'xcor',
+ self.tw.canvas.xcor / self.tw.coord_scale)
+ update_label_value(self.tw, 'ycor',
+ self.tw.canvas.ycor / self.tw.coord_scale)
+
def prim_setbox(self, name, x, val):
""" Define value of named box """
if x is not None:
diff --git a/TurtleArt/taturtle.py b/TurtleArt/taturtle.py
index a11d15a..a7a3205 100644
--- a/TurtleArt/taturtle.py
+++ b/TurtleArt/taturtle.py
@@ -113,6 +113,7 @@ class Turtle:
self.shapes = []
self.custom_shapes = False
self.type = 'turtle'
+ self.name = key
self.heading = 0
self.pen_shade = 50
self.pen_color = 0
@@ -120,10 +121,19 @@ class Turtle:
self.pen_size = 5
self.pen_state = True
- # If the turtle key is an int, we'll use a palette color as the
+ self._prep_shapes(key, turtles, turtle_colors)
+
+ if turtles.sprite_list is not None:
+ self.spr = Sprite(turtles.sprite_list, 0, 0, self.shapes[0])
+ else:
+ self.spr = None
+ turtles.add_to_dict(key, self)
+
+ def _prep_shapes(self, name, turtles=None, turtle_colors=None):
+ # If the turtle name is an int, we'll use a palette color as the
# turtle color
try:
- int_key = int(key)
+ int_key = int(name)
use_color_table = True
except ValueError:
use_color_table = False
@@ -138,13 +148,9 @@ class Turtle:
'#%06x' % (color_table[stroke])]
self.shapes = generate_turtle_pixbufs(self.colors)
else:
- self.shapes = turtles.get_pixbufs()
-
- if turtles.sprite_list is not None:
- self.spr = Sprite(turtles.sprite_list, 0, 0, self.shapes[0])
- else:
- self.spr = None
- turtles.add_to_dict(key, self)
+ if turtles is not None:
+ self.colors = ['#008000', '#00A000']
+ self.shapes = turtles.get_pixbufs()
def set_shapes(self, shapes):
""" Reskin the turtle """
diff --git a/TurtleArt/tawindow.py b/TurtleArt/tawindow.py
index 2853bbd..2d39667 100644
--- a/TurtleArt/tawindow.py
+++ b/TurtleArt/tawindow.py
@@ -784,8 +784,8 @@ class TurtleArtWindow():
else:
# You can only have one instance of some blocks
if blk.name in ['start', 'hat1', 'hat2']:
- if self.block_list.get_block_of_same_type_and_name(
- 'block', blk.name) is not None:
+ if len(self.block_list.get_similar_blocks(
+ 'block', blk.name)) > 0:
return True
blk.highlight()
self._new_block(blk.name, x, y)
diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py
index 940d548..14f58b8 100644
--- a/TurtleArtActivity.py
+++ b/TurtleArtActivity.py
@@ -724,28 +724,30 @@ class TurtleArtActivity(activity.Activity):
page=help_toolbar,
icon_name='help-toolbar')
+ journal_toolbar = gtk.Toolbar()
+ journal_toolbar_button = ToolbarButton(page=journal_toolbar,
+ icon_name='activity-journal')
+
# Add the toolbars and buttons to the toolbox
activity_toolbar_button.show()
toolbox.toolbar.insert(activity_toolbar_button, -1)
edit_toolbar_button.show()
toolbox.toolbar.insert(edit_toolbar_button, -1)
+ journal_toolbar_button.show()
+ toolbox.toolbar.insert(journal_toolbar_button, -1)
view_toolbar_button.show()
toolbox.toolbar.insert(view_toolbar_button, -1)
- toolbox.toolbar.insert(palette_toolbar_button, -1)
palette_toolbar_button.show()
+ toolbox.toolbar.insert(palette_toolbar_button, -1)
+ help_toolbar_button.show()
+ toolbox.toolbar.insert(help_toolbar_button, -1)
_add_separator(toolbox.toolbar)
self._make_project_buttons(toolbox.toolbar)
- _add_separator(toolbox.toolbar)
-
- toolbox.toolbar.insert(help_toolbar_button, -1)
- help_toolbar_button.show()
-
_add_separator(toolbox.toolbar, True)
- # Sugar Stop Button
stop_button = StopButton(self)
stop_button.props.accelerator = '<Ctrl>Q'
toolbox.toolbar.insert(stop_button, -1)
@@ -765,9 +767,9 @@ class TurtleArtActivity(activity.Activity):
edit_toolbar = gtk.Toolbar()
toolbox.add_toolbar(_('Edit'), edit_toolbar)
edit_toolbar_button = edit_toolbar
- save_toolbar = gtk.Toolbar()
- toolbox.add_toolbar(_('Import/Export'), save_toolbar)
- activity_toolbar_button = save_toolbar
+ journal_toolbar = gtk.Toolbar()
+ toolbox.add_toolbar(_('Import/Export'), journal_toolbar)
+ journal_toolbar_button = journal_toolbar
help_toolbar = gtk.Toolbar()
toolbox.add_toolbar(_('Help'), help_toolbar)
help_toolbar_button = help_toolbar
@@ -780,22 +782,22 @@ class TurtleArtActivity(activity.Activity):
self.keep_button = _add_button('filesave', _("Save snapshot"),
self.do_keep_cb,
- activity_toolbar_button)
+ journal_toolbar_button)
self.save_as_html = _add_button('htmloff', _("Save as HTML"),
self.do_save_as_html_cb,
- activity_toolbar_button)
+ journal_toolbar_button)
self.save_as_logo = _add_button('logo-saveoff', _("Save as Logo"),
self.do_save_as_logo_cb,
- activity_toolbar_button)
+ journal_toolbar_button)
self.save_as_image = _add_button('image-saveoff', _("Save as image"),
self.do_save_as_image_cb,
- activity_toolbar_button)
+ journal_toolbar_button)
self.load_python = _add_button('pippy-openoff', _("Load my block"),
self.do_load_python_cb,
- activity_toolbar_button)
+ journal_toolbar_button)
self.load_ta_project = _add_button('load-from-journal',
_("Import project from the Journal"), self.do_load_ta_project_cb,
- activity_toolbar_button)
+ journal_toolbar_button)
copy = _add_button('edit-copy', _('Copy'), self._copy_cb,
edit_toolbar_button, '<Ctrl>c')
paste = _add_button('edit-paste', _('Paste'), self._paste_cb,
diff --git a/activity/activity.info b/activity/activity.info
index 6c9f463..41e0104 100644
--- a/activity/activity.info
+++ b/activity/activity.info
@@ -1,6 +1,6 @@
[Activity]
name = Turtle Art
-activity_version = 100
+activity_version = 101
license = MIT
bundle_id = org.laptop.TurtleArtActivity
exec = sugar-activity TurtleArtActivity.TurtleArtActivity