COIN-OR::LEMON - Graph Library

source: lemon-0.x/gui/gdc-broken_edge.cc @ 1978:ef2d00e46897

Last change on this file since 1978:ef2d00e46897 was 1860:27a9a75b957b, checked in by Akos Ladanyi, 18 years ago

Save and load the coordinates of the arrows on the edges.

File size: 4.3 KB
Line 
1#include "graph_displayer_canvas.h"
2#include <cmath>
3
4GraphDisplayerCanvas::BrokenEdge::BrokenEdge(Gnome::Canvas::Group & g, Edge _edge, GraphDisplayerCanvas & gc) : Line(g), edge(_edge), gdc(gc), isbutton(false)
5{
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();
10  draw();
11}
12
13GraphDisplayerCanvas::BrokenEdge::~BrokenEdge()
14{
15  if(arrow)delete(arrow);
16}
17
18void GraphDisplayerCanvas::BrokenEdge::draw()
19{
20  MapStorage& ms = gdc.mytab.mapstorage;
21
22  // update the edge
23  {
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);
34  }
35
36  // update the arrow
37  {
38    //calculating coordinates of the direction indicator arrow
39    XY target(ms.coords[ms.graph.target(edge)]);
40    XY center(ms.arrow_pos[edge]);
41
42    XY unit_vector_in_dir(target-center);
43    double length=sqrt( unit_vector_in_dir.normSquare() );
44
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;
48
49    XY unit_norm_vector(0-unit_vector_in_dir.y, unit_vector_in_dir.x);
50    //       std::cout << unit_norm_vector << std::endl;
51
52    {     
53      //       /\       // top
54      //      /  \      //
55      //      -  -      // c(enter)l(eft), ccl, ccr, cr
56      //       ||       //
57      //       ||       // b(ottom)l, br
58    }
59
60    double size=3;
61
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);
69
70    //std::cout << bl << " " << br << " " << ccl << " "  << ccr << " " << cl << " " << cr << " " << top << std::endl;
71
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 ) );
80
81    arrow->property_points().set_value(arrow_points);
82  }
83}
84
85bool GraphDisplayerCanvas::BrokenEdge::edgeFormerEventHandler(GdkEvent* e)
86{
87  switch(e->type)
88    {
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)
92        {
93          gdc.toggleEdgeActivity(this, true);
94          clicked_x=e->button.x;
95          clicked_y=e->button.y;
96          isbutton=true;
97        }
98      break;
99    case GDK_BUTTON_RELEASE:
100      if(gdc.getActualTool()!=CREATE_NODE)
101        {
102          gdc.toggleEdgeActivity(this, false);
103          isbutton=false;
104        }
105      break;
106    case GDK_MOTION_NOTIFY:
107      //we only have to do sg. if the mouse button is pressed
108      if(isbutton)
109        {
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
114
115          double dx=e->motion.x-clicked_x;
116          double dy=e->motion.y-clicked_y;
117
118          Gnome::Canvas::Points points_new;
119
120          gdc.mytab.mapstorage.arrow_pos.set(edge, gdc.mytab.mapstorage.arrow_pos[edge] + XY(dx, dy));
121
122          draw();
123          gdc.textReposition(gdc.mytab.mapstorage.arrow_pos[edge]);
124
125          clicked_x=e->motion.x;
126          clicked_y=e->motion.y;
127
128        }
129    default: break;
130    }
131
132  return true;
133}
Note: See TracBrowser for help on using the repository browser.