diff options
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | TurtleArt/sprites.py | 2 | ||||
-rw-r--r-- | TurtleArt/tablock.py | 8 | ||||
-rw-r--r-- | TurtleArt/talogo.py | 91 | ||||
-rw-r--r-- | TurtleArt/taturtle.py | 24 | ||||
-rw-r--r-- | TurtleArt/tawindow.py | 4 | ||||
-rw-r--r-- | TurtleArtActivity.py | 34 | ||||
-rw-r--r-- | activity/activity.info | 2 |
8 files changed, 86 insertions, 80 deletions
@@ -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 |