X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fapp.cpp;h=871ac9a23dccca5ca4b219a49ef63abbd2357353;hb=756c0d29ac1742f231e6615f9a577e574e35a4af;hp=6380a9c5cd91692c8812b008f00d9b066b0f2af9;hpb=0487f6874f8d68440e26836dba776063d29e1be2;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/app.cpp b/synfig-studio/trunk/src/gtkmm/app.cpp index 6380a9c..871ac9a 100644 --- a/synfig-studio/trunk/src/gtkmm/app.cpp +++ b/synfig-studio/trunk/src/gtkmm/app.cpp @@ -6,7 +6,7 @@ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley -** Copyright (c) 2007 Chris Moore +** Copyright (c) 2007, 2008 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 @@ -52,9 +52,11 @@ #include #include +#include #include "app.h" #include "about.h" +#include "splash.h" #include "instance.h" #include "canvasview.h" #include "dialog_setup.h" @@ -84,6 +86,7 @@ #include "devicetracker.h" #include "dialog_tooloptions.h" +#include "widget_enum.h" #include "autorecover.h" @@ -222,6 +225,8 @@ const etl::handle& App::get_ui_interface() { return ui_i etl::handle App::selected_instance; etl::handle App::selected_canvas_view; +studio::About *studio::App::about=NULL; + studio::Toolbox *studio::App::toolbox=NULL; studio::AutoRecover *studio::App::auto_recover=NULL; @@ -257,6 +262,7 @@ std::list< etl::handle< studio::Module > > module_list_; bool studio::App::use_colorspace_gamma=true; bool studio::App::single_threaded=false; +bool studio::App::restrict_radius_ducks=false; static int max_recent_files_=25; int studio::App::get_max_recent_files() { return max_recent_files_; } @@ -477,6 +483,11 @@ public: value=strprintf("%i",App::auto_recover->get_timeout()); return true; } + if(key=="restrict_radius_ducks") + { + value=strprintf("%i",(int)App::restrict_radius_ducks); + return true; + } return synfigapp::Settings::get_value(key,value); } @@ -533,6 +544,12 @@ public: App::single_threaded=i; return true; } + if(key=="restrict_radius_ducks") + { + int i(atoi(value.c_str())); + App::restrict_radius_ducks=i; + return true; + } return synfigapp::Settings::set_value(key,value); } @@ -547,6 +564,7 @@ public: ret.push_back("use_colorspace_gamma"); ret.push_back("single_threaded"); ret.push_back("auto_recover_backup_interval"); + ret.push_back("restrict_radius_ducks"); return ret; } }; @@ -648,6 +666,8 @@ init_ui_manager() DEFINE_ACTION("toggle-grid-snap", _("Toggle Grid Snap")); DEFINE_ACTION("toggle-guide-show", _("Toggle Guide Show")); DEFINE_ACTION("toggle-low-res", _("Toggle Low-Res")); + DEFINE_ACTION("decrease-low-res-pixel-size", _("Decrease Low-Res Pixel Size")); + DEFINE_ACTION("increase-low-res-pixel-size", _("Increase Low-Res Pixel Size")); DEFINE_ACTION("toggle-onion-skin", _("Toggle Onion Skin")); DEFINE_ACTION("canvas-zoom-in", Gtk::StockID("gtk-zoom-in")); DEFINE_ACTION("canvas-zoom-out", Gtk::StockID("gtk-zoom-out")); @@ -772,7 +792,11 @@ init_ui_manager() " " " " " " -" "; +" " +" " +" " +" " +; for(list::iterator iter = CanvasView::get_pixel_sizes().begin(); iter != CanvasView::get_pixel_sizes().end(); iter++) ui_info += strprintf(" ", *iter); @@ -922,6 +946,9 @@ init_ui_manager() 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")); @@ -1016,13 +1043,13 @@ App::App(int *argc, char ***argv): } Glib::set_application_name(_("Synfig Studio")); - About about_window; - about_window.set_can_self_destruct(false); - about_window.show(); + Splash splash_screen; + splash_screen.set_can_self_destruct(false); + splash_screen.show(); shutdown_in_progress=false; - SuperCallback synfig_init_cb(about_window.get_callback(),0,9000,10000); - SuperCallback studio_init_cb(about_window.get_callback(),9000,10000,10000); + SuperCallback synfig_init_cb(splash_screen.get_callback(),0,9000,10000); + SuperCallback studio_init_cb(splash_screen.get_callback(),9000,10000,10000); // Initialize the Synfig library try { synfigapp_main=etl::smart_ptr(new synfigapp::Main(etl::dirname((*argv)[0]),&synfig_init_cb)); } @@ -1050,6 +1077,9 @@ App::App(int *argc, char ***argv): studio_init_cb.task(_("Init Toolbox...")); toolbox=new studio::Toolbox(); + studio_init_cb.task(_("Init About Dialog...")); + about=new studio::About(); + studio_init_cb.task(_("Init Tool Options...")); dialog_tool_options=new studio::Dialog_ToolOptions(); dock_manager->register_dockable(*dialog_tool_options); @@ -1113,30 +1143,27 @@ App::App(int *argc, char ***argv): device_tracker=new studio::DeviceTracker(); studio_init_cb.task(_("Init Tools...")); + + /* row 1 */ state_manager->add_state(&state_normal); state_manager->add_state(&state_smooth_move); state_manager->add_state(&state_scale); state_manager->add_state(&state_rotate); + 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_gradient); - state_manager->add_state(&state_eyedrop); - state_manager->add_state(&state_fill); + if(!getenv("SYNFIG_DISABLE_POLYGON")) state_manager->add_state(&state_polygon); // Enabled - for working without ducks - state_manager->add_state(&state_zoom); - - // Enabled - it's useful to be able to work with polygons without tangent ducks getting in the way. - // I know we can switch tangent ducks off, but why not allow this kind of layer as well? - if(!getenv("SYNFIG_DISABLE_POLYGON")) state_manager->add_state(&state_polygon); - - // Enabled for now. Let's see whether they're good enough yet. - if(!getenv("SYNFIG_DISABLE_DRAW" )) state_manager->add_state(&state_draw); + /* 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_fill); + state_manager->add_state(&state_eyedrop); + state_manager->add_state(&state_zoom); // Disabled by default - it doesn't work properly? if(getenv("SYNFIG_ENABLE_WIDTH" )) state_manager->add_state(&state_width); @@ -1144,10 +1171,6 @@ App::App(int *argc, char ***argv): studio_init_cb.task(_("Init ModPalette...")); module_list_.push_back(new ModPalette()); module_list_.back()->start(); - studio_init_cb.task(_("Init ModMirror...")); - module_list_.push_back(new ModMirror()); module_list_.back()->start(); - - studio_init_cb.task(_("Init Setup Dialog...")); dialog_setup=new studio::Dialog_Setup(); @@ -1166,45 +1189,46 @@ App::App(int *argc, char ***argv): studio_init_cb.amount_complete(9900,10000); + bool opened_any = false; if(auto_recover->recovery_needed()) { - about_window.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 - ) + 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(!auto_recover->recover()) - { - get_ui_interface()->error(_("Unable to fully recover from previous crash")); - } + int number_recovered; + if(!auto_recover->recover(number_recovered)) + if (number_recovered) + get_ui_interface()->error(_("Unable to fully recover from previous crash")); + else + get_ui_interface()->error(_("Unable to recover from previous crash")); else - get_ui_interface()->error( - _("Synfig Studio has attempted to recover\n" - "from a previous crash. The files that it has\n" - "recovered are NOT YET SAVED. It would be a good\n" - "idea to review them and save them now.") - ); + get_ui_interface()->error( + _("Synfig Studio has attempted to recover\n" + "from a previous crash. The files that it has\n" + "recovered are NOT YET SAVED. It would be a good\n" + "idea to review them and save them now.")); + + if (number_recovered) + opened_any = true; } - about_window.show(); + splash_screen.show(); } // Look for any files given on the command line, // and load them if found. - bool opened_any = false; for(;*argc>=1;(*argc)--) if((*argv)[*argc] && (*argv)[*argc][0]!='-') { studio_init_cb.task(_("Loading files...")); - about_window.hide(); + splash_screen.hide(); open((*argv)[*argc]); opened_any = true; - about_window.show(); + splash_screen.show(); } // if no file was specified to be opened, create a new document to help new users get started more easily @@ -1248,6 +1272,8 @@ App::~App() delete auto_recover; + delete about; + toolbox->hide(); // studio::App::iteration(false); @@ -1439,6 +1465,7 @@ App::reset_initial_window_configuration() synfigapp::Main::settings().set_value("pref.distance_system","pt"); synfigapp::Main::settings().set_value("pref.use_colorspace_gamma","1"); synfigapp::Main::settings().set_value("pref.single_threaded","0"); + synfigapp::Main::settings().set_value("pref.restrict_radius_ducks","0"); synfigapp::Main::settings().set_value("window.toolbox.pos","4 4"); } @@ -1739,6 +1766,24 @@ App::dialog_save_file(const std::string &title, std::string &filename, std::stri dialog->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog->add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); + Widget_Enum *file_type_enum = 0; + if (preference == ANIMATION_DIR_PREFERENCE) + { + file_type_enum = manage(new Widget_Enum()); + file_type_enum->set_param_desc(ParamDesc().set_hint("enum") + .add_enum_value(synfig::RELEASE_VERSION_0_61_08, "0.61.08", strprintf("0.61.08 (%s)", _("current"))) + .add_enum_value(synfig::RELEASE_VERSION_0_61_07, "0.61.07", "0.61.07") + .add_enum_value(synfig::RELEASE_VERSION_0_61_06, "0.61.06", strprintf("0.61.06 %s", _("and older")))); + file_type_enum->set_value(RELEASE_VERSION_END-1); // default to the most recent version + + Gtk::HBox *hbox = manage(new Gtk::HBox); + hbox->pack_start(*manage(new Gtk::Label(_("File Format Version: "))),Gtk::PACK_SHRINK,0); + hbox->pack_start(*file_type_enum,Gtk::PACK_EXPAND_WIDGET,0); + hbox->show_all(); + + dialog->set_extra_widget(*hbox); + } + if (filename.empty()) dialog->set_filename(prev_path); else @@ -1759,6 +1804,8 @@ App::dialog_save_file(const std::string &title, std::string &filename, std::stri } if(dialog->run() == GTK_RESPONSE_ACCEPT) { + 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()); _preferences.set_value(preference, dirname(filename)); @@ -1895,22 +1942,26 @@ App::open_as(std::string filename,std::string as) if(canvas && get_instance(canvas)) { get_instance(canvas)->find_canvas_view(canvas)->present(); - throw (String)strprintf(_("\"%s\" appears to already be open!"),filename.c_str()); + info("%s is already open", filename.c_str()); + // throw (String)strprintf(_("\"%s\" appears to already be open!"),filename.c_str()); } - if(!canvas) - throw (String)strprintf(_("Unable to open file \"%s\""),filename.c_str()); + else + { + if(!canvas) + throw (String)strprintf(_("Unable to open file \"%s\""),filename.c_str()); - add_recent_file(as); + add_recent_file(as); - handle instance(Instance::create(canvas)); + handle instance(Instance::create(canvas)); - if(!instance) - throw (String)strprintf(_("Unable to create instance for \"%s\""),filename.c_str()); + if(!instance) + throw (String)strprintf(_("Unable to create instance for \"%s\""),filename.c_str()); - one_moment.hide(); + one_moment.hide(); - if(instance->is_updated() && App::dialog_yes_no(_("CVS Update"), _("There appears to be a newer version of this file available on the CVS repository.\nWould you like to update now? (It would probably be a good idea)"))) - instance->dialog_cvs_update(); + if(instance->is_updated() && App::dialog_yes_no(_("CVS Update"), _("There appears to be a newer version of this file available on the CVS repository.\nWould you like to update now? (It would probably be a good idea)"))) + instance->dialog_cvs_update(); + } } catch(String x) { @@ -2040,7 +2091,8 @@ App::get_instance(etl::handle canvas) void App::dialog_about() { - (new class About())->show(); + if(about) + about->show(); } void