gdc-broken_edge.cc
author hegyi
Thu, 05 Jan 2006 12:30:09 +0000
branchgui
changeset 108 bf355fd6563e
parent 93 56eb90299693
child 147 10ef59f6633c
permissions -rw-r--r--
Several changes. \n If new map is added to mapstorage it emits signal with the name of the new map. This was important, because from now on not only tha mapwin should be updated. \n Furthermore algobox gets a pointer to mapstorage instead of only the mapnames from it. This is important because without it it would be complicated to pass all of the required maps to algobox.
hegyi@89
     1
#include "graph_displayer_canvas.h"
alpar@59
     2
#include <cmath>
hegyi@17
     3
ladanyi@98
     4
GraphDisplayerCanvas::BrokenEdge::BrokenEdge(Gnome::Canvas::Group & g, Edge _edge, GraphDisplayerCanvas & gc) : Line(g), edge(_edge), gdc(gc), isbutton(false)
hegyi@17
     5
{
hegyi@19
     6
  arrow=new Gnome::Canvas::Polygon(g);
hegyi@19
     7
  *arrow << Gnome::Canvas::Properties::fill_color("red");
hegyi@89
     8
  arrow->signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::BrokenEdge::edgeFormerEventHandler));
ladanyi@63
     9
  arrow->lower_to_bottom();
ladanyi@98
    10
  draw();
hegyi@19
    11
}
hegyi@19
    12
hegyi@89
    13
GraphDisplayerCanvas::BrokenEdge::~BrokenEdge()
hegyi@19
    14
{
hegyi@19
    15
  if(arrow)delete(arrow);
hegyi@19
    16
}
hegyi@19
    17
ladanyi@98
    18
void GraphDisplayerCanvas::BrokenEdge::draw()
hegyi@19
    19
{
ladanyi@98
    20
  MapStorage& ms = gdc.mytab.mapstorage;
ladanyi@98
    21
ladanyi@98
    22
  // update the edge
ladanyi@98
    23
  {
ladanyi@98
    24
    Gnome::Canvas::Points points;
ladanyi@98
    25
    Node source = ms.graph.source(edge);
ladanyi@98
    26
    Node target = ms.graph.target(edge);
ladanyi@98
    27
    points.push_back(Gnome::Art::Point(ms.coords[source].x,
ladanyi@98
    28
          ms.coords[source].y));
ladanyi@98
    29
    points.push_back(Gnome::Art::Point(ms.arrow_pos[edge].x,
ladanyi@98
    30
          ms.arrow_pos[edge].y));
ladanyi@98
    31
    points.push_back(Gnome::Art::Point(ms.coords[target].x,
ladanyi@98
    32
          ms.coords[target].y));
ladanyi@98
    33
    property_points().set_value(points);
ladanyi@98
    34
  }
ladanyi@98
    35
ladanyi@98
    36
  // update the arrow
ladanyi@98
    37
  {
ladanyi@98
    38
    //calculating coordinates of the direction indicator arrow
ladanyi@98
    39
    XY target(ms.coords[ms.graph.target(edge)]);
ladanyi@98
    40
    XY center(ms.arrow_pos[edge]);
ladanyi@98
    41
ladanyi@98
    42
    XY unit_vector_in_dir(target-center);
ladanyi@98
    43
    double length=sqrt( unit_vector_in_dir.normSquare() );
ladanyi@98
    44
ladanyi@98
    45
    //       std::cout << target << " - " << center << " = " << unit_vector_in_dir << "    / " <<unit_vector_in_dir.normSquare() ;
ladanyi@98
    46
    unit_vector_in_dir/=length;
ladanyi@98
    47
    //       std::cout << " = " << unit_vector_in_dir << std::endl;
ladanyi@98
    48
ladanyi@98
    49
    XY unit_norm_vector(0-unit_vector_in_dir.y, unit_vector_in_dir.x);
ladanyi@98
    50
    //       std::cout << unit_norm_vector << std::endl;
ladanyi@98
    51
ladanyi@98
    52
    {      
ladanyi@98
    53
      //       /\       // top
ladanyi@98
    54
      //      /  \      //
ladanyi@98
    55
      //      -  -      // c(enter)l(eft), ccl, ccr, cr
ladanyi@98
    56
      //       ||       //
ladanyi@98
    57
      //       ||       // b(ottom)l, br
hegyi@20
    58
    }
hegyi@50
    59
ladanyi@98
    60
    double size=3;
hegyi@50
    61
ladanyi@98
    62
    XY bl (center - unit_vector_in_dir * 3 * size + unit_norm_vector * size );
ladanyi@98
    63
    XY br (center - unit_vector_in_dir * 3 * size - unit_norm_vector * size );
ladanyi@98
    64
    XY ccl(center + unit_vector_in_dir *  size + unit_norm_vector * size );
ladanyi@98
    65
    XY ccr(center + unit_vector_in_dir *  size - unit_norm_vector * size );
ladanyi@98
    66
    XY cl (center + unit_vector_in_dir *  size + unit_norm_vector * 2 * size );
ladanyi@98
    67
    XY cr (center + unit_vector_in_dir *  size - unit_norm_vector * 2 * size );
ladanyi@98
    68
    XY top(center + unit_vector_in_dir * 3 * size);
hegyi@50
    69
ladanyi@98
    70
    //std::cout << bl << " " << br << " " << ccl << " "  << ccr << " " << cl << " " << cr << " " << top << std::endl;
hegyi@50
    71
ladanyi@98
    72
    Gnome::Canvas::Points arrow_points;
ladanyi@98
    73
    arrow_points.push_back(Gnome::Art::Point( bl.x , bl.y  ) );
ladanyi@98
    74
    arrow_points.push_back(Gnome::Art::Point( br.x , br.y  ) );
ladanyi@98
    75
    arrow_points.push_back(Gnome::Art::Point( ccr.x, ccr.y ) );
ladanyi@98
    76
    arrow_points.push_back(Gnome::Art::Point( cr.x , cr.y  ) );
ladanyi@98
    77
    arrow_points.push_back(Gnome::Art::Point( top.x, top.y ) );
ladanyi@98
    78
    arrow_points.push_back(Gnome::Art::Point( cl.x , cl.y  ) );
ladanyi@98
    79
    arrow_points.push_back(Gnome::Art::Point( ccl.x, ccl.y ) );
hegyi@50
    80
ladanyi@98
    81
    arrow->property_points().set_value(arrow_points);
ladanyi@98
    82
  }
hegyi@17
    83
}
hegyi@19
    84
