From 64be48c182aba8ac460f693afeb5648a8393ddce Mon Sep 17 00:00:00 2001 From: Nikita Kitaev Date: Mon, 30 Nov 2009 18:30:54 -0800 Subject: [PATCH 1/1] New Tool: Transform * Replaces Rotate and Scale tools * Also allows moving (translating) ducks * Includes keyboard shortcuts * Tools reordered in toolbox Problems: * Shift key is being used elsewhere * Needs an icon * Normal tool cannot be easily removed --- synfig-studio/images/Makefile.am | 3 +- synfig-studio/images/rotate_icon.sif | 2393 ------------------ synfig-studio/images/scale_icon.sif | 3494 --------------------------- synfig-studio/images/transform_icon.sif | 2393 ++++++++++++++++++ synfig-studio/src/gtkmm/Makefile.am | 6 +- synfig-studio/src/gtkmm/app.cpp | 22 +- synfig-studio/src/gtkmm/iconcontroller.cpp | 3 +- synfig-studio/src/gtkmm/state_rotate.cpp | 387 --- synfig-studio/src/gtkmm/state_rotate.h | 56 - synfig-studio/src/gtkmm/state_scale.cpp | 377 --- synfig-studio/src/gtkmm/state_scale.h | 55 - synfig-studio/src/gtkmm/state_transform.cpp | 816 +++++++ synfig-studio/src/gtkmm/state_transform.h | 56 + 13 files changed, 3279 insertions(+), 6782 deletions(-) delete mode 100644 synfig-studio/images/rotate_icon.sif delete mode 100644 synfig-studio/images/scale_icon.sif create mode 100644 synfig-studio/images/transform_icon.sif delete mode 100644 synfig-studio/src/gtkmm/state_rotate.cpp delete mode 100644 synfig-studio/src/gtkmm/state_rotate.h delete mode 100644 synfig-studio/src/gtkmm/state_scale.cpp delete mode 100644 synfig-studio/src/gtkmm/state_scale.h create mode 100644 synfig-studio/src/gtkmm/state_transform.cpp create mode 100644 synfig-studio/src/gtkmm/state_transform.h diff --git a/synfig-studio/images/Makefile.am b/synfig-studio/images/Makefile.am index 0d703f3..1c99b78 100644 --- a/synfig-studio/images/Makefile.am +++ b/synfig-studio/images/Makefile.am @@ -109,8 +109,7 @@ IMAGES = \ keyframe_icon.$(EXT) \ reset_colors_icon.$(EXT) \ swap_colors_icon.$(EXT) \ - rotate_icon.$(EXT) \ - scale_icon.$(EXT) \ + transform_icon.$(EXT) \ smooth_move_icon.$(EXT) \ width_icon.$(EXT) \ rectangle_icon.$(EXT) \ diff --git a/synfig-studio/images/rotate_icon.sif b/synfig-studio/images/rotate_icon.sif deleted file mode 100644 index 7fab72e..0000000 --- a/synfig-studio/images/rotate_icon.sif +++ /dev/null @@ -1,2393 +0,0 @@ - - - Synfig Studio Rotate Icon - Placed in the Public Domain in 2007 by Chris Norman (pixelgeek) - - - - - - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - 0.300000 - 0.300000 - 0.300000 - 1.000000 - - - 1.000000 - 1.000000 - 1.000000 - 0.000000 - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - -2.5961599350 - 2.5961599350 - - - - - 2.6703450680 - -2.1673052311 - - - - - -3.2451999187 - 0.8112999797 - - - - - 1.7848598957 - 0.8112999797 - - - - - 2.2716398239 - -0.3245199919 - - - - - -2.9206800461 - -0.3245199919 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - 0.300000 - 0.300000 - 0.300000 - 1.000000 - - - 1.000000 - 1.000000 - 1.000000 - 0.000000 - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - -2.5961599350 - 2.5961599350 - - - - - 2.6703450680 - -2.1673052311 - - - - - -2.2716398239 - -1.4603400230 - - - - - 2.7584199905 - -1.4603400230 - - - - - 3.2451999187 - -2.5961599350 - - - - - -1.9471199512 - -2.5961599350 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.4867799878 - 0.0000000000 - - - - - - - - - - - - - - - - - 0.011238 - 0.065656 - 0.247059 - 1.000000 - - - - - -3.3425526619 - 0.0000000000 - - - - - 0.5516827703 - 3.1153881550 - - - - - - - - - - - - - - - - - - - - - - 1.000000 - 1.000000 - 1.000000 - 1.000000 - - - - - -3.0829367638 - 0.2596156895 - - - - - 0.2920670807 - 2.8557724953 - - - - - - - - - - - - - - - - - - - - - - -1.7848598957 - 1.9471199512 - - - - - - - - - - - - - - - - - 1.000000 - 1.000000 - 1.000000 - 1.000000 - - - - - -1.0384613276 - -1.4278886318 - - - - - 1.8173112869 - 0.6490369439 - - - - - - - - - - - - - - - - - - - - - - -1.7848600149 - 1.9471199512 - - - - - 2.9206800461 - -4.0564999580 - - - - - - 0.028991 - 0.133209 - 0.374624 - 1.000000 - - - 1.000000 - 1.000000 - 1.000000 - 1.000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - 0.011238 - 0.065656 - 0.247059 - 1.000000 - - - - - -1.1146180630 - -2.0209679604 - - - - - 2.5569021702 - 0.9162484407 - - - - - - - - - - - - - - - - - - - - - - 1.000000 - 1.000000 - 1.000000 - 1.000000 - - - - - -0.8734864593 - -1.7986452579 - - - - - 2.3052372932 - 0.6841450930 - - - - - - - - - - - - - - - - - - - - - - 0.1622599959 - -0.3245199919 - - - - - - - - - - - - - - - - - 1.000000 - 1.000000 - 1.000000 - 1.000000 - - - - - -0.8288472295 - -1.2672259808 - - - - - 1.9548872709 - 0.7829568982 - - - - - - - - - - - - - - - - - - - - - - 2.0723481178 - -2.8204009533 - - - - - -2.8938808441 - 3.8485348225 - - - - - - 0.028991 - 0.133209 - 0.374624 - 1.000000 - - - 1.000000 - 1.000000 - 1.000000 - 1.000000 - - - - - - - - - - - - - - - - - - - - - 0.9735599756 - -0.1622599959 - - - - - - - - - - - - - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - 1.000000 - 1.000000 - 1.000000 - 1.000000 - - - - - -4.0240430832 - -2.9855804443 - - - - - - - - - - - - - - - - - - - - - 2.7908737659 - 0.8437545300 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.7524110079 - 1.4927937984 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.7524110079 - 1.8822172880 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.1033717394 - 1.8822172880 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.9471199512 - 2.7584199905 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.7908737659 - 1.8822172880 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.1418344975 - 1.8822172880 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.1418344975 - 1.6226016283 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.7908737659 - 1.2331780195 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.303279 - 0.295082 - 0.303279 - 0.333333 - - - - - -0.1894220859 - -0.1675494760 - - - - - 0.1000007167 - 0.1000007167 - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.065656 - 0.247059 - 1.000000 - - - - - -4.0240430832 - -2.9855804443 - - - - - - - - - - - - - - - - - - - - - 2.7908737659 - 0.8437545300 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.7524110079 - 1.4927937984 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.7524110079 - 1.8822172880 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.1033717394 - 1.8822172880 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.9471199512 - 2.7584199905 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.7908737659 - 1.8822172880 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.1418344975 - 1.8822172880 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.1418344975 - 1.6226016283 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.7908737659 - 1.2331780195 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - 1.000000 - 1.000000 - 1.000000 - 1.000000 - - - - - 0.1622599959 - -0.3245199919 - - - - - - - - - - - - - - - - - - - - - 1.1358199120 - 2.9206800461 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.1742811203 - 2.4014453888 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.1742811203 - 1.8822140694 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.8233203888 - 1.8822140694 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.9795694351 - 1.1033670902 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.1358184814 - 1.8822140694 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.7848576307 - 1.8822140694 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.7848598957 - 2.2716398239 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.1358184814 - 2.5312533379 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.065656 - 0.247404 - 1.000000 - - - - - 0.1622599959 - -0.3245199919 - - - - - - - - - - - - - - - - - - - - - 1.1358199120 - 2.9206800461 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.1742811203 - 2.4014453888 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.1742811203 - 1.8822140694 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 2.8233203888 - 1.8822140694 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.9795694351 - 1.1033670902 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.1358184814 - 1.8822140694 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.7848576307 - 1.8822140694 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.7848598957 - 2.2716398239 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.1358184814 - 2.5312533379 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/synfig-studio/images/scale_icon.sif b/synfig-studio/images/scale_icon.sif deleted file mode 100644 index cd3c687..0000000 --- a/synfig-studio/images/scale_icon.sif +++ /dev/null @@ -1,3494 +0,0 @@ - - - Synfig Studio Scale Icon - Placed in the Public Domain in 2007 by Chris Norman (pixelgeek) - - - - - - - - - - - - - - - - - - - -0.6717824340 - 8.4043684006 - - - - - -0.4427109957 - -1.6098945141 - - - - - - 0.064115 - 0.064115 - 0.064115 - 1.000000 - - - 1.000000 - 1.000000 - 1.000000 - 0.000000 - - - - - - - - - - - - - - -1.1483865976 - 1.7675857544 - - - - - 2.6703450680 - -2.1673052311 - - - - - -1.6225999594 - -2.2716398239 - - - - - 2.7584199905 - -2.2716398239 - - - - - 3.4074599743 - -3.0829398632 - - - - - -1.1358199120 - -3.0829398632 - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - -1.8173098564 - -2.5961568356 - - - - - 3.1153881550 - 1.5576940775 - - - - - - - - - - - - - - - - - - - - - - 1.000000 - 1.000000 - 1.000000 - 1.000000 - - - - - -1.5576940775 - -2.3365411758 - - - - - 2.8557724953 - 1.2980784178 - - - - - - - - - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - 1.000000 - 1.000000 - 1.000000 - 1.000000 - - - - - -1.2980784178 - -2.0769255161 - - - - - 2.5961568356 - 1.0384627581 - - - - - - - - - - - - - - - - - - - - - - -1.7848600149 - 1.9471199512 - - - - - 2.9206800461 - -4.0564999580 - - - - - - 0.028991 - 0.133209 - 0.374624 - 1.000000 - - - 1.000000 - 1.000000 - 1.000000 - 1.000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - -3.1153881550 - 0.2596156895 - - - - - 0.0000000000 - 2.8557724953 - - - - - - - - - - - - - - - - - - - - - - 1.000000 - 1.000000 - 1.000000 - 1.000000 - - - - - -2.8557724953 - 0.5192313790 - - - - - -0.2596156895 - 2.5961568356 - - - - - - - - - - - - - - - - - - - - - - -1.7848598957 - 1.9471199512 - - - - - - - - - - - - - - - - - 1.000000 - 1.000000 - 1.000000 - 1.000000 - - - - - -0.8112969995 - -1.1682728529 - - - - - 1.2656285763 - 0.3894212246 - - - - - - - - - - - - - - - - - - - - - - -1.7848600149 - 1.9471199512 - - - - - 2.9206800461 - -4.0564999580 - - - - - - 0.028991 - 0.133209 - 0.374624 - 1.000000 - - - 1.000000 - 1.000000 - 1.000000 - 1.000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -2.2769572735 - -1.7023979425 - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 1.9471199512 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.2716398239 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - -1.9471199512 - 1.9471199512 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 1.9471199512 - 0.6490399837 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.2716398239 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - -1.9471199512 - 1.9471199512 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 1.9471199512 - 1.2980799675 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.2716398239 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - -1.9471199512 - 1.9471199512 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 1.9471199512 - -0.6490399837 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.2716398239 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - -1.9471199512 - 1.9471199512 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.9788787961 - -1.5747181177 - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 1.9471199512 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.2716398239 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - -1.9471199512 - 1.9471199512 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 1.9471199512 - 0.6490399837 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.2716398239 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - -1.9471199512 - 1.9471199512 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 1.9471199512 - 1.2980799675 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.2716398239 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - -1.9471199512 - 1.9471199512 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 1.9471199512 - -0.6490399837 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.2716398239 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - -1.9471199512 - 1.9471199512 - - - - - - - - - - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -0.0957598835 - -2.7983164787 - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 2.2716398239 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1.6225999594 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 1.7848598957 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1.6225999594 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 1.2980799675 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1.6225999594 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 0.8112999797 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1.6225999594 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 0.3245199919 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1.6225999594 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - -0.1622599959 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1.6225999594 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.0286085363 - 0.0443108305 - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 2.2716398239 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1.6225999594 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 1.7848598957 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1.6225999594 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 1.2980799675 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1.6225999594 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 0.8112999797 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1.6225999594 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 0.3245199919 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1.6225999594 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - -0.1622599959 - 0.0000000000 - - - - - - - - - - - - - - - - - - - - - -1.9471199512 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -1.6225999594 - 2.1093800068 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0.011238 - 0.064115 - 0.247404 - 1.000000 - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - -1.7130378485 - 2.0215976238 - - - - - -2.0641574860 - 1.6385580301 - - - - - 0.7235190868 - -0.7979990244 - - - - - -0.0033114245 - -1.5410472155 - - - - - 1.8586863279 - -1.5304071903 - - - - - 1.8513576984 - 0.3191995919 - - - - - 1.0852786303 - -0.4468794465 - - - - - - - - - - - - - - - - - - 1.000000 - 1.000000 - 1.000000 - 1.000000 - - - - - 0.0000000000 - 0.0000000000 - - - - - - - - - - - - - - - - - - - -1.7236778736 - 1.7875177860 - - - - - -1.8407176733 - 1.6704779863 - - - - - 0.9682388306 - -0.7979990244 - - - - - 0.4222880602 - -1.3601673841 - - - - - 1.6990864277 - -1.3601673841 - - - - - 1.6704779863 - -0.1063998714 - - - - - 1.1065586805 - -0.6703191996 - - - - - - diff --git a/synfig-studio/images/transform_icon.sif b/synfig-studio/images/transform_icon.sif new file mode 100644 index 0000000..7fab72e --- /dev/null +++ b/synfig-studio/images/transform_icon.sif @@ -0,0 +1,2393 @@ + + + Synfig Studio Rotate Icon + Placed in the Public Domain in 2007 by Chris Norman (pixelgeek) + + + + + + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + 0.300000 + 0.300000 + 0.300000 + 1.000000 + + + 1.000000 + 1.000000 + 1.000000 + 0.000000 + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + -2.5961599350 + 2.5961599350 + + + + + 2.6703450680 + -2.1673052311 + + + + + -3.2451999187 + 0.8112999797 + + + + + 1.7848598957 + 0.8112999797 + + + + + 2.2716398239 + -0.3245199919 + + + + + -2.9206800461 + -0.3245199919 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + + 0.300000 + 0.300000 + 0.300000 + 1.000000 + + + 1.000000 + 1.000000 + 1.000000 + 0.000000 + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + -2.5961599350 + 2.5961599350 + + + + + 2.6703450680 + -2.1673052311 + + + + + -2.2716398239 + -1.4603400230 + + + + + 2.7584199905 + -1.4603400230 + + + + + 3.2451999187 + -2.5961599350 + + + + + -1.9471199512 + -2.5961599350 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.4867799878 + 0.0000000000 + + + + + + + + + + + + + + + + + 0.011238 + 0.065656 + 0.247059 + 1.000000 + + + + + -3.3425526619 + 0.0000000000 + + + + + 0.5516827703 + 3.1153881550 + + + + + + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + -3.0829367638 + 0.2596156895 + + + + + 0.2920670807 + 2.8557724953 + + + + + + + + + + + + + + + + + + + + + + -1.7848598957 + 1.9471199512 + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + -1.0384613276 + -1.4278886318 + + + + + 1.8173112869 + 0.6490369439 + + + + + + + + + + + + + + + + + + + + + + -1.7848600149 + 1.9471199512 + + + + + 2.9206800461 + -4.0564999580 + + + + + + 0.028991 + 0.133209 + 0.374624 + 1.000000 + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + 0.011238 + 0.065656 + 0.247059 + 1.000000 + + + + + -1.1146180630 + -2.0209679604 + + + + + 2.5569021702 + 0.9162484407 + + + + + + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + -0.8734864593 + -1.7986452579 + + + + + 2.3052372932 + 0.6841450930 + + + + + + + + + + + + + + + + + + + + + + 0.1622599959 + -0.3245199919 + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + -0.8288472295 + -1.2672259808 + + + + + 1.9548872709 + 0.7829568982 + + + + + + + + + + + + + + + + + + + + + + 2.0723481178 + -2.8204009533 + + + + + -2.8938808441 + 3.8485348225 + + + + + + 0.028991 + 0.133209 + 0.374624 + 1.000000 + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + + + + + + + + + + + + + + + + + 0.9735599756 + -0.1622599959 + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + -4.0240430832 + -2.9855804443 + + + + + + + + + + + + + + + + + + + + + 2.7908737659 + 0.8437545300 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7524110079 + 1.4927937984 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7524110079 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.1033717394 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.9471199512 + 2.7584199905 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.7908737659 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1418344975 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1418344975 + 1.6226016283 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.7908737659 + 1.2331780195 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.303279 + 0.295082 + 0.303279 + 0.333333 + + + + + -0.1894220859 + -0.1675494760 + + + + + 0.1000007167 + 0.1000007167 + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.065656 + 0.247059 + 1.000000 + + + + + -4.0240430832 + -2.9855804443 + + + + + + + + + + + + + + + + + + + + + 2.7908737659 + 0.8437545300 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7524110079 + 1.4927937984 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7524110079 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.1033717394 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.9471199512 + 2.7584199905 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.7908737659 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1418344975 + 1.8822172880 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1418344975 + 1.6226016283 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.7908737659 + 1.2331780195 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.0000000000 + 0.0000000000 + + + + + + + + + + + + + + + + + 1.000000 + 1.000000 + 1.000000 + 1.000000 + + + + + 0.1622599959 + -0.3245199919 + + + + + + + + + + + + + + + + + + + + + 1.1358199120 + 2.9206800461 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1742811203 + 2.4014453888 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1742811203 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.8233203888 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.9795694351 + 1.1033670902 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.1358184814 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7848576307 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7848598957 + 2.2716398239 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.1358184814 + 2.5312533379 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0.011238 + 0.065656 + 0.247404 + 1.000000 + + + + + 0.1622599959 + -0.3245199919 + + + + + + + + + + + + + + + + + + + + + 1.1358199120 + 2.9206800461 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1742811203 + 2.4014453888 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.1742811203 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2.8233203888 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.9795694351 + 1.1033670902 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.1358184814 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7848576307 + 1.8822140694 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.7848598957 + 2.2716398239 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.1358184814 + 2.5312533379 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/synfig-studio/src/gtkmm/Makefile.am b/synfig-studio/src/gtkmm/Makefile.am index c5cc73d..bd52099 100644 --- a/synfig-studio/src/gtkmm/Makefile.am +++ b/synfig-studio/src/gtkmm/Makefile.am @@ -172,13 +172,12 @@ STATE_HH = \ state_normal.h \ state_polygon.h \ state_rectangle.h \ - state_rotate.h \ - state_scale.h \ state_sketch.h \ state_smoothmove.h \ state_star.h \ state_stroke.h \ state_text.h \ + state_transform.h \ state_width.h \ state_zoom.h @@ -192,13 +191,12 @@ STATE_CC = \ state_normal.cpp \ state_polygon.cpp \ state_rectangle.cpp \ - state_rotate.cpp \ - state_scale.cpp \ state_sketch.cpp \ state_smoothmove.cpp \ state_star.cpp \ state_stroke.cpp \ state_text.cpp \ + state_transform.cpp \ state_width.cpp \ state_zoom.cpp diff --git a/synfig-studio/src/gtkmm/app.cpp b/synfig-studio/src/gtkmm/app.cpp index 06671f9..2485f81 100644 --- a/synfig-studio/src/gtkmm/app.cpp +++ b/synfig-studio/src/gtkmm/app.cpp @@ -89,11 +89,10 @@ #include "state_circle.h" #include "state_rectangle.h" #include "state_smoothmove.h" -#include "state_scale.h" #include "state_star.h" #include "state_text.h" #include "state_width.h" -#include "state_rotate.h" +#include "state_transform.h" #include "state_zoom.h" #include "devicetracker.h" @@ -1292,30 +1291,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_transform); 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_bline); 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); + 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(); diff --git a/synfig-studio/src/gtkmm/iconcontroller.cpp b/synfig-studio/src/gtkmm/iconcontroller.cpp index c133dff..9d62cb6 100644 --- a/synfig-studio/src/gtkmm/iconcontroller.cpp +++ b/synfig-studio/src/gtkmm/iconcontroller.cpp @@ -220,6 +220,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 +230,7 @@ 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(width,"width_icon."IMAGE_EXT,_("Width Tool")); - INIT_STOCK_ICON(rotate,"rotate_icon."IMAGE_EXT,_("Rotate 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/state_rotate.cpp b/synfig-studio/src/gtkmm/state_rotate.cpp deleted file mode 100644 index 1635500..0000000 --- a/synfig-studio/src/gtkmm/state_rotate.cpp +++ /dev/null @@ -1,387 +0,0 @@ -/* === S Y N F I G ========================================================= */ -/*! \file state_rotate.cpp -** \brief Template File -** -** $Id$ -** -** \legal -** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley -** Copyright (c) 2008 Chris Moore -** -** This package is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License as -** published by the Free Software Foundation; either version 2 of -** the License, or (at your option) any later version. -** -** This package is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** General Public License for more details. -** \endlegal -*/ -/* ========================================================================= */ - -/* === H E A D E R S ======================================================= */ - -#ifdef USING_PCH -# include "pch.h" -#else -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include - -#include -#include - -#include "state_rotate.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 "duck.h" -#include -#include - -#include "general.h" - -#endif - -/* === U S I N G =========================================================== */ - -using namespace std; -using namespace etl; -using namespace synfig; -using namespace studio; - -/* === M A C R O S ========================================================= */ - -#ifndef EPSILON -#define EPSILON 0.0000001 -#endif - -/* === G L O B A L S ======================================================= */ - -StateRotate studio::state_rotate; - -/* === C L A S S E S & S T R U C T S ======================================= */ - -class DuckDrag_Rotate : public DuckDrag_Base -{ - - synfig::Vector last_rotate; - synfig::Vector drag_offset; - synfig::Vector center; - synfig::Vector snap; - - Angle original_angle; - Real original_mag; - - std::vector positions; - - - bool bad_drag; - bool move_only; - -public: - etl::handle canvas_view_; - bool use_magnitude; - DuckDrag_Rotate(); - 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); - - etl::handle get_canvas_interface()const{return canvas_view_->canvas_interface();} -}; - - -class studio::StateRotate_Context : public sigc::trackable -{ - etl::handle canvas_view_; - - synfigapp::Settings& settings; - - etl::handle duck_dragger_; - - Gtk::Table options_table; - - Gtk::CheckButton checkbutton_scale; - -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_refresh_tool_options(const Smach::event& x); - - void refresh_tool_options(); - - void refresh_scale_flag() { if(duck_dragger_)duck_dragger_->use_magnitude=get_scale_flag(); } - - StateRotate_Context(CanvasView* canvas_view); - - ~StateRotate_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(); -}; // END of class StateRotate_Context - -/* === M E T H O D S ======================================================= */ - -StateRotate::StateRotate(): - Smach::state("rotate") -{ - insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateRotate_Context::event_refresh_tool_options)); -} - -StateRotate::~StateRotate() -{ -} - -void -StateRotate_Context::load_settings() -{ - String value; - - if(settings.get_value("rotate.scale",value) && value=="0") - set_scale_flag(false); - else - set_scale_flag(true); -} - -void -StateRotate_Context::save_settings() -{ - settings.set_value("rotate.scale",get_scale_flag()?"1":"0"); -} - -StateRotate_Context::StateRotate_Context(CanvasView* canvas_view): - canvas_view_(canvas_view), - settings(synfigapp::Main::get_selected_input_device()->settings()), - duck_dragger_(new DuckDrag_Rotate()), - checkbutton_scale(_("Allow Scale")) -{ - duck_dragger_->canvas_view_=get_canvas_view(); - - // Set up the tool options dialog - options_table.attach(*manage(new Gtk::Label(_("Rotate Tool"))), 0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(checkbutton_scale, 0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - - checkbutton_scale.signal_toggled().connect(sigc::mem_fun(*this,&StateRotate_Context::refresh_scale_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_); - -// get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR); - get_canvas_view()->work_area->reset_cursor(); - - App::toolbox->refresh(); - - load_settings(); - refresh_scale_flag(); -} - -void -StateRotate_Context::refresh_tool_options() -{ - App::dialog_tool_options->clear(); - App::dialog_tool_options->set_widget(options_table); - App::dialog_tool_options->set_local_name(_("Rotate Tool")); - App::dialog_tool_options->set_name("rotate"); -} - -Smach::event_result -StateRotate_Context::event_refresh_tool_options(const Smach::event& /*x*/) -{ - refresh_tool_options(); - return Smach::RESULT_ACCEPT; -} - -StateRotate_Context::~StateRotate_Context() -{ - save_settings(); - - get_work_area()->clear_duck_dragger(); - get_canvas_view()->work_area->reset_cursor(); - - App::dialog_tool_options->clear(); - - App::toolbox->refresh(); -} - - - - -DuckDrag_Rotate::DuckDrag_Rotate() -{ - use_magnitude=true; -} - -void -DuckDrag_Rotate::begin_duck_drag(Duckmatic* duckmatic, const synfig::Vector& offset) -{ - last_rotate=Vector(1,1); - - const DuckList selected_ducks(duckmatic->get_selected_ducks()); - DuckList::const_iterator iter; - -/* - if(duckmatic->get_selected_ducks().size()<2) - { - bad_drag=true; - return; - } -*/ - 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_Rotate::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector) -{ - if(bad_drag) - return; - - //std::set >::iterator iter; - synfig::Vector vect(duckmatic->snap_point_to_grid(vector)-center+snap); - - const DuckList selected_ducks(duckmatic->get_selected_ducks()); - DuckList::const_iterator iter; - - if(move_only) - { - int i; - 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]); - - p[0]+=vect[0]; - p[1]+=vect[1]; - (*iter)->set_trans_point(p); - } - 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]); - - p[0]+=vect[0]; - p[1]+=vect[1]; - (*iter)->set_trans_point(p); - } - return; - } - - Angle::tan angle(vect[1],vect[0]); - angle=original_angle-angle; - Real mag(vect.mag()/original_mag); - Real sine(Angle::sin(angle).get()); - Real cosine(Angle::cos(angle).get()); - - int i; - 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(use_magnitude)p*=mag; - p+=center; - (*iter)->set_trans_point(p); - } - 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(use_magnitude)p*=mag; - p+=center; - (*iter)->set_trans_point(p); - } - - last_rotate=vect; - //snap=Vector(0,0); -} - -bool -DuckDrag_Rotate::end_duck_drag(Duckmatic* duckmatic) -{ - if(bad_drag)return false; - if(move_only) - { - synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Move Duck")); - duckmatic->signal_edited_selected_ducks(); - return true; - } - - synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Rotate Ducks")); - - if((last_rotate-Vector(1,1)).mag()>0.0001) - { - duckmatic->signal_edited_selected_ducks(); - return true; - } - else - { - duckmatic->signal_user_click_selected_ducks(0); - return false; - } -} diff --git a/synfig-studio/src/gtkmm/state_rotate.h b/synfig-studio/src/gtkmm/state_rotate.h deleted file mode 100644 index e2caafe..0000000 --- a/synfig-studio/src/gtkmm/state_rotate.h +++ /dev/null @@ -1,56 +0,0 @@ -/* === S Y N F I G ========================================================= */ -/*! \file state_rotate.h -** \brief Template Header -** -** $Id$ -** -** \legal -** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley -** -** This package is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License as -** published by the Free Software Foundation; either version 2 of -** the License, or (at your option) any later version. -** -** This package is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** General Public License for more details. -** \endlegal -*/ -/* ========================================================================= */ - -/* === S T A R T =========================================================== */ - -#ifndef __SYNFIG_STUDIO_STATE_ROTATE_H -#define __SYNFIG_STUDIO_STATE_ROTATE_H - -/* === H E A D E R S ======================================================= */ - -#include "smach.h" - - -/* === M A C R O S ========================================================= */ - -/* === T Y P E D E F S ===================================================== */ - -/* === C L A S S E S & S T R U C T S ======================================= */ - -namespace studio { - -class StateRotate_Context; - -class StateRotate : public Smach::state -{ -public: - StateRotate(); - ~StateRotate(); -}; // END of class StateRotate - -extern StateRotate state_rotate; - -}; // END of namespace studio - -/* === E N D =============================================================== */ - -#endif diff --git a/synfig-studio/src/gtkmm/state_scale.cpp b/synfig-studio/src/gtkmm/state_scale.cpp deleted file mode 100644 index 300ff4b..0000000 --- a/synfig-studio/src/gtkmm/state_scale.cpp +++ /dev/null @@ -1,377 +0,0 @@ -/* === S Y N F I G ========================================================= */ -/*! \file state_scale.cpp -** \brief Template File -** -** $Id$ -** -** \legal -** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley -** Copyright (c) 2008 Chris Moore -** -** This package is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License as -** published by the Free Software Foundation; either version 2 of -** the License, or (at your option) any later version. -** -** This package is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** General Public License for more details. -** \endlegal -*/ -/* ========================================================================= */ - -/* === H E A D E R S ======================================================= */ - -#ifdef USING_PCH -# include "pch.h" -#else -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include - -#include -#include - -#include "state_scale.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 "duck.h" -#include - -#include "general.h" - -#endif - -/* === U S I N G =========================================================== */ - -using namespace std; -using namespace etl; -using namespace synfig; -using namespace studio; - -/* === M A C R O S ========================================================= */ - -/* === G L O B A L S ======================================================= */ - -StateScale studio::state_scale; - -/* === C L A S S E S & S T R U C T S ======================================= */ - -class DuckDrag_Scale : public DuckDrag_Base -{ - - synfig::Vector last_scale; - synfig::Vector drag_offset; - synfig::Vector center; - synfig::Vector snap; - - std::vector positions; - - bool move_only; - - bool bad_drag; -public: - bool lock_aspect; - DuckDrag_Scale(); - 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); -}; - - -class studio::StateScale_Context : public sigc::trackable -{ - etl::handle canvas_view_; - - synfigapp::Settings& settings; - - etl::handle duck_dragger_; - - Gtk::Table options_table; - - - Gtk::CheckButton checkbutton_aspect_lock; - -public: - - bool get_aspect_lock_flag()const { return checkbutton_aspect_lock.get_active(); } - void set_aspect_lock_flag(bool x) { return checkbutton_aspect_lock.set_active(x); refresh_aspect_lock_flag(); } - - void refresh_aspect_lock_flag() { if(duck_dragger_)duck_dragger_->lock_aspect=get_aspect_lock_flag(); } - - Smach::event_result event_refresh_tool_options(const Smach::event& x); - - void refresh_tool_options(); - - StateScale_Context(CanvasView* canvas_view); - - ~StateScale_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(); -}; // END of class StateScale_Context - -/* === M E T H O D S ======================================================= */ - -StateScale::StateScale(): - Smach::state("scale") -{ - insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateScale_Context::event_refresh_tool_options)); -} - -StateScale::~StateScale() -{ -} - -void -StateScale_Context::load_settings() -{ - String value; - - if(settings.get_value("scale.lock_aspect",value) && value=="0") - set_aspect_lock_flag(false); - else - set_aspect_lock_flag(true); -} - -void -StateScale_Context::save_settings() -{ - settings.set_value("scale.lock_aspect",get_aspect_lock_flag()?"1":"0"); -} - -StateScale_Context::StateScale_Context(CanvasView* canvas_view): - canvas_view_(canvas_view), - settings(synfigapp::Main::get_selected_input_device()->settings()), - duck_dragger_(new DuckDrag_Scale()), - checkbutton_aspect_lock(_("Lock Aspect Ratio")) -{ - // Set up the tool options dialog - options_table.attach(*manage(new Gtk::Label(_("Scale Tool"))), 0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - options_table.attach(checkbutton_aspect_lock, 0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - - checkbutton_aspect_lock.signal_toggled().connect(sigc::mem_fun(*this,&StateScale_Context::refresh_aspect_lock_flag)); - - options_table.show_all(); - refresh_tool_options(); - App::dialog_tool_options->present(); - - 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(); - - App::toolbox->refresh(); - - set_aspect_lock_flag(true); - load_settings(); -} - -void -StateScale_Context::refresh_tool_options() -{ - App::dialog_tool_options->clear(); - App::dialog_tool_options->set_widget(options_table); - App::dialog_tool_options->set_local_name(_("Scale Tool")); - App::dialog_tool_options->set_name("scale"); -} - -Smach::event_result -StateScale_Context::event_refresh_tool_options(const Smach::event& /*x*/) -{ - refresh_tool_options(); - return Smach::RESULT_ACCEPT; -} - -StateScale_Context::~StateScale_Context() -{ - save_settings(); - - get_work_area()->clear_duck_dragger(); - get_canvas_view()->work_area->reset_cursor(); - - App::dialog_tool_options->clear(); - - App::toolbox->refresh(); -} - - - - -DuckDrag_Scale::DuckDrag_Scale(): - lock_aspect(true) -{ -} - -#ifndef EPSILON -#define EPSILON 0.0000001 -#endif - -void -DuckDrag_Scale::begin_duck_drag(Duckmatic* duckmatic, const synfig::Vector& offset) -{ - last_scale=Vector(1,1); - const DuckList selected_ducks(duckmatic->get_selected_ducks()); - DuckList::const_iterator iter; - - //if(duckmatic->get_selected_ducks().size()<2) - //{ - // bad_drag=true; -// return; -// } - 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); - } - if((vmin-vmax).mag()<=EPSILON) - move_only=true; - else - move_only=false; - - center=(vmin+vmax)*0.5; -} - - -void -DuckDrag_Scale::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector) -{ - const DuckList selected_ducks(duckmatic->get_selected_ducks()); - DuckList::const_iterator iter; - - if(bad_drag) - return; - - //std::set >::iterator iter; - synfig::Vector vect(duckmatic->snap_point_to_grid(vector)-center); - last_scale=vect; - - if(move_only) - { - int i; - 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]); - - p[0]+=vect[0]; - p[1]+=vect[1]; - (*iter)->set_trans_point(p); - } - 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]); - - p[0]+=vect[0]; - p[1]+=vect[1]; - (*iter)->set_trans_point(p); - } - return; - } - - if(!lock_aspect) - { - 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; - - int i; - 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); - } - 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); - } - - last_scale=vect; - //snap=Vector(0,0); -} - -bool -DuckDrag_Scale::end_duck_drag(Duckmatic* duckmatic) -{ - if(bad_drag)return false; - - if((last_scale-Vector(1,1)).mag()>0.0001) - { - duckmatic->signal_edited_selected_ducks(); - return true; - } - else - { - duckmatic->signal_user_click_selected_ducks(0); - return false; - } -} diff --git a/synfig-studio/src/gtkmm/state_scale.h b/synfig-studio/src/gtkmm/state_scale.h deleted file mode 100644 index f351c12..0000000 --- a/synfig-studio/src/gtkmm/state_scale.h +++ /dev/null @@ -1,55 +0,0 @@ -/* === S Y N F I G ========================================================= */ -/*! \file state_scale.h -** \brief Template Header -** -** $Id$ -** -** \legal -** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley -** -** This package is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License as -** published by the Free Software Foundation; either version 2 of -** the License, or (at your option) any later version. -** -** This package is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -** General Public License for more details. -** \endlegal -*/ -/* ========================================================================= */ - -/* === S T A R T =========================================================== */ - -#ifndef __SYNFIG_STUDIO_STATE_SCALE_H -#define __SYNFIG_STUDIO_STATE_SCALE_H - -/* === H E A D E R S ======================================================= */ - -#include "smach.h" - -/* === M A C R O S ========================================================= */ - -/* === T Y P E D E F S ===================================================== */ - -/* === C L A S S E S & S T R U C T S ======================================= */ - -namespace studio { - -class StateScale_Context; - -class StateScale : public Smach::state -{ -public: - StateScale(); - ~StateScale(); -}; // END of class StateScale - -extern StateScale state_scale; - -}; // END of namespace studio - -/* === E N D =============================================================== */ - -#endif diff --git a/synfig-studio/src/gtkmm/state_transform.cpp b/synfig-studio/src/gtkmm/state_transform.cpp new file mode 100644 index 0000000..64a1efa --- /dev/null +++ b/synfig-studio/src/gtkmm/state_transform.cpp @@ -0,0 +1,816 @@ +/* === S Y N F I G ========================================================= */ +/*! \file state_transform.cpp +** \brief Template File +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2008 Chris Moore +** +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. +** +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** \endlegal +*/ +/* ========================================================================= */ + +/* === H E A D E R S ======================================================= */ + +#ifdef USING_PCH +# include "pch.h" +#else +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include +#include +#include +#include +#include + +#include "state_transform.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 "duck.h" +#include +#include + +#include "general.h" +#endif + +/* === U S I N G =========================================================== */ + +using namespace std; +using namespace etl; +using namespace synfig; +using namespace studio; + +/* === M A C R O S ========================================================= */ + +#ifndef EPSILON +#define EPSILON 0.0000001 +#endif + +/* === G L O B A L S ======================================================= */ + +StateTransform studio::state_transform; + +/* === C L A S S E S & S T R U C T S ======================================= */ + +class DuckDrag_Combo : public DuckDrag_Base +{ + 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; + + + bool bad_drag; + bool move_only; + +public: + 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); + + etl::handle get_canvas_interface()const{return canvas_view_->canvas_interface();} +}; + + +class studio::StateTransform_Context : public sigc::trackable +{ + etl::handle canvas_view_; + + synfigapp::Settings& settings; + + sigc::connection keypress_connect; + sigc::connection keyrelease_connect; + + etl::handle duck_dragger_; + + Gtk::Table options_table; + + Gtk::CheckButton checkbutton_rotate; + Gtk::CheckButton checkbutton_scale; + Gtk::CheckButton checkbutton_constrain; + +public: + + 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(); } + + 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(); } + + 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(); } + + 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); + Smach::event_result event_layer_click(const Smach::event& x); + + void refresh_tool_options(); + + StateTransform_Context(CanvasView* canvas_view); + + ~StateTransform_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); + +}; // END of class StateTransform_Context + +/* === M E T H O D S ======================================================= */ + +StateTransform::StateTransform(): + Smach::state("transform") +{ + insert(event_def(EVENT_STOP,&StateTransform_Context::event_stop_handler)); + insert(event_def(EVENT_REFRESH,&StateTransform_Context::event_refresh_handler)); + insert(event_def(EVENT_REFRESH_DUCKS,&StateTransform_Context::event_refresh_ducks_handler)); + insert(event_def(EVENT_UNDO,&StateTransform_Context::event_undo_handler)); + insert(event_def(EVENT_REDO,&StateTransform_Context::event_redo_handler)); + insert(event_def(EVENT_WORKAREA_MOUSE_BUTTON_DOWN,&StateTransform_Context::event_mouse_button_down_handler)); + insert(event_def(EVENT_WORKAREA_MULTIPLE_DUCKS_CLICKED,&StateTransform_Context::event_multiple_ducks_clicked_handler)); + insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateTransform_Context::event_refresh_tool_options)); + insert(event_def(EVENT_WORKAREA_LAYER_CLICKED,&StateTransform_Context::event_layer_click)); +} + +StateTransform::~StateTransform() +{ +} + +void +StateTransform_Context::load_settings() +{ + String value; + + if(settings.get_value("transform.rotate",value) && value=="1") + set_rotate_flag(true); + else + set_rotate_flag(false); + + if(settings.get_value("transform.scale",value) && value=="1") + set_scale_flag(true); + else + set_scale_flag(false); + + if(settings.get_value("transform.constrain",value) && value=="1") + set_constrain_flag(true); + else + set_constrain_flag(false); + +} + +void +StateTransform_Context::save_settings() +{ + settings.set_value("transform.rotate",get_rotate_flag()?"1":"0"); + settings.set_value("transform.scale",get_scale_flag()?"1":"0"); + settings.set_value("transform.constrain",get_constrain_flag()?"1":"0"); +} + +StateTransform_Context::StateTransform_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(_("Transform 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,&StateTransform_Context::refresh_rotate_flag)); + checkbutton_scale.signal_toggled().connect(sigc::mem_fun(*this,&StateTransform_Context::refresh_scale_flag)); + checkbutton_constrain.signal_toggled().connect(sigc::mem_fun(*this,&StateTransform_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,&StateTransform_Context::key_pressed),false); + keyrelease_connect=get_work_area()->signal_key_release_event().connect(sigc::mem_fun(*this,&StateTransform_Context::key_released),false); + +// get_canvas_view()->work_area->set_cursor(Gdk::CROSSHAIR); + get_canvas_view()->work_area->reset_cursor(); + + App::toolbox->refresh(); + + load_settings(); + refresh_scale_flag(); +} + +bool +StateTransform_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 +StateTransform_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 +StateTransform_Context::refresh_tool_options() +{ + App::dialog_tool_options->clear(); + App::dialog_tool_options->set_widget(options_table); + App::dialog_tool_options->set_local_name(_("Transform Tool")); + App::dialog_tool_options->set_name("transform"); +} + + + +StateTransform_Context::~StateTransform_Context() +{ + save_settings(); + + get_work_area()->clear_duck_dragger(); + get_canvas_view()->work_area->reset_cursor(); + + keypress_connect.disconnect(); + keyrelease_connect.disconnect(); + + App::dialog_tool_options->clear(); + + App::toolbox->refresh(); +} + + +Smach::event_result +StateTransform_Context::event_refresh_tool_options(const Smach::event& /*x*/) +{ + refresh_tool_options(); + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateTransform_Context::event_stop_handler(const Smach::event& /*x*/) +{ + // synfig::info("STATE TRANSFORM: Received Stop Event"); + canvas_view_->stop(); + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateTransform_Context::event_refresh_handler(const Smach::event& /*x*/) +{ + // synfig::info("STATE TRANSFORM: Received Refresh Event"); + canvas_view_->rebuild_tables(); + canvas_view_->work_area->queue_render_preview(); + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateTransform_Context::event_refresh_ducks_handler(const Smach::event& /*x*/) +{ + // synfig::info("STATE TRANSFORM: Received Refresh Ducks"); + canvas_view_->queue_rebuild_ducks(); + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateTransform_Context::event_undo_handler(const Smach::event& /*x*/) +{ + // synfig::info("STATE TRANSFORM: Received Undo Event"); + canvas_view_->get_instance()->undo(); + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateTransform_Context::event_redo_handler(const Smach::event& /*x*/) +{ + // synfig::info("STATE TRANSFORM: Received Redo Event"); + canvas_view_->get_instance()->redo(); + return Smach::RESULT_ACCEPT; +} + +Smach::event_result +StateTransform_Context::event_mouse_button_down_handler(const Smach::event& x) +{ + // synfig::info("STATE TRANSFORM: Received mouse button down Event"); + + const EventMouse& event(*reinterpret_cast(&x)); + + switch(event.button) + { + case BUTTON_RIGHT: + canvas_view_->popup_main_menu(); + return Smach::RESULT_ACCEPT; + default: + return Smach::RESULT_OK; + } +} + +Smach::event_result +StateTransform_Context::event_layer_click(const Smach::event& x) +{ + const EventLayerClick& event(*reinterpret_cast(&x)); + + if(event.layer) + { + // synfig::info("STATE TRANSFORM: Received layer click Event, \"%s\"",event.layer->get_name().c_str()); + } + else + { + // synfig::info("STATE TRANSFORM: Received layer click Event with an empty layer."); + } + + switch(event.button) + { + case BUTTON_LEFT: + if(!(event.modifier&Gdk::CONTROL_MASK)) + canvas_view_->get_selection_manager()->clear_selected_layers(); + if(event.layer) + { + 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); + } + else + { + canvas_view_->get_selection_manager()->set_selected_layer(event.layer); + } + } + return Smach::RESULT_ACCEPT; + case BUTTON_RIGHT: + canvas_view_->popup_layer_menu(event.layer); + return Smach::RESULT_ACCEPT; + default: + return Smach::RESULT_OK; + } +} + +/* +void +StateTransform_Context::edit_several_waypoints(std::list value_desc_list) +{ + Gtk::Dialog dialog( + "Edit Multiple Waypoints", // Title + true, // Modal + true // use_separator + ); + + Widget_WaypointModel widget_waypoint_model; + widget_waypoint_model.show(); + + dialog.get_vbox()->pack_start(widget_waypoint_model); + + + dialog.add_button(Gtk::StockID("gtk-apply"),1); + dialog.add_button(Gtk::StockID("gtk-cancel"),0); + dialog.show(); + + if(dialog.run()==0) + return; + synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Set Waypoints")); + + std::list::iterator iter; + for(iter=value_desc_list.begin();iter!=value_desc_list.end();++iter) + { + synfigapp::ValueDesc value_desc(*iter); + + if(!value_desc.is_valid()) + continue; + + ValueNode_Animated::Handle value_node; + + // If this value isn't a ValueNode_Animated, but + // it is somewhat constant, then go ahead and convert + // it to a ValueNode_Animated. + if(!value_desc.is_value_node() || ValueNode_Const::Handle::cast_dynamic(value_desc.get_value_node())) + { + ValueBase value; + if(value_desc.is_value_node()) + value=ValueNode_Const::Handle::cast_dynamic(value_desc.get_value_node())->get_value(); + else + value=value_desc.get_value(); + + value_node=ValueNode_Animated::create(value,get_canvas()->get_time()); + + synfigapp::Action::Handle action; + + if(!value_desc.is_value_node()) + { + action=synfigapp::Action::create("ValueDescConnect"); + action->set_param("dest",value_desc); + action->set_param("src",ValueNode::Handle(value_node)); + } + else + { + action=synfigapp::Action::create("ValueNodeReplace"); + action->set_param("dest",value_desc.get_value_node()); + action->set_param("src",ValueNode::Handle(value_node)); + } + + action->set_param("canvas",get_canvas()); + action->set_param("canvas_interface",get_canvas_interface()); + + + if(!get_canvas_interface()->get_instance()->perform_action(action)) + { + get_canvas_view()->get_ui_interface()->error(_("Unable to convert to animated waypoint")); + group.cancel(); + return; + } + } + else + { + if(value_desc.is_value_node()) + value_node=ValueNode_Animated::Handle::cast_dynamic(value_desc.get_value_node()); + } + + + if(value_node) + { + + synfigapp::Action::Handle action(synfigapp::Action::create("WaypointSetSmart")); + + if(!action) + { + get_canvas_view()->get_ui_interface()->error(_("Unable to find WaypointSetSmart action")); + group.cancel(); + return; + } + + + action->set_param("canvas",get_canvas()); + action->set_param("canvas_interface",get_canvas_interface()); + action->set_param("value_node",ValueNode::Handle(value_node)); + action->set_param("time",get_canvas()->get_time()); + action->set_param("model",widget_waypoint_model.get_waypoint_model()); + + if(!get_canvas_interface()->get_instance()->perform_action(action)) + { + get_canvas_view()->get_ui_interface()->error(_("Unable to set a specific waypoint")); + group.cancel(); + return; + } + } + else + { + //get_canvas_view()->get_ui_interface()->error(_("Unable to animate a specific valuedesc")); + //group.cancel(); + //return; + } + + } +} +*/ + +Smach::event_result +StateTransform_Context::event_multiple_ducks_clicked_handler(const Smach::event& /*x*/) +{ + // synfig::info("STATE TRANSFORM: Received multiple duck click event"); + + //const EventMouse& event(*reinterpret_cast(&x)); + + std::list value_desc_list; + + // Create a list of value_descs associated with selection + const DuckList selected_ducks(get_work_area()->get_selected_ducks()); + DuckList::const_iterator iter; + for(iter=selected_ducks.begin();iter!=selected_ducks.end();++iter) + { + synfigapp::ValueDesc value_desc((*iter)->get_value_desc()); + + if(!value_desc.is_valid()) + continue; + + if(value_desc.get_value_type()==ValueBase::TYPE_BLINEPOINT && value_desc.is_value_node() && ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node())) + { + value_desc_list.push_back( + synfigapp::ValueDesc( + ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node()) + ,ValueNode_Composite::Handle::cast_dynamic(value_desc.get_value_node()) + ->get_link_index_from_name("point") + ) + ); + } + else + value_desc_list.push_back(value_desc); + } + + 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); + + /* + 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); + + menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Edit Waypoints"), + sigc::bind( + sigc::mem_fun( + *this, + &studio::StateTransform_Context::edit_several_waypoints + ), + value_desc_list + ) + )); + */ + menu->popup(3,gtk_get_current_event_time()); + + return Smach::RESULT_ACCEPT; +} + +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; + + //std::set >::iterator iter; + 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); + } + DuckList duck_list(duckmatic->get_duck_list()); + for (iter=duck_list.begin(); iter!=duck_list.end(); ++iter) + { + if ((*iter)->get_type() == Duck::TYPE_TANGENT || (*iter)->get_type() == Duck::TYPE_WIDTH) + { + (*iter)->update(time); + } + } + return; + } + + if (rotate) + { + Angle::tan angle(vect[1],vect[0]); + angle=original_angle-angle; + 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); + } + 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); + } + } 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); + } + 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); + } + } + 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; + } +} diff --git a/synfig-studio/src/gtkmm/state_transform.h b/synfig-studio/src/gtkmm/state_transform.h new file mode 100644 index 0000000..827b202 --- /dev/null +++ b/synfig-studio/src/gtkmm/state_transform.h @@ -0,0 +1,56 @@ +/* === S Y N F I G ========================================================= */ +/*! \file state_transform.h +** \brief Template Header +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** +** This package is free software; you can redistribute it and/or +** modify it under the terms of the GNU General Public License as +** published by the Free Software Foundation; either version 2 of +** the License, or (at your option) any later version. +** +** This package is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** \endlegal +*/ +/* ========================================================================= */ + +/* === S T A R T =========================================================== */ + +#ifndef __SYNFIG_STUDIO_STATE_TRANSFORM_H +#define __SYNFIG_STUDIO_STATE_TRANSFORM_H + +/* === H E A D E R S ======================================================= */ + +#include "smach.h" + + +/* === M A C R O S ========================================================= */ + +/* === T Y P E D E F S ===================================================== */ + +/* === C L A S S E S & S T R U C T S ======================================= */ + +namespace studio { + +class StateTransform_Context; + +class StateTransform : public Smach::state +{ +public: + StateTransform(); + ~StateTransform(); +}; // END of class StateTransform + +extern StateTransform state_transform; + +}; // END of namespace studio + +/* === E N D =============================================================== */ + +#endif -- 2.7.4