Mofidy files to point to release 0.62.02
[synfig.git] / synfig-studio / src / gui / app.cpp
index c27f7fc..19b287c 100644 (file)
@@ -76,7 +76,7 @@
 #include "toolbox.h"
 #include "onemoment.h"
 
 #include "toolbox.h"
 #include "onemoment.h"
 
-#include "dockmanager.h"
+#include "docks/dockmanager.h"
 
 #include "states/state_eyedrop.h"
 #include "states/state_normal.h"
 
 #include "states/state_eyedrop.h"
 #include "states/state_normal.h"
 #include "states/state_zoom.h"
 
 #include "devicetracker.h"
 #include "states/state_zoom.h"
 
 #include "devicetracker.h"
-#include "dialog_tooloptions.h"
+#include "docks/dialog_tooloptions.h"
 #include "widgets/widget_enum.h"
 
 #include "autorecover.h"
 
 #include <synfigapp/settings.h>
 #include "widgets/widget_enum.h"
 
 #include "autorecover.h"
 
 #include <synfigapp/settings.h>
-#include "dock_history.h"
-#include "dock_canvases.h"
-#include "dock_keyframes.h"
-#include "dock_layers.h"
-#include "dock_params.h"
-#include "dock_metadata.h"
-#include "dock_children.h"
-#include "dock_info.h"
-#include "dock_navigator.h"
-#include "dock_layergroups.h"
-#include "dock_timetrack.h"
-#include "dock_curves.h"
+#include "docks/dock_history.h"
+#include "docks/dock_canvases.h"
+#include "docks/dock_keyframes.h"
+#include "docks/dock_layers.h"
+#include "docks/dock_params.h"
+#include "docks/dock_metadata.h"
+#include "docks/dock_children.h"
+#include "docks/dock_info.h"
+#include "docks/dock_navigator.h"
+#include "docks/dock_layergroups.h"
+#include "docks/dock_timetrack.h"
+#include "docks/dock_curves.h"
 
 #include "modules/module.h"
 #include "modules/mod_palette/mod_palette.h"
 
 #include "modules/module.h"
 #include "modules/mod_palette/mod_palette.h"
@@ -271,8 +271,12 @@ std::list< etl::handle< studio::Module > > module_list_;
 
 bool studio::App::use_colorspace_gamma=true;
 #ifdef SINGLE_THREADED
 
 bool studio::App::use_colorspace_gamma=true;
 #ifdef SINGLE_THREADED
-bool studio::App::single_threaded=false;
-#endif
+       #ifdef  WIN32
+       bool studio::App::single_threaded=true;
+       #else
+       bool studio::App::single_threaded=false;
+       #endif // WIN32
+#endif  // SINGLE THREADED
 bool studio::App::restrict_radius_ducks=false;
 bool studio::App::resize_imported_images=false;
 String studio::App::custom_filename_prefix(DEFAULT_FILENAME_PREFIX);
 bool studio::App::restrict_radius_ducks=false;
 bool studio::App::resize_imported_images=false;
 String studio::App::custom_filename_prefix(DEFAULT_FILENAME_PREFIX);
@@ -1149,7 +1153,7 @@ App::App(int *argc, char ***argv):
                        "different version of libsynfig than what is currently\n"
                        "installed. Synfig Studio will now abort. Try downloading\n"
                        "the latest version from the Synfig website at\n"
                        "different version of libsynfig than what is currently\n"
                        "installed. Synfig Studio will now abort. Try downloading\n"
                        "the latest version from the Synfig website at\n"
-                       "http://synfig.org/Download"
+                       "http://synfig.org/en/current-release"
                );
                throw 40;
        }
                );
                throw 40;
        }
@@ -1266,23 +1270,25 @@ App::App(int *argc, char ***argv):
                state_manager->add_state(&state_scale);
                state_manager->add_state(&state_rotate);
                state_manager->add_state(&state_mirror);
                state_manager->add_state(&state_scale);
                state_manager->add_state(&state_rotate);
                state_manager->add_state(&state_mirror);
-               if(!getenv("SYNFIG_DISABLE_WIDTH"  )) state_manager->add_state(&state_width); // Enabled since 0.61.09
 
 
-               /* new objects */
+               /* geometry */
                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
                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
