Change the tile size from 128 to 120 and allow all the factors of 120 to be used...
[synfig.git] / synfig-studio / trunk / src / gtkmm / app.cpp
index 6852023..6c185a4 100644 (file)
@@ -33,6 +33,7 @@
 #include <fstream>
 #include <iostream>
 #include <locale>
+#include <cstring>
 
 #ifdef HAVE_SYS_ERRNO_H
 #include <sys/errno.h>
@@ -568,6 +569,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")) );
@@ -637,6 +639,21 @@ 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"));
+       DEFINE_ACTION("lowres-pixel-2", _("Set Low-Res pixel size to 2"));
+       DEFINE_ACTION("lowres-pixel-3", _("Set Low-Res pixel size to 3"));
+       DEFINE_ACTION("lowres-pixel-4", _("Set Low-Res pixel size to 4"));
+       DEFINE_ACTION("lowres-pixel-5", _("Set Low-Res pixel size to 5"));
+       DEFINE_ACTION("lowres-pixel-6", _("Set Low-Res pixel size to 6"));
+       DEFINE_ACTION("lowres-pixel-8", _("Set Low-Res pixel size to 8"));
+       DEFINE_ACTION("lowres-pixel-10", _("Set Low-Res pixel size to 10"));
+       DEFINE_ACTION("lowres-pixel-12", _("Set Low-Res pixel size to 12"));
+       DEFINE_ACTION("lowres-pixel-15", _("Set Low-Res pixel size to 15"));
+       DEFINE_ACTION("lowres-pixel-20", _("Set Low-Res pixel size to 20"));
+       DEFINE_ACTION("lowres-pixel-24", _("Set Low-Res pixel size to 24"));
+       DEFINE_ACTION("lowres-pixel-30", _("Set Low-Res pixel size to 30"));
+       DEFINE_ACTION("lowres-pixel-40", _("Set Low-Res pixel size to 40"));
+       DEFINE_ACTION("lowres-pixel-60", _("Set Low-Res pixel size to 60"));
+       DEFINE_ACTION("lowres-pixel-120", _("Set Low-Res pixel size to 120"));
        DEFINE_ACTION("play", _("Play"));
        // DEFINE_ACTION("pause", _("Pause"));
        DEFINE_ACTION("stop", _("Stop"));
@@ -768,6 +785,23 @@ init_ui_manager()
 "                      <menuitem action='quality-09' />"
 "                      <menuitem action='quality-10' />"
 "              </menu>"
+"              <menu action='menu-lowres-pixel'>"
+"                      <menuitem action='lowres-pixel-2' />"
+"                      <menuitem action='lowres-pixel-3' />"
+"                      <menuitem action='lowres-pixel-4' />"
+"                      <menuitem action='lowres-pixel-5' />"
+"                      <menuitem action='lowres-pixel-6' />"
+"                      <menuitem action='lowres-pixel-8' />"
+"                      <menuitem action='lowres-pixel-10' />"
+"                      <menuitem action='lowres-pixel-12' />"
+"                      <menuitem action='lowres-pixel-15' />"
+"                      <menuitem action='lowres-pixel-20' />"
+"                      <menuitem action='lowres-pixel-24' />"
+"                      <menuitem action='lowres-pixel-30' />"
+"                      <menuitem action='lowres-pixel-40' />"
+"                      <menuitem action='lowres-pixel-60' />"
+"                      <menuitem action='lowres-pixel-120' />"
+"              </menu>"
 "              <separator name='bleh08'/>"
 "              <menuitem action='play'/>"
 //"            <menuitem action='pause'/>"
@@ -924,7 +958,7 @@ init_ui_manager()
        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::CONTROL_MASK,"<Actions>//toggle-onion-skin"));
+       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");
@@ -1185,15 +1219,21 @@ App::App(int *argc, char ***argv):
 
                // 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();
                                open((*argv)[*argc]);
+                               opened_any = true;
                                about_window.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);
 
@@ -1222,7 +1262,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;
 
@@ -1535,8 +1576,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") ;
 
@@ -1581,26 +1624,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;
@@ -1635,7 +1688,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
        {
@@ -1649,8 +1702,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") ;
 
@@ -1689,27 +1744,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);
 
@@ -1718,15 +1780,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
 }
 
@@ -1882,8 +1946,6 @@ App::open_as(std::string filename,std::string as)
                return false;
        }
 
-       _preferences.set_value("curr_path",dirname(as));
-
        return true;
 }
 
@@ -1898,7 +1960,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));
@@ -1911,7 +1973,7 @@ App::new_instance()
 
        handle<Instance> 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();
 }
 
@@ -1920,7 +1982,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