diff options
Diffstat (limited to 'TurtleArtActivity.py')
-rw-r--r-- | TurtleArtActivity.py | 240 |
1 files changed, 196 insertions, 44 deletions
diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py index afb1d7f..b4c889b 100644 --- a/TurtleArtActivity.py +++ b/TurtleArtActivity.py @@ -24,6 +24,7 @@ import talogo import pygtk pygtk.require('2.0') import gtk +import gobject import sugar from sugar.activity import activity @@ -35,21 +36,23 @@ from gettext import gettext as _ import locale import os.path import os +import tarfile +import sys +from taexportlogo import * class TurtleArtActivity(activity.Activity): + def __init__(self, handle): super(TurtleArtActivity,self).__init__(handle) - self.gamename = 'turtleart' -# self.set_title("TurtleArt...") - toolbox = activity.ActivityToolbox(self) self.set_toolbox(toolbox) + self.projectToolbar = ProjectToolbar(self) toolbox.add_toolbar( _('Project'), self.projectToolbar ) - toolbox.show() -# toolbox._activity_toolbar.keep.connect('clicked', self._keep_clicked_cb) # patch + toolbox.show() + toolbox.set_current_toolbar(1) canvas = gtk.EventBox() @@ -58,12 +61,16 @@ class TurtleArtActivity(activity.Activity): toolbox._activity_toolbar.title.select_region(0,0) tboxh = toolbox._activity_toolbar.size_request()[1] - version = os.environ['SUGAR_BUNDLE_VERSION'] + try: + version = os.environ['SUGAR_BUNDLE_VERSION'] + except: + version = "-unknown" lang = locale.getdefaultlocale()[0] if not lang: lang = 'en' lang = lang[0:2] - if not os.path.isdir(os.path.join(activity.get_bundle_path(),'images',lang)): + if not os.path.isdir(os.path.join(activity.get_bundle_path(), \ + 'images', lang)): lang = 'en' # test to see if lang or version has changed since last time @@ -72,26 +79,30 @@ class TurtleArtActivity(activity.Activity): versiondata = [] try: - FILE = open(os.path.join(activity.get_activity_root(),"data",filename),"r") + FILE = open(os.path.join(activity.get_activity_root(), "data", \ + filename), "r") if FILE.readline() == lang + version: - print "the version data hasn't changed" + pass else: - print "out with the old version data", - os.system("rm " + os.path.join(activity.get_activity_root(),"data",'*.png')) + print "out with the old, in with the new" + os.system("rm " + os.path.join(activity.get_activity_root(), \ + "data", '*.png')) except: print "writing new version data" + versiondata.append(lang + version) - FILE = open(os.path.join(activity.get_activity_root(),"data",filename),"w") + FILE = open(os.path.join(activity.get_activity_root(), "data", \ + filename), "w") FILE.writelines(versiondata) FILE.close() - self.tw = tawindow.twNew(canvas,activity.get_bundle_path(),lang,tboxh,self) + self.tw = tawindow.twNew1(canvas,activity.get_bundle_path(), \ + lang,tboxh,self) self.tw.activity = self self.tw.window.grab_focus() - self.tw.save_folder = os.path.join(os.environ['SUGAR_ACTIVITY_ROOT'],'data') - -# toolbox._activity_toolbar._update_title_sid = True -# toolbox._activity_toolbar.title.connect('focus-out-event', self.update_title_cb, toolbox) # patch + tawindow.twNew2(self.tw) + self.tw.save_folder=os.path.join(os.environ['SUGAR_ACTIVITY_ROOT'], \ + 'data') if self._jobject and self._jobject.file_path: self.read_file(self._jobject.file_path) @@ -106,7 +117,7 @@ class TurtleArtActivity(activity.Activity): def write_file(self, file_path): print "Writing file %s" % file_path self.metadata['mime_type'] = 'application/x-tar' - import tarfile,os,tempfile + import tempfile tar_fd = tarfile.open(file_path, 'w') pngfd, pngfile = tempfile.mkstemp(".png") tafd, tafile = tempfile.mkstemp(".ta") @@ -124,27 +135,33 @@ class TurtleArtActivity(activity.Activity): os.remove(tafile) def read_file(self, file_path): - # Better be a tar file. import tarfile,os,tempfile,shutil print "Reading file %s" % file_path - tar_fd = tarfile.open(file_path, 'r') - tmpdir = tempfile.mkdtemp() - - try: - # We'll get 'ta_code.ta' and '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() + # might 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' + 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 + elif file_path[-3:] == ".ta": + tawindow.load_files(self.tw, file_path, "") + # run the activity + tawindow.runbutton(self.tw, 0) def jobject_new_patch(self): oldj = self._jobject self._jobject = datastore.create() self._jobject.metadata['title'] = oldj.metadata['title'] - self._jobject.metadata['title_set_by_user'] = oldj.metadata['title_set_by_user'] + self._jobject.metadata['title_set_by_user'] = \ + oldj.metadata['title_set_by_user'] self._jobject.metadata['activity'] = self.get_service_name() self._jobject.metadata['activity_id'] = self.get_id() self._jobject.metadata['keep'] = '0' @@ -155,46 +172,178 @@ class TurtleArtActivity(activity.Activity): datastore.write(self._jobject, reply_handler=self._internal_jobject_create_cb, error_handler=self._internal_jobject_error_cb) + self._jobject.destroy() def clear_journal(self): - jobjects, total_count = datastore.find({'activity': 'org.laptop.TurtleArtActivity'}) + jobjects, total_count = datastore.find( \ + {'activity': 'org.sugarlab.TAPortfolioActivity'}) print 'found', total_count, 'entries' for jobject in jobjects[:-1]: print jobject.object_id datastore.delete(jobject.object_id) -class ProjectToolbar(gtk.Toolbar): - from taexport import * + + +class ProjectToolbar(gtk.Toolbar): def __init__(self, pc): gtk.Toolbar.__init__(self) self.activity = pc + # blocks button + self.blocks = ToolButton( "blocksoff" ) + self.blocks.set_tooltip(_('hide palette')) + self.blocks.props.sensitive = True + self.blocks.connect('clicked', self.do_blocks) + 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) + separator.show() + + # run button + self.runproject = ToolButton( "run-fastoff" ) + self.runproject.set_tooltip(_('run')) + self.runproject.props.sensitive = True + self.runproject.connect('clicked', self.do_run) + self.insert(self.runproject, -1) + self.runproject.show() + + # step button + self.stepproject = ToolButton( "run-slowoff" ) + self.stepproject.set_tooltip(_('step')) + self.stepproject.props.sensitive = True + self.stepproject.connect('clicked', self.do_step) + self.insert(self.stepproject, -1) + self.stepproject.show() + + # stop button + self.stop = ToolButton( "stopitoff" ) + self.stop.set_tooltip(_('stop turtle')) + self.stop.props.sensitive = True + self.stop.connect('clicked', self.do_stop) + self.insert(self.stop, -1) + self.stop.show() + + separator = gtk.SeparatorToolItem() + separator.set_draw(True) + self.insert(separator, -1) + separator.show() + + # eraser button + self.eraser = ToolButton( "eraseron" ) + self.eraser.set_tooltip(_('clean')) + self.eraser.props.sensitive = True + self.eraser.connect('clicked', self.do_eraser) + self.insert(self.eraser, -1) + self.eraser.show() + + separator = gtk.SeparatorToolItem() + separator.set_draw(True) + self.insert(separator, -1) + separator.show() + + # project open self.sampb = ToolButton( "stock-open" ) - self.sampb.set_tooltip(_('Samples')) + self.sampb.set_tooltip(_('sample portfolio templates')) self.sampb.props.sensitive = True self.sampb.connect('clicked', self.do_samples) self.insert(self.sampb, -1) self.sampb.show() - # UCB Logo save source button - self.savelogo = ToolButton( "UCB-save" ) - self.savelogo.set_tooltip(_('UCB Logo')) + 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')) + else: + self.blocks.set_icon("blocksoff") + self.blocks.set_tooltip(_('hide palette')) + + def do_hidepalette(self): + print "in do_hidepalette" + self.blocks.set_icon("blockson") + self.blocks.set_tooltip(_('show palette')) + + def do_run(self, button): + self.runproject.set_icon("run-faston") + self.stop.set_icon("stopiton") + tawindow.runbutton(self.activity.tw, 0) + gobject.timeout_add(1000,self.runproject.set_icon,"run-fastoff") + gobject.timeout_add(1000,self.stepproject.set_icon,"run-slowoff") + + def do_step(self, button): + self.stepproject.set_icon("run-slowon") + self.stop.set_icon("stopiton") + tawindow.runbutton(self.activity.tw, 3) + gobject.timeout_add(1000,self.stepproject.set_icon,"run-slowoff") + gobject.timeout_add(1000,self.runproject.set_icon,"run-fastoff") + + def do_stop(self, button): + self.stop.set_icon("stopitoff") + tawindow.stop_button(self.activity.tw) + self.stepproject.set_icon("run-slowoff") + self.runproject.set_icon("run-fastoff") + + 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')) + else: + self.hideshow.set_icon("hideshowoff") + self.hideshow.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')) + else: + self.blocks.set_icon("blocksoff") + self.blocks.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')) + + def do_eraser(self, button): + self.eraser.set_icon("eraseroff") + tawindow.eraser_button(self.activity.tw) + gobject.timeout_add(250,self.eraser.set_icon,"eraseron") + def do_samples(self, button): tawindow.load_file(self.activity.tw) -# self.activity.jobject_new_patch() def do_savelogo(self, button): # write logo code out to datastore - print "saving logo code" + self.savelogo.set_icon("logo-saveon") # grab code from stacks - logocode = self.save_logo(self.activity.tw) + logocode = save_logo(self,self.activity.tw) if len(logocode) == 0: return filename = "logosession.lg" @@ -202,14 +351,15 @@ class ProjectToolbar(gtk.Toolbar): # 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). + # 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) + file_path = os.path.join(self.activity.get_activity_root(), \ + 'instance', filename) f = open(file_path, 'w') try: f.write(logocode) @@ -220,4 +370,6 @@ class ProjectToolbar(gtk.Toolbar): file_dsobject.set_file_path(file_path) datastore.write(file_dsobject) + gobject.timeout_add(250,self.savelogo.set_icon, "logo-saveoff") return + |