-               state_manager->add_state(&state_text);
+
+               /* bline tools */
                state_manager->add_state(&state_bline);
                if(!getenv("SYNFIG_DISABLE_DRAW"   )) state_manager->add_state(&state_draw); // Enabled for now.  Let's see whether they're good enough yet.
                state_manager->add_state(&state_bline);
                if(!getenv("SYNFIG_DISABLE_DRAW"   )) state_manager->add_state(&state_draw); // Enabled for now.  Let's see whether they're good enough yet.
-
-               /* other */
+               if(!getenv("SYNFIG_DISABLE_WIDTH"  )) state_manager->add_state(&state_width); // Enabled since 0.61.09
                state_manager->add_state(&state_fill);
                state_manager->add_state(&state_eyedrop);
                state_manager->add_state(&state_fill);
                state_manager->add_state(&state_eyedrop);
-               state_manager->add_state(&state_zoom);
+
+               /* other */
+               state_manager->add_state(&state_text);
                if(!getenv("SYNFIG_DISABLE_SKETCH" )) state_manager->add_state(&state_sketch);
                if(!getenv("SYNFIG_DISABLE_SKETCH" )) state_manager->add_state(&state_sketch);
+               state_manager->add_state(&state_zoom);
 
                studio_init_cb.task(_("Init ModPalette..."));
                module_list_.push_back(new ModPalette()); module_list_.back()->start();
 
                studio_init_cb.task(_("Init ModPalette..."));
                module_list_.push_back(new ModPalette()); module_list_.back()->start();
@@ -1311,10 +1317,9 @@ App::App(int *argc, char ***argv):
                if(auto_recover->recovery_needed())
                {
                        splash_screen.hide();
                if(auto_recover->recovery_needed())
                {
                        splash_screen.hide();
-                       if (get_ui_interface()->confirmation("Crash Recovery",
+                       if (get_ui_interface()->confirmation(_("Crash Recovery"),
                                        _("Auto recovery file found"),
                                        _("Auto recovery file found"),
-                                       _("Synfig Studio seems to have crashed\n"
-                                         "before you could save all your files.\n"
+                                       _("Synfig Studio seems to have crashed before you could save all your files. "
                                          "Recover unsaved changes?"),
                                        _("Recover"), _("Ignore"))
                                == synfigapp::UIInterface::RESPONSE_OK)
                                          "Recover unsaved changes?"),
                                        _("Recover"), _("Ignore"))
                                == synfigapp::UIInterface::RESPONSE_OK)
@@ -1326,11 +1331,10 @@ App::App(int *argc, char ***argv):
                                        else
                                                get_ui_interface()->error(_("Unable to recover from previous crash"));
                                else
                                        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."));
+                                       dialog_warning_blocking(_("Warning"),
+                                               _("Synfig Studio has attempted to recover from a previous crash. "
+                                               "The files that it has recovered are NOT YET SAVED. It would be a "
+                                               "good idea to review them and save them now."));
 
                                if (number_recovered)
                                        opened_any = true;
 
                                if (number_recovered)
                                        opened_any = true;
@@ -1357,6 +1361,15 @@ App::App(int *argc, char ***argv):
                studio_init_cb.task(_("Done."));
                studio_init_cb.amount_complete(10000,10000);
 
                studio_init_cb.task(_("Done."));
                studio_init_cb.amount_complete(10000,10000);
 
+               // To avoid problems with some window managers and gtk >= 2.18
+               // we should show dock dialogs after the settings load.
+               // If dock dialogs are shown before the settings are loaded,
+               // the windows manager can act over it.
+               // See discussions here:
+               // * http://synfig.org/forums/viewtopic.php?f=1&t=1131&st=0&sk=t&sd=a&start=30
+               // * http://synfig.org/forums/viewtopic.php?f=15&t=1062
+               dock_manager->show_all_dock_dialogs();
+
                toolbox->present();
        }
        catch(String x)
                toolbox->present();
        }
        catch(String x)
@@ -1427,13 +1440,10 @@ App::get_config_file(const synfig::String& file)
        return Glib::build_filename(get_user_app_directory(),file);
 }
 
        return Glib::build_filename(get_user_app_directory(),file);
 }
 
