From 33de02bc04595ec56fa8ef7c3200dba63c05297b Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Thu, 12 Feb 2009 21:58:53 +0000 Subject: finishing up merge from TAPortfolio --- diff --git a/NEWS b/NEWS index 72512d7..08f4aa4 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,7 @@ +33 + +* merge with TAPortfolio (and elimination of Sensor and myblock features) + 32 * rebase on TAPortfolio code diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py index d762339..2d9f51b 100644 --- a/TurtleArtActivity.py +++ b/TurtleArtActivity.py @@ -26,11 +26,21 @@ pygtk.require('2.0') import gtk import gobject +import logging +_logger = logging.getLogger('turtleart-activity') + import sugar from sugar.activity import activity from sugar.graphics.toolbutton import ToolButton from sugar.graphics.menuitem import MenuItem from sugar.datastore import datastore + +import telepathy +from dbus.service import method, signal +from dbus.gobject_service import ExportedGObject +from sugar.presence import presenceservice +from sugar.presence.tubeconn import TubeConnection + from sugar import profile from gettext import gettext as _ import locale @@ -38,20 +48,42 @@ import os.path import os import tarfile import sys +from taexporthtml import * from taexportlogo import * +import re + +SERVICE = 'org.laptop.TurtleArtActivity' +IFACE = SERVICE +PATH = '/org/laptop/TurtleArtActivity' class TurtleArtActivity(activity.Activity): def __init__(self, handle): super(TurtleArtActivity,self).__init__(handle) + try: + datapath = os.path.join(activity.get_activity_root(), "data") + except: + # early versions of Sugar (e.g., 656) didn't support + # get_activity_root() + datapath = \ + "/home/olpc/.sugar/default/org.laptop.TurtleArtActivity/data" + toolbox = activity.ActivityToolbox(self) self.set_toolbox(toolbox) + # Notify when the visibility state changes + self.add_events(gtk.gdk.VISIBILITY_NOTIFY_MASK) + self.connect("visibility-notify-event", self.__visibility_notify_cb) + + # Add additional panels self.projectToolbar = ProjectToolbar(self) toolbox.add_toolbar( _('Project'), self.projectToolbar ) - + self.saveasToolbar = SaveAsToolbar(self) + toolbox.add_toolbar( _('Save as'), self.saveasToolbar ) toolbox.show() + + # set the project toolbar as the initial one selected toolbox.set_current_toolbar(1) canvas = gtk.EventBox() @@ -64,10 +96,11 @@ class TurtleArtActivity(activity.Activity): try: version = os.environ['SUGAR_BUNDLE_VERSION'] except: - version = "-unknown" + version = " unknown" lang = locale.getdefaultlocale()[0] - if not lang: lang = 'en' + if not lang: + lang = 'en' lang = lang[0:2] if not os.path.isdir(os.path.join(activity.get_bundle_path(), \ 'images', lang)): @@ -77,22 +110,20 @@ class TurtleArtActivity(activity.Activity): # if so, remove any old png files as they will need to be regenerated filename = "version.dat" versiondata = [] - + newversion = True try: - FILE = open(os.path.join(activity.get_activity_root(), "data", \ - filename), "r") + FILE = open(os.path.join(datapath, filename), "r") if FILE.readline() == lang + version: - pass + newversion = False else: - print "out with the old, in with the new" - os.system("rm " + os.path.join(activity.get_activity_root(), \ - "data", '*.png')) + _logger.debug("out with the old, in with the new") + os.system("rm " + os.path.join(datapath, '*.png')) except: - print "writing new version data" + _logger.debug("writing new version data") + _logger.debug("and creating a tamyblock.py Journal entry") versiondata.append(lang + version) - FILE = open(os.path.join(activity.get_activity_root(), "data", \ - filename), "w") + FILE = open(os.path.join(datapath, filename), "w") FILE.writelines(versiondata) FILE.close() @@ -106,6 +137,154 @@ class TurtleArtActivity(activity.Activity): if self._jobject and self._jobject.file_path: self.read_file(self._jobject.file_path) + ## sharing code + # Get the Presence Service + self.pservice = presenceservice.get_instance() + self.initiating = None # sharing (True) or joining (False) + + # add my buddy object to the list + owner = self.pservice.get_owner() + self.owner = owner + self.tw.buddies.append(self.owner) + self._share = "" + + self.connect('shared', self._shared_cb) + self.connect('joined', self._joined_cb) + + def _shared_cb(self, activity): + if self._shared_activity is None: + _logger.error("Failed to share or join activity ... \ + _shared_activity is null in _shared_cb()") + return + + self.initiating = True + self.waiting_for_blocks = False + _logger.debug('I am sharing...') + + self.conn = self._shared_activity.telepathy_conn + self.tubes_chan = self._shared_activity.telepathy_tubes_chan + self.text_chan = self._shared_activity.telepathy_text_chan + + # call back for "NewTube" signal + self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].connect_to_signal \ + ('NewTube', self._new_tube_cb) + + _logger.debug('This is my activity: making a tube...') + id = self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].OfferDBusTube( + SERVICE, {}) + + def _joined_cb(self, activity): + if self._shared_activity is None: + _logger.error("Failed to share or join activity ... \ + _shared_activity is null in _shared_cb()") + return + + self.initiating = False + _logger.debug('I joined a shared activity.') + + self.conn = self._shared_activity.telepathy_conn + self.tubes_chan = self._shared_activity.telepathy_tubes_chan + self.text_chan = self._shared_activity.telepathy_text_chan + + # call back for "NewTube" signal + self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].connect_to_signal( \ + 'NewTube', self._new_tube_cb) + + _logger.debug('I am joining an activity: waiting for a tube...') + self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].ListTubes( + reply_handler=self._list_tubes_reply_cb, + error_handler=self._list_tubes_error_cb) + + + # joiner should request current state from sharer + self.waiting_for_blocks = True + + def _list_tubes_reply_cb(self, tubes): + for tube_info in tubes: + self._new_tube_cb(*tube_info) + + def _list_tubes_error_cb(self, e): + _logger.error('ListTubes() failed: %s', e) + + def _new_tube_cb(self, id, initiator, type, service, params, state): + _logger.debug('New tube: ID=%d initator=%d type=%d service=%s ' + 'params=%r state=%d', id, initiator, type, service, + params, state) + + if (type == telepathy.TUBE_TYPE_DBUS and service == SERVICE): + if state == telepathy.TUBE_STATE_LOCAL_PENDING: + self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES].AcceptDBusTube(id) + + tube_conn = TubeConnection(self.conn, + self.tubes_chan[telepathy.CHANNEL_TYPE_TUBES], id, \ + group_iface=self.text_chan[telepathy.CHANNEL_INTERFACE_GROUP]) + + # we'll use a chat tube to send serialized stacks back and forth + self.chattube = ChatTube(tube_conn, self.initiating, \ + self.event_received_cb) + + # now that we have the tube, we can ask for an initialization + if self.waiting_for_blocks is True: + self._send_event("i") + + # handle the receiving of events + def event_received_cb(self, text): + # maybe we can use a stack to share events to new-comers? + # self._share += "text + "\n" + if text[0] == 'p': # button press + e,x,y,mask = re.split(":",text) + # _logger.debug("receiving button press: "+x+" "+y+" "+mask) + if mask == 'T': + tawindow.button_press(self.tw,True,int(x),int(y),False) + else: + tawindow.button_press(self.tw,False,int(x),int(y),False) + elif text[0] == 'r': # block release + e,x,y = re.split(":",text) + # _logger.debug("receiving button release: " + x + " " + y) + tawindow.button_release(self.tw,int(x),int(y),False) + elif text[0] == 'm': # mouse move + e,x,y = re.split(":",text) + _logger.debug("recieving move: " + x + " " + y) + tawindow.mouse_move(self.tw,0,0,False,int(x),int(y)) + elif text[0] == 'k': # typing + e,mask,keyname = re.split(":",text,3) + # _logger.debug("recieving key press: " + mask + " " + keyname) + if mask == 'T': + tawindow.key_press(self.tw,True,keyname,False) + else: + tawindow.key_press(self.tw,False,keyname,False) + elif text[0] == 'i': # request for current state + # sharer should send current state to joiner + if self.initiating is True: + _logger.debug("serialize the project and send to joiner") + text = tawindow.save_string(self.tw) + self._send_event("I:" + text) + tawindow.show_palette(self.tw) + elif text[0] == 'I': # receiving current state + if self.waiting_for_blocks: + _logger.debug("receiving project from sharer") + e,text = re.split(":",text,2) + # unpack data + tawindow.load_string(self.tw,text) + # all caught up + self.waiting_for_blocks = False + + # send events + def _send_event(self, entry): + # nick = profile.get_nick_name() + # nick = nick.upper() + if hasattr(self, 'chattube') and self.chattube is not None: + self.chattube.SendText(entry) + + # Callback method for when the activity's visibility changes + def __visibility_notify_cb(self, window, event): + if event.state == gtk.gdk.VISIBILITY_FULLY_OBSCURED: +# _logger.debug("I am not visible so I should free the audio") + self.tw.lc.ag = None + elif event.state in \ + [gtk.gdk.VISIBILITY_UNOBSCURED, gtk.gdk.VISIBILITY_PARTIAL]: + pass + def update_title_cb(self, widget, event, toolbox): toolbox._activity_toolbar._update_title_cb() toolbox._activity_toolbar._update_title_sid = True @@ -114,19 +293,21 @@ class TurtleArtActivity(activity.Activity): self.jobject_new_patch() def write_file(self, file_path): - print "Writing file %s" % file_path + # just save .ta file + _logger.debug("Writing file %s" % file_path) self.metadata['mime_type'] = 'application/x-tar' import tempfile tar_fd = tarfile.open(file_path, 'w') pngfd, pngfile = tempfile.mkstemp(".png") tafd, tafile = tempfile.mkstemp(".ta") - del pngfd, tafd + del pngfd + del tafd try: tawindow.save_data(self.tw,tafile) tawindow.save_pict(self.tw,pngfile) tar_fd.add(tafile, "ta_code.ta") - tar_fd.add(pngfile, "ta_image.png") + tar_fd.add(pngfile, "ta_image.png") finally: tar_fd.close() @@ -136,24 +317,25 @@ class TurtleArtActivity(activity.Activity): def read_file(self, file_path): import tarfile,os,tempfile,shutil - print "Reading file %s" % file_path - # might be a tar file + _logger.debug("Reading file %s" % file_path) + # should be a tar file if file_path[-5:] == ".gtar": tar_fd = tarfile.open(file_path, 'r') tmpdir = tempfile.mkdtemp() try: - # We'll get 'ta_code.ta' and 'ta_image.png' + # We'll get 'ta_code.ta' and possibly a 'ta_image.png' tar_fd.extractall(tmpdir) tawindow.load_files(self.tw, os.path.join(tmpdir, \ 'ta_code.ta'), os.path.join(tmpdir, 'ta_image.png')) finally: shutil.rmtree(tmpdir) tar_fd.close() - # or just a .ta file + # try to open a .ta file elif file_path[-3:] == ".ta": tawindow.load_files(self.tw, file_path, "") - # run the activity - tawindow.runbutton(self.tw, 0) + + # run the activity + tawindow.runbutton(self.tw, 0) def jobject_new_patch(self): oldj = self._jobject @@ -176,13 +358,151 @@ class TurtleArtActivity(activity.Activity): def clear_journal(self): jobjects, total_count = datastore.find( \ {'activity': 'org.sugarlab.TAPortfolioActivity'}) - print 'found', total_count, 'entries' + _logger.debug('found', total_count, 'entries') for jobject in jobjects[:-1]: - print jobject.object_id + _logger.debug(jobject.object_id) datastore.delete(jobject.object_id) +class ChatTube(ExportedGObject): + + def __init__(self, tube, is_initiator, stack_received_cb): + super(ChatTube, self).__init__(tube, PATH) + self.tube = tube + self.is_initiator = is_initiator # Are we sharing or joining activity? + self.stack_received_cb = stack_received_cb + self.stack = '' + + self.tube.add_signal_receiver(self.send_stack_cb, 'SendText', IFACE, \ + path=PATH, sender_keyword='sender') + + def send_stack_cb(self, text, sender=None): + if sender == self.tube.get_unique_name(): + return + self.stack = text + self.stack_received_cb(text) + + @signal(dbus_interface=IFACE, signature='s') + def SendText(self, text): + self.stack = text + +class SaveAsToolbar(gtk.Toolbar): + def __init__(self, pc): + gtk.Toolbar.__init__(self) + self.activity = pc + + # HTML save source button + self.savehtml = ToolButton( "htmloff" ) + self.savehtml.set_tooltip(_('save as HTML')) + self.savehtml.props.sensitive = True + self.savehtml.connect('clicked', self.do_savehtml) + self.insert(self.savehtml, -1) + self.savehtml.show() + + # Berkeley Logo save source button + self.savelogo = ToolButton( "logo-saveoff" ) + self.savelogo.set_tooltip(_('save Logo')) + self.savelogo.props.sensitive = True + self.savelogo.connect('clicked', self.do_savelogo) + self.insert(self.savelogo, -1) + self.savelogo.show() + + def do_savehtml(self, button): + # write html out to datastore + self.savehtml.set_icon("htmlon") + _logger.debug("saving html code") + # til we add the option + embed_flag = True + + # grab code from stacks + html = save_html(self,self.activity.tw,embed_flag) + if len(html) == 0: + return + + # save the html code to the instance directory + try: + datapath = os.path.join(activity.get_activity_root(), "instance") + except: + # early versions of Sugar (656) didn't support get_activity_root() + datapath = \ + "/home/olpc/.sugar/default/org.laptop.TurtleArtActivity/instance" + + html_file = os.path.join(datapath, "taportfolio.html") + f = file(html_file, "w") + f.write(html) + f.close() + + if embed_flag == False: + # need to make a tarball that includes the images + tar_path = os.path.join(datapath, 'portfolio.tar') + tar_fd = tarfile.open(tar_path, 'w') + try: + tar_fd.add(html_file, "portfolio.html") + import glob + image_list = glob.glob(os.path.join(datapath, 'image*')) + for i in image_list: + tar_fd.add(i, os.path.basename(i)) + finally: + tar_fd.close() + + # Create a datastore object + file_dsobject = datastore.create() + + # Write any metadata (here we specifically set the title of the file + # and specify that this is a plain text file). + file_dsobject.metadata['title'] = "TAportfolio" + file_dsobject.metadata['icon-color'] = profile.get_color().to_string() + if embed_flag == True: + file_dsobject.metadata['mime_type'] = 'text/html' + file_dsobject.set_file_path(html_file) + else: + file_dsobject.metadata['mime_type'] = 'application/x-tar' + file_dsobject.set_file_path(tar_path) + datastore.write(file_dsobject) + file_dsobject.destroy() + gobject.timeout_add(250,self.savehtml.set_icon, "htmloff") + return + + def do_savelogo(self, button): + # write logo code out to datastore + self.savelogo.set_icon("logo-saveon") + # grab code from stacks + logocode = save_logo(self,self.activity.tw) + if len(logocode) == 0: + return + filename = "logosession.lg" + # Create a datastore object + file_dsobject = datastore.create() + + # Write any metadata (here we specifically set the title of the file + # and specify that this is a plain text file). + file_dsobject.metadata['title'] = filename + file_dsobject.metadata['mime_type'] = 'text/plain' + file_dsobject.metadata['icon-color'] = profile.get_color().to_string() + + # save the html code to the instance directory + try: + datapath = os.path.join(activity.get_activity_root(), "instance") + except: + # early versions of Sugar (656) didn't support get_activity_root() + datapath = \ + "/home/olpc/.sugar/default/org.laptop.TurtleArtActivity/instance" + + #Write the actual file to the data directory of this activity's root. + file_path = os.path.join(datapath, filename) + f = open(file_path, 'w') + try: + f.write(logocode) + finally: + f.close() + + #Set the file_path in the datastore. + file_dsobject.set_file_path(file_path) + + datastore.write(file_dsobject) + gobject.timeout_add(250,self.savelogo.set_icon, "logo-saveoff") + return class ProjectToolbar(gtk.Toolbar): @@ -190,22 +510,22 @@ class ProjectToolbar(gtk.Toolbar): gtk.Toolbar.__init__(self) self.activity = pc - # blocks button - self.blocks = ToolButton( "blocksoff" ) - self.blocks.set_tooltip(_('hide palette')) + # palette button (blocks) + self.palette = ToolButton( "blocksoff" ) + self.palette.set_tooltip(_('hide palette')) + self.palette.props.sensitive = True + self.palette.connect('clicked', self.do_palette) + self.insert(self.palette, -1) + self.palette.show() + + # blocks button (hideshow) + self.blocks = ToolButton( "hideshowoff" ) + self.blocks.set_tooltip(_('hide blocks')) self.blocks.props.sensitive = True - self.blocks.connect('clicked', self.do_blocks) + self.blocks.connect('clicked', self.do_hideshow) self.insert(self.blocks, -1) self.blocks.show() - # hide-show button - self.hideshow = ToolButton( "hideshowoff" ) - self.hideshow.set_tooltip(_('hide blocks')) - self.hideshow.props.sensitive = True - self.hideshow.connect('clicked', self.do_hideshow) - self.insert(self.hideshow, -1) - self.hideshow.show() - separator = gtk.SeparatorToolItem() separator.set_draw(True) self.insert(separator, -1) @@ -261,33 +581,26 @@ class ProjectToolbar(gtk.Toolbar): self.insert(self.sampb, -1) self.sampb.show() - separator = gtk.SeparatorToolItem() - separator.set_draw(True) - self.insert(separator, -1) - separator.show() - - # Berkeley Logo save source button - self.savelogo = ToolButton( "logo-saveoff" ) - self.savelogo.set_tooltip(_('save Logo')) - self.savelogo.props.sensitive = True - self.savelogo.connect('clicked', self.do_savelogo) - self.insert(self.savelogo, -1) - self.savelogo.show() - - def do_blocks(self, button): - tawindow.hideshow_palette(self.activity.tw) - if self.activity.tw.palette == False: - self.blocks.set_icon("blockson") - self.blocks.set_tooltip(_('show palette')) + def do_palette(self, button): + if self.activity.tw.palette == True: + tawindow.hideshow_palette(self.activity.tw,False) + self.palette.set_icon("blockson") + self.palette.set_tooltip(_('show palette')) else: - self.blocks.set_icon("blocksoff") - self.blocks.set_tooltip(_('hide palette')) + tawindow.hideshow_palette(self.activity.tw,True) + self.palette.set_icon("blocksoff") + self.palette.set_tooltip(_('hide palette')) def do_hidepalette(self): - print "in do_hidepalette" - self.blocks.set_icon("blockson") - self.blocks.set_tooltip(_('show palette')) - + # print "in do_hidepalette" + self.palette.set_icon("blockson") + self.palette.set_tooltip(_('show palette')) + + def do_showpalette(self): + # print "in do_showpalette" + self.palette.set_icon("blocksoff") + self.palette.set_tooltip(_('hide palette')) + def do_run(self, button): self.runproject.set_icon("run-faston") self.stop.set_icon("stopiton") @@ -311,24 +624,30 @@ class ProjectToolbar(gtk.Toolbar): def do_hideshow(self, button): tawindow.hideshow_button(self.activity.tw) if self.activity.tw.hide == True: # we just hid the blocks - self.hideshow.set_icon("hideshowon") - self.hideshow.set_tooltip(_('show blocks')) + self.blocks.set_icon("hideshowon") + self.blocks.set_tooltip(_('show blocks')) else: - self.hideshow.set_icon("hideshowoff") - self.hideshow.set_tooltip(_('hide blocks')) + self.blocks.set_icon("hideshowoff") + self.blocks.set_tooltip(_('hide blocks')) # update palette buttons too if self.activity.tw.palette == False: - self.blocks.set_icon("blockson") - self.blocks.set_tooltip(_('show palette')) + self.palette.set_icon("blockson") + self.palette.set_tooltip(_('show palette')) else: - self.blocks.set_icon("blocksoff") - self.blocks.set_tooltip(_('hide palette')) + self.palette.set_icon("blocksoff") + self.palette.set_tooltip(_('hide palette')) def do_hide(self): - self.hideshow.set_icon("hideshowon") - self.hideshow.set_tooltip(_('show blocks')) - self.blocks.set_icon("blockson") - self.blocks.set_tooltip(_('show palette')) + self.blocks.set_icon("hideshowon") + self.blocks.set_tooltip(_('show blocks')) + self.palette.set_icon("blockson") + self.palette.set_tooltip(_('show palette')) + + def do_show(self): + self.blocks.set_icon("hideshowoff") + self.blocks.set_tooltip(_('hide blocks')) + self.palette.set_icon("blocksoff") + self.palette.set_tooltip(_('hide palette')) def do_eraser(self, button): self.eraser.set_icon("eraseroff") @@ -338,37 +657,3 @@ class ProjectToolbar(gtk.Toolbar): def do_samples(self, button): tawindow.load_file(self.activity.tw) - def do_savelogo(self, button): - # write logo code out to datastore - self.savelogo.set_icon("logo-saveon") - # grab code from stacks - logocode = save_logo(self,self.activity.tw) - if len(logocode) == 0: - return - filename = "logosession.lg" - - # Create a datastore object - file_dsobject = datastore.create() - - # Write any metadata (here we specifically set the title of the file - # and specify that this is a plain text file). - file_dsobject.metadata['title'] = filename - file_dsobject.metadata['mime_type'] = 'text/plain' - file_dsobject.metadata['icon-color'] = profile.get_color().to_string() - - #Write the actual file to the data directory of this activity's root. - file_path = os.path.join(self.activity.get_activity_root(), \ - 'instance', filename) - f = open(file_path, 'w') - try: - f.write(logocode) - finally: - f.close() - - #Set the file_path in the datastore. - file_dsobject.set_file_path(file_path) - - datastore.write(file_dsobject) - gobject.timeout_add(250,self.savelogo.set_icon, "logo-saveoff") - return - diff --git a/activity/activity.info b/activity/activity.info index b123109..fa6151c 100644 --- a/activity/activity.info +++ b/activity/activity.info @@ -1,6 +1,6 @@ [Activity] name = Turtle Art -activity_version = 32 +activity_version = 33 license = MIT service_name = org.laptop.TurtleArtActivity class = TurtleArtActivity.TurtleArtActivity diff --git a/images/en/flow/flowgroup.svg b/images/en/flow/flowgroup.svg index 1748f2f..27b4007 100644 --- a/images/en/flow/flowgroup.svg +++ b/images/en/flow/flowgroup.svg @@ -1,339 +1,359 @@ - + - - + + - - + - - + + - + - + - + - + - + - + - + + + - - - + + + + + + + + - + - + - + - - + + - X - - X + + + Flow - - Flow + + - + - + - - - - - wait - - - - + + + + + wait + + + + forever - - - forever + + + + repeat - - - if - - - repeat + + + + if + + + then - - - then + + + + stop - - - stop + + + stack - - - - stack + + + + if - - if + + + then - - then + + + else - - - - - - - - - - - + id="tspan97" + style="font-size:6px">else + + + + + + + diff --git a/images/en/flow/flowmask.svg b/images/en/flow/flowmask.svg index 86320c5..ac29920 100644 --- a/images/en/flow/flowmask.svg +++ b/images/en/flow/flowmask.svg @@ -3,46 +3,64 @@ + id="svg3662"> + + y="30" + id="rect3664" + style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" /> + y="0" + id="rect3666" + style="opacity:1;fill:#080808;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" /> + d="M 0.5,470 L 0.5,486 L 3.5,493 L 8.5,497 L 15,499.5 L 129,499.5 L 136,497 L 142,492 L 145,484 L 145,470 L 0.5,470 z" + id="path3668" + style="fill:#080808;fill-opacity:1;stroke:none;stroke-width:1px;stroke-opacity:1" /> + d="M 75,37 C 85,37 85,37 85,37 C 85,37 88,39 89,40 C 90,41 91,44 91,44 L 91,57 C 91,57 90,59 89,60 C 88,61 85,63 85,63 L 74,63 L 74,63 L 74,65 L 61,65 L 61,63 L 49,63 C 49,63 47,61 46,60 C 45,59 43,57 43,57 L 43,44 C 43,44 45,41 46,40 C 47,39 49,37 49,37 L 60,37 L 60,41 L 75,41 L 75,37 z" + id="path3670" + style="fill:#101010;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + d="M 52,78 C 63,78 63,78 63,78 C 63,78 65,79 65,79 C 66,80 67,81 67,81 L 123,82 L 123,89 L 121,89 C 121,89 120,88 119,87 C 118,87 116,86 116,86 L 105,86 L 105,89 L 92,89 L 92,86 L 79,86 C 79,86 76,88 75,89 C 74,90 73,92 73,92 L 73,106 L 27,106 C 27,106 24,105 23,104 C 22,103 20,100 20,100 L 21,85 C 21,85 22,82 23,81 C 24,80 27,78 27,78 L 37,78 L 37,81 L 52,81 L 52,78 z" + id="path3672" + style="fill:#181818;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + d="M 47,119 C 58,119 58,119 58,119 C 58,119 60,120 60,120 C 61,121 62,122 62,122 L 80,122 L 80,126 L 77,126 L 77,124 L 72,124 L 72,139 L 77,139 L 77,137 L 80,137 L 80,146 L 128,146 L 128,154 L 125,154 C 125,154 124,152 123,151 C 122,151 121,150 121,150 L 110,150 L 110,154 L 96,154 L 96,150 L 84,150 C 84,150 81,152 80,153 C 79,154 78,156 78,156 L 78,172 L 65,172 C 65,172 64,175 63,176 C 62,177 59,178 59,178 L 46,178 L 46,181 L 34,181 L 34,178 L 22,178 C 22,178 19,177 18,176 C 17,175 16,173 16,173 L 16,125 C 16,125 17,123 18,121 C 19,120 22,119 22,119 L 32,119 L 32,122 L 47,122 L 47,119 z" + id="path3674" + style="fill:#202020;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + d="M 47,194 C 58,194 58,194 58,194 C 58,194 60,194 60,195 C 61,195 62,197 62,197 L 88,197 L 88,200 C 88,200 79,201 76,203 C 73,204 69,207 68,210 C 67,211 67,215 68,216 C 69,219 73,221 75,222 C 78,224 88,225 88,225 L 88,230 L 124,230 L 126,232 L 128,235 L 128,245 L 125,245 C 125,245 124,244 123,243 C 123,242 121,242 121,242 L 110,242 L 110,245 L 96,245 L 96,242 L 84,242 C 84,242 81,243 80,244 C 79,245 78,248 78,248 L 78,263 L 65,263 C 65,263 64,266 63,267 C 62,268 59,269 59,269 L 46,269 L 46,272 L 34,272 L 34,269 L 22,269 C 22,269 19,268 18,267 C 17,266 16,263 16,263 L 16,200 C 16,200 17,197 18,196 C 19,195 22,194 22,194 L 32,194 L 32,197 L 47,197 L 47,194 z" + id="path3676" + style="fill:#282828;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + d="M 112,272 C 122,272 122,272 122,272 C 122,272 125,273 126,274 C 127,275 128,278 128,278 L 128,290 L 105,303 C 105,303 80,290 80,290 L 80,278 C 80,278 82,275 83,274 C 83,273 86,272 86,272 L 97,272 L 97,275 L 112,275 L 112,272 z" + id="path3678" + style="fill:#303030;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + d="M 36,299 C 43,299 43,299 43,299 C 43,299 45,300 45,300 C 46,300 46,302 46,302 L 63,302 L 63,304 C 63,304 58,304 56,305 C 54,306 51,308 50,310 C 50,311 50,313 51,314 C 51,316 53,317 55,318 C 57,319 63,321 63,321 L 63,323 L 125,323 L 127,325 L 128,327 L 128,334 L 126,334 C 126,334 126,332 125,332 C 125,332 123,331 123,331 L 116,331 L 116,334 L 107,334 L 107,331 L 99,331 C 99,331 97,332 96,333 C 95,333 95,333 95,335 L 94,346 L 90,346 L 90,334 C 90,334 89,333 88,333 C 88,332 86,331 86,331 L 78,331 L 78,334 L 70,334 L 70,331 L 61,331 C 61,331 59,332 58,333 C 58,334 57,336 57,336 L 57,346 L 48,346 C 48,346 48,348 47,348 C 46,349 44,350 44,350 L 36,350 L 36,352 L 27,352 L 27,350 L 20,350 C 20,350 18,349 17,348 C 16,348 15,346 15,346 L 15,304 C 15,304 16,302 17,301 C 18,300 19,299 19,299 L 27,299 L 27,302 L 36,302 L 36,299 z" + id="path3680" + style="fill:#383838;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + d="M 49,373 C 60,373 59,373 59,373 C 59,373 61,374 62,374 C 62,375 63,376 63,376 L 67,376 L 67,367 L 127,367 L 127,374 L 124,374 C 124,374 123,373 122,372 C 121,372 119,371 119,371 L 109,371 L 109,374 L 96,374 L 96,371 L 83,371 C 83,371 80,373 79,373 C 78,374 77,378 77,378 L 77,398 L 24,398 C 24,398 20,397 19,396 C 18,395 17,392 17,392 L 17,379 C 17,379 19,376 19,375 C 20,374 23,373 23,373 L 34,373 L 34,376 L 49,376 L 49,373 z" + id="path3682" + style="fill:#404040;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + d="M 49,412 C 59,412 59,412 59,412 C 59,412 62,413 63,414 C 64,416 65,418 65,418 L 65,451 C 65,451 64,454 63,454 C 62,455 59,457 59,457 L 48,457 L 48,457 L 48,460 L 35,460 L 35,457 L 23,457 C 23,457 20,455 20,454 C 19,454 17,451 17,451 L 17,418 C 17,418 19,416 20,414 C 20,413 23,412 23,412 L 34,412 L 34,415 L 49,415 L 49,412 z" + id="path3684" + style="fill:#484848;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + diff --git a/images/en/flow/forever.svg b/images/en/flow/forever.svg index edb3c32..9ec4515 100644 --- a/images/en/flow/forever.svg +++ b/images/en/flow/forever.svg @@ -29,18 +29,6 @@ - - - - + - + id="svg2"> + + id="stop3168" + style="stop-color:#ffffff;stop-opacity:1" + offset="0" /> + id="stop3170" + style="stop-color:#feb00a;stop-opacity:1" + offset="1" /> - - - - - - + d="M 49,10 C 65,10 63.5,10 63.5,10 C 63.5,10 66.601442,10.911257 67.599776,11.735552 C 68.513039,12.489604 70,15 70,15 L 76,15 L 76,1 L 165,1 L 165,12 L 161.5,12 C 161.5,12 159.50402,9.839275 158.47638,9.0181448 C 157.26499,8.0501979 154,7 154,7 L 138,7 L 138,12 L 119,12 L 119,7 L 100,7 C 100,7 95.232772,10.250132 94,11.5 C 92.519844,13.000683 91,17 91,17 L 91,47 L 11,47 C 11,47 5.7858998,45.476228 4.2145276,44.094205 C 2.5042859,42.590046 1,38 1,38 L 1,18.536761 C 1,18.536761 3.0412395,14.409331 4.2068283,13.268363 C 5.6647982,11.841189 10,10 10,10 L 26,10 L 26,15 L 49,15 L 49,10 z" + id="path10" + style="opacity:1;fill:url(#linearGradient3172);fill-opacity:1;stroke:#a97513;stroke-width:2;stroke-opacity:1" /> diff --git a/images/en/flow/if.svg b/images/en/flow/if.svg index 8af2c96..655b50e 100644 --- a/images/en/flow/if.svg +++ b/images/en/flow/if.svg @@ -29,15 +29,6 @@ - - - - - - - - - - - + - + id="svg2"> + + id="stop3168" + style="stop-color:#ffffff;stop-opacity:1" + offset="0" /> + id="stop3170" + style="stop-color:#feb00a;stop-opacity:1" + offset="1" /> - - - - - - - - - - + d="M 48,1 C 64,1 64,1 64,1 C 64,1 68.131798,3.4865526 69.5,5 C 70.897472,6.5458243 73,11 73,11 L 73,60 C 73,60 70.78295,63.693654 69.5,65 C 68.07044,66.455629 64,69 64,69 L 47,69 L 47,69 L 47,73 L 27,73 L 27,69 L 10,69 C 10,69 5.9295605,66.455629 4.5,65 C 3.2170498,63.693654 1,60 1,60 L 1,11 C 1,11 3.1025283,6.5458243 4.5,5 C 5.8682021,3.4865526 10,1 10,1 L 26,1 L 26,6 L 48,6 L 48,1 z" + id="path9" + style="fill:url(#linearGradient3172);fill-opacity:1;stroke:#a97513;stroke-width:2;stroke-opacity:1" /> diff --git a/images/en/flow/wait.svg b/images/en/flow/wait.svg index a1d1005..4225606 100644 --- a/images/en/flow/wait.svg +++ b/images/en/flow/wait.svg @@ -34,24 +34,6 @@ - - - - - - - - - - - - - - - - - - + + - - - + - - + - - + + - - - - + - - + + - - - - - - - + - - + - - - + - - - + - - - + - - - + + + - - - - + - - - + diff --git a/images/en/myblocks/start.svg b/images/en/myblocks/start.svg index b444b08..d1bf832 100644 --- a/images/en/myblocks/start.svg +++ b/images/en/myblocks/start.svg @@ -1,26 +1,26 @@ - - - - - - - + - - + - - start - - + style="font-size:18px">start + + diff --git a/images/en/templates/audiooff.svg b/images/en/templates/audiooff.svg new file mode 100644 index 0000000..5bc2b0c --- /dev/null +++ b/images/en/templates/audiooff.svg @@ -0,0 +1,173 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/en/templates/audioon.svg b/images/en/templates/audioon.svg new file mode 100644 index 0000000..bdd209c --- /dev/null +++ b/images/en/templates/audioon.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/images/en/templates/hideblocks.svg b/images/en/templates/hideblocks.svg new file mode 100644 index 0000000..312c78b --- /dev/null +++ b/images/en/templates/hideblocks.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + hide + + + blocks + + diff --git a/images/en/templates/journal.svg b/images/en/templates/journal.svg new file mode 100644 index 0000000..76e4faa --- /dev/null +++ b/images/en/templates/journal.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/en/templates/sound.svg b/images/en/templates/sound.svg new file mode 100644 index 0000000..89e3696 --- /dev/null +++ b/images/en/templates/sound.svg @@ -0,0 +1,256 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sound + + diff --git a/images/en/templates/template1.svg b/images/en/templates/template1.svg new file mode 100644 index 0000000..2a9df85 --- /dev/null +++ b/images/en/templates/template1.svg @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/en/templates/template2.svg b/images/en/templates/template2.svg new file mode 100644 index 0000000..819cb3f --- /dev/null +++ b/images/en/templates/template2.svg @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/en/templates/template3.svg b/images/en/templates/template3.svg new file mode 100644 index 0000000..81e41e7 --- /dev/null +++ b/images/en/templates/template3.svg @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/en/templates/template4.svg b/images/en/templates/template4.svg new file mode 100644 index 0000000..c229939 --- /dev/null +++ b/images/en/templates/template4.svg @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/en/templates/template6.svg b/images/en/templates/template6.svg new file mode 100644 index 0000000..e925c46 --- /dev/null +++ b/images/en/templates/template6.svg @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/en/templates/template7.svg b/images/en/templates/template7.svg new file mode 100644 index 0000000..6576d67 --- /dev/null +++ b/images/en/templates/template7.svg @@ -0,0 +1,383 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/en/templates/templatesgroup.svg b/images/en/templates/templatesgroup.svg new file mode 100644 index 0000000..ae13f21 --- /dev/null +++ b/images/en/templates/templatesgroup.svg @@ -0,0 +1,607 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + X + + Templates + + + + + + + + + + + + + + + + + hide + + + blocks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sound + + + + + + + + + + + + + + + diff --git a/images/en/templates/templatesmask.svg b/images/en/templates/templatesmask.svg new file mode 100644 index 0000000..80af61e --- /dev/null +++ b/images/en/templates/templatesmask.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/images/en/templates/texton.svg b/images/en/templates/texton.svg new file mode 100644 index 0000000..5e731b3 --- /dev/null +++ b/images/en/templates/texton.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/es/flow/flowgroup.svg b/images/es/flow/flowgroup.svg index 396f9b8..7eaf4c7 100644 --- a/images/es/flow/flowgroup.svg +++ b/images/es/flow/flowgroup.svg @@ -1,339 +1,396 @@ - + - - + + - - + - - + + - + - + - + - + - + - + - + + - - - + + + + + + + + - + - + - + - - + + - X - - X + + + Flujo - - Flujo + + - + - + - - - - - esperar - - - - + + + + + esperar + + + + por - - por + + + siempre - - - siempre + + + + repetir - - - si - - - repetir + + + + si + + + entonces - - - entonces + + + + detener - - - detener + + + acción - - - - acción + + + + si - - si + + + entonces - - entonces + + + si no - - - - - - - - - - si no + + + + + + - + transform="matrix(0,-0.6667,0.6667,0,26.029035,406.16204)" + id="path111" + style="fill:#505050;fill-opacity:1;stroke:#505050;stroke-width:1.5px;stroke-opacity:1" /> + + + + + + + + + diff --git a/images/es/flow/flowmask.svg b/images/es/flow/flowmask.svg index 86320c5..ac29920 100644 --- a/images/es/flow/flowmask.svg +++ b/images/es/flow/flowmask.svg @@ -3,46 +3,64 @@ + id="svg3662"> + + y="30" + id="rect3664" + style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:4;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" /> + y="0" + id="rect3666" + style="opacity:1;fill:#080808;fill-opacity:1;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;stroke-opacity:1" /> + d="M 0.5,470 L 0.5,486 L 3.5,493 L 8.5,497 L 15,499.5 L 129,499.5 L 136,497 L 142,492 L 145,484 L 145,470 L 0.5,470 z" + id="path3668" + style="fill:#080808;fill-opacity:1;stroke:none;stroke-width:1px;stroke-opacity:1" /> + d="M 75,37 C 85,37 85,37 85,37 C 85,37 88,39 89,40 C 90,41 91,44 91,44 L 91,57 C 91,57 90,59 89,60 C 88,61 85,63 85,63 L 74,63 L 74,63 L 74,65 L 61,65 L 61,63 L 49,63 C 49,63 47,61 46,60 C 45,59 43,57 43,57 L 43,44 C 43,44 45,41 46,40 C 47,39 49,37 49,37 L 60,37 L 60,41 L 75,41 L 75,37 z" + id="path3670" + style="fill:#101010;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + d="M 52,78 C 63,78 63,78 63,78 C 63,78 65,79 65,79 C 66,80 67,81 67,81 L 123,82 L 123,89 L 121,89 C 121,89 120,88 119,87 C 118,87 116,86 116,86 L 105,86 L 105,89 L 92,89 L 92,86 L 79,86 C 79,86 76,88 75,89 C 74,90 73,92 73,92 L 73,106 L 27,106 C 27,106 24,105 23,104 C 22,103 20,100 20,100 L 21,85 C 21,85 22,82 23,81 C 24,80 27,78 27,78 L 37,78 L 37,81 L 52,81 L 52,78 z" + id="path3672" + style="fill:#181818;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + d="M 47,119 C 58,119 58,119 58,119 C 58,119 60,120 60,120 C 61,121 62,122 62,122 L 80,122 L 80,126 L 77,126 L 77,124 L 72,124 L 72,139 L 77,139 L 77,137 L 80,137 L 80,146 L 128,146 L 128,154 L 125,154 C 125,154 124,152 123,151 C 122,151 121,150 121,150 L 110,150 L 110,154 L 96,154 L 96,150 L 84,150 C 84,150 81,152 80,153 C 79,154 78,156 78,156 L 78,172 L 65,172 C 65,172 64,175 63,176 C 62,177 59,178 59,178 L 46,178 L 46,181 L 34,181 L 34,178 L 22,178 C 22,178 19,177 18,176 C 17,175 16,173 16,173 L 16,125 C 16,125 17,123 18,121 C 19,120 22,119 22,119 L 32,119 L 32,122 L 47,122 L 47,119 z" + id="path3674" + style="fill:#202020;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + d="M 47,194 C 58,194 58,194 58,194 C 58,194 60,194 60,195 C 61,195 62,197 62,197 L 88,197 L 88,200 C 88,200 79,201 76,203 C 73,204 69,207 68,210 C 67,211 67,215 68,216 C 69,219 73,221 75,222 C 78,224 88,225 88,225 L 88,230 L 124,230 L 126,232 L 128,235 L 128,245 L 125,245 C 125,245 124,244 123,243 C 123,242 121,242 121,242 L 110,242 L 110,245 L 96,245 L 96,242 L 84,242 C 84,242 81,243 80,244 C 79,245 78,248 78,248 L 78,263 L 65,263 C 65,263 64,266 63,267 C 62,268 59,269 59,269 L 46,269 L 46,272 L 34,272 L 34,269 L 22,269 C 22,269 19,268 18,267 C 17,266 16,263 16,263 L 16,200 C 16,200 17,197 18,196 C 19,195 22,194 22,194 L 32,194 L 32,197 L 47,197 L 47,194 z" + id="path3676" + style="fill:#282828;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + d="M 112,272 C 122,272 122,272 122,272 C 122,272 125,273 126,274 C 127,275 128,278 128,278 L 128,290 L 105,303 C 105,303 80,290 80,290 L 80,278 C 80,278 82,275 83,274 C 83,273 86,272 86,272 L 97,272 L 97,275 L 112,275 L 112,272 z" + id="path3678" + style="fill:#303030;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + d="M 36,299 C 43,299 43,299 43,299 C 43,299 45,300 45,300 C 46,300 46,302 46,302 L 63,302 L 63,304 C 63,304 58,304 56,305 C 54,306 51,308 50,310 C 50,311 50,313 51,314 C 51,316 53,317 55,318 C 57,319 63,321 63,321 L 63,323 L 125,323 L 127,325 L 128,327 L 128,334 L 126,334 C 126,334 126,332 125,332 C 125,332 123,331 123,331 L 116,331 L 116,334 L 107,334 L 107,331 L 99,331 C 99,331 97,332 96,333 C 95,333 95,333 95,335 L 94,346 L 90,346 L 90,334 C 90,334 89,333 88,333 C 88,332 86,331 86,331 L 78,331 L 78,334 L 70,334 L 70,331 L 61,331 C 61,331 59,332 58,333 C 58,334 57,336 57,336 L 57,346 L 48,346 C 48,346 48,348 47,348 C 46,349 44,350 44,350 L 36,350 L 36,352 L 27,352 L 27,350 L 20,350 C 20,350 18,349 17,348 C 16,348 15,346 15,346 L 15,304 C 15,304 16,302 17,301 C 18,300 19,299 19,299 L 27,299 L 27,302 L 36,302 L 36,299 z" + id="path3680" + style="fill:#383838;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + d="M 49,373 C 60,373 59,373 59,373 C 59,373 61,374 62,374 C 62,375 63,376 63,376 L 67,376 L 67,367 L 127,367 L 127,374 L 124,374 C 124,374 123,373 122,372 C 121,372 119,371 119,371 L 109,371 L 109,374 L 96,374 L 96,371 L 83,371 C 83,371 80,373 79,373 C 78,374 77,378 77,378 L 77,398 L 24,398 C 24,398 20,397 19,396 C 18,395 17,392 17,392 L 17,379 C 17,379 19,376 19,375 C 20,374 23,373 23,373 L 34,373 L 34,376 L 49,376 L 49,373 z" + id="path3682" + style="fill:#404040;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + d="M 49,412 C 59,412 59,412 59,412 C 59,412 62,413 63,414 C 64,416 65,418 65,418 L 65,451 C 65,451 64,454 63,454 C 62,455 59,457 59,457 L 48,457 L 48,457 L 48,460 L 35,460 L 35,457 L 23,457 C 23,457 20,455 20,454 C 19,454 17,451 17,451 L 17,418 C 17,418 19,416 20,414 C 20,413 23,412 23,412 L 34,412 L 34,415 L 49,415 L 49,412 z" + id="path3684" + style="fill:#484848;fill-opacity:1;stroke:none;stroke-width:1;stroke-opacity:1" /> + diff --git a/images/es/myblocks/myblocksmask.svg b/images/es/myblocks/myblocksmask.svg index 90fbfb6..f9a5ca7 100644 --- a/images/es/myblocks/myblocksmask.svg +++ b/images/es/myblocks/myblocksmask.svg @@ -1,183 +1,184 @@ - - - - - - - - - - - - + + - - - + - - + - - + + - - - - + - - + + - - - - - - - + - - + - - - + - - - + - - - + - - - + + + - - - - + - - - + diff --git a/images/es/myblocks/start.svg b/images/es/myblocks/start.svg index 31eea49..ad1db19 100644 --- a/images/es/myblocks/start.svg +++ b/images/es/myblocks/start.svg @@ -1,26 +1,26 @@ - - - - - - - + - - + - - empezar - - + style="font-size:18px">empezar + + diff --git a/images/es/myblocks/storeinbox1.svg b/images/es/myblocks/storeinbox1.svg index a6c495f..05527e4 100644 --- a/images/es/myblocks/storeinbox1.svg +++ b/images/es/myblocks/storeinbox1.svg @@ -75,6 +75,6 @@ caja 1 + style="font-size:18px;">caja1 diff --git a/images/es/myblocks/storeinbox2.svg b/images/es/myblocks/storeinbox2.svg index 433a2f8..c121c84 100644 --- a/images/es/myblocks/storeinbox2.svg +++ b/images/es/myblocks/storeinbox2.svg @@ -75,6 +75,6 @@ caja 2 + style="font-size:18px;">caja2 diff --git a/images/es/templates/audiooff.svg b/images/es/templates/audiooff.svg new file mode 100644 index 0000000..5bc2b0c --- /dev/null +++ b/images/es/templates/audiooff.svg @@ -0,0 +1,173 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/es/templates/audioon.svg b/images/es/templates/audioon.svg new file mode 100644 index 0000000..bdd209c --- /dev/null +++ b/images/es/templates/audioon.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/images/es/templates/hideblocks.svg b/images/es/templates/hideblocks.svg new file mode 100644 index 0000000..f2d74da --- /dev/null +++ b/images/es/templates/hideblocks.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + oculta + + + bloques + + + los + + diff --git a/images/es/templates/journal.svg b/images/es/templates/journal.svg new file mode 100644 index 0000000..76e4faa --- /dev/null +++ b/images/es/templates/journal.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/es/templates/sound.svg b/images/es/templates/sound.svg new file mode 100644 index 0000000..efeeb10 --- /dev/null +++ b/images/es/templates/sound.svg @@ -0,0 +1,256 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sonido + + diff --git a/images/es/templates/template1.svg b/images/es/templates/template1.svg new file mode 100644 index 0000000..2a9df85 --- /dev/null +++ b/images/es/templates/template1.svg @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/es/templates/template2.svg b/images/es/templates/template2.svg new file mode 100644 index 0000000..819cb3f --- /dev/null +++ b/images/es/templates/template2.svg @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/es/templates/template3.svg b/images/es/templates/template3.svg new file mode 100644 index 0000000..81e41e7 --- /dev/null +++ b/images/es/templates/template3.svg @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/es/templates/template4.svg b/images/es/templates/template4.svg new file mode 100644 index 0000000..c229939 --- /dev/null +++ b/images/es/templates/template4.svg @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/es/templates/template6.svg b/images/es/templates/template6.svg new file mode 100644 index 0000000..e925c46 --- /dev/null +++ b/images/es/templates/template6.svg @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/es/templates/template7.svg b/images/es/templates/template7.svg new file mode 100644 index 0000000..6576d67 --- /dev/null +++ b/images/es/templates/template7.svg @@ -0,0 +1,383 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/es/templates/templatesgroup.svg b/images/es/templates/templatesgroup.svg new file mode 100644 index 0000000..8410d92 --- /dev/null +++ b/images/es/templates/templatesgroup.svg @@ -0,0 +1,618 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + X + + Plantillas + + + + + + + + + + + + + + + + + oculta + + + bloques + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sonido + + + + + + + + + + + + + + + + los + + diff --git a/images/es/templates/templatesmask.svg b/images/es/templates/templatesmask.svg new file mode 100644 index 0000000..80af61e --- /dev/null +++ b/images/es/templates/templatesmask.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/images/es/templates/texton.svg b/images/es/templates/texton.svg new file mode 100644 index 0000000..5e731b3 --- /dev/null +++ b/images/es/templates/texton.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fi/templates/audiooff.svg b/images/fi/templates/audiooff.svg new file mode 100644 index 0000000..5bc2b0c --- /dev/null +++ b/images/fi/templates/audiooff.svg @@ -0,0 +1,173 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fi/templates/audioon.svg b/images/fi/templates/audioon.svg new file mode 100644 index 0000000..bdd209c --- /dev/null +++ b/images/fi/templates/audioon.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fi/templates/hideblocks.svg b/images/fi/templates/hideblocks.svg new file mode 100644 index 0000000..312c78b --- /dev/null +++ b/images/fi/templates/hideblocks.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + hide + + + blocks + + diff --git a/images/fi/templates/journal.svg b/images/fi/templates/journal.svg new file mode 100644 index 0000000..76e4faa --- /dev/null +++ b/images/fi/templates/journal.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fi/templates/sound.svg b/images/fi/templates/sound.svg new file mode 100644 index 0000000..89e3696 --- /dev/null +++ b/images/fi/templates/sound.svg @@ -0,0 +1,256 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sound + + diff --git a/images/fi/templates/template1.svg b/images/fi/templates/template1.svg new file mode 100644 index 0000000..2a9df85 --- /dev/null +++ b/images/fi/templates/template1.svg @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fi/templates/template2.svg b/images/fi/templates/template2.svg new file mode 100644 index 0000000..819cb3f --- /dev/null +++ b/images/fi/templates/template2.svg @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fi/templates/template3.svg b/images/fi/templates/template3.svg new file mode 100644 index 0000000..81e41e7 --- /dev/null +++ b/images/fi/templates/template3.svg @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fi/templates/template4.svg b/images/fi/templates/template4.svg new file mode 100644 index 0000000..c229939 --- /dev/null +++ b/images/fi/templates/template4.svg @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fi/templates/template6.svg b/images/fi/templates/template6.svg new file mode 100644 index 0000000..e925c46 --- /dev/null +++ b/images/fi/templates/template6.svg @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fi/templates/template7.svg b/images/fi/templates/template7.svg new file mode 100644 index 0000000..6576d67 --- /dev/null +++ b/images/fi/templates/template7.svg @@ -0,0 +1,383 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fi/templates/templatesgroup.svg b/images/fi/templates/templatesgroup.svg new file mode 100644 index 0000000..ae13f21 --- /dev/null +++ b/images/fi/templates/templatesgroup.svg @@ -0,0 +1,607 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + X + + Templates + + + + + + + + + + + + + + + + + hide + + + blocks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sound + + + + + + + + + + + + + + + diff --git a/images/fi/templates/templatesmask.svg b/images/fi/templates/templatesmask.svg new file mode 100644 index 0000000..80af61e --- /dev/null +++ b/images/fi/templates/templatesmask.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/images/fi/templates/texton.svg b/images/fi/templates/texton.svg new file mode 100644 index 0000000..5e731b3 --- /dev/null +++ b/images/fi/templates/texton.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fr/templates/audiooff.svg b/images/fr/templates/audiooff.svg new file mode 100644 index 0000000..5bc2b0c --- /dev/null +++ b/images/fr/templates/audiooff.svg @@ -0,0 +1,173 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fr/templates/audioon.svg b/images/fr/templates/audioon.svg new file mode 100644 index 0000000..bdd209c --- /dev/null +++ b/images/fr/templates/audioon.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fr/templates/hideblocks.svg b/images/fr/templates/hideblocks.svg new file mode 100644 index 0000000..312c78b --- /dev/null +++ b/images/fr/templates/hideblocks.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + hide + + + blocks + + diff --git a/images/fr/templates/journal.svg b/images/fr/templates/journal.svg new file mode 100644 index 0000000..76e4faa --- /dev/null +++ b/images/fr/templates/journal.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fr/templates/sound.svg b/images/fr/templates/sound.svg new file mode 100644 index 0000000..89e3696 --- /dev/null +++ b/images/fr/templates/sound.svg @@ -0,0 +1,256 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sound + + diff --git a/images/fr/templates/template1.svg b/images/fr/templates/template1.svg new file mode 100644 index 0000000..2a9df85 --- /dev/null +++ b/images/fr/templates/template1.svg @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fr/templates/template2.svg b/images/fr/templates/template2.svg new file mode 100644 index 0000000..819cb3f --- /dev/null +++ b/images/fr/templates/template2.svg @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fr/templates/template3.svg b/images/fr/templates/template3.svg new file mode 100644 index 0000000..81e41e7 --- /dev/null +++ b/images/fr/templates/template3.svg @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fr/templates/template4.svg b/images/fr/templates/template4.svg new file mode 100644 index 0000000..c229939 --- /dev/null +++ b/images/fr/templates/template4.svg @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fr/templates/template6.svg b/images/fr/templates/template6.svg new file mode 100644 index 0000000..e925c46 --- /dev/null +++ b/images/fr/templates/template6.svg @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fr/templates/template7.svg b/images/fr/templates/template7.svg new file mode 100644 index 0000000..6576d67 --- /dev/null +++ b/images/fr/templates/template7.svg @@ -0,0 +1,383 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/fr/templates/templatesgroup.svg b/images/fr/templates/templatesgroup.svg new file mode 100644 index 0000000..ae13f21 --- /dev/null +++ b/images/fr/templates/templatesgroup.svg @@ -0,0 +1,607 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + X + + Templates + + + + + + + + + + + + + + + + + hide + + + blocks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sound + + + + + + + + + + + + + + + diff --git a/images/fr/templates/templatesmask.svg b/images/fr/templates/templatesmask.svg new file mode 100644 index 0000000..80af61e --- /dev/null +++ b/images/fr/templates/templatesmask.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/images/fr/templates/texton.svg b/images/fr/templates/texton.svg new file mode 100644 index 0000000..5e731b3 --- /dev/null +++ b/images/fr/templates/texton.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/mn/templates/audiooff.svg b/images/mn/templates/audiooff.svg new file mode 100644 index 0000000..5bc2b0c --- /dev/null +++ b/images/mn/templates/audiooff.svg @@ -0,0 +1,173 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/mn/templates/audioon.svg b/images/mn/templates/audioon.svg new file mode 100644 index 0000000..bdd209c --- /dev/null +++ b/images/mn/templates/audioon.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/images/mn/templates/hideblocks.svg b/images/mn/templates/hideblocks.svg new file mode 100644 index 0000000..312c78b --- /dev/null +++ b/images/mn/templates/hideblocks.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + hide + + + blocks + + diff --git a/images/mn/templates/journal.svg b/images/mn/templates/journal.svg new file mode 100644 index 0000000..76e4faa --- /dev/null +++ b/images/mn/templates/journal.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/mn/templates/sound.svg b/images/mn/templates/sound.svg new file mode 100644 index 0000000..89e3696 --- /dev/null +++ b/images/mn/templates/sound.svg @@ -0,0 +1,256 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sound + + diff --git a/images/mn/templates/template1.svg b/images/mn/templates/template1.svg new file mode 100644 index 0000000..2a9df85 --- /dev/null +++ b/images/mn/templates/template1.svg @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/mn/templates/template2.svg b/images/mn/templates/template2.svg new file mode 100644 index 0000000..819cb3f --- /dev/null +++ b/images/mn/templates/template2.svg @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/mn/templates/template3.svg b/images/mn/templates/template3.svg new file mode 100644 index 0000000..81e41e7 --- /dev/null +++ b/images/mn/templates/template3.svg @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/mn/templates/template4.svg b/images/mn/templates/template4.svg new file mode 100644 index 0000000..c229939 --- /dev/null +++ b/images/mn/templates/template4.svg @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/mn/templates/template6.svg b/images/mn/templates/template6.svg new file mode 100644 index 0000000..e925c46 --- /dev/null +++ b/images/mn/templates/template6.svg @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/mn/templates/template7.svg b/images/mn/templates/template7.svg new file mode 100644 index 0000000..6576d67 --- /dev/null +++ b/images/mn/templates/template7.svg @@ -0,0 +1,383 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/mn/templates/templatesgroup.svg b/images/mn/templates/templatesgroup.svg new file mode 100644 index 0000000..ae13f21 --- /dev/null +++ b/images/mn/templates/templatesgroup.svg @@ -0,0 +1,607 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + X + + Templates + + + + + + + + + + + + + + + + + hide + + + blocks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sound + + + + + + + + + + + + + + + diff --git a/images/mn/templates/templatesmask.svg b/images/mn/templates/templatesmask.svg new file mode 100644 index 0000000..80af61e --- /dev/null +++ b/images/mn/templates/templatesmask.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/images/mn/templates/texton.svg b/images/mn/templates/texton.svg new file mode 100644 index 0000000..5e731b3 --- /dev/null +++ b/images/mn/templates/texton.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/pt/templates/audiooff.svg b/images/pt/templates/audiooff.svg new file mode 100644 index 0000000..5bc2b0c --- /dev/null +++ b/images/pt/templates/audiooff.svg @@ -0,0 +1,173 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/pt/templates/audioon.svg b/images/pt/templates/audioon.svg new file mode 100644 index 0000000..bdd209c --- /dev/null +++ b/images/pt/templates/audioon.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/images/pt/templates/hideblocks.svg b/images/pt/templates/hideblocks.svg new file mode 100644 index 0000000..312c78b --- /dev/null +++ b/images/pt/templates/hideblocks.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + hide + + + blocks + + diff --git a/images/pt/templates/journal.svg b/images/pt/templates/journal.svg new file mode 100644 index 0000000..76e4faa --- /dev/null +++ b/images/pt/templates/journal.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/pt/templates/sound.svg b/images/pt/templates/sound.svg new file mode 100644 index 0000000..89e3696 --- /dev/null +++ b/images/pt/templates/sound.svg @@ -0,0 +1,256 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sound + + diff --git a/images/pt/templates/template1.svg b/images/pt/templates/template1.svg new file mode 100644 index 0000000..2a9df85 --- /dev/null +++ b/images/pt/templates/template1.svg @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/pt/templates/template2.svg b/images/pt/templates/template2.svg new file mode 100644 index 0000000..819cb3f --- /dev/null +++ b/images/pt/templates/template2.svg @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/pt/templates/template3.svg b/images/pt/templates/template3.svg new file mode 100644 index 0000000..81e41e7 --- /dev/null +++ b/images/pt/templates/template3.svg @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/pt/templates/template4.svg b/images/pt/templates/template4.svg new file mode 100644 index 0000000..c229939 --- /dev/null +++ b/images/pt/templates/template4.svg @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/pt/templates/template6.svg b/images/pt/templates/template6.svg new file mode 100644 index 0000000..e925c46 --- /dev/null +++ b/images/pt/templates/template6.svg @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/pt/templates/template7.svg b/images/pt/templates/template7.svg new file mode 100644 index 0000000..6576d67 --- /dev/null +++ b/images/pt/templates/template7.svg @@ -0,0 +1,383 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/pt/templates/templatesgroup.svg b/images/pt/templates/templatesgroup.svg new file mode 100644 index 0000000..ae13f21 --- /dev/null +++ b/images/pt/templates/templatesgroup.svg @@ -0,0 +1,607 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + X + + Templates + + + + + + + + + + + + + + + + + hide + + + blocks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sound + + + + + + + + + + + + + + + diff --git a/images/pt/templates/templatesmask.svg b/images/pt/templates/templatesmask.svg new file mode 100644 index 0000000..80af61e --- /dev/null +++ b/images/pt/templates/templatesmask.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/images/pt/templates/texton.svg b/images/pt/templates/texton.svg new file mode 100644 index 0000000..5e731b3 --- /dev/null +++ b/images/pt/templates/texton.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/ru/templates/audiooff.svg b/images/ru/templates/audiooff.svg new file mode 100644 index 0000000..5bc2b0c --- /dev/null +++ b/images/ru/templates/audiooff.svg @@ -0,0 +1,173 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/ru/templates/audioon.svg b/images/ru/templates/audioon.svg new file mode 100644 index 0000000..bdd209c --- /dev/null +++ b/images/ru/templates/audioon.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/images/ru/templates/hideblocks.svg b/images/ru/templates/hideblocks.svg new file mode 100644 index 0000000..312c78b --- /dev/null +++ b/images/ru/templates/hideblocks.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + hide + + + blocks + + diff --git a/images/ru/templates/journal.svg b/images/ru/templates/journal.svg new file mode 100644 index 0000000..76e4faa --- /dev/null +++ b/images/ru/templates/journal.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/ru/templates/sound.svg b/images/ru/templates/sound.svg new file mode 100644 index 0000000..89e3696 --- /dev/null +++ b/images/ru/templates/sound.svg @@ -0,0 +1,256 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sound + + diff --git a/images/ru/templates/template1.svg b/images/ru/templates/template1.svg new file mode 100644 index 0000000..2a9df85 --- /dev/null +++ b/images/ru/templates/template1.svg @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/ru/templates/template2.svg b/images/ru/templates/template2.svg new file mode 100644 index 0000000..819cb3f --- /dev/null +++ b/images/ru/templates/template2.svg @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/ru/templates/template3.svg b/images/ru/templates/template3.svg new file mode 100644 index 0000000..81e41e7 --- /dev/null +++ b/images/ru/templates/template3.svg @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/ru/templates/template4.svg b/images/ru/templates/template4.svg new file mode 100644 index 0000000..c229939 --- /dev/null +++ b/images/ru/templates/template4.svg @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/ru/templates/template6.svg b/images/ru/templates/template6.svg new file mode 100644 index 0000000..e925c46 --- /dev/null +++ b/images/ru/templates/template6.svg @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/ru/templates/template7.svg b/images/ru/templates/template7.svg new file mode 100644 index 0000000..6576d67 --- /dev/null +++ b/images/ru/templates/template7.svg @@ -0,0 +1,383 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/ru/templates/templatesgroup.svg b/images/ru/templates/templatesgroup.svg new file mode 100644 index 0000000..ae13f21 --- /dev/null +++ b/images/ru/templates/templatesgroup.svg @@ -0,0 +1,607 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + X + + Templates + + + + + + + + + + + + + + + + + hide + + + blocks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sound + + + + + + + + + + + + + + + diff --git a/images/ru/templates/templatesmask.svg b/images/ru/templates/templatesmask.svg new file mode 100644 index 0000000..80af61e --- /dev/null +++ b/images/ru/templates/templatesmask.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/images/ru/templates/texton.svg b/images/ru/templates/texton.svg new file mode 100644 index 0000000..5e731b3 --- /dev/null +++ b/images/ru/templates/texton.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/tr/templates/audiooff.svg b/images/tr/templates/audiooff.svg new file mode 100644 index 0000000..5bc2b0c --- /dev/null +++ b/images/tr/templates/audiooff.svg @@ -0,0 +1,173 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/tr/templates/audioon.svg b/images/tr/templates/audioon.svg new file mode 100644 index 0000000..bdd209c --- /dev/null +++ b/images/tr/templates/audioon.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/images/tr/templates/hideblocks.svg b/images/tr/templates/hideblocks.svg new file mode 100644 index 0000000..312c78b --- /dev/null +++ b/images/tr/templates/hideblocks.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + hide + + + blocks + + diff --git a/images/tr/templates/journal.svg b/images/tr/templates/journal.svg new file mode 100644 index 0000000..76e4faa --- /dev/null +++ b/images/tr/templates/journal.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/tr/templates/sound.svg b/images/tr/templates/sound.svg new file mode 100644 index 0000000..89e3696 --- /dev/null +++ b/images/tr/templates/sound.svg @@ -0,0 +1,256 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sound + + diff --git a/images/tr/templates/template1.svg b/images/tr/templates/template1.svg new file mode 100644 index 0000000..2a9df85 --- /dev/null +++ b/images/tr/templates/template1.svg @@ -0,0 +1,263 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/tr/templates/template2.svg b/images/tr/templates/template2.svg new file mode 100644 index 0000000..819cb3f --- /dev/null +++ b/images/tr/templates/template2.svg @@ -0,0 +1,281 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/tr/templates/template3.svg b/images/tr/templates/template3.svg new file mode 100644 index 0000000..81e41e7 --- /dev/null +++ b/images/tr/templates/template3.svg @@ -0,0 +1,497 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/tr/templates/template4.svg b/images/tr/templates/template4.svg new file mode 100644 index 0000000..c229939 --- /dev/null +++ b/images/tr/templates/template4.svg @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/tr/templates/template6.svg b/images/tr/templates/template6.svg new file mode 100644 index 0000000..e925c46 --- /dev/null +++ b/images/tr/templates/template6.svg @@ -0,0 +1,503 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/tr/templates/template7.svg b/images/tr/templates/template7.svg new file mode 100644 index 0000000..6576d67 --- /dev/null +++ b/images/tr/templates/template7.svg @@ -0,0 +1,383 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/tr/templates/templatesgroup.svg b/images/tr/templates/templatesgroup.svg new file mode 100644 index 0000000..ae13f21 --- /dev/null +++ b/images/tr/templates/templatesgroup.svg @@ -0,0 +1,607 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + X + + Templates + + + + + + + + + + + + + + + + + hide + + + blocks + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + sound + + + + + + + + + + + + + + + diff --git a/images/tr/templates/templatesmask.svg b/images/tr/templates/templatesmask.svg new file mode 100644 index 0000000..80af61e --- /dev/null +++ b/images/tr/templates/templatesmask.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/images/tr/templates/texton.svg b/images/tr/templates/texton.svg new file mode 100644 index 0000000..5e731b3 --- /dev/null +++ b/images/tr/templates/texton.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/po/TurtleArt.pot b/po/TurtleArt.pot index 22421a7..06e6663 100644 --- a/po/TurtleArt.pot +++ b/po/TurtleArt.pot @@ -1,36 +1,102 @@ -# POT file for Turtle Art -# Copyright (C) 2009 Playful Invention Company +# Turtle Art +# Copyright (C) 2009 Sugar Labs # This file is distributed under the same license as the PACKAGE package. # Walter Bender , 2009. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2008-11-17 10:53-0500\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Project-Id-Version: 4\n" +"Report-Msgid-Bugs-To: Walter Bender \n" +"POT-Creation-Date: 2009-01-21 10:45+0000\n" +"PO-Revision-Date: 2009-02-12 19:45+0000\n" "Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" +"Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" +"Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Translate Toolkit 1.0.1\n" -#: +#: activity/activity.info:2 msgid "Turtle Art" msgstr "" -#: +#: tasetup.py:46 tasetup.py:49 tasetup.py:50 tasetup.py:51 tasetup.py:52 +#: tasetup.py:53 tasetup.py:54 +msgid "title" +msgstr "" + +#: tasetup.py:66 +msgid "text" +msgstr "" + +#: tasetup.py:119 tasetup.py:120 +msgid "stack" +msgstr "" + +#: tasetup.py:125 tasetup.py:126 +msgid "box" +msgstr "" + +#: tasetup.py:127 +msgid "name" +msgstr "" + +#: TurtleArtActivity.py:48 msgid "Project" msgstr "" #: -msgid "Samples" +msgid "Save as" msgstr "" -#: -msgid "Save Logo" +#: TurtleArtActivity.py:173 TurtleArtActivity.py:262 +#: TurtleArtActivity.py:293 +msgid "hide palette" +msgstr "" + +#: TurtleArtActivity.py:181 TurtleArtActivity.py:286 +msgid "hide blocks" +msgstr "" + +#: TurtleArtActivity.py:194 +msgid "run" +msgstr "" + +#: TurtleArtActivity.py:202 +msgid "step" +msgstr "" + +#: TurtleArtActivity.py:210 +msgid "stop turtle" +msgstr "" + +#: TurtleArtActivity.py:223 +msgid "clean" +msgstr "" + +#: TurtleArtActivity.py:236 +msgid "sample portfolio templates" +msgstr "" + +#: TurtleArtActivity.py:249 +msgid "save as HTML" +msgstr "" + +#: TurtleArtActivity.py +msgid "save Logo" +msgstr "" + +#: TurtleArtActivity.py +msgid "load my block" +msgstr "" + +#: TurtleArtActivity.py:259 TurtleArtActivity.py:267 +#: TurtleArtActivity.py:290 TurtleArtActivity.py:299 +msgid "show palette" +msgstr "" + +#: TurtleArtActivity.py:283 TurtleArtActivity.py:297 +msgid "show blocks" msgstr "" #: @@ -70,14 +136,6 @@ msgid "My Blocks" msgstr "" #: -msgid "start" -msgstr "" - -#: -msgid "box" -msgstr "" - -#: msgid "box 1" msgstr "" @@ -86,10 +144,6 @@ msgid "box 2" msgstr "" #: -msgid "stack" -msgstr "" - -#: msgid "stack 1" msgstr "" @@ -106,10 +160,6 @@ msgid "store in box 2" msgstr "" #: -msgid "name" -msgstr "" - -#: msgid "push" msgstr "" @@ -118,14 +168,6 @@ msgid "pop" msgstr "" #: -msgid "show heap" -msgstr "" - -#: -msgid "empty heap" -msgstr "" - -#: msgid "Numbers" msgstr "" @@ -206,6 +248,10 @@ msgid "set color" msgstr "" #: +msgid "set text color" +msgstr "" + +#: msgid "Blocks" msgstr "" @@ -245,15 +291,11 @@ msgstr "" msgid "heading" msgstr "" -#: +# msgid "set heading" msgstr "seth" #: -msgid "clean" -msgstr "" - -#: msgid "set xy" msgstr "" @@ -293,3 +335,30 @@ msgstr "" msgid "resistance" msgstr "" +#: +msgid "Templates" +msgstr "" + +#: +msgid "Keyboard" +msgstr "" + +#: +msgid "read key" +msgstr "" + +#: +msgid "sound" +msgstr "" + +#: +msgid "hres" +msgstr "" + +#: +msgid "vres" +msgstr "" + +#: +msgid "start" +msgstr "" diff --git a/po/en.po b/po/en.po index fc91fd5..79accbe 100644 --- a/po/en.po +++ b/po/en.po @@ -12,20 +12,88 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.0.1\n" -#: + +#: activity/activity.info:2 msgid "Turtle Art" msgstr "" -#: +#: tasetup.py:46 tasetup.py:49 tasetup.py:50 tasetup.py:51 tasetup.py:52 +#: tasetup.py:53 tasetup.py:54 +msgid "title" +msgstr "" + +#: tasetup.py:66 +msgid "text" +msgstr "" + +#: tasetup.py:119 tasetup.py:120 +msgid "stack" +msgstr "action" + +#: tasetup.py:125 tasetup.py:126 +msgid "box" +msgstr "" + +#: tasetup.py:127 +msgid "name" +msgstr "" + +#: TurtleArtActivity.py:48 msgid "Project" msgstr "" #: -msgid "Samples" +msgid "Save as" +msgstr "Save/Load" + +#: TurtleArtActivity.py:173 TurtleArtActivity.py:262 +#: TurtleArtActivity.py:293 +msgid "hide palette" msgstr "" -#: -msgid "Save Logo" +#: TurtleArtActivity.py:181 TurtleArtActivity.py:286 +msgid "hide blocks" +msgstr "" + +#: TurtleArtActivity.py:194 +msgid "run" +msgstr "" + +#: TurtleArtActivity.py:202 +msgid "step" +msgstr "walk" + +#: TurtleArtActivity.py:210 +msgid "stop turtle" +msgstr "" + +#: TurtleArtActivity.py:223 +msgid "clean" +msgstr "" + +#: TurtleArtActivity.py:236 +msgid "sample portfolio templates" +msgstr "" + +#: TurtleArtActivity.py:249 +msgid "save as HTML" +msgstr "" + +#: TurtleArtActivity.py +msgid "save Logo" +msgstr "save as Logo" + +#: TurtleArtActivity.py +msgid "load my block" +msgstr "" + +#: TurtleArtActivity.py:259 TurtleArtActivity.py:267 +#: TurtleArtActivity.py:290 TurtleArtActivity.py:299 +msgid "show palette" +msgstr "" + +#: TurtleArtActivity.py:283 TurtleArtActivity.py:297 +msgid "show blocks" msgstr "" #: @@ -65,14 +133,6 @@ msgid "My Blocks" msgstr "" #: -msgid "start" -msgstr "" - -#: -msgid "box" -msgstr "" - -#: msgid "box 1" msgstr "" @@ -81,16 +141,12 @@ msgid "box 2" msgstr "" #: -msgid "stack" -msgstr "" - -#: msgid "stack 1" -msgstr "" +msgstr "action 1" #: msgid "stack 2" -msgstr "" +msgstr "action 2" #: msgid "store in box 1" @@ -101,10 +157,6 @@ msgid "store in box 2" msgstr "" #: -msgid "name" -msgstr "" - -#: msgid "push" msgstr "" @@ -113,14 +165,6 @@ msgid "pop" msgstr "" #: -msgid "show heap" -msgstr "" - -#: -msgid "empty heap" -msgstr "" - -#: msgid "Numbers" msgstr "" @@ -201,6 +245,10 @@ msgid "set color" msgstr "" #: +msgid "set text color" +msgstr "" + +#: msgid "Blocks" msgstr "" @@ -245,10 +293,6 @@ msgid "set heading" msgstr "seth" #: -msgid "clean" -msgstr "" - -#: msgid "set xy" msgstr "" @@ -288,3 +332,30 @@ msgstr "" msgid "resistance" msgstr "" +#: +msgid "Templates" +msgstr "" + +#: +msgid "Keyboard" +msgstr "" + +#: +msgid "read key" +msgstr "query kb" + +#: +msgid "sound" +msgstr "" + +#: +msgid "hres" +msgstr "" + +#: +msgid "vres" +msgstr "" + +#: +msgid "start" +msgstr "" diff --git a/po/es.po b/po/es.po index b48fe86..26d017f 100644 --- a/po/es.po +++ b/po/es.po @@ -12,21 +12,88 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Translate Toolkit 1.0.1\n" -#: +#: activity/activity.info:2 msgid "Turtle Art" -msgstr "Tortuga Art " +msgstr "Tortuga Art" -#: +#: tasetup.py:46 tasetup.py:49 tasetup.py:50 tasetup.py:51 tasetup.py:52 +#: tasetup.py:53 tasetup.py:54 +msgid "title" +msgstr "título" + +#: tasetup.py:66 +msgid "text" +msgstr "palabra" + +#: tasetup.py:119 tasetup.py:120 +msgid "stack" +msgstr "acción" + +#: tasetup.py:125 tasetup.py:126 +msgid "box" +msgstr "caja" + +#: tasetup.py:127 +msgid "name" +msgstr "nombre" + +#: TurtleArtActivity.py:48 msgid "Project" msgstr "Proyecto" #: -msgid "Samples" -msgstr "Ejemplos" +msgid "Save as" +msgstr "Guardar a/abrir de" -#: -msgid "Save Logo" -msgstr "Salvar a logo" +#: TurtleArtActivity.py:173 TurtleArtActivity.py:262 +#: TurtleArtActivity.py:293 +msgid "hide palette" +msgstr "oculta los palettes" + +#: TurtleArtActivity.py:181 TurtleArtActivity.py:286 +msgid "hide blocks" +msgstr "oculta los bloques" + +#: TurtleArtActivity.py:194 +msgid "run" +msgstr "correr" + +#: TurtleArtActivity.py:202 +msgid "step" +msgstr "caminar" + +#: TurtleArtActivity.py:210 +msgid "stop turtle" +msgstr "detener tortuga" + +#: TurtleArtActivity.py:223 +msgid "clean" +msgstr "limpiar" + +#: TurtleArtActivity.py:236 +msgid "sample portfolio templates" +msgstr "ejemplos" + +#: TurtleArtActivity.py:249 +msgid "save as HTML" +msgstr "guardar a HTML" + +#: TurtleArtActivity.py +msgid "save Logo" +msgstr "guardar a Logo" + +#: TurtleArtActivity.py:259 TurtleArtActivity.py:267 +#: TurtleArtActivity.py:290 TurtleArtActivity.py:299 +msgid "show palette" +msgstr "mostrar palette" + +#: TurtleArtActivity.py +msgid "load my block" +msgstr "carga de mi bloque" + +#: TurtleArtActivity.py:283 TurtleArtActivity.py:297 +msgid "show blocks" +msgstr "mostrar caja" #: msgid "Flow" @@ -65,14 +132,6 @@ msgid "My Blocks" msgstr "Mis bloques" #: -msgid "start" -msgstr "empezar" - -#: -msgid "box" -msgstr "caja" - -#: msgid "box 1" msgstr "caja 1" @@ -81,10 +140,6 @@ msgid "box 2" msgstr "caja 2" #: -msgid "stack" -msgstr "acción" - -#: msgid "stack 1" msgstr "acción 1" @@ -117,10 +172,6 @@ msgid "empty heap" msgstr "vaciar pila" #: -msgid "name" -msgstr "nombre" - -#: msgid "Numbers" msgstr "Números" @@ -189,6 +240,10 @@ msgid "set pen size" msgstr "fijar tamaño" #: +msgid "set text color" +msgstr "fijar el color del texto" + +#: msgid "pen size" msgstr "tamaño" @@ -245,10 +300,6 @@ msgid "set heading" msgstr "fijar rumbo" #: -msgid "clean" -msgstr "limpiar" - -#: msgid "set xy" msgstr "fijar xy" @@ -287,3 +338,31 @@ msgstr "voltaje" #: msgid "resistance" msgstr "resistencia" + +#: +msgid "Templates" +msgstr "Plantillas" + +#: +msgid "read key" +msgstr "leer tecla" + +#: +msgid "Keyboard" +msgstr "Teclado" + +#: +msgid "sound" +msgstr "sonido" + +#: horizontal resolution +msgid "hres" +msgstr "res h" + +#: vertical resolution +msgid "vres" +msgstr "res v" + +#: +msgid "start" +msgstr "empezar" diff --git a/samples/en/About_me.png b/samples/en/About_me.png new file mode 100644 index 0000000..85d1a65 --- /dev/null +++ b/samples/en/About_me.png Binary files differ diff --git a/samples/en/About_me.ta b/samples/en/About_me.ta new file mode 100644 index 0000000..805b0cf --- /dev/null +++ b/samples/en/About_me.ta @@ -0,0 +1,390 @@ +(lp0 +(I0 +S'stack1' +p1 +I442 +I94 +(lp2 +I8 +aI1 +atp3 +a(I1 +S'template7' +p4 +I442 +I133 +(lp5 +I0 +aI2 +aI3 +aI4 +aI5 +aI6 +aI7 +atp6 +a(I2 +(S'title' +p7 +S'My favorite things' +p8 +tp9 +I452 +I148 +(lp10 +I1 +aNatp11 +a(I3 +(S'journal' +p12 +S'None' +p13 +tp14 +I452 +I179 +(lp15 +I1 +aNatp16 +a(I4 +(g12 +g13 +tp17 +I532 +I179 +(lp18 +I1 +aNatp19 +a(I5 +(g12 +g13 +tp20 +I452 +I236 +(lp21 +I1 +aNatp22 +a(I6 +(g12 +g13 +tp23 +I532 +I236 +(lp24 +I1 +aNatp25 +a(I7 +S'stack2' +p26 +I442 +I295 +(lp27 +I1 +aI10 +atp28 +a(I8 +S'hat' +p29 +I404 +I24 +(lp30 +NaI9 +aI0 +atp31 +a(I9 +(S'string' +p32 +S'Part2' +p33 +tp34 +I426 +I51 +(lp35 +I8 +aNatp36 +a(I10 +g1 +I442 +I334 +(lp37 +I7 +aI11 +atp38 +a(I11 +S'template3' +p39 +I442 +I373 +(lp40 +I10 +aI12 +aI13 +aI14 +aI15 +aI16 +aI17 +aI18 +aI19 +aNatp41 +a(I12 +(g7 +S'Me' +p42 +tp43 +I452 +I387 +(lp44 +I11 +aNatp45 +a(I13 +(g32 +S'Name' +p46 +tp47 +I452 +I413 +(lp48 +I11 +aNatp49 +a(I14 +(g32 +S'Age' +p50 +tp51 +I452 +I439 +(lp52 +I11 +aNatp53 +a(I15 +(g32 +S'Hair color' +p54 +tp55 +I452 +I465 +(lp56 +I11 +aNatp57 +a(I16 +(g32 +S'Eye color' +p58 +tp59 +I452 +I491 +(lp60 +I11 +aNatp61 +a(I17 +(g32 +S'Favorite color' +p62 +tp63 +I452 +I517 +(lp64 +I11 +aNatp65 +a(I18 +(g32 +S'Favorite food' +p66 +tp67 +I452 +I543 +(lp68 +I11 +aNatp69 +a(I19 +(g32 +S'Favorite hobby' +p70 +tp71 +I452 +I569 +(lp72 +I11 +aNatp73 +a(I20 +S'hat1' +p74 +I990 +I271 +(lp75 +NaI21 +atp76 +a(I21 +S'clean' +p77 +I1002 +I321 +(lp78 +I20 +aNatp79 +a(I22 +S'hat2' +p80 +I993 +I386 +(lp81 +NaI23 +atp82 +a(I23 +S'wait' +p83 +I1005 +I436 +(lp84 +I22 +aI24 +aNatp85 +a(I24 +(S'number' +p86 +S'30' +p87 +tp88 +I1079 +I445 +(lp89 +I23 +aNatp90 +a(I25 +S'hideblocks' +p91 +I250 +I29 +(lp92 +NaI26 +atp93 +a(I26 +g1 +I250 +I83 +(lp94 +I25 +aI27 +atp95 +a(I27 +S'template1' +p96 +I250 +I122 +(lp97 +I26 +aI28 +aI29 +aI30 +atp98 +a(I28 +(g7 +S'About me' +p99 +tp100 +I260 +I137 +(lp101 +I27 +aNatp102 +a(I29 +(g12 +g13 +tp103 +I260 +I168 +(lp104 +I27 +aNatp105 +a(I30 +g26 +I250 +I230 +(lp106 +I27 +aI31 +atp107 +a(I31 +g1 +I250 +I269 +(lp108 +I30 +aI32 +atp109 +a(I32 +S'template6' +p110 +I250 +I308 +(lp111 +I31 +aI33 +aI34 +aI35 +aI36 +atp112 +a(I33 +(g7 +S'My family' +p113 +tp114 +I260 +I323 +(lp115 +I32 +aNatp116 +a(I34 +(g12 +g13 +tp117 +I260 +I354 +(lp118 +I32 +aNatp119 +a(I35 +(g12 +g13 +tp120 +I260 +I411 +(lp121 +I32 +aNatp122 +a(I36 +g26 +I250 +I470 +(lp123 +I32 +aI37 +atp124 +a(I37 +S'stack' +p125 +I250 +I509 +(lp126 +I36 +aI38 +aNatp127 +a(I38 +(g32 +S'Part2' +p128 +tp129 +I262 +I521 +(lp130 +I37 +aNatp131 +a(I-1 +S'turtle' +p132 +I0 +I0 +I0 +I0 +I50 +I5 +tp133 +a. \ No newline at end of file diff --git a/samples/en/Learning_Experiences.png b/samples/en/Learning_Experiences.png new file mode 100644 index 0000000..85d1a65 --- /dev/null +++ b/samples/en/Learning_Experiences.png Binary files differ diff --git a/samples/en/Learning_Experiences.ta b/samples/en/Learning_Experiences.ta new file mode 100644 index 0000000..e06c702 --- /dev/null +++ b/samples/en/Learning_Experiences.ta @@ -0,0 +1,529 @@ +(lp0 +(I0 +S'hat' +p1 +I194 +I11 +(lp2 +NaI35 +aI1 +atp3 +a(I1 +S'stack1' +p4 +I232 +I81 +(lp5 +I0 +aI2 +atp6 +a(I2 +S'template1' +p7 +I232 +I120 +(lp8 +I1 +aI27 +aI3 +aI4 +atp9 +a(I3 +(S'journal' +p10 +Ntp11 +I242 +I166 +(lp12 +I2 +aNatp13 +a(I4 +g4 +I232 +I228 +(lp14 +I2 +aI5 +atp15 +a(I5 +g7 +I232 +I267 +(lp16 +I4 +aI28 +aI6 +aI7 +atp17 +a(I6 +(g10 +Ntp18 +I242 +I313 +(lp19 +I5 +aNatp20 +a(I7 +g4 +I232 +I375 +(lp21 +I5 +aI8 +atp22 +a(I8 +g7 +I232 +I414 +(lp23 +I7 +aI29 +aI9 +aI10 +atp24 +a(I9 +(g10 +Ntp25 +I242 +I460 +(lp26 +I8 +aNatp27 +a(I10 +g4 +I232 +I522 +(lp28 +I8 +aI11 +atp29 +a(I11 +g7 +I232 +I561 +(lp30 +I10 +aI30 +aI12 +aNatp31 +a(I12 +(g10 +Ntp32 +I242 +I607 +(lp33 +I11 +aNatp34 +a(I13 +g1 +I592 +I11 +(lp35 +NaI36 +aI14 +atp36 +a(I14 +g4 +I630 +I81 +(lp37 +I13 +aI15 +atp38 +a(I15 +g7 +I630 +I120 +(lp39 +I14 +aI31 +aI16 +aI17 +atp40 +a(I16 +(g10 +Ntp41 +I640 +I166 +(lp42 +I15 +aNatp43 +a(I17 +g4 +I630 +I228 +(lp44 +I15 +aI18 +atp45 +a(I18 +g7 +I630 +I267 +(lp46 +I17 +aI32 +aI19 +aI20 +atp47 +a(I19 +(g10 +Ntp48 +I640 +I313 +(lp49 +I18 +aNatp50 +a(I20 +g4 +I630 +I375 +(lp51 +I18 +aI21 +atp52 +a(I21 +g7 +I630 +I414 +(lp53 +I20 +aI33 +aI22 +aI23 +atp54 +a(I22 +(g10 +Ntp55 +I640 +I460 +(lp56 +I21 +aNatp57 +a(I23 +g4 +I630 +I522 +(lp58 +I21 +aI24 +atp59 +a(I24 +g7 +I630 +I561 +(lp60 +I23 +aI34 +aI25 +aNatp61 +a(I25 +(g10 +Ntp62 +I640 +I607 +(lp63 +I24 +aNatp64 +a(I26 +S'hat1' +p65 +I944 +I130 +(lp66 +NaI37 +atp67 +a(I27 +(S'title' +p68 +S'art' +p69 +tp70 +I242 +I135 +(lp71 +I2 +aNatp72 +a(I28 +(g68 +S'math' +p73 +tp74 +I242 +I282 +(lp75 +I5 +aNatp76 +a(I29 +(g68 +S'music' +p77 +tp78 +I242 +I429 +(lp79 +I8 +aNatp80 +a(I30 +(g68 +S'physical ed.' +p81 +tp82 +I242 +I576 +(lp83 +I11 +aNatp84 +a(I31 +(g68 +S'reading' +p85 +tp86 +I640 +I135 +(lp87 +I15 +aNatp88 +a(I32 +(g68 +S'science' +p89 +tp90 +I640 +I282 +(lp91 +I18 +aNatp92 +a(I33 +(g68 +S'social science' +p93 +tp94 +I640 +I429 +(lp95 +I21 +aNatp96 +a(I34 +(g68 +S'writing' +p97 +tp98 +I640 +I576 +(lp99 +I24 +aNatp100 +a(I35 +(S'string' +p101 +S'A' +p102 +tp103 +I216 +I38 +(lp104 +I0 +aNatp105 +a(I36 +(g101 +S'B' +p106 +tp107 +I614 +I38 +(lp108 +I13 +aNatp109 +a(I37 +S'wait' +p110 +I956 +I180 +(lp111 +I26 +aI38 +aI39 +atp112 +a(I38 +(S'number' +p113 +S'30' +p114 +tp115 +I1030 +I189 +(lp116 +I37 +aNatp117 +a(I39 +S'clean' +p118 +I956 +I219 +(lp119 +I37 +aNatp120 +a(I40 +S'hideblocks' +p121 +I435 +I24 +(lp122 +NaI41 +atp123 +a(I41 +g4 +I435 +I78 +(lp124 +I40 +aI42 +atp125 +a(I42 +g7 +I435 +I117 +(lp126 +I41 +aI43 +aI44 +aI45 +atp127 +a(I43 +(g68 +S'name' +p128 +tp129 +I445 +I132 +(lp130 +I42 +aNatp131 +a(I44 +(g10 +Ntp132 +I445 +I163 +(lp133 +I42 +aNatp134 +a(I45 +S'stack' +p135 +I435 +I225 +(lp136 +I42 +aI46 +aI47 +atp137 +a(I46 +(g101 +g102 +tp138 +I447 +I237 +(lp139 +I45 +aNatp140 +a(I47 +g135 +I435 +I264 +(lp141 +I45 +aI48 +aI49 +atp142 +a(I48 +(g101 +g106 +tp143 +I447 +I276 +(lp144 +I47 +aNatp145 +a(I49 +g4 +I435 +I303 +(lp146 +I47 +aI50 +atp147 +a(I50 +g7 +I435 +I342 +(lp148 +I49 +aI51 +aI52 +aI53 +atp149 +a(I51 +(g68 +S'personal growth' +p150 +tp151 +I445 +I357 +(lp152 +I50 +aNatp153 +a(I52 +(g10 +Ntp154 +I445 +I388 +(lp155 +I50 +aNatp156 +a(I53 +g4 +I435 +I450 +(lp157 +I50 +aI54 +atp158 +a(I54 +g7 +I435 +I489 +(lp159 +I53 +aI55 +aI56 +aNatp160 +a(I55 +(g68 +S'work habits' +p161 +tp162 +I445 +I504 +(lp163 +I54 +aNatp164 +a(I56 +(g10 +Ntp165 +I445 +I535 +(lp166 +I54 +aNatp167 +a(I-1 +S'turtle' +p168 +I0 +I0 +I0 +I0 +I50 +I5 +tp169 +a. \ No newline at end of file diff --git a/samples/en/What_How_Why_For_whom.png b/samples/en/What_How_Why_For_whom.png new file mode 100644 index 0000000..85d1a65 --- /dev/null +++ b/samples/en/What_How_Why_For_whom.png Binary files differ diff --git a/samples/en/What_How_Why_For_whom.ta b/samples/en/What_How_Why_For_whom.ta new file mode 100644 index 0000000..1e150d1 --- /dev/null +++ b/samples/en/What_How_Why_For_whom.ta @@ -0,0 +1,240 @@ +(lp0 +(I0 +S'hat1' +p1 +I990 +I271 +(lp2 +NaI1 +atp3 +a(I1 +S'clean' +p4 +I1002 +I321 +(lp5 +I0 +aNatp6 +a(I2 +S'hat2' +p7 +I993 +I386 +(lp8 +NaI3 +atp9 +a(I3 +S'wait' +p10 +I1005 +I436 +(lp11 +I2 +aI4 +aNatp12 +a(I4 +(S'number' +p13 +S'30' +p14 +tp15 +I1079 +I445 +(lp16 +I3 +aNatp17 +a(I5 +S'hideblocks' +p18 +I232 +I15 +(lp19 +NaI6 +atp20 +a(I6 +S'stack1' +p21 +I232 +I69 +(lp22 +I5 +aI7 +atp23 +a(I7 +S'template1' +p24 +I232 +I108 +(lp25 +I6 +aI8 +aI9 +aI10 +atp26 +a(I8 +(S'title' +p27 +S'What?' +p28 +tp29 +I242 +I123 +(lp30 +I7 +aNatp31 +a(I9 +(S'journal' +p32 +Ntp33 +I242 +I154 +(lp34 +I7 +aNatp35 +a(I10 +S'stack2' +p36 +I232 +I216 +(lp37 +I7 +aI11 +atp38 +a(I11 +g21 +I232 +I255 +(lp39 +I10 +aI12 +atp40 +a(I12 +g24 +I232 +I294 +(lp41 +I11 +aI13 +aI14 +aI15 +atp42 +a(I13 +(g27 +S'How?' +p43 +tp44 +I242 +I309 +(lp45 +I12 +aNatp46 +a(I14 +(g32 +S'None' +p47 +tp48 +I242 +I340 +(lp49 +I12 +aNatp50 +a(I15 +g36 +I232 +I402 +(lp51 +I12 +aI16 +atp52 +a(I16 +g21 +I232 +I441 +(lp53 +I15 +aI17 +atp54 +a(I17 +g24 +I232 +I480 +(lp55 +I16 +aI18 +aI19 +aI20 +atp56 +a(I18 +(g27 +S'Why?' +p57 +tp58 +I242 +I495 +(lp59 +I17 +aNatp60 +a(I19 +(g32 +g47 +tp61 +I242 +I526 +(lp62 +I17 +aNatp63 +a(I20 +g36 +I232 +I588 +(lp64 +I17 +aI21 +atp65 +a(I21 +g21 +I232 +I627 +(lp66 +I20 +aI22 +atp67 +a(I22 +g24 +I232 +I666 +(lp68 +I21 +aI24 +aI23 +aNatp69 +a(I23 +(g32 +g47 +tp70 +I242 +I712 +(lp71 +I22 +aNatp72 +a(I24 +(g27 +S'For whom?' +p73 +tp74 +I242 +I681 +(lp75 +I22 +aNatp76 +a(I-1 +S'turtle' +p77 +I0 +I0 +I0 +I0 +I50 +I5 +tp78 +a. \ No newline at end of file diff --git a/samples/birds.png b/samples/en/birds.png index 55b23f1..55b23f1 100644 --- a/samples/birds.png +++ b/samples/en/birds.png Binary files differ diff --git a/samples/birds.ta b/samples/en/birds.ta index f485463..f485463 100644 --- a/samples/birds.ta +++ b/samples/en/birds.ta diff --git a/samples/bubbles.png b/samples/en/bubbles.png index bccbd84..bccbd84 100644 --- a/samples/bubbles.png +++ b/samples/en/bubbles.png Binary files differ diff --git a/samples/bubbles.ta b/samples/en/bubbles.ta index dd60345..dd60345 100644 --- a/samples/bubbles.ta +++ b/samples/en/bubbles.ta diff --git a/samples/candyvortex.png b/samples/en/candyvortex.png index 22f41b0..22f41b0 100644 --- a/samples/candyvortex.png +++ b/samples/en/candyvortex.png Binary files differ diff --git a/samples/candyvortex.ta b/samples/en/candyvortex.ta index c399cee..c399cee 100644 --- a/samples/candyvortex.ta +++ b/samples/en/candyvortex.ta diff --git a/samples/colors.png b/samples/en/colors.png index b23b7dd..b23b7dd 100644 --- a/samples/colors.png +++ b/samples/en/colors.png Binary files differ diff --git a/samples/colors.ta b/samples/en/colors.ta index c7b7c16..c7b7c16 100644 --- a/samples/colors.ta +++ b/samples/en/colors.ta diff --git a/samples/csquiral.png b/samples/en/csquiral.png index 3d08a9b..3d08a9b 100644 --- a/samples/csquiral.png +++ b/samples/en/csquiral.png Binary files differ diff --git a/samples/csquiral.ta b/samples/en/csquiral.ta index 647b5b2..647b5b2 100644 --- a/samples/csquiral.ta +++ b/samples/en/csquiral.ta diff --git a/samples/curlygates.png b/samples/en/curlygates.png index cc18802..cc18802 100644 --- a/samples/curlygates.png +++ b/samples/en/curlygates.png Binary files differ diff --git a/samples/curlygates.ta b/samples/en/curlygates.ta index b739008..b739008 100644 --- a/samples/curlygates.ta +++ b/samples/en/curlygates.ta diff --git a/samples/dots.png b/samples/en/dots.png index 20ff59c..20ff59c 100644 --- a/samples/dots.png +++ b/samples/en/dots.png Binary files differ diff --git a/samples/dots.ta b/samples/en/dots.ta index 6c35cdc..6c35cdc 100644 --- a/samples/dots.ta +++ b/samples/en/dots.ta diff --git a/samples/flower.png b/samples/en/flower.png index 4e68d8a..4e68d8a 100644 --- a/samples/flower.png +++ b/samples/en/flower.png Binary files differ diff --git a/samples/flower.ta b/samples/en/flower.ta index 0f6ce72..0f6ce72 100644 --- a/samples/flower.ta +++ b/samples/en/flower.ta diff --git a/samples/fountain.png b/samples/en/fountain.png index 687919e..687919e 100644 --- a/samples/fountain.png +++ b/samples/en/fountain.png Binary files differ diff --git a/samples/fountain.ta b/samples/en/fountain.ta index f6ca625..f6ca625 100644 --- a/samples/fountain.ta +++ b/samples/en/fountain.ta diff --git a/samples/rainbow.png b/samples/en/rainbow.png index 4f9a85c..4f9a85c 100644 --- a/samples/rainbow.png +++ b/samples/en/rainbow.png Binary files differ diff --git a/samples/rainbow.ta b/samples/en/rainbow.ta index 6ceaf12..6ceaf12 100644 --- a/samples/rainbow.ta +++ b/samples/en/rainbow.ta diff --git a/samples/redwisp.png b/samples/en/redwisp.png index efc1dcf..efc1dcf 100644 --- a/samples/redwisp.png +++ b/samples/en/redwisp.png Binary files differ diff --git a/samples/redwisp.ta b/samples/en/redwisp.ta index 497d3a6..497d3a6 100644 --- a/samples/redwisp.ta +++ b/samples/en/redwisp.ta diff --git a/samples/reflections.png b/samples/en/reflections.png index ddb3aa7..ddb3aa7 100644 --- a/samples/reflections.png +++ b/samples/en/reflections.png Binary files differ diff --git a/samples/reflections.ta b/samples/en/reflections.ta index 77c6a7e..77c6a7e 100644 --- a/samples/reflections.ta +++ b/samples/en/reflections.ta diff --git a/samples/shades.png b/samples/en/shades.png index 912c38a..912c38a 100644 --- a/samples/shades.png +++ b/samples/en/shades.png Binary files differ diff --git a/samples/shades.ta b/samples/en/shades.ta index c9c9919..c9c9919 100644 --- a/samples/shades.ta +++ b/samples/en/shades.ta diff --git a/samples/sierpquad.png b/samples/en/sierpquad.png index fea725d..fea725d 100644 --- a/samples/sierpquad.png +++ b/samples/en/sierpquad.png Binary files differ diff --git a/samples/sierpquad.ta b/samples/en/sierpquad.ta index 7d79ceb..7d79ceb 100644 --- a/samples/sierpquad.ta +++ b/samples/en/sierpquad.ta diff --git a/samples/sierpquad2.png b/samples/en/sierpquad2.png index ea13f44..ea13f44 100644 --- a/samples/sierpquad2.png +++ b/samples/en/sierpquad2.png Binary files differ diff --git a/samples/sierpquad2.ta b/samples/en/sierpquad2.ta index ede1a22..ede1a22 100644 --- a/samples/sierpquad2.ta +++ b/samples/en/sierpquad2.ta diff --git a/samples/sierptri.png b/samples/en/sierptri.png index f8e3013..f8e3013 100644 --- a/samples/sierptri.png +++ b/samples/en/sierptri.png Binary files differ diff --git a/samples/sierptri.ta b/samples/en/sierptri.ta index 25a258b..25a258b 100644 --- a/samples/sierptri.ta +++ b/samples/en/sierptri.ta diff --git a/samples/smoothcandy.png b/samples/en/smoothcandy.png index 542c258..542c258 100644 --- a/samples/smoothcandy.png +++ b/samples/en/smoothcandy.png Binary files differ diff --git a/samples/smoothcandy.ta b/samples/en/smoothcandy.ta index 5002195..5002195 100644 --- a/samples/smoothcandy.ta +++ b/samples/en/smoothcandy.ta diff --git a/samples/snowflake.png b/samples/en/snowflake.png index 607fca3..607fca3 100644 --- a/samples/snowflake.png +++ b/samples/en/snowflake.png Binary files differ diff --git a/samples/snowflake.ta b/samples/en/snowflake.ta index 055573d..055573d 100644 --- a/samples/snowflake.ta +++ b/samples/en/snowflake.ta diff --git a/samples/square.png b/samples/en/square.png index 7f582f7..7f582f7 100644 --- a/samples/square.png +++ b/samples/en/square.png Binary files differ diff --git a/samples/square.ta b/samples/en/square.ta index 6f394b2..6f394b2 100644 --- a/samples/square.ta +++ b/samples/en/square.ta diff --git a/samples/squares.png b/samples/en/squares.png index 7535c24..7535c24 100644 --- a/samples/squares.png +++ b/samples/en/squares.png Binary files differ diff --git a/samples/squares.ta b/samples/en/squares.ta index e8e86f0..e8e86f0 100644 --- a/samples/squares.ta +++ b/samples/en/squares.ta diff --git a/samples/squiral.png b/samples/en/squiral.png index 8e6ffd5..8e6ffd5 100644 --- a/samples/squiral.png +++ b/samples/en/squiral.png Binary files differ diff --git a/samples/squiral.ta b/samples/en/squiral.ta index 0dda1a5..0dda1a5 100644 --- a/samples/squiral.ta +++ b/samples/en/squiral.ta diff --git a/samples/sunrise.png b/samples/en/sunrise.png index 6dd091e..6dd091e 100644 --- a/samples/sunrise.png +++ b/samples/en/sunrise.png Binary files differ diff --git a/samples/sunrise.ta b/samples/en/sunrise.ta index d42ec63..d42ec63 100644 --- a/samples/sunrise.ta +++ b/samples/en/sunrise.ta diff --git a/samples/tree.png b/samples/en/tree.png index 168acdc..168acdc 100644 --- a/samples/tree.png +++ b/samples/en/tree.png Binary files differ diff --git a/samples/tree.ta b/samples/en/tree.ta index 660ddcd..660ddcd 100644 --- a/samples/tree.ta +++ b/samples/en/tree.ta diff --git a/samples/xo-man.png b/samples/en/xo-man.png index 1780933..1780933 100644 --- a/samples/xo-man.png +++ b/samples/en/xo-man.png Binary files differ diff --git a/samples/xo-man.ta b/samples/en/xo-man.ta index 2e684b5..2e684b5 100644 --- a/samples/xo-man.ta +++ b/samples/en/xo-man.ta diff --git a/samples/es/Que_Como_Por_que_Para_que.png b/samples/es/Que_Como_Por_que_Para_que.png new file mode 100644 index 0000000..85d1a65 --- /dev/null +++ b/samples/es/Que_Como_Por_que_Para_que.png Binary files differ diff --git a/samples/es/Que_Como_Por_que_Para_que.ta b/samples/es/Que_Como_Por_que_Para_que.ta new file mode 100644 index 0000000..3fa1151 --- /dev/null +++ b/samples/es/Que_Como_Por_que_Para_que.ta @@ -0,0 +1,236 @@ +(lp0 +(I0 +S'hat1' +p1 +I990 +I271 +(lp2 +NaI1 +atp3 +a(I1 +S'clean' +p4 +I1002 +I321 +(lp5 +I0 +aNatp6 +a(I2 +S'hat2' +p7 +I993 +I386 +(lp8 +NaI3 +atp9 +a(I3 +S'wait' +p10 +I1005 +I436 +(lp11 +I2 +aI4 +aNatp12 +a(I4 +(S'number' +p13 +S'30' +p14 +tp15 +I1079 +I445 +(lp16 +I3 +aNatp17 +a(I5 +S'hideblocks' +p18 +I232 +I15 +(lp19 +NaI6 +atp20 +a(I6 +S'stack1' +p21 +I232 +I69 +(lp22 +I5 +aI7 +atp23 +a(I7 +S'template1' +p24 +I232 +I108 +(lp25 +I6 +aI21 +aI8 +aI9 +atp26 +a(I8 +(S'journal' +p27 +Ntp28 +I242 +I154 +(lp29 +I7 +aNatp30 +a(I9 +S'stack2' +p31 +I232 +I216 +(lp32 +I7 +aI10 +atp33 +a(I10 +g21 +I232 +I255 +(lp34 +I9 +aI11 +atp35 +a(I11 +g24 +I232 +I294 +(lp36 +I10 +aI22 +aI12 +aI13 +atp37 +a(I12 +(g27 +Ntp38 +I242 +I340 +(lp39 +I11 +aNatp40 +a(I13 +g31 +I232 +I402 +(lp41 +I11 +aI14 +atp42 +a(I14 +g21 +I232 +I441 +(lp43 +I13 +aI15 +atp44 +a(I15 +g24 +I232 +I480 +(lp45 +I14 +aI23 +aI16 +aI17 +atp46 +a(I16 +(g27 +Ntp47 +I242 +I526 +(lp48 +I15 +aNatp49 +a(I17 +g31 +I232 +I588 +(lp50 +I15 +aI18 +atp51 +a(I18 +g21 +I232 +I627 +(lp52 +I17 +aI19 +atp53 +a(I19 +g24 +I232 +I666 +(lp54 +I18 +aI24 +aI20 +aNatp55 +a(I20 +(g27 +Ntp56 +I242 +I712 +(lp57 +I19 +aNatp58 +a(I21 +(S'title' +p59 +S'¿Qué?' +p60 +tp61 +I242 +I123 +(lp62 +I7 +aNatp63 +a(I22 +(g59 +S'¿Cómo?' +p64 +tp65 +I242 +I309 +(lp66 +I11 +aNatp67 +a(I23 +(g59 +S'¿Por qué?' +p68 +tp69 +I242 +I495 +(lp70 +I15 +aNatp71 +a(I24 +(g59 +S'¿Para qui?' +p72 +tp73 +I242 +I681 +(lp74 +I19 +aNatp75 +a(I-1 +S'turtle' +p76 +I0 +I0 +I0 +I0 +I50 +I5 +tp77 +a. diff --git a/samples/birds.png b/samples/es/birds.png index 55b23f1..55b23f1 100644 --- a/samples/birds.png +++ b/samples/es/birds.png Binary files differ diff --git a/samples/birds.ta b/samples/es/birds.ta index f485463..f485463 100644 --- a/samples/birds.ta +++ b/samples/es/birds.ta diff --git a/samples/bubbles.png b/samples/es/bubbles.png index bccbd84..bccbd84 100644 --- a/samples/bubbles.png +++ b/samples/es/bubbles.png Binary files differ diff --git a/samples/bubbles.ta b/samples/es/bubbles.ta index dd60345..dd60345 100644 --- a/samples/bubbles.ta +++ b/samples/es/bubbles.ta diff --git a/samples/candyvortex.png b/samples/es/candyvortex.png index 22f41b0..22f41b0 100644 --- a/samples/candyvortex.png +++ b/samples/es/candyvortex.png Binary files differ diff --git a/samples/candyvortex.ta b/samples/es/candyvortex.ta index c399cee..c399cee 100644 --- a/samples/candyvortex.ta +++ b/samples/es/candyvortex.ta diff --git a/samples/colors.png b/samples/es/colors.png index b23b7dd..b23b7dd 100644 --- a/samples/colors.png +++ b/samples/es/colors.png Binary files differ diff --git a/samples/colors.ta b/samples/es/colors.ta index c7b7c16..c7b7c16 100644 --- a/samples/colors.ta +++ b/samples/es/colors.ta diff --git a/samples/csquiral.png b/samples/es/csquiral.png index 3d08a9b..3d08a9b 100644 --- a/samples/csquiral.png +++ b/samples/es/csquiral.png Binary files differ diff --git a/samples/csquiral.ta b/samples/es/csquiral.ta index 647b5b2..647b5b2 100644 --- a/samples/csquiral.ta +++ b/samples/es/csquiral.ta diff --git a/samples/curlygates.png b/samples/es/curlygates.png index cc18802..cc18802 100644 --- a/samples/curlygates.png +++ b/samples/es/curlygates.png Binary files differ diff --git a/samples/curlygates.ta b/samples/es/curlygates.ta index b739008..b739008 100644 --- a/samples/curlygates.ta +++ b/samples/es/curlygates.ta diff --git a/samples/dots.png b/samples/es/dots.png index 20ff59c..20ff59c 100644 --- a/samples/dots.png +++ b/samples/es/dots.png Binary files differ diff --git a/samples/dots.ta b/samples/es/dots.ta index 6c35cdc..6c35cdc 100644 --- a/samples/dots.ta +++ b/samples/es/dots.ta diff --git a/samples/flower.png b/samples/es/flower.png index 4e68d8a..4e68d8a 100644 --- a/samples/flower.png +++ b/samples/es/flower.png Binary files differ diff --git a/samples/flower.ta b/samples/es/flower.ta index 0f6ce72..0f6ce72 100644 --- a/samples/flower.ta +++ b/samples/es/flower.ta diff --git a/samples/fountain.png b/samples/es/fountain.png index 687919e..687919e 100644 --- a/samples/fountain.png +++ b/samples/es/fountain.png Binary files differ diff --git a/samples/fountain.ta b/samples/es/fountain.ta index f6ca625..f6ca625 100644 --- a/samples/fountain.ta +++ b/samples/es/fountain.ta diff --git a/samples/rainbow.png b/samples/es/rainbow.png index 4f9a85c..4f9a85c 100644 --- a/samples/rainbow.png +++ b/samples/es/rainbow.png Binary files differ diff --git a/samples/rainbow.ta b/samples/es/rainbow.ta index 6ceaf12..6ceaf12 100644 --- a/samples/rainbow.ta +++ b/samples/es/rainbow.ta diff --git a/samples/redwisp.png b/samples/es/redwisp.png index efc1dcf..efc1dcf 100644 --- a/samples/redwisp.png +++ b/samples/es/redwisp.png Binary files differ diff --git a/samples/redwisp.ta b/samples/es/redwisp.ta index 497d3a6..497d3a6 100644 --- a/samples/redwisp.ta +++ b/samples/es/redwisp.ta diff --git a/samples/reflections.png b/samples/es/reflections.png index ddb3aa7..ddb3aa7 100644 --- a/samples/reflections.png +++ b/samples/es/reflections.png Binary files differ diff --git a/samples/reflections.ta b/samples/es/reflections.ta index 77c6a7e..77c6a7e 100644 --- a/samples/reflections.ta +++ b/samples/es/reflections.ta diff --git a/samples/shades.png b/samples/es/shades.png index 912c38a..912c38a 100644 --- a/samples/shades.png +++ b/samples/es/shades.png Binary files differ diff --git a/samples/shades.ta b/samples/es/shades.ta index c9c9919..c9c9919 100644 --- a/samples/shades.ta +++ b/samples/es/shades.ta diff --git a/samples/sierpquad.png b/samples/es/sierpquad.png index fea725d..fea725d 100644 --- a/samples/sierpquad.png +++ b/samples/es/sierpquad.png Binary files differ diff --git a/samples/sierpquad.ta b/samples/es/sierpquad.ta index 7d79ceb..7d79ceb 100644 --- a/samples/sierpquad.ta +++ b/samples/es/sierpquad.ta diff --git a/samples/sierpquad2.png b/samples/es/sierpquad2.png index ea13f44..ea13f44 100644 --- a/samples/sierpquad2.png +++ b/samples/es/sierpquad2.png Binary files differ diff --git a/samples/sierpquad2.ta b/samples/es/sierpquad2.ta index ede1a22..ede1a22 100644 --- a/samples/sierpquad2.ta +++ b/samples/es/sierpquad2.ta diff --git a/samples/sierptri.png b/samples/es/sierptri.png index f8e3013..f8e3013 100644 --- a/samples/sierptri.png +++ b/samples/es/sierptri.png Binary files differ diff --git a/samples/sierptri.ta b/samples/es/sierptri.ta index 25a258b..25a258b 100644 --- a/samples/sierptri.ta +++ b/samples/es/sierptri.ta diff --git a/samples/smoothcandy.png b/samples/es/smoothcandy.png index 542c258..542c258 100644 --- a/samples/smoothcandy.png +++ b/samples/es/smoothcandy.png Binary files differ diff --git a/samples/smoothcandy.ta b/samples/es/smoothcandy.ta index 5002195..5002195 100644 --- a/samples/smoothcandy.ta +++ b/samples/es/smoothcandy.ta diff --git a/samples/snowflake.png b/samples/es/snowflake.png index 607fca3..607fca3 100644 --- a/samples/snowflake.png +++ b/samples/es/snowflake.png Binary files differ diff --git a/samples/snowflake.ta b/samples/es/snowflake.ta index 055573d..055573d 100644 --- a/samples/snowflake.ta +++ b/samples/es/snowflake.ta diff --git a/samples/square.png b/samples/es/square.png index 7f582f7..7f582f7 100644 --- a/samples/square.png +++ b/samples/es/square.png Binary files differ diff --git a/samples/square.ta b/samples/es/square.ta index 6f394b2..6f394b2 100644 --- a/samples/square.ta +++ b/samples/es/square.ta diff --git a/samples/squares.png b/samples/es/squares.png index 7535c24..7535c24 100644 --- a/samples/squares.png +++ b/samples/es/squares.png Binary files differ diff --git a/samples/squares.ta b/samples/es/squares.ta index e8e86f0..e8e86f0 100644 --- a/samples/squares.ta +++ b/samples/es/squares.ta diff --git a/samples/squiral.png b/samples/es/squiral.png index 8e6ffd5..8e6ffd5 100644 --- a/samples/squiral.png +++ b/samples/es/squiral.png Binary files differ diff --git a/samples/squiral.ta b/samples/es/squiral.ta index 0dda1a5..0dda1a5 100644 --- a/samples/squiral.ta +++ b/samples/es/squiral.ta diff --git a/samples/sunrise.png b/samples/es/sunrise.png index 6dd091e..6dd091e 100644 --- a/samples/sunrise.png +++ b/samples/es/sunrise.png Binary files differ diff --git a/samples/sunrise.ta b/samples/es/sunrise.ta index d42ec63..d42ec63 100644 --- a/samples/sunrise.ta +++ b/samples/es/sunrise.ta diff --git a/samples/tree.png b/samples/es/tree.png index 168acdc..168acdc 100644 --- a/samples/tree.png +++ b/samples/es/tree.png Binary files differ diff --git a/samples/tree.ta b/samples/es/tree.ta index 660ddcd..660ddcd 100644 --- a/samples/tree.ta +++ b/samples/es/tree.ta diff --git a/samples/xo-man.png b/samples/es/xo-man.png index 1780933..1780933 100644 --- a/samples/xo-man.png +++ b/samples/es/xo-man.png Binary files differ diff --git a/samples/xo-man.ta b/samples/es/xo-man.ta index 2e684b5..2e684b5 100644 --- a/samples/xo-man.ta +++ b/samples/es/xo-man.ta diff --git a/taexporthtml.py b/taexporthtml.py new file mode 100644 index 0000000..8474404 --- /dev/null +++ b/taexporthtml.py @@ -0,0 +1,184 @@ +#Copyright (c) 2007-9, Playful Invention Company. + +#Permission is hereby granted, free of charge, to any person obtaining a copy +#of this software and associated documentation files (the "Software"), to deal +#in the Software without restriction, including without limitation the rights +#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +#copies of the Software, and to permit persons to whom the Software is +#furnished to do so, subject to the following conditions: + +#The above copyright notice and this permission notice shall be included in +#all copies or substantial portions of the Software. + +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +#THE SOFTWARE. + +import tawindow +import talogo +from sugar.activity import activity +from sugar.datastore import datastore +import os.path +import os +from talogo import get_pixbuf_from_journal +from gettext import gettext as _ + +def save_html(self, tw, embed_flag=True): + + try: + datapath = os.path.join(activity.get_activity_root(), "instance") + except: + # early versions of Sugar (656) didn't support get_activity_root() + datapath = \ + "/home/olpc/.sugar/default/org.laptop.TurtleArtActivity/instance" + + # this dictionary is used to define the html wrappers around template elements + # start of block, end of block + html_glue = { + 'doctype': ("\n", ""), + 'html': ("\n", "\n"), + 'head': ("\n\n", "\n"), + 'meta': ("\n", ""), + 'title': ("", "\n"), + 'style': ("\n"), + 'body': ("\n", "\n\n"), + 'div': ("
\n", "
\n"), + 'slide': ("\n\n"), + 'h1': ("

