Merge branch 'nikitakit_svg'
authorCarlos Lopez <genetita@gmail.com>
Sun, 24 Jan 2010 10:50:44 +0000 (11:50 +0100)
committerCarlos Lopez <genetita@gmail.com>
Sun, 24 Jan 2010 10:50:44 +0000 (11:50 +0100)
44 files changed:
synfig-core/configure.ac
synfig-core/po/ru.po
synfig-core/src/synfig/loadcanvas.cpp
synfig-core/src/synfig/valuenode_composite.cpp
synfig-studio/po/POTFILES.in
synfig-studio/po/ru.po
synfig-studio/src/gtkmm/app.cpp
synfig-studio/src/gtkmm/asyncrenderer.h
synfig-studio/src/gtkmm/canvasview.cpp
synfig-studio/src/gtkmm/dialog_setup.cpp
synfig-studio/src/gtkmm/dialog_tooloptions.cpp
synfig-studio/src/gtkmm/duck.cpp
synfig-studio/src/gtkmm/duck.h
synfig-studio/src/gtkmm/duckmatic.cpp
synfig-studio/src/gtkmm/duckmatic.h
synfig-studio/src/gtkmm/iconcontroller.cpp
synfig-studio/src/gtkmm/instance.cpp
synfig-studio/src/gtkmm/mod_mirror/state_mirror.cpp
synfig-studio/src/gtkmm/state_bline.cpp
synfig-studio/src/gtkmm/state_circle.cpp
synfig-studio/src/gtkmm/state_draw.cpp
synfig-studio/src/gtkmm/state_eyedrop.cpp
synfig-studio/src/gtkmm/state_fill.cpp
synfig-studio/src/gtkmm/state_gradient.cpp
synfig-studio/src/gtkmm/state_normal.cpp
synfig-studio/src/gtkmm/state_normal.h
synfig-studio/src/gtkmm/state_polygon.cpp
synfig-studio/src/gtkmm/state_rectangle.cpp
synfig-studio/src/gtkmm/state_rotate.cpp
synfig-studio/src/gtkmm/state_scale.cpp
synfig-studio/src/gtkmm/state_sketch.cpp
synfig-studio/src/gtkmm/state_smoothmove.cpp
synfig-studio/src/gtkmm/state_star.cpp
synfig-studio/src/gtkmm/state_text.cpp
synfig-studio/src/gtkmm/state_width.cpp
synfig-studio/src/gtkmm/state_zoom.cpp
synfig-studio/src/gtkmm/toolbox.cpp
synfig-studio/src/gtkmm/widget_filename.cpp
synfig-studio/src/gtkmm/widget_filename.h
synfig-studio/src/synfigapp/actions/blinepointtangentmerge.cpp
synfig-studio/src/synfigapp/actions/blinepointtangentsplit.cpp
synfig-studio/src/synfigapp/actions/valuedescset.cpp
synfig-studio/src/synfigapp/value_desc.cpp
synfig-studio/src/synfigapp/value_desc.h

index dd40d94..33a733d 100644 (file)
@@ -622,8 +622,11 @@ AC_SUBST(CXXFLAGS)
 AC_SUBST(CPPFLAGS)
 AC_SUBST(LDFLAGS)
 
-# this line is required for libtool 1.5.26 but must not be present for libtool 2.2.4...
-# AC_CONFIG_SUBDIRS(libltdl)
+# AC_CONFIG_SUBDIRS(libltdl) is required for libtool 1.5.26 but must not be present for
+# libtool 2.2.4. Problem seems to be that AC_LIB_LTDL (above) now calls AC_CONFIG_SUBDIRS
+# itself, through LTDL_INIT, _LTDL_SETUP, _LTDL_MODE_DISPATCH. We need to check the
+# condition that libltdl has already been registered with AC_CONFIG_SUBDIRS:
+m4_ifdef([_AC_SEEN_TAG(libltdl)], [], [AC_CONFIG_SUBDIRS(libltdl)])
 
 CONFIG_LIBS="-lsynfig"
 CONFIG_CFLAGS="$CONFIG_CFLAGS"
index 883324d..4abcea2 100755 (executable)
@@ -3,7 +3,7 @@ msgstr ""
 "Project-Id-Version: Synfig Backend\n"
 "Report-Msgid-Bugs-To: http://synfig.org/Bugs\n"
 "POT-Creation-Date: 2009-10-07 01:26+0400\n"
-"PO-Revision-Date: 2009-10-09 21:14+0400\n"
+"PO-Revision-Date: 2010-01-18 20:40+0600\n"
 "Last-Translator: Alexandre Prokoudine <alexandre.prokoudine@gmail.com>\n"
 "Language-Team: Russian <gnome-cyr@lists.gnome.org>\n"
 "MIME-Version: 1.0\n"
@@ -64,7 +64,7 @@ msgstr "Оставлять фаску круглой"
 
 #: ../src/modules/example/metaballs.cpp:56
 msgid "Metaballs"
-msgstr "Меташары"
+msgstr "Metaballs"
 
 #: ../src/modules/example/metaballs.cpp:132
 #: ../src/modules/mod_gradient/conicalgradient.cpp:106
@@ -860,7 +860,7 @@ msgstr "Узор Исключающего ИЛИ"
 
 #: ../src/modules/lyr_std/zoom.cpp:51 ../src/synfig/layer_pastecanvas.cpp:136
 msgid "Zoom"
-msgstr "УвелиÑ\87ение"
+msgstr "Ð\9cаÑ\81Ñ\88Ñ\82абиÑ\80ование"
 
 #: ../src/modules/lyr_std/zoom.cpp:97
 msgid "Amount to zoom in"
@@ -1695,7 +1695,7 @@ msgstr "Вставляемый холст"
 
 #: ../src/synfig/layer_pastecanvas.cpp:137
 msgid "Size of canvas"
-msgstr "Размерхолста"
+msgstr "Размер холста"
 
 #: ../src/synfig/layer_pastecanvas.cpp:145
 msgid "Children Lock"
@@ -1747,11 +1747,11 @@ msgstr "Используемый тип растушевки"
 
 #: ../src/synfig/layer_shape.cpp:1219
 msgid "Winding Style"
-msgstr "СÑ\82илÑ\8c Ð¸Ð·Ð³Ð¸Ð±Ð¾Ð²"
+msgstr "Ð\9eбÑ\80абоÑ\82ка Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð¿ÐµÑ\80еÑ\81еÑ\87ений"
 
 #: ../src/synfig/layer_shape.cpp:1220
 msgid "Winding style to use"
-msgstr "Ð\98Ñ\81полÑ\8cзÑ\83емÑ\8bй Ñ\81Ñ\82илÑ\8c Ð¸Ð·Ð³Ð¸Ð±Ð¾Ð²"
+msgstr "Ð\9fÑ\80именÑ\8fемаÑ\8f Ð¾Ð±Ñ\80абоÑ\82ка Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð¿ÐµÑ\80еÑ\81еÑ\87ений"
 
 #: ../src/synfig/layer_shape.cpp:1222
 msgid "Non Zero"
index 3da37e9..63f98c1 100644 (file)
@@ -8,6 +8,7 @@
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **     Copyright (c) 2007, 2008 Chris Moore
 **     Copyright (c) 2009 Carlos A. Sosa Navarro
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -1340,8 +1341,8 @@ CanvasParser::parse_linkable_value_node(xmlpp::Element *element,Canvas::Handle c
                if (version == "0.1" || version == "0.2" || version == "0.3")
                {
                        handle<LinkableValueNode> scale_value_node=LinkableValueNode::create("scale",type);
-                       scale_value_node->set_link(scale_value_node->get_link_index_from_name("link"), value_node);
-                       scale_value_node->set_link(scale_value_node->get_link_index_from_name("scalar"), ValueNode_Const::create(Real(0.5)));
+                       scale_value_node->set_link("link", value_node);
+                       scale_value_node->set_link("scalar", ValueNode_Const::create(Real(0.5)));
                        value_node = scale_value_node;
                }
        }
index 7e18ea0..dfde2e9 100644 (file)
@@ -7,6 +7,7 @@
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **     Copyright (c) 2008 Chris Moore
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -80,12 +81,12 @@ synfig::ValueNode_Composite::ValueNode_Composite(const ValueBase &value):
                case ValueBase::TYPE_BLINEPOINT:
                {
                        BLinePoint bline_point(value);
-                       set_link(0,ValueNode_Const::create(bline_point.get_vertex()));
-                       set_link(1,ValueNode_Const::create(bline_point.get_width()));
-                       set_link(2,ValueNode_Const::create(bline_point.get_origin()));
-                       set_link(3,ValueNode_Const::create(bline_point.get_split_tangent_flag()));
-                       set_link(4,ValueNode_RadialComposite::create(bline_point.get_tangent1()));
-                       set_link(5,ValueNode_RadialComposite::create(bline_point.get_tangent2()));
+                       set_link("point",ValueNode_Const::create(bline_point.get_vertex()));
+                       set_link("width",ValueNode_Const::create(bline_point.get_width()));
+                       set_link("origin",ValueNode_Const::create(bline_point.get_origin()));
+                       set_link("split",ValueNode_Const::create(bline_point.get_split_tangent_flag()));
+                       set_link("t1",ValueNode_RadialComposite::create(bline_point.get_tangent1()));
+                       set_link("t2",ValueNode_RadialComposite::create(bline_point.get_tangent2()));
                        break;
                }
                default:
index e062169..cbd89f3 100644 (file)
@@ -191,10 +191,6 @@ src/gtkmm/state_polygon.cpp
 src/gtkmm/state_polygon.h
 src/gtkmm/state_rectangle.cpp
 src/gtkmm/state_rectangle.h
-src/gtkmm/state_rotate.cpp
-src/gtkmm/state_rotate.h
-src/gtkmm/state_scale.cpp
-src/gtkmm/state_scale.h
 src/gtkmm/state_sketch.cpp
 src/gtkmm/state_sketch.h
 src/gtkmm/state_smoothmove.cpp
index d612d11..f2e4605 100755 (executable)
@@ -1,9 +1,10 @@
+# 
 msgid ""
 msgstr ""
 "Project-Id-Version: Synfig Studio\n"
 "Report-Msgid-Bugs-To: http://synfig.org/Bugs\n"
 "POT-Creation-Date: 2009-10-07 04:46+0400\n"
-"PO-Revision-Date: 2009-10-09 21:06+0400\n"
+"PO-Revision-Date: 2009-12-24 19:21+0500\n"
 "Last-Translator: Alexandre Prokoudine <alexandre.prokoudine@gmail.com>\n"
 "Language-Team: Russian <gnome-cyr@lists.gnome.org>\n"
 "MIME-Version: 1.0\n"
@@ -14,7 +15,7 @@ msgstr ""
 
 #: ../synfigstudio.desktop.in.h:1
 msgid "Create and edit 2D animations and compositions"
-msgstr "Создание двухмерной векторной анимации"
+msgstr "Создание 2D векторной анимации и графики"
 
 #: ../synfigstudio.desktop.in.h:2 ../src/gtkmm/app.cpp:1188
 #: ../src/gtkmm/toolbox.cpp:360
@@ -54,7 +55,7 @@ msgstr "Участники проекта:"
 #. TRANSLATORS: change this to your name, separate multiple names with \n
 #: ../src/gtkmm/about.cpp:177
 msgid "translator-credits"
-msgstr "Александр Прокудин <alexandre.prokoudine@gmail.com>"
+msgstr "Александр Прокудин <alexandre.prokoudine@gmail.com>\nКонстантин Дмитриев <ksee.zelgadis@gmail.com>"
 
 #: ../src/gtkmm/about.cpp:204
 #, c-format
@@ -64,7 +65,7 @@ msgid ""
 "%s\n"
 msgstr ""
 "\n"
-"Ð\9dеÑ\81Ñ\82абилÑ\8cнаÑ\8f Ð²ÐµÑ\80Ñ\81иÑ\8f:\n"
+"СбоÑ\80ка:\n"
 "%s\n"
 
 #: ../src/gtkmm/about.cpp:209
@@ -103,7 +104,7 @@ msgstr "GNU G++ %d.%d.%d\n"
 
 #: ../src/gtkmm/about.cpp:224
 msgid "Using:\n"
-msgstr "Использование:\n"
+msgstr "Используется:\n"
 
 #: ../src/gtkmm/about.cpp:225
 #, c-format
@@ -137,7 +138,7 @@ msgstr "Сло_й"
 
 #: ../src/gtkmm/app.cpp:738
 msgid "Show/Hide Ducks"
-msgstr "Ð\9fоказаÑ\82Ñ\8c\81кÑ\80Ñ\8bÑ\82Ñ\8c Ñ\80Ñ\83чки"
+msgstr "Ð\9fоказаÑ\82Ñ\8c\81кÑ\80Ñ\8bÑ\82Ñ\8c Ñ\83Точки"
 
 #: ../src/gtkmm/app.cpp:739
 msgid "Preview Quality"
@@ -183,7 +184,7 @@ msgstr "Импортировать"
 
 #: ../src/gtkmm/app.cpp:774 ../src/gtkmm/canvasview.cpp:1461
 msgid "Render"
-msgstr "Ð\9eÑ\82Ñ\80иÑ\81овка"
+msgstr "Ð\92изÑ\83ализаÑ\86иÑ\8f"
 
 #: ../src/gtkmm/app.cpp:775 ../src/gtkmm/canvasview.cpp:1464
 #: ../src/gtkmm/dialog_preview.cpp:171
@@ -213,11 +214,11 @@ msgstr "Закрыть документ"
 
 #: ../src/gtkmm/app.cpp:789 ../src/gtkmm/canvasview.cpp:1491
 msgid "Select All Ducks"
-msgstr "Ð\92Ñ\8bбÑ\80аÑ\82Ñ\8c Ð²Ñ\81е Ñ\80Ñ\83чки"
+msgstr "Ð\92Ñ\8bделиÑ\82Ñ\8c Ð²Ñ\81е Ñ\83Точки"
 
 #: ../src/gtkmm/app.cpp:790 ../src/gtkmm/canvasview.cpp:1495
 msgid "Unselect All Ducks"
-msgstr "Снять выделение с ручек"
+msgstr "Снять выделение со всех уТочек"
 
 #: ../src/gtkmm/app.cpp:791 ../src/gtkmm/canvasview.cpp:1499
 msgid "Select All Layers"
@@ -233,27 +234,27 @@ msgstr "Свойства"
 
 #: ../src/gtkmm/app.cpp:795 ../src/gtkmm/canvasview.cpp:1669
 msgid "Show Position Ducks"
-msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ñ\80Ñ\83чки положения"
+msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ñ\83Точки положения"
 
 #: ../src/gtkmm/app.cpp:796 ../src/gtkmm/canvasview.cpp:1671
 msgid "Show Vertex Ducks"
-msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ñ\80Ñ\83чки вершин"
+msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ñ\83Точки вершин"
 
 #: ../src/gtkmm/app.cpp:797 ../src/gtkmm/canvasview.cpp:1670
 msgid "Show Tangent Ducks"
-msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ñ\80Ñ\83чки касательных"
+msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ñ\83Точки касательных"
 
 #: ../src/gtkmm/app.cpp:798 ../src/gtkmm/canvasview.cpp:1672
 msgid "Show Radius Ducks"
-msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ñ\80Ñ\83чки радиусов"
+msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ñ\83Точки радиусов"
 
 #: ../src/gtkmm/app.cpp:799 ../src/gtkmm/canvasview.cpp:1673
 msgid "Show Width Ducks"
-msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ñ\80Ñ\83чки толщины"
+msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ñ\83Точки толщины"
 
 #: ../src/gtkmm/app.cpp:800 ../src/gtkmm/canvasview.cpp:1674
 msgid "Show Angle Ducks"
-msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ñ\80Ñ\83чки углов"
+msgstr "Ð\9fоказÑ\8bваÑ\82Ñ\8c Ñ\83Точки углов"
 
 #: ../src/gtkmm/app.cpp:801 ../src/gtkmm/canvasview.cpp:1522
 msgid "Use Parametric Renderer"
@@ -621,7 +622,7 @@ msgid ""
 "\n"
 "http://www.synfig.org/Documentation"
 msgstr ""
-"Ð\94окÑ\83менÑ\82аÑ\86иÑ\8f Ð¿Ð¾ Synfig Studio Ð´Ð¾Ñ\81Ñ\82Ñ\83пна Ð½Ð° Ñ\81айÑ\82е:\n"
+"Ð\94окÑ\83менÑ\82аÑ\86иÑ\8f Ð¿Ð¾ Synfig Studio Ð´Ð¾Ñ\81Ñ\82Ñ\83пна Ð¿Ð¾ Ð°Ð´Ñ\80еÑ\81Ñ\83:\n"
 "\n"
 "http://www.synfig.org/Documentation"
 
@@ -926,7 +927,7 @@ msgstr "Отдалить временную шкалу"
 
 #: ../src/gtkmm/canvasview.cpp:2059 ../src/gtkmm/canvasview.cpp:2532
 msgid "Select All Children"
-msgstr "Выделить всех потомков"
+msgstr "Выделить содержимое"
 
 #: ../src/gtkmm/canvasview.cpp:2345
 msgid "-MODIFIED"
