graph_displayer_canvas.cc
author hegyi
Mon, 21 Nov 2005 18:03:20 +0000
branchgui
changeset 90 e9f8f44f12a3
parent 66 4ca5a537ef07
child 94 adfdc2f70548
permissions -rwxr-xr-x
NewMapWin has become Dialog instead of Window. Therefore it is created dynamically, when there is need for it, instead of keeping one instance in memory. This solution is slower, but more correct than before.
ladanyi@53
     1
#include "graph_displayer_canvas.h"
alpar@59
     2
#include <cmath>
ladanyi@6
     3
hegyi@55
     4
GraphDisplayerCanvas::GraphDisplayerCanvas(MapStorage & ms, MapWin & mw, Gtk::Window * mainwin) :
ladanyi@53
     5
  nodesmap(ms.graph), edgesmap(ms.graph), edgetextmap(ms.graph),
ladanyi@66
     6
  nodetextmap(ms.graph), displayed_graph(*(root()), 0, 0), mapstorage(ms),
ladanyi@66
     7
  isbutton(0), active_item(NULL), target_item(NULL), nodemap_to_edit(""),
ladanyi@66
     8
  edgemap_to_edit(""), mapwin(mw)
ladanyi@6
     9
{
hegyi@55
    10
  parentwin=mainwin;
hegyi@55
    11
ladanyi@53
    12
  //base event handler is move tool
ladanyi@53
    13
  actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::moveEventHandler), false);
ladanyi@53
    14
  actual_tool=MOVE;
hegyi@34
    15
ladanyi@53
    16
  active_node=INVALID;
ladanyi@53
    17
  active_edge=INVALID;
ladanyi@53
    18
  forming_edge=INVALID;
ladanyi@53
    19
}
hegyi@9
    20
ladanyi@53
    21
GraphDisplayerCanvas::~GraphDisplayerCanvas()
ladanyi@53
    22
{
ladanyi@53
    23
  for (NodeIt n(mapstorage.graph); n != INVALID; ++n)
ladanyi@53
    24
  {
ladanyi@53
    25
    delete nodesmap[n];
ladanyi@53
    26
    delete nodetextmap[n];
ladanyi@53
    27
  }
ladanyi@6
    28
ladanyi@53
    29
  for (EdgeIt e(mapstorage.graph); e != INVALID; ++e)
ladanyi@53
    30
  {
ladanyi@53
    31
    delete edgesmap[e];
ladanyi@53
    32
    delete edgetextmap[e];
ladanyi@53
    33
  }
ladanyi@53
    34
}
ladanyi@53
    35
ladanyi@53
    36
void GraphDisplayerCanvas::drawGraph()
ladanyi@53
    37
{
ladanyi@6
    38
  //first edges are drawn, to hide joining with nodes later
ladanyi@6
    39
ladanyi@53
    40
  for (EdgeIt i(mapstorage.graph); i!=INVALID; ++i)
ladanyi@6
    41
  {
ladanyi@6
    42
ladanyi@53
    43
    //drawing green lines, coordinates are from mapstorage.coords
ladanyi@6
    44
ladanyi@6
    45
    Gnome::Canvas::Points coos;
ladanyi@53
    46
    coos.push_back(Gnome::Art::Point(
ladanyi@53
    47
          mapstorage.coords[mapstorage.graph.source(i)].x,
ladanyi@53
    48
          mapstorage.coords[mapstorage.graph.source(i)].y));
ladanyi@53
    49
    coos.push_back(Gnome::Art::Point(
ladanyi@53
    50
          mapstorage.coords[mapstorage.graph.target(i)].x,
ladanyi@53
    51
          mapstorage.coords[mapstorage.graph.target(i)].y));
ladanyi@6
    52
    
hegyi@21
    53
    edgesmap[i]=new BrokenEdge(displayed_graph, coos, *this);
ladanyi@6
    54
    *(edgesmap[i]) << Gnome::Canvas::Properties::fill_color("green");
hegyi@47
    55
    edgesmap[i]->property_width_units().set_value(10);    
ladanyi@63
    56
    edgesmap[i]->lower_to_bottom();
ladanyi@6
    57
    
ladanyi@6
    58
    //initializing edge-text as well, to empty string
ladanyi@6
    59
hegyi@30
    60
    xy<double> text_pos=edgesmap[i]->getArrowPos();
hegyi@25
    61
    text_pos+=(xy<double>(10,10));
hegyi@25
    62
hegyi@25
    63
    edgetextmap[i]=new Gnome::Canvas::Text(displayed_graph, text_pos.x, text_pos.y, "");
hegyi@28
    64
    edgetextmap[i]->property_fill_color().set_value("darkgreen");
hegyi@48
    65
    edgetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::edgeMapEditEventHandler), false);