-#define SCALE_FACTOR   (1280)
 //! set the \a instance's canvas(es) position and size to be those specified in the first entry of recent_files_window_size
 void
 App::set_recent_file_window_size(etl::handle<Instance> instance)
 {
 //! set the \a instance's canvas(es) position and size to be those specified in the first entry of recent_files_window_size
 void
 App::set_recent_file_window_size(etl::handle<Instance> instance)
 {
-       int screen_w(Gdk::screen_width());
-       int screen_h(Gdk::screen_height());
 
        const std::string &canvas_window_size = *recent_files_window_size.begin();
 
 
        const std::string &canvas_window_size = *recent_files_window_size.begin();
 
@@ -1479,22 +1489,9 @@ App::set_recent_file_window_size(etl::handle<Instance> instance)
                        current = separator+1;
                        continue;
                }
                        current = separator+1;
                        continue;
                }
-
-               if (x > SCALE_FACTOR) x = SCALE_FACTOR - 150; if (x < 0) x = 0;
-               if (y > SCALE_FACTOR) y = SCALE_FACTOR - 150; if (y < 0) y = 0;
-               x=x*screen_w/SCALE_FACTOR;
-               y=y*screen_h/SCALE_FACTOR;
-               if(getenv("SYNFIG_WINDOW_POSITION_X_OFFSET"))
-                       x += atoi(getenv("SYNFIG_WINDOW_POSITION_X_OFFSET"));
-               if(getenv("SYNFIG_WINDOW_POSITION_Y_OFFSET"))
-                       y += atoi(getenv("SYNFIG_WINDOW_POSITION_Y_OFFSET"));
-
-               if (w > SCALE_FACTOR) w = 150; if (w < 0) w = 0;
-               if (h > SCALE_FACTOR) h = 150; if (h < 0) h = 0;
-
                CanvasView::Handle canvasview = instance->find_canvas_view(canvas);
                canvasview->move(x,y);
                CanvasView::Handle canvasview = instance->find_canvas_view(canvas);
                canvasview->move(x,y);
-               canvasview->resize(w*screen_w/SCALE_FACTOR,h*screen_h/SCALE_FACTOR);
+               canvasview->resize(w,h);
                canvasview->present();
 
                current = separator+1;
                canvasview->present();
 
                current = separator+1;
@@ -1507,8 +1504,6 @@ App::set_recent_file_window_size(etl::handle<Instance> instance)
 void
 App::add_recent_file(const etl::handle<Instance> instance)
 {
 void
 App::add_recent_file(const etl::handle<Instance> instance)
 {
-       int screen_w(Gdk::screen_width());
-       int screen_h(Gdk::screen_height());
 
        std::string canvas_window_size;
 
 
        std::string canvas_window_size;
 
@@ -1527,13 +1522,12 @@ App::add_recent_file(const etl::handle<Instance> instance)
 
                canvas_window_size += strprintf("%s %d %d %d %d\t",
                                                                                canvas->get_relative_id(canvas->get_root()).c_str(),
 
                canvas_window_size += strprintf("%s %d %d %d %d\t",
                                                                                canvas->get_relative_id(canvas->get_root()).c_str(),
-                                                                               x_pos*SCALE_FACTOR/screen_w,  y_pos*SCALE_FACTOR/screen_h,
-                                                                               x_size*SCALE_FACTOR/screen_w, y_size*SCALE_FACTOR/screen_h);
+                                                                               x_pos,  y_pos,
+                                                                               x_size, y_size);
        }
 
        add_recent_file(absolute_path(instance->get_file_name()), canvas_window_size);
 }
        }
 
        add_recent_file(absolute_path(instance->get_file_name()), canvas_window_size);
 }
-#undef SCALE_FACTOR
 
 void
 App::add_recent_file(const std::string &file_name, const std::string &window_size)
 
 void
 App::add_recent_file(const std::string &file_name, const std::string &window_size)