@@ -951,7 +952,7 @@ msgstr "Не в режиме анимации"
 #: ../src/gtkmm/canvasview.cpp:2798 ../src/gtkmm/iconcontroller.cpp:185
 #: ../src/gtkmm/keyframedial.cpp:59
 msgid "All Keyframes Locked"
-msgstr "Ð\92Ñ\81е ÐºÐ»Ñ\8eÑ\87евÑ\8bе ÐºÐ°Ð´Ñ\80Ñ\8b Ð·Ð°Ð¿ÐµÑ\80Ñ\82ы"
+msgstr "Ð\92Ñ\81е ÐºÐ»Ñ\8eÑ\87евÑ\8bе ÐºÐ°Ð´Ñ\80Ñ\8b Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80ованы"
 
 #: ../src/gtkmm/canvasview.cpp:2808 ../src/gtkmm/iconcontroller.cpp:187
 msgid "Future Keyframes Locked"
@@ -963,7 +964,7 @@ msgstr "Прошлые ключевые кадры заперты"
 
 #: ../src/gtkmm/canvasview.cpp:2828 ../src/gtkmm/iconcontroller.cpp:188
 msgid "No Keyframes Locked"
-msgstr "Ð\9dеÑ\82 Ð·Ð°Ð¿ÐµÑ\80Ñ\82ых ключевых кадров"
+msgstr "Ð\9dеÑ\82 Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ\80ованных ключевых кадров"
 
 #: ../src/gtkmm/canvasview.cpp:3587
 msgid "Change Waypoint Group"
@@ -1145,15 +1146,15 @@ msgstr "_Масштаб:"
 
 #: ../src/gtkmm/dialog_preview.cpp:129 ../src/gtkmm/renddesc.cpp:546
 msgid "_Frames per second"
-msgstr "_Кадров:"
+msgstr "_Кадров в секунду:"
 
 #: ../src/gtkmm/dialog_preview.cpp:138 ../src/gtkmm/renddesc.cpp:532
 msgid "Time Settings"
-msgstr "Ð\92Ñ\80еменнÑ\8bе Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\8b"
+msgstr "Ð\9fаÑ\80амеÑ\82Ñ\80Ñ\8b Ð²Ñ\80емени"
 
 #: ../src/gtkmm/dialog_preview.cpp:140 ../src/gtkmm/renddesc.cpp:534
 msgid "<b>Time Settings</b>"
-msgstr "<b>Ð\92Ñ\80еменнÑ\8bе Ð¿Ð°Ñ\80амеÑ\82Ñ\80Ñ\8b</b>"
+msgstr "<b>Ð\9fаÑ\80амеÑ\82Ñ\80Ñ\8b Ð²Ñ\80емени</b>"
 
 #: ../src/gtkmm/dialog_setup.cpp:73
 msgid "Synfig Studio Setup"
@@ -1165,11 +1166,11 @@ msgstr "Визуально линейный выбор цвета"
 
 #: ../src/gtkmm/dialog_setup.cpp:81
 msgid "Use Only a Single Thread"
-msgstr "Ð\98Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ñ\82олÑ\8cко Ð¾Ð´Ð½Ñ\83 Ð½Ð¸Ñ\82Ñ\8c"
+msgstr "Ð\98Ñ\81полÑ\8cзоваÑ\82Ñ\8c Ñ\82олÑ\8cко Ð¾Ð´Ð¸Ð½ Ð¿Ð¾Ñ\82ок"
 
 #: ../src/gtkmm/dialog_setup.cpp:83
 msgid "Restrict Real-Valued Ducks to Top Right Quadrant"
-msgstr "Ð\9eгÑ\80аниÑ\87иÑ\82Ñ\8c Ð²ÐµÑ\80Ñ\85ним Ð¿Ñ\80авÑ\8bм ÐºÐ²Ð°Ð´Ñ\80анÑ\82ом Ñ\80Ñ\83Ñ\87ки Ñ\81 Ñ\80еалÑ\8cнÑ\8bм значением"
+msgstr "Ð\9eгÑ\80аниÑ\87иÑ\82Ñ\8c Ð²ÐµÑ\80Ñ\85ним Ð¿Ñ\80авÑ\8bм ÐºÐ²Ð°Ð´Ñ\80анÑ\82ом Ñ\83ТоÑ\87ки, Ð·Ð°Ð´Ð°Ñ\8eÑ\89ие Ñ\87иÑ\81ловое значением"
 
 #: ../src/gtkmm/dialog_setup.cpp:84
 msgid "Scale New Imported Images to Fit Canvas"
@@ -1209,7 +1210,7 @@ msgstr "Пиксел"
 
 #: ../src/gtkmm/dialog_setup.cpp:181
 msgid "Points"
-msgstr "Ð\9fÑ\83нкÑ\82"
+msgstr "ТоÑ\87ка"
 
 #: ../src/gtkmm/dialog_setup.cpp:182
 msgid "Inches"
@@ -1337,7 +1338,7 @@ msgstr "Количество кадров в секунду:"
 
 #: ../src/gtkmm/dialog_setup.cpp:289
 msgid "New Document FPS"
-msgstr "Ð\9fо Ñ\83молÑ\87аниÑ\8e"
+msgstr "ЧаÑ\81Ñ\82оÑ\82а ÐºÐ°Ð´Ñ\80ов"
 
 #: ../src/gtkmm/dialog_setup.cpp:291
 msgid "Frames per second of the new created document"
@@ -1345,11 +1346,11 @@ msgstr "Количество кадров в секунду в каждом но
 
 #: ../src/gtkmm/dialog_setup.h:51
 msgid "Custom Size"
-msgstr "Ð\97аказной размер"
+msgstr "Ð\94Ñ\80Ñ\83гой размер"
 
 #: ../src/gtkmm/dialog_setup.h:54
 msgid "Custom fps"
-msgstr "Ð\97аказное ÐºÐ¾Ð»Ð¸Ñ\87еÑ\81Ñ\82во"
+msgstr "Ð\94Ñ\80Ñ\83гоаÑ\8f Ñ\87аÑ\81Ñ\82оÑ\82а ÐºÐ°Ð´Ñ\80ов"
 
 #: ../src/gtkmm/dialog_soundselect.cpp:60
 msgid "Sound Select"
@@ -1361,7 +1362,7 @@ msgstr "Параметры звука"
 
 #: ../src/gtkmm/dialog_soundselect.cpp:68
 msgid "<b>Sound Parameters</b>"
-msgstr "<b>Параметры</b>"
+msgstr "<b>Параметры звука</b>"
 
 #: ../src/gtkmm/dialog_soundselect.cpp:76
 msgid "_Sound File"
@@ -1369,7 +1370,7 @@ msgstr "_Звуковой файл"
 
 #: ../src/gtkmm/dialog_soundselect.cpp:79
 msgid "Time _Offset"
-msgstr "_Смещение во времени"
+msgstr "_Смещение времени"
 
 #: ../src/gtkmm/dialog_tooloptions.cpp:56
 #: ../src/gtkmm/dialog_tooloptions.cpp:78
@@ -1458,7 +1459,7 @@ msgstr "Переход"
 
 #: ../src/gtkmm/dock_history.cpp:216 ../src/gtkmm/keyframetree.cpp:96
 msgid "(JMP)"
-msgstr "(Ð\9fÐ¥Ð\94)"
+msgstr "(пеÑ\80ейÑ\82и)"
 
 #: ../src/gtkmm/dock_history.cpp:228
 msgid "Action"
@@ -1473,7 +1474,8 @@ msgstr "Очистить историю"
 msgid ""
 "You will not be able to undo any changes that you have made!\n"
 "Are you sure you want to clear the undo stack?"
-msgstr "Вы не сможете "
+msgstr "Вы не сможете отменить сделанные ранее изменения!\n"
+"Уверены, что хотите очистить историю действий?"
 
 #: ../src/gtkmm/dock_history.cpp:284
 msgid ""
@@ -1682,7 +1684,7 @@ msgstr "Изолировать"
 
 #: ../src/gtkmm/iconcontroller.cpp:173 ../src/gtkmm/layeractionmanager.cpp:135
 msgid "Select All Child Layers"
-msgstr "Выбрать все слои-потомки"
+msgstr "Выбрать все вложенные слои"
 
 #: ../src/gtkmm/iconcontroller.cpp:181
 msgid "MetaData"
@@ -1690,27 +1692,27 @@ msgstr "Метаданные"
 
 #: ../src/gtkmm/iconcontroller.cpp:198 ../src/gtkmm/toggleducksdial.cpp:55
 msgid "Toggle position ducks"
-msgstr "Ð\9fеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8c Ñ\80Ñ\83чки положения"
+msgstr "Ð\9fеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8c Ñ\83Точки положения"
 
 #: ../src/gtkmm/iconcontroller.cpp:199 ../src/gtkmm/toggleducksdial.cpp:56
 msgid "Toggle vertex ducks"
-msgstr "Ð\9fеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8c Ñ\80Ñ\83чки вершин"
+msgstr "Ð\9fеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8c Ñ\83Точки вершин"
 
 #: ../src/gtkmm/iconcontroller.cpp:200 ../src/gtkmm/toggleducksdial.cpp:57
 msgid "Toggle tangent ducks"
-msgstr "Ð\9fеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8c Ñ\80Ñ\83чки касательных"
+msgstr "Ð\9fеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8c Ñ\83Точки касательных"
 
 #: ../src/gtkmm/iconcontroller.cpp:201 ../src/gtkmm/toggleducksdial.cpp:58
 msgid "Toggle radius ducks"
-msgstr "Ð\9fеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8c Ñ\80Ñ\83чки радиусов"
+msgstr "Ð\9fеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8c Ñ\83Точки радиусов"
 
 #: ../src/gtkmm/iconcontroller.cpp:202 ../src/gtkmm/toggleducksdial.cpp:59
 msgid "Toggle width ducks"
-msgstr "Ð\9fеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8c Ñ\80Ñ\83чки ширины"
+msgstr "Ð\9fеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8c Ñ\83Точки ширины"
 
 #: ../src/gtkmm/iconcontroller.cpp:203 ../src/gtkmm/toggleducksdial.cpp:60
 msgid "Toggle angle ducks"
-msgstr "Ð\9fеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8c Ñ\80Ñ\83чки углов"
+msgstr "Ð\9fеÑ\80еклÑ\8eÑ\87иÑ\82Ñ\8c Ñ\83Точки углов"
 
 #: ../src/gtkmm/iconcontroller.cpp:205
 msgid "Toggle show grid"
@@ -1738,7 +1740,7 @@ msgstr "Параметры предпросмотра"
 
 #: ../src/gtkmm/iconcontroller.cpp:214
 msgid "Render Options Dialog"
-msgstr "Ð\9fаÑ\80амеÑ\82Ñ\80Ñ\8b Ð¾Ñ\82Ñ\80иÑ\81овки"
+msgstr "Ð\9fаÑ\80амеÑ\82Ñ\80Ñ\8b Ð²Ð¸Ð·Ñ\83ализаÑ\86ии"
 
 #: ../src/gtkmm/iconcontroller.cpp:216
 msgid "CVS Add"
@@ -1783,12 +1785,12 @@ msgstr "Векторный карандаш"
 #: ../src/gtkmm/iconcontroller.cpp:228 ../src/gtkmm/state_sketch.cpp:325
 #: ../src/gtkmm/state_sketch.cpp:399
 msgid "Sketch Tool"
-msgstr "РаÑ\81Ñ\82Ñ\80овÑ\8bй ÐºÐ°Ñ\80андаÑ\88"
+msgstr "ЭÑ\81киз"
 
 #: ../src/gtkmm/iconcontroller.cpp:229 ../src/gtkmm/state_circle.cpp:432
 #: ../src/gtkmm/state_circle.cpp:496
 msgid "Circle Tool"
-msgstr "Ð\9aÑ\80Ñ\83ги Ð¸ Ñ\8dллипÑ\81Ñ\8b"
+msgstr "Ð\9eкÑ\80Ñ\83жноÑ\81Ñ\82и"
 
 #: ../src/gtkmm/iconcontroller.cpp:230 ../src/gtkmm/state_rectangle.cpp:352
 #: ../src/gtkmm/state_rectangle.cpp:408
@@ -1797,7 +1799,7 @@ msgstr "Прямоугольник"
 
 #: ../src/gtkmm/iconcontroller.cpp:231 ../src/gtkmm/state_smoothmove.cpp:177
 msgid "SmoothMove Tool"
-msgstr "Ð\9fеÑ\80емеÑ\89ение"
+msgstr "Ð\94еÑ\84оÑ\80маÑ\86иÑ\8f"
 
 #: ../src/gtkmm/iconcontroller.cpp:232 ../src/gtkmm/state_scale.cpp:167
 #: ../src/gtkmm/state_scale.cpp:193
@@ -2050,7 +2052,7 @@ msgstr "На этом холсте нет ключевых кадров"
 
 #: ../src/gtkmm/layeractionmanager.cpp:129
 msgid "Amount"
-msgstr "ЧиÑ\81ло"
+msgstr "Ð\92елиÑ\87ина"
 
 #: ../src/gtkmm/layeractionmanager.cpp:365
 msgid "Paste"
@@ -2158,7 +2160,7 @@ msgstr "Остановить отрисовку"
 
 #: ../src/gtkmm/preview.cpp:382
 msgid "Re-Preview"
-msgstr "Ð\9eÑ\82кÑ\80Ñ\8bÑ\82Ñ\8c Ð´Ð¸Ð°Ð»Ð¾Ð³ Ð¿Ð°Ñ\80амеÑ\82Ñ\80ов"
+msgstr "Ð\9fеÑ\80еÑ\81Ñ\87иÑ\82аÑ\82Ñ\8c"
 
 #: ../src/gtkmm/preview.cpp:388
 msgid "Erase All"
@@ -2262,11 +2264,11 @@ msgstr "_Время начала:"
 
 #: ../src/gtkmm/renddesc.cpp:574
 msgid "Locks and Links"
-msgstr "Ð\97апиÑ\80ание и связи"
+msgstr "Ð\91локиÑ\80овки и связи"
 
 #: ../src/gtkmm/renddesc.cpp:576
 msgid "<b>Locks and Links</b>"
-msgstr "<b>Ð\97апиÑ\80ание и связи</b>"
+msgstr "<b>Ð\91локиÑ\80овки и связи</b>"
 
 #: ../src/gtkmm/renddesc.cpp:597
 msgid "Focus Point"
@@ -2282,7 +2284,7 @@ msgstr "_Точка фокусировки"
 
 #: ../src/gtkmm/render.cpp:63 ../src/gtkmm/render.cpp:179
 msgid "Render Settings"
-msgstr "Ð\9fаÑ\80амеÑ\82Ñ\80Ñ\8b Ð¾Ñ\82Ñ\80иÑ\81овки"
+msgstr "Ð\9fаÑ\80амеÑ\82Ñ\80Ñ\8b Ð²Ð¸Ð·Ñ\83ализаÑ\86ии"
 
 #: ../src/gtkmm/render.cpp:69
 msgid "Use _current frame"
@@ -2354,7 +2356,7 @@ msgstr ""
 
 #: ../src/gtkmm/render.cpp:318
 msgid "Rendering "
-msgstr "Ð\9eÑ\82Ñ\80иÑ\81овка"
+msgstr "Ð\92изÑ\83ализаÑ\86иÑ\8f"
 
 #: ../src/gtkmm/render.cpp:346
 msgid "File rendered successfully"
@@ -2366,7 +2368,7 @@ msgstr "Увеличить разрешение для просмотра"
 
 #: ../src/gtkmm/resolutiondial.cpp:57
 msgid "Decrease Display Resolution"
-msgstr "УменÑ\8cÑ\88иÑ\82Ñ\8c Ñ\80азÑ\80еÑ\88ение Ð´Ð»Ñ\8f Ð¿Ñ\80оÑ\81моÑ\82Ñ\80а"
+msgstr "Уменьшить разрешение просмотра"
 
 #: ../src/gtkmm/resolutiondial.cpp:58
 msgid "Low Res"
@@ -2396,19 +2398,19 @@ msgstr "Создать кривую области"
 #: ../src/gtkmm/state_draw.cpp:414 ../src/gtkmm/state_polygon.cpp:326
 #: ../src/gtkmm/state_rectangle.cpp:343 ../src/gtkmm/state_star.cpp:443
 msgid "Create Outline BLine"
-msgstr "СоздаÑ\82Ñ\8c ÐºÑ\80ивÑ\83Ñ\8e Ð°Ð±Ñ\80иÑ\81а"
+msgstr "СоздаÑ\82Ñ\8c ÐºÑ\80ивÑ\83Ñ\8e ÐºÐ¾Ð½Ñ\82Ñ\83Ñ\80а"
 
 #: ../src/gtkmm/state_bline.cpp:363 ../src/gtkmm/state_circle.cpp:406
 #: ../src/gtkmm/state_polygon.cpp:327 ../src/gtkmm/state_rectangle.cpp:344
 #: ../src/gtkmm/state_star.cpp:444
 msgid "Create Curve Gradient BLine"
-msgstr "Создать градиентную кривую"
+msgstr "Создать градиент по кривой"
 
 #: ../src/gtkmm/state_bline.cpp:364 ../src/gtkmm/state_circle.cpp:407
 #: ../src/gtkmm/state_polygon.cpp:328 ../src/gtkmm/state_rectangle.cpp:345
 #: ../src/gtkmm/state_star.cpp:445
 msgid "Create Plant BLine"