hegyi@89
    85
bool GraphDisplayerCanvas::BrokenEdge::edgeFormerEventHandler(GdkEvent* e)
hegyi@19
    86
{
hegyi@19
    87
  switch(e->type)
hegyi@19
    88
    {
hegyi@19
    89
    case GDK_BUTTON_PRESS:
hegyi@19
    90
      //we mark the location of the event to be able to calculate parameters of dragging
hegyi@30
    91
      if(gdc.getActualTool()!=CREATE_NODE)
hegyi@21
    92
	{
hegyi@30
    93
	  gdc.toggleEdgeActivity(this, true);
hegyi@21
    94
	  clicked_x=e->button.x;
hegyi@21
    95
	  clicked_y=e->button.y;
hegyi@21
    96
	  isbutton=true;
hegyi@21
    97
	}
hegyi@19
    98
      break;
hegyi@19
    99
    case GDK_BUTTON_RELEASE:
hegyi@30
   100
      if(gdc.getActualTool()!=CREATE_NODE)
hegyi@25
   101
	{
hegyi@30
   102
	  gdc.toggleEdgeActivity(this, false);
hegyi@25
   103
	  isbutton=false;
hegyi@25
   104
	}
hegyi@19
   105
      break;
hegyi@19
   106
    case GDK_MOTION_NOTIFY:
hegyi@19
   107
      //we only have to do sg. if the mouse button is pressed
hegyi@19
   108
      if(isbutton)
hegyi@19
   109
	{
hegyi@19
   110
	  //new coordinates will be the old values,
hegyi@19
   111
	  //because the item will be moved to the
hegyi@19
   112
	  //new coordinate therefore the new movement
hegyi@19
   113
	  //has to be calculated from here
hegyi@19
   114
hegyi@19
   115
	  double dx=e->motion.x-clicked_x;
hegyi@19
   116
	  double dy=e->motion.y-clicked_y;
hegyi@19
   117
hegyi@19
   118
	  Gnome::Canvas::Points points_new;
hegyi@19
   119
ladanyi@98
   120
          gdc.mytab.mapstorage.arrow_pos.set(edge, gdc.mytab.mapstorage.arrow_pos[edge] + XY(dx, dy));
hegyi@19
   121
ladanyi@98
   122
	  draw();
ladanyi@98
   123
	  gdc.textReposition(gdc.mytab.mapstorage.arrow_pos[edge]);
hegyi@19
   124
hegyi@19
   125
	  clicked_x=e->motion.x;
hegyi@19
   126
	  clicked_y=e->motion.y;
hegyi@19
   127
hegyi@19
   128
	}
hegyi@19
   129
    default: break;
hegyi@19
   130
    }
hegyi@19
   131
hegyi@19
   132
  return true;
hegyi@19
   133
}