From e919e66c00be8e1801013e85e14ba6ad882cf1ec Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Sat, 05 Jun 2010 21:01:27 +0000 Subject: save on quit --- 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() -- cgit v0.9.1