diff options
author | Walter Bender <walter@walter-laptop.(none)> | 2010-02-02 14:06:59 (GMT) |
---|---|---|
committer | Walter Bender <walter@walter-laptop.(none)> | 2010-02-02 14:06:59 (GMT) |
commit | b37468eb683bf91b363c8fcd17e7c0542937ded7 (patch) | |
tree | 68c74682fe5b90b78c81c1c2623b4318ca807cab | |
parent | acea321c04f73af26c2aeba04668415759a8c4a4 (diff) |
clean up of save code; clean up of skin sizing/positioning
-rw-r--r-- | TurtleArtActivity.py | 8 | ||||
-rw-r--r-- | block.py | 2 | ||||
-rw-r--r-- | constants.py | 11 | ||||
-rw-r--r-- | tautils.py | 24 | ||||
-rw-r--r-- | tawindow.py | 115 |
5 files changed, 81 insertions, 79 deletions
diff --git a/TurtleArtActivity.py b/TurtleArtActivity.py index fece777..df03b38 100644 --- a/TurtleArtActivity.py +++ b/TurtleArtActivity.py @@ -568,7 +568,8 @@ class TurtleArtActivity(activity.Activity): # sharer should send current state to joiner if self.initiating is True: _logger.debug("serialize the project and send to joiner") - text = self.tw.save_string() + data = self.tw.assemble_data_to_save(True, True) + text = data_to_string(data) self._send_event("I:" + text) self.tw.show_palette() elif text[0] == 'I': # receiving current state @@ -1203,8 +1204,9 @@ class EditToolbar(gtk.Toolbar): def _copy_cb(self, button): clipBoard = gtk.Clipboard() _logger.debug("serialize the project and copy to clipboard") - text = tawindow.serialize_stack(self.activity.tw) - if text is not None: + data = self.activity.tw.assemble_data_to_save(False, False) + if data is not []: + text = data_to_string(data) clipBoard.set_text(text) def _paste_cb(self, button): @@ -74,7 +74,7 @@ class Block: # debug code # etc. def __init__(self, block_list, sprite_list, name, x, y, type='block', - values=[], scale=2.0, colors=["#00FF00","#00A000"]): + values=[], scale=BLOCK_SCALE, colors=["#00FF00","#00A000"]): self.spr = None self.shapes = [] self.name = name diff --git a/constants.py b/constants.py index f64924e..6b0b382 100644 --- a/constants.py +++ b/constants.py @@ -76,7 +76,16 @@ ICON_SIZE = 55 SELECTED_COLOR = "#0000FF" SELECTED_STROKE_WIDTH = 1.5 STANDARD_STROKE_WIDTH = 1.0 - +THUMB_W = 80 +THUMB_H = 60 +PYTHON_X = 17 +PYTHON_Y = 8 +MEDIA_X = 37 +MEDIA_Y = 6 +PIXBUF_X = 17 +PIXBUF_Y = 2 +BLOCK_SCALE = 2.0 +PALETTE_DEFAULT_SCALE = 1.5 PALETTE_SCALE = {'template2x2':1.0, 'template1x2':1.0} # @@ -66,7 +66,6 @@ def json_dump(data): return io.getvalue() def get_load_name(suffix, load_save_folder): - print "get_load_name: %s %s" % (suffix, load_save_folder) dialog = gtk.FileChooserDialog("Load...", None, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, @@ -74,9 +73,21 @@ def get_load_name(suffix, load_save_folder): dialog.set_default_response(gtk.RESPONSE_OK) return do_dialog(dialog, suffix, load_save_folder) +def get_save_name(suffix, load_save_folder, save_file_name): + dialog = gtk.FileChooserDialog("Save...", None, + gtk.FILE_CHOOSER_ACTION_SAVE, + (gtk.STOCK_CANCEL, + gtk.RESPONSE_CANCEL, + gtk.STOCK_SAVE, + gtk.RESPONSE_OK)) + dialog.set_default_response(gtk.RESPONSE_OK) + if save_file_name is not None: + dialog.set_current_name(save_file_name+suffix) + return do_dialog(dialog, suffix, load_save_folder) + # # We try to maintain read-compatibility with all versions of Turtle Art. -# Try pickle first; then selfo different versions of json. +# Try pickle first; then different versions of json. # def data_from_file(ta_file): # Just open the .ta file, ignoring any .png file that might be present. @@ -91,8 +102,15 @@ def data_from_file(ta_file): f.close() return data +def data_to_file(data, ta_file): + f = file(ta_file, "w") + f.write(json_dump(data)) + f.close() + +def data_to_string(data): + return json_dump(data) + def do_dialog(dialog, suffix, load_save_folder): - print "do_dialog: %s %s" % (suffix, load_save_folder) result = None filter = gtk.FileFilter() filter.add_pattern('*'+suffix) diff --git a/tawindow.py b/tawindow.py index 8a7ea98..cb36e14 100644 --- a/tawindow.py +++ b/tawindow.py @@ -371,8 +371,9 @@ class TurtleArtWindow(): if self.palette_sprs[n][self.palette_orientation] is not None: self.palette_sprs[n][self.palette_orientation].set_layer( CATEGORY_LAYER) - self.palette_sprs[n][1-self.palette_orientation].set_layer( - HIDE_LAYER) + if self.palette_sprs[n][1-self.palette_orientation] is not None: + self.palette_sprs[n][1-self.palette_orientation].set_layer( + HIDE_LAYER) for i in range(len(PALETTES)): self.selectors[i].set_layer(TAB_LAYER) @@ -390,13 +391,12 @@ class TurtleArtWindow(): self.toolbar_spr.set_layer(CATEGORY_LAYER) if self.palettes[n] == []: - print "%d: %d" % (n,self.palette_orientation) for i, name in enumerate(PALETTES[n]): # Some blocks are too big to fit the palette. if PALETTE_SCALE.has_key(name): scale = PALETTE_SCALE[name] else: - scale = 1.5 + scale = PALETTE_DEFAULT_SCALE self.palettes[n].append(Block(self.block_list, self.sprite_list, name, 0, 0, 'proto', [], scale)) @@ -405,10 +405,12 @@ class TurtleArtWindow(): # Some blocks get a skin. if name in BOX_STYLE_MEDIA: self.palettes[n][i].spr.set_image(self.media_shapes[ - name+'small'], 1, 28, 7) + name+'small'], 1, int(MEDIA_X*scale/BLOCK_SCALE), + int(MEDIA_Y*scale/BLOCK_SCALE)) elif name == 'nop': self.palettes[n][i].spr.set_image(self.media_shapes[ - 'pythonsmall'], 1, 10, 7) + 'pythonsmall'], 1, int(PYTHON_X*scale/BLOCK_SCALE), + int(PYTHON_Y*scale/BLOCK_SCALE)) self._layout_palette(n) for blk in self.palettes[n]: blk.spr.set_layer(CATEGORY_LAYER) @@ -1102,10 +1104,10 @@ class TurtleArtWindow(): self._load_image(dsobject, blk) elif blk.name == 'audio': blk.spr.set_image(self.media_shapes['audioon'], - 1, 37, 6) + 1, MEDIA_X, MEDIA_Y) else: blk.spr.set_image(self.media_shapes['descriptionon'], - 1, 37, 6) + 1, MEDIA_X, MEDIA_Y) if len(blk.values)>0: blk.values[0] = dsobject.object_id else: @@ -1120,16 +1122,16 @@ class TurtleArtWindow(): if fname is None: return if movie_media_type(fname[-4:]): - blk.spr.set_image(self.media_shapes['journalon'], 1, 37, 6) + blk.spr.set_image(self.media_shapes['journalon'], 1, MEDIA_X, MEDIA_Y) elif blk.name == 'audio' or audio_media_type(fname[-4:]): - blk.spr.set_image(self.media_shapes['audioon'], 1, 37, 6) + blk.spr.set_image(self.media_shapes['audioon'], 1, MEDIA_X, MEDIA_Y) blk.name = 'audio' elif blk.name == 'description': - blk.spr.set_image(self.media_shapes['descriptionon'], 1, 37, 6) + blk.spr.set_image(self.media_shapes['descriptionon'], 1, MEDIA_X, MEDIA_Y) else: - pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(fname, 80, 60) + pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(fname, THUMB_W, THUMB_H) if pixbuf is not None: - blk.spr.set_image(pixbuf, 1, 17, 2) + blk.spr.set_image(pixbuf, 1, PIXBUF_X, PIXBUF_Y) blk.values[0] = fname blk.spr.set_label(' ') @@ -1137,11 +1139,11 @@ class TurtleArtWindow(): Replace Journal block graphic with preview image """ def _load_image(self, picture, blk): - pixbuf = get_pixbuf_from_journal(picture, 80, 60) + pixbuf = get_pixbuf_from_journal(picture, THUMB_W, THUMB_H) if pixbuf is not None: - blk.spr.set_image(pixbuf, 1, 17, 2) + blk.spr.set_image(pixbuf, 1, PIXBUF_X, PIXBUF_Y) else: - blk.spr.set_image(self.media_shapes['descriptionon'], 1, 37, 6) + blk.spr.set_image(self.media_shapes['descriptionon'], 1, MEDIA_X, MEDIA_Y) """ Run stack @@ -1170,7 +1172,8 @@ class TurtleArtWindow(): """ def _in_the_trash(self, x, y): if self.selected_palette == self.trash_index and \ - self.palette_sprs[self.trash_index].hit((x,y)): + self.palette_sprs[self.trash_index][self.palette_orientation].hit( + (x,y)): return True return False @@ -1197,11 +1200,11 @@ class TurtleArtWindow(): # Add special skin to some blocks if name == 'nop': if self.nop == 'pythonloaded': - newblk.spr.set_image(self.media_shapes['pythonon'], 1, 17, 8) + newblk.spr.set_image(self.media_shapes['pythonon'], 1, PYTHON_X, PYTHON_Y) else: - newblk.spr.set_image(self.media_shapes['pythonoff'], 1, 17, 8) + newblk.spr.set_image(self.media_shapes['pythonoff'], 1, PYTHON_X, PYTHON_Y) elif name in BOX_STYLE_MEDIA: - newblk.spr.set_image(self.media_shapes[name+'off'], 1, 27, 8) + newblk.spr.set_image(self.media_shapes[name+'off'], 1, MEDIA_X, MEDIA_Y) newblk.spr.set_label(' ') newspr = newblk.spr newspr.set_layer(TOP_LAYER) @@ -1235,7 +1238,7 @@ class TurtleArtWindow(): nx, ny = sx+dock[2]-argdock[2], sy+dock[3]-argdock[3] if argname == 'journal': argblk.spr.set_image(self.media_shapes['journaloff'], - 1, 37, 6) + 1, MEDIA_X, MEDIA_Y) argblk.spr.set_label(' ') argblk.spr.move((nx, ny)) argblk.spr.set_layer(TOP_LAYER) @@ -1496,9 +1499,9 @@ class TurtleArtWindow(): # Some blocks get a skin. if btype == 'nop': if self.nop == 'pythonloaded': - blk.spr.set_image(self.media_shapes['pythonon'], 1, 17, 8) + blk.spr.set_image(self.media_shapes['pythonon'], 1, PYTHON_X, PYTHON_Y) else: - blk.spr.set_image(self.media_shapes['pythonoff'], 1, 17, 8) + blk.spr.set_image(self.media_shapes['pythonoff'], 1, PYTHON_X, PYTHON_Y) blk.spr.set_label(' ') elif btype in EXPANDABLE: if btype == 'vspace': @@ -1510,40 +1513,40 @@ class TurtleArtWindow(): dy = blk.add_arg() elif btype in BOX_STYLE_MEDIA and len(blk.values)>0: if blk.values[0] == 'None': - blk.spr.set_image(self.media_shapes[btype+'off'], 1, 37, 6) + blk.spr.set_image(self.media_shapes[btype+'off'], 1, MEDIA_X, MEDIA_Y) elif btype == 'audio' or btype == 'description': - blk.spr.set_image(self.media_shapes[btype+'on'], 1, 37, 6) + blk.spr.set_image(self.media_shapes[btype+'on'], 1, MEDIA_X, MEDIA_Y) elif self.running_sugar: try: dsobject = datastore.get(blk.values[0]) if not movie_media_type(dsobject.file_path[-4:]): - pixbuf = get_pixbuf_from_journal(dsobject, 80, 60) + pixbuf = get_pixbuf_from_journal(dsobject, THUMB_W, THUMB_H) if pixbuf is not None: - blk.spr.set_image(pixbuf, 1, 17, 2) + blk.spr.set_image(pixbuf, 1, PIXBUF_X, PIXBUF_Y) else: blk.spr.set_image( - self.media_shapes['journalon'], 1, 37, 6) + self.media_shapes['journalon'], 1, MEDIA_X, MEDIA_Y) dsobject.destroy() except: print "couldn't open dsobject (%s)" % (blk.values[0]) blk.spr.set_image(self.media_shapes['journaloff'], - 1, 37, 6) + 1, MEDIA_X, MEDIA_Y) else: if not movie_media_type(blk.values[0][-4:]): try: pixbuf = gtk.gdk.pixbuf_new_from_file_at_size( - blk.values[0], 80, 60) - blk.spr.set_image(pixbuf, 1, 17, 2) + blk.values[0], THUMB_W, THUMB_H) + blk.spr.set_image(pixbuf, 1, PIXBUF_X, PIXBUF_Y) except: blk.spr.set_image(self.media_shapes['journaloff'], - 1, 37, 6) + 1, MEDIA_X, MEDIA_Y) else: - blk.spr.set_image(self.media_shapes['journalon'], 1, 37, 6) + blk.spr.set_image(self.media_shapes['journalon'], 1, MEDIA_X, MEDIA_Y) blk.spr.set_label(' ') blk.resize() elif btype in BOX_STYLE_MEDIA: blk.spr.set_label(' ') - blk.spr.set_image(self.media_shapes[btype+'off'], 1, 37, 6) + blk.spr.set_image(self.media_shapes[btype+'off'], 1, MEDIA_X, MEDIA_Y) blk.spr.set_layer(BLOCK_LAYER) return blk @@ -1564,45 +1567,23 @@ class TurtleArtWindow(): def save_file(self): if self.save_folder is not None: self.load_save_folder = self.save_folder - fname = self._get_save_name() + fname, self.load_save_folder = get_save_name('.ta', + self.load_save_folder, + self.save_file_name) if fname is None: return if fname[-3:]=='.ta': fname=fname[0:-3] - save_data(self,fname+".ta") + data = self.assemble_data_to_save() + data_to_file(data, fname+'.ta') self.save_file_name = os.path.basename(fname) - def _get_save_name(self): - dialog = gtk.FileChooserDialog("Save...", None, - gtk.FILE_CHOOSER_ACTION_SAVE, - (gtk.STOCK_CANCEL, - gtk.RESPONSE_CANCEL, - gtk.STOCK_SAVE, - gtk.RESPONSE_OK)) - dialog.set_default_response(gtk.RESPONSE_OK) - if self.save_file_name is not None: - dialog.set_current_name(self.save_file_name+'.ta') - result, self.load_save_folder = self.do_dialog(dialog, '.ta') - return result - - def save_data(self, fname): - f = file(fname, "w") - data = self._assemble_data_to_save() - f.write(json_dump(data)) - f.close() - - # Used to send data across a shared session - def save_string(self, save_turtle=True): - data = self._assemble_data_to_save(save_turtle) - return json_dump(data) - - def _assemble_data_to_save(self, save_turtle=True): + def assemble_data_to_save(self, save_turtle=True, save_project=True): + # TODO: if save_project is False: just the current stack data = [] for i, b in enumerate(self._just_blocks()): b.id = i for b in self._just_blocks(): - if b.type is not 'block': - continue if b.name in CONTENT_BLOCKS: if len(b.values)>0: name = (b.name, b.values[0]) @@ -1633,11 +1614,3 @@ class TurtleArtWindow(): self.canvas.pensize)) return data - # Serialize a stack to save to the clipboard - # TODO: check to make sure just the stack and not the project is saved - def serialize_stack(self): - data = self._assemble_data_to_save(False) - if data == []: - return None - return json_dump(data) - |