Remove .gitignore do nothing is ignored.
[synfig.git] / synfig-studio / trunk / src / gtkmm / app.cpp
index 18cab60..24e2bcf 100644 (file)
@@ -280,6 +280,8 @@ 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
@@ -322,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(
@@ -542,7 +572,17 @@ public:
                        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);
        }
 
@@ -639,6 +679,18 @@ public:
                        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);
        }
 
@@ -660,7 +712,9 @@ public:
                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("predefined_size");
+               ret.push_back("preferred_fps");
+               ret.push_back("predefined_fps");
                return ret;
        }
 };
@@ -687,7 +741,7 @@ init_ui_manager()
        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")) );
-       menus_action_group->add( Gtk::Action::create("menu-state", _("State")) );
+       menus_action_group->add( Gtk::Action::create("menu-state", _("Tool")) );
        menus_action_group->add( Gtk::Action::create("menu-toolbox", _("Toolbox")) );
 
        // Add the synfigapp actions...
@@ -992,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());       \
@@ -1004,94 +1058,80 @@ init_ui_manager()
                Gtk::AccelMap::add_entry(accel_key.get_path(), accel_key.get_key(), accel_key.get_mod());       \
        }
 
-       ACCEL("<Actions>//select-all-ducks","<Control>a");
-       ACCEL("<Actions>//unselect-all-ducks","<Control>d");
-       ACCEL("<Actions>//select-all-layers","<Control><Shift>a");
-       ACCEL("<Actions>//unselect-all-layers","<Control><Shift>d");
-       ACCEL("<Actions>//render","F9");
-       ACCEL("<Actions>//preview","F11");
-       ACCEL("<Actions>//properties","F8");
-       ACCEL("<Actions>//options","F12");
-       ACCEL("<Actions>//import","<control>i");
-       ACCEL2(Gtk::AccelKey(GDK_Escape,static_cast<Gdk::ModifierType>(0),"<Actions>//stop"));
-       ACCEL("<Actions>//toggle-grid-show","<Control>g");
-       ACCEL("<Actions>//toggle-grid-snap","<Control>l");
-       ACCEL2(Gtk::AccelKey('`',Gdk::CONTROL_MASK,"<Actions>//toggle-low-res"));
-       ACCEL("<Actions>//mask-position-ducks", "<Mod1>1");
-       ACCEL("<Actions>//mask-vertex-ducks", "<Mod1>2");
-       ACCEL("<Actions>//mask-tangent-ducks", "<Mod1>3");
-       ACCEL("<Actions>//mask-radius-ducks", "<Mod1>4");
-       ACCEL("<Actions>//mask-width-ducks", "<Mod1>5");
-       ACCEL("<Actions>//mask-angle-ducks", "<Mod1>6");
-
-       ACCEL2(Gtk::AccelKey(GDK_Page_Up,Gdk::SHIFT_MASK,"<Actions>//action-layer_raise"));
-       ACCEL2(Gtk::AccelKey(GDK_Page_Down,Gdk::SHIFT_MASK,"<Actions>//action-layer_lower"));
-
-       ACCEL("<Actions>//quality-01","<Control>1");
-       ACCEL("<Actions>//quality-02","<Control>2");
-       ACCEL("<Actions>//quality-03","<Control>3");
-       ACCEL("<Actions>//quality-04","<Control>4");
-       ACCEL("<Actions>//quality-05","<Control>5");
-       ACCEL("<Actions>//quality-06","<Control>6");
-       ACCEL("<Actions>//quality-07","<Control>7");
-       ACCEL("<Actions>//quality-08","<Control>8");
-       ACCEL("<Actions>//quality-09","<Control>9");
-       ACCEL("<Actions>//quality-10","<Control>0");
-       ACCEL("<Actions>//undo","<Control>z");
-       ACCEL("<Actions>//redo","<Control>r");
-       ACCEL("<Actions>//action-layer_remove","Delete");
-
-/*     ACCEL2(Gtk::AccelKey(']',static_cast<Gdk::ModifierType>(0),"<Actions>//jump-next-keyframe"));
-       ACCEL2(Gtk::AccelKey('[',static_cast<Gdk::ModifierType>(0),"<Actions>//jump-prev-keyframe"));
-       ACCEL2(Gtk::AccelKey('=',static_cast<Gdk::ModifierType>(0),"<Actions>//canvas-zoom-in"));
-       ACCEL2(Gtk::AccelKey('-',static_cast<Gdk::ModifierType>(0),"<Actions>//canvas-zoom-out"));
-       ACCEL("<Actions>//time-zoom-in","+");
-       ACCEL("<Actions>//time-zoom-out","_");
-*/
-       ACCEL2(Gtk::AccelKey('(',Gdk::CONTROL_MASK,"<Actions>//decrease-low-res-pixel-size"));
-       ACCEL2(Gtk::AccelKey(')',Gdk::CONTROL_MASK,"<Actions>//increase-low-res-pixel-size"));
-
-       ACCEL2(Gtk::AccelKey('(',Gdk::MOD1_MASK|Gdk::CONTROL_MASK,"<Actions>//amount-dec"));
-       ACCEL2(Gtk::AccelKey(')',Gdk::MOD1_MASK|Gdk::CONTROL_MASK,"<Actions>//amount-inc"));
-
-       ACCEL2(Gtk::AccelKey(']',Gdk::CONTROL_MASK,"<Actions>//jump-next-keyframe"));
-       ACCEL2(Gtk::AccelKey('[',Gdk::CONTROL_MASK,"<Actions>//jump-prev-keyframe"));
-       ACCEL2(Gtk::AccelKey('=',Gdk::CONTROL_MASK,"<Actions>//canvas-zoom-in"));
-       ACCEL2(Gtk::AccelKey('-',Gdk::CONTROL_MASK,"<Actions>//canvas-zoom-out"));
-       ACCEL2(Gtk::AccelKey('+',Gdk::CONTROL_MASK,"<Actions>//time-zoom-in"));
-       ACCEL2(Gtk::AccelKey('_',Gdk::CONTROL_MASK,"<Actions>//time-zoom-out"));
-       ACCEL2(Gtk::AccelKey('.',Gdk::CONTROL_MASK,"<Actions>//seek-next-frame"));
-       ACCEL2(Gtk::AccelKey(',',Gdk::CONTROL_MASK,"<Actions>//seek-prev-frame"));
-       ACCEL2(Gtk::AccelKey('>',Gdk::CONTROL_MASK,"<Actions>//seek-next-second"));
-       ACCEL2(Gtk::AccelKey('<',Gdk::CONTROL_MASK,"<Actions>//seek-prev-second"));
-       ACCEL2(Gtk::AccelKey('o',Gdk::MOD1_MASK,"<Actions>//toggle-onion-skin"));
-       ACCEL("<Actions>//play",              "<Control>p");
-       ACCEL("<Actions>//seek-begin","Home");
-       ACCEL("<Actions>//seek-end","End");
-
-       ACCEL("<Actions>//state-normal",      "<Mod1>a");
-       ACCEL("<Actions>//state-smooth_move", "<Mod1>v");
-       ACCEL("<Actions>//state-scale",       "<Mod1>s");
-       ACCEL("<Actions>//state-rotate",      "<Mod1>t");
-       ACCEL("<Actions>//state-mirror",      "<Mod1>m");
-
-       ACCEL("<Actions>//state-circle",      "<Mod1>c");
-       ACCEL("<Actions>//state-rectangle",   "<Mod1>r");
-       ACCEL("<Actions>//state-star",        "<Mod1>q");
-       ACCEL("<Actions>//state-gradient",    "<Mod1>g");
-       ACCEL("<Actions>//state-polygon",     "<Mod1>p");
-
-       ACCEL("<Actions>//state-bline",       "<Mod1>b");
-       ACCEL("<Actions>//state-text",        "<Mod1>x");
-       ACCEL("<Actions>//state-fill",        "<Mod1>f");
-       ACCEL("<Actions>//state-eyedrop",     "<Mod1>e");
-       ACCEL("<Actions>//state-zoom",        "<Mod1>z");
-
-       ACCEL("<Actions>//state-draw",        "<Mod1>d");
-       ACCEL("<Actions>//state-sketch",      "<Mod1>k");
-       ACCEL("<Actions>//state-width",       "<Mod1>w");
-
-       ACCEL("<Actions>//canvas-zoom-fit","<Control><Shift>z");
+       // the toolbox
+       ACCEL("<Mod1>a",                                                                                                        "<Actions>//state-normal"                                       );
+       ACCEL("<Mod1>v",                                                                                                        "<Actions>//state-smooth_move"                          );
+       ACCEL("<Mod1>s",                                                                                                        "<Actions>//state-scale"                                        );
+       ACCEL("<Mod1>t",                                                                                                        "<Actions>//state-rotate"                                       );
+       ACCEL("<Mod1>m",                                                                                                        "<Actions>//state-mirror"                                       );
+       ACCEL("<Mod1>c",                                                                                                        "<Actions>//state-circle"                                       );
+       ACCEL("<Mod1>r",                                                                                                        "<Actions>//state-rectangle"                            );
+       ACCEL("<Mod1>q",                                                                                                        "<Actions>//state-star"                                         );
+       ACCEL("<Mod1>g",                                                                                                        "<Actions>//state-gradient"                                     );
+       ACCEL("<Mod1>p",                                                                                                        "<Actions>//state-polygon"                                      );
+       ACCEL("<Mod1>b",                                                                                                        "<Actions>//state-bline"                                        );
+       ACCEL("<Mod1>x",                                                                                                        "<Actions>//state-text"                                         );
+       ACCEL("<Mod1>f",                                                                                                        "<Actions>//state-fill"                                         );
+       ACCEL("<Mod1>e",                                                                                                        "<Actions>//state-eyedrop"                                      );
+       ACCEL("<Mod1>z",                                                                                                        "<Actions>//state-zoom"                                         );
+       ACCEL("<Mod1>d",                                                                                                        "<Actions>//state-draw"                                         );
+       ACCEL("<Mod1>k",                                                                                                        "<Actions>//state-sketch"                                       );
+       ACCEL("<Mod1>w",                                                                                                        "<Actions>//state-width"                                        );
+
+       // everything else
+       ACCEL("<Control>a",                                                                                                     "<Actions>//select-all-ducks"                           );
+       ACCEL("<Control>d",                                                                                                     "<Actions>//unselect-all-ducks"                         );
+       ACCEL("<Control><Shift>a",                                                                                      "<Actions>//select-all-layers"                          );
+       ACCEL("<Control><Shift>d",                                                                                      "<Actions>//unselect-all-layers"                        );
+       ACCEL("F9",                                                                                                                     "<Actions>//render"                                                     );
+       ACCEL("F11",                                                                                                            "<Actions>//preview"                                            );
+       ACCEL("F8",                                                                                                                     "<Actions>//properties"                                         );
+       ACCEL("F12",                                                                                                            "<Actions>//options"                                            );
+       ACCEL("<control>i",                                                                                                     "<Actions>//import"                                                     );
+       ACCEL2(Gtk::AccelKey(GDK_Escape,static_cast<Gdk::ModifierType>(0),      "<Actions>//stop"                                                       ));
+       ACCEL("<Control>g",                                                                                                     "<Actions>//toggle-grid-show"                           );
+       ACCEL("<Control>l",                                                                                                     "<Actions>//toggle-grid-snap"                           );
+       ACCEL2(Gtk::AccelKey('`',Gdk::CONTROL_MASK,                                                     "<Actions>//toggle-low-res"                                     ));
+       ACCEL("<Mod1>1",                                                                                                        "<Actions>//mask-position-ducks"                        );
+       ACCEL("<Mod1>2",                                                                                                        "<Actions>//mask-vertex-ducks"                          );
+       ACCEL("<Mod1>3",                                                                                                        "<Actions>//mask-tangent-ducks"                         );
+       ACCEL("<Mod1>4",                                                                                                        "<Actions>//mask-radius-ducks"                          );
+       ACCEL("<Mod1>5",                                                                                                        "<Actions>//mask-width-ducks"                           );
+       ACCEL("<Mod1>6",                                                                                                        "<Actions>//mask-angle-ducks"                           );
+       ACCEL2(Gtk::AccelKey(GDK_Page_Up,Gdk::SHIFT_MASK,                                       "<Actions>//action-LayerRaise"                          ));
+       ACCEL2(Gtk::AccelKey(GDK_Page_Down,Gdk::SHIFT_MASK,                                     "<Actions>//action-LayerLower"                          ));
+       ACCEL("<Control>1",                                                                                                     "<Actions>//quality-01"                                         );
+       ACCEL("<Control>2",                                                                                                     "<Actions>//quality-02"                                         );
+       ACCEL("<Control>3",                                                                                                     "<Actions>//quality-03"                                         );
+       ACCEL("<Control>4",                                                                                                     "<Actions>//quality-04"                                         );
+       ACCEL("<Control>5",                                                                                                     "<Actions>//quality-05"                                         );
+       ACCEL("<Control>6",                                                                                                     "<Actions>//quality-06"                                         );
+       ACCEL("<Control>7",                                                                                                     "<Actions>//quality-07"                                         );
+       ACCEL("<Control>8",                                                                                                     "<Actions>//quality-08"                                         );
+       ACCEL("<Control>9",                                                                                                     "<Actions>//quality-09"                                         );
+       ACCEL("<Control>0",                                                                                                     "<Actions>//quality-10"                                         );
+       ACCEL("<Control>z",                                                                                                     "<Actions>//undo"                                                       );
+       ACCEL("<Control>r",                                                                                                     "<Actions>//redo"                                                       );
+       ACCEL2(Gtk::AccelKey(GDK_Delete,Gdk::CONTROL_MASK,                                      "<Actions>//action-LayerRemove"                         ));
+       ACCEL2(Gtk::AccelKey('(',Gdk::CONTROL_MASK,                                                     "<Actions>//decrease-low-res-pixel-size"        ));
+       ACCEL2(Gtk::AccelKey(')',Gdk::CONTROL_MASK,                                                     "<Actions>//increase-low-res-pixel-size"        ));
+       ACCEL2(Gtk::AccelKey('(',Gdk::MOD1_MASK|Gdk::CONTROL_MASK,                      "<Actions>//amount-dec"                                         ));
+       ACCEL2(Gtk::AccelKey(')',Gdk::MOD1_MASK|Gdk::CONTROL_MASK,                      "<Actions>//amount-inc"                                         ));
+       ACCEL2(Gtk::AccelKey(']',Gdk::CONTROL_MASK,                                                     "<Actions>//jump-next-keyframe"                         ));
+       ACCEL2(Gtk::AccelKey('[',Gdk::CONTROL_MASK,                                                     "<Actions>//jump-prev-keyframe"                         ));
+       ACCEL2(Gtk::AccelKey('=',Gdk::CONTROL_MASK,                                                     "<Actions>//canvas-zoom-in"                                     ));
+       ACCEL2(Gtk::AccelKey('-',Gdk::CONTROL_MASK,                                                     "<Actions>//canvas-zoom-out"                            ));
+       ACCEL2(Gtk::AccelKey('+',Gdk::CONTROL_MASK,                                                     "<Actions>//time-zoom-in"                                       ));
+       ACCEL2(Gtk::AccelKey('_',Gdk::CONTROL_MASK,                                                     "<Actions>//time-zoom-out"                                      ));
+       ACCEL2(Gtk::AccelKey('.',Gdk::CONTROL_MASK,                                                     "<Actions>//seek-next-frame"                            ));
+       ACCEL2(Gtk::AccelKey(',',Gdk::CONTROL_MASK,                                                     "<Actions>//seek-prev-frame"                            ));
+       ACCEL2(Gtk::AccelKey('>',Gdk::CONTROL_MASK,                                                     "<Actions>//seek-next-second"                           ));
+       ACCEL2(Gtk::AccelKey('<',Gdk::CONTROL_MASK,                                                     "<Actions>//seek-prev-second"                           ));
+       ACCEL("<Mod1>o",                                                                                                        "<Actions>//toggle-onion-skin"                          );
+       ACCEL("<Control><Shift>z",                                                                                      "<Actions>//canvas-zoom-fit"                            );
+       ACCEL("<Control>p",                                                                                                     "<Actions>//play"                                                       );
+       ACCEL("Home",                                                                                                           "<Actions>//seek-begin"                                         );
+       ACCEL("End",                                                                                                            "<Actions>//seek-end"                                           );
 
 #undef ACCEL
 }
@@ -1286,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();
@@ -1294,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);
@@ -1302,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))
@@ -1382,7 +1425,7 @@ App::~App()
        delete auto_recover;
 
        delete about;
-       
+
        toolbox->hide();
 
 //     studio::App::iteration(false);
@@ -1751,6 +1794,8 @@ App::reset_initial_window_configuration()
        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");
 }
 
@@ -2235,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!
                }
        }
 
@@ -2375,7 +2420,7 @@ App::open_as(std::string filename,std::string as)
 
                        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);
 
@@ -2421,7 +2466,7 @@ App::new_instance()
        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));