-msgstr "СоздаÑ\82Ñ\8c ÐºÑ\80ивÑ\83Ñ\8e Ñ\80аÑ\81Ñ\82ениÑ\8f"
+msgstr "СоздаÑ\82Ñ\8c ÐºÑ\80ивÑ\83Ñ\8e Ñ\81 Ñ\80аÑ\81Ñ\82ениÑ\8fми"
 
 #: ../src/gtkmm/state_bline.cpp:365 ../src/gtkmm/state_circle.cpp:408
 #: ../src/gtkmm/state_polygon.cpp:329 ../src/gtkmm/state_star.cpp:446
@@ -2554,7 +2556,7 @@ msgstr ""
 #: ../src/gtkmm/state_bline.cpp:1378
 #: ../src/synfigapp/actions/blinepointtangentmerge.cpp:56
 msgid "Merge Tangents"
-msgstr "Ð\9eбÑ\8aединить касательные"
+msgstr "СвÑ\8fзать касательные"
 
 #: ../src/gtkmm/state_bline.cpp:1385
 #: ../src/synfigapp/actions/blinepointtangentsplit.cpp:56
@@ -2644,7 +2646,7 @@ msgstr ""
 
 #: ../src/gtkmm/state_draw.cpp:410
 msgid "Auto Loop"
-msgstr "Ð\90вÑ\82оÑ\86икл"
+msgstr "Ð\97амÑ\8bкаÑ\82Ñ\8c Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки"
 
 #: ../src/gtkmm/state_draw.cpp:411
 msgid "Auto Extend"
@@ -2704,7 +2706,7 @@ msgstr ""
 
 #: ../src/gtkmm/state_gradient.cpp:271
 msgid "Gradient Type"
-msgstr "Тип градиент"
+msgstr "Тип градиента"
 
 #: ../src/gtkmm/state_gradient.cpp:272
 msgid "Determines the type of Gradient used"
@@ -2809,7 +2811,7 @@ msgstr "Отменить штрих"
 
 #: ../src/gtkmm/state_sketch.cpp:241
 msgid "Show Sketch"
-msgstr "Ð\9fоказÑ\8bвать эскиз"
+msgstr "Ð\9eÑ\82обÑ\80ажать эскиз"
 
 #: ../src/gtkmm/state_sketch.cpp:256 ../src/gtkmm/state_sketch.cpp:257
 msgid "Undo Last Stroke"
@@ -2818,7 +2820,7 @@ msgstr "Отменить последний штрих"
 #: ../src/gtkmm/state_sketch.cpp:280 ../src/gtkmm/state_sketch.cpp:281
 #: ../src/gtkmm/state_sketch.cpp:292 ../src/gtkmm/state_sketch.cpp:293
 msgid "Save Sketch As..."
-msgstr "Ð\9eÑ\87иÑ\81Ñ\82ить эскиз как..."
+msgstr "СоÑ\85Ñ\80анить эскиз как..."
 
 #: ../src/gtkmm/state_sketch.cpp:304 ../src/gtkmm/state_sketch.cpp:305
 msgid "Open a Sketch"
@@ -3019,7 +3021,7 @@ msgstr "/Contact"
 #. TRANSLATORS: Help menu entry
 #: ../src/gtkmm/toolbox.cpp:273
 msgid "Keyboard Shortcuts"
-msgstr "Ð\9aлавиаÑ\82Ñ\83Ñ\80нÑ\8bе ÐºÐ¾Ð¼Ð±Ð¸Ð½Ð°Ñ\86ии"
+msgstr "Ð\9aомбинаÑ\86ии ÐºÐ»Ð°Ð²Ð¸Ñ\88"
 
 #. TRANSLATORS: a wiki page
 #: ../src/gtkmm/toolbox.cpp:273
@@ -3047,7 +3049,7 @@ msgstr "_Справка"
 
 #: ../src/gtkmm/toolbox.cpp:290
 msgid "New..."
-msgstr "Создать"
+msgstr "Создать..."
 
 #: ../src/gtkmm/toolbox.cpp:291
 msgid "Open..."
@@ -3071,7 +3073,7 @@ msgstr "О Synfig Studio"
 
 #: ../src/gtkmm/widget_canvaschooser.cpp:115
 msgid "Other..."
-msgstr "Ð\94Ñ\80Ñ\83гое..."
+msgstr "Ð\94Ñ\80Ñ\83гой..."
 
 #: ../src/gtkmm/widget_canvaschooser.cpp:136
 msgid "Choose Canvas"
@@ -3135,11 +3137,11 @@ msgstr "V"
 
 #: ../src/gtkmm/widget_coloredit.cpp:382
 msgid "Alpha"
-msgstr "Ð\90лÑ\8cÑ\84а"
+msgstr "Ð\9fÑ\80озÑ\80аÑ\87ноÑ\81Ñ\82Ñ\8c"
 
 #: ../src/gtkmm/widget_defaults.cpp:215
 msgid "Outline Color"
-msgstr "ЦвеÑ\82 Ð¾Ð±Ð²Ð¾Ð´ÐºÐ¸"
+msgstr "ЦвеÑ\82 ÐºÐ¾Ð½Ñ\82Ñ\83Ñ\80а"
 
 #: ../src/gtkmm/widget_defaults.cpp:223
 msgid "Fill Color"
@@ -3271,11 +3273,11 @@ msgstr "Интерполяция на в_ыходе"
 
 #: ../src/gtkmm/widget_waypoint.cpp:175
 msgid "TCB Parameters"
-msgstr "Параметры TCB"
+msgstr "TCB-параметры"
 
 #: ../src/gtkmm/widget_waypoint.cpp:177
 msgid "<b>TCB Parameter</b>"
-msgstr "<b>Параметр TCB</b>"
+msgstr "<b>TCB-параметр</b>"
 
 #: ../src/gtkmm/widget_waypoint.cpp:189
 msgid "T_ension"
@@ -3327,16 +3329,16 @@ msgstr ""
 
 #: ../src/gtkmm/workarea.cpp:2339
 msgid "Rendering..."
-msgstr "Ð\9eÑ\82Ñ\80иÑ\81овка..."
+msgstr "Ð\92изÑ\83ализаÑ\86иÑ\8f..."
 
 #: ../src/gtkmm/workarea.cpp:2366 ../src/gtkmm/workarea.cpp:2458
 msgid "Render Failed"
-msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð¾Ñ\82Ñ\80иÑ\81овать"
+msgstr "Ð\9dе Ñ\83далоÑ\81Ñ\8c Ð²Ð¸Ð·Ñ\83ализиÑ\80овать"
 
 #: ../src/gtkmm/workarea.cpp:2440
 #, c-format
 msgid "Rendering canvas %s..."
-msgstr "Ð\9eÑ\82Ñ\80иÑ\81овка холста %s..."
+msgstr "Ð\92изÑ\83ализаÑ\86иÑ\8f холста %s..."
 
 #: ../src/gtkmm/zoomdial.cpp:55
 msgid "Zoom In"
@@ -4201,8 +4203,7 @@ msgstr ""
 
 #: ../src/synfigapp/actions/valuedescset.cpp:542
 msgid "You must be in Animate-Editing-Mode to directly manipulate this value"
-msgstr ""
-"Для прямого редактирования этого значения необходимо быть в режиме анимации"
+msgstr "Для прямого редактирования этого значения необходимо быть в режиме анимации"
 
 #: ../src/synfigapp/actions/valuedescset.cpp:564
 msgid "Unsupported ValueDesc type"
@@ -4286,11 +4287,11 @@ msgstr ""
 
 #: ../src/synfigapp/actions/valuenodedynamiclistrotateorder.cpp:50
 msgid "Rotate Order"
-msgstr "Ð\9fоÑ\80Ñ\8fдок Ð²Ñ\80аÑ\89ениÑ\8f"
+msgstr "СмениÑ\82Ñ\8c Ð¿Ð¾Ñ\80Ñ\8fдок"
 
 #: ../src/synfigapp/actions/valuenodedynamiclistunloop.cpp:50
 msgid "Unloop"
-msgstr "СнÑ\8fÑ\82Ñ\8c Ð¿ÐµÑ\82лÑ\8e"
+msgstr "РазомкнÑ\83Ñ\82Ñ\8c"
 
 #: ../src/synfigapp/actions/valuenodelinkconnect.cpp:49
 msgid "Connect ValueNode Link"
@@ -4508,7 +4509,7 @@ msgstr ""
 #: ../src/synfigapp/action_system.cpp:148
 #: ../src/synfigapp/action_system.cpp:159
 msgid "Failed"
-msgstr "Неуспешно."
+msgstr "Неуспешно."
 
 #: ../src/synfigapp/action_system.cpp:192
 msgid "Successful"
@@ -4601,7 +4602,7 @@ msgstr ""
 
 #: ../src/synfigapp/canvasinterface.cpp:641
 msgid "I don't know how to open images of this type -- "
-msgstr "Ð\9fÑ\80огÑ\80амма Ð½Ðµ Ñ\83мееÑ\82 Ð¾Ñ\82кÑ\80Ñ\8bваÑ\82Ñ\8c Ñ\84айлÑ\8b Ñ\81 Ñ\80аÑ\81Ñ\88иÑ\80ением "
+msgstr "Ð\9fÑ\80огÑ\80амма Ð½Ðµ Ñ\83мееÑ\82 Ð¾Ñ\82кÑ\80Ñ\8bваÑ\82Ñ\8c Ñ\84айлÑ\8b Ñ\84оÑ\80маÑ\82а "
 
 #: ../src/synfigapp/canvasinterface.cpp:808
 #, c-format
index 06671f9..bde450c 100644 (file)
@@ -9,6 +9,7 @@
 **     Copyright (c) 2007, 2008 Chris Moore
 **     Copyright (c) 2008 Gerald Young
 **  Copyright (c) 2008 Carlos López
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -1292,30 +1293,29 @@ App::App(int *argc, char ***argv):
 
                studio_init_cb.task(_("Init Tools..."));
 
-               /* row 1 */
+               /* editing tools */
                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();
+               if(!getenv("SYNFIG_DISABLE_WIDTH"  )) state_manager->add_state(&state_width); // Enabled since 0.61.09
 
-               /* row 2 */
+               /* new objects */
                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
-
-               /* row 3 */
-               state_manager->add_state(&state_bline);
                state_manager->add_state(&state_text);
+               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 */
                state_manager->add_state(&state_fill);
                state_manager->add_state(&state_eyedrop);
                state_manager->add_state(&state_zoom);
-
-               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);
-               if(!getenv("SYNFIG_DISABLE_WIDTH"  )) state_manager->add_state(&state_width); // Enabled since 0.61.09
 
                studio_init_cb.task(_("Init ModPalette..."));
                module_list_.push_back(new ModPalette()); module_list_.back()->start();
@@ -1786,7 +1786,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");
 #ifdef SINGLE_THREADED
-       synfigapp::Main::settings().set_value("pref.single_threaded","0");
+       synfigapp::Main::settings().set_value("pref.single_threaded","1");
 #endif
        synfigapp::Main::settings().set_value("pref.restrict_radius_ducks","0");
        synfigapp::Main::settings().set_value("pref.resize_imported_images","0");
index 6678e4e..7d865fd 100644 (file)
 
 /* === M A C R O S ========================================================= */
 
-// uncomment to use a single thread, and hopefully get more stability
-// #define SINGLE_THREADED
+// uncomment define SINGLE_THREADED to use a single thread, and hopefully get more stability (dooglus) - changed to be default if using windows (Nov 2009 pixelgeek)
+#ifdef WIN32
+#define SINGLE_THREADED
+#endif
 #ifdef SINGLE_THREADED
 #  define single_threaded()    App::single_threaded
 #endif
index 5afa535..f520ced 100644 (file)
@@ -8,6 +8,7 @@
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **     Copyright (c) 2007, 2008 Chris Moore
 **     Copyright (c) 2009 Carlos López
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -35,6 +36,7 @@
 
 #include <ETL/clock>
 #include <sstream>
+#include <math.h>
 
 #include <gtkmm/paned.h>
 #include <gtkmm/scale.h>
@@ -718,8 +720,6 @@ CanvasView::CanvasView(etl::loose_handle<Instance> instance,etl::handle<synfigap
        toggling_snap_grid=false;
        toggling_onion_skin=false;
 
-       smach_.set_default_state(&state_normal);
-
        disp_audio = new Widget_Sound();
 
        //synfig::info("Canvasview: Entered constructor");
@@ -765,6 +765,8 @@ CanvasView::CanvasView(etl::loose_handle<Instance> instance,etl::handle<synfigap
 
        //set_transient_for(*App::toolbox);
 
+       smach_.set_default_state(&state_normal);
+
        //synfig::info("Canvasview: Before Signals");
        /*
  --    ** -- Signals -------------------------------------------------------------
@@ -2882,10 +2884,20 @@ CanvasView::on_duck_changed(const synfig::Point &value,const synfigapp::ValueDes
 
        if (ValueNode_BLineCalcVertex::Handle bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(value_desc.get_value_node()))
        {
-               ValueNode_BLine::Handle bline = ValueNode_BLine::Handle::cast_dynamic(bline_vertex->get_link(bline_vertex->get_link_index_from_name("bline")));
+               ValueNode_BLine::Handle bline = ValueNode_BLine::Handle::cast_dynamic(bline_vertex->get_link("bline"));
                Real radius = 0.0;
-               Real amount = synfig::find_closest_point((*bline)(get_time()), value, radius, bline->get_loop());
-               return canvas_interface()->change_value(synfigapp::ValueDesc(bline_vertex,bline_vertex->get_link_index_from_name("amount")), amount);
+               if (((*(bline_vertex->get_link("loop")))(get_time()).get(bool()))){
+                       Real amount_old((*(bline_vertex->get_link("amount")))(get_time()).get(Real()));
+                       Real amount_new = synfig::find_closest_point((*bline)(get_time()), value, radius, bline->get_loop());
+                       Real difference = fmod( fmod(amount_new - amount_old, 1.0) + 1.0 , 1.0);
+                                                       //fmod is called twice to avoid negative values
+                       if (difference > 0.5) difference=difference-1.0;
+                       return canvas_interface()->change_value(synfigapp::ValueDesc(bline_vertex,bline_vertex->get_link_index_from_name("amount")), amount_old+difference);
+
+               } else {
+                       Real amount = synfig::find_closest_point((*bline)(get_time()), value, radius, bline->get_loop());
+                       return canvas_interface()->change_value(synfigapp::ValueDesc(bline_vertex,bline_vertex->get_link_index_from_name("amount")), amount);
+               }
        }
 
        if (ValueNode_BLineCalcTangent::Handle bline_tangent = ValueNode_BLineCalcTangent::Handle::cast_dynamic(value_desc.get_value_node()))
index 89199c9..400854c 100644 (file)
@@ -201,7 +201,7 @@ Dialog_Setup::Dialog_Setup():
 
 #ifdef SINGLE_THREADED
        // Misc - single_threaded
-       misc_table->attach(toggle_single_threaded, 0, 2, 9, 10, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, xpadding, ypadding);
+       misc_table->attach(toggle_single_threaded, 0, 2, 10, 11, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, xpadding, ypadding);
 #endif
 
        // Misc - auto backup interval
index a96c817..b31fe6c 100644 (file)
@@ -6,6 +6,7 @@
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -53,7 +54,7 @@ using namespace studio;
 /* === M E T H O D S ======================================================= */
 
 Dialog_ToolOptions::Dialog_ToolOptions():
-       Dockable("tool_options",_("Tool Options"),Gtk::StockID("synfig-normal")),
+       Dockable("tool_options",_("Tool Options"),Gtk::StockID("synfig-about")),
        empty_label(_("This tool has no options"))
 {
        //scrolled_.add(sub_vbox_);
@@ -80,7 +81,7 @@ Dialog_ToolOptions::clear()
        set_widget(empty_label);
        empty_label.show();
 
-       set_stock_id(Gtk::StockID("synfig-normal"));
+       set_stock_id(Gtk::StockID("synfig-about"));
 }
 
 void
index e88306e..14ea8d0 100644 (file)
@@ -7,6 +7,7 @@
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **     Copyright (c) 2007, 2008 Chris Moore
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
 #include "duck.h"
 #include <ETL/misc>
 
-#include "general.h"
+#include <synfig/valuenode_bline.h>
+#include <synfig/valuenode_blinecalctangent.h>
+#include <synfig/valuenode_blinecalcvertex.h>
+#include <synfig/valuenode_blinecalcwidth.h>
+#include <synfig/valuenode_composite.h>
 
+#include "general.h"
 #endif
 
 /* === U S I N G =========================================================== */
@@ -153,6 +159,12 @@ Duck::set_trans_point(const synfig::Point &x)
        set_sub_trans_point(transform_stack_.unperform(x));
 }
 
+void
+Duck::set_trans_point(const synfig::Point &x, const synfig::Time &time)
+{
+       set_sub_trans_point(transform_stack_.unperform(x), time);
+}
+
 //! Sets the origin point.
 void
 Duck::set_origin(const synfig::Point &x)
@@ -195,7 +207,7 @@ Duck::get_sub_trans_point()const
 }
 
 void
