Working on 1796971: Make dialog_save_as() return a bool saying whether it saved anyth...
[synfig.git] / synfig-studio / trunk / src / gtkmm / instance.cpp
index a60e68a..fc45528 100644 (file)
@@ -2,7 +2,7 @@
 /*!    \file gtkmm/instance.cpp
 **     \brief writeme
 **
-**     $Id: instance.cpp,v 1.2 2005/01/13 18:37:30 darco Exp $
+**     $Id$
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
@@ -50,6 +50,8 @@
 #include "widget_waypointmodel.h"
 #include <gtkmm/actiongroup.h>
 #include "iconcontroler.h"
+#include <sys/stat.h>
+#include <errno.h>
 
 #endif
 
@@ -183,17 +185,6 @@ Instance::set_redo_status(bool x)
 }
 
 bool
-studio::Instance::save_as(const synfig::String &file_name)const
-{
-       if(synfigapp::Instance::save_as(file_name))
-       {
-               App::add_recent_file(file_name);
-               return true;
-       }
-       return false;
-}
-
-bool
 studio::Instance::save_as(const synfig::String &file_name)
 {
        if(synfigapp::Instance::save_as(file_name))
@@ -207,21 +198,19 @@ studio::Instance::save_as(const synfig::String &file_name)
 bool
 studio::Instance::save()
 {
-       if(basename(get_file_name()).find("untitled")==0)
-       {
-               dialog_save_as();
-               return true;
-       }
+       // 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();
 
        return synfigapp::Instance::save();
-
 }
 
-void
+bool
 studio::Instance::dialog_save_as()
 {
-       string filename="*.sif";
-
+       string filename=basename(get_file_name());
        Canvas::Handle canvas(get_canvas());
 
        {
@@ -242,7 +231,7 @@ studio::Instance::dialog_save_as()
                                                "other files first before trying to use \"SaveAs\"."
                                        );
 
-                                       return;
+                                       return false;
                                }
                                if(parent_layer)
                                        break;
@@ -250,15 +239,22 @@ studio::Instance::dialog_save_as()
                }
        }
 
-       while(App::dialog_saveas_file("SaveAs", filename))
+       // show the canvas' name if it has one, else its ID
+       while(App::dialog_save_file(_("Choose a Filename to Save As") +
+                                                               String(" (") +
+                                                               (canvas->get_name().empty()
+                                                                ? canvas->get_id()
+                                                                : canvas->get_name()) +
+                                                               ") ...", filename))
        {
                // If the filename still has wildcards, then we should
                // continue looking for the file we want
                if(find(filename.begin(),filename.end(),'*')!=filename.end())
                        continue;
 
-               if(find(filename.begin(),filename.end(),'.')==filename.end())
-                       filename+=".sif";
+               std::string base = basename(filename);
+               if(find(base.begin(),base.end(),'.')==base.end())
+                       filename+=".sifz";
 
                try
                {
@@ -274,11 +270,26 @@ studio::Instance::dialog_save_as()
                        continue;
                }
 
+               {
+                       struct stat     s;
+                       // if stat() succeeds, or it fails with something other than 'file doesn't exist', the file exists
+                       // 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) &&
+                               !App::dialog_yes_no("File exists",
+                                                                       "A file named '" +
+                                                                       filename +
+                                                                       "' already exists.\n\n"
+                                                                       "Do you want to replace it with the file you are saving?"))
+                               continue;
+               }
+
                if(save_as(filename))
-                       break;
+                       return true;
 
                App::dialog_error_blocking("SaveAs - Error","Unable to save file");
        }
+
+       return false;
 }
 
 void
@@ -602,7 +613,7 @@ bool
 Instance::safe_revert()
 {
        if(synfigapp::Instance::get_action_count())
-               if(!App::dialog_yes_no(_("Revert to saved"), _("You will loose any changes you have made since your last save.\nAre you sure?")))
+               if(!App::dialog_yes_no(_("Revert to saved"), _("You will lose any changes you have made since your last save.\nAre you sure?")))
                        return false;
        revert();
        return true;