First of all: revision 1981 is mine, what is important me because I was born in 1981. But what is new in my revision? If you drag nodes with left button, edge-breakpoints do not change location. If you drag nodes by right button, they do, they take up their base situation at the halfpoint of the edge.
     1.1 --- a/gui/broken_edge.cc	Thu Jun 16 18:08:04 2005 +0000
     1.2 +++ b/gui/broken_edge.cc	Thu Jun 16 18:58:15 2005 +0000
     1.3 @@ -17,25 +17,42 @@
     1.4    if(arrow)delete(arrow);
     1.5  }
     1.6  
     1.7 -void BrokenEdge::set_points(Gnome::Canvas::Points p)
     1.8 +void BrokenEdge::set_points(Gnome::Canvas::Points p, bool move)
     1.9  {
    1.10    bool set_arrow=false;
    1.11 -  if(p.size()==2)
    1.12 +  if(!move)
    1.13      {
    1.14 -      set_arrow=true;
    1.15 -      Gnome::Canvas::Points points_with_center;
    1.16 -      points_with_center.push_back(my_points[0]=p[0]);
    1.17 -      points_with_center.push_back(my_points[1]=Gnome::Art::Point( (p[0].get_x()+p[1].get_x())/2+0 , (p[0].get_y()+p[1].get_y())/2 )+0 );
    1.18 -      points_with_center.push_back(my_points[2]=p[1]);
    1.19 -      property_points().set_value(points_with_center);
    1.20 -    }  
    1.21 -  if(p.size()==3)
    1.22 +      if(p.size()==2)
    1.23 +	{
    1.24 +	  set_arrow=true;
    1.25 +	  Gnome::Canvas::Points points_with_center;
    1.26 +	  points_with_center.push_back(my_points[0]=p[0]);
    1.27 +	  points_with_center.push_back(my_points[1]=Gnome::Art::Point( (p[0].get_x()+p[1].get_x())/2+0 , (p[0].get_y()+p[1].get_y())/2 )+0 );
    1.28 +	  points_with_center.push_back(my_points[2]=p[1]);
    1.29 +	  property_points().set_value(points_with_center);
    1.30 +	}  
    1.31 +      if(p.size()==3)
    1.32 +	{
    1.33 +	  set_arrow=true;
    1.34 +	  property_points().set_value(p);
    1.35 +	  for(int i=0;i<3;i++)
    1.36 +	    {
    1.37 +	      my_points[i]=p[i];
    1.38 +	    }
    1.39 +	}
    1.40 +    }
    1.41 +  else
    1.42      {
    1.43 -      set_arrow=true;
    1.44 -      property_points().set_value(p);
    1.45 -      for(int i=0;i<3;i++)
    1.46 +      if(p.size()==2)
    1.47  	{
    1.48 -	  my_points[i]=p[i];
    1.49 +	  Gnome::Canvas::Points points;
    1.50 +	  my_points[0]=p[0];
    1.51 +	  my_points[2]=p[1];
    1.52 +	  for(int i=0;i<3;i++)
    1.53 +	    {
    1.54 +	      points.push_back(my_points[i]);
    1.55 +	    }
    1.56 +	  property_points().set_value(points);
    1.57  	}
    1.58      }
    1.59  
     2.1 --- a/gui/broken_edge.h	Thu Jun 16 18:08:04 2005 +0000
     2.2 +++ b/gui/broken_edge.h	Thu Jun 16 18:58:15 2005 +0000
     2.3 @@ -24,7 +24,7 @@
     2.4   public:
     2.5    BrokenEdge(Gnome::Canvas::Group &, Gnome::Canvas::Points);
     2.6    ~BrokenEdge();
     2.7 -  void set_points(Gnome::Canvas::Points);
     2.8 +  void set_points(Gnome::Canvas::Points, bool move=false);
     2.9  };
    2.10  
    2.11  
     3.1 --- a/gui/graph_displayer_canvas.cc	Thu Jun 16 18:08:04 2005 +0000
     3.2 +++ b/gui/graph_displayer_canvas.cc	Thu Jun 16 18:58:15 2005 +0000
     3.3 @@ -2,7 +2,7 @@
     3.4  #include <broken_edge.h>
     3.5  #include <math.h>
     3.6  
     3.7 -GraphDisplayerCanvas::GraphDisplayerCanvas(Graph & gr, CoordinatesMap & cm, MapStorage & ms):g(gr),nodesmap(g),edgesmap(g),edgetextmap(g),displayed_graph(*(root()), 0, 0),mapstorage(ms),isbutton(false),active_item(NULL),target_item(NULL)
     3.8 +GraphDisplayerCanvas::GraphDisplayerCanvas(Graph & gr, CoordinatesMap & cm, MapStorage & ms):g(gr),nodesmap(g),edgesmap(g),edgetextmap(g),displayed_graph(*(root()), 0, 0),mapstorage(ms),isbutton(0),active_item(NULL),target_item(NULL)
     3.9  {
    3.10    
    3.11    actual_handler=displayed_graph.signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::create_edge_event_handler), false);
    3.12 @@ -181,10 +181,10 @@
    3.13        clicked_x=e->button.x;
    3.14        clicked_y=e->button.y;
    3.15        active_item=(get_item_at(e->button.x, e->button.y));
    3.16 -      isbutton=true;
    3.17 +      isbutton=1;
    3.18        break;
    3.19      case GDK_BUTTON_RELEASE:
    3.20 -      isbutton=false;
    3.21 +      isbutton=0;
    3.22        active_item=NULL;
    3.23        updateScrollRegion();
    3.24        break;
    3.25 @@ -350,10 +350,18 @@
    3.26  	      active_node=i;
    3.27  	    }
    3.28  	}
    3.29 -      isbutton=true;
    3.30 +      switch(e->button.button)
    3.31 +	{
    3.32 +	case 3:      
    3.33 +	  isbutton=3;
    3.34 +	  break;
    3.35 +	default:
    3.36 +	  isbutton=1;
    3.37 +	  break;
    3.38 +	}
    3.39        break;
    3.40      case GDK_BUTTON_RELEASE:
    3.41 -      isbutton=false;
    3.42 +      isbutton=0;
    3.43        active_item=NULL;
    3.44        active_node=INVALID;
    3.45        updateScrollRegion();
    3.46 @@ -376,47 +384,61 @@
    3.47          clicked_y=e->motion.y;
    3.48  
    3.49  	//all the edges connected to the moved point has to be redrawn
    3.50 -        EdgeIt e;
    3.51 +        EdgeIt ei;
    3.52  
    3.53 -        g.firstOut(e,active_node);
    3.54 +        g.firstOut(ei,active_node);
    3.55  
    3.56 -        for(;e!=INVALID;g.nextOut(e))
    3.57 +        for(;ei!=INVALID;g.nextOut(ei))
    3.58          {
    3.59              Gnome::Canvas::Points coos;
    3.60              double x1, x2, y1, y2;
    3.61  
    3.62 -            nodesmap[g.source(e)]->get_bounds(x1, y1, x2, y2);
    3.63 +            nodesmap[g.source(ei)]->get_bounds(x1, y1, x2, y2);
    3.64              coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
    3.65  
    3.66 -            nodesmap[g.target(e)]->get_bounds(x1, y1, x2, y2);
    3.67 +            nodesmap[g.target(ei)]->get_bounds(x1, y1, x2, y2);
    3.68              coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
    3.69  
    3.70 -            edgesmap[e]->set_points(coos);
    3.71 +	    if(isbutton==3)
    3.72 +	      {
    3.73 +		edgesmap[ei]->set_points(coos);
    3.74 +	      }
    3.75 +	    else
    3.76 +	      {
    3.77 +		edgesmap[ei]->set_points(coos,true);
    3.78 +	      }
    3.79  
    3.80 -	    edgesmap[e]->get_bounds(x1, y1, x2, y2);
    3.81 +	    edgesmap[ei]->get_bounds(x1, y1, x2, y2);
    3.82  
    3.83 -	    edgetextmap[e]->property_x().set_value((x1+x2)/2);
    3.84 -	    edgetextmap[e]->property_y().set_value((y1+y2)/2);
    3.85 +	    edgetextmap[ei]->property_x().set_value((x1+x2)/2);
    3.86 +	    edgetextmap[ei]->property_y().set_value((y1+y2)/2);
    3.87          }
    3.88  
    3.89 -        g.firstIn(e,active_node);
    3.90 -        for(;e!=INVALID;g.nextIn(e))
    3.91 +        g.firstIn(ei,active_node);
    3.92 +        for(;ei!=INVALID;g.nextIn(ei))
    3.93          {
    3.94              Gnome::Canvas::Points coos;
    3.95              double x1, x2, y1, y2;
    3.96  
    3.97 -            nodesmap[g.source(e)]->get_bounds(x1, y1, x2, y2);
    3.98 +            nodesmap[g.source(ei)]->get_bounds(x1, y1, x2, y2);
    3.99              coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
   3.100  
   3.101 -            nodesmap[g.target(e)]->get_bounds(x1, y1, x2, y2);
   3.102 +            nodesmap[g.target(ei)]->get_bounds(x1, y1, x2, y2);
   3.103              coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
   3.104  
   3.105 -            edgesmap[e]->set_points(coos);
   3.106 +	    if(isbutton==3)
   3.107 +	      {
   3.108 +		edgesmap[ei]->set_points(coos);
   3.109 +	      }
   3.110 +	    else
   3.111 +	      {
   3.112 +		edgesmap[ei]->set_points(coos,true);
   3.113 +	      }
   3.114  
   3.115 -	    edgesmap[e]->get_bounds(x1, y1, x2, y2);
   3.116 +	    edgesmap[ei]->get_bounds(x1, y1, x2, y2);
   3.117  
   3.118 -	    edgetextmap[e]->property_x().set_value((x1+x2)/2);
   3.119 -	    edgetextmap[e]->property_y().set_value((y1+y2)/2);
   3.120 +	    edgetextmap[ei]->property_x().set_value((x1+x2)/2);
   3.121 +	    edgetextmap[ei]->property_y().set_value((y1+y2)/2);
   3.122          }
   3.123        }
   3.124      default: break;
   3.125 @@ -432,7 +454,7 @@
   3.126  
   3.127        //draw the new node in red at the clicked place
   3.128      case GDK_BUTTON_PRESS:
   3.129 -      isbutton=true;
   3.130 +      isbutton=1;
   3.131  
   3.132        active_node=NodeIt(g,g.addNode());
   3.133  
   3.134 @@ -460,7 +482,7 @@
   3.135  
   3.136        //finalize the new node
   3.137      case GDK_BUTTON_RELEASE:
   3.138 -      isbutton=false;
   3.139 +      isbutton=0;
   3.140        *active_item << Gnome::Canvas::Properties::fill_color("blue");
   3.141        active_item=NULL;
   3.142        active_node=INVALID;
   3.143 @@ -499,7 +521,7 @@
   3.144  	      if(active_node!=INVALID)
   3.145  		{
   3.146  		  *(nodesmap[active_node]) << Gnome::Canvas::Properties::fill_color("red");
   3.147 -		  isbutton=true;
   3.148 +		  isbutton=1;
   3.149  		}
   3.150  	      //clicked item was not a node. It could be e.g. edge.
   3.151  	      else
   3.152 @@ -564,7 +586,7 @@
   3.153  	}
   3.154        break;
   3.155      case GDK_BUTTON_RELEASE:
   3.156 -      isbutton=false;
   3.157 +      isbutton=0;
   3.158        //we clear settings in two cases
   3.159        //1: the edge is ready (target_item has valid value)
   3.160        //2: the edge creation is cancelled with right button
     4.1 --- a/gui/graph_displayer_canvas.h	Thu Jun 16 18:08:04 2005 +0000
     4.2 +++ b/gui/graph_displayer_canvas.h	Thu Jun 16 18:58:15 2005 +0000
     4.3 @@ -96,7 +96,7 @@
     4.4    MapStorage mapstorage;
     4.5  
     4.6    ///Indicates whether the button of mouse is pressed or not
     4.7 -  bool isbutton;
     4.8 +  int isbutton;
     4.9  
    4.10    ///At this location was the mousebutton pressed.
    4.11    ///It helps to calculate the distance of dragging.