-Duck::set_sub_trans_point(const synfig::Point &x)
+Duck::set_sub_trans_point(const synfig::Point &x, const synfig::Time &time)
 {
        if (get_type() == Duck::TYPE_TANGENT ||
                get_type() == Duck::TYPE_ANGLE)
@@ -212,9 +224,53 @@ Duck::set_sub_trans_point(const synfig::Point &x)
                        (new_halves > 1 || new_halves < -1 ||
                         old_halves > 1 || old_halves < -1))
                        synfig::info("rotation: %.2f turns", new_halves/2.0);
+       } else if(get_type() == Duck::TYPE_VERTEX || get_type() == Duck::TYPE_POSITION)
+       {
+               set_point((x-get_sub_trans_origin())/get_scalar());
+
+               ValueNode_BLineCalcVertex::Handle bline_vertex;
+               ValueNode_Composite::Handle composite;
+
+               if ((bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(get_value_desc().get_value_node())) ||
+                       ((composite = ValueNode_Composite::Handle::cast_dynamic(get_value_desc().get_value_node())) &&
+                        composite->get_type() == ValueBase::TYPE_BLINEPOINT &&
+                        (bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(composite->get_link("point")))))
+               {
+                       synfig::Point closest_point = get_point();
+                       synfig::Real radius = 0.0;
+                       ValueNode_BLine::Handle bline = ValueNode_BLine::Handle::cast_dynamic(bline_vertex->get_link(bline_vertex->get_link_index_from_name("bline")));
+                       synfig::find_closest_point(
+                               (*bline)(time),
+                               get_point(),
+                               radius,
+                               bline->get_loop(),
+                               &closest_point);
+                       set_point(closest_point);
+               }
        }
-       else
+       else set_point((x-get_sub_trans_origin())/get_scalar());
+}
+
+void
+Duck::set_sub_trans_point(const synfig::Point &x)
+{
+       if (get_type() == Duck::TYPE_TANGENT ||
+               get_type() == Duck::TYPE_ANGLE)
+       {
+               Angle old_angle = get_point().angle();
                set_point((x-get_sub_trans_origin())/get_scalar());
+               Angle change = get_point().angle() - old_angle;
+               while (change < Angle::deg(-180)) change += Angle::deg(360);
+               while (change > Angle::deg(180)) change -= Angle::deg(360);
+               int old_halves = round_to_int(Angle::deg(rotations).get()/180);
+               rotations += change;
+               int new_halves = round_to_int(Angle::deg(rotations).get()/180);
+               if (old_halves != new_halves &&
+                       (new_halves > 1 || new_halves < -1 ||
+                        old_halves > 1 || old_halves < -1))
+                       synfig::info("rotation: %.2f turns", new_halves/2.0);
+       }
+       else set_point((x-get_sub_trans_origin())/get_scalar());
 }
 
 synfig::Point
index 9ba7b00..9a054f3 100644 (file)
@@ -7,6 +7,7 @@
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **     Copyright (c) 2007, 2008 Chris Moore
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -217,13 +218,16 @@ public:
        synfig::Point get_point()const { return shared_point?*shared_point:point; }
 
        synfig::Angle get_rotations()const { return rotations; };
+       void set_rotations(const synfig::Angle &x) { rotations=x; };
 
        synfig::Point get_trans_point()const;
 
        void set_trans_point(const synfig::Point &x);
+       void set_trans_point(const synfig::Point &x, const synfig::Time &time);
 
        synfig::Point get_sub_trans_point()const;
        void set_sub_trans_point(const synfig::Point &x);
+       void set_sub_trans_point(const synfig::Point &x, const synfig::Time &time);
        synfig::Point get_sub_trans_origin()const;
 
        //! Sets the origin point.
index 0d88982..786aa11 100644 (file)
@@ -7,6 +7,7 @@
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **     Copyright (c) 2007, 2008 Chris Moore
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -446,6 +447,75 @@ Duckmatic::start_duck_drag(const synfig::Vector& offset)
        drag_offset_=find_duck(offset)->get_trans_point();
 }
 
+void
+Duckmatic::update_ducks()
+{
+       Time time(get_time());
+       DuckList duck_list(get_duck_list());
+       const DuckList selected_ducks(get_selected_ducks());
+       DuckList::const_iterator iter;
+       for (iter=selected_ducks.begin(); iter!=selected_ducks.end(); ++iter)
+       {
+               etl::handle<Duck> duck(*iter);
+               if (duck->get_type() == Duck::TYPE_VERTEX || duck->get_type() == Duck::TYPE_POSITION)
+               {
+                       ValueNode_BLineCalcVertex::Handle bline_vertex;
+                       ValueNode_Composite::Handle composite;
+
+                       if ((bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(duck->get_value_desc().get_value_node())) ||
+                               ((composite = ValueNode_Composite::Handle::cast_dynamic(duck->get_value_desc().get_value_node())) &&
+                                composite->get_type() == ValueBase::TYPE_BLINEPOINT &&
+                                (bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(composite->get_link("point")))))
+                       {
+                               DuckList::iterator iter;
+                               for (iter=duck_list.begin(); iter!=duck_list.end(); iter++)
+                                       if ( (*iter)->get_origin_duck()==duck  /*&& !duck_is_selected(*iter)*/ )
+                                       {
+                                               synfig::Real radius = 0.0;
+                                               ValueNode_BLine::Handle bline(ValueNode_BLine::Handle::cast_dynamic(bline_vertex->get_link(bline_vertex->get_link_index_from_name("bline"))));
+                                               Real amount = synfig::find_closest_point((*bline)(time), duck->get_point(), radius, bline->get_loop());
+
+                                               int vertex_amount_index(bline_vertex->get_link_index_from_name("amount"));
+                                               ValueNode::Handle vertex_amount_value_node(bline_vertex->get_link(vertex_amount_index));
+
+
+                                               ValueNode::Handle duck_value_node((*iter)->get_value_desc().get_value_node());
+                                               if (ValueNode_BLineCalcTangent::Handle bline_tangent = ValueNode_BLineCalcTangent::Handle::cast_dynamic(duck_value_node))
+                                               {
+                                                       if (bline_tangent->get_link(bline_tangent->get_link_index_from_name("amount")) == vertex_amount_value_node)
+                                                       {
+                                                               switch (bline_tangent->get_type())
+                                                               {
+                                                               case ValueBase::TYPE_ANGLE:
+                                                               {
+                                                                       Angle angle((*bline_tangent)(time, amount).get(Angle()));
+                                                                       (*iter)->set_point(Point(Angle::cos(angle).get(), Angle::sin(angle).get()));
+                                                                       (*iter)->set_rotations(Angle::deg(0)); //hack: rotations are a relative value
+                                                                       break;
+                                                               }
+                                                               case ValueBase::TYPE_REAL:
+                                                                       (*iter)->set_point(Point((*bline_tangent)(time, amount).get(Real()), 0));
+                                                                       break;
+                                                               case ValueBase::TYPE_VECTOR:
+                                                                       (*iter)->set_point((*bline_tangent)(time, amount).get(Vector()));
+                                                                       break;
+                                                               default:
+                                                                       break;
+                                                               }
+                                                       }
+                                               }
+                                               else if (ValueNode_BLineCalcWidth::Handle bline_width = ValueNode_BLineCalcWidth::Handle::cast_dynamic(duck_value_node))
+                                               {
+                                                       if (bline_width->get_link(bline_width->get_link_index_from_name("amount")) == vertex_amount_value_node)
+                                                               (*iter)->set_point(Point((*bline_width)(time, amount).get(Real()), 0));
+                                               }
+                                       }
+                       }
+               }
+       }
+}
+
+
 bool
 Duckmatic::end_duck_drag()
 {
@@ -551,97 +621,16 @@ DuckDrag_Translate::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector
 
        // drag the vertex and position ducks first
        for (i=0,iter=selected_ducks.begin(); iter!=selected_ducks.end(); ++iter,i++)
-       {
-               etl::handle<Duck> duck(*iter);
-               if(duck->get_type() == Duck::TYPE_VERTEX || duck->get_type() == Duck::TYPE_POSITION)
-               {
-                       duck->set_trans_point(positions[i]+vect);
-
-                       ValueNode_BLineCalcVertex::Handle bline_vertex;
-                       ValueNode_Composite::Handle composite;
-
-                       if ((bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(duck->get_value_desc().get_value_node())) ||
-                               ((composite = ValueNode_Composite::Handle::cast_dynamic(duck->get_value_desc().get_value_node())) &&
-                                composite->get_type() == ValueBase::TYPE_BLINEPOINT &&
-                                (bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(composite->get_link("point")))))
-                       {
-                               synfig::Point closest_point = duck->get_point();
-                               synfig::Real radius = 0.0;
-                               ValueNode_BLine::Handle bline = ValueNode_BLine::Handle::cast_dynamic(bline_vertex->get_link(bline_vertex->get_link_index_from_name("bline")));
-                               synfig::find_closest_point(
-                                       (*bline)(time),
-                                       duck->get_point(),
-                                       radius,
-                                       bline->get_loop(),
-                                       &closest_point);
-                               duck->set_point(closest_point);
-                       }
-               }
-       }
+               if((*iter)->get_type() == Duck::TYPE_VERTEX || (*iter)->get_type() == Duck::TYPE_POSITION)
+                       (*iter)->set_trans_point(positions[i]+vect, time);
 
        // then drag the others
        for (i=0,iter=selected_ducks.begin(); iter!=selected_ducks.end(); ++iter,i++)
                if ((*iter)->get_type() != Duck::TYPE_VERTEX && (*iter)->get_type() != Duck::TYPE_POSITION)
-                       (*iter)->set_trans_point(positions[i]+vect);
+                       (*iter)->set_trans_point(positions[i]+vect, time);
 
        // then patch up the tangents for the vertices we've moved
-       DuckList duck_list(duckmatic->get_duck_list());
-       for (iter=selected_ducks.begin(); iter!=selected_ducks.end(); ++iter)
-       {
-               etl::handle<Duck> duck(*iter);
-               if (duck->get_type() == Duck::TYPE_VERTEX || duck->get_type() == Duck::TYPE_POSITION)
-               {
-                       ValueNode_BLineCalcVertex::Handle bline_vertex;
-                       ValueNode_Composite::Handle composite;
-
-                       if ((bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(duck->get_value_desc().get_value_node())) ||
-                               ((composite = ValueNode_Composite::Handle::cast_dynamic(duck->get_value_desc().get_value_node())) &&
-                                composite->get_type() == ValueBase::TYPE_BLINEPOINT &&
-                                (bline_vertex = ValueNode_BLineCalcVertex::Handle::cast_dynamic(composite->get_link("point")))))
-                       {
-                               synfig::Real radius = 0.0;
-                               ValueNode_BLine::Handle bline(ValueNode_BLine::Handle::cast_dynamic(bline_vertex->get_link(bline_vertex->get_link_index_from_name("bline"))));
-                               Real amount = synfig::find_closest_point((*bline)(time), duck->get_point(), radius, bline->get_loop());
-
-                               int vertex_amount_index(bline_vertex->get_link_index_from_name("amount"));
-                               ValueNode::Handle vertex_amount_value_node(bline_vertex->get_link(vertex_amount_index));
-
-                               DuckList::iterator iter;
-                               for (iter=duck_list.begin(); iter!=duck_list.end(); iter++)
-                               {
-                                       ValueNode::Handle duck_value_node((*iter)->get_value_desc().get_value_node());
-                                       if (ValueNode_BLineCalcTangent::Handle bline_tangent = ValueNode_BLineCalcTangent::Handle::cast_dynamic(duck_value_node))
-                                       {
-                                               if (bline_tangent->get_link(bline_tangent->get_link_index_from_name("amount")) == vertex_amount_value_node)
-                                               {
-                                                       switch (bline_tangent->get_type())
-                                                       {
-                                                       case ValueBase::TYPE_ANGLE:
-                                                       {
-                                                               Angle angle((*bline_tangent)(time, amount).get(Angle()));
-                                                               (*iter)->set_point(Point(Angle::cos(angle).get(), Angle::sin(angle).get()));
-                                                               break;
-                                                       }
-                                                       case ValueBase::TYPE_REAL:
-                                                               (*iter)->set_point(Point((*bline_tangent)(time, amount).get(Real()), 0));
-                                                               break;
-                                                       case ValueBase::TYPE_VECTOR:
-                                                               (*iter)->set_point((*bline_tangent)(time, amount).get(Vector()));
-                                                               break;
-                                                       default:
-                                                               break;
-                                                       }
-                                               }
-                                       }
-                                       else if (ValueNode_BLineCalcWidth::Handle bline_width = ValueNode_BLineCalcWidth::Handle::cast_dynamic(duck_value_node))
-                                       {
-                                               if (bline_width->get_link(bline_width->get_link_index_from_name("amount")) == vertex_amount_value_node)
-                                                       (*iter)->set_point(Point((*bline_width)(time, amount).get(Real()), 0));
-                                       }
-                               }
-                       }
-               }
-       }
+       duckmatic->update_ducks();
 
        last_translate_=vect;
 }
index 42282e0..e10db0c 100644 (file)
@@ -324,6 +324,7 @@ public:
 
        void start_duck_drag(const synfig::Vector& offset);
        void translate_selected_ducks(const synfig::Vector& vector);
+       void update_ducks();
        bool end_duck_drag();
 
        void signal_edited_selected_ducks();
index c133dff..ea2a3a6 100644 (file)
@@ -10,6 +10,7 @@
 **  Copyright (c) 2008 Paul Wise
 **  Copyright (c) 2009 Gerco Ballintijn
 **     Copyright (c) 2009 Carlos López
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -220,6 +221,7 @@ IconController::IconController(const synfig::String& /*basepath*/)
 
        // Tools
        INIT_STOCK_ICON(normal,"normal_icon."IMAGE_EXT,_("Normal Tool"));
+       INIT_STOCK_ICON(transform,"transform_icon."IMAGE_EXT,_("Transform Tool"));
        INIT_STOCK_ICON(polygon,"polyline_icon."IMAGE_EXT,_("Polygon Tool"));
        INIT_STOCK_ICON(bline,"bline_icon."IMAGE_EXT,_("BLine Tool"));
        INIT_STOCK_ICON(eyedrop,"eyedrop_icon."IMAGE_EXT,_("Eyedrop Tool"));
@@ -229,9 +231,9 @@ IconController::IconController(const synfig::String& /*basepath*/)
        INIT_STOCK_ICON(circle,"circle_icon."IMAGE_EXT,_("Circle Tool"));
        INIT_STOCK_ICON(rectangle,"rectangle_icon."IMAGE_EXT,_("Rectangle Tool"));
        INIT_STOCK_ICON(smooth_move,"smooth_move_icon."IMAGE_EXT,_("SmoothMove Tool"));
-       INIT_STOCK_ICON(scale,"scale_icon."IMAGE_EXT,_("Scale Tool"));
+       INIT_STOCK_ICON(rotate,"rotate_icon."IMAGE_EXT,"Rotate Tool");
        INIT_STOCK_ICON(width,"width_icon."IMAGE_EXT,_("Width Tool"));
-       INIT_STOCK_ICON(rotate,"rotate_icon."IMAGE_EXT,_("Rotate Tool"));
+       INIT_STOCK_ICON(scale,"scale_icon."IMAGE_EXT,"Scale Tool");
        INIT_STOCK_ICON(zoom,"zoom_icon."IMAGE_EXT,_("Zoom Tool"));
        INIT_STOCK_ICON(info,"info_icon."IMAGE_EXT,_("Info Tool"));
        INIT_STOCK_ICON(mirror,"mirror_icon."IMAGE_EXT,_("Mirror Tool"));
index 9a247cb..db48457 100644 (file)
@@ -7,7 +7,8 @@
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **     Copyright (c) 2007, 2008 Chris Moore
-**  Copyright (c) 2008 Carlos López
+**     Copyright (c) 2008 Carlos López
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -1024,7 +1025,8 @@ Instance::make_param_menu(Gtk::Menu *menu,synfig::Canvas::Handle canvas, synfiga
                param_list2=canvas_interface->generate_param_list(
                        synfigapp::ValueDesc(
                                ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node())
-                               ,0
+                               ,ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node())
+                                                           ->get_link_index_from_name("point")
                        )
                );
                param_list2.add("origin",location);
index b9688d0..bcb0a3a 100644 (file)
@@ -6,6 +6,7 @@
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -36,6 +37,7 @@
 #include <synfigapp/action_system.h>
 
 #include "state_mirror.h"
+#include "../state_normal.h"
 #include "../canvasview.h"
 #include "../workarea.h"
 #include "../app.h"