", "

\n"), + 'table': ("\n", "
\n"), + 'tr': ("\n", "\n"), + 'td': ("\n", "\n\n"), + 'img': ("\"Image\"\n"), + 'ul': ("
    \n", "
\n"), + 'li': ("
  • ", "
  • \n") } + + if embed_flag == True: + html_glue['img'] = ("\"Image\"\n") + bs = tawindow.blocks(tw) + code = "" + imagecount = 0 + slidecount = 0 + for b in bs: + this_stack = "" + data = walk_stack(self,tw, b) + onepic = 0 + twopic = 0 + fourpic = 0 + sevenbullets = 0 + title = 0 + picture = 0 + for d in data: + if type(d) is float: + continue + else: + # transalate some TA terms into html + print d + if d == "tp1" or d == 'tp8': + onepic = 1 + elif d == "tp2" or d == 'tp6': + twopic = 1 + elif d == "tp7": + fourpic = 1 + elif d == "tp3": + sevenbullets = 8 + elif sevenbullets > 0: + if sevenbullets == 8: + tmp = html_glue['slide'][0] + str(slidecount) + html_glue['slide'][1] + html_glue['div'][0] + html_glue['h1'][0] + d[2:] + html_glue['h1'][1] + html_glue['ul'][0] + elif d[2:] != "": + tmp = html_glue['li'][0] + d[2:] + html_glue['li'][1] + this_stack += tmp + tmp = "" + sevenbullets -= 1 + if sevenbullets == 0: + this_stack += html_glue['ul'][1] + elif onepic == 1 or twopic == 1 or fourpic == 1: + tmp = html_glue['slide'][0] + str(slidecount) + html_glue['slide'][1] + \ + html_glue['div'][0] + html_glue['h1'][0] + d[2:] + \ + html_glue['h1'][1] + html_glue['table'][0] + this_stack += tmp + if onepic > 0: onepic += 1 + elif twopic > 0: twopic += 1 + elif fourpic > 0: fourpic += 1 + slidecount += 1 + elif onepic > 1 or twopic > 1 or fourpic > 1: + # We need to get filename and copy it into instance directory + # if it is not an image, save the preview to a file instead + # save the description too. + print str(onepic) + " " + str(twopic) + " " + str(fourpic) + if d[8:] != None: + try: + dsobject = datastore.get(d[8:]) + pixbuf = get_pixbuf_from_journal(dsobject,400,300) + except: + pixbuf = None + if pixbuf != None: + filename = os.path.join(datapath, 'image' + str(imagecount) \ + + ".png") + pixbuf.save(filename, "png") + # if the embed flag is True, embed base64 directly into the html + if embed_flag == True: + base64 = os.path.join(datapath, 'base64tmp') + os.system( "base64 <" + filename + " >" + base64) + f = open( base64, 'r') + imgdata = f.read() + f.close() + if onepic == 2 or twopic == 2 or twopic == 4 or fourpic == 2 or \ + fourpic == 4: + tmp = html_glue['tr'][0] + else: + tmp = "" + if pixbuf != None: + tmp = tmp + html_glue['td'][0] + html_glue['img'][0] + if embed_flag == True: + tmp = tmp + imgdata + else: + tmp = tmp + str(imagecount) + tmp = tmp + html_glue['img'][1] + html_glue['td'][1] + if fourpic == 0: + try: + description = dsobject.metadata['description'] + except: + description = "" + tmp = tmp + html_glue['td'][0] + description + html_glue['td'][1] + if onepic == 2 or twopic == 3 or fourpic == 3 or fourpic == 5: + tmp = tmp + html_glue['tr'][1] + imagecount += 1 + this_stack += tmp + if onepic > 1: + this_stack += html_glue['table'][1] + html_glue['div'][1] + onepic = 0 + elif twopic > 1: + if twopic == 3: + this_stack += html_glue['table'][1] + html_glue['div'][1] + twopic = 0 + else: twopic += 1 + elif fourpic > 1: + if fourpic == 5: + this_stack += html_glue['table'][1] + html_glue['div'][1] + fourpic = 0 + else: fourpic += 1 + this_stack += " " + if len(data) > 0: + code += this_stack + code = html_glue['doctype'][0] + html_glue['html'][0] + html_glue['head'][0] + \ + html_glue['meta'][0] + html_glue['title'][0] + _("Turtle Art Portfolio") + \ + html_glue['title'][1] + html_glue['style'][0] + html_glue['style'][1] + \ + html_glue['head'][1] + html_glue['body'][0] + code + html_glue['body'][1] + \ + html_glue['html'][1] +# print code + return code + +def walk_stack(self, tw, spr): + top = tawindow.find_top_block(spr) + if spr == top: + # only walk the stack if the block is the top block + return talogo.run_blocks(tw.lc, top, tawindow.blocks(tw), False) + else: + # not top of stack, then return empty list + return [] + + diff --git a/tagplay.py b/tagplay.py new file mode 100644 index 0000000..9caaea4 --- /dev/null +++ b/tagplay.py @@ -0,0 +1,171 @@ +import gtk +import pygtk +pygtk.require('2.0') +# import sys +import pygst +pygst.require('0.10') +import gst +import gst.interfaces +import gobject +import time +gobject.threads_init() + +from sugar.datastore import datastore +from talogo import * + +class Gplay: + + def __init__(self): + self.window = None + self.playing = False + + self.player = gst.element_factory_make("playbin", "playbin") + xis = gst.element_factory_make("xvimagesink", "xvimagesink") + self.player.set_property("video-sink", xis) + bus = self.player.get_bus() + bus.enable_sync_message_emission() + bus.add_signal_watch() + self.SYNC_ID = bus.connect('sync-message::element', self._onSyncMessageCb) + + + def _onSyncMessageCb(self, bus, message): + if message.structure is None: + return True + if message.structure.get_name() == 'prepare-xwindow-id': + self.window.set_sink(message.src) + message.src.set_property('force-aspect-ratio', True) + return True + + + def setFile(self, path): + uri = "file://" + str( path ) + if (self.player.get_property('uri') == uri): + self.seek(gst.SECOND*0) + return + + self.player.set_state(gst.STATE_READY) + self.player.set_property('uri', uri) + ext = uri[len(uri)-3:] + if (ext == "jpg"): + self.pause() + else: + self.play() + + + def queryPosition(self): + #"Returns a (position, duration) tuple" + try: + position, format = self.player.query_position(gst.FORMAT_TIME) + except: + position = gst.CLOCK_TIME_NONE + + try: + duration, format = self.player.query_duration(gst.FORMAT_TIME) + except: + duration = gst.CLOCK_TIME_NONE + + return (position, duration) + + + def seek(self, time): + event = gst.event_new_seek(1.0, gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH | \ + gst.SEEK_FLAG_ACCURATE, gst.SEEK_TYPE_SET, time, gst.SEEK_TYPE_NONE, 0) + res = self.player.send_event(event) + if res: + self.player.set_new_stream_time(0L) + + + def pause(self): + self.playing = False + self.player.set_state(gst.STATE_PAUSED) + + + def play(self): + self.playing = True + self.player.set_state(gst.STATE_PLAYING) + + + def stop(self): + self.playing = False + self.player.set_state(gst.STATE_NULL) + # self.nextMovie() + + + def get_state(self, timeout=1): + return self.player.get_state(timeout=timeout) + + + def is_playing(self): + return self.playing + + +class PlayVideoWindow(gtk.Window): + def __init__(self): + gtk.Window.__init__(self) + self.imagesink = None + self.unset_flags(gtk.DOUBLE_BUFFERED) + self.set_flags(gtk.APP_PAINTABLE) + + def set_sink(self, sink): + if (self.imagesink != None): + assert self.window.xid + self.imagesink = None + del self.imagesink + + self.imagesink = sink + self.imagesink.set_xwindow_id(self.window.xid) + +def play_audio(lc, audio): + print "loading audio id: " + str(audio) + if audio == "" or audio[6:] == "": + raise logoerror("#nomedia") + elif audio[6:] != "None": + try: + dsobject = datastore.get(audio[6:]) + print dsobject.file_path + except: + print "Couldn't open id: " + str(audio[6:]) + if lc.gplay == None: + lc.gplay = Gplay() + lc.gplay.setFile("file:///" + dsobject.file_path) + +def play_video(lc, media, x, y, w, h): + print "loading media id: " + str(media) + if media == "" or media[6:] == "": + raise logoerror("#nomedia") + elif media[6:] != "None": + try: + dsobject = datastore.get(media[6:]) + print dsobject.file_path + except: + print "Couldn't open id: " + str(media[6:]) + play_dsobject(lc, dsobject, x, y, w, h) + +def play_dsobject(lc, dsobject, x, y, w, h): + if lc.gplay == None: + lc.gplay = Gplay() + lc.gplay.setFile("file:///" + dsobject.file_path) + # if lc.gplay.window == None: + gplayWin = PlayVideoWindow() + lc.gplay.window = gplayWin + gplayWin.set_type_hint( gtk.gdk.WINDOW_TYPE_HINT_DIALOG ) + gplayWin.set_decorated( False ) + gplayWin.set_transient_for( lc.tw.activity ) + # y position is too high for some reason (toolbox?) adding offset + gplayWin.move( x, y+108 ) + gplayWin.resize( w, h ) + gplayWin.show_all( ) + +def stop_media(lc): + if lc.gplay == None: + return + lc.gplay.stop() + if lc.gplay.window != None: + # need to figure out how to destroy the video window +# lc.gplay.window.destroy() +# lc.gplay == None + # but meanwhile, just shrink it + lc.gplay.window.move( 0, 0 ) + lc.gplay.window.resize( 1, 1 ) + + diff --git a/tajail.py b/tajail.py new file mode 100644 index 0000000..b17190a --- /dev/null +++ b/tajail.py @@ -0,0 +1,37 @@ +#Copyright (c) 2007-9, Playful Invention Company. + +#Permission is hereby granted, free of charge, to any person obtaining a copy +#of this software and associated documentation files (the "Software"), to deal +#in the Software without restriction, including without limitation the rights +#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +#copies of the Software, and to permit persons to whom the Software is +#furnished to do so, subject to the following conditions: + +#The above copyright notice and this permission notice shall be included in +#all copies or substantial portions of the Software. + +#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +#THE SOFTWARE. + +# a naive approach to running myfun in a jail +import re +from time import * +from math import * +from numpy.oldnumeric import * +from numpy.fft import * + +def myfunc(lc, f, x): + # check to make sure no import calls are made + myf = "def f(x): return " + re.sub("import","",f) + userdefined = {} + try: + exec myf in globals(), userdefined + return userdefined.values()[0](x) + except: + return None + diff --git a/talogo.py b/talogo.py index d4b2709..e333455 100644 --- a/talogo.py +++ b/talogo.py @@ -19,15 +19,12 @@ #THE SOFTWARE. import re -from time import clock +from time import * import gobject from operator import isNumberType import random import audioop -from math import sqrt -from numpy.oldnumeric import * -from numpy.fft import * -from audiograb import AudioGrab +from math import * import subprocess from UserDict import UserDict from sugar.datastore import datastore @@ -38,7 +35,8 @@ class noKeyError(UserDict): class taLogo: pass from taturtle import * - +from tagplay import * +from tajail import * procstop = False @@ -101,6 +99,11 @@ def blocks_to_code(lc,spr): code.append('#smedia_'+str(spr.ds_id)) else: code.append('#smedia_None') + elif spr.proto.name=='audiooff' or spr.proto.name=='audio': + if spr.ds_id != None: + code.append('#saudio_'+str(spr.ds_id)) + else: + code.append('#saudio_None') else: return ['%nothing%'] for i in range(1,len(spr.connections)): @@ -110,7 +113,8 @@ def blocks_to_code(lc,spr): for c in dock[4]: code.append(c) if b!=None: code.extend(blocks_to_code(lc,b)) elif spr.proto.docks[i][0] not in \ - ['flow', 'numend', 'stringend', 'unavailable', 'logi-']: + ['flow', 'numend', 'stringend', 'mediaend', \ + 'audioend', 'unavailable', 'logi-']: code.append('%nothing%') return code @@ -397,10 +401,11 @@ def lcNew(tw): defprim(lc,'sqrt', 1, lambda lc,x: sqrt(x)) defprim(lc,'id',1, lambda lc,x: identity(x)) - defprim(lc,'sensor_val0', 0, lambda lc: sensor_val(lc, 0)) - defprim(lc,'sensor_val1', 0, lambda lc: sensor_val(lc, 1)) - defprim(lc,'sensor_val2', 0, lambda lc: sensor_val(lc, 2)) - defprim(lc,'sensor_val3', 0, lambda lc: sensor_val(lc, 3)) + defprim(lc,'kbinput', 0, lambda lc: kbinput(lc)) + defprim(lc,'keyboard', 0, lambda lc: lc.keyboard) + defprim(lc,'myfunc', 2, lambda lc,f,x: callmyfunc(lc, f, x)) + defprim(lc,'hres', 0, lambda lc: lc.tw.turtle.width) + defprim(lc,'vres', 0, lambda lc: lc.tw.turtle.height) defprim(lc,'clean', 0, lambda lc: clear(lc)) defprim(lc,'forward', 1, lambda lc, x: forward(lc.tw.turtle, x)) @@ -457,6 +462,19 @@ def lcNew(tw): defprim(lc,'nop3', 1, lambda lc,x: None) defprim(lc,'start', 0, lambda: None) + defprim(lc,'tp1', 2, lambda lc,x,y: show_template1(lc, x, y)) + defprim(lc,'tp8', 2, lambda lc,x,y: show_template8(lc, x, y)) + defprim(lc,'tp6', 3, lambda lc,x,y,z: show_template6(lc, x, y, z)) + defprim(lc,'tp3', 8, lambda lc,x,y,z,a,b,c,d,e: \ + show_template3(lc, x, y, z, a, b, c, d, e)) + defprim(lc,'sound', 1, lambda lc,x: play_sound(lc, x)) + defprim(lc,'video', 1, lambda lc,x: play_movie(lc, x)) + defprim(lc,'tp2', 3, lambda lc,x,y,z: \ + show_template2(lc, x, y, z)) + defprim(lc,'tp7', 5, lambda lc,x,y,z,a,b: \ + show_template7(lc, x, y, z, a, b)) + defprim(lc,'hideblocks', 0, lambda lc: hideblocks(lc)) + lc.symtype = type(intern(lc, 'print')) lc.listtype = type([]) lc.symnothing = intern(lc, '%nothing%') @@ -468,14 +486,35 @@ def lcNew(tw): lc.heap = [] lc.keyboard = 0 lc.gplay = None + lc.ag = None lc.title_height = int((tw.turtle.height/30)*tw.scale) lc.body_height = int((tw.turtle.height/60)*tw.scale) lc.bullet_height = int((tw.turtle.height/45)*tw.scale) lc.iline, lc.cfun, lc.arglist, lc.ufun = None, None, None,None + # this dictionary is used to define the relative size and postion of + # template elements (w, h, x, y, dx, dy, dx1, dy1...) + lc.templates = { + 'tp1': (0.5, 0.5, 0.125, 0.125, 1, 0), + 'tp2': (0.5, 0.5, 0.125, 0.125, 1, 1.05), + 'tp3': (1, 1, 0.125, 0.125, 0, 0.1), + 'tp6': (0.45, 0.45, 0.125, 0.125, 1, 1.05), + 'tp7': (0.45, 0.45, 0.125, 0.125, 1, 1.05), + 'tp8': (0.9, 0.9, 0.125, 0.125, 0, 0), + 'insertimage': (0.333, 0.333) + } + return lc +def callmyfunc(lc, f, x): + y = myfunc(lc, f, x) + if y is None: + raise logoerror("#syntaxerror") + stop_logo(lc.tw) + else: + return y + def show_picture(lc, media, x, y, w, h): if media == "" or media[6:] == "": # raise logoerror("#nomedia") @@ -492,7 +531,7 @@ def show_picture(lc, media, x, y, w, h): + str(w) + " h:" + str(h) play_dsobject(lc, dsobject, int(x), int(y), int(w), int(h)) else: - pixbuf = get_pixbuf_from_journal(dsobject,w,h) + pixbuf = get_pixbuf_from_journal(dsobject,int(w),int(h)) if pixbuf != None: draw_pixbuf(lc.tw.turtle, pixbuf, 0, 0, int(x), int(y), \ int(w), int(h)) @@ -500,13 +539,13 @@ def show_picture(lc, media, x, y, w, h): def get_pixbuf_from_journal(dsobject,w,h): try: - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(dsobject.file_path,w,h) + pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(dsobject.file_path,int(w),int(h)) except: try: # print "Trying preview..." pixbufloader = gtk.gdk.pixbuf_loader_new_with_mime_type \ ('image/png') - pixbufloader.set_size(min(300,w),min(225,h)) + pixbufloader.set_size(min(300,int(w)),min(225,int(h))) pixbufloader.write(dsobject.metadata['preview']) pixbufloader.close() # gtk.gdk_pixbuf_loader_close(pixbufloader) @@ -516,10 +555,111 @@ def get_pixbuf_from_journal(dsobject,w,h): pixbuf = None return pixbuf +def show_description(lc, media, x, y, w, h): + if media == "" or media[6:] == "": +# raise logoerror("#nomedia") + print "no media" + elif media[6:] != "None": + try: + dsobject = datastore.get(media[6:]) + draw_text(lc.tw.turtle, \ + dsobject.metadata['description'],int(x),int(y), \ + lc.body_height, int(w)) + dsobject.destroy() + except: + print "no description?" + +def draw_title(lc,title,x,y): + draw_text(lc.tw.turtle,title,int(x),0,lc.title_height, \ + lc.tw.turtle.width-x) + +def calc_position(lc,t): + w,h,x,y,dx,dy = lc.templates[t] + x *= lc.tw.turtle.width + y *= lc.tw.turtle.height + w *= (lc.tw.turtle.width-x) + h *= (lc.tw.turtle.height-y) + dx *= w + dy *= h + return(w,h,x,y,dx,dy) + +# title, one image, and description +def show_template1(lc, title, media): + w,h,x,y,dx,dy = calc_position(lc,'tp1') + draw_title(lc,title,x,y) + if media[0:5] == 'media': + show_picture(lc, media, x, y, w, h) + show_description(lc, media, x+dx, y+dy, w, h) + +# title, two images (horizontal), two descriptions +def show_template2(lc, title, media1, media2): + w,h,x,y,dx,dy = calc_position(lc,'tp2') + draw_title(lc,title,x,y) + if media1[0:5] == 'media': + show_picture(lc, media1, x, y, w, h) + show_description(lc, media1, x, y+dy, w, h) + if media2[0:5] == 'media': + show_picture(lc, media2, x+dx, y, w, h) + show_description(lc, media2, x+dx, y+dy, w, h) + +# title and seven bullets +def show_template3(lc, title, s1, s2, s3, s4, s5, s6, s7): + w,h,x,y,dx,dy = calc_position(lc,'tp3') + draw_title(lc,title,x,y) + draw_text(lc.tw.turtle,s1,x,y,lc.bullet_height,w) + x += dx + y += dy + draw_text(lc.tw.turtle,s2,x,y,lc.bullet_height,w) + x += dx + y += dy + draw_text(lc.tw.turtle,s3,x,y,lc.bullet_height,w) + x += dx + y += dy + draw_text(lc.tw.turtle,s4,x,y,lc.bullet_height,w) + x += dx + y += dy + draw_text(lc.tw.turtle,s5,x,y,lc.bullet_height,w) + x += dx + y += dy + draw_text(lc.tw.turtle,s6,x,y,lc.bullet_height,w) + x += dx + y += dy + draw_text(lc.tw.turtle,s7,x,y,lc.bullet_height,w) + +# title, two images (vertical), two desciptions +def show_template6(lc, title, media1, media2): + w,h,x,y,dx,dy = calc_position(lc,'tp6') + draw_title(lc,title,x,y) + if media1[0:5] == 'media': + show_picture(lc, media1, x, y, w, h) + show_description(lc, media1, x+dx, y, w, h) + if media2[0:5] == 'media': + show_picture(lc, media2, x, y+dy, w, h) + show_description(lc, media2, x+dx, y+dy, w, h) + +# title and four images +def show_template7(lc, title, media1, media2, media3, media4): + w,h,x,y,dx,dy = calc_position(lc,'tp7') + draw_title(lc, title, x, y) + if media1[0:5] == 'media': + show_picture(lc, media1, x, y, w, h) + if media2[0:5] == 'media': + show_picture(lc, media2, x+dx, y, w, h) + if media4[0:5] == 'media': + show_picture(lc, media4, x+dx, y+dy, w, h) + if media3[0:5] == 'media': + show_picture(lc, media3, x, y+dy, w, h) + +# title, one image +def show_template8(lc, title, media): + w,h,x,y,dx,dy = calc_position(lc,'tp8') + draw_title(lc,title,x,y) + if media[0:5] == 'media': + show_picture(lc, media, x, y, w, h) + # image only (at current x,y) def insert_image(lc, media): - w = 0.25 - h = 0.25 + w,h = lc.templates['insertimage'] w *= lc.tw.turtle.width h *= lc.tw.turtle.height # convert from Turtle coordinates to screen coordinates @@ -528,7 +668,12 @@ def insert_image(lc, media): if media[0:5] == 'media': show_picture(lc, media, x, y, w, h) +# audio only +def play_sound(lc, audio): + play_audio(lc, audio) + def clear(lc): + stop_media(lc) clearscreen(lc.tw.turtle) def write(lc, string, fsize): @@ -541,7 +686,8 @@ def hideblocks(lc): from tawindow import hideshow_button lc.tw.hide = False # force hide hideshow_button(lc.tw) - for i in lc.tw.selbuttons: hide(i) + for i in lc.tw.selbuttons: + hide(i) lc.tw.activity.projectToolbar.do_hide() def doevalstep(lc): @@ -579,6 +725,18 @@ def status_print(lc,n): else: showlabel(lc,int(float(n)*10)/10.) +def kbinput(lc): + if len(lc.tw.keypress) == 1: + lc.keyboard = ord(lc.tw.keypress[0]) + else: + try: + lc.keyboard = {'Escape': 27, 'space': 32, 'Return': 13, \ + 'KP_Up': 2, 'KP_Down': 4, 'KP_Left': 1, 'KP_Right': 3,} \ + [lc.tw.keypress] + except: + lc.keyboard = 0 + lc.tw.keypress = "" + def showlabel(lc,l): if l=='#nostack': shp = 'nostack'; l='' elif l=='#noinput': shp = 'noinput'; l='' @@ -610,11 +768,4 @@ def tyo(n): print n def millis(): return int(clock()*1000) -def sensor_val(lc, y): - return_this = 0 - ag = AudioGrab() - return_this = ag.get_sensor_val(y) - if y==3: - return_this = ag.get_sensor_val(y) - return return_this diff --git a/taproject.py b/taproject.py index af114cb..abebdfa 100644 --- a/taproject.py +++ b/taproject.py @@ -22,7 +22,9 @@ import pygtk pygtk.require('2.0') import gtk import pickle +import json import os.path +# import base64 from tasprites import * from taturtle import * @@ -33,7 +35,6 @@ def new_project(tw): stop_logo(tw) for b in blocks(tw): hide(b) setlayer(tw.turtle.canvas, 600) -# setshape(tw.toolsprs['hideshow'], tw.toolsprs['hideshow'].offshape) clearscreen(tw.turtle) tw.save_file_name = None @@ -46,29 +47,51 @@ def load_file(tw): def load_files(tw,ta_file, png_file=''): f = open(ta_file, "r") - data = pickle.load(f) + try: + data = pickle.load(f) # old-style data format + except: + # print "reading saved json data" + text = f.read(-1) + listdata = json.read(text) + data = tuplify(listdata) # json converts tuples to lists f.close() new_project(tw) read_data(tw,data) - if png_file != '': - try: - load_pict(tw,png_file) - except: -# print "load_files: picture didn't load" - pass - inval(tw.turtle.canvas) + # don't load the png_file -- we run the program instead + # if png_file != '': + # try: + # load_pict(tw,png_file) + # except: + # pass + # inval(tw.turtle.canvas) def get_load_name(tw): - dialog = gtk.FileChooserDialog("Load...", None, - gtk.FILE_CHOOSER_ACTION_OPEN, - (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN, gtk.RESPONSE_OK)) + dialog = gtk.FileChooserDialog("Load...", None, \ + gtk.FILE_CHOOSER_ACTION_OPEN, \ + (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN, gtk.RESPONSE_OK)) dialog.set_default_response(gtk.RESPONSE_OK) return do_dialog(tw,dialog) +# unpack serialized data sent across a share +# def load_string(tw,btext): +def load_string(tw,text): + # text = base64.b64decode(btext) # no need for base64 encoding with json + listdata = json.read(text) + data = tuplify(listdata) # json converts tuples to lists + # data = pickle.loads(text) + new_project(tw) + read_data(tw,data) + +def tuplify(t): + if type(t) is not list: + return t + return tuple(map(tuplify, t)) + def read_data(tw,data): blocks = [] for b in data: - if b[1]=='turtle': load_turtle(tw,b) + if b[1]=='turtle': + load_turtle(tw,b) else: spr = load_spr(tw,b); blocks.append(spr) for i in range(len(blocks)): cons=[] @@ -84,8 +107,7 @@ def load_spr(tw,b): if type(btype)==type((1,2)): btype, label = btype # print "found a label: " + label - # for backward compatibility - if btype == 'title': + if btype == 'title': # for backward compatibility btype = 'string' if btype == 'journal' or btype == 'audiooff': media = label @@ -112,8 +134,7 @@ def load_spr(tw,b): setimage(spr, tw.media_shapes['audioon']) dsobject.destroy() except: - pass - # print "couldn't open dsobject (" + str(spr.ds_id) + ")" + print "couldn't open dsobject (" + str(spr.ds_id) + ")" setlayer(spr,650) return spr @@ -150,28 +171,44 @@ def get_save_name(tw): def save_data(tw,fname): f = file(fname, "w") + data = assemble_data_to_save(tw) + # pickle.dump(data,f) + text = json.write([data]) # for some reason, we need to add the extra [] + f.write(text) + f.close() + +# used to send data across a shared session +def save_string(tw): + data = assemble_data_to_save(tw) + # encode it for sending across the network + # text = pickle.dumps(data) + text = json.write(data) + # btext = base64.b64encode(text) + # return btext + return text # no need for base64 with json encoding + +def assemble_data_to_save(tw): bs = blocks(tw) data = [] for i in range(len(bs)): bs[i].id=i for b in bs: name = b.proto.name -# print "\\ " + name + " \\" if tw.defdict.has_key(name) or name == 'journal' or \ name == 'audiooff': if b.ds_id != None: -# print "/ " + str(b.ds_id) + " /" name=(name,str(b.ds_id)) else: name=(name,b.label) -# print "* " + str(name) + " *" - connections = [get_id(x) for x in b.connections] + if hasattr(b,'connections'): + connections = [get_id(x) for x in b.connections] + else: + connections = None data.append((b.id,name,b.x-tw.turtle.canvas.x, \ b.y-tw.turtle.canvas.y,connections)) data.append((-1,'turtle', tw.turtle.xcor,tw.turtle.ycor,tw.turtle.heading, tw.turtle.color,tw.turtle.shade,tw.turtle.pensize)) - pickle.dump(data,f) - f.close() + return data def save_pict(tw,fname): tc = tw.turtle.canvas diff --git a/tasetup.py b/tasetup.py index a2e64a1..b9ca78d 100644 --- a/tasetup.py +++ b/tasetup.py @@ -55,9 +55,7 @@ selectors = ( ('image','insertimage','image','None'), ('xcor','xcor','num'), ('ycor','ycor','num'), - ('heading','heading','num'), - # not on palette, but needed by write - ('journal','','media','','',''))), + ('heading','heading','num'))), ('pen', 55, (('penup','penup','noarg'), ('pendown','pendown','noarg'), @@ -94,10 +92,11 @@ selectors = ( ('remainder','%','ari2'), ('plus','+','ari'))), ('sensors', 55, - (('volume','sensor_val0','num'), - ('pitch','sensor_val1','num'), - ('resistance','sensor_val2','num'), - ('voltage','sensor_val3','num'))), + (('kbinput','kbinput','noarg2'), + ('keyboard','keyboard','num'), + ('myfunc','myfunc','myfunc',_('x'),100), + ('hres','hres','num'), + ('vres','vres','num'))), ('flow', 55, (('wait','wait','onearg',10), ('forever','forever','forever'), @@ -106,7 +105,8 @@ selectors = ( ('stopstack','stopstack','stop'), ('ifelse','ifelse','ifelse'), ('hspace','nop','hspace'), - ('vspace','nop','vspace'))), + ('vspace','nop','vspace'), + ('lock','nop','lock'))), ('myblocks', 55, (('start','nop','start'), ('hat1','nop1','start'), @@ -125,7 +125,18 @@ selectors = ( ('push','push','onearg'), ('pop','pop','num'), ('printheap','heap','noarg2'), - ('clearheap','emptyheap','noarg2')))) + ('clearheap','emptyheap','noarg2'))), + ('templates',55, + (('journal','','media','','',''), + ('template1','tp1','tp1',_('title'),'None'), + ('template6','tp6','tp6',_('title'),'None','None'), + ('template2','tp2','tp2',_('title'),'None','None'), + ('template7','tp7','tp7',_('title'),'None','None','None','None'), + ('template3','tp3','tp3',_('title'),'','','','','','',''), + ('template4','tp8','tp1',_('title'),'None'), + ('sound','sound','sound','None'), + ('audiooff','','audio','','',''), + ('hideblocks','hideblocks','noarg2')))) dockdetails = { 'noarg': (('flow',True,37,5),('flow',False,37,44)), @@ -229,7 +240,8 @@ def setup_misc(tw): tw.hidden_palette_icon = load_image(tw.path, '','blocks-') # media blocks get positioned into other blocks tw.media_shapes = {} - tw.media_shapes['texton'] = load_image(tw.path, 'turtle', 'texton') + tw.media_shapes['audioon'] = load_image(tw.path, 'templates', 'audioon') + tw.media_shapes['texton'] = load_image(tw.path, 'templates', 'texton') # status shapes get positioned at the bottom of the screen tw.status_shapes = {} tw.status_shapes['status'] = load_image(tw.path, '', 'status') @@ -247,6 +259,8 @@ def setup_misc(tw): tw.status_shapes['status'],True) tw.status_spr.type = 'status' setlayer(tw.status_spr,400) + # everything should be loaded at this point + tw.loaded = True def setup_selector(tw,name,y,blockdescriptions): # selector tabs @@ -257,13 +271,8 @@ def setup_selector(tw,name,y,blockdescriptions): spr.offshape = offshape spr.onshape = onshape # print 'setting up selector ' + name - # some sensor inputs are hardware dependent - if name == 'sensors' and os.path.exists('/sys/power/olpc-pm'): - spr.group = load_image(tw.path, name,name+'group'+'xo') - spr.mask = load_image(tw.path, name,name+'mask'+'xo') - else: - spr.group = load_image(tw.path, name,name+'group') - spr.mask = load_image(tw.path, name,name+'mask') + spr.group = load_image(tw.path, name,name+'group') + spr.mask = load_image(tw.path, name,name+'mask') spr.type = 'selbutton' # block prototypes protos = [] @@ -292,14 +301,18 @@ def setup_selector(tw,name,y,blockdescriptions): def load_image(path, dir, file): from sugar.activity import activity + try: + datapath = os.path.join(activity.get_activity_root(), "data") + except: + # early versions of Sugar (656) didn't support get_activity_root() + datapath = "/home/olpc/.sugar/default/org.sugarlabs.TAPortfolioActivity/data" + # first try to open the cached image # if you fail, open the .svg file and cache the result as png try: - return gtk.gdk.pixbuf_new_from_file( \ - os.path.join(activity.get_activity_root(),"data",file+'.png')) + return gtk.gdk.pixbuf_new_from_file(os.path.join(datapath, file+'.png')) except: foo = gtk.gdk.pixbuf_new_from_file(os.path.join(path,dir,file \ +'.svg')) - foo.save(os.path.join(activity.get_activity_root(),"data",file \ - +'.png'), "png") + foo.save(os.path.join(datapath, file+'.png'), "png") return foo diff --git a/tasprites.py b/tasprites.py index 92e51cf..4db1e4d 100644 --- a/tasprites.py +++ b/tasprites.py @@ -41,7 +41,8 @@ def sprNew(tw,x,y,image,altlabel=False): setimage(spr,image) spr.label = None spr.ds_id = None - if altlabel: spr.draw_label = draw_label2 + if altlabel: + spr.draw_label = draw_label2 else: spr.draw_label = draw_label1 return spr @@ -84,19 +85,21 @@ def setlabel(spr,label): inval(spr) def inval(spr): - spr.tw.area.invalidate_rect(gtk.gdk.Rectangle(spr.x,spr.y,spr.width,spr.height), False) + spr.tw.area.invalidate_rect(gtk.gdk.Rectangle(spr.x,spr.y,spr.width, \ + spr.height), False) def draw(spr): if isinstance(spr.image,gtk.gdk.Pixbuf): spr.tw.area.draw_pixbuf(spr.tw.gc, spr.image, 0, 0, spr.x, spr.y) - else: spr.tw.area.draw_drawable(spr.tw.gc,spr.image,0,0,spr.x,spr.y,-1,-1) + else: + spr.tw.area.draw_drawable(spr.tw.gc,spr.image,0,0,spr.x,spr.y,-1,-1) if spr.label!=None: - try: + if hasattr(spr, 'proto') and hasattr(spr.proto, 'name'): name = spr.proto.name - except: + else: name = "" if name != 'audiooff' and name != 'journal': - spr.draw_label(spr,spr.label) + spr.draw_label(spr,str(spr.label)) def hit(spr,pos): x,y = pos @@ -109,21 +112,29 @@ def hit(spr,pos): try: return ord(spr.image.get_pixels()[(dy*spr.width+dx)*4+3]) == 255 except IndexError: - print "IndexError: string index out of range" + dy + " " + spr.width + " " + dx + # not sure why this would happen + if hasattr(spr, 'proto') and hasattr(spr.proto, 'name'): + print spr.proto.name + print "IndexError: string index out of range" + dy + " " \ + + spr.width + " " + dx return True +# used for most things def draw_label1(spr, label): fd = pango.FontDescription('Sans') fd.set_size(7*pango.SCALE) - pl = spr.tw.window.create_pango_layout(str(label)) - pl.set_font_description(fd) - swidth = pl.get_size()[0]/pango.SCALE - sheight = pl.get_size()[1]/pango.SCALE - centerx = spr.x+spr.width/2 - centery = spr.y+spr.height/2 - spr.tw.gc.set_foreground(spr.tw.msgcolor) - spr.tw.area.draw_layout(spr.tw.gc,centerx-swidth/2,centery-sheight/2,pl) - + if type(label) == str: + pl = spr.tw.window.create_pango_layout(str(label)) + pl.set_font_description(fd) + swidth = pl.get_size()[0]/pango.SCALE + sheight = pl.get_size()[1]/pango.SCALE + centerx = spr.x+spr.width/2 + centery = spr.y+spr.height/2 + spr.tw.gc.set_foreground(spr.tw.msgcolor) + spr.tw.area.draw_layout(spr.tw.gc,int(centerx-swidth/2), \ + int(centery-sheight/2),pl) + +# used for status blocks def draw_label2(spr, label): fd = pango.FontDescription('Sans') fd.set_size(9*pango.SCALE) @@ -132,12 +143,14 @@ def draw_label2(spr, label): sheight = pl.get_size()[1]/pango.SCALE centery = spr.y+spr.height/2 spr.tw.gc.set_foreground(spr.tw.msgcolor) - spr.tw.area.draw_layout(spr.tw.gc,spr.x+70,centery-sheight/2,pl) + spr.tw.area.draw_layout(spr.tw.gc,spr.x+70,int(centery-sheight/2),pl) +# used to get pixel value from mask for category selector def getpixel(image,x,y): array = image.get_pixels() offset = (y*image.get_width()+x)*4 - r,g,b,a = ord(array[offset]),ord(array[offset+1]),ord(array[offset+2]),ord(array[offset+3]) + r,g,b,a = ord(array[offset]),ord(array[offset+1]),ord(array[offset+2]), \ + ord(array[offset+3]) return (a<<24)+(b<<16)+(g<<8)+r diff --git a/taturtle.py b/taturtle.py index 7b9ca6a..cf228b3 100644 --- a/taturtle.py +++ b/taturtle.py @@ -209,6 +209,7 @@ def set_fgcolor(t): rgb = color_table[wrap100(t.color)] r,g,b = (rgb>>8)&0xff00,rgb&0xff00,(rgb<<8)&0xff00 r,g,b = calc_shade(r,sh),calc_shade(g,sh),calc_shade(b,sh) + t.tw.rgb = [r>>8,g>>8,b>>8] t.tw.fgcolor = t.tw.cm.alloc_color(r,g,b) def set_textcolor(t): @@ -239,13 +240,13 @@ def draw_text(t, label, x, y, size, w): t.gc.set_foreground(t.tw.textcolor) fd = pango.FontDescription('Sans') try: - fd.set_size(size*pango.SCALE) + fd.set_size(int(size)*pango.SCALE) except: pass pl = t.tw.window.create_pango_layout(str(label)) pl.set_font_description(fd) - pl.set_width(w*pango.SCALE) - t.canvas.image.draw_layout(t.gc,x,y,pl) + pl.set_width(int(w)*pango.SCALE) + t.canvas.image.draw_layout(t.gc,int(x),int(y),pl) w,h = pl.get_pixel_size() invalt(t,x,y,w,h) diff --git a/tawindow.py b/tawindow.py index 0b3744f..e3e553a 100644 --- a/tawindow.py +++ b/tawindow.py @@ -76,6 +76,7 @@ def twNew(win, path, lang, tboxh, parent=None): tw.scale = 1 else: tw.scale = 1.6 tw.cm = tw.gc.get_colormap() + tw.rgb = [255,0,0] tw.bgcolor = tw.cm.alloc_color('#fff8de') tw.msgcolor = tw.cm.alloc_color('black') tw.fgcolor = tw.cm.alloc_color('red') @@ -84,6 +85,7 @@ def twNew(win, path, lang, tboxh, parent=None): tw.selected_block = None tw.draggroup = None prep_selectors(tw) + tw.loaded = 0 for s in selectors: setup_selectors(tw,s) setup_misc(tw) @@ -93,6 +95,9 @@ def twNew(win, path, lang, tboxh, parent=None): select_category(tw, tw.selbuttons[0]) tw.turtle = tNew(tw,tw.width,tw.height) tw.lc = lcNew(tw) + tw.buddies = [] + tw.dx = 0 + tw.dy = 0 return tw # @@ -101,36 +106,55 @@ def twNew(win, path, lang, tboxh, parent=None): def buttonpress_cb(win, event, tw): win.grab_focus() + x, y = xy(event) + button_press(tw, event.get_state()>k.gdk.CONTROL_MASK, x, y) + # if sharing, send button press + if hasattr(tw.activity, 'chattube') and tw.activity.chattube is not None: + # print "sending button pressed" + if event.get_state()>k.gdk.CONTROL_MASK is True: + tw.activity._send_event("p:"+str(x)+":"+str(y)+":"+'T') + else: + tw.activity._send_event("p:"+str(x)+":"+str(y)+":"+'F') + return True + +def button_press(tw, mask, x, y, verbose=False): + if verbose: + print "processing remote button press: " + str(x) + " " + str(y) tw.block_operation = 'click' if tw.selected_block!=None: unselect(tw) setlayer(tw.status_spr,400) - pos = xy(event) - x,y = pos - spr = findsprite(tw,pos) - if spr==None: return True + spr = findsprite(tw,(x,y)) + tw.dx = 0 + tw.dy = 0 + if spr is None: + # print "no spr found" + return True if spr.type == 'selbutton': select_category(tw,spr) elif spr.type == 'category': block_selector_pressed(tw,x,y) elif spr.type == 'block': - block_pressed(tw,event,x,y,spr) + block_pressed(tw,mask,x,y,spr) elif spr.type == 'turtle': turtle_pressed(tw,x,y) - return True def block_selector_pressed(tw,x,y): proto = get_proto_from_category(tw,x,y) - if proto==None: return - if proto!='hide': new_block_from_category(tw,proto,x,y) + if proto==None: + return + if proto!='hide': + new_block_from_category(tw,proto,x,y) else: - hide_palette(tw) + hideshow_palette(tw,False) -def hideshow_palette(tw): - if tw.palette == True: - hide_palette(tw) - # not sure why this call to do_hidepalette doesn't work +def hideshow_palette(tw,state): + if state is False: + tw.palette == False tw.activity.projectToolbar.do_hidepalette() + hide_palette(tw) else: + tw.palette == True + tw.activity.projectToolbar.do_showpalette() show_palette(tw) def show_palette(tw): @@ -147,9 +171,11 @@ def get_proto_from_category(tw,x,y): dx,dy = x-tw.category_spr.x, y-tw.category_spr.y, pixel = getpixel(tw.current_category.mask,dx,dy) index = ((pixel%256)>>3)-1 - if index==0: return 'hide' + if index==0: + return 'hide' index-=1 - if index>len(tw.current_category.blockprotos): return None + if index>len(tw.current_category.blockprotos): + return None return tw.current_category.blockprotos[index] def select_category(tw, spr): @@ -160,7 +186,8 @@ def select_category(tw, spr): setshape(tw.category_spr,spr.group) def new_block_from_category(tw,proto,x,y): - if proto == None: return True + if proto is None: + return True newspr = sprNew(tw,x-20,y-20,proto.image) setlayer(newspr,2000) tw.dragpos = 20,20 @@ -184,20 +211,21 @@ def new_block_from_category(tw,proto,x,y): tw.draggroup = findgroup(newspr) tw.block_operation = 'new' -def block_pressed(tw,event,x,y,spr): - if event.get_state()>k.gdk.CONTROL_MASK: - newspr = clone_stack(tw,x-spr.x-20,y-spr.y-20, spr) - tw.dragpos = x-newspr.x,y-newspr.y - tw.draggroup = findgroup(newspr) - else: - tw.draggroup = findgroup(spr) - for b in tw.draggroup: setlayer(b,2000) - if spr.connections[0] != None and spr.proto.name == 'lock': - b = find_top_block(spr) - tw.dragpos = x-b.x,y-b.y +def block_pressed(tw,mask,x,y,spr): + if spr is not None: + if mask is True: + newspr = clone_stack(tw,x-spr.x-20,y-spr.y-20, spr) + tw.dragpos = x-newspr.x,y-newspr.y + tw.draggroup = findgroup(newspr) else: - tw.dragpos = x-spr.x,y-spr.y - disconnect(spr) + tw.draggroup = findgroup(spr) + for b in tw.draggroup: setlayer(b,2000) + if spr.connections[0] != None and spr.proto.name == 'lock': + b = find_top_block(spr) + tw.dragpos = x-b.x,y-b.y + else: + tw.dragpos = x-spr.x,y-spr.y + disconnect(spr) def clone_stack(tw,dx,dy,spr): newspr = sprNew(tw,spr.x+dx,spr.y+dy,spr.proto.image) @@ -215,9 +243,11 @@ def clone_stack(tw,dx,dy,spr): def turtle_pressed(tw,x,y): dx,dy = x-tw.turtle.spr.x-30,y-tw.turtle.spr.y-30 - if dx*dx+dy*dy > 200: tw.dragpos = ('turn', \ + if dx*dx+dy*dy > 200: + tw.dragpos = ('turn', \ tw.turtle.heading-atan2(dy,dx)/DEGTOR,0) - else: tw.dragpos = ('move', x-tw.turtle.spr.x,y-tw.turtle.spr.y) + else: + tw.dragpos = ('move', x-tw.turtle.spr.x,y-tw.turtle.spr.y) tw.draggroup = [tw.turtle.spr] # @@ -225,38 +255,81 @@ def turtle_pressed(tw,x,y): # def move_cb(win, event, tw): - if tw.draggroup == None: return True + x,y = xy(event) + mouse_move(tw, x, y) +# if hasattr(tw.activity, 'chattube')and tw.activity.chattube is not None: +# tw.activity._send_event("m:"+str(x)+":"+str(y)) + return True + +def mouse_move(tw, x, y, verbose=False, mdx=0, mdy=0): + if verbose: + print "processing remote mouse move: " + str(x) + " " + str(y) + if tw.draggroup is None: + return tw.block_operation = 'move' spr = tw.draggroup[0] if spr.type=='block': - x,y = xy(event) dragx, dragy = tw.dragpos - dx,dy = x-dragx-spr.x,y-dragy-spr.y + if mdx != 0 or mdy != 0: + dx,dy = mdx,mdy + else: + dx,dy = x-dragx-spr.x,y-dragy-spr.y # skip if there was a move of 0,0 - if dx == 0 and dy == 0: return True + if dx == 0 and dy == 0: + return # drag entire stack if moving lock block - tw.draggroup = findgroup(spr) + if spr.proto.name == 'lock': + tw.draggroup = findgroup(find_top_block(spr)) + else: + tw.draggroup = findgroup(spr) for b in tw.draggroup: move(b,(b.x+dx, b.y+dy)) elif spr.type=='turtle': - x,y = xy(event) type,dragx,dragy = tw.dragpos if type == 'move': - dx,dy = x-dragx-spr.x,y-dragy-spr.y + if mdx != 0 or mdy != 0: + dx,dy = mdx,mdy + else: + dx,dy = x-dragx-spr.x,y-dragy-spr.y move(spr, (spr.x+dx, spr.y+dy)) else: - dx,dy = x-spr.x-30,y-spr.y-30 + if mdx != 0 or mdy != 0: + dx,dy = mdx,mdy + else: + dx,dy = x-spr.x-30,y-spr.y-30 seth(tw.turtle, int(dragx+atan2(dy,dx)/DEGTOR+5)/10*10) - return True + if mdx != 0 or mdy != 0: + dx,dy = 0,0 + else: + tw.dx += dx + tw.dy += dy + # print "deltas are " + str(dx) + " " + str(dy) # # Button release # def buttonrelease_cb(win, event, tw): - if tw.draggroup == None: return True - spr = tw.draggroup[0] x,y = xy(event) + button_release(tw, x, y) + if hasattr(tw.activity, 'chattube') and tw.activity.chattube is not None: + # print "sending release button" + tw.activity._send_event("r:"+str(x)+":"+str(y)) + return True + +def button_release(tw, x, y, verbose=False): + if tw.dx != 0 or tw.dy != 0 and \ + hasattr(tw.activity, 'chattube') and tw.activity.chattube is not None: + if verbose: + print "processing accumulated move: " + str(tw.dx) + " " + str(tw.dy) + tw.activity._send_event("m:"+str(tw.dx)+":"+str(tw.dy)) + tw.dx = 0 + tw.dy = 0 + if verbose: + print "processing remote button release: " + str(x) + " " + str(y) + if tw.draggroup == None: + return + spr = tw.draggroup[0] if spr.type == 'turtle': tw.turtle.xcor = tw.turtle.spr.x-tw.turtle.canvas.x- \ tw.turtle.canvas.width/2+30 @@ -264,12 +337,11 @@ def buttonrelease_cb(win, event, tw): tw.turtle.canvas.y-30 move_turtle(tw.turtle) tw.draggroup = None - return True + return if tw.block_operation=='move' and hit(tw.category_spr, (x,y)): for b in tw.draggroup: hide(b) tw.draggroup = None - return True - # allow new blocks to be created by clicking as well as dragging + return if tw.block_operation=='new': for b in tw.draggroup: move(b, (b.x+200, b.y)) @@ -290,8 +362,24 @@ def buttonrelease_cb(win, event, tw): tw.firstkey = True elif spr.proto.name == 'journal': import_image(tw, spr) + elif spr.proto.name == 'audiooff': + import_audio(tw, spr) else: run_stack(tw, spr) - return True + +def import_audio(tw, spr): + chooser = ObjectChooser('Choose audio', None, gtk.DIALOG_MODAL | \ + gtk.DIALOG_DESTROY_WITH_PARENT) + try: + result = chooser.run() + if result == gtk.RESPONSE_ACCEPT: + dsobject = chooser.get_selected_object() + if dsobject and dsobject.file_path: + spr.ds_id = dsobject.object_id + setimage(spr,tw.media_shapes['audioon']) + dsobject.destroy() + finally: + chooser.destroy() + del chooser def import_image(tw, spr): # chooser = ObjectChooser('Choose image', None, gtk.DIALOG_MODAL | \ @@ -312,7 +400,7 @@ def import_image(tw, spr): def load_image(tw, picture, spr): from talogo import get_pixbuf_from_journal pixbuf = get_pixbuf_from_journal(picture,spr.width,spr.height) - if pixbuf != None: + if pixbuf is not None: setimage(spr, pixbuf) else: setimage(spr, tw.media_shapes['texton']) @@ -322,20 +410,24 @@ def snap_to_dock(tw): me = tw.draggroup[0] for mydockn in range(len(me.proto.docks)): for you in blocks(tw): - if you in tw.draggroup: continue + if you in tw.draggroup: + continue for yourdockn in range(len(you.proto.docks)): thisxy = dock_dx_dy(you,yourdockn,me,mydockn) - if magnitude(thisxy)>d: continue + if magnitude(thisxy)>d: + continue d=magnitude(thisxy) bestxy=thisxy bestyou=you bestyourdockn=yourdockn bestmydockn=mydockn if d<200: - for b in tw.draggroup: move(b,(b.x+bestxy[0],b.y+bestxy[1])) + for b in tw.draggroup: + move(b,(b.x+bestxy[0],b.y+bestxy[1])) blockindock=bestyou.connections[bestyourdockn] if blockindock!=None: - for b in findgroup(blockindock): hide(b) + for b in findgroup(blockindock): + hide(b) bestyou.connections[bestyourdockn]=me me.connections[bestmydockn]=bestyou @@ -352,7 +444,9 @@ def dock_dx_dy(block1,dock1n,block2,dock2n): if block1==block2: return (100,100) if d1type!=d2type: # some blocks can take strings or nums - if block1.proto.name in ('write', 'push', 'plus2', 'equal', 'nop'): + if block1.proto.name in ('write', 'push', 'plus2', 'equal', \ + 'template1', 'template2', 'template3', 'template4', \ + 'template6', 'template7', 'nop'): if block1.proto.name == 'write' and d1type == 'string': if d2type == 'num' or d2type == 'string': pass @@ -383,25 +477,66 @@ def expose_cb(win, event, tw): def keypress_cb(area, event, tw): keyname = gtk.gdk.keyval_name(event.keyval) -# print keyname + ", " + str(event.keyval) + str(event.get_state()) + results = key_press(tw, event.get_state()>k.gdk.MOD4_MASK, keyname) +# keyname = unichr(gtk.gdk.keyval_to_unicode(event.keyval)) + if keyname is not None and \ + hasattr(tw.activity, 'chattube') and tw.activity.chattube is not None: + # print "key press" + if event.get_state()>k.gdk.MOD4_MASK: + tw.activity._send_event("k:"+'T'+":"+keyname) + else: + tw.activity._send_event("k:"+'F'+":"+keyname) + return results + +def key_press(tw, mask, keyname, verbose=False): + if keyname is None: + return False + if verbose: + print "processing remote key press: " + keyname tw.keypress = keyname -# tw.keyval = unicode(gtk.gdk.keyval_to_unicode(event.keyval)) -# foo = unichr(gtk.gdk.keyval_to_unicode(event.keyval)) -# print foo - if (event.get_state()>k.gdk.MOD4_MASK): + if mask is True: if keyname=="n": new_project(tw) if keyname=="o": load_file(tw) if keyname=="s": save_file(tw) if keyname=="k": tw.activity.clear_journal() + if keyname=="i": + tw.activity.waiting_for_blocks = True + tw.activity._send_event("i") # request sync for sharing return True - if tw.selected_block==None: return False + if tw.selected_block==None: + if keyname=="i": + tw.activity.waiting_for_blocks = True + tw.activity._send_event("i") # request sync for sharing + elif keyname=="p": + if tw.palette is True: + hideshow_palette(tw,False) + else: + hideshow_palette(tw,True) + elif keyname=="b": + if tw.hide == False: + tw.activity.projectToolbar.do_hide() + else: + tw.activity.projectToolbar.do_show() + hideshow_button(tw) + elif keyname=="r": + runbutton(tw, 0) + elif keyname=="w": + runbutton(tw, 3) + elif keyname=="s": + stop_button(tw) + elif keyname=="e": + eraser_button(tw) + return False + # if and when we use unichr above + # we need to change this logic (and logic in talogo.py) if tw.selected_block.proto.name == 'number': if keyname in ['minus', 'period']: keyname = {'minus': '-', 'period': '.'}[keyname] - if len(keyname)>1: return True + if len(keyname)>1: + return True else: - # until I get the unicode working properly... a big dictionary - try: keyname = { + try: + keyname = { 'aacute': 'á', 'Aacute': 'Á', 'acircumflex': 'â', 'Acircumflex': 'Â', \ 'adiaeresis': 'ä', 'Adiaeresis': 'Ä', 'ae': 'æ', 'AE': 'Æ', 'agrave': \ 'à', 'Agrave': 'À', 'ampersand': '&', 'apostrophe': '\'', 'aring': \ @@ -450,10 +585,12 @@ def keypress_cb(area, event, tw): 'Cyrillic_i': 'и', 'Cyrillic_I': 'И', 'Cyrillic_te': 'т', \ 'Cyrillic_TE': 'Т', 'Cyrillic_softsign': 'ь', 'Cyrillic_SOFTSIGN': \ 'Ь', 'Cyrillic_ve': 'в', 'Cyrillic_VE': 'В', 'Cyrillic_yu': 'ю', \ -'Cyrillic_YU': 'Ю' }[keyname] +'Cyrillic_YU': 'Ю', 'KP_Up': '↑', 'KP_Down': '↓', 'KP_Left': '←', \ +'KP_Right': '→'}[keyname] except: if len(keyname)>1: return True + oldnum = tw.selected_block.label selblock=tw.selected_block.proto if tw.firstkey: newnum = selblock.check( \ @@ -475,12 +612,14 @@ def unselect(tw): # def disconnect(b): - if b.connections[0]==None: return + if b.connections[0]==None: + return b2=b.connections[0] b2.connections[b2.connections.index(b)] = None b.connections[0] = None def run_stack(tw,spr): + tw.lc.ag = None top = find_top_block(spr) run_blocks(tw.lc, top, blocks(tw), True) gobject.idle_add(doevalstep, tw.lc) @@ -493,7 +632,8 @@ def findgroup(b): def find_top_block(spr): b = spr - while b.connections[0]!=None: b=b.connections[0] + while b.connections[0]!=None: + b=b.connections[0] return b def runtool(tw, spr, cmd, *args): @@ -516,13 +656,13 @@ def runbutton(tw, time): # no start block, so run a stack that isn't a hat for b in blocks(tw): if find_block_to_run(tw, b): - # print "running " + b.proto.name + print "running " + b.proto.name tw.step_time = time run_stack(tw, b) return def hideshow_button(tw): - if tw.hide == False: + if tw.hide is False: for b in blocks(tw): setlayer(b,100) hide_palette(tw) hide(tw.select_mask) @@ -556,3 +696,4 @@ def blocks(tw): def xy(event): return map(int, event.get_coords()) + -- cgit v0.9.1