X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fapp.cpp;h=ba154c2d18596710c0e14b828af852534dee3cf9;hb=eebf73ecd0914fe08549d23e5d38e946b65b669a;hp=504d0a061c12c1c759386f5b7ed6313a9e3d071a;hpb=63e709f66d50c124cc0ece2325f4773ac4ae7b20;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/app.cpp b/synfig-studio/trunk/src/gtkmm/app.cpp index 504d0a0..ba154c2 100644 --- a/synfig-studio/trunk/src/gtkmm/app.cpp +++ b/synfig-studio/trunk/src/gtkmm/app.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #ifdef HAVE_SYS_ERRNO_H #include @@ -54,6 +55,7 @@ #include "app.h" #include "about.h" +#include "splash.h" #include "instance.h" #include "canvasview.h" #include "dialog_setup.h" @@ -221,6 +223,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; @@ -268,7 +272,7 @@ namespace studio { bool really_delete_widget(Gtk::Widget *widget) { - synfig::info("really delete %p", (void*)widget); + // synfig::info("really delete %p", (void*)widget); delete widget; return false; } @@ -279,7 +283,7 @@ really_delete_widget(Gtk::Widget *widget) void delete_widget(Gtk::Widget *widget) { - synfig::info("delete %p", (void*)widget); + // synfig::info("delete %p", (void*)widget); Glib::signal_timeout().connect(sigc::bind(sigc::ptr_fun(&really_delete_widget), widget), 50); } @@ -568,6 +572,7 @@ init_ui_manager() menus_action_group->add( Gtk::Action::create("menu-layer", _("_Layer")) ); menus_action_group->add( Gtk::Action::create("menu-duck-mask", _("Show/Hide Ducks")) ); menus_action_group->add( Gtk::Action::create("menu-preview-quality", _("Preview Quality")) ); + menus_action_group->add( Gtk::Action::create("menu-lowres-pixel", _("Low-Res Pixel Size")) ); menus_action_group->add( Gtk::Action::create("menu-layer-new", _("New Layer")) ); menus_action_group->add( Gtk::Action::create("menu-keyframe", _("Keyframe")) ); menus_action_group->add( Gtk::Action::create("menu-group", _("Group")) ); @@ -591,6 +596,7 @@ init_ui_manager() DEFINE_ACTION2("keyframe-properties", Gtk::StockID("gtk-properties"), _("Keyframe Properties")); DEFINE_ACTION("about", Gtk::StockID("synfig-about")); + DEFINE_ACTION("new", Gtk::Stock::NEW); DEFINE_ACTION("open", Gtk::Stock::OPEN); DEFINE_ACTION("save", Gtk::Stock::SAVE); DEFINE_ACTION("save-as", Gtk::Stock::SAVE_AS); @@ -607,6 +613,7 @@ init_ui_manager() DEFINE_ACTION("options", _("Options")); DEFINE_ACTION("close", _("Close View")); DEFINE_ACTION("close-document", _("Close Document")); + DEFINE_ACTION("quit", Gtk::Stock::QUIT); DEFINE_ACTION("undo", Gtk::StockID("gtk-undo")); @@ -635,6 +642,8 @@ init_ui_manager() DEFINE_ACTION("quality-08", _("Use Quality Level 8")); DEFINE_ACTION("quality-09", _("Use Quality Level 9")); DEFINE_ACTION("quality-10", _("Use Quality Level 10")); + for(list::iterator iter = CanvasView::get_pixel_sizes().begin(); iter != CanvasView::get_pixel_sizes().end(); iter++) + DEFINE_ACTION(strprintf("lowres-pixel-%d", *iter), strprintf(_("Set Low-Res pixel size to %d"), *iter)); DEFINE_ACTION("play", _("Play")); // DEFINE_ACTION("pause", _("Pause")); DEFINE_ACTION("stop", _("Stop")); @@ -642,6 +651,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")); @@ -709,6 +720,8 @@ init_ui_manager() " " " " " " +" " +" " " " " " " " @@ -727,6 +740,7 @@ init_ui_manager() " " " " " " +" " " " " " " " @@ -763,6 +777,17 @@ init_ui_manager() " " " " " " +" " +" " +" " +" " +; + + for(list::iterator iter = CanvasView::get_pixel_sizes().begin(); iter != CanvasView::get_pixel_sizes().end(); iter++) + ui_info += strprintf(" ", *iter); + + ui_info += +" " " " " " //" " @@ -906,6 +931,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")); @@ -919,7 +947,7 @@ init_ui_manager() 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::CONTROL_MASK,"//toggle-onion-skin")); + ACCEL2(Gtk::AccelKey('o',Gdk::MOD1_MASK,"//toggle-onion-skin")); ACCEL("//play", "p"); ACCEL("//seek-begin","Home"); ACCEL("//seek-end","End"); @@ -1000,13 +1028,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)); } @@ -1034,6 +1062,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); @@ -1097,30 +1128,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); - - 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); + if(!getenv("SYNFIG_DISABLE_POLYGON")) state_manager->add_state(&state_polygon); // Enabled - for working without ducks - // 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); @@ -1128,10 +1156,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(); @@ -1152,7 +1176,7 @@ App::App(int *argc, char ***argv): if(auto_recover->recovery_needed()) { - about_window.hide(); + splash_screen.hide(); if( get_ui_interface()->yes_no( _("Auto Recovery"), @@ -1175,20 +1199,26 @@ App::App(int *argc, char ***argv): "idea to review them and save them now.") ); } - 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]); - about_window.show(); + opened_any = true; + splash_screen.show(); } + // if no file was specified to be opened, create a new document to help new users get started more easily + if (!opened_any && !getenv("SYNFIG_DISABLE_AUTOMATIC_DOCUMENT_CREATION")) + new_instance(); + studio_init_cb.task(_("Done.")); studio_init_cb.amount_complete(10000,10000); @@ -1217,7 +1247,8 @@ App::~App() selected_instance=0; // Unload all of the modules - for(;!module_list_.empty();module_list_.pop_back()); + for(;!module_list_.empty();module_list_.pop_back()) + ; delete state_manager; @@ -1225,6 +1256,8 @@ App::~App() delete auto_recover; + delete about; + toolbox->hide(); // studio::App::iteration(false); @@ -1530,8 +1563,10 @@ static OPENFILENAME ofn={}; #endif bool -App::dialog_open_file(const std::string &title, std::string &filename) +App::dialog_open_file(const std::string &title, std::string &filename, std::string preference) { + info("App::dialog_open_file('%s', '%s', '%s')", title.c_str(), filename.c_str(), preference.c_str()); + #ifdef USE_WIN32_FILE_DIALOGS static TCHAR szFilter[] = TEXT ("All Files (*.*)\0*.*\0\0") ; @@ -1576,26 +1611,36 @@ App::dialog_open_file(const std::string &title, std::string &filename) #else synfig::String prev_path; - if(!_preferences.get_value("curr_path",prev_path)) - prev_path="."; + + if(!_preferences.get_value(preference, prev_path)) + prev_path = "."; + prev_path = absolute_path(prev_path); - Gtk::FileChooserDialog *dialog=new Gtk::FileChooserDialog(title,Gtk::FILE_CHOOSER_ACTION_OPEN); + Gtk::FileChooserDialog *dialog = new Gtk::FileChooserDialog(title, Gtk::FILE_CHOOSER_ACTION_OPEN); + dialog->set_current_folder(prev_path); dialog->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog->add_button(Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT); - if(!filename.empty()) - if (is_absolute_path(filename)) - dialog->set_filename(filename); - else - dialog->set_filename(prev_path + ETL_DIRECTORY_SEPARATOR + filename); - if(dialog->run()==GTK_RESPONSE_ACCEPT) { - filename=dialog->get_filename(); + + if (filename.empty()) + dialog->set_filename(prev_path); + else if (is_absolute_path(filename)) + dialog->set_filename(filename); + else + dialog->set_filename(prev_path + ETL_DIRECTORY_SEPARATOR + filename); + + 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()); + _preferences.set_value(preference, dirname(filename)); delete dialog; return true; } + delete dialog; return false; + /* GtkWidget *ok; @@ -1630,7 +1675,7 @@ App::dialog_open_file(const std::string &title, std::string &filename) if(val==1) { filename=gtk_file_selection_get_filename(GTK_FILE_SELECTION(fileselection)); - _preferences.set_value("curr_path",dirname(filename)); + _preferences.set_value(preference,dirname(filename)); } else { @@ -1644,8 +1689,10 @@ App::dialog_open_file(const std::string &title, std::string &filename) } bool -App::dialog_save_file(const std::string &title, std::string &filename) +App::dialog_save_file(const std::string &title, std::string &filename, std::string preference) { + info("App::dialog_save_file('%s', '%s', '%s')", title.c_str(), filename.c_str(), preference.c_str()); + #if USE_WIN32_FILE_DIALOGS static TCHAR szFilter[] = TEXT ("All Files (*.*)\0*.*\0\0") ; @@ -1684,27 +1731,34 @@ App::dialog_save_file(const std::string &title, std::string &filename) if(GetSaveFileName(&ofn)) { filename=szFilename; - _preferences.set_value("curr_path",dirname(filename)); + _preferences.set_value(preference,dirname(filename)); return true; } return false; #else synfig::String prev_path; - if(!_preferences.get_value("curr_path",prev_path)) + + if(!_preferences.get_value(preference, prev_path)) prev_path="."; + prev_path = absolute_path(prev_path); - Gtk::FileChooserDialog *dialog=new Gtk::FileChooserDialog(title,Gtk::FILE_CHOOSER_ACTION_SAVE); + Gtk::FileChooserDialog *dialog = new Gtk::FileChooserDialog(title, Gtk::FILE_CHOOSER_ACTION_SAVE); + dialog->set_current_folder(prev_path); dialog->add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); dialog->add_button(Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); - if(!filename.empty()) + + if (filename.empty()) + dialog->set_filename(prev_path); + else { std::string full_path; if (is_absolute_path(filename)) full_path = filename; else full_path = prev_path + ETL_DIRECTORY_SEPARATOR + filename; + // select the file if it exists dialog->set_filename(full_path); @@ -1713,15 +1767,17 @@ App::dialog_save_file(const std::string &title, std::string &filename) if(stat(full_path.c_str(),&s) == -1 && errno == ENOENT) dialog->set_current_name(basename(filename)); } - if(dialog->run()==GTK_RESPONSE_ACCEPT) { - filename=dialog->get_filename(); + + if(dialog->run() == GTK_RESPONSE_ACCEPT) { + 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)); delete dialog; - _preferences.set_value("curr_path",dirname(filename)); return true; } + delete dialog; return false; -// return dialog_open_file(title, filename); #endif } @@ -1877,8 +1933,6 @@ App::open_as(std::string filename,std::string as) return false; } - _preferences.set_value("curr_path",dirname(as)); - return true; } @@ -1893,7 +1947,7 @@ App::new_instance() canvas->rend_desc().set_frame_rate(24.0); canvas->rend_desc().set_time_start(0.0); - canvas->rend_desc().set_time_end(00.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)); @@ -1906,7 +1960,7 @@ App::new_instance() handle instance = Instance::create(canvas); - if (!getenv("SYNFIG_DISABLE_NEW_CANVAS_EDIT_PROPERTIES")) + if (getenv("SYNFIG_ENABLE_NEW_CANVAS_EDIT_PROPERTIES")) instance->find_canvas_view(canvas)->canvas_properties.present(); } @@ -1915,7 +1969,7 @@ App::dialog_open() { string filename="*.sif"; - while(dialog_open_file("Open", filename)) + while(dialog_open_file("Open", filename, ANIMATION_DIR_PREFERENCE)) { // If the filename still has wildcards, then we should // continue looking for the file we want @@ -1996,7 +2050,8 @@ App::get_instance(etl::handle canvas) void App::dialog_about() { - (new class About())->show(); + if(about) + about->show(); } void