@@ -91,45 +93,41 @@ public:
 class studio::StateMirror_Context : public sigc::trackable
 {
        etl::handle<CanvasView> canvas_view_;
+       CanvasView::IsWorking is_working;
 
        synfigapp::Settings& settings;
 
+       sigc::connection keypress_connect;
+       sigc::connection keyrelease_connect;
+
        etl::handle<DuckDrag_Mirror> duck_dragger_;
 
        Gtk::Table options_table;
 
-       Gtk::CheckButton checkbutton_axis_x;
-       Gtk::CheckButton checkbutton_axis_y;
+       Gtk::RadioButton::Group radiobutton_group;
+       Gtk::RadioButton radiobutton_axis_x;
+       Gtk::RadioButton radiobutton_axis_y;
 
 public:
 
-       Axis get_axis()const { return checkbutton_axis_x.get_active()?AXIS_X:AXIS_Y; }
+       Axis get_axis()const { return radiobutton_axis_x.get_active()?AXIS_X:AXIS_Y; }
        void set_axis(Axis a)
        {
                if(a==AXIS_X)
-               {
-                       checkbutton_axis_x.set_active(true);
-                       checkbutton_axis_y.set_active(false);
-               }
+                       radiobutton_axis_x.set_active(true);
                else
-               {
-                       checkbutton_axis_y.set_active(true);
-                       checkbutton_axis_x.set_active(false);
-               }
+                       radiobutton_axis_y.set_active(true);
 
                duck_dragger_->axis=get_axis();
        }
 
-       void update_axis_y()
-       {
-               checkbutton_axis_x.set_active(!checkbutton_axis_y.get_active());
-               duck_dragger_->axis=get_axis();
-       }
-       void update_axis_x()
+       void update_axes()
        {
-               checkbutton_axis_y.set_active(!checkbutton_axis_x.get_active());
                duck_dragger_->axis=get_axis();
+               get_work_area()->set_cursor(get_axis() == AXIS_X?Gdk::SB_H_DOUBLE_ARROW:Gdk::SB_V_DOUBLE_ARROW);
        }
+
+       Smach::event_result event_stop_handler(const Smach::event& x);
        Smach::event_result event_refresh_tool_options(const Smach::event& x);
 
        void refresh_tool_options();
@@ -145,6 +143,8 @@ public:
 
        void load_settings();
        void save_settings();
+
+       bool key_event(GdkEventKey *event);
 };     // END of class StateMirror_Context
 
 /* === M E T H O D S ======================================================= */
@@ -153,6 +153,7 @@ StateMirror::StateMirror():
        Smach::state<StateMirror_Context>("mirror")
 {
        insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateMirror_Context::event_refresh_tool_options));
+       insert(event_def(EVENT_STOP,&StateMirror_Context::event_stop_handler));
 }
 
 StateMirror::~StateMirror()
@@ -176,18 +177,20 @@ StateMirror_Context::save_settings()
 
 StateMirror_Context::StateMirror_Context(CanvasView* canvas_view):
        canvas_view_(canvas_view),
+       is_working(*canvas_view),
        settings(synfigapp::Main::get_selected_input_device()->settings()),
        duck_dragger_(new DuckDrag_Mirror()),
