-#include <iostream>
-
-Manipulator::Manipulator(Designer &d):
- designer(d),
- selection(0),
- wrap_rot(0),
- mode(NONE),
- angle(0)
-{ }
-
-void Manipulator::set_selection(Selection *s)
-{
- selection_changed_conn.disconnect();
-
- selection=s;
- if(selection)
- selection_changed_conn=selection->signal_changed.connect(sigc::mem_fun(this, &Manipulator::selection_changed));
-
- selection_changed();
-}
-
-void Manipulator::start_move()
-{
- if(mode)
- cancel();
-
- move_origin=gpointer;
-
- mode=MOVE;
-}
-
-void Manipulator::start_rotate()
-{
- if(mode)
- cancel();
-
- rot_origin=atan2(gpointer.y-center.y, gpointer.x-center.x);
-
- mode=ROTATE;
-}
-
-void Manipulator::start_elevate()
-{
- if(mode)
- cancel();
-
- elev_origin=pointer_y;
-
- mode=ELEVATE;
-}
-
-void Manipulator::duplicate()
-{
- if(mode)
- cancel();
-
- list<Track *> new_tracks;
- for(vector<MTrack>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
- {
- Track *track=i->track->copy();
- designer.get_layout()->add_track(*track);
- new_tracks.push_back(track);
- }
-
- selection->clear();
- for(list<Track *>::iterator i=new_tracks.begin(); i!=new_tracks.end(); ++i)
- {
- selection->add_track(*i);
- for(list<Track *>::iterator j=i; j!=new_tracks.end(); ++j)
- if(j!=i)
- (*i)->snap_to(**j, true);
- }
-}
-
-void Manipulator::flatten()
-{
- if(mode)
- cancel();
-
- if(tracks.empty()) return;
-
- float z=0;
- for(vector<MTrack>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
- z+=i->track->get_position().z+i->track->get_slope()/2;
- z/=tracks.size();
-
- for(vector<MTrack>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
- {
- Point p=i->track->get_position();
- i->track->set_position(Point(p.x, p.y, z));
- i->track->set_slope(0);
- }
-
- for(set<Track *>::iterator i=neighbors.begin(); i!=neighbors.end(); ++i)
- (*i)->check_slope();
-
- update_wrap();
-}
-
-void Manipulator::even_slope(bool smooth)