COIN-OR::LEMON - Graph Library

source: glemon-0.x/graph_displayer_canvas.cc @ 156:c5cdf6690cdf

Last change on this file since 156:c5cdf6690cdf was 156:c5cdf6690cdf, checked in by Hegyi Péter, 18 years ago

Zoom tracking of nodes is implemented and is switchable.

  • Property exe set to *
File size: 6.0 KB
RevLine 
[53]1#include "graph_displayer_canvas.h"
[59]2#include <cmath>
[6]3
[96]4GraphDisplayerCanvas::GraphDisplayerCanvas(NoteBookTab & mainw) :
[94]5  nodesmap(mainw.mapstorage.graph), edgesmap(mainw.mapstorage.graph), edgetextmap(mainw.mapstorage.graph),
6  nodetextmap(mainw.mapstorage.graph), displayed_graph(*(root()), 0, 0),
[66]7  isbutton(0), active_item(NULL), target_item(NULL), nodemap_to_edit(""),
[156]8  edgemap_to_edit(""), autoscale(true), zoomtrack(false), radius_min(10), radius_max(40), radius_unit(1), mytab(mainw)
[6]9{
[53]10  //base event handler is move tool
11  actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::moveEventHandler), false);
12  actual_tool=MOVE;
[34]13
[53]14  active_node=INVALID;
15  active_edge=INVALID;
16  forming_edge=INVALID;
17}
[9]18
[53]19GraphDisplayerCanvas::~GraphDisplayerCanvas()
20{
[96]21  for (NodeIt n((mytab.mapstorage).graph); n != INVALID; ++n)
[94]22    {
23      delete nodesmap[n];
24      delete nodetextmap[n];
25    }
26 
[96]27  for (EdgeIt e((mytab.mapstorage).graph); e != INVALID; ++e)
[94]28    {
29      delete edgesmap[e];
30      delete edgetextmap[e];
31    }
32}
[6]33
[94]34void GraphDisplayerCanvas::propertyChange(bool itisedge, int prop)
35{
36  if(itisedge)
37    {
38      propertyUpdate(Edge(INVALID), prop);
39    }
40  else
41    {
42      propertyUpdate(Node(INVALID), prop);
43    }
44}
45
46void GraphDisplayerCanvas::propertyUpdate(Edge edge)
47{
48  for(int i=0;i<EDGE_PROPERTY_NUM;i++)
49    {
50      propertyUpdate(edge, i);
51    }
52}
53
54void GraphDisplayerCanvas::propertyUpdate(Node node)
55{
56  for(int i=0;i<NODE_PROPERTY_NUM;i++)
57    {
58      propertyUpdate(node, i);
59    }
60}
61
[118]62void GraphDisplayerCanvas::propertyUpdate(Node node, int prop)
[94]63{
[118]64  //dummy=dummy;
[94]65
[96]66  std::string mapname=mytab.getActiveNodeMap(prop);
[94]67
68  if(mapname!="")
69    {
[96]70      if( ( ((mytab.mapstorage).nodemap_storage).find(mapname) != ((mytab.mapstorage).nodemap_storage).end() ) )
[94]71        {
72          switch(prop)
73            {
74            case N_RADIUS:
75              changeNodeRadius(mapname, node);
76              break;
77            case N_COLOR:
78              changeNodeColor(mapname, node);
79              break;
80            case N_TEXT:
81              changeNodeText(mapname, node);
82              break;
83            default:
84              std::cerr<<"Error\n";
85            }
86        }
87    }
88  else //mapname==""
89    {
90      Node node=INVALID;       
91      switch(prop)
92        {
93        case N_RADIUS:
94          resetNodeRadius(node);
95          break;
96        case N_COLOR:
97          resetNodeColor(node);
98          break;
99        case N_TEXT:
100          resetNodeText(node);
101          break;
102        default:
103          std::cerr<<"Error\n";
104        }
105    }
106
107}
108
[118]109void GraphDisplayerCanvas::propertyUpdate(Edge edge, int prop)
[94]110{
[118]111  //dummy=dummy;
[94]112
[96]113  std::string mapname=mytab.getActiveEdgeMap(prop);
[94]114
115  if(mapname!="")
116    {
[96]117      if( ( ((mytab.mapstorage).edgemap_storage).find(mapname) != ((mytab.mapstorage).edgemap_storage).end() ) )
[94]118        {
119          switch(prop)
120            {
121            case E_WIDTH:
122              changeEdgeWidth(mapname, edge);
123              break;
124            case E_COLOR:
125              changeEdgeColor(mapname, edge);
126              break;
127            case E_TEXT:
128              changeEdgeText(mapname, edge);
129              break;
130            default:
131              std::cerr<<"Error\n";
132            }
133        }
134    }
135  else //mapname==""
136    {
137      switch(prop)
138        {
139        case E_WIDTH:
140          resetEdgeWidth(edge);
141          break;
142        case E_COLOR:
143          resetEdgeColor(edge);
144          break;
145        case E_TEXT:
146          resetEdgeText(edge);
147          break;
148        default:
149          std::cerr<<"Error\n";
150        }
151    }
[53]152}
153
154void GraphDisplayerCanvas::drawGraph()
155{
[6]156  //first edges are drawn, to hide joining with nodes later
157
[96]158  for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
[6]159  {
[151]160    if (mytab.mapstorage.graph.source(i) == mytab.mapstorage.graph.target(i))
161    {
162      edgesmap[i]=new LoopEdge(displayed_graph, i, *this);
163    }
164    else
165    {
166      edgesmap[i]=new BrokenEdge(displayed_graph, i, *this);
167    }
[6]168    //initializing edge-text as well, to empty string
169
[98]170    XY text_pos=mytab.mapstorage.arrow_pos[i];
171    text_pos+=(XY(10,10));
[25]172
173    edgetextmap[i]=new Gnome::Canvas::Text(displayed_graph, text_pos.x, text_pos.y, "");
[28]174    edgetextmap[i]->property_fill_color().set_value("darkgreen");
[149]175    edgetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::mapEditEventHandler), false);
[63]176    edgetextmap[i]->raise_to_top();
[6]177  }
178
179  //afterwards nodes come to be drawn
180
[96]181  for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
[6]182  {
183    //drawing bule nodes, with black line around them
184
[53]185    nodesmap[i]=new Gnome::Canvas::Ellipse(
186        displayed_graph,
[96]187        (mytab.mapstorage).coords[i].x-20,
188        (mytab.mapstorage).coords[i].y-20,
189        (mytab.mapstorage).coords[i].x+20,
190        (mytab.mapstorage).coords[i].y+20);
[6]191    *(nodesmap[i]) << Gnome::Canvas::Properties::fill_color("blue");
192    *(nodesmap[i]) << Gnome::Canvas::Properties::outline_color("black");
[63]193    nodesmap[i]->raise_to_top();
[28]194
195    //initializing edge-text as well, to empty string
196
[150]197    XY text_pos(
[96]198        ((mytab.mapstorage).coords[i].x+node_property_defaults[N_RADIUS]+5),
199        ((mytab.mapstorage).coords[i].y+node_property_defaults[N_RADIUS]+5));
[28]200
[53]201    nodetextmap[i]=new Gnome::Canvas::Text(displayed_graph,
202        text_pos.x, text_pos.y, "");
[28]203    nodetextmap[i]->property_fill_color().set_value("darkblue");
[149]204    nodetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::mapEditEventHandler), false);
[63]205    nodetextmap[i]->raise_to_top();
[6]206  }
207
208  updateScrollRegion();
209}
210
[53]211void GraphDisplayerCanvas::clear()
[6]212{
[53]213  active_node=INVALID;
214  active_edge=INVALID;
215  forming_edge=INVALID;
[6]216
[96]217  for (NodeIt n((mytab.mapstorage).graph); n != INVALID; ++n)
[6]218  {
[53]219    delete nodesmap[n];
220    delete nodetextmap[n];
[6]221  }
222
[96]223  for (EdgeIt e((mytab.mapstorage).graph); e != INVALID; ++e)
[53]224  {
225    delete edgesmap[e];
226    delete edgetextmap[e];
227  }
[6]228}
[154]229
[156]230void GraphDisplayerCanvas::setNodeView(bool autoscale_p, bool zoomtrack_p, double min_p, double max_p, double unit_p)
[154]231{
232  autoscale=autoscale_p;
233  radius_min=min_p;
234  radius_max=max_p;
235  radius_unit=unit_p;
[156]236
237  if((!zoomtrack) && zoomtrack_p)
238    {
239      fixed_zoom_factor=get_pixels_per_unit();
240    }
241
242  zoomtrack=zoomtrack_p;
243
[154]244  propertyChange(false, N_RADIUS);
245}
246
[156]247void GraphDisplayerCanvas::getNodeView(bool & autoscale_p, bool & zoomtrack_p, double& min_p, double& max_p, double& unit_p)
[154]248{
249  autoscale_p=autoscale;
[156]250  zoomtrack_p=zoomtrack;
[154]251  min_p=radius_min;
252  max_p=radius_max;
253  unit_p=radius_unit;
254}
Note: See TracBrowser for help on using the repository browser.