The graph adadptors can be alteration observed.
In most cases it uses the adapted graph alteration notifiers.
Only special case is now the UndirGraphAdaptor, where
we have to proxy the signals from the graph.
The SubBidirGraphAdaptor is removed, because it doest not
gives more feature than the EdgeSubGraphAdaptor<UndirGraphAdaptor<Graph>>.
The ResGraphAdaptor is based on this composition.
1 #include "graph_displayer_canvas.h"
4 GraphDisplayerCanvas::BrokenEdge::BrokenEdge(Gnome::Canvas::Group & g, Edge _edge, GraphDisplayerCanvas & gc) : Line(g), edge(_edge), gdc(gc), isbutton(false)
6 arrow=new Gnome::Canvas::Polygon(g);
7 *arrow << Gnome::Canvas::Properties::fill_color("red");
8 arrow->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::BrokenEdge::edgeFormerEventHandler));
9 arrow->lower_to_bottom();
13 GraphDisplayerCanvas::BrokenEdge::~BrokenEdge()
15 if(arrow)delete(arrow);
18 void GraphDisplayerCanvas::BrokenEdge::draw()
20 MapStorage& ms = gdc.mytab.mapstorage;
24 Gnome::Canvas::Points points;
25 Node source = ms.graph.source(edge);
26 Node target = ms.graph.target(edge);
27 points.push_back(Gnome::Art::Point(ms.coords[source].x,
28 ms.coords[source].y));
29 points.push_back(Gnome::Art::Point(ms.arrow_pos[edge].x,
30 ms.arrow_pos[edge].y));
31 points.push_back(Gnome::Art::Point(ms.coords[target].x,
32 ms.coords[target].y));
33 property_points().set_value(points);
38 //calculating coordinates of the direction indicator arrow
39 XY target(ms.coords[ms.graph.target(edge)]);
40 XY center(ms.arrow_pos[edge]);
42 XY unit_vector_in_dir(target-center);
43 double length=sqrt( unit_vector_in_dir.normSquare() );
45 // std::cout << target << " - " << center << " = " << unit_vector_in_dir << " / " <<unit_vector_in_dir.normSquare() ;
46 unit_vector_in_dir/=length;
47 // std::cout << " = " << unit_vector_in_dir << std::endl;
49 XY unit_norm_vector(0-unit_vector_in_dir.y, unit_vector_in_dir.x);
50 // std::cout << unit_norm_vector << std::endl;
55 // - - // c(enter)l(eft), ccl, ccr, cr
57 // || // b(ottom)l, br
62 XY bl (center - unit_vector_in_dir * 3 * size + unit_norm_vector * size );
63 XY br (center - unit_vector_in_dir * 3 * size - unit_norm_vector * size );
64 XY ccl(center + unit_vector_in_dir * size + unit_norm_vector * size );
65 XY ccr(center + unit_vector_in_dir * size - unit_norm_vector * size );
66 XY cl (center + unit_vector_in_dir * size + unit_norm_vector * 2 * size );
67 XY cr (center + unit_vector_in_dir * size - unit_norm_vector * 2 * size );
68 XY top(center + unit_vector_in_dir * 3 * size);
70 //std::cout << bl << " " << br << " " << ccl << " " << ccr << " " << cl << " " << cr << " " << top << std::endl;
72 Gnome::Canvas::Points arrow_points;
73 arrow_points.push_back(Gnome::Art::Point( bl.x , bl.y ) );
74 arrow_points.push_back(Gnome::Art::Point( br.x , br.y ) );
75 arrow_points.push_back(Gnome::Art::Point( ccr.x, ccr.y ) );
76 arrow_points.push_back(Gnome::Art::Point( cr.x , cr.y ) );
77 arrow_points.push_back(Gnome::Art::Point( top.x, top.y ) );
78 arrow_points.push_back(Gnome::Art::Point( cl.x , cl.y ) );
79 arrow_points.push_back(Gnome::Art::Point( ccl.x, ccl.y ) );
81 arrow->property_points().set_value(arrow_points);
85 bool GraphDisplayerCanvas::BrokenEdge::edgeFormerEventHandler(GdkEvent* e)
89 case GDK_BUTTON_PRESS:
90 //we mark the location of the event to be able to calculate parameters of dragging
91 if(gdc.getActualTool()!=CREATE_NODE)
93 gdc.toggleEdgeActivity(this, true);
94 clicked_x=e->button.x;
95 clicked_y=e->button.y;
99 case GDK_BUTTON_RELEASE:
100 if(gdc.getActualTool()!=CREATE_NODE)
102 gdc.toggleEdgeActivity(this, false);
106 case GDK_MOTION_NOTIFY:
107 //we only have to do sg. if the mouse button is pressed
110 //new coordinates will be the old values,
111 //because the item will be moved to the
112 //new coordinate therefore the new movement
113 //has to be calculated from here
115 double dx=e->motion.x-clicked_x;
116 double dy=e->motion.y-clicked_y;
118 Gnome::Canvas::Points points_new;
120 gdc.mytab.mapstorage.arrow_pos.set(edge, gdc.mytab.mapstorage.arrow_pos[edge] + XY(dx, dy));
123 gdc.textReposition(gdc.mytab.mapstorage.arrow_pos[edge]);
125 clicked_x=e->motion.x;
126 clicked_y=e->motion.y;