ladanyi@63
    66
    edgetextmap[i]->raise_to_top();
ladanyi@6
    67
  }
ladanyi@6
    68
ladanyi@6
    69
  //afterwards nodes come to be drawn
ladanyi@6
    70
ladanyi@53
    71
  for (NodeIt i(mapstorage.graph); i!=INVALID; ++i)
ladanyi@6
    72
  {
ladanyi@6
    73
    //drawing bule nodes, with black line around them
ladanyi@6
    74
ladanyi@53
    75
    nodesmap[i]=new Gnome::Canvas::Ellipse(
ladanyi@53
    76
        displayed_graph,
ladanyi@53
    77
        mapstorage.coords[i].x-20,
ladanyi@53
    78
        mapstorage.coords[i].y-20,
ladanyi@53
    79
        mapstorage.coords[i].x+20,
ladanyi@53
    80
        mapstorage.coords[i].y+20);
ladanyi@6
    81
    *(nodesmap[i]) << Gnome::Canvas::Properties::fill_color("blue");
ladanyi@6
    82
    *(nodesmap[i]) << Gnome::Canvas::Properties::outline_color("black");
ladanyi@63
    83
    nodesmap[i]->raise_to_top();
hegyi@28
    84
hegyi@28
    85
    //initializing edge-text as well, to empty string
hegyi@28
    86
ladanyi@53
    87
    xy<double> text_pos(
ladanyi@53
    88
        (mapstorage.coords[i].x+node_property_defaults[N_RADIUS]+5),
ladanyi@53
    89
        (mapstorage.coords[i].y+node_property_defaults[N_RADIUS]+5));
hegyi@28
    90
ladanyi@53
    91
    nodetextmap[i]=new Gnome::Canvas::Text(displayed_graph,
ladanyi@53
    92
        text_pos.x, text_pos.y, "");
hegyi@28
    93
    nodetextmap[i]->property_fill_color().set_value("darkblue");
hegyi@48
    94
    nodetextmap[i]->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::nodeMapEditEventHandler), false);
ladanyi@63
    95
    nodetextmap[i]->raise_to_top();
ladanyi@6
    96
  }
ladanyi@6
    97
ladanyi@6
    98
  updateScrollRegion();
ladanyi@6
    99
}
ladanyi@6
   100
ladanyi@53
   101
void GraphDisplayerCanvas::clear()
ladanyi@6
   102
{
ladanyi@53
   103
  active_node=INVALID;
ladanyi@53
   104
  active_edge=INVALID;
ladanyi@53
   105
  forming_edge=INVALID;
ladanyi@6
   106
ladanyi@53
   107
  for (NodeIt n(mapstorage.graph); n != INVALID; ++n)
ladanyi@6
   108
  {
ladanyi@53
   109
    delete nodesmap[n];
ladanyi@53
   110
    delete nodetextmap[n];
ladanyi@6
   111
  }
ladanyi@6
   112
ladanyi@53
   113
  for (EdgeIt e(mapstorage.graph); e != INVALID; ++e)
ladanyi@53
   114
  {
ladanyi@53
   115
    delete edgesmap[e];
ladanyi@53
   116
    delete edgetextmap[e];
ladanyi@53
   117
  }
ladanyi@6
   118
}