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