- i->track->set_position(Point(center.x+i->pos.x, center.y+i->pos.y, center.z+i->pos.z));
- i->track->set_rotation(i->rot);
- }
-
- for(set<Track *>::iterator i=neighbors.begin(); i!=neighbors.end(); ++i)
- (*i)->check_slope();
-
- angle = 0;
-
- signal_done.emit(false);
-}
-
-void Manipulator::button_press(int, int, float, float, unsigned btn)
-{
- if(btn==3)
- cancel();
- else if(mode)
- {
- mode = NONE;
- angle = 0;
-
- for(set<Track *>::iterator i=neighbors.begin(); i!=neighbors.end(); ++i)
- for(vector<MTrack>::iterator j=tracks.begin(); j!=tracks.end(); ++j)
- j->track->break_link(**i);
-
- const set<Track *> <racks = designer.get_layout()->get_tracks();
- for(set<Track *>::const_iterator i=ltracks.begin(); i!=ltracks.end(); ++i)
- {
- bool ok = true;
- for(vector<MTrack>::iterator j=tracks.begin(); (j!=tracks.end() && ok); ++j)
- ok = (j->track!=*i);
- if(!ok) continue;
-
- for(vector<MTrack>::iterator j=tracks.begin(); j!=tracks.end(); ++j)
- j->track->snap_to(**i, true);
- }
-
- update_tracks();
- update_neighbors();
-
- signal_done.emit(true);
- }
-}
-
-void Manipulator::pointer_motion(int, int y, float gx, float gy)
-{
- pointer_y = y;
- gpointer = Point(gx, gy, 0);
-
- if(mode==MOVE)
- {
- Point delta(gpointer.x-move_origin.x, gpointer.y-move_origin.y, 0);
- Point offset(center.x+delta.x, center.y+delta.y, center.z);
- for(vector<MTrack>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
- {
- i->track->set_position(Point(offset.x+i->pos.x, offset.y+i->pos.y, offset.z+i->pos.z));
- i->track->set_rotation(i->rot);
- }
-
- const set<Track *> <racks = designer.get_layout()->get_tracks();
- MTrack *snapped = 0;
- for(set<Track *>::const_iterator i=ltracks.begin(); (i!=ltracks.end() && !snapped); ++i)
- {
- bool ok = true;
- for(vector<MTrack>::iterator j=tracks.begin(); (j!=tracks.end() && ok); ++j)
- ok = (j->track!=*i);
- if(!ok) continue;
-
- for(vector<MTrack>::iterator j=tracks.begin(); (j!=tracks.end() && !snapped); ++j)
- if(j->track->snap_to(**i, false))
- snapped = &*j;
- }
-
- if(snapped)
- {
- float da = snapped->track->get_rotation()-snapped->rot;
- float c = cos(da);
- float s = sin(da);
- const Point &sp = snapped->track->get_position();
- for(vector<MTrack>::iterator i=tracks.begin(); i!=tracks.end(); ++i)
- {
- if(&*i==snapped)
- continue;
-
- Point dp(i->pos.x-snapped->pos.x, i->pos.y-snapped->pos.y, 0);
- i->track->set_position(Point(sp.x+c*dp.x-s*dp.y, sp.y+s*dp.x+c*dp.y, sp.z));
- i->track->set_rotation(i->rot+da);
- }
- }
- }
- else if(mode==ROTATE)
- {
- float a = atan2(gpointer.y-center.y, gpointer.x-center.x);
- angle += a-rot_origin;
- rot_origin = a;
-
- for(vector<MTrack>::iterator i=tracks.begin(); i!=tracks.end(); ++i)