I messed up the last commit. Oops!
[synfig.git] / synfig-studio / trunk / src / gtkmm / instance.cpp
index 2b3cf90..0c0f7ac 100644 (file)
@@ -199,16 +199,23 @@ studio::Instance::save_as(const synfig::String &file_name)
        return false;
 }
 
-bool
+Instance::Status
 studio::Instance::save()
 {
        // the filename will be set to "Synfig Animation 1" or some such when first created
        // and will be changed to an absolute path once it has been saved
        // so if it still begins with "Synfig Animation " then we need to ask where to save it
        if(get_file_name().find(DEFAULT_FILENAME_PREFIX)==0)
-               return dialog_save_as();
+               if (dialog_save_as())
+                       return STATUS_OK;
+               else
+                       return STATUS_CANCEL;
+
+       if (synfigapp::Instance::save())
+               return STATUS_OK;
 
-       return synfigapp::Instance::save();
+       App::dialog_error_blocking("Save - Error","Unable to save to '" + get_file_name() + "'");
+       return STATUS_ERROR;
 }
 
 bool
@@ -276,9 +283,19 @@ studio::Instance::dialog_save_as()
 
                {
                        struct stat     s;
-                       // if stat() succeeds, or it fails with something other than 'file doesn't exist', the file exists
+                       int stat_return = stat(filename.c_str(), &s);
+
+                       // if stat() fails with something other than 'file doesn't exist', there's been a real
+                       // error of some kind.  let's give up now and ask for a new path.
+                       if (stat_return == -1 && errno != ENOENT)
+                       {
+                               perror(filename.c_str());
+                               App::dialog_error_blocking("SaveAs - Error","Unable to check whether '" + filename + "' exists.");
+                               continue;
+                       }
+
                        // if the file exists and the user doesn't want to overwrite it, keep prompting for a filename
-                       if ((stat(filename.c_str(), &s) != -1 || errno != ENOENT) &&
+                       if ((stat_return == 0) &&
                                !App::dialog_yes_no("File exists",
                                                                        "A file named '" +
                                                                        filename +
@@ -290,7 +307,7 @@ studio::Instance::dialog_save_as()
                if(save_as(filename))
                        return true;
 
-               App::dialog_error_blocking("SaveAs - Error","Unable to save file");
+               App::dialog_error_blocking("SaveAs - Error","Unable to save to '" + filename + "'");
        }
 
        return false;
@@ -626,16 +643,28 @@ Instance::safe_revert()
 bool
 Instance::safe_close()
 {
-       handle<synfigapp::UIInterface> uim;
-       uim=find_canvas_view(get_canvas())->get_ui_interface();
+       handle<CanvasView> canvas_view = find_canvas_view(get_canvas());
+       handle<synfigapp::UIInterface> uim=canvas_view->get_ui_interface();
 
+       // if the animation is currently playing, closing the window will cause a crash,
+       // so don't allow it
+       if (canvas_view->is_playing())
+       {
+               canvas_view->present();
+               App::dialog_error_blocking("Close Error", "The animation is currently playing so the window cannot be closed.");
+               return false;
+       }
        if(get_action_count())
                do
                {
                        string str=strprintf(_("Would you like to save your changes to %s?"),basename(get_file_name()).c_str() );
                        int answer=uim->yes_no_cancel(get_canvas()->get_name(),str,synfigapp::UIInterface::RESPONSE_YES);
                        if(answer==synfigapp::UIInterface::RESPONSE_YES)
-                               if (save()) break;
+                       {
+                               enum Status status = save();
+                               if (status == STATUS_OK) break;
+                               else if (status == STATUS_CANCEL) return false;
+                       }
                        if(answer==synfigapp::UIInterface::RESPONSE_NO)
                                break;
                        if(answer==synfigapp::UIInterface::RESPONSE_CANCEL)