COIN-OR::LEMON - Graph Library

source: glemon-0.x/graph_displayer_canvas-event.cc @ 92:ee2bd58fdc30

gui
Last change on this file since 92:ee2bd58fdc30 was 92:ee2bd58fdc30, checked in by Akos Ladanyi, 18 years ago

clean-up

  • Property exe set to *
File size: 23.5 KB
RevLine 
[53]1#include "graph_displayer_canvas.h"
[59]2#include <cmath>
[27]3
4
5bool GraphDisplayerCanvas::on_expose_event(GdkEventExpose *event)
6{
7  Gnome::Canvas::CanvasAA::on_expose_event(event);
8  //usleep(10000);
9  //rezoom();
10  return true;
11}
12
13void GraphDisplayerCanvas::changeEditorialTool(int newtool)
14{
[34]15  if(actual_tool!=newtool)
16    {
[27]17
[34]18      actual_handler.disconnect();
[27]19
[34]20      switch(actual_tool)
21        {
22        case CREATE_EDGE:
23          {
24            GdkEvent * generated=new GdkEvent();
25            generated->type=GDK_BUTTON_RELEASE;
26            generated->button.button=3;
27            createEdgeEventHandler(generated);     
28            break;
29          }
30        case EDGE_MAP_EDIT:
[35]31          //has to do the same thing as in the case of NODE_MAP_EDIT
32        case NODE_MAP_EDIT:
33          {
34            break;
35          }
[34]36        default:
37          break;
38        }
[27]39
[34]40      active_item=NULL;
41      target_item=NULL;
42      active_edge=INVALID;     
43      active_node=INVALID;     
[33]44
[27]45
[34]46      actual_tool=newtool;
47 
48      switch(newtool)
49        {
50        case MOVE:
51          actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::moveEventHandler), false);
52          break;
[27]53
[34]54        case CREATE_NODE:
55          actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::createNodeEventHandler), false);
56          break;
[27]57
[34]58        case CREATE_EDGE:
59          actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::createEdgeEventHandler), false);
60          break;
[27]61
[34]62        case ERASER:
63          actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::eraserEventHandler), false);
64          break;
[32]65
[34]66        case EDGE_MAP_EDIT:
67          grab_focus();
68          actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::edgeMapEditEventHandler), false);
69          break;
[32]70
[34]71        case NODE_MAP_EDIT:
72          actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::nodeMapEditEventHandler), false);
73          break;
74
75        default:
76          break;
77        }
[27]78    }
79}
80
[30]81int GraphDisplayerCanvas::getActualTool()
[27]82{
83  return actual_tool;
84}
85
[30]86bool GraphDisplayerCanvas::moveEventHandler(GdkEvent* e)
[27]87{
[70]88  static Gnome::Canvas::Text *coord_text = 0;
[27]89  switch(e->type)
90  {
91    case GDK_BUTTON_PRESS:
92      //we mark the location of the event to be able to calculate parameters of dragging
[31]93      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
94
95      active_item=(get_item_at(clicked_x, clicked_y));
[27]96      active_node=INVALID;
[53]97      for (NodeIt i(mapstorage.graph); i!=INVALID; ++i)
[27]98        {
99          if(nodesmap[i]==active_item)
100            {
101              active_node=i;
102            }
103        }
104      switch(e->button.button)
105        {
106        case 3:     
107          isbutton=3;
108          break;
109        default:
110          isbutton=1;
111          break;
112        }
113      break;
114    case GDK_BUTTON_RELEASE:
[70]115      if (coord_text)
116      {
117        delete coord_text;
118        coord_text = 0;
119      }
[27]120      isbutton=0;
121      active_item=NULL;
122      active_node=INVALID;
123      break;
124    case GDK_MOTION_NOTIFY:
125      //we only have to do sg. if the mouse button is pressed AND the click was on a node that was found in the set of nodes
126      if(active_node!=INVALID)
127      {
[53]128        mapstorage.modified = true;
[70]129
[27]130        //new coordinates will be the old values,
131        //because the item will be moved to the
132        //new coordinate therefore the new movement
133        //has to be calculated from here
134
[31]135        double new_x, new_y;
136
137        window_to_world (e->motion.x, e->motion.y, new_x, new_y);
138
139        double dx=new_x-clicked_x;
140        double dy=new_y-clicked_y;
[27]141
[28]142        //repositioning node and its text
[27]143        active_item->move(dx, dy);
[28]144        nodetextmap[active_node]->move(dx, dy);
[27]145
[70]146        // the new coordinates of the centre of the node
147        double coord_x = new_x - (clicked_x - mapstorage.coords[active_node].x);
148        double coord_y = new_y - (clicked_y - mapstorage.coords[active_node].y);
149
[31]150        clicked_x=new_x;
151        clicked_y=new_y;
[27]152
[70]153        // write back the new coordinates to the coords map
154        mapstorage.coords.set(active_node, xy<double>(coord_x, coord_y));
[27]155
[70]156        // reposition the coordinates text
157        std::ostringstream ostr;
158        ostr << "(" <<
159          mapstorage.coords[active_node].x << ", " <<
160          mapstorage.coords[active_node].y << ")";
[72]161        double radius =
162          (nodesmap[active_node]->property_x2().get_value() -
163          nodesmap[active_node]->property_x1().get_value()) / 2.0;
[70]164        if (coord_text)
165        {
166          coord_text->property_text().set_value(ostr.str());
167          coord_text->property_x().set_value(mapstorage.coords[active_node].x +
[72]168              radius);
169          coord_text->property_y().set_value(mapstorage.coords[active_node].y -
170              radius);
[70]171        }
172        else
173        {
174          coord_text = new Gnome::Canvas::Text(
175              displayed_graph,
[72]176              mapstorage.coords[active_node].x + radius,
177              mapstorage.coords[active_node].y - radius,
[70]178              ostr.str());
179          coord_text->property_fill_color().set_value("black");
[72]180          coord_text->property_anchor().set_value(Gtk::ANCHOR_SOUTH_WEST);
[70]181        }
182
183        //all the edges connected to the moved point has to be redrawn
[69]184        for(OutEdgeIt ei(mapstorage.graph,active_node);ei!=INVALID;++ei)
[27]185        {
186            Gnome::Canvas::Points coos;
187            double x1, x2, y1, y2;
188
[53]189            nodesmap[mapstorage.graph.source(ei)]->get_bounds(x1, y1, x2, y2);
[27]190            coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
191
[53]192            nodesmap[mapstorage.graph.target(ei)]->get_bounds(x1, y1, x2, y2);
[27]193            coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
194
195            if(isbutton==3)
196              {
[30]197                edgesmap[ei]->setPoints(coos);
[27]198              }
199            else
200              {
[30]201                edgesmap[ei]->setPoints(coos,true);
[27]202              }
203
[28]204            //reposition of edgetext
[30]205            xy<double> text_pos=edgesmap[ei]->getArrowPos();
[27]206            text_pos+=(xy<double>(10,10));
207            edgetextmap[ei]->property_x().set_value(text_pos.x);
208            edgetextmap[ei]->property_y().set_value(text_pos.y);
209        }
210
[69]211        for(InEdgeIt ei(mapstorage.graph,active_node);ei!=INVALID;++ei)
[27]212        {
213            Gnome::Canvas::Points coos;
214            double x1, x2, y1, y2;
215
[53]216            nodesmap[mapstorage.graph.source(ei)]->get_bounds(x1, y1, x2, y2);
[27]217            coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
218
[53]219            nodesmap[mapstorage.graph.target(ei)]->get_bounds(x1, y1, x2, y2);
[27]220            coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
221
222            if(isbutton==3)
223              {
[30]224                edgesmap[ei]->setPoints(coos);
[27]225              }
226            else
227              {
[30]228                edgesmap[ei]->setPoints(coos,true);
[27]229              }
230
[30]231            xy<double> text_pos=edgesmap[ei]->getArrowPos();
[27]232            text_pos+=(xy<double>(10,10));
233            edgetextmap[ei]->property_x().set_value(text_pos.x);
234            edgetextmap[ei]->property_y().set_value(text_pos.y);
235        }
236      }
237    default: break;
238  }
239
[31]240  return false;
[27]241}
242
[30]243bool GraphDisplayerCanvas::createNodeEventHandler(GdkEvent* e)
[27]244{
245  switch(e->type)
[63]246  {
247    //move the new node
248    case GDK_MOTION_NOTIFY:
249      {
250        GdkEvent * generated=new GdkEvent();
251        generated->motion.x=e->motion.x;
252        generated->motion.y=e->motion.y;
253        generated->type=GDK_MOTION_NOTIFY;
254        moveEventHandler(generated);     
255        break;
256      }
[27]257
[63]258    case GDK_BUTTON_RELEASE:
[53]259      mapstorage.modified = true;
260
[27]261      isbutton=1;
262
[62]263      active_node=mapstorage.graph.addNode();
[27]264
265      //initiating values corresponding to new node in maps
266
267      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
268
[63]269      // update coordinates
[53]270      mapstorage.coords.set(active_node, xy<double>(clicked_x, clicked_y));
[63]271
272      // update all other maps
273      for (std::map<std::string, Graph::NodeMap<double>*>::const_iterator it =
274          mapstorage.nodemap_storage.begin(); it !=
275          mapstorage.nodemap_storage.end(); ++it)
276      {
[64]277        if ((it->first != "coordinates_x") &&
278            (it->first != "coordinates_y"))
[63]279        {
280          (*(it->second))[active_node] =
281            mapstorage.nodemap_default[it->first];
282        }
283      }
[64]284      // increment the id map's default value
285      mapstorage.nodemap_default["id"] += 1.0;
[63]286
[53]287      nodesmap[active_node]=new Gnome::Canvas::Ellipse(displayed_graph,
[63]288          clicked_x-20, clicked_y-20, clicked_x+20, clicked_y+20);
[27]289      active_item=(Gnome::Canvas::Item *)(nodesmap[active_node]);
[63]290      *(nodesmap[active_node]) <<
291        Gnome::Canvas::Properties::fill_color("blue");
292      *(nodesmap[active_node]) <<
293        Gnome::Canvas::Properties::outline_color("black");
294      active_item->raise_to_top();
295
[27]296      (nodesmap[active_node])->show();
[28]297
[53]298      nodetextmap[active_node]=new Gnome::Canvas::Text(displayed_graph,
[63]299          clicked_x+node_property_defaults[N_RADIUS]+5,
300          clicked_y+node_property_defaults[N_RADIUS]+5, "");
[28]301      nodetextmap[active_node]->property_fill_color().set_value("darkblue");
[63]302      nodetextmap[active_node]->raise_to_top();
[28]303
[53]304      mapwin.updateNode(active_node);
[28]305
[27]306      isbutton=0;
[31]307      target_item=NULL;
[27]308      active_item=NULL;
309      active_node=INVALID;
310      break;
311    default:
312      break;
[63]313  }
[27]314  return false;
315}
316
[30]317bool GraphDisplayerCanvas::createEdgeEventHandler(GdkEvent* e)
[27]318{
319  switch(e->type)
[63]320  {
[27]321    case GDK_BUTTON_PRESS:
322      //in edge creation right button has special meaning
323      if(e->button.button!=3)
[63]324      {
325        //there is not yet selected node
326        if(active_node==INVALID)
327        {
328          //we mark the location of the event to be able to calculate parameters of dragging
[31]329
[63]330          window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
[31]331
[63]332          active_item=(get_item_at(clicked_x, clicked_y));
333          active_node=INVALID;
334          for (NodeIt i(mapstorage.graph); i!=INVALID; ++i)
335          {
336            if(nodesmap[i]==active_item)
337            {
338              active_node=i;
339            }
340          }
341          //the clicked item is really a node
342          if(active_node!=INVALID)
343          {
344            *(nodesmap[active_node]) << Gnome::Canvas::Properties::fill_color("red");
345            isbutton=1;
346          }
347          //clicked item was not a node. It could be e.g. edge.
348          else
349          {
350            active_item=NULL;
351          }
352        }
353        //we only have to do sg. if the mouse button
354        // is pressed already once AND the click was
355        // on a node that was found in the set of
356        //nodes, and now we only search for the second
357        //node
358        else
359        {
360          window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
361          target_item=(get_item_at(clicked_x, clicked_y));
362          Node target_node=INVALID;
363          for (NodeIt i(mapstorage.graph); i!=INVALID; ++i)
364          {
365            if(nodesmap[i]==target_item)
366            {
367              target_node=i;
368            }
369          }
370          //the clicked item is a node, the edge can be drawn
371          if(target_node!=INVALID)
372          {
373            if(target_node!=active_node)               
374            {
375              mapstorage.modified = true;
[53]376
[63]377              *(nodesmap[target_node]) <<
378                Gnome::Canvas::Properties::fill_color("red");
[27]379
[63]380              //creating new edge
381              active_edge=mapstorage.graph.addEdge(active_node,
382                  target_node);
[27]383
[64]384              // update maps
[63]385              for (std::map<std::string,
386                  Graph::EdgeMap<double>*>::const_iterator it =
387                  mapstorage.edgemap_storage.begin(); it !=
388                  mapstorage.edgemap_storage.end(); ++it)
389              {
[64]390                (*(it->second))[active_edge] =
391                  mapstorage.edgemap_default[it->first];
[63]392              }
[64]393              // increment the id map's default value
394              mapstorage.edgemap_default["id"] += 1.0;
[27]395
[63]396              //calculating coordinates of new edge
397              Gnome::Canvas::Points coos;
398              double x1, x2, y1, y2;
[27]399
[63]400              active_item->get_bounds(x1, y1, x2, y2);
401              coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
[27]402
[63]403              target_item->get_bounds(x1, y1, x2, y2);
404              coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
[27]405
[63]406              //drawing new edge
407              edgesmap[active_edge]=new BrokenEdge(displayed_graph, coos,
408                  *this);
409              *(edgesmap[active_edge]) <<
410                Gnome::Canvas::Properties::fill_color("green");
411              edgesmap[active_edge]->property_width_pixels().set_value(10);
[27]412
[63]413              edgesmap[active_edge]->lower_to_bottom();
[28]414
[63]415              //initializing edge-text as well, to empty string
416              xy<double> text_pos=edgesmap[active_edge]->getArrowPos();
417              text_pos+=(xy<double>(10,10));
418
419              edgetextmap[active_edge]=new Gnome::Canvas::Text(displayed_graph,
420                  text_pos.x, text_pos.y, "");
421              edgetextmap[active_edge]->property_fill_color().set_value(
422                  "darkgreen");
423              edgetextmap[active_edge]->raise_to_top();
424
425              //updating its properties
426              mapwin.updateEdge(active_edge);
427            }
428            else
429            {
430              target_node=INVALID;
431              std::cerr << "Loop edge is not yet implemented!" << std::endl;
432            }
433          }
434          //clicked item was not a node. it could be an e.g. edge. we do not
435          //deal with it furthermore.
436          else
437          {
438            target_item=NULL;
439          }
440        }
441      }
[27]442      break;
443    case GDK_BUTTON_RELEASE:
444      isbutton=0;
445      //we clear settings in two cases
446      //1: the edge is ready (target_item has valid value)
447      //2: the edge creation is cancelled with right button
448      if((target_item)||(e->button.button==3))
[63]449      {
450        if(active_item)
451        {
452          *active_item << Gnome::Canvas::Properties::fill_color("blue");
453          active_item=NULL;
454        }
455        if(target_item)
456        {
457          *target_item << Gnome::Canvas::Properties::fill_color("blue");
458          target_item=NULL;
459        }
460        active_node=INVALID;
461        active_edge=INVALID;
462      }
[27]463      break;
464    default:
465      break;
[63]466  }
[27]467  return false;
468}
469
[30]470bool GraphDisplayerCanvas::eraserEventHandler(GdkEvent* e)
[27]471{
472  switch(e->type)
473    {
474    case GDK_BUTTON_PRESS:
[43]475      //finding the clicked items
[31]476      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
477      active_item=(get_item_at(clicked_x, clicked_y));
[27]478      active_node=INVALID;
479      active_edge=INVALID;
[43]480      //was it a node?
[53]481      for (NodeIt i(mapstorage.graph); i!=INVALID; ++i)
[27]482        {
483          if(nodesmap[i]==active_item)
484            {
485              active_node=i;
486            }
487        }
[43]488      //or was it an edge?
[27]489      if(active_node==INVALID)
490        {
[53]491          for (EdgeIt i(mapstorage.graph); i!=INVALID; ++i)
[27]492            {
493              if(edgesmap[i]==active_item)
494                {
495                  active_edge=i;
496                }
497            }
498        }
[43]499
500      //recolor activated item
[31]501      if(active_item)
502        {
503          *active_item << Gnome::Canvas::Properties::fill_color("red");
504        }
[27]505      break;
506
507    case GDK_BUTTON_RELEASE:
[31]508      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
509      if(active_item)
[27]510        {
[43]511          //the cursor was not moved since pressing it
[31]512          if( active_item == ( get_item_at (clicked_x, clicked_y) ) )
[27]513            {
[43]514              //a node was found
[31]515              if(active_node!=INVALID)
516                {
[53]517                  mapstorage.modified = true;
[27]518
[31]519                  std::set<Graph::Edge> edges_to_delete;
[27]520
[69]521                  for(OutEdgeIt e(mapstorage.graph,active_node);e!=INVALID;++e)
[31]522                    {
523                      edges_to_delete.insert(e);
524                    }
[69]525                 
526                  for(InEdgeIt e(mapstorage.graph,active_node);e!=INVALID;++e)
[31]527                    {
528                      edges_to_delete.insert(e);
529                    }
[69]530                 
[31]531                  //deleting collected edges
[69]532                  for(std::set<Graph::Edge>::iterator
533                        edge_set_it=edges_to_delete.begin();
534                      edge_set_it!=edges_to_delete.end();
535                      ++edge_set_it)
[31]536                    {
537                      deleteItem(*edge_set_it);
538                    }
539                  deleteItem(active_node);
540                }
541              //a simple edge was chosen
542              else
[27]543                {
[31]544                  deleteItem(active_edge);
[27]545                }
546            }
[31]547          //pointer was moved, deletion is cancelled
[27]548          else
549            {
[31]550              if(active_node!=INVALID)
551                {
552                  *active_item << Gnome::Canvas::Properties::fill_color("blue");
553                }
554              else
555                {
556                  *active_item << Gnome::Canvas::Properties::fill_color("green");
557                }
[27]558            }
559        }
560      //reseting datas
561      active_item=NULL;
562      active_edge=INVALID;
563      active_node=INVALID;
564      break;
565
566    case GDK_MOTION_NOTIFY:
567      break;
568
569    default:
570      break;
571    }
[31]572  return false;
[27]573}
574
[32]575bool GraphDisplayerCanvas::edgeMapEditEventHandler(GdkEvent* e)
576{
[48]577  if(actual_tool==EDGE_MAP_EDIT)
[66]578  {
579    switch(e->type)
[32]580    {
[66]581      case GDK_BUTTON_PRESS:
582        {
583          //for determine, whether it was an edge
584          Edge clicked_edge=INVALID;
[43]585
[66]586          window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
587          active_item=(get_item_at(clicked_x, clicked_y));
[48]588
[66]589          //find the activated item between texts
590          for (EdgeIt i(mapstorage.graph); i!=INVALID; ++i)
591          {
592            //at the same time only one can be active
593            if(edgetextmap[i]==active_item)
594            {
595              clicked_edge=i;
596            }
597          }
[65]598
[66]599          //if it was not between texts, search for it between edges
600          if(clicked_edge==INVALID)
601          {
602            for (EdgeIt i(mapstorage.graph); i!=INVALID; ++i)
603            {
604              //at the same time only one can be active
605              if((edgesmap[i]==active_item)||(edgetextmap[i]==active_item))
606              {
607                clicked_edge=i;
608              }
609            }
610          }
611 
612          //if it was really an edge...
613          if(clicked_edge!=INVALID)
614          {
615            // the id map is not editable
616            if (edgemap_to_edit == "id") return 0;
[48]617
[66]618            //and there is activated map
619            if(edgetextmap[clicked_edge]->property_text().get_value()!="")
620            {
621              //activate the general variable for it
622              active_edge=clicked_edge;
[48]623
[66]624              //create a dialog
625              Gtk::Dialog dialog("Edit value", *parentwin, true);
626              dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
627              dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_ACCEPT);
628              Gtk::VBox* vbox = dialog.get_vbox();
[92]629              Gtk::SpinButton spin(0.0, 4);
630              spin.set_increments(1.0, 10.0);
631              spin.set_range(-1000000.0, 1000000.0);
[66]632              spin.set_numeric(true);
633              vbox->add(spin);
634              spin.show();
635              switch (dialog.run())
636              {
637                case Gtk::RESPONSE_NONE:
638                case Gtk::RESPONSE_CANCEL:
639                  break;
640                case Gtk::RESPONSE_ACCEPT:
641                  double new_value = spin.get_value();
642                  (*mapstorage.edgemap_storage[edgemap_to_edit])[active_edge] =
643                    new_value;
644                  std::ostringstream ostr;
645                  ostr << new_value;
646                  edgetextmap[active_edge]->property_text().set_value(
647                      ostr.str());
648                  //mapwin.updateEdge(active_edge);
649                  mapwin.updateEdge(Edge(INVALID));
650              }
651            }
652          }
653          break;
654        }
655      default:
656        break;
[32]657    }
[66]658  }
[32]659  return false; 
660}
661
662bool GraphDisplayerCanvas::nodeMapEditEventHandler(GdkEvent* e)
663{
[48]664  if(actual_tool==NODE_MAP_EDIT)
[66]665  {
666    switch(e->type)
[35]667    {
[66]668      case GDK_BUTTON_PRESS:
669        {
670          //for determine, whether it was a node
671          Node clicked_node=INVALID;
[43]672
[66]673          window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
674          active_item=(get_item_at(clicked_x, clicked_y));
[43]675
[66]676          //find the activated item between texts
677          for (NodeIt i(mapstorage.graph); i!=INVALID; ++i)
678          {
679            //at the same time only one can be active
680            if(nodetextmap[i]==active_item)
681            {
682              clicked_node=i;
683            }
684          }
[48]685
[66]686          //if there was not, search for it between nodes
687          if(clicked_node==INVALID)
688          {
689            for (NodeIt i(mapstorage.graph); i!=INVALID; ++i)
690            {
691              //at the same time only one can be active
692              if(nodesmap[i]==active_item)
693              {
694                clicked_node=i;
695              }
696            }
697          }
[48]698
[66]699          //if it was really a node...
700          if(clicked_node!=INVALID)
701          {
702            // the id map is not editable
703            if (nodemap_to_edit == "id") return 0;
[48]704
[66]705            //and there is activated map
706            if(nodetextmap[clicked_node]->property_text().get_value()!="")
707            {
708              //activate the general variable for it
709              active_node=clicked_node;
[48]710
[66]711              //create a dialog
712              Gtk::Dialog dialog("Edit value", *parentwin, true);
713              dialog.add_button(Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL);
714              dialog.add_button(Gtk::Stock::OK, Gtk::RESPONSE_ACCEPT);
715              Gtk::VBox* vbox = dialog.get_vbox();
[92]716              Gtk::SpinButton spin(0.0, 4);
717              spin.set_increments(1.0, 10.0);
718              spin.set_range(-1000000.0, 1000000.0);
[66]719              spin.set_numeric(true);
720              vbox->add(spin);
721              spin.show();
722              switch (dialog.run())
723              {
724                case Gtk::RESPONSE_NONE:
725                case Gtk::RESPONSE_CANCEL:
726                  break;
727                case Gtk::RESPONSE_ACCEPT:
728                  double new_value = spin.get_value();
729                  (*mapstorage.nodemap_storage[nodemap_to_edit])[active_node] =
730                    new_value;
731                  std::ostringstream ostr;
732                  ostr << new_value;
733                  nodetextmap[active_node]->property_text().set_value(
734                      ostr.str());
735                  //mapwin.updateNode(active_node);
736                  mapwin.updateNode(Node(INVALID));
737              }
738            }
739          }
740          break;
741        }
742      default:
743        break;
[35]744    }
[66]745  }
[35]746  return false; 
[32]747}
748
[62]749void GraphDisplayerCanvas::deleteItem(Node node_to_delete)
[27]750{
[28]751  delete(nodetextmap[node_to_delete]);
[27]752  delete(nodesmap[node_to_delete]);
[53]753  mapstorage.graph.erase(node_to_delete);
[27]754}
755
[62]756void GraphDisplayerCanvas::deleteItem(Edge edge_to_delete)
[27]757{
[28]758  delete(edgetextmap[edge_to_delete]);
[27]759  delete(edgesmap[edge_to_delete]);
[53]760  mapstorage.graph.erase(edge_to_delete);
[27]761}
762
[30]763void GraphDisplayerCanvas::textReposition(xy<double> new_place)
[27]764{
765  new_place+=(xy<double>(10,10));
[35]766  edgetextmap[forming_edge]->property_x().set_value(new_place.x);
767  edgetextmap[forming_edge]->property_y().set_value(new_place.y);
[27]768}
769
[30]770void GraphDisplayerCanvas::toggleEdgeActivity(BrokenEdge* active_bre, bool on)
[27]771{
772  if(on)
773    {
[35]774      if(forming_edge!=INVALID)
[27]775        {
[48]776          std::cerr << "ERROR!!!! Valid edge found!" << std::endl;
[27]777        }
778      else
779        {
[53]780          for (EdgeIt i(mapstorage.graph); i!=INVALID; ++i)
[27]781            {
782              if(edgesmap[i]==active_bre)
783                {
[35]784                  forming_edge=i;
[27]785                }
786            }
787        }
788    }
789  else
790    {
[35]791      if(forming_edge!=INVALID)
[27]792        {
[35]793          forming_edge=INVALID;
[27]794        }
795      else
796        {
[48]797          std::cerr << "ERROR!!!! Invalid edge found!" << std::endl;
[27]798        }
799    }
800
801}
[32]802
[46]803int GraphDisplayerCanvas::addNewEdgeMap(double default_value, std::string mapname)
[37]804{
[43]805  //create the new map
[53]806  Graph::EdgeMap<double> * emptr=new Graph::EdgeMap<double> (mapstorage.graph, default_value);
[46]807
808  //if addition was not successful addEdgeMap returns one.
809  //cause can be that there is already a map named like the new one
[63]810  if(mapstorage.addEdgeMap(mapname,emptr, default_value))
[46]811    {
812      return 1;
813    }
814
[43]815
816  //add it to the list of the displayable maps
[53]817  mapwin.registerNewEdgeMap(mapname);
[43]818
819  //display it
[41]820  changeEdgeText(mapname);
[46]821
822  return 0;
[37]823}
824
[46]825int GraphDisplayerCanvas::addNewNodeMap(double default_value, std::string mapname)
[37]826{
[43]827  //create the new map
[53]828  Graph::NodeMap<double> * emptr=new Graph::NodeMap<double> (mapstorage.graph,default_value);
[46]829
830  //if addition was not successful addNodeMap returns one.
831  //cause can be that there is already a map named like the new one
[63]832  if(mapstorage.addNodeMap(mapname,emptr, default_value))
[46]833    {
834      return 1;
835    }
[43]836
837  //add it to the list of the displayable maps
[53]838  mapwin.registerNewNodeMap(mapname);
[43]839
840  //display it
[41]841  changeNodeText(mapname);
[46]842
843  return 0;
[37]844}
845
Note: See TracBrowser for help on using the repository browser.