@@ -1732,16 +1726,94 @@ App::load_settings()
 void
 App::reset_initial_window_configuration()
 {
 void
 App::reset_initial_window_configuration()
 {
+       Glib::RefPtr<Gdk::Display> display(Gdk::Display::get_default());
+       Glib::RefPtr<const Gdk::Screen> screen(display->get_default_screen());
+       Gdk::Rectangle rect;
+       // A proper way to obtain the primary monitor is to use the
+       // Gdk::Screen::get_primary_monitor () const member. But as it
+       // was introduced in gtkmm 2.20 I assume that the monitor 0 is the
+       // primary one.
+       screen->get_monitor_geometry(0,rect);
+#define hpanel_width 79.0f
+#define hpanel_height 25.0f
+#define vpanel_width 20.0f
+#define vpanel_height 100.0f
+#define vdock 20.0f
+#define hdock 20.0f
+
+/* percentages referred to width or height of the screen
+ *---------------------------------------------------------------------*
+ *    t   |                                                |
+ *    o   |                                                |
+ *    o   |                                                |vdock%
+ *    l   |                                                |
+ *    b   |                                                |------------
+ *    o   |                                                |
+ *    x   |                                                |vdock%
+ * --------                                                |
+ *                                                         |
+ *                                                         |------------
+ *                                                         |
+ *                                                         |vdock%
+ *                                                         |
+ *                                                         |
+ *-----hdock%----------------------------------------------|------------
+ *             |                                           |
+ *             |                                           |vdock%
+ *             |                                           |
+ *             |                                           |
+ * --------------------------------------------------------------------*
+*/
+// Vertical Panel
+       int v_xpos=rect.get_x() + rect.get_width()*(1.0-vpanel_width/100.0);
+       int v_xsize=rect.get_width()*vpanel_width/100.0;
+       int v_ypos=rect.get_y();
+       int v_ysize=rect.get_height()*vpanel_height/100.0;
+       std::string v_pos(strprintf("%d %d", v_xpos, v_ypos));
+       std::string v_size(strprintf("%d %d", v_xsize, v_ysize));
+// Horizontal Panel
+       int h_xpos=rect.get_x();
+       int h_xsize=rect.get_width()*hpanel_width/100.0;
+       int h_ypos=rect.get_y()+ rect.get_height()*(1.0-hpanel_height/100.0);;
+       int h_ysize=rect.get_height()*hpanel_height/100.0;
+       std::string h_pos(strprintf("%d %d", h_xpos, h_ypos));
+       std::string h_size(strprintf("%d %d", h_xsize, h_ysize));
+       int v_dock1 = rect.get_height()*vdock*0.8/100.0;
+       int v_dock2 = rect.get_height()*vdock*0.6/100.0;
+       int v_dock3 = rect.get_height()*vdock*1.1/100.0;
+       int h_dock = rect.get_width()*hdock/100.0;
+//Contents size
+       std::string v_contents(strprintf("%d %d %d", v_dock1, v_dock2, v_dock3));
+       std::string h_contents(strprintf("%d", h_dock));
+// Tool Box position
+       std::string tbox_pos(strprintf("%d %d", rect.get_x(), rect.get_y()));
+/*
+       synfig::info("tool box pos: %s", tbox_pos.c_str());
+       synfig::info("v_contents sizes: %s", v_contents.c_str());
+       synfig::info("v_pos: %s", v_pos.c_str());
+       synfig::info("v_sizes: %s", v_size.c_str());
+       synfig::info("h_contents sizes: %s", h_contents.c_str());
+       synfig::info("h_pos: %s", h_pos.c_str());
+       synfig::info("h_sizes: %s", h_size.c_str());
+*/
        synfigapp::Main::settings().set_value("dock.dialog.1.comp_selector","1");
        synfigapp::Main::settings().set_value("dock.dialog.1.contents","navigator - info pal_edit pal_browse - tool_options history canvases - layers groups");
        synfigapp::Main::settings().set_value("dock.dialog.1.comp_selector","1");
        synfigapp::Main::settings().set_value("dock.dialog.1.contents","navigator - info pal_edit pal_browse - tool_options history canvases - layers groups");
-       synfigapp::Main::settings().set_value("dock.dialog.1.contents_size","225 167 207");
-       synfigapp::Main::settings().set_value("dock.dialog.1.pos","1057 32");
-       synfigapp::Main::settings().set_value("dock.dialog.1.size","208 1174");
+       synfigapp::Main::settings().set_value("dock.dialog.1.contents_size",v_contents);
+       synfigapp::Main::settings().set_value("dock.dialog.1.size",v_size);
+       synfigapp::Main::settings().set_value("dock.dialog.1.pos",v_pos);
        synfigapp::Main::settings().set_value("dock.dialog.2.comp_selector","0");
        synfigapp::Main::settings().set_value("dock.dialog.2.contents","params children keyframes | timetrack curves meta_data");
        synfigapp::Main::settings().set_value("dock.dialog.2.comp_selector","0");
        synfigapp::Main::settings().set_value("dock.dialog.2.contents","params children keyframes | timetrack curves meta_data");
-       synfigapp::Main::settings().set_value("dock.dialog.2.contents_size","263");
-       synfigapp::Main::settings().set_value("dock.dialog.2.pos","0 973");
-       synfigapp::Main::settings().set_value("dock.dialog.2.size","1045 235");
+       synfigapp::Main::settings().set_value("dock.dialog.2.contents_size",h_contents);
+       synfigapp::Main::settings().set_value("dock.dialog.2.size",h_size);
+       synfigapp::Main::settings().set_value("dock.dialog.2.pos",h_pos);
+       synfigapp::Main::settings().set_value("window.toolbox.pos",tbox_pos);
+
+       dock_manager->show_all_dock_dialogs();
+}
+
+void
+App::reset_initial_preferences()
+{
        synfigapp::Main::settings().set_value("pref.distance_system","pt");
        synfigapp::Main::settings().set_value("pref.use_colorspace_gamma","1");
 #ifdef SINGLE_THREADED
        synfigapp::Main::settings().set_value("pref.distance_system","pt");
        synfigapp::Main::settings().set_value("pref.use_colorspace_gamma","1");
 #ifdef SINGLE_THREADED
@@ -1755,7 +1827,7 @@ App::reset_initial_window_configuration()
        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("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");
+
 }
 
 bool
 }
 
 bool
