diff options
Diffstat (limited to 'TurtleArt')
-rw-r--r-- | TurtleArt/talogo.py | 1 | ||||
-rw-r--r-- | TurtleArt/taturtle.py | 24 | ||||
-rw-r--r-- | TurtleArt/tawindow.py | 90 |
3 files changed, 88 insertions, 27 deletions
diff --git a/TurtleArt/talogo.py b/TurtleArt/talogo.py index 7aac4ce..0b178c6 100644 --- a/TurtleArt/talogo.py +++ b/TurtleArt/talogo.py @@ -394,6 +394,7 @@ class LogoCode: if self._disable_help: self.tw.no_help = False self._disable_help = False + self.tw.display_coordinates() def icall(self, fcn, *args): """ Add a function and its arguments to the program stack. """ diff --git a/TurtleArt/taturtle.py b/TurtleArt/taturtle.py index 10d0230..8d2afea 100644 --- a/TurtleArt/taturtle.py +++ b/TurtleArt/taturtle.py @@ -138,7 +138,10 @@ class Turtles: self._active_turtle.set_color(0) self._active_turtle.set_shade(50) self._active_turtle.set_gray(100) - self._active_turtle.set_pen_size(5) + if self.turtle_window.coord_scale == 1: + self._active_turtle.set_pen_size(5) + else: + self._active_turtle.set_pen_size(1) self._active_turtle.reset_shapes() self._active_turtle.set_heading(0.0) self._active_turtle.set_pen_state(False) @@ -202,7 +205,10 @@ class Turtle: self._pen_shade = 50 self._pen_color = 0 self._pen_gray = 100 - self._pen_size = 5 + if self._turtles.turtle_window.coord_scale == 1: + self._pen_size = 5 + else: + self._pen_size = 1 self._pen_state = True self._pen_fill = False self._poly_points = [] @@ -422,7 +428,8 @@ class Turtle: self._turtles.turtle_window.running_sugar) return - self._turtles.turtle_window.canvas.set_pen_size(self._pen_size) + self._turtles.turtle_window.canvas.set_pen_size( + self._pen_size * self._turtles.turtle_window.coord_scale) if self._turtles.turtle_window.sharing() and share: event = 'w|%s' % (data_to_string([self._turtles.turtle_window.nick, @@ -555,12 +562,15 @@ class Turtle: int(distance)])) self._turtles.turtle_window.send_event(event) - def set_xy(self, x, y, share=True, pendown=True): + def set_xy(self, x, y, share=True, pendown=True, dragging=False): old = self.get_xy() - try: - xcor = x * self._turtles.turtle_window.coord_scale - ycor = y * self._turtles.turtle_window.coord_scale + if dragging: + xcor = x + ycor = y + else: + xcor = x * self._turtles.turtle_window.coord_scale + ycor = y * self._turtles.turtle_window.coord_scale except (TypeError, ValueError): debug_output('bad value sent to %s' % (__name__), self._turtles.turtle_window.running_sugar) diff --git a/TurtleArt/tawindow.py b/TurtleArt/tawindow.py index a791919..3a8f4bb 100644 --- a/TurtleArt/tawindow.py +++ b/TurtleArt/tawindow.py @@ -102,10 +102,12 @@ class TurtleArtWindow(): def __init__(self, canvas_window, path, parent=None, activity=None, mycolors=None, mynick=None, turtle_canvas=None, running_sugar=True, running_turtleart=True): - '''parent -- the GTK Window that TA runs in - activity -- the object that instantiated this TurtleArtWindow (in - GNOME, a TurtleMain instance) - running_turtleart -- are we running TA or exported python code? + ''' + parent: the GTK Window that TA runs in + activity: the object that instantiated this TurtleArtWindow (in + GNOME, a TurtleMain instance, in Sugar, the Activity + instance) + running_turtleart: are we running TA or exported python code? ''' self.parent = parent self.turtle_canvas = turtle_canvas @@ -529,6 +531,8 @@ class TurtleArtWindow(): self._autohide_shape = True for name in OVERLAY_SHAPES: + if name == 'Cartesian': + continue self.overlay_shapes[name] = Sprite( self.sprite_list, int(self.width / 2 - 600), @@ -538,6 +542,8 @@ class TurtleArtWindow(): self.overlay_shapes[name].hide() self.overlay_shapes[name].type = 'overlay' + self._create_scaled_cartesian_coordinates() + if self.running_turtleart and not self.running_sugar: # offset = 2 * self.width - 55 * len(TOOLBAR_SHAPES) offset = 55 * (1 + len(palette_blocks)) @@ -553,6 +559,27 @@ class TurtleArtWindow(): self.toolbar_shapes[name].type = 'toolbar' self.toolbar_shapes['stopiton'].hide() + def _create_scaled_cartesian_coordinates(self): + # Cartesian overlay has to be scaled to match the coordinate_scale + # 200 pixels in the graphic == height / 4. (10 units) + pixbuf = svg_str_to_pixbuf( + svg_from_file('%s/images/%s.svg' % (self.path, 'Cartesian'))) + + if self.running_sugar: + scale = self.height / 800. + else: + scale = self.height / 800. + # scale = (self.height + ICON_SIZE) / 800. + self.overlay_shapes['Cartesian'] = Sprite( + self.sprite_list, + int(self.width / 2 - 600), + int(self.height / 2 - 450), + pixbuf.scale_simple(int(1200 * scale), + int(900 * scale), + gtk.gdk.INTERP_BILINEAR)) + self.overlay_shapes['Cartesian'].set_layer(TAB_LAYER) + self.overlay_shapes['Cartesian'].hide() + def set_sharing(self, shared): self._sharing = shared @@ -714,7 +741,8 @@ class TurtleArtWindow(): if self.running_sugar: y_offset = 0 else: - y_offset = ICON_SIZE + y_offset = 0 + # y_offset = ICON_SIZE self.canvas.draw_surface( self.overlay_shapes[overlay].cached_surfaces[0], (self.canvas.width - width) / 2.0, @@ -722,10 +750,13 @@ class TurtleArtWindow(): width, height) - def update_overlay_position(self, widget, event): + def update_overlay_position(self, widget=None, event=None): ''' Reposition the overlays when window size changes ''' - self.width = event.width - self.height = event.height + # self.width = event.width + # self.height = event.height + self.width = gtk.gdk.screen_width() + self.height = gtk.gdk.screen_height() + for name in OVERLAY_SHAPES: if not name in self.overlay_shapes: continue @@ -734,17 +765,24 @@ class TurtleArtWindow(): if shape in shape._sprites.list: shape.hide() showing = True + self.overlay_shapes[name].move((int(self.width / 2 - 600), + int(self.height / 2 - 450))) + ''' self.overlay_shapes[name] = Sprite( self.sprite_list, int(self.width / 2 - 600), int(self.height / 2 - 450), svg_str_to_pixbuf( svg_from_file('%s/images/%s.svg' % (self.path, name)))) + ''' if showing: self.overlay_shapes[name].set_layer(OVERLAY_LAYER) else: self.overlay_shapes[name].hide() + ''' self.overlay_shapes[name].type = 'overlay' + ''' + self.cartesian = False self.polar = False self.metric = False @@ -802,6 +840,7 @@ class TurtleArtWindow(): if not self.running_sugar or not self.activity.has_toolbarbox: self.toolbar_spr.set_layer(CATEGORY_LAYER) self.palette = True + self._set_coordinates_label(palette_names[n]) def hide_palette(self): ''' Hide the palette. ''' @@ -1410,6 +1449,13 @@ class TurtleArtWindow(): if spr is not None: blk = self.block_list.spr_to_block(spr) if blk is not None: + # Make sure stop button is visible + if self.running_sugar: + self.activity.stop_turtle_button.set_icon("stopiton") + self.activity.stop_turtle_button.set_tooltip( + _('Stop turtle')) + elif self.interactive_mode: + self.toolbar_shapes['stopiton'].set_layer(TAB_LAYER) self.showlabel('status', label=_('Please hit the Stop Button \ before making changes to your Turtle Blocks program')) @@ -2511,10 +2557,12 @@ before making changes to your Turtle Blocks program')) pos = self.turtles.screen_to_turtle_coordinates((dx, dy)) if self.selected_turtle.get_pen_state(): self.selected_turtle.set_pen_state(False) - self.selected_turtle.set_xy(*pos, share=False) + self.selected_turtle.set_xy(*pos, share=False, + dragging=True) self.selected_turtle.set_pen_state(True) else: - self.selected_turtle.set_xy(*pos, share=False) + self.selected_turtle.set_xy(*pos, share=False, + dragging=True) if self.update_counter % 5: self.lc.update_label_value( 'xcor', self.selected_turtle.get_xy()[0] / @@ -3809,7 +3857,6 @@ before making changes to your Turtle Blocks program')) (self._loaded_project), self.running_sugar) saved_project_data = '' current_project_data = data_to_string(self.assemble_data_to_save()) - return saved_project_data != current_project_data def load_files(self, ta_file, create_new_project=True): @@ -4133,6 +4180,7 @@ before making changes to your Turtle Blocks program')) [None, None]]]) else: self.process_data(data_from_file(ta_file)) + self._loaded_project = ta_file def save_file(self, file_name=None): ''' Start a project to a file ''' @@ -4219,11 +4267,7 @@ before making changes to your Turtle Blocks program')) def display_coordinates(self, clear=False): ''' Display the coordinates of the current turtle on the toolbar ''' if clear: - if self.running_sugar: - self.activity.coordinates_label.set_text('') - self.activity.coordinates_label.show() - elif self.interactive_mode: - self.parent.set_title('') + self._set_coordinates_label('') else: x = round_int(float(self.turtles.get_active_turtle().get_xy()[0]) / self.coord_scale) @@ -4235,19 +4279,25 @@ before making changes to your Turtle Blocks program')) formatting = '(%d, %d) %d' else: formatting = '(%0.2f, %0.2f) %0.2f' - self.activity.coordinates_label.set_text( - formatting % (x, y, h)) - self.activity.coordinates_label.show() + self._set_coordinates_label(formatting % (x, y, h)) elif self.interactive_mode: if int(x) == x and int(y) == y and int(h) == h: formatting = '%s — %s: %d %s: %d %s: %d' else: formatting = '%s — %s: %0.2f %s: %0.2f %s: %0.2f' - self.parent.set_title( + self._set_coordinates_label( formatting % (self.activity.name, _('xcor'), x, _('ycor'), y, _('heading'), h)) self.update_counter = 0 + def _set_coordinates_label(self, text): + if self.running_sugar: + self.activity.coordinates_label.set_text(text) + self.activity.coordinates_label.show() + elif self.interactive_mode: + self.parent.set_title(text) + + def showlabel(self, shp, label=''): ''' Display a message on a status block ''' if not self.interactive_mode: |