{
if(synfigapp::Instance::save_as(file_name))
{
+ // after changing the filename, update the render settings with the new filename
+ list<handle<CanvasView> >::iterator iter;
+ for(iter=canvas_view_list().begin();iter!=canvas_view_list().end();iter++)
+ (*iter)->render_settings.set_entry_filename();
App::add_recent_file(file_name);
return true;
}
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
{
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 +
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;
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(get_action_count())
+ // if the animation is currently playing, closing the window will cause a crash,
+ // so don't allow it
+ if (canvas_view->is_playing())
{
- 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)
- save();
- if(answer==synfigapp::UIInterface::RESPONSE_CANCEL)
- return false;
+ 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)
+ {
+ 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)
+ return false;
+ } while (true);
if(is_modified())
{