@@ -2015,11 +2087,13 @@ App::dialog_save_file(const std::string &title, std::string &filename, std::stri
        {
                file_type_enum = manage(new Widget_Enum());
                file_type_enum->set_param_desc(ParamDesc().set_hint("enum")
        {
                file_type_enum = manage(new Widget_Enum());
                file_type_enum->set_param_desc(ParamDesc().set_hint("enum")
-                                                                          .add_enum_value(synfig::RELEASE_VERSION_0_62_00, "0.62.00", strprintf("0.62.00 (%s)", _("current")))
-                                                                          .add_enum_value(synfig::RELEASE_VERSION_0_61_09, "0.61.09", "0.61.09")
-                                                                          .add_enum_value(synfig::RELEASE_VERSION_0_61_08, "0.61.08", "0.61.08")
-                                                                          .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"))));
+                               .add_enum_value(synfig::RELEASE_VERSION_0_62_02, "0.62.02", strprintf("0.62.02 (%s)", _("current")))
+                               .add_enum_value(synfig::RELEASE_VERSION_0_62_01, "0.62.01", "0.62.01")
+                               .add_enum_value(synfig::RELEASE_VERSION_0_62_00, "0.62.00", "0.61.00")
+                               .add_enum_value(synfig::RELEASE_VERSION_0_61_09, "0.61.09", "0.61.09")
+                               .add_enum_value(synfig::RELEASE_VERSION_0_61_08, "0.61.08", "0.61.08")
+                               .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);
                file_type_enum->set_value(RELEASE_VERSION_END-1); // default to the most recent version
 
                Gtk::HBox *hbox = manage(new Gtk::HBox);
@@ -2206,10 +2280,10 @@ try_open_url(const std::string &url)
 void
 App::dialog_help()
 {
 void
 App::dialog_help()
 {
-       if (!try_open_url("http://synfig.org/Documentation"))
+       if (!try_open_url("http://synfig.org/wiki/Category:Manual"))
        {
                Gtk::MessageDialog dialog(_("Documentation"), false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_CLOSE, true);
        {
                Gtk::MessageDialog dialog(_("Documentation"), false, Gtk::MESSAGE_INFO, Gtk::BUTTONS_CLOSE, true);
-               dialog.set_secondary_text(_("Documentation for Synfig Studio is available on the website:\n\nhttp://www.synfig.org/Documentation"));
+               dialog.set_secondary_text(_("Documentation for Synfig Studio is available on the website:\n\nhttp://synfig.org/wiki/Category:Manual"));
                dialog.set_title(_("Help"));
                dialog.run();
        }
                dialog.set_title(_("Help"));
                dialog.run();
        }