|
Carlos Lopez |
147815 |
/* === S Y N F I G ========================================================= */
|
|
Carlos Lopez |
147815 |
/*! \file state_rotate.cpp
|
|
Carlos Lopez |
147815 |
** \brief Template File
|
|
Carlos Lopez |
147815 |
**
|
|
Carlos Lopez |
147815 |
** $Id$
|
|
Carlos Lopez |
147815 |
**
|
|
Carlos Lopez |
147815 |
** \legal
|
|
Carlos Lopez |
147815 |
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
|
|
Carlos Lopez |
147815 |
** Copyright (c) 2008 Chris Moore
|
|
Carlos Lopez |
42fd7a |
** Copyright (c) 2010 Carlos Lรณpez
|
|
Carlos Lopez |
147815 |
**
|
|
Carlos Lopez |
147815 |
** This package is free software; you can redistribute it and/or
|
|
Carlos Lopez |
147815 |
** modify it under the terms of the GNU General Public License as
|
|
Carlos Lopez |
147815 |
** published by the Free Software Foundation; either version 2 of
|
|
Carlos Lopez |
147815 |
** the License, or (at your option) any later version.
|
|
Carlos Lopez |
147815 |
**
|
|
Carlos Lopez |
147815 |
** This package is distributed in the hope that it will be useful,
|
|
Carlos Lopez |
147815 |
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Carlos Lopez |
147815 |
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Carlos Lopez |
147815 |
** General Public License for more details.
|
|
Carlos Lopez |
147815 |
** \endlegal
|
|
Carlos Lopez |
147815 |
*/
|
|
Carlos Lopez |
147815 |
/* ========================================================================= */
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
/* === H E A D E R S ======================================================= */
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
#ifdef USING_PCH
|
|
Carlos Lopez |
147815 |
# include "pch.h"
|
|
Carlos Lopez |
147815 |
#else
|
|
Carlos Lopez |
147815 |
#ifdef HAVE_CONFIG_H
|
|
Carlos Lopez |
147815 |
# include <config.h></config.h>
|
|
Carlos Lopez |
147815 |
#endif
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
#include <gtkmm dialog.h=""></gtkmm>
|
|
Carlos Lopez |
147815 |
#include <gtkmm entry.h=""></gtkmm>
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
#include <synfig valuenode_dynamiclist.h=""></synfig>
|
|
Carlos Lopez |
147815 |
#include <synfigapp action_system.h=""></synfigapp>
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
#include "state_rotate.h"
|
|
Carlos Lopez |
fb4c7c |
#include "state_normal.h"
|
|
Carlos Lopez |
147815 |
#include "canvasview.h"
|
|
Carlos Lopez |
147815 |
#include "workarea.h"
|
|
Carlos Lopez |
147815 |
#include "app.h"
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
#include <synfigapp action.h=""></synfigapp>
|
|
Carlos Lopez |
147815 |
#include "event_mouse.h"
|
|
Carlos Lopez |
147815 |
#include "event_layerclick.h"
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?s=16&d=retro) |
839371 |
#include "docks/dock_toolbox.h"
|
|
Nikita Kitaev |
5fe12e |
#include "docks/dialog_tooloptions.h"
|
|
Carlos Lopez |
147815 |
#include <gtkmm optionmenu.h=""></gtkmm>
|
|
Carlos Lopez |
147815 |
#include "duck.h"
|
|
Carlos Lopez |
147815 |
#include <synfig angle.h=""></synfig>
|
|
Carlos Lopez |
147815 |
#include <synfigapp main.h=""></synfigapp>
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
#include "general.h"
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
#endif
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
/* === U S I N G =========================================================== */
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
using namespace std;
|
|
Carlos Lopez |
147815 |
using namespace etl;
|
|
Carlos Lopez |
147815 |
using namespace synfig;
|
|
Carlos Lopez |
147815 |
using namespace studio;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
/* === M A C R O S ========================================================= */
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
#ifndef EPSILON
|
|
Carlos Lopez |
147815 |
#define EPSILON 0.0000001
|
|
Carlos Lopez |
147815 |
#endif
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
/* === G L O B A L S ======================================================= */
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
StateRotate studio::state_rotate;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
/* === C L A S S E S & S T R U C T S ======================================= */
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
class DuckDrag_Rotate : public DuckDrag_Base
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
synfig::Vector last_rotate;
|
|
Carlos Lopez |
147815 |
synfig::Vector drag_offset;
|
|
Carlos Lopez |
147815 |
synfig::Vector center;
|
|
Carlos Lopez |
147815 |
synfig::Vector snap;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
Angle original_angle;
|
|
Carlos Lopez |
147815 |
Real original_mag;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
std::vector<synfig::vector> positions;</synfig::vector>
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
bool bad_drag;
|
|
Carlos Lopez |
147815 |
bool move_only;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
public:
|
|
Carlos Lopez |
147815 |
etl::handle<canvasview> canvas_view_;</canvasview>
|
|
Carlos Lopez |
147815 |
bool use_magnitude;
|
|
Carlos Lopez |
147815 |
DuckDrag_Rotate();
|
|
Carlos Lopez |
147815 |
void begin_duck_drag(Duckmatic* duckmatic, const synfig::Vector& begin);
|
|
Carlos Lopez |
147815 |
bool end_duck_drag(Duckmatic* duckmatic);
|
|
Carlos Lopez |
147815 |
void duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector);
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
etl::handle<synfigapp::canvasinterface> get_canvas_interface()const{return canvas_view_->canvas_interface();}</synfigapp::canvasinterface>
|
|
Carlos Lopez |
147815 |
};
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
class studio::StateRotate_Context : public sigc::trackable
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
etl::handle<canvasview> canvas_view_;</canvasview>
|
|
Carlos Lopez |
fb4c7c |
CanvasView::IsWorking is_working;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
synfigapp::Settings& settings;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
etl::handle<duckdrag_rotate> duck_dragger_;</duckdrag_rotate>
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
Gtk::Table options_table;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
Gtk::CheckButton checkbutton_scale;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
public:
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
bool get_scale_flag()const { return checkbutton_scale.get_active(); }
|
|
Carlos Lopez |
147815 |
void set_scale_flag(bool x) { return checkbutton_scale.set_active(x); refresh_scale_flag(); }
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
fb4c7c |
Smach::event_result event_stop_handler(const Smach::event& x);
|
|
Carlos Lopez |
147815 |
Smach::event_result event_refresh_tool_options(const Smach::event& x);
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
void refresh_tool_options();
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
void refresh_scale_flag() { if(duck_dragger_)duck_dragger_->use_magnitude=get_scale_flag(); }
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
StateRotate_Context(CanvasView* canvas_view);
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
~StateRotate_Context();
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
const etl::handle<canvasview>& get_canvas_view()const{return canvas_view_;}</canvasview>
|
|
Carlos Lopez |
147815 |
etl::handle<synfigapp::canvasinterface> get_canvas_interface()const{return canvas_view_->canvas_interface();}</synfigapp::canvasinterface>
|
|
Carlos Lopez |
147815 |
synfig::Canvas::Handle get_canvas()const{return canvas_view_->get_canvas();}
|
|
Carlos Lopez |
147815 |
WorkArea * get_work_area()const{return canvas_view_->get_work_area();}
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
void load_settings();
|
|
Carlos Lopez |
147815 |
void save_settings();
|
|
Carlos Lopez |
147815 |
}; // END of class StateRotate_Context
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
/* === M E T H O D S ======================================================= */
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
StateRotate::StateRotate():
|
|
Carlos Lopez |
147815 |
Smach::state<staterotate_context>("rotate")</staterotate_context>
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
insert(event_def(EVENT_REFRESH_TOOL_OPTIONS,&StateRotate_Context::event_refresh_tool_options));
|
|
Carlos Lopez |
fb4c7c |
insert(event_def(EVENT_STOP,&StateRotate_Context::event_stop_handler));
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
StateRotate::~StateRotate()
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
void
|
|
Carlos Lopez |
147815 |
StateRotate_Context::load_settings()
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
87cee9 |
try
|
|
Carlos Lopez |
87cee9 |
{
|
|
Carlos Lopez |
477fd4 |
synfig::ChangeLocale change_locale(LC_NUMERIC, "C");
|
|
Carlos Lopez |
87cee9 |
String value;
|
|
Carlos Lopez |
87cee9 |
|
|
Carlos Lopez |
87cee9 |
if(settings.get_value("rotate.scale",value) && value=="0")
|
|
Carlos Lopez |
87cee9 |
set_scale_flag(false);
|
|
Carlos Lopez |
87cee9 |
else
|
|
Carlos Lopez |
87cee9 |
set_scale_flag(true);
|
|
Carlos Lopez |
87cee9 |
}
|
|
Carlos Lopez |
87cee9 |
catch(...)
|
|
Carlos Lopez |
87cee9 |
{
|
|
Carlos Lopez |
87cee9 |
synfig::warning("State Rotate: Caught exception when attempting to load settings.");
|
|
Carlos Lopez |
87cee9 |
}
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
void
|
|
Carlos Lopez |
147815 |
StateRotate_Context::save_settings()
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
87cee9 |
try
|
|
Carlos Lopez |
87cee9 |
{
|
|
Carlos Lopez |
477fd4 |
synfig::ChangeLocale change_locale(LC_NUMERIC, "C");
|
|
Carlos Lopez |
87cee9 |
settings.set_value("rotate.scale",get_scale_flag()?"1":"0");
|
|
Carlos Lopez |
87cee9 |
}
|
|
Carlos Lopez |
87cee9 |
catch(...)
|
|
Carlos Lopez |
87cee9 |
{
|
|
Carlos Lopez |
87cee9 |
synfig::warning("State Rotate: Caught exception when attempting to save settings.");
|
|
Carlos Lopez |
87cee9 |
}
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
StateRotate_Context::StateRotate_Context(CanvasView* canvas_view):
|
|
Carlos Lopez |
147815 |
canvas_view_(canvas_view),
|
|
Carlos Lopez |
fb4c7c |
is_working(*canvas_view),
|
|
Carlos Lopez |
147815 |
settings(synfigapp::Main::get_selected_input_device()->settings()),
|
|
Carlos Lopez |
147815 |
duck_dragger_(new DuckDrag_Rotate()),
|
|
Carlos Lopez |
147815 |
checkbutton_scale(_("Allow Scale"))
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
duck_dragger_->canvas_view_=get_canvas_view();
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
// Set up the tool options dialog
|
|
Carlos Lopez |
147815 |
options_table.attach(*manage(new Gtk::Label(_("Rotate Tool"))), 0, 2, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
|
|
Carlos Lopez |
147815 |
options_table.attach(checkbutton_scale, 0, 2, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0);
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
checkbutton_scale.signal_toggled().connect(sigc::mem_fun(*this,&StateRotate_Context::refresh_scale_flag));
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
options_table.show_all();
|
|
Carlos Lopez |
147815 |
refresh_tool_options();
|
|
Carlos Lopez |
147815 |
//App::dialog_tool_options->set_widget(options_table);
|
|
Carlos Lopez |
147815 |
App::dialog_tool_options->present();
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
get_work_area()->set_allow_layer_clicks(true);
|
|
Carlos Lopez |
147815 |
get_work_area()->set_duck_dragger(duck_dragger_);
|
|
Carlos Lopez |
147815 |
|
|
Nikita Kitaev |
aa9ae3 |
get_work_area()->set_cursor(Gdk::EXCHANGE);
|
|
Nikita Kitaev |
aa9ae3 |
// get_work_area()->reset_cursor();
|
|
Carlos Lopez |
147815 |
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?s=16&d=retro) |
839371 |
App::dock_toolbox->refresh();
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
load_settings();
|
|
Carlos Lopez |
147815 |
refresh_scale_flag();
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
void
|
|
Carlos Lopez |
147815 |
StateRotate_Context::refresh_tool_options()
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
App::dialog_tool_options->clear();
|
|
Carlos Lopez |
147815 |
App::dialog_tool_options->set_widget(options_table);
|
|
Carlos Lopez |
147815 |
App::dialog_tool_options->set_local_name(_("Rotate Tool"));
|
|
Carlos Lopez |
147815 |
App::dialog_tool_options->set_name("rotate");
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
Smach::event_result
|
|
Carlos Lopez |
147815 |
StateRotate_Context::event_refresh_tool_options(const Smach::event& /*x*/)
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
refresh_tool_options();
|
|
Carlos Lopez |
147815 |
return Smach::RESULT_ACCEPT;
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
fb4c7c |
Smach::event_result
|
|
Carlos Lopez |
fb4c7c |
StateRotate_Context::event_stop_handler(const Smach::event& /*x*/)
|
|
Carlos Lopez |
fb4c7c |
{
|
|
Carlos Lopez |
fb4c7c |
throw &state_normal;
|
|
Carlos Lopez |
fb4c7c |
return Smach::RESULT_OK;
|
|
Carlos Lopez |
fb4c7c |
}
|
|
Carlos Lopez |
fb4c7c |
|
|
Carlos Lopez |
147815 |
StateRotate_Context::~StateRotate_Context()
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
save_settings();
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
get_work_area()->clear_duck_dragger();
|
|
Nikita Kitaev |
aa9ae3 |
get_work_area()->reset_cursor();
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
App::dialog_tool_options->clear();
|
|
Carlos Lopez |
147815 |
|
|
![](https://seccdn.libravatar.org/avatar/2e5dd0bee1e7e619066117de357c8458fc7e847f4345b0cb8a7a5413aa2a45a0?s=16&d=retro) |
839371 |
App::dock_toolbox->refresh();
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
DuckDrag_Rotate::DuckDrag_Rotate()
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
use_magnitude=true;
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
void
|
|
Carlos Lopez |
147815 |
DuckDrag_Rotate::begin_duck_drag(Duckmatic* duckmatic, const synfig::Vector& offset)
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
last_rotate=Vector(1,1);
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
const DuckList selected_ducks(duckmatic->get_selected_ducks());
|
|
Carlos Lopez |
147815 |
DuckList::const_iterator iter;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
/*
|
|
Carlos Lopez |
147815 |
if(duckmatic->get_selected_ducks().size()<2)
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
bad_drag=true;
|
|
Carlos Lopez |
147815 |
return;
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
*/
|
|
Carlos Lopez |
147815 |
bad_drag=false;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
drag_offset=duckmatic->find_duck(offset)->get_trans_point();
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
//snap=drag_offset-duckmatic->snap_point_to_grid(drag_offset);
|
|
Carlos Lopez |
147815 |
//snap=offset-drag_offset;
|
|
Carlos Lopez |
147815 |
snap=Vector(0,0);
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
// Calculate center
|
|
Carlos Lopez |
147815 |
Point vmin(100000000,100000000);
|
|
Carlos Lopez |
147815 |
Point vmax(-100000000,-100000000);
|
|
Carlos Lopez |
147815 |
//std::set<etl::handle<duck> >::iterator iter;</etl::handle<duck>
|
|
Carlos Lopez |
147815 |
positions.clear();
|
|
Carlos Lopez |
147815 |
int i;
|
|
Carlos Lopez |
147815 |
for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
Point p((*iter)->get_trans_point());
|
|
Carlos Lopez |
147815 |
vmin[0]=min(vmin[0],p[0]);
|
|
Carlos Lopez |
147815 |
vmin[1]=min(vmin[1],p[1]);
|
|
Carlos Lopez |
147815 |
vmax[0]=max(vmax[0],p[0]);
|
|
Carlos Lopez |
147815 |
vmax[1]=max(vmax[1],p[1]);
|
|
Carlos Lopez |
147815 |
positions.push_back(p);
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
center=(vmin+vmax)*0.5;
|
|
Carlos Lopez |
147815 |
if((vmin-vmax).mag()<=EPSILON)
|
|
Carlos Lopez |
147815 |
move_only=true;
|
|
Carlos Lopez |
147815 |
else
|
|
Carlos Lopez |
147815 |
move_only=false;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
synfig::Vector vect(offset-center);
|
|
Carlos Lopez |
147815 |
original_angle=Angle::tan(vect[1],vect[0]);
|
|
Carlos Lopez |
147815 |
original_mag=vect.mag();
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
void
|
|
Carlos Lopez |
147815 |
DuckDrag_Rotate::duck_drag(Duckmatic* duckmatic, const synfig::Vector& vector)
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
if(bad_drag)
|
|
Carlos Lopez |
147815 |
return;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
//std::set<etl::handle<duck> >::iterator iter;</etl::handle<duck>
|
|
Carlos Lopez |
147815 |
synfig::Vector vect(duckmatic->snap_point_to_grid(vector)-center+snap);
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
const DuckList selected_ducks(duckmatic->get_selected_ducks());
|
|
Carlos Lopez |
147815 |
DuckList::const_iterator iter;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
if(move_only)
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
int i;
|
|
Carlos Lopez |
147815 |
for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
if((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION)continue;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
Vector p(positions[i]);
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
p[0]+=vect[0];
|
|
Carlos Lopez |
147815 |
p[1]+=vect[1];
|
|
Carlos Lopez |
147815 |
(*iter)->set_trans_point(p);
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
if(!((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION))continue;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
Vector p(positions[i]);
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
p[0]+=vect[0];
|
|
Carlos Lopez |
147815 |
p[1]+=vect[1];
|
|
Carlos Lopez |
147815 |
(*iter)->set_trans_point(p);
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
return;
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
Angle::tan angle(vect[1],vect[0]);
|
|
Carlos Lopez |
147815 |
angle=original_angle-angle;
|
|
Carlos Lopez |
147815 |
Real mag(vect.mag()/original_mag);
|
|
Carlos Lopez |
147815 |
Real sine(Angle::sin(angle).get());
|
|
Carlos Lopez |
147815 |
Real cosine(Angle::cos(angle).get());
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
int i;
|
|
Carlos Lopez |
147815 |
for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
if((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION)continue;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
Vector x(positions[i]-center),p;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
p[0]=cosine*x[0]+sine*x[1];
|
|
Carlos Lopez |
147815 |
p[1]=-sine*x[0]+cosine*x[1];
|
|
Carlos Lopez |
147815 |
if(use_magnitude)p*=mag;
|
|
Carlos Lopez |
147815 |
p+=center;
|
|
Carlos Lopez |
147815 |
(*iter)->set_trans_point(p);
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
for(i=0,iter=selected_ducks.begin();iter!=selected_ducks.end();++iter,i++)
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
if(!((*iter)->get_type()!=Duck::TYPE_VERTEX&&(*iter)->get_type()!=Duck::TYPE_POSITION))continue;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
Vector x(positions[i]-center),p;
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
p[0]=cosine*x[0]+sine*x[1];
|
|
Carlos Lopez |
147815 |
p[1]=-sine*x[0]+cosine*x[1];
|
|
Carlos Lopez |
147815 |
if(use_magnitude)p*=mag;
|
|
Carlos Lopez |
147815 |
p+=center;
|
|
Carlos Lopez |
147815 |
(*iter)->set_trans_point(p);
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
last_rotate=vect;
|
|
Carlos Lopez |
147815 |
//snap=Vector(0,0);
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
bool
|
|
Carlos Lopez |
147815 |
DuckDrag_Rotate::end_duck_drag(Duckmatic* duckmatic)
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
if(bad_drag)return false;
|
|
Carlos Lopez |
147815 |
if(move_only)
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
0a0189 |
synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Move Handle"));
|
|
Carlos Lopez |
147815 |
duckmatic->signal_edited_selected_ducks();
|
|
Carlos Lopez |
147815 |
return true;
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
0a0189 |
synfigapp::Action::PassiveGrouper group(get_canvas_interface()->get_instance().get(),_("Rotate Handle"));
|
|
Carlos Lopez |
147815 |
|
|
Carlos Lopez |
147815 |
if((last_rotate-Vector(1,1)).mag()>0.0001)
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
duckmatic->signal_edited_selected_ducks();
|
|
Carlos Lopez |
147815 |
return true;
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
else
|
|
Carlos Lopez |
147815 |
{
|
|
Carlos Lopez |
147815 |
duckmatic->signal_user_click_selected_ducks(0);
|
|
Carlos Lopez |
147815 |
return false;
|
|
Carlos Lopez |
147815 |
}
|
|
Carlos Lopez |
147815 |
}
|