-       checkbutton_axis_x(_("Horizontal")),
-       checkbutton_axis_y(_("Vertical"))
+       radiobutton_axis_x(radiobutton_group,_("Horizontal")),
+       radiobutton_axis_y(radiobutton_group,_("Vertical"))
 {
        // Set up the tool options dialog
        options_table.attach(*manage(new Gtk::Label(_("Mirror Tool"))), 0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
-       options_table.attach(checkbutton_axis_x, 0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
-       options_table.attach(checkbutton_axis_y, 0, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+       options_table.attach(radiobutton_axis_x, 0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+       options_table.attach(radiobutton_axis_y, 0, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+       options_table.attach(*manage(new Gtk::Label(_("(Shift key toggles axis)"))), 0, 2, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
 
-       checkbutton_axis_x.signal_toggled().connect(sigc::mem_fun(*this,&StateMirror_Context::update_axis_x));
-       checkbutton_axis_y.signal_toggled().connect(sigc::mem_fun(*this,&StateMirror_Context::update_axis_y));
+       radiobutton_axis_x.signal_toggled().connect(sigc::mem_fun(*this,&StateMirror_Context::update_axes));
+       radiobutton_axis_y.signal_toggled().connect(sigc::mem_fun(*this,&StateMirror_Context::update_axes));
 
        options_table.show_all();
        refresh_tool_options();
@@ -196,8 +199,11 @@ StateMirror_Context::StateMirror_Context(CanvasView* canvas_view):
        get_work_area()->set_allow_layer_clicks(true);
        get_work_area()->set_duck_dragger(duck_dragger_);
 
-//     get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR);
-       get_canvas_view()->work_area->reset_cursor();
+       keypress_connect=get_work_area()->signal_key_press_event().connect(sigc::mem_fun(*this,&StateMirror_Context::key_event),false);
+       keyrelease_connect=get_work_area()->signal_key_release_event().connect(sigc::mem_fun(*this,&StateMirror_Context::key_event),false);
+
+       get_work_area()->set_cursor(Gdk::SB_H_DOUBLE_ARROW);
+//     get_work_area()->reset_cursor();
 
        App::toolbox->refresh();
 
@@ -205,6 +211,18 @@ StateMirror_Context::StateMirror_Context(CanvasView* canvas_view):
        load_settings();
 }
 
+bool
+StateMirror_Context::key_event(GdkEventKey *event)
+{
+       if (event->keyval==GDK_Shift_L || event->keyval==GDK_Shift_R )
+       {
+               set_axis(get_axis()==AXIS_X ? AXIS_Y:AXIS_X);
+               get_work_area()->set_cursor(get_axis() == AXIS_X?Gdk::SB_H_DOUBLE_ARROW:Gdk::SB_V_DOUBLE_ARROW);
+       }
+
+       return false; //Pass on the event to other handlers, just in case
+}
+
 void
 StateMirror_Context::refresh_tool_options()
 {
@@ -221,12 +239,22 @@ StateMirror_Context::event_refresh_tool_options(const Smach::event& /*x*/)
        return Smach::RESULT_ACCEPT;
 }
 
+Smach::event_result
+StateMirror_Context::event_stop_handler(const Smach::event& /*x*/)
+{
+       throw &state_normal;
+       return Smach::RESULT_OK;
+}
+
 StateMirror_Context::~StateMirror_Context()
 {
        save_settings();
 
        get_work_area()->clear_duck_dragger();
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->reset_cursor();
+
+       keypress_connect.disconnect();
+       keyrelease_connect.disconnect();
 
        App::dialog_tool_options->clear();
 
@@ -267,6 +295,8 @@ DuckDrag_Mirror::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector)
        const DuckList selected_ducks(duckmatic->get_selected_ducks());
        DuckList::const_iterator iter;
 
+       Time time(duckmatic->get_time());
+
        // do the Vertex and Position ducks first
        for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
                if ((*iter)->get_type() == Duck::TYPE_VERTEX ||
index 7a27d84..ee0ca20 100644 (file)
@@ -36,6 +36,7 @@
 #include <synfig/valuenode_dynamiclist.h>
 
 #include "state_bline.h"
+#include "state_normal.h"
 #include "canvasview.h"
 #include "workarea.h"
 #include "app.h"
@@ -205,7 +206,7 @@ public:
        Smach::event_result event_layer_selection_changed_handler(const Smach::event& /*x*/)
        {
                if(egress_on_selection_change)
-                       throw Smach::egress_exception();
+                       throw &state_normal; //throw Smach::egress_exception();
                return Smach::RESULT_OK;
        }
 
@@ -408,7 +409,7 @@ StateBLine_Context::StateBLine_Context(CanvasView* canvas_view):
 
        // Connect a signal
        //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateBLine_Context::on_user_click));
-       get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR);
+       get_work_area()->set_cursor(Gdk::CROSSHAIR);
 
        App::toolbox->refresh();
 }
@@ -456,7 +457,7 @@ StateBLine_Context::~StateBLine_Context()
        save_settings();
        App::dialog_tool_options->clear();
 
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->reset_cursor();
 
        // Restore layer clicking
        get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_);
index fe82e21..ce155b0 100644 (file)
@@ -38,6 +38,7 @@
 #include <synfig/valuenode_bline.h>
 
 #include "state_circle.h"
+#include "state_normal.h"
 #include "canvasview.h"
 #include "workarea.h"
 #include "app.h"
@@ -208,7 +209,7 @@ public:
        Smach::event_result event_layer_selection_changed_handler(const Smach::event& /*x*/)
        {
                if(egress_on_selection_change)
-                       throw Smach::egress_exception();
+                       throw &state_normal; //throw Smach::egress_exception();
                return Smach::RESULT_OK;
        }
 
@@ -483,7 +484,7 @@ options_table.attach(*manage(new Gtk::Label(_("Point Angle Offset:"))),     0, 1, 14
 
        // Connect a signal
        //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateCircle_Context::on_user_click));
-       get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR);
+       get_work_area()->set_cursor(Gdk::CROSSHAIR);
 
        App::toolbox->refresh();
 }
@@ -510,7 +511,7 @@ StateCircle_Context::~StateCircle_Context()
 
        // Restore layer clicking
        get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_);
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->reset_cursor();
 
        App::dialog_tool_options->clear();
 
@@ -531,7 +532,9 @@ StateCircle_Context::~StateCircle_Context()
 Smach::event_result
 StateCircle_Context::event_stop_handler(const Smach::event& /*x*/)
 {
-       throw Smach::egress_exception();
+       //throw Smach::egress_exception();
+       throw &state_normal;
+       return Smach::RESULT_OK;
 }
 
 Smach::event_result
index 4d053bc..4482045 100644 (file)
@@ -7,6 +7,7 @@
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **     Copyright (c) 2007 Chris Moore
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -37,6 +38,7 @@
 
 #include "state_draw.h"
 #include "state_stroke.h"
+#include "state_normal.h"
 #include "canvasview.h"
 #include "workarea.h"
 #include "app.h"
@@ -486,7 +488,7 @@ StateDraw_Context::StateDraw_Context(CanvasView* canvas_view):
        // Connect a signal
        //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateDraw_Context::on_user_click));
 
-       get_canvas_view()->work_area->set_cursor(Gdk::PENCIL);
+       get_work_area()->set_cursor(Gdk::PENCIL);
 
        App::toolbox->refresh();
 
@@ -543,7 +545,7 @@ StateDraw_Context::~StateDraw_Context()
 
        get_work_area()->set_type_mask(old_duckmask);
 
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->reset_cursor();
 
        // Restore layer clicking
        get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_);
@@ -566,7 +568,9 @@ StateDraw_Context::~StateDraw_Context()
 Smach::event_result
 StateDraw_Context::event_stop_handler(const Smach::event& /*x*/)
 {
-       throw Smach::egress_exception();
+       //throw Smach::egress_exception();
+       throw &state_normal;
+       return Smach::RESULT_OK;
 }
 
 Smach::event_result
@@ -961,10 +965,10 @@ StateDraw_Context::new_bline(std::list<synfig::BLinePoint> bline,bool loop_bline
 
                if(extend_start_join_different)
                        LinkableValueNode::Handle::cast_dynamic(source.value_node)->
-                               set_link(0,finish_duck_value_desc.get_value_node());
+                               set_link("point",finish_duck_value_desc.get_value_node());
                else if(extend_start_join_same)
                        LinkableValueNode::Handle::cast_dynamic(source.value_node)->
-                               set_link(0,synfigapp::ValueDesc(LinkableValueNode::Handle::cast_dynamic(start_duck_value_node_bline->
+                               set_link("point",synfigapp::ValueDesc(LinkableValueNode::Handle::cast_dynamic(start_duck_value_node_bline->
                                                                                                        list[target_offset+finish_duck_index].value_node),0).get_value_node());
                return result;
        }
@@ -989,21 +993,21 @@ StateDraw_Context::new_bline(std::list<synfig::BLinePoint> bline,bool loop_bline
 
                if(extend_finish_join_different)
                        LinkableValueNode::Handle::cast_dynamic(source.value_node)->
-                               set_link(0,start_duck_value_desc.get_value_node());
+                               set_link("point",start_duck_value_desc.get_value_node());
                else if(extend_finish_join_same)
                        LinkableValueNode::Handle::cast_dynamic(source.value_node)->
-                               set_link(0,synfigapp::ValueDesc(LinkableValueNode::Handle::cast_dynamic(finish_duck_value_node_bline->
+                               set_link("point",synfigapp::ValueDesc(LinkableValueNode::Handle::cast_dynamic(finish_duck_value_node_bline->
                                                                                                        list[target_offset+start_duck_index].value_node),0).get_value_node());
                return result;
        }
 
        if (join_start_no_extend)
                LinkableValueNode::Handle::cast_dynamic(value_node->list.front().value_node)->
-                 set_link(0,start_duck_value_desc.get_value_node());
+                 set_link("point",start_duck_value_desc.get_value_node());
 
        if (join_finish_no_extend)
                LinkableValueNode::Handle::cast_dynamic(value_node->list.back().value_node)->
-                 set_link(0,finish_duck_value_desc.get_value_node());
+                 set_link("point",finish_duck_value_desc.get_value_node());
 
        if(get_auto_export_flag())
                if (!get_canvas_interface()->add_value_node(value_node,get_id()))
@@ -1678,8 +1682,8 @@ StateDraw_Context::new_region(std::list<synfig::BLinePoint> bline, synfig::Real
                                                                        continue;
                                                                }
                                                                // \todo if next isn't split, don't we want to copy its 'Tangent 1' instead?
-                                                               value_node->set_link(5,value_node_next->get_link(5)); // Tangent 2
-                                                               value_node->set_link(3,ValueNode_Const::create(true)); // Split Tangents
+                                                               value_node->set_link("t2",value_node_next->get_link("t2"));
+                                                               value_node->set_link("split",ValueNode_Const::create(true));
 
                                                                // get_canvas_interface()->auto_export(value_node);
                                                                printf("exporting\n");
index 6fb940d..dcd57a1 100644 (file)
@@ -30,6 +30,7 @@
 #endif
 
 #include "state_eyedrop.h"
+#include "state_normal.h"
 #include "workarea.h"
 #include <synfig/context.h>
 #include "app.h"
@@ -113,8 +114,10 @@ StateEyedrop_Context::~StateEyedrop_Context()
 Smach::event_result
 StateEyedrop_Context::event_stop_handler(const Smach::event& /*x*/)
 {
-       synfig::info("STATE EYEDROP: Received Stop Event");
-       throw Smach::egress_exception();
+       //synfig::info("STATE EYEDROP: Received Stop Event");
+       //throw Smach::egress_exception();
+       throw &state_normal;
+       return Smach::RESULT_OK;
 //     canvas_view->get_smach().pop_state();
 //     return Smach::RESULT_ACCEPT;
 }
index 60c929a..f4df2ba 100644 (file)
@@ -30,6 +30,7 @@
 #endif
 
 #include "state_fill.h"
+#include "state_normal.h"
 #include "workarea.h"
 #include <synfig/context.h>
 #include "app.h"
@@ -121,7 +122,9 @@ Smach::event_result
 StateFill_Context::event_stop_handler(const Smach::event& /*x*/)
 {
        synfig::info("STATE FILL: Received Stop Event");
-       throw Smach::egress_exception();
+       //throw Smach::egress_exception();
+       throw &state_normal;
+       return Smach::RESULT_OK;
 //     canvas_view->get_smach().pop_state();
 //     return Smach::RESULT_ACCEPT;
 }
index c8461b5..8e36214 100644 (file)
@@ -37,6 +37,7 @@
 #include <synfigapp/action_system.h>
 
 #include "state_gradient.h"
+#include "state_normal.h"
 #include "canvasview.h"
 #include "workarea.h"
 #include "app.h"
@@ -144,7 +145,7 @@ public:
        Smach::event_result event_layer_selection_changed_handler(const Smach::event& /*x*/)
        {
                if(egress_on_selection_change)
-                       throw Smach::egress_exception();
+                       throw &state_normal; //throw Smach::egress_exception();
                return Smach::RESULT_OK;
        }
 
@@ -297,7 +298,7 @@ StateGradient_Context::StateGradient_Context(CanvasView* canvas_view):
        // Turn off layer clicking
        get_work_area()->set_allow_layer_clicks(false);
 
-       get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR);
+       get_work_area()->set_cursor(Gdk::CROSSHAIR);
 
        // clear out the ducks
        get_work_area()->clear_ducks();
@@ -342,7 +343,7 @@ StateGradient_Context::~StateGradient_Context()
        // Restore layer clicking
 //     get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_);
        get_work_area()->set_allow_layer_clicks(true);
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->reset_cursor();
 
        App::dialog_tool_options->clear();
 
@@ -367,7 +368,9 @@ StateGradient_Context::~StateGradient_Context()
 Smach::event_result
 StateGradient_Context::event_stop_handler(const Smach::event& /*x*/)
 {
-       throw Smach::egress_exception();
+       //throw Smach::egress_exception();
+       throw &state_normal;
+       return Smach::RESULT_OK;
 }
 
 Smach::event_result
index f2bb3b9..c763022 100644 (file)
@@ -7,6 +7,7 @@
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **     Copyright (c) 2007, 2008 Chris Moore
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
 #      include <config.h>
 #endif
 
+#include <gtkmm/dialog.h>
+#include <gtkmm/entry.h>
+
+#include <synfig/valuenode_animated.h>
+#include <synfig/valuenode_blinecalcvertex.h>
+#include <synfig/valuenode_composite.h>
+#include <synfig/valuenode_const.h>
+#include <synfig/valuenode_dynamiclist.h>
+#include <synfigapp/action_system.h>
+
 #include "state_normal.h"
+#include "canvasview.h"
 #include "workarea.h"
+#include "app.h"
+
+#include <synfigapp/action.h>
 #include "event_mouse.h"
 #include "event_layerclick.h"
 #include "toolbox.h"
 #include "dialog_tooloptions.h"
-#include <gtkmm/dialog.h>
-#include "widget_waypointmodel.h"
-#include <synfig/valuenode_animated.h>
-#include <synfig/valuenode_composite.h>
-#include <synfig/valuenode_const.h>
-#include "canvasview.h"
-#include "general.h"
+#include <gtkmm/optionmenu.h>
+#include "duck.h"
+#include <synfig/angle.h>
+#include <synfigapp/main.h>
 
+#include "general.h"
 #endif
 
 /* === U S I N G =========================================================== */
@@ -55,49 +68,106 @@ using namespace studio;
 
 /* === M A C R O S ========================================================= */
 
+#ifndef EPSILON
+#define EPSILON        0.0000001
+#endif
+
+/* === G L O B A L S ======================================================= */
+
+StateNormal studio::state_normal;
+
 /* === C L A S S E S & S T R U C T S ======================================= */
 
-class studio::StateNormal_Context : public sigc::trackable
+class DuckDrag_Combo : public DuckDrag_Base
 {
-       CanvasView *canvas_view;
+       synfig::Vector last_move;
+       synfig::Vector drag_offset;
+       synfig::Vector center;
+       synfig::Vector snap;
+
+       synfig::Angle original_angle;
+       synfig::Real original_mag;
+
+       std::vector<synfig::Vector> last_;
+       std::vector<synfig::Vector> positions;
 
-       CanvasView* get_canvas_view() { return canvas_view; }
-       Canvas::Handle get_canvas() { return canvas_view->get_canvas(); }
-       WorkArea* get_work_area() { return canvas_view->get_work_area(); }
-       etl::handle<synfigapp::CanvasInterface> get_canvas_interface() { return canvas_view->canvas_interface(); }
+
+       bool bad_drag;
+       bool move_only;
 
 public:
-       StateNormal_Context(CanvasView *canvas_view);
-       ~StateNormal_Context();
+       etl::handle<CanvasView> canvas_view_;
+       bool scale;
+       bool rotate;
+       bool constrain;
+       DuckDrag_Combo();
+       void begin_duck_drag(Duckmatic* duckmatic, const synfig::Vector& begin);
+       bool end_duck_drag(Duckmatic* duckmatic);
+       void duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector);
 
-       Smach::event_result event_stop_handler(const Smach::event& x);
+       etl::handle<synfigapp::CanvasInterface> get_canvas_interface()const{return canvas_view_->canvas_interface();}
+};
 
-       Smach::event_result event_refresh_handler(const Smach::event& x);
 
-       Smach::event_result event_refresh_ducks_handler(const Smach::event& x);
+class studio::StateNormal_Context : public sigc::trackable
+{
+       etl::handle<CanvasView> canvas_view_;
 
-       Smach::event_result event_undo_handler(const Smach::event& x);
+       synfigapp::Settings& settings;
 
-       Smach::event_result event_redo_handler(const Smach::event& x);
+       sigc::connection keypress_connect;
+       sigc::connection keyrelease_connect;
 
-       Smach::event_result event_mouse_button_down_handler(const Smach::event& x);
+       etl::handle<DuckDrag_Combo> duck_dragger_;
 
-       Smach::event_result event_multiple_ducks_clicked_handler(const Smach::event& x);
+       Gtk::Table options_table;
 
-       Smach::event_result event_refresh_tool_options(const Smach::event& x);
+       Gtk::CheckButton checkbutton_rotate;
+       Gtk::CheckButton checkbutton_scale;
+       Gtk::CheckButton checkbutton_constrain;
 
-       Smach::event_result event_layer_click(const Smach::event& x);
+public:
 
-       void edit_several_waypoints(std::list<synfigapp::ValueDesc> value_desc_list);
+       bool get_rotate_flag()const { return checkbutton_rotate.get_active(); }
+       void set_rotate_flag(bool x) { checkbutton_rotate.set_active(x); refresh_rotate_flag(); }
+       void refresh_rotate_flag() { if(duck_dragger_)duck_dragger_->rotate=get_rotate_flag(); }
 
-       void refresh_tool_options();
-}; // END of class StateNormal_Context
+       bool get_scale_flag()const { return checkbutton_scale.get_active(); }
+       void set_scale_flag(bool x) { checkbutton_scale.set_active(x); refresh_scale_flag(); }
+       void refresh_scale_flag() { if(duck_dragger_)duck_dragger_->scale=get_scale_flag(); }
 
-/* === G L O B A L S ======================================================= */
+       bool get_constrain_flag()const { return checkbutton_constrain.get_active(); }
+       void set_constrain_flag(bool x) { checkbutton_constrain.set_active(x); refresh_constrain_flag(); }
+       void refresh_constrain_flag() { if(duck_dragger_)duck_dragger_->constrain=get_constrain_flag(); }
+
+       StateNormal_Context(CanvasView* canvas_view);
+
+       ~StateNormal_Context();
+
+       const etl::handle<CanvasView>& get_canvas_view()const{return canvas_view_;}
+       etl::handle<synfigapp::CanvasInterface> get_canvas_interface()const{return canvas_view_->canvas_interface();}
+       synfig::Canvas::Handle get_canvas()const{return canvas_view_->get_canvas();}
+       WorkArea * get_work_area()const{return canvas_view_->get_work_area();}
+
+       void load_settings();
+       void save_settings();
+
+       bool key_pressed(GdkEventKey *event);
+       bool key_released(GdkEventKey *event);
+
+       Smach::event_result event_stop_handler(const Smach::event& x);
+       Smach::event_result event_refresh_handler(const Smach::event& x);
+       Smach::event_result event_refresh_ducks_handler(const Smach::event& x);
+       Smach::event_result event_undo_handler(const Smach::event& x);
+       Smach::event_result event_redo_handler(const Smach::event& x);
+       Smach::event_result event_mouse_button_down_handler(const Smach::event& x);
+       Smach::event_result event_multiple_ducks_clicked_handler(const Smach::event& x);
+       Smach::event_result event_refresh_tool_options(const Smach::event& x);
+       void refresh_tool_options();
+       Smach::event_result event_layer_click(const Smach::event& x);
 
-StateNormal studio::state_normal;
 
-/* === P R O C E D U R E S ================================================= */
+};     // END of class StateNormal_Context
 
 /* === M E T H O D S ======================================================= */
 
@@ -113,30 +183,359 @@ StateNormal::StateNormal():
        insert(event_def(EVENT_WORKAREA_MULTIPLE_DUCKS_CLICKED,&StateNormal_Context::event_multiple_ducks_clicked_handler));
        insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateNormal_Context::event_refresh_tool_options));
        insert(event_def(EVENT_WORKAREA_LAYER_CLICKED,&StateNormal_Context::event_layer_click));
+
 }
 
 StateNormal::~StateNormal()
 {
 }
 
-StateNormal_Context::StateNormal_Context(CanvasView *canvas_view):
-       canvas_view(canvas_view)
+void
+StateNormal_Context::load_settings()
 {
-       // synfig::info("Entered Normal State");
+       String value;
+
+       if(settings.get_value("normal.rotate",value) && value=="1")
+               set_rotate_flag(true);
+       else
+               set_rotate_flag(false);
+
+       if(settings.get_value("normal.scale",value) && value=="1")
+               set_scale_flag(true);
+       else
+               set_scale_flag(false);
+
+       if(settings.get_value("normal.constrain",value) && value=="1")
+               set_constrain_flag(true);
+       else
+               set_constrain_flag(false);
+
 }
 
-StateNormal_Context::~StateNormal_Context()
+void
+StateNormal_Context::save_settings()
 {
-       // synfig::info("Left Normal State");
+       settings.set_value("normal.rotate",get_rotate_flag()?"1":"0");
+       settings.set_value("normal.scale",get_scale_flag()?"1":"0");
+       settings.set_value("normal.constrain",get_constrain_flag()?"1":"0");
+}
+
+StateNormal_Context::StateNormal_Context(CanvasView* canvas_view):
+       canvas_view_(canvas_view),
+       settings(synfigapp::Main::get_selected_input_device()->settings()),
+       duck_dragger_(new DuckDrag_Combo()),
+       checkbutton_rotate(_("Rotate (Ctrl)")),
+       checkbutton_scale(_("Scale (Alt)")),
+       checkbutton_constrain(_("Constrain (Shift)"))
+{
+       duck_dragger_->canvas_view_=get_canvas_view();
+
+       // Set up the tool options dialog
+       options_table.attach(*manage(new Gtk::Label(_("Normal Tool"))), 0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+       options_table.attach(checkbutton_rotate,                                                        0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+       options_table.attach(checkbutton_scale,                                                 0, 2, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+       options_table.attach(checkbutton_constrain,                                                     0, 2, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
+
+       checkbutton_rotate.signal_toggled().connect(sigc::mem_fun(*this,&StateNormal_Context::refresh_rotate_flag));
+       checkbutton_scale.signal_toggled().connect(sigc::mem_fun(*this,&StateNormal_Context::refresh_scale_flag));
+       checkbutton_constrain.signal_toggled().connect(sigc::mem_fun(*this,&StateNormal_Context::refresh_constrain_flag));
+
+
+       options_table.show_all();
+       refresh_tool_options();
+       //App::dialog_tool_options->set_widget(options_table);
+       //App::dialog_tool_options->present();
+
+       get_work_area()->set_allow_layer_clicks(true);
+       get_work_area()->set_duck_dragger(duck_dragger_);
+
+       keypress_connect=get_work_area()->signal_key_press_event().connect(sigc::mem_fun(*this,&StateNormal_Context::key_pressed),false);
+       keyrelease_connect=get_work_area()->signal_key_release_event().connect(sigc::mem_fun(*this,&StateNormal_Context::key_released),false);
+
+       //these will segfault
+//     get_work_area()->set_cursor(Gdk::CROSSHAIR);
+//     get_work_area()->reset_cursor();
+
+       App::toolbox->refresh();
+
+       load_settings();
+       refresh_scale_flag();
+}
+
+bool
+StateNormal_Context::key_pressed(GdkEventKey *event)
+{
+       switch(event->keyval)
+       {
+               case GDK_Control_L:
+               case GDK_Control_R:
+                       set_rotate_flag(true);
+                       break;
+               case GDK_Alt_L:
+               case GDK_Alt_R:
+                       set_scale_flag(true);
+                       break;
+               case GDK_Shift_L:
+               case GDK_Shift_R:
+                       set_constrain_flag(true);
+                       break;
+               default:
+                       break;
+       }
+       return false; //Pass on the event to other handlers, just in case
+}
+
+bool
+StateNormal_Context::key_released(GdkEventKey *event)
+{
+       switch(event->keyval)
+       {
+               case GDK_Control_L:
+               case GDK_Control_R:
+                       set_rotate_flag(false);
+                       break;
+               case GDK_Alt_L:
+               case GDK_Alt_R:
+                       set_scale_flag(false);
+                       break;
+               case GDK_Shift_L:
+               case GDK_Shift_R:
+                       set_constrain_flag(false);
+                       break;
+               default:
+                       break;
+       }
+       return false; //Pass on the event to other handlers
 }
 
 void
 StateNormal_Context::refresh_tool_options()
 {
        App::dialog_tool_options->clear();
+       App::dialog_tool_options->set_widget(options_table);
+       App::dialog_tool_options->set_local_name(_("Normal Tool"));
        App::dialog_tool_options->set_name("normal");
 }
 
+
+
+StateNormal_Context::~StateNormal_Context()
+{
+       save_settings();
+
+       get_work_area()->clear_duck_dragger();
+       get_work_area()->reset_cursor();
+
+       keypress_connect.disconnect();
+       keyrelease_connect.disconnect();
+
+       App::dialog_tool_options->clear();
+
+       App::toolbox->refresh();
+}
+
+DuckDrag_Combo::DuckDrag_Combo():
+       scale(false),
+       rotate(false),
+       constrain(false) // Lock aspect for scale; smooth move for translate
+{
+}
+
+void
+DuckDrag_Combo::begin_duck_drag(Duckmatic* duckmatic, const synfig::Vector& offset)
+{
+       last_move=Vector(1,1);
+
+       const DuckList selected_ducks(duckmatic->get_selected_ducks());
+       DuckList::const_iterator iter;
+
+       bad_drag=false;
+
+               drag_offset=duckmatic->find_duck(offset)->get_trans_point();
+
+               //snap=drag_offset-duckmatic->snap_point_to_grid(drag_offset);
+               //snap=offset-drag_offset_;
+               snap=Vector(0,0);
+
+       // Calculate center
+       Point vmin(100000000,100000000);
+       Point vmax(-100000000,-100000000);
+       //std::set<etl::handle<Duck> >::iterator iter;
+       positions.clear();
+       int i;
+       for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
+       {
+               Point p((*iter)->get_trans_point());
+               vmin[0]=min(vmin[0],p[0]);
+               vmin[1]=min(vmin[1],p[1]);
+               vmax[0]=max(vmax[0],p[0]);
+               vmax[1]=max(vmax[1],p[1]);
+               positions.push_back(p);
+       }
+       center=(vmin+vmax)*0.5;
+       if((vmin-vmax).mag()<=EPSILON)
+               move_only=true;
+       else
+               move_only=false;
+
+
+       synfig::Vector vect(offset-center);
+       original_angle=Angle::tan(vect[1],vect[0]);
+       original_mag=vect.mag();
+}
+
+
+void
+DuckDrag_Combo::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector)
+{
+       if (!duckmatic) return;
+
+       if(bad_drag)
+               return;
+
+       //Override axis lock set in workarea when holding down the shift key
+       if (!move_only && (scale || rotate))
+               duckmatic->set_axis_lock(false);
+
+       synfig::Vector vect;
+       if (move_only || (!scale && !rotate))
+               vect= duckmatic->snap_point_to_grid(vector)-drag_offset+snap;
+       else
+               vect= duckmatic->snap_point_to_grid(vector)-center+snap;
+
+       last_move=vect;
+
+       const DuckList selected_ducks(duckmatic->get_selected_ducks());
+       DuckList::const_iterator iter;
+
+       Time time(duckmatic->get_time());
+
+       int i;
+       if( move_only || (!scale && !rotate) )
+       {
+               for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
+               {
+                       if((*iter)->get_type()==Duck::TYPE_VERTEX || (*iter)->get_type()==Duck::TYPE_POSITION)
+                               (*iter)->set_trans_point(positions[i]+vect, time);
+               }
+               for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
+               {
+                       if((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION)
+                               (*iter)->set_trans_point(positions[i]+vect, time);
+               }
+       }
+
+       if (rotate)
+       {
+               Angle::deg angle(Angle::tan(vect[1],vect[0]));
+               angle=original_angle-angle;
+               if (constrain)
+               {
+                       float degrees = angle.get()/15;
+                       angle= Angle::deg (degrees>0?std::floor(degrees)*15:std::ceil(degrees)*15);
+               }
+               Real mag(vect.mag()/original_mag);
+               Real sine(Angle::sin(angle).get());
+               Real cosine(Angle::cos(angle).get());
+
+               for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
+               {
+                       if((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION)continue;
+
+                       Vector x(positions[i]-center),p;
+
+                       p[0]=cosine*x[0]+sine*x[1];
+                       p[1]=-sine*x[0]+cosine*x[1];
+                       if(scale)p*=mag;
+                       p+=center;
+                       (*iter)->set_trans_point(p, time);
+               }
+               for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
+               {
+                       if(!((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION))continue;
+
+                       Vector x(positions[i]-center),p;
+
+                       p[0]=cosine*x[0]+sine*x[1];
+                       p[1]=-sine*x[0]+cosine*x[1];
+                       if(scale)p*=mag;
+                       p+=center;
+                       (*iter)->set_trans_point(p, time);
+               }
+       } else if (scale)
+       {
+               if(!constrain)
+               {
+                       if(abs(drag_offset[0]-center[0])>EPSILON)
+                               vect[0]/=drag_offset[0]-center[0];
+                       else
+                               vect[0]=1;
+                       if(abs(drag_offset[1]-center[1])>EPSILON)
+                               vect[1]/=drag_offset[1]-center[1];
+                       else
+                               vect[1]=1;
+                       }
+               else
+               {
+                       //vect[0]=vect[1]=vect.mag()*0.707106781;
+                       Real amount(vect.mag()/(drag_offset-center).mag());
+                       vect[0]=vect[1]=amount;
+               }
+
+               if(vect[0]<EPSILON && vect[0]>-EPSILON)
+                       vect[0]=1;
+               if(vect[1]<EPSILON && vect[1]>-EPSILON)
+                       vect[1]=1;
+
+               for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
+               {
+                       if(((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION))continue;
+
+                       Vector p(positions[i]-center);
+
+                       p[0]*=vect[0];
+                       p[1]*=vect[1];
+                       p+=center;
+                       (*iter)->set_trans_point(p, time);
+               }
+               for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
+               {
+                       if(!((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION))continue;
+
+                       Vector p(positions[i]-center);
+
+                       p[0]*=vect[0];
+                       p[1]*=vect[1];
+                       p+=center;
+                       (*iter)->set_trans_point(p, time);
+               }
+       }
+
+       // then patch up the tangents for the vertices we've moved
+       duckmatic->update_ducks();
+
+       last_move=vect;
+}
+
+bool
+DuckDrag_Combo::end_duck_drag(Duckmatic* duckmatic)
+{
+       if(bad_drag)return false;
+
+       //synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Rotate Ducks"));
+
+       if((last_move-Vector(1,1)).mag()>0.0001)
+       {
+               duckmatic->signal_edited_selected_ducks();
+               return true;
+       }
+       else
+       {
+               duckmatic->signal_user_click_selected_ducks(0);
+               return false;
+       }
+}
+
 Smach::event_result
 StateNormal_Context::event_refresh_tool_options(const Smach::event& /*x*/)
 {
@@ -148,7 +547,7 @@ Smach::event_result
 StateNormal_Context::event_stop_handler(const Smach::event& /*x*/)
 {
        // synfig::info("STATE NORMAL: Received Stop Event");
-       canvas_view->stop();
+       canvas_view_->stop();
        return Smach::RESULT_ACCEPT;
 }
 
@@ -156,8 +555,8 @@ Smach::event_result
 StateNormal_Context::event_refresh_handler(const Smach::event& /*x*/)
 {
        // synfig::info("STATE NORMAL: Received Refresh Event");
-       canvas_view->rebuild_tables();
-       canvas_view->work_area->queue_render_preview();
+       canvas_view_->rebuild_tables();
+       canvas_view_->work_area->queue_render_preview();
        return Smach::RESULT_ACCEPT;
 }
 
@@ -165,7 +564,7 @@ Smach::event_result
 StateNormal_Context::event_refresh_ducks_handler(const Smach::event& /*x*/)
 {
        // synfig::info("STATE NORMAL: Received Refresh Ducks");
-       canvas_view->queue_rebuild_ducks();
+       canvas_view_->queue_rebuild_ducks();
        return Smach::RESULT_ACCEPT;
 }
 
@@ -173,7 +572,7 @@ Smach::event_result
 StateNormal_Context::event_undo_handler(const Smach::event& /*x*/)
 {
        // synfig::info("STATE NORMAL: Received Undo Event");
-       canvas_view->get_instance()->undo();
+       canvas_view_->get_instance()->undo();
        return Smach::RESULT_ACCEPT;
 }
 
@@ -181,7 +580,7 @@ Smach::event_result
 StateNormal_Context::event_redo_handler(const Smach::event& /*x*/)
 {
        // synfig::info("STATE NORMAL: Received Redo Event");
-       canvas_view->get_instance()->redo();
+       canvas_view_->get_instance()->redo();
        return Smach::RESULT_ACCEPT;
 }
 
@@ -195,7 +594,7 @@ StateNormal_Context::event_mouse_button_down_handler(const Smach::event& x)
        switch(event.button)
        {
        case BUTTON_RIGHT:
-               canvas_view->popup_main_menu();
+               canvas_view_->popup_main_menu();
                return Smach::RESULT_ACCEPT;
        default:
                return Smach::RESULT_OK;
@@ -220,26 +619,26 @@ StateNormal_Context::event_layer_click(const Smach::event& x)
        {
        case BUTTON_LEFT:
                if(!(event.modifier&Gdk::CONTROL_MASK))
-                       canvas_view->get_selection_manager()->clear_selected_layers();
+                       canvas_view_->get_selection_manager()->clear_selected_layers();
                if(event.layer)
                {
-                       std::list<Layer::Handle> layer_list(canvas_view->get_selection_manager()->get_selected_layers());
+                       std::list<Layer::Handle> layer_list(canvas_view_->get_selection_manager()->get_selected_layers());
                        std::set<Layer::Handle> layers(layer_list.begin(),layer_list.end());
                        if(layers.count(event.layer))
                        {
                                layers.erase(event.layer);
                                layer_list=std::list<Layer::Handle>(layers.begin(),layers.end());
-                               canvas_view->get_selection_manager()->clear_selected_layers();
-                               canvas_view->get_selection_manager()->set_selected_layers(layer_list);
+                               canvas_view_->get_selection_manager()->clear_selected_layers();
+                               canvas_view_->get_selection_manager()->set_selected_layers(layer_list);
                        }
                        else
                        {
-                               canvas_view->get_selection_manager()->set_selected_layer(event.layer);
+                               canvas_view_->get_selection_manager()->set_selected_layer(event.layer);
                        }
                }
                return Smach::RESULT_ACCEPT;
        case BUTTON_RIGHT:
-               canvas_view->popup_layer_menu(event.layer);
+               canvas_view_->popup_layer_menu(event.layer);
                return Smach::RESULT_ACCEPT;
        default:
                return Smach::RESULT_OK;
@@ -387,7 +786,8 @@ StateNormal_Context::event_multiple_ducks_clicked_handler(const Smach::event& /*
                        value_desc_list.push_back(
                                synfigapp::ValueDesc(
                                        ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node())
-                                       ,0
+                                       ,ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node())
+                                                               ->get_link_index_from_name("point")
                                )
                        );
                }
@@ -398,13 +798,13 @@ StateNormal_Context::event_multiple_ducks_clicked_handler(const Smach::event& /*
        Gtk::Menu *menu=manage(new Gtk::Menu());
        menu->signal_hide().connect(sigc::bind(sigc::ptr_fun(&delete_widget), menu));
 
-       canvas_view->get_instance()->make_param_menu(menu,canvas_view->get_canvas(),value_desc_list);
+       canvas_view_->get_instance()->make_param_menu(menu,canvas_view_->get_canvas(),value_desc_list);
 
        /*
        synfigapp::Action::ParamList param_list;
        param_list=get_canvas_interface()->generate_param_list(value_desc_list);
 
-       canvas_view->add_actions_to_menu(menu, param_list,synfigapp::Action::CATEGORY_VALUEDESC|synfigapp::Action::CATEGORY_VALUENODE);
+       canvas_view_->add_actions_to_menu(menu, param_list,synfigapp::Action::CATEGORY_VALUEDESC|synfigapp::Action::CATEGORY_VALUENODE);
 
        menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Edit Waypoints"),
                sigc::bind(
@@ -420,3 +820,5 @@ StateNormal_Context::event_multiple_ducks_clicked_handler(const Smach::event& /*
 
        return Smach::RESULT_ACCEPT;
 }
+
+
index 418dae0..01b040b 100644 (file)
@@ -6,6 +6,7 @@
 **
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -22,8 +23,8 @@
 
 /* === S T A R T =========================================================== */
 
-#ifndef __SYNFIG_STATE_NORMAL_H
-#define __SYNFIG_STATE_NORMAL_H
+#ifndef __SYNFIG_STUDIO_STATE_NORMAL_H
+#define __SYNFIG_STUDIO_STATE_NORMAL_H
 
 /* === H E A D E R S ======================================================= */
 
index c016f1d..7c11c05 100644 (file)
@@ -38,6 +38,7 @@
 #include <synfig/valuenode_bline.h>
 
 #include "state_polygon.h"
+#include "state_normal.h"
 #include "canvasview.h"
 #include "workarea.h"
 #include "app.h"
@@ -171,7 +172,7 @@ public:
        Smach::event_result event_layer_selection_changed_handler(const Smach::event& /*x*/)
        {
                if(egress_on_selection_change)
-                       throw Smach::egress_exception();
+                       throw &state_normal; //throw Smach::egress_exception();
                return Smach::RESULT_OK;
        }
 
@@ -368,7 +369,7 @@ StatePolygon_Context::StatePolygon_Context(CanvasView* canvas_view):
        // Refresh the work area
        get_work_area()->queue_draw();
 
-       get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR);
+       get_work_area()->set_cursor(Gdk::CROSSHAIR);
 
        // Hide the tables if they are showing
        prev_table_status=get_canvas_view()->tables_are_visible();
@@ -430,7 +431,7 @@ StatePolygon_Context::~StatePolygon_Context()
 
        App::dialog_tool_options->clear();
 
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->reset_cursor();
 
        // Enable the time bar
        get_canvas_view()->set_sensitive_timebar(true);
@@ -899,6 +900,7 @@ void
 StatePolygon_Context::refresh_ducks()
 {
        get_work_area()->clear_ducks();
+       get_work_area()->queue_draw();
 
        if(polygon_point_list.empty()) return;
 
index aa21c23..4f3eccb 100644 (file)
@@ -38,6 +38,7 @@
 #include <synfig/valuenode_bline.h>
 
 #include "state_rectangle.h"
+#include "state_normal.h"
 #include "canvasview.h"
 #include "workarea.h"
 #include "app.h"
@@ -176,7 +177,7 @@ public:
        Smach::event_result event_layer_selection_changed_handler(const Smach::event& /*x*/)
        {
                if(egress_on_selection_change)
-                       throw Smach::egress_exception();
+                       throw &state_normal; //throw Smach::egress_exception();
                return Smach::RESULT_OK;
        }
 
@@ -385,7 +386,7 @@ StateRectangle_Context::StateRectangle_Context(CanvasView* canvas_view):
        // Refresh the work area
        get_work_area()->queue_draw();
 
-       get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR);
+       get_work_area()->set_cursor(Gdk::DOTBOX);
 
        // Hide the tables if they are showing
        //prev_table_status=get_canvas_view()->tables_are_visible();
@@ -423,7 +424,7 @@ StateRectangle_Context::~StateRectangle_Context()
        // Restore layer clicking
        get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_);
 
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->reset_cursor();
 
        App::dialog_tool_options->clear();
 
@@ -444,7 +445,9 @@ StateRectangle_Context::~StateRectangle_Context()
 Smach::event_result
 StateRectangle_Context::event_stop_handler(const Smach::event& /*x*/)
 {
-       throw Smach::egress_exception();
+       //throw Smach::egress_exception();
+       throw &state_normal;
+       return Smach::RESULT_OK;
 }
 
 Smach::event_result
index 1635500..5463a41 100644 (file)
@@ -37,6 +37,7 @@
 #include <synfigapp/action_system.h>
 
 #include "state_rotate.h"
+#include "state_normal.h"
 #include "canvasview.h"
 #include "workarea.h"
 #include "app.h"
@@ -106,6 +107,7 @@ public:
 class studio::StateRotate_Context : public sigc::trackable
 {
        etl::handle<CanvasView> canvas_view_;
+       CanvasView::IsWorking is_working;
 
        synfigapp::Settings& settings;
 
@@ -120,7 +122,7 @@ public:
        bool get_scale_flag()const { return checkbutton_scale.get_active(); }
        void set_scale_flag(bool x) { return checkbutton_scale.set_active(x); refresh_scale_flag(); }
 
-
+       Smach::event_result event_stop_handler(const Smach::event& x);
        Smach::event_result event_refresh_tool_options(const Smach::event& x);
 
        void refresh_tool_options();
@@ -146,6 +148,7 @@ StateRotate::StateRotate():
        Smach::state<StateRotate_Context>("rotate")
 {
        insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateRotate_Context::event_refresh_tool_options));
+       insert(event_def(EVENT_STOP,&StateRotate_Context::event_stop_handler));
 }
 
 StateRotate::~StateRotate()
@@ -171,6 +174,7 @@ StateRotate_Context::save_settings()
 
 StateRotate_Context::StateRotate_Context(CanvasView* canvas_view):
        canvas_view_(canvas_view),
+       is_working(*canvas_view),
        settings(synfigapp::Main::get_selected_input_device()->settings()),
        duck_dragger_(new DuckDrag_Rotate()),
        checkbutton_scale(_("Allow Scale"))
@@ -191,8 +195,8 @@ StateRotate_Context::StateRotate_Context(CanvasView* canvas_view):
        get_work_area()->set_allow_layer_clicks(true);
        get_work_area()->set_duck_dragger(duck_dragger_);
 
-//     get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR);
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->set_cursor(Gdk::EXCHANGE);
+//     get_work_area()->reset_cursor();
 
        App::toolbox->refresh();
 
@@ -216,12 +220,19 @@ StateRotate_Context::event_refresh_tool_options(const Smach::event& /*x*/)
        return Smach::RESULT_ACCEPT;
 }
 
+Smach::event_result
+StateRotate_Context::event_stop_handler(const Smach::event& /*x*/)
+{
+       throw &state_normal;
+       return Smach::RESULT_OK;
+}
+
 StateRotate_Context::~StateRotate_Context()
 {
        save_settings();
 
        get_work_area()->clear_duck_dragger();
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->reset_cursor();
 
        App::dialog_tool_options->clear();
 
index 300ff4b..edfb89b 100644 (file)
@@ -37,6 +37,7 @@
 #include <synfigapp/action_system.h>
 
 #include "state_scale.h"
+#include "state_normal.h"
 #include "canvasview.h"
 #include "workarea.h"
 #include "app.h"
@@ -94,6 +95,7 @@ public:
 class studio::StateScale_Context : public sigc::trackable
 {
        etl::handle<CanvasView> canvas_view_;
+       CanvasView::IsWorking is_working;
 
        synfigapp::Settings& settings;
 
@@ -111,6 +113,7 @@ public:
 
        void refresh_aspect_lock_flag() { if(duck_dragger_)duck_dragger_->lock_aspect=get_aspect_lock_flag(); }
 
+       Smach::event_result event_stop_handler(const Smach::event& x);
        Smach::event_result event_refresh_tool_options(const Smach::event& x);
 
        void refresh_tool_options();
@@ -134,6 +137,7 @@ StateScale::StateScale():
        Smach::state<StateScale_Context>("scale")
 {
        insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateScale_Context::event_refresh_tool_options));
+       insert(event_def(EVENT_STOP,&StateScale_Context::event_stop_handler));
 }
 
 StateScale::~StateScale()
@@ -159,6 +163,7 @@ StateScale_Context::save_settings()
 
 StateScale_Context::StateScale_Context(CanvasView* canvas_view):
        canvas_view_(canvas_view),
+       is_working(*canvas_view),
        settings(synfigapp::Main::get_selected_input_device()->settings()),
        duck_dragger_(new DuckDrag_Scale()),
        checkbutton_aspect_lock(_("Lock Aspect Ratio"))
@@ -176,8 +181,8 @@ StateScale_Context::StateScale_Context(CanvasView* canvas_view):
        get_work_area()->set_allow_layer_clicks(true);
        get_work_area()->set_duck_dragger(duck_dragger_);
 
-//     get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR);
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->set_cursor(Gdk::SIZING);
+//     get_work_area()->reset_cursor();
 
        App::toolbox->refresh();
 
@@ -201,12 +206,19 @@ StateScale_Context::event_refresh_tool_options(const Smach::event& /*x*/)
        return Smach::RESULT_ACCEPT;
 }
 
+Smach::event_result
+StateScale_Context::event_stop_handler(const Smach::event& /*x*/)
+{
+       throw &state_normal;
+       return Smach::RESULT_OK;
+}
+
 StateScale_Context::~StateScale_Context()
 {
        save_settings();
 
        get_work_area()->clear_duck_dragger();
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->reset_cursor();
 
        App::dialog_tool_options->clear();
 
index b0d78f0..f8b77a3 100644 (file)
@@ -36,6 +36,7 @@
 #include <synfig/valuenode_dynamiclist.h>
 
 #include "state_sketch.h"
+#include "state_normal.h"
 #include "state_stroke.h"
 #include "canvasview.h"
 #include "workarea.h"
@@ -336,7 +337,7 @@ StateSketch_Context::StateSketch_Context(CanvasView* canvas_view):
        // Turn off layer clicking
        get_work_area()->set_allow_layer_clicks(false);
 
-       get_canvas_view()->work_area->set_cursor(Gdk::PENCIL);
+       get_work_area()->set_cursor(Gdk::PENCIL);
 
        // Turn off duck clicking
        get_work_area()->set_allow_duck_clicks(false);
@@ -362,7 +363,7 @@ StateSketch_Context::StateSketch_Context(CanvasView* canvas_view):
 
 StateSketch_Context::~StateSketch_Context()
 {
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->reset_cursor();
 
        App::dialog_tool_options->clear();
 
@@ -465,7 +466,9 @@ StateSketch_Context::event_yield_tool_options(const Smach::event& /*x*/)
 Smach::event_result
 StateSketch_Context::event_stop_handler(const Smach::event& /*x*/)
 {
-       throw Smach::egress_exception();
+       //throw Smach::egress_exception();
+       throw &state_normal;
+       return Smach::RESULT_OK;
 }
 
 Smach::event_result
index 56ca977..f42df35 100644 (file)
@@ -7,6 +7,7 @@
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **  Copyright (c) 2008 Chris Moore
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
 #include <gtkmm/dialog.h>
 #include <gtkmm/entry.h>
 
+#include <synfig/valuenode_blinecalcvertex.h>
+#include <synfig/valuenode_composite.h>
 #include <synfig/valuenode_dynamiclist.h>
 #include <synfigapp/action_system.h>
 
 #include "state_smoothmove.h"
+#include "state_normal.h"
 #include "canvasview.h"
 #include "workarea.h"
 #include "app.h"
@@ -95,6 +99,7 @@ public:
 class studio::StateSmoothMove_Context : public sigc::trackable
 {
        etl::handle<CanvasView> canvas_view_;
+       CanvasView::IsWorking is_working;
 
        //Duckmatic::Push duckmatic_push;
 
@@ -140,6 +145,7 @@ StateSmoothMove::StateSmoothMove():
        Smach::state<StateSmoothMove_Context>("smooth_move")
 {
        insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateSmoothMove_Context::event_refresh_tool_options));
+       insert(event_def(EVENT_STOP,&StateSmoothMove_Context::event_stop_handler));
 }
 
 StateSmoothMove::~StateSmoothMove()
@@ -165,6 +171,7 @@ StateSmoothMove_Context::save_settings()
 
 StateSmoothMove_Context::StateSmoothMove_Context(CanvasView* canvas_view):
        canvas_view_(canvas_view),
+       is_working(*canvas_view),
 //     duckmatic_push(get_work_area()),
        settings(synfigapp::Main::get_selected_input_device()->settings()),
        duck_dragger_(new DuckDrag_SmoothMove()),
@@ -190,8 +197,8 @@ StateSmoothMove_Context::StateSmoothMove_Context(CanvasView* canvas_view):
 
        App::toolbox->refresh();
 
-//     get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR);
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->set_cursor(Gdk::FLEUR);
+       //get_work_area()->reset_cursor();
 
        load_settings();
 }
@@ -212,12 +219,19 @@ StateSmoothMove_Context::event_refresh_tool_options(const Smach::event& /*x*/)
        return Smach::RESULT_ACCEPT;
 }
 
+Smach::event_result
+StateSmoothMove_Context::event_stop_handler(const Smach::event& /*x*/)
+{
+       throw &state_normal;
+       return Smach::RESULT_OK;
+}
+
 StateSmoothMove_Context::~StateSmoothMove_Context()
 {
        save_settings();
 
        get_work_area()->clear_duck_dragger();
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->reset_cursor();
 
        App::dialog_tool_options->clear();
 
@@ -262,6 +276,8 @@ DuckDrag_SmoothMove::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vecto
 
        int i;
 
+       Time time(duckmatic->get_time());
+
        // process vertex and position ducks first
        for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
        {
@@ -276,7 +292,7 @@ DuckDrag_SmoothMove::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vecto
                        dist=0;
 
                last_[i]=vect*dist;
-               (*iter)->set_trans_point(p+last_[i]);
+               (*iter)->set_trans_point(p+last_[i], time);
        }
 
        // then process non vertex and non position ducks
@@ -293,9 +309,12 @@ DuckDrag_SmoothMove::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vecto
                        dist=0;
 
                last_[i]=vect*dist;
-               (*iter)->set_trans_point(p+last_[i]);
+               (*iter)->set_trans_point(p+last_[i], time);
        }
 
+       // then patch up the tangents for the vertices we've moved
+       duckmatic->update_ducks();
+
        last_translate_=vect;
        //snap=Vector(0,0);
 }
@@ -316,9 +335,45 @@ DuckDrag_SmoothMove::end_duck_drag(Duckmatic* duckmatic)
                for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
                {
                        if(last_[i].mag()>0.0001)
-                               if(!(*iter)->signal_edited()((*iter)->get_point()))
                                {
-                                       throw String("Bad Move");
+                               if ((*iter)->get_type() == Duck::TYPE_ANGLE)
+                                       {
+                                               if(!(*iter)->signal_edited_angle()((*iter)->get_rotations()))
+                                               {
+                                                       throw String("Bad edit");
+                                               }
+                                       }
+                                       else if (App::restrict_radius_ducks &&
+                                                        (*iter)->is_radius())
+                                       {
+                                               Point point((*iter)->get_point());
+                                               bool changed = false;
+
+                                               if (point[0] < 0)
+                                               {
+                                                       point[0] = 0;
+                                                       changed = true;
+                                               }
+                                               if (point[1] < 0)
+                                               {
+                                                       point[1] = 0;
+                                                       changed = true;
+                                               }
+
+                                               if (changed) (*iter)->set_point(point);
+
+                                               if(!(*iter)->signal_edited()(point))
+                                               {
+                                                       throw String("Bad edit");
+                                               }
+                                       }
+                                       else
+                                       {
+                                               if(!(*iter)->signal_edited()((*iter)->get_point()))
+                                               {
+                                                       throw String("Bad edit");
+                                               }
+                                       }
                                }
                }
                //duckmatic->get_selected_ducks()=new_set;
index e5b3ace..270571a 100644 (file)
@@ -38,6 +38,7 @@
 #include <synfig/valuenode_bline.h>
 
 #include "state_star.h"
+#include "state_normal.h"
 #include "canvasview.h"
 #include "workarea.h"
 #include "app.h"
@@ -215,7 +216,7 @@ public:
        Smach::event_result event_layer_selection_changed_handler(const Smach::event& /*x*/)
        {
                if(egress_on_selection_change)
-                       throw Smach::egress_exception();
+                       throw &state_normal; //throw Smach::egress_exception();
                return Smach::RESULT_OK;
        }
 
@@ -510,7 +511,7 @@ StateStar_Context::StateStar_Context(CanvasView* canvas_view):
 
        // Connect a signal
        //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateStar_Context::on_user_click));
-       get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR);
+       get_work_area()->set_cursor(Gdk::STAR);
 
        App::toolbox->refresh();
 }
@@ -537,7 +538,7 @@ StateStar_Context::~StateStar_Context()
 
        // Restore layer clicking
        get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_);
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->reset_cursor();
 
        App::dialog_tool_options->clear();
 
@@ -558,7 +559,9 @@ StateStar_Context::~StateStar_Context()
 Smach::event_result
 StateStar_Context::event_stop_handler(const Smach::event& /*x*/)
 {
-       throw Smach::egress_exception();
+       //throw Smach::egress_exception();
+       throw &state_normal;
+       return Smach::RESULT_OK;
 }
 
 Smach::event_result
index 8f7d0c9..f475420 100644 (file)
@@ -34,6 +34,7 @@
 #include <gtkmm/entry.h>
 
 #include "state_text.h"
+#include "state_normal.h"
 #include "canvasview.h"
 #include "workarea.h"
 #include "app.h"
@@ -132,7 +133,7 @@ public:
        Smach::event_result event_layer_selection_changed_handler(const Smach::event& /*x*/)
        {
                if(egress_on_selection_change)
-                       throw Smach::egress_exception();
+                       throw &state_normal; //throw Smach::egress_exception();
                return Smach::RESULT_OK;
        }
 
@@ -316,7 +317,7 @@ StateText_Context::StateText_Context(CanvasView *canvas_view):
 
        // Connect a signal
        //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateText_Context::on_user_click));
-       get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR);
+       get_work_area()->set_cursor(Gdk::XTERM);
 
        App::toolbox->refresh();
 }
@@ -343,7 +344,7 @@ StateText_Context::~StateText_Context()
 
        // Restore layer clicking
        get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_);
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->reset_cursor();
 
        App::dialog_tool_options->clear();
 
