**
** \legal
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+** Copyright (c) 2007 Chris Moore
**
** This package is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
{
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()
{
- 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)
+ if (dialog_save_as())
+ return STATUS_OK;
+ else
+ return STATUS_CANCEL;
- return synfigapp::Instance::save();
+ if (synfigapp::Instance::save())
+ return STATUS_OK;
+ App::dialog_error_blocking("Save - Error","Unable to save to '" + get_file_name() + "'");
+ return STATUS_ERROR;
}
-void
+bool
studio::Instance::dialog_save_as()
{
- string filename="*.sif";
-
+ string filename=basename(get_file_name());
Canvas::Handle canvas(get_canvas());
{
"other files first before trying to use \"SaveAs\"."
);
- return;
+ return false;
}
if(parent_layer)
break;
{
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))
- break;
+ 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;
}
void
studio::App::set_selected_instance(0);
}
else
- {
- studio::App::set_selected_canvas_view(studio::App::instance_list.front()->canvas_view_list().front());
- //studio::App::set_selected_instance(studio::App::instance_list.front());
- }
+ studio::App::instance_list.front()->canvas_view_list().front()->present();
}
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())
{
candidate_list.sort();
if(candidate_list.empty())
- synfig::warning("Action CandidateList is empty!");
+ synfig::warning("%s:%d Action CandidateList is empty!", __FILE__, __LINE__);
for(iter=candidate_list.begin();iter!=candidate_list.end();++iter)
{
candidate_list.sort();
if(candidate_list.empty())
- synfig::warning("Action CandidateList is empty!");
+ synfig::warning("%s:%d Action CandidateList is empty!", __FILE__, __LINE__);
for(iter=candidate_list.begin();iter!=candidate_list.end();++iter)
{
candidate_list.sort();
if(candidate_list.empty())
- synfig::warning("Action CandidateList is empty!");
+ synfig::warning("%s:%d Action CandidateList is empty!", __FILE__, __LINE__);
if(candidate_list2.empty())
- synfig::warning("Action CandidateList2 is empty!");
+ synfig::warning("%s:%d Action CandidateList2 is empty!", __FILE__, __LINE__);
// Seperate out the candidate lists so that there are no conflicts
for(iter=candidate_list.begin();iter!=candidate_list.end();++iter)