NewMapWin has become Dialog instead of Window. Therefore it is created dynamically, when there is need for it, instead of keeping one instance in memory. This solution is slower, but more correct than before.
1 #include "graph_displayer_canvas.h"
4 GraphDisplayerCanvas::BrokenEdge::BrokenEdge(Gnome::Canvas::Group & g, Gnome::Canvas::Points p, GraphDisplayerCanvas & gc) : Line(g), gdc(gc), isbutton(false)
6 my_points=new Gnome::Art::Point[3];
8 arrow=new Gnome::Canvas::Polygon(g);
9 *arrow << Gnome::Canvas::Properties::fill_color("red");
10 arrow->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::BrokenEdge::edgeFormerEventHandler));
11 arrow->lower_to_bottom();
15 GraphDisplayerCanvas::BrokenEdge::~BrokenEdge()
17 if(arrow)delete(arrow);
20 void GraphDisplayerCanvas::BrokenEdge::setPoints(Gnome::Canvas::Points p, bool move)
23 //red arrow losts its position-right button
29 Gnome::Canvas::Points points_with_center;
30 points_with_center.push_back(my_points[0]=p[0]);
31 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 );
32 points_with_center.push_back(my_points[2]=p[1]);
33 property_points().set_value(points_with_center);
38 property_points().set_value(p);
47 //arrow keeps its position-left button
51 // Gnome::Canvas::Points points;
54 // for(int i=0;i<3;i++)
56 // points.push_back(my_points[i]);
58 // property_points().set_value(points);
62 //////////////////////////////////////////////////////////////////////////////////////////////////////
63 /////////// keeps shape-with scalar multiplication - version 2.
64 //////////////////////////////////////////////////////////////////////////////////////////////////////
68 //old vector from one to the other node - a
69 xy<double> a_v(my_points[2].get_x()-my_points[0].get_x(),my_points[2].get_y()-my_points[0].get_y());
70 //new vector from one to the other node - b
71 xy<double> b_v(p[1].get_x()-p[0].get_x(),p[1].get_y()-p[0].get_y());
73 double absa=sqrt(a_v.normSquare());
74 double absb=sqrt(b_v.normSquare());
76 //old vector from one node to the breakpoint - c
77 xy<double> c_v(my_points[1].get_x()-my_points[0].get_x(),my_points[1].get_y()-my_points[0].get_y());
79 //unit vector with the same direction to a_v
80 xy<double> a_v_u(a_v.x/absa,a_v.y/absa);
82 //normal vector of unit vector with the same direction to a_v
83 xy<double> a_v_u_n(((-1)*a_v_u.y),a_v_u.x);
85 //unit vector with the same direction to b_v
86 xy<double> b_v_u(b_v.x/absb,b_v.y/absb);
88 //normal vector of unit vector with the same direction to b_v
89 xy<double> b_v_u_n(((-1)*b_v_u.y),b_v_u.x);
91 //vector c in a_v_u and a_v_u_n co-ordinate system
92 xy<double> c_a(c_v*a_v_u,c_v*a_v_u_n);
94 //new vector from one node to the breakpoint - d - we have to calculate this one
95 xy<double> d_v=absb/absa*(c_a.x*b_v_u+c_a.y*b_v_u_n);
97 my_points[1]=Gnome::Art::Point(d_v.x+p[0].get_x(),d_v.y+p[0].get_y());
102 Gnome::Canvas::Points points;
105 points.push_back(my_points[i]);
107 property_points().set_value(points);
112 //calculating coordinates of the direction indicator arrow
114 xy<gdouble> target( my_points[2].get_x(), my_points[2].get_y() );
115 xy<gdouble> center( my_points[1].get_x(), my_points[1].get_y() );
117 xy<gdouble> unit_vector_in_dir(target-center);
118 // std::cout << target << " - " << center << " = " << unit_vector_in_dir << " / " <<unit_vector_in_dir.normSquare() ;
119 unit_vector_in_dir/=sqrt( unit_vector_in_dir.normSquare() );
120 // std::cout << " = " << unit_vector_in_dir << std::endl;
122 xy<gdouble> unit_norm_vector(0-unit_vector_in_dir.y, unit_vector_in_dir.x);
123 // std::cout << unit_norm_vector << std::endl;
128 // - - // c(enter)l(eft), ccl, ccr, cr
130 // || // b(ottom)l, br
135 xy<gdouble> bl (center - unit_vector_in_dir * 3 * size + unit_norm_vector * size );
136 xy<gdouble> br (center - unit_vector_in_dir * 3 * size - unit_norm_vector * size );
137 xy<gdouble> ccl(center + unit_vector_in_dir * size + unit_norm_vector * size );
138 xy<gdouble> ccr(center + unit_vector_in_dir * size - unit_norm_vector * size );
139 xy<gdouble> cl (center + unit_vector_in_dir * size + unit_norm_vector * 2 * size );
140 xy<gdouble> cr (center + unit_vector_in_dir * size - unit_norm_vector * 2 * size );
141 xy<gdouble> top(center + unit_vector_in_dir * 3 * size);
143 // std::cout << bl << " " << br << " " << ccl << " " << ccr << " " << cl << " " << cr << " " << top << std::endl;
145 Gnome::Canvas::Points arrow_points;
146 arrow_points.push_back(Gnome::Art::Point( bl.x , bl.y ) );
147 arrow_points.push_back(Gnome::Art::Point( br.x , br.y ) );
148 arrow_points.push_back(Gnome::Art::Point( ccr.x, ccr.y ) );
149 arrow_points.push_back(Gnome::Art::Point( cr.x , cr.y ) );
150 arrow_points.push_back(Gnome::Art::Point( top.x, top.y ) );
151 arrow_points.push_back(Gnome::Art::Point( cl.x , cl.y ) );
152 arrow_points.push_back(Gnome::Art::Point( ccl.x, ccl.y ) );
154 arrow->property_points().set_value(arrow_points);
158 bool GraphDisplayerCanvas::BrokenEdge::edgeFormerEventHandler(GdkEvent* e)
162 case GDK_BUTTON_PRESS:
163 //we mark the location of the event to be able to calculate parameters of dragging
164 if(gdc.getActualTool()!=CREATE_NODE)
166 gdc.toggleEdgeActivity(this, true);
167 clicked_x=e->button.x;
168 clicked_y=e->button.y;
172 case GDK_BUTTON_RELEASE:
173 if(gdc.getActualTool()!=CREATE_NODE)
175 gdc.toggleEdgeActivity(this, false);
179 case GDK_MOTION_NOTIFY:
180 //we only have to do sg. if the mouse button is pressed
183 //new coordinates will be the old values,
184 //because the item will be moved to the
185 //new coordinate therefore the new movement
186 //has to be calculated from here
188 double dx=e->motion.x-clicked_x;
189 double dy=e->motion.y-clicked_y;
191 Gnome::Canvas::Points points_new;
193 points_new.push_back(my_points[0]);
194 points_new.push_back(my_points[1]=Gnome::Art::Point(my_points[1].get_x()+dx,my_points[1].get_y()+dy));
195 points_new.push_back(my_points[2]);
197 setPoints(points_new);
198 gdc.textReposition(xy<double>(my_points[1].get_x(),my_points[1].get_y()));
200 clicked_x=e->motion.x;
201 clicked_y=e->motion.y;
210 xy<double> GraphDisplayerCanvas::BrokenEdge::getArrowPos()
212 xy<double> ret_val(my_points[1].get_x(),my_points[1].get_y());