From f55fe02ea3bdf7b064bd5314c740495a95174a98 Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Mon, 22 Dec 2008 20:01:24 +0000 Subject: UCB logo export Image cache check --- (limited to 'TurtleArtActivity.py') diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py index b5160a8..88dfa8b 100644 --- a/TurtleArtActivity.py +++ b/TurtleArtActivity.py @@ -19,6 +19,8 @@ #THE SOFTWARE. import tawindow +import talogo + import pygtk pygtk.require('2.0') import gtk @@ -46,6 +48,7 @@ def debug_tick(): import sugar from sugar.activity import activity from sugar.graphics.toolbutton import ToolButton +from sugar.graphics.menuitem import MenuItem from sugar.datastore import datastore from sugar import profile from gettext import gettext as _ @@ -75,12 +78,33 @@ 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'] + 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)): lang = 'en' + # test to see if lang or version has changed since last time + # if so, remove any old png files as they will need to be regenerated + filename = "version.dat" + versiondata = [] + + try: + FILE = open(os.path.join(activity.get_activity_root(),"data",filename),"r") + if FILE.readline() == lang + version: + print "the version data hasn't changed" + else: + print "out with the old version data", + 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.writelines(versiondata) + FILE.close() + self.tw = tawindow.twNew(canvas,activity.get_bundle_path(),lang,tboxh,self) self.tw.activity = self self.tw.window.grab_focus() @@ -136,7 +160,6 @@ class TurtleArtActivity(activity.Activity): shutil.rmtree(tmpdir) tar_fd.close() - def jobject_new_patch(self): oldj = self._jobject self._jobject = datastore.create() @@ -153,7 +176,6 @@ class TurtleArtActivity(activity.Activity): reply_handler=self._internal_jobject_create_cb, error_handler=self._internal_jobject_error_cb) - def clear_journal(self): jobjects, total_count = datastore.find({'activity': 'org.laptop.TurtleArtActivity'}) print 'found', total_count, 'entries' @@ -161,9 +183,8 @@ class TurtleArtActivity(activity.Activity): print jobject.object_id datastore.delete(jobject.object_id) - - class ProjectToolbar(gtk.Toolbar): + def __init__(self, pc): gtk.Toolbar.__init__(self) self.activity = pc @@ -175,8 +196,213 @@ class ProjectToolbar(gtk.Toolbar): self.insert(self.sampb, -1) self.sampb.show() + # UCB Logo save source button + self.savelogo = ToolButton( "UCB-save" ) + self.savelogo.set_tooltip(_('UCB Logo')) + self.savelogo.props.sensitive = True + self.savelogo.connect('clicked', self.do_savelogo) + self.insert(self.savelogo, -1) + self.savelogo.show() 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" + # grab code from stacks + logocode = self.save_logo(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) + return + + def save_logo(self, tw): + color_processing = "\ +to tasetpalette :i :r :g :b :myshade \r\ +make \"s ((:myshade - 50) / 50) \r\ +ifelse lessp :s 0 [ \r\ +make \"s (1 + (:s *0.8)) \r\ +make \"r (:r * :s) \r\ +make \"g (:g * :s) \r\ +make \"b (:b * :s) \r\ +] [ \ +make \"s (:s * 0.9) \r\ +make \"r (:r + ((100-:r) * :s)) \r\ +make \"g (:g + ((100-:g) * :s)) \r\ +make \"b (:b + ((100-:b) * :s)) \r\ +] \ +setpalette :i (list :r :g :b) \r\ +end \r\ +\ +to rgb :myi :mycolors :myshade \r\ +make \"myr first :mycolors \r\ +make \"mycolors butfirst :mycolors \r\ +make \"myg first :mycolors \r\ +make \"mycolors butfirst :mycolors \r\ +make \"myb first :mycolors \r\ +make \"mycolors butfirst :mycolors \r\ +tasetpalette :myi :myr :myg :myb :myshade \r\ +output :mycolors \r\ +end \r\ +\ +to processcolor :mycolors :myshade \r\ +if emptyp :mycolors [stop] \r\ +make \"i :i + 1 \r\ +processcolor (rgb :i :mycolors :myshade) :myshade \r\ +end \r\ +\ +to tasetshade :shade \r\ +make \"myshade modulo :shade 200 \r\ +if greaterp :myshade 99 [make \"myshade (199-:myshade)] \r\ +make \"i 7 \r\ +make \"mycolors :colors \r\ +processcolor :mycolors :myshade \r\ +end \r\ +\ +to tasetpencolor :c \r\ +make \"color (modulo (round :c) 100) \r\ +setpencolor :color + 8 \r\ +end \r\ +\ +make \"colors [ \ +100 0 0 100 5 0 100 10 0 100 15 0 100 20 0 100 25 0 100 30 0 100 35 0 100 40 0 100 45 0 \ +100 50 0 100 55 0 100 60 0 100 65 0 100 70 0 100 75 0 100 80 0 100 85 0 100 90 0 100 95 0 \ +100 100 0 90 100 0 80 100 0 70 100 0 60 100 0 50 100 0 40 100 0 30 100 0 20 100 0 10 100 0 \ +0 100 0 0 100 5 0 100 10 0 100 15 0 100 20 0 100 25 0 100 30 0 100 35 0 100 40 0 100 45 \ +0 100 50 0 100 55 0 100 60 0 100 65 0 100 70 0 100 75 0 100 80 0 100 85 0 100 90 0 100 95 \ +0 100 100 0 95 100 0 90 100 0 85 100 0 80 100 0 75 100 0 70 100 0 65 100 0 60 100 0 55 100 \ +0 50 100 0 45 100 0 40 100 0 35 100 0 30 100 0 25 100 0 20 100 0 15 100 0 10 100 0 5 100 \ +0 0 100 5 0 100 10 0 100 15 0 100 20 0 100 25 0 100 30 0 100 35 0 100 40 0 100 45 0 100 \ +50 0 100 55 0 100 60 0 100 65 0 100 70 0 100 75 0 100 80 0 100 85 0 100 90 0 100 95 0 100 \ +100 0 100 100 0 90 100 0 80 100 0 70 100 0 60 100 0 50 100 0 40 100 0 30 100 0 20 100 0 10] \r\ +make \"shade 50 \r\ +tasetshade :shade \r" + + bs = tawindow.blocks(tw) + code = "" + random = 0 + fillscreen = 0 + setcolor = 0 + setxy = 0 + pensize = 0 + tastack = 0 + arc = 0 + for b in bs: + this_stack = "" + data = self.walk_stack(tw, b) + # need to catch several special cases: + # stacks, random, setshade, et al. + stack = 0 + for d in data: + if type(d) is float: + this_stack += str(d) + else: + # transalate some TA terms into UCB Logo + if d == "storeinbox1": + this_stack += "make \"box1" + elif d == "box1": + this_stack += ":box1" + elif d == "storeinbox2": + this_stack += "make \"box2" + elif d == "box2": + this_stack += ":box2" + elif d == "shade": + this_stack += ":shade" + elif d == "setshade": + setcolor = 1 + this_stack += "tasetshade" + elif d == "color": + this_stack += "pencolor" + elif d == "nop": + this_stack += " " + elif d == "nop1": + this_stack += "to stack1\r" + stack = 1 + elif d == "nop2": + this_stack += "to stack2\r" + stack = 1 + elif d == "clean": + this_stack += "clearscreen" + elif d == "setxy": + setxy = 1 + this_stack += "tasetxy" + elif d == "color": + this_stack += ":color" + elif d == "setcolor": + setcolor = 1 + this_stack += "tasetpencolor" + elif d == "fillscreen": + fillscreen = 1 + this_stack += "tasetbackground" + elif d == "random": + random = 1 + this_stack += "tarandom" + elif d == "pensize": + pensize = 1 + this_stack += "tapensize" + elif d == "arc": + arc = 1 + this_stack += "taarc" + else: + this_stack += d + this_stack += " " + if stack: + stack = 0 + # if it is not a stack, we need to add a "to ta#" label + elif len(data) > 0: + this_stack = "to ta" + str(tastack) + "\r" + this_stack + tastack += 1 + if len(data) > 0: + code += this_stack + code += "\rend\r" + # need to define some procedures + if random: # to avoid negative numbers + code = "to tarandom :min :max\routput (random (:max - :min)) + :min\rend\r" + code + if fillscreen: # set shade than background color + code = "to tasetbackground :color :shade\rtasetshade :shade\rsetbackground :color\rend\r" + code + if setcolor: # load palette + code = color_processing + code + if pensize: # return only first argument + code = "to tapensize\routput first round pensize\rend\r" + code + if setxy: # swap args and round args + code = "to tasetxy :y :x\rpenup\rsetxy :x :y\rpendown\rend\r" + code + if arc: + c = (2 * math.pi)/360 + code = "to taarc :a :r\rrepeat round :a [right 1 forward (" + str(c) + " * :r)]\rend\r" + code + code = "window\rsetscrunch 2 2\r" + code + 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.walk_blocks(tw.lc, top, tawindow.blocks(tw)) + else: + # not top of stack, then return empty list + return [] + -- cgit v0.9.1