@@ -357,7 +358,9 @@ StateText_Context::~StateText_Context()
 Smach::event_result
 StateText_Context::event_stop_handler(const Smach::event& /*x*/)
 {
-       throw Smach::egress_exception();
+       //throw Smach::egress_exception();
+       throw &state_normal;
+       return Smach::RESULT_OK;
 }
 
 Smach::event_result
index 1c7ef4f..8c74daa 100644 (file)
@@ -39,6 +39,7 @@
 #include <synfigapp/action_system.h>
 
 #include "state_width.h"
+#include "state_normal.h"
 #include "canvasview.h"
 #include "workarea.h"
 #include "app.h"
@@ -356,7 +357,9 @@ StateWidth_Context::~StateWidth_Context()
 Smach::event_result
 StateWidth_Context::event_stop_handler(const Smach::event& /*x*/)
 {
-       throw Smach::egress_exception();
+       //throw Smach::egress_exception();
+       throw &state_normal;
+       return Smach::RESULT_OK;
 }
 
 Smach::event_result
index 57a2522..56363e6 100644 (file)
@@ -38,6 +38,7 @@
 
 
 #include "state_zoom.h"
+#include "state_normal.h"
 #include "event_mouse.h"
 #include "canvasview.h"
 #include "workarea.h"
@@ -136,7 +137,7 @@ StateZoom_Context::StateZoom_Context(CanvasView* canvas_view):
 
        // Connect a signal
        //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateZoom_Context::on_user_click));
