diff options
Diffstat (limited to 'turtleart.py')
-rwxr-xr-x | turtleart.py | 337 |
1 files changed, 284 insertions, 53 deletions
diff --git a/turtleart.py b/turtleart.py index f9b9ce1..57209a9 100755 --- a/turtleart.py +++ b/turtleart.py @@ -1,6 +1,6 @@ #!/usr/bin/env python #Copyright (c) 2007-8, Playful Invention Company -#Copyright (c) 2008-9, Walter Bender +#Copyright (c) 2008-10, Walter Bender #Permission is hereby granted, free of charge, to any person obtaining a copy #of this software and associated documentation files (the "Software"), to deal @@ -23,55 +23,56 @@ import pygtk pygtk.require('2.0') import gtk -import gobject import os import os.path -import locale from gettext import gettext as _ +from taconstants import OVERLAY_LAYER +from tautils import data_to_string, data_from_string, get_save_name -from tawindow import * +from tawindow import TurtleArtWindow +from taexporthtml import save_html +from taexportlogo import save_logo -""" -Make a path if it doesn't previously exist -""" def makepath(path): - + """ Make a path if it doesn't previously exist """ from os import makedirs from os.path import normpath, dirname, exists dpath = normpath(dirname(path)) - if not exists(dpath): makedirs(dpath) - -""" -Launch Turtle Art from outside of Sugar -$ python turtleart.py + if not exists(dpath): + makedirs(dpath) -Caveats: - * no Sugar toolbars - * no Sugar Journal access - * no Sugar sharing -""" class TurtleMain(): def __init__(self): - tw = None + """ Launch Turtle Art from outside of Sugar """ + self.i = 0 + self.scale = 2.0 + self.tw = None # make sure Sugar paths are present - tapath = os.path.join(os.environ['HOME'],'.sugar','default', \ + tapath = os.path.join(os.environ['HOME'], '.sugar', 'default', \ 'org.laptop.TurtleArtActivity') - map (makepath, (os.path.join(tapath,'data/'), \ - os.path.join(tapath,'instance/'))) - - """ - Find closest match for the user's $LANG - """ - lang = locale.getdefaultlocale()[0] - if not lang: - lang = 'en' - lang = lang[0:2] - + map (makepath, (os.path.join(tapath, 'data/'), \ + os.path.join(tapath, 'instance/'))) + win = gtk.Window(gtk.WINDOW_TOPLEVEL) + try: + data_file = open('.turtleartrc', 'r') + except IOError: + data_file = open('.turtleartrc', 'a+') + data_file.write(str(50)+'\n') + data_file.write(str(50)+'\n') + data_file.write(str(800)+'\n') + data_file.write(str(550)+'\n') + data_file.seek(0) + self.x = int(data_file.readline()) + self.y = int(data_file.readline()) + self.width = int(data_file.readline()) + self.height = int(data_file.readline()) + win.set_default_size(self.width, self.height) + win.move(self.x, self.y) win.maximize() win.set_title(_("Turtle Art")) - win.connect("delete_event", lambda w,e: gtk.main_quit()) + win.connect("delete_event", lambda w, e: gtk.main_quit()) menu = gtk.Menu() @@ -83,21 +84,98 @@ class TurtleMain(): menu.append(menu_items) menu_items.connect("activate", self._do_save_cb) menu_items.show() - - activity_menu = gtk.MenuItem("File") + menu_items = gtk.MenuItem(_("Save As")) + menu.append(menu_items) + menu_items.connect("activate", self._do_save_as_cb) + menu_items.show() + menu_items = gtk.MenuItem(_("Save as image")) + menu.append(menu_items) + menu_items.connect("activate", self._do_save_picture_cb) + menu_items.show() + menu_items = gtk.MenuItem(_("Save as HTML")) + menu.append(menu_items) + menu_items.connect("activate", self._do_save_html_cb) + menu_items.show() + menu_items = gtk.MenuItem(_("Save as Logo")) + menu.append(menu_items) + menu_items.connect("activate", self._do_save_logo_cb) + menu_items.show() + menu_items = gtk.MenuItem(_("Quit")) + menu.append(menu_items) + menu_items.connect("activate", self.destroy) + menu_items.show() + + activity_menu = gtk.MenuItem(_("File")) activity_menu.show() activity_menu.set_submenu(menu) menu = gtk.Menu() - menu_items = gtk.MenuItem(_("Palette")) + menu_items = gtk.MenuItem(_("Cartesian coordinates")) + menu.append(menu_items) + menu_items.connect("activate", self._do_cartesian_cb) + menu_items.show() + menu_items = gtk.MenuItem(_("Polar coordinates")) + menu.append(menu_items) + menu_items.connect("activate", self._do_polar_cb) + menu_items.show() + menu_items = gtk.MenuItem(_('Rescale coordinates')) + menu.append(menu_items) + menu_items.connect("activate", self._do_rescale_cb) + menu_items.show() + menu_items = gtk.MenuItem(_("Grow blocks")) + menu.append(menu_items) + menu_items.connect("activate", self._do_resize_cb, 1.5) + menu_items.show() + menu_items = gtk.MenuItem(_("Shrink blocks")) + menu.append(menu_items) + menu_items.connect("activate", self._do_resize_cb, 0.667) + menu_items.show() + menu_items = gtk.MenuItem(_("Reset block size")) + menu.append(menu_items) + menu_items.connect("activate", self._do_resize_cb, -1) + menu_items.show() + + view_menu = gtk.MenuItem(_("View")) + view_menu.show() + view_menu.set_submenu(menu) + + menu = gtk.Menu() + + menu_items = gtk.MenuItem(_("Copy")) + menu.append(menu_items) + menu_items.connect("activate", self._do_copy_cb) + menu_items.show() + menu_items = gtk.MenuItem(_("Paste")) + menu.append(menu_items) + menu_items.connect("activate", self._do_paste_cb) + menu_items.show() + + edit_menu = gtk.MenuItem(_("Edit")) + edit_menu.show() + edit_menu.set_submenu(menu) + + menu = gtk.Menu() + + menu_items = gtk.MenuItem(_("Show palette")) menu.append(menu_items) menu_items.connect("activate", self._do_palette_cb) menu_items.show() - menu_items = gtk.MenuItem(_("Blocks")) + menu_items = gtk.MenuItem(_("Hide palette")) + menu.append(menu_items) + menu_items.connect("activate", self._do_hide_palette_cb) + menu_items.show() + menu_items = gtk.MenuItem(_("Show/hide blocks")) menu.append(menu_items) menu_items.connect("activate", self._do_hideshow_cb) menu_items.show() + + tool_menu = gtk.MenuItem(_("Tools")) + tool_menu.show() + tool_menu.set_submenu(menu) + + menu = gtk.Menu() + menu_items = gtk.MenuItem(_("Clean")) menu.append(menu_items) menu_items.connect("activate", self._do_eraser_cb) @@ -110,14 +188,18 @@ class TurtleMain(): menu.append(menu_items) menu_items.connect("activate", self._do_step_cb) menu_items.show() + menu_items = gtk.MenuItem(_("Debug")) + menu.append(menu_items) + menu_items.connect("activate", self._do_trace_cb) + menu_items.show() menu_items = gtk.MenuItem(_("Stop")) menu.append(menu_items) menu_items.connect("activate", self._do_stop_cb) menu_items.show() - project_menu = gtk.MenuItem("Tools") - project_menu.show() - project_menu.set_submenu(menu) + turtle_menu = gtk.MenuItem(_("Turtle")) + turtle_menu.show() + turtle_menu.set_submenu(menu) vbox = gtk.VBox(False, 0) win.add(vbox) @@ -127,53 +209,202 @@ class TurtleMain(): vbox.pack_start(menu_bar, False, False, 2) menu_bar.show() + sw = gtk.ScrolledWindow() + sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + sw.show() canvas = gtk.DrawingArea() - vbox.pack_end(canvas, True, True) + width = gtk.gdk.screen_width() * 2 + height = gtk.gdk.screen_height() * 2 + canvas.set_size_request(width, height) + sw.add_with_viewport(canvas) canvas.show() + vbox.pack_end(sw, True, True) menu_bar.append(activity_menu) - menu_bar.append(project_menu) + menu_bar.append(edit_menu) + menu_bar.append(view_menu) + menu_bar.append(tool_menu) + menu_bar.append(turtle_menu) win.show_all() - self.tw = twNew(canvas, os.path.abspath('.'), lang) + + if os.path.exists('/usr/share/turtleart'): + self.tw = TurtleArtWindow(canvas, '/usr/share/turtleart') + elif os.path.exists('/usr/local/share/turtleart'): + self.tw = TurtleArtWindow(canvas, '/usr/local/share/turtleart') + else: + self.tw = TurtleArtWindow(canvas, os.path.abspath('.')) self.tw.win = win + self.tw.load_start() + self.tw.save_folder = os.path.expanduser("~") def _do_open_cb(self, widget): - load_file(self.tw, True) + """ Callback for open project. """ + self.tw.load_file(True) def _do_save_cb(self, widget): - save_file(self.tw) + """ Callback for save project. """ + self.tw.save_file() + + def _do_save_as_cb(self, widget): + """ Callback for save-as project. """ + self.tw.save_file_name = None + self.tw.save_file() + + def _do_save_picture_cb(self, widget): + """ Callback for save canvas. """ + self.tw.save_as_image() + + def _do_save_html_cb(self, widget): + """ Callback for save project to HTML. """ + html = save_html(self, self.tw, False) + if len(html) == 0: + return + save_type = '.html' + if len(self.tw.saved_pictures) > 0: + if self.tw.saved_pictures[0].endswith(('.svg')): + save_type = '.xml' + filename, self.tw.load_save_folder = get_save_name(save_type, + self.tw.load_save_folder, 'portfolio') + f = file(filename, "w") + f.write(html) + f.close() + self.tw.saved_pictures = [] + + def _do_save_logo_cb(self, widget): + """ Callback for save project to Logo. """ + logocode = save_logo(self.tw) + if len(logocode) == 0: + return + save_type = '.lg' + filename, self.tw.load_save_folder = get_save_name(save_type, + self.tw.load_save_folder, 'logosession') + f = file(filename, "w") + f.write(logocode) + f.close() + + def _do_resize_cb(self, widget, factor): + """ Callback to resize blocks. """ + if factor == -1: + self.tw.block_scale = 2.0 + else: + self.tw.block_scale *= factor + self.tw.resize_blocks() + + def _do_cartesian_cb(self, button): + """ Callback to display/hide Cartesian coordinate overlay. """ + if self.tw.cartesian is True: + if self.tw.coord_scale == 1: + self.tw.overlay_shapes['Cartesian_labeled'].hide() + else: + self.tw.overlay_shapes['Cartesian'].hide() + self.tw.cartesian = False + else: + if self.tw.coord_scale == 1: + self.tw.overlay_shapes['Cartesian_labeled'].set_layer( + OVERLAY_LAYER) + else: + self.tw.overlay_shapes['Cartesian'].set_layer(OVERLAY_LAYER) + self.tw.cartesian = True + + def _do_polar_cb(self, button): + """ Callback to display/hide Polar coordinate overlay. """ + if self.tw.polar is True: + self.tw.overlay_shapes['polar'].hide() + self.tw.polar = False + else: + self.tw.overlay_shapes['polar'].set_layer(OVERLAY_LAYER) + self.tw.polar = True + + def _do_rescale_cb(self, button): + """ Callback to rescale coordinate space. """ + if self.tw.coord_scale == 1: + self.tw.coord_scale = self.tw.height/200 + self.tw.eraser_button() + if self.tw.cartesian is True: + self.tw.overlay_shapes['Cartesian_labeled'].hide() + self.tw.overlay_shapes['Cartesian'].set_layer(OVERLAY_LAYER) + else: + self.tw.coord_scale = 1 + self.tw.eraser_button() + if self.tw.cartesian is True: + self.tw.overlay_shapes['Cartesian'].hide() + self.tw.overlay_shapes['Cartesian_labeled'].set_layer( + OVERLAY_LAYER) def _do_palette_cb(self, widget): - if self.tw.palette == True: - hideshow_palette(self.tw,False) - else: - hideshow_palette(self.tw,True) + """ Callback to show/hide palette of blocks. """ + self.tw.show_palette(self.i) + self.i += 1 + if self.i == len(self.tw.palettes): + self.i = 0 + + def _do_hide_palette_cb(self, widget): + """ Hide the palette of blocks. """ + self.tw.hide_palette() def _do_hideshow_cb(self, widget): - hideshow_button(self.tw) + """ Hide/show the blocks. """ + self.tw.hideshow_button() def _do_eraser_cb(self, widget): - eraser_button(self.tw) + """ Callback for eraser button. """ + self.tw.eraser_button() return def _do_run_cb(self, widget): + """ Callback for run button (rabbit). """ self.tw.lc.trace = 0 - runbutton(self.tw, 0) + self.tw.run_button(0) return def _do_step_cb(self, widget): + """ Callback for step button (turtle). """ self.tw.lc.trace = 0 - runbutton(self.tw, 3) + self.tw.run_button(3) + return + + def _do_trace_cb(self, widget): + """ Callback for debug button (bug). """ + self.tw.lc.trace = 1 + self.tw.run_button(6) return def _do_stop_cb(self, widget): + """ Callback for stop button. """ self.tw.lc.trace = 0 - stop_button(self.tw) + self.tw.stop_button() return + def _do_copy_cb(self, button): + """ Callback for copy button. """ + clipBoard = gtk.Clipboard() + data = self.tw.assemble_data_to_save(False, False) + if data is not []: + text = data_to_string(data) + clipBoard.set_text(text) + + def _do_paste_cb(self, button): + """ Callback for paste button. """ + clipBoard = gtk.Clipboard() + text = clipBoard.wait_for_text() + if text is not None: + self.tw.process_data(data_from_string(text)) + + def _window_event(self, event, data): + """ Callback for resize event. """ + data_file = open('.turtleartrc', 'w') + data_file.write(str(data.x)+'\n') + data_file.write(str(data.y)+'\n') + data_file.write(str(data.width)+'\n') + data_file.write(str(data.height)+'\n') + + def destroy(self, event, data=None): + """ Callback for destroy event. """ + gtk.main_quit() def main(): + """ python turtleart.py """ gtk.main() return 0 |