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"
"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"
#: ../src/modules/example/metaballs.cpp:56
msgid "Metaballs"
-msgstr "Меташары"
+msgstr "Metaballs"
#: ../src/modules/example/metaballs.cpp:132
#: ../src/modules/mod_gradient/conicalgradient.cpp:106
#: ../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"
#: ../src/synfig/layer_pastecanvas.cpp:137
msgid "Size of canvas"
-msgstr "Размерхолста"
+msgstr "Размер холста"
#: ../src/synfig/layer_pastecanvas.cpp:145
msgid "Children Lock"
#: ../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"
** 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
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;
}
}
** \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
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:
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
+#
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"
#: ../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
#. 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
"%s\n"
msgstr ""
"\n"
-"Ð\9dеÑ\81Ñ\82абилÑ\8cнаÑ\8f веÑ\80Ñ\81иÑ\8f:\n"
+"СбоÑ\80ка:\n"
"%s\n"
#: ../src/gtkmm/about.cpp:209
#: ../src/gtkmm/about.cpp:224
msgid "Using:\n"
-msgstr "Использование:\n"
+msgstr "Используется:\n"
#: ../src/gtkmm/about.cpp:225
#, c-format
#: ../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"
#: ../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
#: ../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"
#: ../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"
"\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"
#: ../src/gtkmm/canvasview.cpp:2059 ../src/gtkmm/canvasview.cpp:2532
msgid "Select All Children"
-msgstr "Выделить всех потомков"
+msgstr "Выделить содержимое"
#: ../src/gtkmm/canvasview.cpp:2345
msgid "-MODIFIED"
#: ../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"
#: ../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"
#: ../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"
#: ../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"
#: ../src/gtkmm/dialog_setup.cpp:181
msgid "Points"
-msgstr "Ð\9fÑ\83нкÑ\82"
+msgstr "ТоÑ\87ка"
#: ../src/gtkmm/dialog_setup.cpp:182
msgid "Inches"
#: ../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"
#: ../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"
#: ../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"
#: ../src/gtkmm/dialog_soundselect.cpp:79
msgid "Time _Offset"
-msgstr "_Смещение во времени"
+msgstr "_Смещение времени"
#: ../src/gtkmm/dialog_tooloptions.cpp:56
#: ../src/gtkmm/dialog_tooloptions.cpp:78
#: ../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"
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 ""
#: ../src/gtkmm/iconcontroller.cpp:173 ../src/gtkmm/layeractionmanager.cpp:135
msgid "Select All Child Layers"
-msgstr "Выбрать все слои-потомки"
+msgstr "Выбрать все вложенные слои"
#: ../src/gtkmm/iconcontroller.cpp:181
msgid "MetaData"
#: ../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"
#: ../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"
#: ../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
#: ../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
#: ../src/gtkmm/layeractionmanager.cpp:129
msgid "Amount"
-msgstr "ЧиÑ\81ло"
+msgstr "Ð\92елиÑ\87ина"
#: ../src/gtkmm/layeractionmanager.cpp:365
msgid "Paste"
#: ../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"
#: ../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"
#: ../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"
#: ../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"
#: ../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"
#: ../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
#: ../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
#: ../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"
#: ../src/gtkmm/state_gradient.cpp:271
msgid "Gradient Type"
-msgstr "Тип градиент"
+msgstr "Тип градиента"
#: ../src/gtkmm/state_gradient.cpp:272
msgid "Determines the type of Gradient used"
#: ../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"
#: ../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"
#. 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
#: ../src/gtkmm/toolbox.cpp:290
msgid "New..."
-msgstr "Создать"
+msgstr "Создать..."
#: ../src/gtkmm/toolbox.cpp:291
msgid "Open..."
#: ../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"
#: ../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"
#: ../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"
#: ../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"
#: ../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"
#: ../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"
#: ../src/synfigapp/action_system.cpp:148
#: ../src/synfigapp/action_system.cpp:159
msgid "Failed"
-msgstr ". Неуспешно."
+msgstr "Неуспешно."
#: ../src/synfigapp/action_system.cpp:192
msgid "Successful"
#: ../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
** 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
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();
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");
/* === 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
** 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
#include <ETL/clock>
#include <sstream>
+#include <math.h>
#include <gtkmm/paned.h>
#include <gtkmm/scale.h>
toggling_snap_grid=false;
toggling_onion_skin=false;
- smach_.set_default_state(&state_normal);
-
disp_audio = new Widget_Sound();
//synfig::info("Canvasview: Entered constructor");
//set_transient_for(*App::toolbox);
+ smach_.set_default_state(&state_normal);
+
//synfig::info("Canvasview: Before Signals");
/*
-- ** -- Signals -------------------------------------------------------------
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()))
#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
**
** \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
/* === 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_);
set_widget(empty_label);
empty_label.show();
- set_stock_id(Gtk::StockID("synfig-normal"));
+ set_stock_id(Gtk::StockID("synfig-about"));
}
void
** \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 =========================================================== */
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)
}
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)
(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
** \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
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.
** \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
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()
{
// 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;
}
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();
** 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
// 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"));
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"));
** \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
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);
**
** \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
#include <synfigapp/action_system.h>
#include "state_mirror.h"
+#include "../state_normal.h"
#include "../canvasview.h"
#include "../workarea.h"
#include "../app.h"
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();
void load_settings();
void save_settings();
+
+ bool key_event(GdkEventKey *event);
}; // END of class StateMirror_Context
/* === M E T H O D S ======================================================= */
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()
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();
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();
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()
{
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();
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 ||
#include <synfig/valuenode_dynamiclist.h>
#include "state_bline.h"
+#include "state_normal.h"
#include "canvasview.h"
#include "workarea.h"
#include "app.h"
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;
}
// 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();
}
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_);
#include <synfig/valuenode_bline.h>
#include "state_circle.h"
+#include "state_normal.h"
#include "canvasview.h"
#include "workarea.h"
#include "app.h"
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;
}
// 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();
}
// 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();
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
** \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
#include "state_draw.h"
#include "state_stroke.h"
+#include "state_normal.h"
#include "canvasview.h"
#include "workarea.h"
#include "app.h"
// 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();
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_);
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
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;
}
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()))
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");
#endif
#include "state_eyedrop.h"
+#include "state_normal.h"
#include "workarea.h"
#include <synfig/context.h>
#include "app.h"
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;
}
#endif
#include "state_fill.h"
+#include "state_normal.h"
#include "workarea.h"
#include <synfig/context.h>
#include "app.h"
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;
}
#include <synfigapp/action_system.h>
#include "state_gradient.h"
+#include "state_normal.h"
#include "canvasview.h"
#include "workarea.h"
#include "app.h"
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;
}
// 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();
// 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();
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
** \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 =========================================================== */
/* === 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 ======================================================= */
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*/)
{
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;
}
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;
}
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;
}
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;
}
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;
}
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;
{
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;
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")
)
);
}
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(
return Smach::RESULT_ACCEPT;
}
+
+
**
** \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
/* === 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 ======================================================= */
#include <synfig/valuenode_bline.h>
#include "state_polygon.h"
+#include "state_normal.h"
#include "canvasview.h"
#include "workarea.h"
#include "app.h"
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;
}
// 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();
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);
StatePolygon_Context::refresh_ducks()
{
get_work_area()->clear_ducks();
+ get_work_area()->queue_draw();
if(polygon_point_list.empty()) return;
#include <synfig/valuenode_bline.h>
#include "state_rectangle.h"
+#include "state_normal.h"
#include "canvasview.h"
#include "workarea.h"
#include "app.h"
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;
}
// 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();
// 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();
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
#include <synfigapp/action_system.h>
#include "state_rotate.h"
+#include "state_normal.h"
#include "canvasview.h"
#include "workarea.h"
#include "app.h"
class studio::StateRotate_Context : public sigc::trackable
{
etl::handle<CanvasView> canvas_view_;
+ CanvasView::IsWorking is_working;
synfigapp::Settings& settings;
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();
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()
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"))
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();
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();
#include <synfigapp/action_system.h>
#include "state_scale.h"
+#include "state_normal.h"
#include "canvasview.h"
#include "workarea.h"
#include "app.h"
class studio::StateScale_Context : public sigc::trackable
{
etl::handle<CanvasView> canvas_view_;
+ CanvasView::IsWorking is_working;
synfigapp::Settings& settings;
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();
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()
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"))
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();
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();
#include <synfig/valuenode_dynamiclist.h>
#include "state_sketch.h"
+#include "state_normal.h"
#include "state_stroke.h"
#include "canvasview.h"
#include "workarea.h"
// 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);
StateSketch_Context::~StateSketch_Context()
{
- get_canvas_view()->work_area->reset_cursor();
+ get_work_area()->reset_cursor();
App::dialog_tool_options->clear();
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
** \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"
class studio::StateSmoothMove_Context : public sigc::trackable
{
etl::handle<CanvasView> canvas_view_;
+ CanvasView::IsWorking is_working;
//Duckmatic::Push duckmatic_push;
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()
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()),
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();
}
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();
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++)
{
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
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);
}
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;
#include <synfig/valuenode_bline.h>
#include "state_star.h"
+#include "state_normal.h"
#include "canvasview.h"
#include "workarea.h"
#include "app.h"
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;
}
// 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();
}
// 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();
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
#include <gtkmm/entry.h>
#include "state_text.h"
+#include "state_normal.h"
#include "canvasview.h"
#include "workarea.h"
#include "app.h"
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;
}
// 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();
}
// 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();
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
#include <synfigapp/action_system.h>
#include "state_width.h"
+#include "state_normal.h"
#include "canvasview.h"
#include "workarea.h"
#include "app.h"
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
#include "state_zoom.h"
+#include "state_normal.h"
#include "event_mouse.h"
#include "canvasview.h"
#include "workarea.h"
// 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();
}
{
// 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);
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
** 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
{
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();
}
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));
{
Gtk::Entry *entry_filename;
Gtk::Button *button_choose;
+ Gtk::Label *label_find;
void on_button_choose_pressed();
** \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
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));
** \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
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));
// 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)
{
{
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());
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);
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;
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);
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);
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);
**
** \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
** \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
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; }