From 3a392728a9047cbfde0db5cb14a9e2739506b65e Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Tue, 16 Nov 2010 18:49:54 +0000 Subject: Load python code toolbar button uses filesystem --- diff --git a/TurtleArt/tawindow.py b/TurtleArt/tawindow.py index 2402087..b77ba2c 100644 --- a/TurtleArt/tawindow.py +++ b/TurtleArt/tawindow.py @@ -117,6 +117,7 @@ class TurtleArtWindow(): self.path = path self.load_save_folder = os.path.join(path, 'samples') + self.py_load_save_folder = os.path.join(path, 'pysamples') self.save_folder = None self.save_file_name = None self.width = gtk.gdk.screen_width() @@ -1592,7 +1593,7 @@ class TurtleArtWindow(): if blk.name in NUMBER_STYLE_VAR_ARG: self._cascade_expandable(blk) grow_stack_arm(find_sandwich_top(blk)) - elif blk.name in PYTHON_SKIN and self.myblock is None: + elif blk.name in PYTHON_SKIN: # and self.myblock is None: self._import_py() else: self._start_audiograb() @@ -2142,23 +2143,70 @@ class TurtleArtWindow(): self.selected_blk.spr.set_label(s) self.selected_blk.values[0] = s.replace(RETURN, "\12") - def load_python_code(self): + def load_python_code_from_file(self): """ Load Python code from a file """ - fname, self.load_save_folder = get_load_name('.py', - self.load_save_folder) + id = None + fname, self.py_load_save_folder = get_load_name('.py', + self.py_load_save_folder) if fname is None: + return id + try: + f = open(fname, 'r') + self.myblock = f.read() + f.close() + id = fname + except: + _logger.error("Unable to read Python code from %s" % (fname)) + return id + + # add a new block for this code at turtle position + (tx, ty) = self.active_turtle.get_xy() + self._new_block('userdefined', tx, ty) + self.drag_group = None + + # if we are running Sugar, copy the file into the Journal + if self.running_sugar: + dsobject = datastore.create() + dsobject.metadata['title'] = os.path.basename(fname) + dsobject.metadata['icon-color'] = \ + profile.get_color().to_string() + dsobject.metadata['mime_type'] = 'text/x-python' + dsobject.metadata['activity'] = 'org.laptop.Pippy' + dsobject.set_file_path(fname) + try: + datastore.write(dsobject) + id = dsobject.object_id + except IOError: + _logger.error("Error copying %s to the datastore" % (fname)) + id = None + dsobject.destroy() + + return id + + def load_python_code_from_journal(self, dsobject): + """ Read the Python code from the Journal object """ + _logger.debug("chooser returned %s " % (str(dsobject))) + _logger.debug("file_path is %s " % (dsobject.file_path)) + try: + _logger.debug("opening %s " % dsobject.file_path) + file_handle = open(dsobject.file_path, "r") + self.myblock = file_handle.read() + file_handle.close() + except: + _logger.debug("couldn't open %s" % dsobject.file_path) return - f = open(fname, 'r') - self.myblock = f.read() - f.close() + + self.set_userdefined() + self.activity.metadata['python code'] = dsobject.object_id def _import_py(self): """ Import Python code into a block """ if self.running_sugar: - self.activity.import_py() + chooser(self.parent, 'org.laptop.Pippy', + self.load_python_code_from_journal) else: - self.load_python_code() - self.set_userdefined() + if self.load_python_code_from_file() is not None: + self.set_userdefined() def new_project(self): """ Start a new project """ @@ -2195,7 +2243,7 @@ class TurtleArtWindow(): if create_new_project: self.new_project() self._check_collapsibles(self.process_data(data_from_file(ta_file))) - self._loaded_prokect = ta_file + self._loaded_project = ta_file def load_file(self, create_new_project=True): _file_name, self.load_save_folder = get_load_name('.ta', diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py index 288697f..3253c2d 100644 --- a/TurtleArtActivity.py +++ b/TurtleArtActivity.py @@ -124,7 +124,9 @@ class TurtleArtActivity(activity.Activity): self._setup_canvas(canvas) - self._load_python_code() + if 'python code' in self.metadata: + self.tw.load_python_code_from_journal( + datastore.get(self.metadata['python code'])) self._setup_sharing() @@ -232,26 +234,11 @@ class TurtleArtActivity(activity.Activity): def do_load_python_cb(self, button): """ Load Python code from the Journal. """ self.load_python.set_icon("pippy-openon") - self.import_py() + object_id = self.tw.load_python_code_from_file() + if object_id is not None: + self.metadata['python code'] = object_id gobject.timeout_add(250, self.load_python.set_icon, "pippy-openoff") - def import_py(self): - """ Import Python code from the Journal to load into 'myblock'. """ - chooser(self, 'org.laptop.Pippy', self._load_python) - - def _load_python(self, dsobject): - """ Read the Python code from the Journal object """ - try: - _logger.debug("opening %s " % dsobject.file_path) - file_handle = open(dsobject.file_path, "r") - self.tw.myblock = file_handle.read() - file_handle.close() - self.tw.set_userdefined() - # save reference to Pythin code in the project metadata - self.metadata['python code'] = dsobject.object_id - except: - _logger.debug("couldn't open %s" % dsobject.file_path) - def do_save_as_image_cb(self, button): """ Save the canvas to the Journal. """ self.save_as_image.set_icon("image-saveon") @@ -792,14 +779,14 @@ class TurtleArtActivity(activity.Activity): self.save_as_image = _add_button('image-saveoff', _("Save as image"), self.do_save_as_image_cb, journal_toolbar_button) - self.load_python = _add_button('pippy-openoff', _("Load my block"), - self.do_load_python_cb, - journal_toolbar_button) self.load_ta_project = _add_button('load-from-journal', _("Import project from the Journal"), self.do_load_ta_project_cb, journal_toolbar_button) _add_separator(journal_toolbar) - self.samples_button = _add_button("stock-open", _('Samples'), + self.load_python = _add_button('pippy-openoff', _("Load Python block"), + self.do_load_python_cb, + journal_toolbar_button) + self.samples_button = _add_button("ta-open", _('Load example'), self.do_samples_cb, journal_toolbar_button) copy = _add_button('edit-copy', _('Copy'), self._copy_cb, edit_toolbar_button, 'c') @@ -912,25 +899,7 @@ class TurtleArtActivity(activity.Activity): if FILE.readline() == version: newversion = False except IOError: - _logger.debug("Creating a tamyblock.py Journal entry") - - # Make sure there is a copy of tamyblock.py in the Journal - if newversion: - dsobject = datastore.create() - dsobject.metadata['title'] = 'tamyblock.py' - dsobject.metadata['icon-color'] = \ - profile.get_color().to_string() - dsobject.metadata['mime_type'] = 'text/x-python' - dsobject.metadata['activity'] = 'org.laptop.Pippy' - dsobject.set_file_path(os.path.join(activity.get_bundle_path(), - 'TurtleArt/tamyblock.py')) - try: - datastore.write(dsobject) - except IOError: - _logger.error("Error copying %s to the datastore" % \ - (os.path.join(activity.get_bundle_path(), - 'TurtleArt/tamyblock.py'))) - dsobject.destroy() + _logger.debug("Couldn't read version number") versiondata.append(version) file_handle = open(os.path.join(datapath, filename), "w") @@ -954,14 +923,6 @@ class TurtleArtActivity(activity.Activity): else: # if new, load a start brick onto the canvas self.tw.load_start() - def _load_python_code(self): - """ Check to see if there is Python code to be loaded. """ - try: - dsobject = datastore.get(self.metadata['python code']) - self._load_python(dsobject) - except: - pass - def _setup_sharing(self): """ A simplistic sharing model: the sharer is the master """ # TODO: hand off role of master is sharer leaves -- cgit v0.9.1