1.1 --- a/src/gui/graph_displayer_canvas.cc Sat May 21 21:04:57 2005 +0000
1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1.3 @@ -1,259 +0,0 @@
1.4 -#include <graph_displayer_canvas.h>
1.5 -
1.6 -GraphDisplayerCanvas::GraphDisplayerCanvas(Graph & gr, CoordinatesMap & cm, MapStorage & ms):g(gr),nodesmap(g),edgesmap(g),edgetextmap(g),displayed_graph(*(root()), 0, 0),mapstorage(ms),isbutton(false),active_item(NULL)
1.7 -{
1.8 -
1.9 - for (EdgeIt i(g); i!=INVALID; ++i)
1.10 - {
1.11 - Gnome::Canvas::Points coos;
1.12 - coos.push_back(Gnome::Art::Point(cm[g.source(i)].x,cm[g.source(i)].y));
1.13 - coos.push_back(Gnome::Art::Point(cm[g.target(i)].x,cm[g.target(i)].y));
1.14 -
1.15 - edgesmap[i]=new Gnome::Canvas::Line(displayed_graph, coos);
1.16 - *(edgesmap[i]) << Gnome::Canvas::Properties::fill_color("green");
1.17 - edgesmap[i]->property_width_pixels().set_value(10);
1.18 -
1.19 -
1.20 - double x1, x2, y1, y2;
1.21 - edgesmap[i]->get_bounds(x1, y1, x2, y2);
1.22 -
1.23 - edgetextmap[i]=new Gnome::Canvas::Text(displayed_graph,(x1+x2)/2, (y1+y2)/2, "");
1.24 - edgetextmap[i]->property_fill_color().set_value("black");
1.25 - }
1.26 -
1.27 - NodeIt i(g);
1.28 - int maxx=0, maxy=0, minx=(int)cm[i].x, miny=(int)cm[i].y;
1.29 -
1.30 - for (; i!=INVALID; ++i)
1.31 - {
1.32 - if(cm[i].x>maxx)maxx=(int)cm[i].x;
1.33 - if(cm[i].y>maxy)maxy=(int)cm[i].y;
1.34 - if(cm[i].x<minx)minx=(int)cm[i].x;
1.35 - if(cm[i].y<miny)miny=(int)cm[i].y;
1.36 -
1.37 - nodesmap[i]=new Gnome::Canvas::Ellipse(displayed_graph, cm[i].x-20, cm[i].y-20, cm[i].x+20, cm[i].y+20);
1.38 - *(nodesmap[i]) << Gnome::Canvas::Properties::fill_color("blue");
1.39 - *(nodesmap[i]) << Gnome::Canvas::Properties::outline_color("black");
1.40 - (nodesmap[i])->signal_event().connect(sigc::bind(sigc::mem_fun(*this, &GraphDisplayerCanvas::event_handler),i));
1.41 - }
1.42 -
1.43 - double biggest_x=(abs(maxx)>abs(minx))?(abs(maxx)+80):(abs(minx)+80);
1.44 - double biggest_y=(abs(maxy)>abs(miny))?(abs(maxy)+80):(abs(miny)+80);
1.45 -
1.46 - set_pixels_per_unit((biggest_x>biggest_y)?(WIN_WIDTH/biggest_x/2):(WIN_HEIGHT/biggest_y/2));
1.47 - std::cout<<abs(maxx)<<" "<<abs(minx)<<" big x "<<biggest_x<<" "<<abs(maxy)<<" "<<abs(miny)<<" big y "<<biggest_y<<std::endl;
1.48 - std::cout<<maxx<<" "<<minx<<" big x "<<biggest_x<<" "<<maxy<<" "<<miny<<" big y "<<biggest_y<<std::endl;
1.49 - std::cout<<"dx "<<(maxx-minx)<<" dy "<<(maxy-miny)<<" xrate "<<((maxx-minx)/WIN_WIDTH)<<" yrate "<<((maxy-miny)/WIN_HEIGHT)<<std::endl;
1.50 -
1.51 -}
1.52 -
1.53 -GraphDisplayerCanvas::~GraphDisplayerCanvas()
1.54 -{
1.55 - Graph::NodeMap <int> id(g);
1.56 - Graph::NodeMap <double> xc(g);
1.57 - Graph::NodeMap <double> yc(g);
1.58 -
1.59 - int j=1;
1.60 -
1.61 - for (NodeIt i(g); i!=INVALID; ++i)
1.62 - {
1.63 - double x1,y1,x2,y2;
1.64 - nodesmap[i]->get_bounds(x1, y1, x2, y2);
1.65 -
1.66 - id[i]=j++;
1.67 - xc[i]=(x1+x2)/2;
1.68 - yc[i]=(y1+y2)/2;
1.69 - }
1.70 -
1.71 - GraphWriter<Graph> writer(std::cout,g);
1.72 -
1.73 - writer.writeNodeMap("id", id);
1.74 - writer.writeNodeMap("coordinates_x", xc);
1.75 - writer.writeNodeMap("coordinates_y", yc);
1.76 - writer.run();
1.77 -}
1.78 -
1.79 -int GraphDisplayerCanvas::changeLineWidth (std::string mapname)
1.80 -{
1.81 - for (EdgeIt i(g); i!=INVALID; ++i)
1.82 - {
1.83 - int w=(int)(*(mapstorage.edgemap_storage)[mapname])[i];
1.84 - edgesmap[i]->property_width_pixels().set_value(w);
1.85 - }
1.86 - return 0;
1.87 -};
1.88 -
1.89 -int GraphDisplayerCanvas::changeColor (std::string mapname)
1.90 -{
1.91 - for (EdgeIt i(g); i!=INVALID; ++i)
1.92 - {
1.93 - double w=(*(mapstorage.edgemap_storage)[mapname])[i];
1.94 - double max=mapstorage.maxOfEdgeMap(mapname);
1.95 - double min=mapstorage.minOfEdgeMap(mapname);
1.96 -
1.97 - //std::cout<<w<<" "<<max<<" "<<min<<" "<<100*(w-min)/(max-min)<<std::endl;
1.98 - Gdk::Color color;
1.99 - if(max!=min)
1.100 - {
1.101 - color.set_rgb_p (0, 100*(w-min)/(max-min), 0);
1.102 - }
1.103 - else
1.104 - {
1.105 - color.set_rgb_p (0, 100, 0);
1.106 - }
1.107 -
1.108 - edgesmap[i]->property_fill_color_gdk().set_value(color);
1.109 - }
1.110 - return 0;
1.111 -};
1.112 -
1.113 -int GraphDisplayerCanvas::changeText (std::string mapname)
1.114 -{
1.115 - for (EdgeIt i(g); i!=INVALID; ++i)
1.116 - {
1.117 - if(mapname!="Text")
1.118 - {
1.119 - double number=(*(mapstorage.edgemap_storage)[mapname])[i];
1.120 - int length=(int)(floor(log(number)/log(10)))+1;
1.121 - int maxpos=(int)(pow(10,length-1));
1.122 - int strl=length+1+RANGE;
1.123 - char * str=new char[strl];
1.124 - str[length]='.';
1.125 - str[strl]='\0';
1.126 -
1.127 - for(int j=0;j<strl;j++)
1.128 - {
1.129 - if(j!=length)
1.130 - {
1.131 - int digit=(int)(number/maxpos);
1.132 - str[j]=(digit+'0');
1.133 - number-=digit*maxpos;
1.134 - number*=10;
1.135 - }
1.136 - }
1.137 -
1.138 - edgetextmap[i]->property_text().set_value(str);
1.139 - }
1.140 - else
1.141 - {
1.142 - edgetextmap[i]->property_text().set_value("");
1.143 - }
1.144 - }
1.145 - return 0;
1.146 -};
1.147 -
1.148 -
1.149 -int GraphDisplayerCanvas::rezoom ()
1.150 -{
1.151 - double x1, x2, y1, y2;
1.152 - int x,y;
1.153 -
1.154 - NodeIt i(g);
1.155 - nodesmap[i]->get_bounds(x1, y1, x2, y2);
1.156 -
1.157 - x=(int)((x1+x2)/2);
1.158 - y=(int)((y1+y2)/2);
1.159 -
1.160 - int maxx=0, maxy=0, minx=(int)x, miny=(int)y;
1.161 -
1.162 - for (; i!=INVALID; ++i)
1.163 - {
1.164 - nodesmap[i]->get_bounds(x1, y1, x2, y2);
1.165 -
1.166 - x=(int)((x1+x2)/2);
1.167 - y=(int)((y1+y2)/2);
1.168 -
1.169 - if(x>maxx)maxx=x;
1.170 - if(y>maxy)maxy=y;
1.171 - if(x<minx)minx=x;
1.172 - if(y<miny)miny=y;
1.173 - }
1.174 -
1.175 - double biggest_x=(abs(maxx)>abs(minx))?(abs(maxx)+80):(abs(minx)+80);
1.176 - double biggest_y=(abs(maxy)>abs(miny))?(abs(maxy)+80):(abs(miny)+80);
1.177 -
1.178 - set_pixels_per_unit((biggest_x-WIN_WIDTH>biggest_y-WIN_HEIGHT)?(WIN_WIDTH/biggest_x/2):(WIN_HEIGHT/biggest_y/2));
1.179 - return 0;
1.180 -};
1.181 -
1.182 -
1.183 -///This function moves only one node of displayed_graph,
1.184 -///but recalculate the location of weight point,
1.185 -///and also redraw the sides of the planefigure.
1.186 -bool GraphDisplayerCanvas::event_handler(GdkEvent* e, Node n)
1.187 -{
1.188 - switch(e->type)
1.189 - {
1.190 - case GDK_BUTTON_PRESS:
1.191 - clicked_x=e->button.x;
1.192 - clicked_y=e->button.y;
1.193 - active_item=(get_item_at(e->button.x, e->button.y));
1.194 - isbutton=true;
1.195 - break;
1.196 - case GDK_BUTTON_RELEASE:
1.197 - isbutton=false;
1.198 - active_item=NULL;
1.199 - break;
1.200 - case GDK_MOTION_NOTIFY:
1.201 - if(isbutton)
1.202 - {
1.203 - double dx=e->motion.x-clicked_x;
1.204 - double dy=e->motion.y-clicked_y;
1.205 - active_item->move(dx, dy);
1.206 - clicked_x=e->motion.x;
1.207 - clicked_y=e->motion.y;
1.208 -
1.209 - EdgeIt e;
1.210 -
1.211 - g.firstOut(e,n);
1.212 - for(;e!=INVALID;g.nextOut(e))
1.213 - {
1.214 - Gnome::Canvas::Points coos;
1.215 - double x1, x2, y1, y2;
1.216 -
1.217 - nodesmap[g.source(e)]->get_bounds(x1, y1, x2, y2);
1.218 - coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
1.219 -
1.220 - nodesmap[g.target(e)]->get_bounds(x1, y1, x2, y2);
1.221 - coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
1.222 -
1.223 - edgesmap[e]->property_points().set_value(coos);
1.224 -
1.225 - edgesmap[e]->get_bounds(x1, y1, x2, y2);
1.226 -
1.227 - edgetextmap[e]->property_x().set_value((x1+x2)/2);
1.228 - edgetextmap[e]->property_y().set_value((y1+y2)/2);
1.229 - }
1.230 -
1.231 - g.firstIn(e,n);
1.232 - for(;e!=INVALID;g.nextIn(e))
1.233 - {
1.234 - Gnome::Canvas::Points coos;
1.235 - double x1, x2, y1, y2;
1.236 -
1.237 - nodesmap[g.source(e)]->get_bounds(x1, y1, x2, y2);
1.238 - coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
1.239 -
1.240 - nodesmap[g.target(e)]->get_bounds(x1, y1, x2, y2);
1.241 - coos.push_back(Gnome::Art::Point((x1+x2)/2,(y1+y2)/2));
1.242 -
1.243 - edgesmap[e]->property_points().set_value(coos);
1.244 -
1.245 - edgesmap[e]->get_bounds(x1, y1, x2, y2);
1.246 -
1.247 - edgetextmap[e]->property_x().set_value((x1+x2)/2);
1.248 - edgetextmap[e]->property_y().set_value((y1+y2)/2);
1.249 - }
1.250 - }
1.251 - default: break;
1.252 - }
1.253 - return true;
1.254 -}
1.255 -
1.256 -bool GraphDisplayerCanvas::on_expose_event(GdkEventExpose *event)
1.257 -{
1.258 - Gnome::Canvas::CanvasAA::on_expose_event(event);
1.259 - //usleep(10000);
1.260 - //rezoom();
1.261 - return true;
1.262 -}