graph_displayer_canvas.cc
branchgui
changeset 53 e73d7540bd24
parent 48 b8ec84524fa2
child 55 e4ee805ca5fc
equal deleted inserted replaced
27:4fb44118e187 28:e9cf931991ce
     1 #include <graph_displayer_canvas.h>
     1 #include "graph_displayer_canvas.h"
     2 #include <broken_edge.h>
     2 #include "broken_edge.h"
     3 #include <math.h>
     3 #include <math.h>
     4 
     4 
     5 GraphDisplayerCanvas::GraphDisplayerCanvas(Graph & gr, CoordinatesMap & cm, MapStorage & ms, MapWin * mw):g(gr),nodesmap(g),edgesmap(g),edgetextmap(g),nodetextmap(g),displayed_graph(*(root()), 0, 0),canvasentrywidget(NULL),mapstorage(ms),isbutton(0),active_item(NULL),target_item(NULL),nodemap_to_edit(""),edgemap_to_edit(""),mapwin(mw)
     5 GraphDisplayerCanvas::GraphDisplayerCanvas(MapStorage & ms, MapWin & mw) :
       
     6   nodesmap(ms.graph), edgesmap(ms.graph), edgetextmap(ms.graph),
       
     7   nodetextmap(ms.graph), displayed_graph(*(root()), 0, 0),
       
     8   canvasentrywidget(NULL), mapstorage(ms), isbutton(0), active_item(NULL),
       
     9   target_item(NULL), nodemap_to_edit(""), edgemap_to_edit(""), mapwin(mw)
     6 {
    10 {
     7   
    11   //base event handler is move tool
     8   //Initializing values.
    12   actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::moveEventHandler), false);
     9   active_node=INVALID;
    13   actual_tool=MOVE;
    10   active_edge=INVALID;
       
    11   forming_edge=INVALID;
       
    12 
    14 
    13   //setting event handler for the editor widget
    15   //setting event handler for the editor widget
    14   entrywidget.signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::entryWidgetChangeHandler), false);
    16   entrywidget.signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::entryWidgetChangeHandler), false);
    15 
    17 
    16   //base event handler is move tool
    18   active_node=INVALID;
    17   actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::moveEventHandler), false);
    19   active_edge=INVALID;
    18   actual_tool=MOVE;
    20   forming_edge=INVALID;
       
    21 }
    19 
    22 
    20   //set_center_scroll_region(true);
    23 GraphDisplayerCanvas::~GraphDisplayerCanvas()
       
    24 {
       
    25   for (NodeIt n(mapstorage.graph); n != INVALID; ++n)
       
    26   {
       
    27     delete nodesmap[n];
       
    28     delete nodetextmap[n];
       
    29   }
    21 
    30 
       
    31   for (EdgeIt e(mapstorage.graph); e != INVALID; ++e)
       
    32   {
       
    33     delete edgesmap[e];
       
    34     delete edgetextmap[e];
       
    35   }
       
    36 
       
    37   if(canvasentrywidget)
       
    38   {
       
    39     delete(canvasentrywidget);
       
    40   }
       
    41 }
       
    42 
       
    43 void GraphDisplayerCanvas::drawGraph()
       
    44 {
    22   //first edges are drawn, to hide joining with nodes later
    45   //first edges are drawn, to hide joining with nodes later
    23 
    46 
    24   for (EdgeIt i(g); i!=INVALID; ++i)
    47   for (EdgeIt i(mapstorage.graph); i!=INVALID; ++i)
    25   {
    48   {
    26 
    49 
    27     //drawing green lines, coordinates are from cm
    50     //drawing green lines, coordinates are from mapstorage.coords
    28 
    51 
    29     Gnome::Canvas::Points coos;
    52     Gnome::Canvas::Points coos;
    30     coos.push_back(Gnome::Art::Point(cm[g.source(i)].x,cm[g.source(i)].y));
    53     coos.push_back(Gnome::Art::Point(
    31     coos.push_back(Gnome::Art::Point(cm[g.target(i)].x,cm[g.target(i)].y));
    54           mapstorage.coords[mapstorage.graph.source(i)].x,
       
    55           mapstorage.coords[mapstorage.graph.source(i)].y));
       
    56     coos.push_back(Gnome::Art::Point(
       
    57           mapstorage.coords[mapstorage.graph.target(i)].x,
       
    58           mapstorage.coords[mapstorage.graph.target(i)].y));
    32     
    59     
    33     edgesmap[i]=new BrokenEdge(displayed_graph, coos, *this);
    60     edgesmap[i]=new BrokenEdge(displayed_graph, coos, *this);
    34     *(edgesmap[i]) << Gnome::Canvas::Properties::fill_color("green");
    61     *(edgesmap[i]) << Gnome::Canvas::Properties::fill_color("green");
    35     edgesmap[i]->property_width_units().set_value(10);    
    62     edgesmap[i]->property_width_units().set_value(10);    
    36     
    63     
    44     edgetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::edgeMapEditEventHandler), false);
    71     edgetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::edgeMapEditEventHandler), false);
    45   }
    72   }
    46 
    73 
    47   //afterwards nodes come to be drawn
    74   //afterwards nodes come to be drawn
    48 
    75 
    49   NodeIt i(g);
    76   for (NodeIt i(mapstorage.graph); i!=INVALID; ++i)
    50   int maxx=0, maxy=0, minx=(int)cm[i].x, miny=(int)cm[i].y;
       
    51 
       
    52   for (; i!=INVALID; ++i)
       
    53   {
    77   {
    54     //minimum and maximum is gathered to be able to zoom to the graph correctly (whole figure should be seen)
       
    55 
       
    56     if(cm[i].x>maxx)maxx=(int)cm[i].x;
       
    57     if(cm[i].y>maxy)maxy=(int)cm[i].y;
       
    58     if(cm[i].x<minx)minx=(int)cm[i].x;
       
    59     if(cm[i].y<miny)miny=(int)cm[i].y;
       
    60 
       
    61     //drawing bule nodes, with black line around them
    78     //drawing bule nodes, with black line around them
    62 
    79 
    63     nodesmap[i]=new Gnome::Canvas::Ellipse(displayed_graph, cm[i].x-20, cm[i].y-20, cm[i].x+20, cm[i].y+20);
    80     nodesmap[i]=new Gnome::Canvas::Ellipse(
       
    81         displayed_graph,
       
    82         mapstorage.coords[i].x-20,
       
    83         mapstorage.coords[i].y-20,
       
    84         mapstorage.coords[i].x+20,
       
    85         mapstorage.coords[i].y+20);
    64     *(nodesmap[i]) << Gnome::Canvas::Properties::fill_color("blue");
    86     *(nodesmap[i]) << Gnome::Canvas::Properties::fill_color("blue");
    65     *(nodesmap[i]) << Gnome::Canvas::Properties::outline_color("black");
    87     *(nodesmap[i]) << Gnome::Canvas::Properties::outline_color("black");
    66 
    88 
    67     //initializing edge-text as well, to empty string
    89     //initializing edge-text as well, to empty string
    68 
    90 
    69     xy<double> text_pos((cm[i].x+node_property_defaults[N_RADIUS]+5),(cm[i].y+node_property_defaults[N_RADIUS]+5));
    91     xy<double> text_pos(
       
    92         (mapstorage.coords[i].x+node_property_defaults[N_RADIUS]+5),
       
    93         (mapstorage.coords[i].y+node_property_defaults[N_RADIUS]+5));
    70 
    94 
    71     nodetextmap[i]=new Gnome::Canvas::Text(displayed_graph, text_pos.x, text_pos.y, "");
    95     nodetextmap[i]=new Gnome::Canvas::Text(displayed_graph,
       
    96         text_pos.x, text_pos.y, "");
    72     nodetextmap[i]->property_fill_color().set_value("darkblue");
    97     nodetextmap[i]->property_fill_color().set_value("darkblue");
    73     nodetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::nodeMapEditEventHandler), false);
    98     nodetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::nodeMapEditEventHandler), false);
    74   }
    99   }
    75 
   100 
    76   updateScrollRegion();
   101   updateScrollRegion();
    77 }
   102 }
    78 
   103 
    79 GraphDisplayerCanvas::~GraphDisplayerCanvas()
   104 void GraphDisplayerCanvas::clear()
    80 {
   105 {
    81   if(canvasentrywidget)
   106   active_node=INVALID;
    82     {
   107   active_edge=INVALID;
    83       delete(canvasentrywidget);
   108   forming_edge=INVALID;
    84     }
       
    85 
   109 
    86   //writing out the end state of the graph
   110   for (NodeIt n(mapstorage.graph); n != INVALID; ++n)
    87   //\todo all the maps has to be write out!
       
    88 
       
    89   Graph::NodeMap <int> id(g);
       
    90   Graph::NodeMap <double> xc(g);
       
    91   Graph::NodeMap <double> yc(g);
       
    92   
       
    93   int j=1;
       
    94   
       
    95   for (NodeIt i(g); i!=INVALID; ++i)
       
    96   {
   111   {
    97     double x1,y1,x2,y2;
   112     delete nodesmap[n];
    98     nodesmap[i]->get_bounds(x1, y1, x2, y2);
   113     delete nodetextmap[n];
    99     
       
   100     id[i]=j++;
       
   101     xc[i]=(x1+x2)/2;
       
   102     yc[i]=(y1+y2)/2;
       
   103   }
   114   }
   104 
   115 
   105   GraphWriter<Graph> writer(std::cout,g);
   116   for (EdgeIt e(mapstorage.graph); e != INVALID; ++e)
   106   
   117   {
   107   writer.writeNodeMap("id", id);
   118     delete edgesmap[e];
   108   writer.writeNodeMap("coordinates_x", xc);
   119     delete edgetextmap[e];
   109   writer.writeNodeMap("coordinates_y", yc);
   120   }
   110   writer.run();
       
   111 }
   121 }