From: Carlos Lopez Date: Wed, 13 Jan 2010 16:29:05 +0000 (+0100) Subject: Restore Scale and Rotate tools presence. X-Git-Url: https://git.pterodactylus.net/?a=commitdiff_plain;h=1478153109643a4c61f209d6cc22ae537d3becde;p=synfig.git Restore Scale and Rotate tools presence. --- diff --git a/synfig-studio/images/Makefile.am b/synfig-studio/images/Makefile.am index e0fae57..0d703f3 100644 --- a/synfig-studio/images/Makefile.am +++ b/synfig-studio/images/Makefile.am @@ -110,6 +110,7 @@ IMAGES = \ reset_colors_icon.$(EXT) \ swap_colors_icon.$(EXT) \ rotate_icon.$(EXT) \ + scale_icon.$(EXT) \ smooth_move_icon.$(EXT) \ width_icon.$(EXT) \ rectangle_icon.$(EXT) \ diff --git a/synfig-studio/images/scale_icon.sif b/synfig-studio/images/scale_icon.sif new file mode 100644 index 0000000..cd3c687 --- /dev/null +++ b/synfig-studio/images/scale_icon.sif @@ -0,0 +1,3494 @@ + + + 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/src/gtkmm/Makefile.am b/synfig-studio/src/gtkmm/Makefile.am index 1197712..c5cc73d 100644 --- a/synfig-studio/src/gtkmm/Makefile.am +++ b/synfig-studio/src/gtkmm/Makefile.am @@ -172,6 +172,8 @@ 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 \ @@ -190,6 +192,8 @@ 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 \ diff --git a/synfig-studio/src/gtkmm/app.cpp b/synfig-studio/src/gtkmm/app.cpp index 7bffd2c..bde450c 100644 --- a/synfig-studio/src/gtkmm/app.cpp +++ b/synfig-studio/src/gtkmm/app.cpp @@ -90,9 +90,11 @@ #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_zoom.h" #include "devicetracker.h" @@ -1294,21 +1296,22 @@ App::App(int *argc, char ***argv): /* 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 /* 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 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); diff --git a/synfig-studio/src/gtkmm/iconcontroller.cpp b/synfig-studio/src/gtkmm/iconcontroller.cpp index be34be4..ea2a3a6 100644 --- a/synfig-studio/src/gtkmm/iconcontroller.cpp +++ b/synfig-studio/src/gtkmm/iconcontroller.cpp @@ -164,7 +164,6 @@ IconController::IconController(const synfig::String& /*basepath*/) INIT_STOCK_ICON(layer,"layer_icon."IMAGE_EXT,_("Layer")); INIT_STOCK_ICON(layer_pastecanvas,"pastecanvas_icon."IMAGE_EXT,_("Paste Canvas")); INIT_STOCK_ICON(plant,"plant_icon."IMAGE_EXT,""); - INIT_STOCK_ICON(rotate,"rotate_icon."IMAGE_EXT,""); INIT_STOCK_ICON(group,"group_icon."IMAGE_EXT,_("Group")); INIT_STOCK_ICON(grid_enable,"grid_enable_icon."IMAGE_EXT,_("Show Grid")); INIT_STOCK_ICON(grid_disable,"grid_disable_icon."IMAGE_EXT,_("Hide Grid")); @@ -232,7 +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(rotate,"rotate_icon."IMAGE_EXT,"Rotate Tool"); INIT_STOCK_ICON(width,"width_icon."IMAGE_EXT,_("Width 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/state_rotate.cpp b/synfig-studio/src/gtkmm/state_rotate.cpp new file mode 100644 index 0000000..1635500 --- /dev/null +++ b/synfig-studio/src/gtkmm/state_rotate.cpp @@ -0,0 +1,387 @@ +/* === 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 new file mode 100644 index 0000000..e2caafe --- /dev/null +++ b/synfig-studio/src/gtkmm/state_rotate.h @@ -0,0 +1,56 @@ +/* === 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 new file mode 100644 index 0000000..300ff4b --- /dev/null +++ b/synfig-studio/src/gtkmm/state_scale.cpp @@ -0,0 +1,377 @@ +/* === 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 new file mode 100644 index 0000000..f351c12 --- /dev/null +++ b/synfig-studio/src/gtkmm/state_scale.h @@ -0,0 +1,55 @@ +/* === 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