-       get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR);
+       get_work_area()->set_cursor(Gdk::CROSSHAIR);
 
        App::toolbox->refresh();
 }
@@ -145,7 +146,7 @@ StateZoom_Context::~StateZoom_Context()
 {
        // Restore layer clicking
        get_work_area()->set_allow_layer_clicks(prev_workarea_layer_status_);
-       get_canvas_view()->work_area->reset_cursor();
+       get_work_area()->reset_cursor();
 
        // Enable the time bar
        //get_canvas_view()->set_sensitive_timebar(true);
@@ -164,7 +165,9 @@ StateZoom_Context::~StateZoom_Context()
 Smach::event_result
 StateZoom_Context::event_stop_handler(const Smach::event& /*x*/)
 {
-       throw Smach::egress_exception();
+       //throw Smach::egress_exception();
+       throw &state_normal;
+       return Smach::RESULT_OK;
 }
 
 Smach::event_result
index 55c43ae..af2931e 100644 (file)
@@ -8,6 +8,7 @@
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **     Copyright (c) 2007, 2008 Chris Moore
 **  Copyright (c) 2008 Paul Wise
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -474,16 +475,7 @@ Toolbox::change_state_(const Smach::state_base *state)
        {
                etl::handle<studio::CanvasView> canvas_view(studio::App::get_selected_canvas_view());
                if(canvas_view)
-               {
-                       if(state->get_name()==String("normal"))
-                       {
-                               canvas_view->get_smach().egress();
-                       }
-                       else
-                       {
                                canvas_view->get_smach().enter(state);
-                       }
-               }
                else
                        refresh();
        }
index a178614..1e94ef7 100644 (file)
@@ -58,12 +58,24 @@ using namespace studio;
 Widget_Filename::Widget_Filename()
 {
        entry_filename=manage(new Gtk::Entry());
-       button_choose=manage(new Gtk::Button(_("Find")));
+       label_find= manage(new Gtk::Label(_("Find")));
+       button_choose=manage(new Gtk::Button());
+       Pango::AttrList attr_list;
+       {
+               Pango::AttrInt pango_size(Pango::Attribute::create_attr_size(Pango::SCALE*7));
+               pango_size.set_start_index(0);
+               pango_size.set_end_index(64);
+               attr_list.change(pango_size);
+       }
+       label_find->set_attributes(attr_list);
+       label_find->set_ellipsize(Pango::ELLIPSIZE_END);
+       button_choose->add(*label_find);
 
        pack_start(*entry_filename);
        pack_start(*button_choose);
        entry_filename->show();
        button_choose->show();
+       label_find->show();
 
        button_choose->signal_clicked().connect(sigc::mem_fun(*this, &studio::Widget_Filename::on_button_choose_pressed));
        //entry_filename->signal_value_changed().connect(sigc::mem_fun(*this, &studio::Widget_Filename::on_value_changed));
index eb8e954..69cfb48 100644 (file)
@@ -47,6 +47,7 @@ class Widget_Filename : public Gtk::HBox
 {
        Gtk::Entry *entry_filename;
        Gtk::Button *button_choose;
+       Gtk::Label *label_find;
 
        void on_button_choose_pressed();
 
index 75d775e..4a69696 100644 (file)
@@ -7,6 +7,7 @@
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **     Copyright (c) 2007, 2008 Chris Moore
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -157,7 +158,7 @@ Action::BLinePointTangentMerge::prepare()
 
        action->set_param("canvas",get_canvas());
        action->set_param("canvas_interface",get_canvas_interface());
-       action->set_param("value_desc",ValueDesc(value_node,3));
+       action->set_param("value_desc",ValueDesc(value_node,value_node->get_link_index_from_name("split")));
        action->set_param("time",time);
        action->set_param("new_value",synfig::ValueBase(false));
 
index 67cc22f..6ce81d1 100644 (file)
@@ -7,6 +7,7 @@
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **     Copyright (c) 2007, 2008 Chris Moore
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -157,7 +158,7 @@ Action::BLinePointTangentSplit::prepare()
 
        action->set_param("canvas",get_canvas());
        action->set_param("canvas_interface",get_canvas_interface());
-       action->set_param("value_desc",ValueDesc(value_node,3));
+       action->set_param("value_desc",ValueDesc(value_node,value_node->get_link_index_from_name("split")));
        action->set_param("time",time);
        action->set_param("new_value",synfig::ValueBase(true));
 
index e3959ce..83b2646 100644 (file)
@@ -156,7 +156,8 @@ Action::ValueDescSet::prepare()
        // tangent.
        if(     value_desc.parent_is_value_node() &&
                value_desc.get_parent_value_node()->get_type()==ValueBase::TYPE_BLINEPOINT &&
-               (value_desc.get_index()==4 || value_desc.get_index()==5) &&
+               (value_desc.get_name()=="t1" || value_desc.get_name()=="t2") &&
+               //(value_desc.get_index()==4 || value_desc.get_index()==5) &&
                (*value_desc.get_parent_value_node())(time).get(BLinePoint()).get_split_tangent_flag()==false)
        {
                {
@@ -168,7 +169,8 @@ Action::ValueDescSet::prepare()
                        Vector t2((*parent_value_node->get_link("t2"))(time));
                }
 
-               if (value_desc.get_index()==4) {
+               //if (value_desc.get_index()==4) {
+               if (value_desc.get_name()=="t1") {
                        ValueNode_Composite::Handle parent_value_node;
                        parent_value_node=parent_value_node.cast_dynamic(value_desc.get_parent_value_node());
 
@@ -183,7 +185,7 @@ Action::ValueDescSet::prepare()
                        action->set_param("canvas_interface",get_canvas_interface());
                        action->set_param("time",time);
                        action->set_param("new_value",value);
-                       action->set_param("value_desc",ValueDesc(parent_value_node,5));
+                       action->set_param("value_desc",ValueDesc(parent_value_node, parent_value_node->get_link_index_from_name("t2")));
 
                        if(!action->is_ready())
                                throw Error(Error::TYPE_NOTREADY);
@@ -300,7 +302,7 @@ Action::ValueDescSet::prepare()
                case ValueBase::TYPE_VECTOR:
                {
                        Angle old_angle = (*(ValueNode_RadialComposite::Handle::cast_dynamic(
-                                                                        value_desc.get_value_node())->get_link_vfunc(1)))(time).get(Angle());
+                                                                        value_desc.get_value_node())->get_link("theta")))(time).get(Angle());
                        Vector vect(value.get(Vector()));
                        components[0]=vect.mag();
                        Angle change = Angle(Angle::tan(vect[1],vect[0])) - old_angle;
@@ -370,8 +372,8 @@ Action::ValueDescSet::prepare()
                        action->set_param("canvas",get_canvas());
                        action->set_param("canvas_interface",get_canvas_interface());
                        action->set_param("time",time);
-                       action->set_param("new_value",(*parent_value_node->get_link(4))(time));
-                       action->set_param("value_desc",ValueDesc(parent_value_node,5));
+                       action->set_param("new_value",(*parent_value_node->get_link("t1"))(time));
+                       action->set_param("value_desc",ValueDesc(parent_value_node,parent_value_node->get_link_index_from_name("t2")));
 
                        if(!action->is_ready())
                                throw Error(Error::TYPE_NOTREADY);
@@ -396,7 +398,7 @@ Action::ValueDescSet::prepare()
                                action->set_param("canvas_interface",get_canvas_interface());
                                action->set_param("time",time);
                                action->set_param("new_value",average);
-                               action->set_param("value_desc",ValueDesc(parent_value_node,4));
+                               action->set_param("value_desc",ValueDesc(parent_value_node,parent_value_node->get_link_index_from_name("t1")));
 
                                if(!action->is_ready())
                                        throw Error(Error::TYPE_NOTREADY);
@@ -414,7 +416,7 @@ Action::ValueDescSet::prepare()
                                action->set_param("canvas_interface",get_canvas_interface());
                                action->set_param("time",time);
                                action->set_param("new_value",average);
-                               action->set_param("value_desc",ValueDesc(parent_value_node,5));
+                               action->set_param("value_desc",ValueDesc(parent_value_node,parent_value_node->get_link_index_from_name("t2")));
 
                                if(!action->is_ready())
                                        throw Error(Error::TYPE_NOTREADY);
index a613d12..7ef0910 100644 (file)
@@ -6,6 +6,7 @@
 **
 **     \legal
 **     Copyright (c) 2008 Chris Moore
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
index ccc562a..99b4604 100644 (file)
@@ -7,6 +7,7 @@
 **     \legal
 **     Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
 **     Copyright (c) 2008 Chris Moore
+**     Copyright (c) 2009 Nikita Kitaev
 **
 **     This package is free software; you can redistribute it and/or
 **     modify it under the terms of the GNU General Public License as
@@ -130,6 +131,7 @@ public:
 
        synfig::ValueNode::Handle get_parent_value_node()const { assert(parent_is_value_node()); return parent_value_node; }
        int get_index()const { assert(parent_is_linkable_value_node()); return index; }
+       synfig::String get_name()const { assert(parent_is_linkable_value_node()); return (synfig::LinkableValueNode::Handle::cast_reinterpret(parent_value_node))->link_name(index); }
        synfig::Time get_waypoint_time()const { assert(parent_is_waypoint()); return waypoint_time; }
 
        const synfig::String& get_value_node_id()const { assert(parent_is_canvas()); return name; }