Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tawindow.py35
-rwxr-xr-xturtleart.py47
2 files changed, 74 insertions, 8 deletions
diff --git a/tawindow.py b/tawindow.py
index 58bb43c..851d6da 100644
--- a/tawindow.py
+++ b/tawindow.py
@@ -62,7 +62,7 @@ from tautils import magnitude, get_load_name, get_save_name, data_from_file, \
collapsed, collapsible, hide_button_hit, show_button_hit, \
arithmetic_check, xy, find_block_to_run, find_top_block, \
find_start_stack, find_group, find_blk_below, olpc_xo_1, \
- dock_dx_dy
+ dock_dx_dy, data_to_string
from tasprite_factory import SVG, svg_str_to_pixbuf, svg_from_file
from sprites import Sprites, Sprite
@@ -74,6 +74,7 @@ class TurtleArtWindow():
timeout_tag = [0]
def __init__(self, win, path, parent=None, mycolors=None):
+ self._loaded_project = ""
self.win = None
self.parent = parent
if type(win) == gtk.DrawingArea:
@@ -252,6 +253,10 @@ class TurtleArtWindow():
return True
return False
+ def is_project_empty(self):
+ """ Check to see if project has any blocks in use """
+ return len(self.just_blocks()) == 1
+
def _expose_cb(self, win, event):
""" Repaint """
self.sprite_list.redraw_sprites()
@@ -1813,6 +1818,7 @@ class TurtleArtWindow():
def new_project(self):
""" Start a new project """
stop_logo(self)
+ self._loaded_project = ""
# Put current project in the trash.
while len(self.just_blocks()) > 0:
blk = self.just_blocks()[0]
@@ -1821,11 +1827,30 @@ class TurtleArtWindow():
self.canvas.clearscreen()
self.save_file_name = None
+ def is_new_project(self):
+ """ Is this a new project or was a old project loaded from a file? """
+ return self._loaded_project == ""
+
+ def project_has_changed(self):
+ """ WARNING: do we have any assurance that the JSON serialized data will have some predictable order? """
+ try:
+ f = open(self._loaded_project, 'r')
+ saved_project_data = f.read()
+ f.close()
+ except:
+ print "problem loading saved project data from %s" %\
+ (self._loaded_project)
+ saved_project_data = ""
+ current_project_data = data_to_string(self.assemble_data_to_save())
+
+ return saved_project_data != current_project_data
+
def load_files(self, ta_file, create_new_project=True):
""" Load a project from a file """
if create_new_project:
self.new_project()
self._check_collapsibles(self.process_data(data_from_file(ta_file)))
+ self._loaded_prokect = ta_file
def load_file(self, create_new_project=True):
_file_name, self.load_save_folder = get_load_name('.ta',
@@ -1981,13 +2006,13 @@ class TurtleArtWindow():
else:
self.process_data(data_from_file(ta_file))
- def save_file(self):
+ def save_file(self, _file_name=None):
""" Start a project to a file """
if self.save_folder is not None:
self.load_save_folder = self.save_folder
- _file_name, self.load_save_folder = get_save_name('.ta',
- self.load_save_folder,
- self.save_file_name)
+ if _file_name is None:
+ _file_name, self.load_save_folder = get_save_name('.ta',
+ self.load_save_folder, self.save_file_name)
if _file_name is None:
return
if _file_name[-3:] == '.ta':
diff --git a/turtleart.py b/turtleart.py
index e123aed..369bf44 100755
--- a/turtleart.py
+++ b/turtleart.py
@@ -117,8 +117,8 @@ class TurtleMain():
win.move(self.x, self.y)
win.maximize()
win.set_title(_("Turtle Art"))
- win.connect("delete_event", lambda w, e: gtk.main_quit())
-
+ # win.connect("delete_event", lambda w, e: gtk.main_quit())
+ win.connect("delete_event", self._quit_ta)
menu = gtk.Menu()
menu_items = gtk.MenuItem(_("New"))
@@ -151,7 +151,8 @@ class TurtleMain():
menu_items.show()
menu_items = gtk.MenuItem(_("Quit"))
menu.append(menu_items)
- menu_items.connect("activate", self.destroy)
+ # menu_items.connect("activate", self.destroy)
+ menu_items.connect("activate", self._quit_ta)
menu_items.show()
activity_menu = gtk.MenuItem(_("File"))
@@ -304,6 +305,37 @@ class TurtleMain():
self.tw.run_button(0)
self.tw.save_as_image(self.ta_file, canvas)
+ def _quit_ta(self, widget = None, e = None):
+ """ Save changes on exit """
+ project_empty = self.tw.is_project_empty()
+ if not project_empty:
+ print "loaded_project = " + self.tw._loaded_project
+ if self.tw.is_new_project():
+ self._show_save_dialog(True)
+ else:
+ if self.tw.project_has_changes():
+ self._show_save_dialog(False)
+ else:
+ print "nothing to save..."
+ gtk.main_quit()
+
+ def _show_save_dialog(self, new_project = True):
+ """ Dialog for save project """
+ dlg = gtk.MessageDialog(parent=None, type=gtk.MESSAGE_INFO,
+ buttons=gtk.BUTTONS_OK_CANCEL,
+ message_format =\
+ _("You have un-saved work. Would you like to save before quitting?"))
+ dlg.set_title(_("Save project?"))
+ dlg.set_property("skip-taskbar-hint", False)
+
+ resp = dlg.run()
+ dlg.destroy()
+ if resp == gtk.RESPONSE_OK:
+ if new_project:
+ self._save_as()
+ else:
+ self._save_changes()
+
def _do_new_cb(self, widget):
""" Callback for new project. """
self.tw.new_project()
@@ -319,9 +351,18 @@ class TurtleMain():
def _do_save_as_cb(self, widget):
""" Callback for save-as project. """
+ self._save_as()
+
+ def _save_as(self):
+ """ Save as is called from callback and quit """
self.tw.save_file_name = None
self.tw.save_file()
+ def _save_changes(self):
+ """ Save changes to current project """
+ self.tw.save_file_name = None
+ self.tw.save_file(self.tw._loaded_project)
+
def _do_save_picture_cb(self, widget):
""" Callback for save canvas. """
self.tw.save_as_image()