X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=sidebyside;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fapp.cpp;h=27bdf4fb147ad4ce298ce94303f8ebf4f12ebc3c;hb=13dbd5e744738bc01ec52e030aa05b76c6099b21;hp=0d5fa8268c292d286a6a573b9168e6c2aecd33e2;hpb=9c5b887cee5a8100332e7e992df34a573066b917;p=synfig.git
diff --git a/synfig-studio/trunk/src/gtkmm/app.cpp b/synfig-studio/trunk/src/gtkmm/app.cpp
index 0d5fa82..27bdf4f 100644
--- a/synfig-studio/trunk/src/gtkmm/app.cpp
+++ b/synfig-studio/trunk/src/gtkmm/app.cpp
@@ -8,6 +8,7 @@
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
** Copyright (c) 2007, 2008 Chris Moore
** Copyright (c) 2008 Gerald Young
+** Copyright (c) 2008 Carlos López
**
** This package is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
@@ -274,6 +275,13 @@ bool studio::App::use_colorspace_gamma=true;
bool studio::App::single_threaded=false;
#endif
bool studio::App::restrict_radius_ducks=false;
+bool studio::App::resize_imported_images=false;
+String studio::App::custom_filename_prefix(DEFAULT_FILENAME_PREFIX);
+int studio::App::preferred_x_size=480;
+int studio::App::preferred_y_size=270;
+String studio::App::predefined_size(DEFAULT_PREDEFINED_SIZE);
+String studio::App::predefined_fps(DEFAULT_PREDEFINED_FPS);
+float studio::App::preferred_fps=24.0;
#ifdef USE_OPEN_FOR_URLS
String studio::App::browser_command("open"); // MacOS only
#else
@@ -316,6 +324,34 @@ class GlobalUIInterface : public synfigapp::UIInterface
{
public:
+ virtual Response confirmation(const std::string &title,
+ const std::string &primaryText,
+ const std::string &secondaryText,
+ const std::string &confirmPhrase,
+ const std::string &cancelPhrase,
+ Response defaultResponse)
+ {
+ Gtk::MessageDialog dialog(
+ primaryText, // Message
+ false, // Markup
+ Gtk::MESSAGE_WARNING, // Type
+ Gtk::BUTTONS_NONE, // Buttons
+ true // Modal
+ );
+
+ if (! title.empty())
+ dialog.set_title(title);
+ if (! secondaryText.empty())
+ dialog.set_secondary_text(secondaryText);
+
+ dialog.add_button(cancelPhrase, RESPONSE_CANCEL);
+ dialog.add_button(confirmPhrase, RESPONSE_OK);
+ dialog.set_default_response(defaultResponse);
+
+ dialog.show_all();
+ return (Response) dialog.run();
+ }
+
virtual Response yes_no(const std::string &title, const std::string &message,Response dflt=RESPONSE_YES)
{
Gtk::Dialog dialog(
@@ -506,11 +542,46 @@ public:
value=strprintf("%i",(int)App::restrict_radius_ducks);
return true;
}
+ if(key=="resize_imported_images")
+ {
+ value=strprintf("%i",(int)App::resize_imported_images);
+ return true;
+ }
if(key=="browser_command")
{
value=App::browser_command;
return true;
}
+ if(key=="custom_filename_prefix")
+ {
+ value=App::custom_filename_prefix;
+ return true;
+ }
+ if(key=="preferred_x_size")
+ {
+ value=strprintf("%i",App::preferred_x_size);
+ return true;
+ }
+ if(key=="preferred_y_size")
+ {
+ value=strprintf("%i",App::preferred_y_size);
+ return true;
+ }
+ if(key=="predefined_size")
+ {
+ value=strprintf("%s",App::predefined_size.c_str());
+ return true;
+ }
+ if(key=="preferred_fps")
+ {
+ value=strprintf("%f",App::preferred_fps);
+ return true;
+ }
+ if(key=="predefined_fps")
+ {
+ value=strprintf("%s",App::predefined_fps.c_str());
+ return true;
+ }
return synfigapp::Settings::get_value(key,value);
}
@@ -575,11 +646,50 @@ public:
App::restrict_radius_ducks=i;
return true;
}
+ if(key=="resize_imported_images")
+ {
+ int i(atoi(value.c_str()));
+ App::resize_imported_images=i;
+ return true;
+ }
if(key=="browser_command")
{
App::browser_command=value;
return true;
}
+ if(key=="custom_filename_prefix")
+ {
+ App::custom_filename_prefix=value;
+ return true;
+ }
+ if(key=="preferred_x_size")
+ {
+ int i(atoi(value.c_str()));
+ App::preferred_x_size=i;
+ return true;
+ }
+ if(key=="preferred_y_size")
+ {
+ int i(atoi(value.c_str()));
+ App::preferred_y_size=i;
+ return true;
+ }
+ if(key=="predefined_size")
+ {
+ App::predefined_size=value;
+ return true;
+ }
+ if(key=="preferred_fps")
+ {
+ float i(atof(value.c_str()));
+ App::preferred_fps=i;
+ return true;
+ }
+ if(key=="predefined_fps")
+ {
+ App::predefined_fps=value;
+ return true;
+ }
return synfigapp::Settings::set_value(key,value);
}
@@ -597,7 +707,14 @@ public:
#endif
ret.push_back("auto_recover_backup_interval");
ret.push_back("restrict_radius_ducks");
+ ret.push_back("resize_imported_images");
ret.push_back("browser_command");
+ ret.push_back("custom_filename_prefix");
+ ret.push_back("preferred_x_size");
+ ret.push_back("preferred_y_size");
+ ret.push_back("predefined_size");
+ ret.push_back("preferred_fps");
+ ret.push_back("predefined_fps");
return ret;
}
};
@@ -670,6 +787,8 @@ init_ui_manager()
DEFINE_ACTION("copy", Gtk::StockID("gtk-copy"));
DEFINE_ACTION("paste", Gtk::StockID("gtk-paste"));
DEFINE_ACTION("select-all-ducks", _("Select All Ducks"));
+ DEFINE_ACTION("unselect-all-ducks", _("Unselect All Ducks"));
+ DEFINE_ACTION("select-all-layers", _("Select All Layers"));
DEFINE_ACTION("unselect-all-layers", _("Unselect All Layers"));
DEFINE_ACTION("properties", _("Properties"));
@@ -798,8 +917,10 @@ init_ui_manager()
" "
" "
" "
-" "
+" "
" "
+" "
+" "
" "
" "
" "
@@ -925,7 +1046,7 @@ init_ui_manager()
}
// Add default keyboard accelerators
-#define ACCEL(path,accel) \
+#define ACCEL(accel,path) \
{ \
Gtk::AccelKey accel_key(accel,path); \
Gtk::AccelMap::add_entry(accel_key.get_path(), accel_key.get_key(), accel_key.get_mod()); \
@@ -937,93 +1058,80 @@ init_ui_manager()
Gtk::AccelMap::add_entry(accel_key.get_path(), accel_key.get_key(), accel_key.get_mod()); \
}
- ACCEL("//select-all-ducks","a");
- ACCEL("//unselect-all-layers","d");
- ACCEL("//render","F9");
- ACCEL("//preview","F11");
- ACCEL("//properties","F8");
- ACCEL("//options","F12");
- ACCEL("//import","i");
- ACCEL2(Gtk::AccelKey(GDK_Escape,static_cast(0),"//stop"));
- ACCEL("//toggle-grid-show","g");
- ACCEL("//toggle-grid-snap","l");
- ACCEL2(Gtk::AccelKey('`',Gdk::CONTROL_MASK,"//toggle-low-res"));
- ACCEL("//mask-position-ducks", "1");
- ACCEL("//mask-vertex-ducks", "2");
- ACCEL("//mask-tangent-ducks", "3");
- ACCEL("//mask-radius-ducks", "4");
- ACCEL("//mask-width-ducks", "5");
- ACCEL("//mask-angle-ducks", "6");
-
- ACCEL2(Gtk::AccelKey(GDK_Page_Up,Gdk::SHIFT_MASK,"//action-layer_raise"));
- ACCEL2(Gtk::AccelKey(GDK_Page_Down,Gdk::SHIFT_MASK,"//action-layer_lower"));
-
- ACCEL("//quality-01","1");
- ACCEL("//quality-02","2");
- ACCEL("//quality-03","3");
- ACCEL("//quality-04","4");
- ACCEL("//quality-05","5");
- ACCEL("//quality-06","6");
- ACCEL("//quality-07","7");
- ACCEL("//quality-08","8");
- ACCEL("//quality-09","9");
- ACCEL("//quality-10","0");
- ACCEL("//undo","z");
- ACCEL("//redo","r");
- ACCEL("//action-layer_remove","Delete");
-
-/* ACCEL2(Gtk::AccelKey(']',static_cast(0),"//jump-next-keyframe"));
- ACCEL2(Gtk::AccelKey('[',static_cast(0),"//jump-prev-keyframe"));
- ACCEL2(Gtk::AccelKey('=',static_cast(0),"//canvas-zoom-in"));
- ACCEL2(Gtk::AccelKey('-',static_cast(0),"//canvas-zoom-out"));
- ACCEL("//time-zoom-in","+");
- ACCEL("//time-zoom-out","_");
-*/
- ACCEL2(Gtk::AccelKey('(',Gdk::CONTROL_MASK,"//decrease-low-res-pixel-size"));
- ACCEL2(Gtk::AccelKey(')',Gdk::CONTROL_MASK,"//increase-low-res-pixel-size"));
-
- ACCEL2(Gtk::AccelKey('(',Gdk::MOD1_MASK|Gdk::CONTROL_MASK,"//amount-dec"));
- ACCEL2(Gtk::AccelKey(')',Gdk::MOD1_MASK|Gdk::CONTROL_MASK,"//amount-inc"));
-
- ACCEL2(Gtk::AccelKey(']',Gdk::CONTROL_MASK,"//jump-next-keyframe"));
- ACCEL2(Gtk::AccelKey('[',Gdk::CONTROL_MASK,"//jump-prev-keyframe"));
- ACCEL2(Gtk::AccelKey('=',Gdk::CONTROL_MASK,"//canvas-zoom-in"));
- ACCEL2(Gtk::AccelKey('-',Gdk::CONTROL_MASK,"//canvas-zoom-out"));
- ACCEL2(Gtk::AccelKey('+',Gdk::CONTROL_MASK,"//time-zoom-in"));
- ACCEL2(Gtk::AccelKey('_',Gdk::CONTROL_MASK,"//time-zoom-out"));
- ACCEL2(Gtk::AccelKey('.',Gdk::CONTROL_MASK,"//seek-next-frame"));
- ACCEL2(Gtk::AccelKey(',',Gdk::CONTROL_MASK,"//seek-prev-frame"));
- ACCEL2(Gtk::AccelKey('>',Gdk::CONTROL_MASK,"//seek-next-second"));
- ACCEL2(Gtk::AccelKey('<',Gdk::CONTROL_MASK,"//seek-prev-second"));
- ACCEL2(Gtk::AccelKey('o',Gdk::MOD1_MASK,"//toggle-onion-skin"));
- ACCEL("//play", "p");
- ACCEL("//seek-begin","Home");
- ACCEL("//seek-end","End");
-
- ACCEL("//state-normal", "a");
- ACCEL("//state-smooth_move", "v");
- ACCEL("//state-scale", "d");
- ACCEL("//state-rotate", "s");
-
- ACCEL("//state-bline", "b");
- ACCEL("//state-circle", "c");
- ACCEL("//state-rectangle", "r");
- ACCEL("//state-gradient", "g");
-
- ACCEL("//state-eyedrop", "e");
- ACCEL("//state-fill", "f");
- ACCEL("//state-zoom", "z");
- ACCEL("//state-polygon", "p");
-
- ACCEL("//state-draw", "w");
- ACCEL("//state-sketch", "k");
- ACCEL("//state-width", "t");
- ACCEL("//state-mirror", "m");
-
- ACCEL("//state-text", "x");
- ACCEL("//state-star", "q");
-
- ACCEL("//canvas-zoom-fit","z");
+ // the toolbox
+ ACCEL("a", "//state-normal" );
+ ACCEL("v", "//state-smooth_move" );
+ ACCEL("s", "//state-scale" );
+ ACCEL("t", "//state-rotate" );
+ ACCEL("m", "//state-mirror" );
+ ACCEL("c", "//state-circle" );
+ ACCEL("r", "//state-rectangle" );
+ ACCEL("q", "//state-star" );
+ ACCEL("g", "//state-gradient" );
+ ACCEL("p", "//state-polygon" );
+ ACCEL("b", "//state-bline" );
+ ACCEL("x", "//state-text" );
+ ACCEL("f", "//state-fill" );
+ ACCEL("e", "//state-eyedrop" );
+ ACCEL("z", "//state-zoom" );
+ ACCEL("d", "//state-draw" );
+ ACCEL("k", "//state-sketch" );
+ ACCEL("w", "//state-width" );
+
+ // everything else
+ ACCEL("a", "//select-all-ducks" );
+ ACCEL("d", "//unselect-all-ducks" );
+ ACCEL("a", "//select-all-layers" );
+ ACCEL("d", "//unselect-all-layers" );
+ ACCEL("F9", "//render" );
+ ACCEL("F11", "//preview" );
+ ACCEL("F8", "//properties" );
+ ACCEL("F12", "//options" );
+ ACCEL("i", "//import" );
+ ACCEL2(Gtk::AccelKey(GDK_Escape,static_cast(0), "//stop" ));
+ ACCEL("g", "//toggle-grid-show" );
+ ACCEL("l", "//toggle-grid-snap" );
+ ACCEL2(Gtk::AccelKey('`',Gdk::CONTROL_MASK, "//toggle-low-res" ));
+ ACCEL("1", "//mask-position-ducks" );
+ ACCEL("2", "//mask-vertex-ducks" );
+ ACCEL("3", "//mask-tangent-ducks" );
+ ACCEL("4", "//mask-radius-ducks" );
+ ACCEL("5", "//mask-width-ducks" );
+ ACCEL("6", "//mask-angle-ducks" );
+ ACCEL2(Gtk::AccelKey(GDK_Page_Up,Gdk::SHIFT_MASK, "//action-LayerRaise" ));
+ ACCEL2(Gtk::AccelKey(GDK_Page_Down,Gdk::SHIFT_MASK, "//action-LayerLower" ));
+ ACCEL("1", "//quality-01" );
+ ACCEL("2", "//quality-02" );
+ ACCEL("3", "//quality-03" );
+ ACCEL("4", "//quality-04" );
+ ACCEL("5", "//quality-05" );
+ ACCEL("6", "//quality-06" );
+ ACCEL("7", "//quality-07" );
+ ACCEL("8", "//quality-08" );
+ ACCEL("9", "//quality-09" );
+ ACCEL("0", "//quality-10" );
+ ACCEL("z", "//undo" );
+ ACCEL("r", "//redo" );
+ ACCEL2(Gtk::AccelKey(GDK_Delete,Gdk::CONTROL_MASK, "//action-LayerRemove" ));
+ ACCEL2(Gtk::AccelKey('(',Gdk::CONTROL_MASK, "//decrease-low-res-pixel-size" ));
+ ACCEL2(Gtk::AccelKey(')',Gdk::CONTROL_MASK, "//increase-low-res-pixel-size" ));
+ ACCEL2(Gtk::AccelKey('(',Gdk::MOD1_MASK|Gdk::CONTROL_MASK, "//amount-dec" ));
+ ACCEL2(Gtk::AccelKey(')',Gdk::MOD1_MASK|Gdk::CONTROL_MASK, "//amount-inc" ));
+ ACCEL2(Gtk::AccelKey(']',Gdk::CONTROL_MASK, "//jump-next-keyframe" ));
+ ACCEL2(Gtk::AccelKey('[',Gdk::CONTROL_MASK, "//jump-prev-keyframe" ));
+ ACCEL2(Gtk::AccelKey('=',Gdk::CONTROL_MASK, "//canvas-zoom-in" ));
+ ACCEL2(Gtk::AccelKey('-',Gdk::CONTROL_MASK, "//canvas-zoom-out" ));
+ ACCEL2(Gtk::AccelKey('+',Gdk::CONTROL_MASK, "//time-zoom-in" ));
+ ACCEL2(Gtk::AccelKey('_',Gdk::CONTROL_MASK, "//time-zoom-out" ));
+ ACCEL2(Gtk::AccelKey('.',Gdk::CONTROL_MASK, "//seek-next-frame" ));
+ ACCEL2(Gtk::AccelKey(',',Gdk::CONTROL_MASK, "//seek-prev-frame" ));
+ ACCEL2(Gtk::AccelKey('>',Gdk::CONTROL_MASK, "//seek-next-second" ));
+ ACCEL2(Gtk::AccelKey('<',Gdk::CONTROL_MASK, "//seek-prev-second" ));
+ ACCEL("o", "//toggle-onion-skin" );
+ ACCEL("z", "//canvas-zoom-fit" );
+ ACCEL("p", "//play" );
+ ACCEL("Home", "//seek-begin" );
+ ACCEL("End", "//seek-end" );
#undef ACCEL
}
@@ -1088,6 +1196,11 @@ App::App(int *argc, char ***argv):
// Initialize the Synfig library
try { synfigapp_main=etl::smart_ptr(new synfigapp::Main(etl::dirname((*argv)[0]),&synfig_init_cb)); }
+ catch(std::runtime_error x)
+ {
+ get_ui_interface()->error(strprintf("%s\n\n%s", _("Failed to initialize synfig!"), x.what()));
+ throw;
+ }
catch(...)
{
get_ui_interface()->error(_("Failed to initialize synfig!"));
@@ -1187,24 +1300,22 @@ App::App(int *argc, char ***argv):
studio_init_cb.task(_("Init ModMirror...")); module_list_.push_back(new ModMirror()); module_list_.back()->start();
/* row 2 */
- state_manager->add_state(&state_bline);
state_manager->add_state(&state_circle);
state_manager->add_state(&state_rectangle);
+ state_manager->add_state(&state_star);
state_manager->add_state(&state_gradient);
if(!getenv("SYNFIG_DISABLE_POLYGON")) state_manager->add_state(&state_polygon); // Enabled - for working without ducks
/* row 3 */
- if(!getenv("SYNFIG_DISABLE_DRAW" )) state_manager->add_state(&state_draw); // Enabled for now. Let's see whether they're good enough yet.
- if(!getenv("SYNFIG_DISABLE_SKETCH" )) state_manager->add_state(&state_sketch);
+ state_manager->add_state(&state_bline);
+ state_manager->add_state(&state_text);
state_manager->add_state(&state_fill);
state_manager->add_state(&state_eyedrop);
state_manager->add_state(&state_zoom);
- state_manager->add_state(&state_text);
- state_manager->add_state(&state_star);
-
- // Disabled by default - it doesn't work properly?
- if(getenv("SYNFIG_ENABLE_WIDTH" )) state_manager->add_state(&state_width);
+ if(!getenv("SYNFIG_DISABLE_DRAW" )) state_manager->add_state(&state_draw); // Enabled for now. Let's see whether they're good enough yet.
+ if(!getenv("SYNFIG_DISABLE_SKETCH" )) state_manager->add_state(&state_sketch);
+ if(!getenv("SYNFIG_DISABLE_WIDTH" )) state_manager->add_state(&state_width); // Enabled since 0.61.09
studio_init_cb.task(_("Init ModPalette..."));
module_list_.push_back(new ModPalette()); module_list_.back()->start();
@@ -1215,7 +1326,7 @@ App::App(int *argc, char ***argv):
studio_init_cb.task(_("Init Input Dialog..."));
dialog_input=new Gtk::InputDialog();
dialog_input->get_close_button()->signal_clicked().connect( sigc::mem_fun( *dialog_input, &Gtk::InputDialog::hide ) );
- dialog_input->get_save_button()->signal_clicked().connect( sigc::ptr_fun(studio::App::dialog_not_implemented) );
+ dialog_input->get_save_button()->signal_clicked().connect( sigc::mem_fun( *device_tracker, &DeviceTracker::save_preferences) );
studio_init_cb.task(_("Init auto recovery..."));
auto_recover=new AutoRecover();
@@ -1223,6 +1334,8 @@ App::App(int *argc, char ***argv):
studio_init_cb.amount_complete(9250,10000);
studio_init_cb.task(_("Loading Settings..."));
load_settings();
+ device_tracker->load_preferences();
+
studio_init_cb.task(_("Checking auto-recover..."));
studio_init_cb.amount_complete(9900,10000);
@@ -1231,12 +1344,13 @@ App::App(int *argc, char ***argv):
if(auto_recover->recovery_needed())
{
splash_screen.hide();
- if (get_ui_interface()->yes_no(_("Auto Recovery"),
- _("Synfig Studio seems to have crashed\n"
- "before you could save all your files.\n"
- "Would you like to re-open those files\n"
- "and recover your unsaved changes?")) ==
- synfigapp::UIInterface::RESPONSE_YES)
+ if (get_ui_interface()->confirmation("Crash Recovery",
+ _("Auto recovery file found"),
+ _("Synfig Studio seems to have crashed\n"
+ "before you could save all your files.\n"
+ "Recover unsaved changes?"),
+ _("Recover"), _("Ignore"))
+ == synfigapp::UIInterface::RESPONSE_OK)
{
int number_recovered;
if(!auto_recover->recover(number_recovered))
@@ -1311,7 +1425,7 @@ App::~App()
delete auto_recover;
delete about;
-
+
toolbox->hide();
// studio::App::iteration(false);
@@ -1379,7 +1493,8 @@ App::set_recent_file_window_size(etl::handle instance)
// find the canvas
synfig::Canvas::Handle canvas;
try {
- canvas = instance->get_canvas()->find_canvas(String(canvas_window_size, current, separator-current));
+ String warnings;
+ canvas = instance->get_canvas()->find_canvas(String(canvas_window_size, current, separator-current), warnings);
}
catch(Exception::IDNotFound) {
// can't find the canvas; skip to the next canvas or return
@@ -1619,10 +1734,13 @@ App::load_settings()
{
if(!window_size_broken && !file_window_size)
window_size_broken = true;
- if(!window_size_broken)
- add_recent_file(recent_file,recent_file_window_size);
- else
- add_recent_file(recent_file);
+ if (std::ifstream(recent_file.c_str()))
+ {
+ if(!window_size_broken)
+ add_recent_file(recent_file,recent_file_window_size);
+ else
+ add_recent_file(recent_file);
+ }
}
}
if(!window_size_broken && file_window_size)
@@ -1671,6 +1789,13 @@ App::reset_initial_window_configuration()
synfigapp::Main::settings().set_value("pref.single_threaded","0");
#endif
synfigapp::Main::settings().set_value("pref.restrict_radius_ducks","0");
+ synfigapp::Main::settings().set_value("pref.resize_imported_images","0");
+ synfigapp::Main::settings().set_value("pref.custom_filename_prefix",DEFAULT_FILENAME_PREFIX);
+ synfigapp::Main::settings().set_value("pref.preferred_x_size","480");
+ synfigapp::Main::settings().set_value("pref.preferred_y_size","270");
+ synfigapp::Main::settings().set_value("pref.predefined_size",DEFAULT_PREDEFINED_SIZE);
+ synfigapp::Main::settings().set_value("pref.preferred_fps","24.0");
+ synfigapp::Main::settings().set_value("pref.predefined_fps",DEFAULT_PREDEFINED_FPS);
synfigapp::Main::settings().set_value("window.toolbox.pos","4 4");
}
@@ -1854,7 +1979,7 @@ App::dialog_open_file(const std::string &title, std::string &filename, std::stri
if(dialog->run() == GTK_RESPONSE_ACCEPT) {
filename = dialog->get_filename();
- info("Saving preference %s = '%s' in App::dialog_open_file()", preference.c_str(), dirname(filename).c_str());
+ // info("Saving preference %s = '%s' in App::dialog_open_file()", preference.c_str(), dirname(filename).c_str());
_preferences.set_value(preference, dirname(filename));
delete dialog;
return true;
@@ -2013,7 +2138,7 @@ App::dialog_save_file(const std::string &title, std::string &filename, std::stri
if (preference == ANIMATION_DIR_PREFERENCE)
set_file_version(synfig::ReleaseVersion(file_type_enum->get_value()));
filename = dialog->get_filename();
- info("Saving preference %s = '%s' in App::dialog_save_file()", preference.c_str(), dirname(filename).c_str());
+ // info("Saving preference %s = '%s' in App::dialog_save_file()", preference.c_str(), dirname(filename).c_str());
_preferences.set_value(preference, dirname(filename));
delete dialog;
return true;
@@ -2155,7 +2280,7 @@ try_open_url(const std::string &url)
try { Glib::spawn_async(".", command_line, Glib::SPAWN_SEARCH_PATH); }
// Failed, move on to the next one
catch(Glib::SpawnError& exception){ continue; }
- return true; // No exception means we succeeded!
+ return true; // No exception means we succeeded!
}
}
@@ -2279,8 +2404,9 @@ App::open_as(std::string filename,std::string as)
try
{
OneMoment one_moment;
+ String errors, warnings;
- etl::handle canvas(open_canvas_as(filename,as));
+ etl::handle canvas(open_canvas_as(filename,as,errors,warnings));
if(canvas && get_instance(canvas))
{
get_instance(canvas)->find_canvas_view(canvas)->present();
@@ -2290,9 +2416,12 @@ App::open_as(std::string filename,std::string as)
else
{
if(!canvas)
- throw (String)strprintf(_("Unable to open file \"%s\""),filename.c_str());
+ throw (String)strprintf(_("Unable to load \"%s\":\n\n"),filename.c_str()) + errors;
- if (as.find(DEFAULT_FILENAME_PREFIX) != 0)
+ if (warnings != "")
+ dialog_warning_blocking(_("Warnings"), strprintf("%s:\n\n%s", _("Warnings"), warnings.c_str()));
+
+ if (as.find(custom_filename_prefix.c_str()) != 0)
add_recent_file(as);
handle instance(Instance::create(canvas));
@@ -2313,6 +2442,11 @@ App::open_as(std::string filename,std::string as)
dialog_error_blocking(_("Error"), x);
return false;
}
+ catch(runtime_error x)
+ {
+ dialog_error_blocking(_("Error"), x.what());
+ return false;
+ }
catch(...)
{
dialog_error_blocking(_("Error"), _("Uncaught error on file open (BUG)"));
@@ -2328,19 +2462,21 @@ App::new_instance()
{
handle canvas=synfig::Canvas::create();
- String file_name(strprintf("%s%d", DEFAULT_FILENAME_PREFIX, Instance::get_count()+1));
+ String file_name(strprintf("%s%d", App::custom_filename_prefix.c_str(), Instance::get_count()+1));
canvas->set_name(file_name);
file_name += ".sifz";
- canvas->rend_desc().set_frame_rate(24.0);
+ canvas->rend_desc().set_frame_rate(preferred_fps);
canvas->rend_desc().set_time_start(0.0);
canvas->rend_desc().set_time_end(5.0);
canvas->rend_desc().set_x_res(DPI2DPM(72.0f));
canvas->rend_desc().set_y_res(DPI2DPM(72.0f));
- canvas->rend_desc().set_tl(Vector(-4,2.25));
- canvas->rend_desc().set_br(Vector(4,-2.25));
- canvas->rend_desc().set_w(480);
- canvas->rend_desc().set_h(270);
+ // The top left and botton right positions are expressed in units
+ // Original convention is that 1 unit = 60 pixels
+ canvas->rend_desc().set_tl(Vector(-(preferred_x_size/60.0)/2.0,(preferred_y_size/60.0)/2.0));
+ canvas->rend_desc().set_br(Vector((preferred_x_size/60.0)/2.0,-(preferred_y_size/60.0)/2.0));
+ canvas->rend_desc().set_w(preferred_x_size);
+ canvas->rend_desc().set_h(preferred_y_size);
canvas->rend_desc().set_antialias(1);
canvas->rend_desc().set_flags(RendDesc::PX_ASPECT|RendDesc::IM_SPAN);
canvas->set_file_name(file_name);