COIN-OR::LEMON - Graph Library

Changeset 151:72f1c33f89d4 in glemon-0.x


Ignore:
Timestamp:
09/25/06 09:54:00 (13 years ago)
Author:
Akos Ladanyi
Branch:
default
Phase:
public
Convert:
svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/glemon/trunk@2953
Message:

LoopEdge? improvements.

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • gdc-broken_edge.cc

    r147 r151  
    156156GraphDisplayerCanvas::LoopEdge::LoopEdge(Gnome::Canvas::Group& _group,
    157157    Edge _edge, GraphDisplayerCanvas& _canvas) :
    158   EdgeBase(_group, _edge, _canvas), line(*this)
    159 {
    160   line.property_fill_color().set_value("green");
    161   line.property_width_units().set_value(10);   
     158  EdgeBase(_group, _edge, _canvas), line(*this), isbutton(false)
     159{
     160  arrow.signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::LoopEdge::edgeFormerEventHandler));
     161
     162  line.property_outline_color().set_value("green");
     163  line.property_width_units().set_value(10);
    162164  line.lower_to_bottom();
    163165
     
    200202void GraphDisplayerCanvas::LoopEdge::setFillColor(Gdk::Color c)
    201203{
    202   line.property_fill_color_gdk().set_value(c);
    203 }
     204  line.property_outline_color_gdk().set_value(c);
     205}
     206
     207bool GraphDisplayerCanvas::LoopEdge::edgeFormerEventHandler(GdkEvent* e)
     208{
     209  switch(e->type)
     210  {
     211    case GDK_BUTTON_PRESS:
     212      if(canvas.getActualTool()!=CREATE_NODE)
     213      {
     214        canvas.toggleEdgeActivity(this, true);
     215        isbutton=true;
     216      }
     217      break;
     218    case GDK_BUTTON_RELEASE:
     219      if(canvas.getActualTool()!=CREATE_NODE)
     220      {
     221        canvas.toggleEdgeActivity(this, false);
     222        isbutton=false;
     223      }
     224      break;
     225    case GDK_MOTION_NOTIFY:
     226      if(isbutton)
     227      {
     228        canvas.mytab.mapstorage.arrow_pos.set(edge, XY(e->motion.x, e->motion.y));
     229
     230        draw();
     231        canvas.textReposition(canvas.mytab.mapstorage.arrow_pos[edge]);
     232      }
     233    default: break;
     234  }
     235  return true;
     236}
  • graph_displayer_canvas-event.cc

    r150 r151  
    410410          if(target_node!=INVALID)
    411411          {
     412            (mytab.mapstorage).modified = true;
     413
     414            *(nodesmap[target_node]) <<
     415              Gnome::Canvas::Properties::fill_color("red");
     416
     417            //creating new edge
     418            active_edge=(mytab.mapstorage).graph.addEdge(active_node,
     419                target_node);
     420
     421            // update maps
     422            for (std::map<std::string,
     423                Graph::EdgeMap<double>*>::const_iterator it =
     424                (mytab.mapstorage).edgemap_storage.begin(); it !=
     425                (mytab.mapstorage).edgemap_storage.end(); ++it)
     426            {
     427              (*(it->second))[active_edge] =
     428                (mytab.mapstorage).edgemap_default[it->first];
     429            }
     430            // increment the id map's default value
     431            (mytab.mapstorage).edgemap_default["label"] += 1.0;
     432
    412433            if(target_node!=active_node)               
    413434            {
    414               (mytab.mapstorage).modified = true;
    415 
    416               *(nodesmap[target_node]) <<
    417                 Gnome::Canvas::Properties::fill_color("red");
    418 
    419               //creating new edge
    420               active_edge=(mytab.mapstorage).graph.addEdge(active_node,
    421                   target_node);
    422 
    423               // update maps
    424               for (std::map<std::string,
    425                   Graph::EdgeMap<double>*>::const_iterator it =
    426                   (mytab.mapstorage).edgemap_storage.begin(); it !=
    427                   (mytab.mapstorage).edgemap_storage.end(); ++it)
    428               {
    429                 (*(it->second))[active_edge] =
    430                   (mytab.mapstorage).edgemap_default[it->first];
    431               }
    432               // increment the id map's default value
    433               (mytab.mapstorage).edgemap_default["label"] += 1.0;
    434 
    435               //calculating coordinates of new edge
    436               Gnome::Canvas::Points coos;
    437               double x1, x2, y1, y2;
    438 
    439               active_item->get_bounds(x1, y1, x2, y2);
    440               coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
    441 
    442               target_item->get_bounds(x1, y1, x2, y2);
    443               coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
    444 
    445435              // set the coordinates of the arrow on the new edge
    446436              MapStorage& ms = mytab.mapstorage;
     
    452442              edgesmap[active_edge]=new BrokenEdge(displayed_graph, active_edge,
    453443                  *this);
    454 
    455               //initializing edge-text as well, to empty string
    456               XY text_pos=mytab.mapstorage.arrow_pos[active_edge];
    457               text_pos+=(XY(10,10));
    458 
    459               edgetextmap[active_edge]=new Gnome::Canvas::Text(displayed_graph,
    460                   text_pos.x, text_pos.y, "");
    461               edgetextmap[active_edge]->property_fill_color().set_value(
    462                   "darkgreen");
    463               edgetextmap[active_edge]->raise_to_top();
    464 
    465               //updating its properties
    466 //               mapwin.updateEdge(active_edge);
    467               propertyUpdate(active_edge);
    468444            }
    469445            else
    470446            {
    471               target_node=INVALID;
    472               std::cerr << "Loop edge is not yet implemented!" << std::endl;
     447              // set the coordinates of the arrow on the new edge
     448              MapStorage& ms = mytab.mapstorage;
     449              ms.arrow_pos.set(active_edge,
     450                  (ms.coords[ms.graph.source(active_edge)] +
     451                   XY(0.0, 80.0)));
     452
     453              //drawing new edge
     454              edgesmap[active_edge]=new LoopEdge(displayed_graph, active_edge,
     455                  *this);
    473456            }
     457
     458            //initializing edge-text as well, to empty string
     459            XY text_pos=mytab.mapstorage.arrow_pos[active_edge];
     460            text_pos+=(XY(10,10));
     461
     462            edgetextmap[active_edge]=new Gnome::Canvas::Text(displayed_graph,
     463                text_pos.x, text_pos.y, "");
     464            edgetextmap[active_edge]->property_fill_color().set_value(
     465                "darkgreen");
     466            edgetextmap[active_edge]->raise_to_top();
     467
     468            propertyUpdate(active_edge);
    474469          }
    475470          //clicked item was not a node. it could be an e.g. edge. we do not
  • graph_displayer_canvas.cc

    r150 r151  
    158158  for (EdgeIt i((mytab.mapstorage).graph); i!=INVALID; ++i)
    159159  {
    160 
    161     //drawing green lines, coordinates are from mapstorage.coords
    162 
    163     Gnome::Canvas::Points coos;
    164     coos.push_back(Gnome::Art::Point(
    165           (mytab.mapstorage).coords[(mytab.mapstorage).graph.source(i)].x,
    166           (mytab.mapstorage).coords[(mytab.mapstorage).graph.source(i)].y));
    167     coos.push_back(Gnome::Art::Point(
    168           (mytab.mapstorage).coords[(mytab.mapstorage).graph.target(i)].x,
    169           (mytab.mapstorage).coords[(mytab.mapstorage).graph.target(i)].y));
    170    
    171     edgesmap[i]=new BrokenEdge(displayed_graph, i, *this);
    172    
     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    }
    173168    //initializing edge-text as well, to empty string
    174169
  • graph_displayer_canvas.h

    r150 r151  
    107107    private:
    108108      Gnome::Canvas::Ellipse line;
     109      bool edgeFormerEventHandler(GdkEvent* e);
     110      bool isbutton;
    109111    public:
    110112      LoopEdge(Gnome::Canvas::Group&, Edge, GraphDisplayerCanvas&);
  • mapstorage.cc

    r135 r151  
    320320    for (EdgeIt e(graph); e != INVALID; ++e)
    321321    {
    322       arrow_pos.set(e, (coords[graph.source(e)] + coords[graph.target(e)]) / 2.0);
     322      if (graph.source(e) == graph.target(e))
     323      {
     324        arrow_pos.set(e, coords[graph.source(e)] + XY(0.0, 80.0));
     325      }
     326      else
     327      {
     328        arrow_pos.set(e, (coords[graph.source(e)] + coords[graph.target(e)]) / 2.0);
     329      }
    323330    }
    324331  }
     
    365372      else
    366373        edgemap_default["label"] = 1.0;
    367     }
    368   }
    369 
    370   // filter loop edges
    371   for (EdgeIt e(graph); e != INVALID; ++e)
    372   {
    373     if (graph.source(e) == graph.target(e))
    374     {
    375       std::cerr << "Removed loop edge " << (*edgemap_storage["label"])[e]
    376         << " (from " << (*nodemap_storage["label"])[graph.source(e)]
    377         << ", to " << (*nodemap_storage["label"])[graph.target(e)] << ")."
    378         << std::endl;
    379 
    380       graph.erase(e);
    381374    }
    382375  }
Note: See TracChangeset for help on using the changeset viewer.