# HG changeset patch # User hegyi # Date 1171993544 0 # Node ID 2cac5b936a2b6f0b244b27d246b6bdc4c95d5125 # Parent 8b69c54d5bf0d5c867ebbf632bf2103e4f9711f9 Working tooltips are added. No segmentation fault is occured if empty graphs are redesigned. diff -r 8b69c54d5bf0 -r 2cac5b936a2b graph_displayer_canvas.cc --- a/graph_displayer_canvas.cc Tue Feb 20 15:46:19 2007 +0000 +++ b/graph_displayer_canvas.cc Tue Feb 20 17:45:44 2007 +0000 @@ -323,110 +323,115 @@ void GraphDisplayerCanvas::reDesignGraph() { - double max_coord=50000; - double min_dist=20; - double init_vector_length=25; + NodeIt firstnode((mytab.mapstorage).graph); + //is it not an empty graph? + if(firstnode!=INVALID) + { + double max_coord=50000; + double min_dist=20; + double init_vector_length=25; - if(!was_redesigned) - { - NodeIt i((mytab.mapstorage).graph); + if(!was_redesigned) + { + NodeIt i((mytab.mapstorage).graph); - dim2::Point init(init_vector_length*rnd(), - init_vector_length*rnd()); - moveNode(init.x, init.y, nodesmap[i], i); - was_redesigned=true; - } + dim2::Point init(init_vector_length*rnd(), + init_vector_length*rnd()); + moveNode(init.x, init.y, nodesmap[i], i); + was_redesigned=true; + } - double attraction; - double propulsation; - int iterations; + double attraction; + double propulsation; + int iterations; - (mytab.mapstorage).get_design_data(attraction, propulsation, iterations); + (mytab.mapstorage).get_design_data(attraction, propulsation, iterations); - //iteration counter - for(int l=0;l x(mytab.mapstorage.graph); - Graph::NodeMap y(mytab.mapstorage.graph); - XYMap > actual_forces; - actual_forces.setXMap(x); - actual_forces.setYMap(y); + //iteration counter + for(int l=0;l x(mytab.mapstorage.graph); + Graph::NodeMap y(mytab.mapstorage.graph); + XYMap > actual_forces; + actual_forces.setXMap(x); + actual_forces.setYMap(y); - //count actual force for each nodes - for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i) - { - //propulsation of nodes - for (NodeIt j((mytab.mapstorage).graph); j!=INVALID; ++j) + //count actual force for each nodes + for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i) { - if(i!=j) + //propulsation of nodes + for (NodeIt j((mytab.mapstorage).graph); j!=INVALID; ++j) + { + if(i!=j) + { + lemon::dim2::Point delta = + ((mytab.mapstorage).coords[i]- + (mytab.mapstorage).coords[j]); + + const double length_sqr=std::max(delta.normSquare(),min_dist); + + //normalize vector + delta/=sqrt(length_sqr); + + //calculating propulsation strength + //greater distance menas smaller propulsation strength + delta*=propulsation/length_sqr; + + actual_forces.set(i,(actual_forces[i]+delta)); + } + } + //attraction of nodes, to which actual node is bound + for(OutEdgeIt ei((mytab.mapstorage).graph,i);ei!=INVALID;++ei) { lemon::dim2::Point delta = ((mytab.mapstorage).coords[i]- - (mytab.mapstorage).coords[j]); - - const double length_sqr=std::max(delta.normSquare(),min_dist); - - //normalize vector - delta/=sqrt(length_sqr); - - //calculating propulsation strength - //greater distance menas smaller propulsation strength - delta*=propulsation/length_sqr; - - actual_forces.set(i,(actual_forces[i]+delta)); + (mytab.mapstorage).coords[mytab.mapstorage. + graph.target(ei)]); + + //calculating attraction strength + //greater distance means greater strength + delta*=attraction; + + actual_forces.set(i,actual_forces[i]-delta); + } + for(InEdgeIt ei((mytab.mapstorage).graph,i);ei!=INVALID;++ei) + { + lemon::dim2::Point delta = + ((mytab.mapstorage).coords[i]- + (mytab.mapstorage).coords[mytab.mapstorage. + graph.source(ei)]); + + //calculating attraction strength + //greater distance means greater strength + delta*=attraction; + + actual_forces.set(i,actual_forces[i]-delta); } } - //attraction of nodes, to which actual node is bound - for(OutEdgeIt ei((mytab.mapstorage).graph,i);ei!=INVALID;++ei) + for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i) { - lemon::dim2::Point delta = - ((mytab.mapstorage).coords[i]- - (mytab.mapstorage).coords[mytab.mapstorage. - graph.target(ei)]); - - //calculating attraction strength - //greater distance means greater strength - delta*=attraction; - - actual_forces.set(i,actual_forces[i]-delta); + if(((mytab.mapstorage).coords[i].x)+actual_forces[i].x>max_coord) + { + actual_forces[i].x=max_coord-((mytab.mapstorage).coords[i].x); + std::cout << "Correction! " << (((mytab.mapstorage).coords[i].x)+actual_forces[i].x) << std::endl; + } + else if(((mytab.mapstorage).coords[i].x)+actual_forces[i].x<(0-max_coord)) + { + actual_forces[i].x=0-max_coord-((mytab.mapstorage).coords[i].x); + std::cout << "Correction! " << (((mytab.mapstorage).coords[i].x)+actual_forces[i].x) << std::endl; + } + if(((mytab.mapstorage).coords[i].y)+actual_forces[i].y>max_coord) + { + actual_forces[i].y=max_coord-((mytab.mapstorage).coords[i].y); + std::cout << "Correction! " << (((mytab.mapstorage).coords[i].y)+actual_forces[i].y) << std::endl; + } + else if(((mytab.mapstorage).coords[i].y)+actual_forces[i].y<(0-max_coord)) + { + actual_forces[i].y=0-max_coord-((mytab.mapstorage).coords[i].y); + std::cout << "Correction! " << (((mytab.mapstorage).coords[i].y)+actual_forces[i].y) << std::endl; + } + moveNode(actual_forces[i].x, actual_forces[i].y, nodesmap[i], i); } - for(InEdgeIt ei((mytab.mapstorage).graph,i);ei!=INVALID;++ei) - { - lemon::dim2::Point delta = - ((mytab.mapstorage).coords[i]- - (mytab.mapstorage).coords[mytab.mapstorage. - graph.source(ei)]); - - //calculating attraction strength - //greater distance means greater strength - delta*=attraction; - - actual_forces.set(i,actual_forces[i]-delta); - } - } - for (NodeIt i((mytab.mapstorage).graph); i!=INVALID; ++i) - { - if(((mytab.mapstorage).coords[i].x)+actual_forces[i].x>max_coord) - { - actual_forces[i].x=max_coord-((mytab.mapstorage).coords[i].x); - std::cout << "Correction! " << (((mytab.mapstorage).coords[i].x)+actual_forces[i].x) << std::endl; - } - else if(((mytab.mapstorage).coords[i].x)+actual_forces[i].x<(0-max_coord)) - { - actual_forces[i].x=0-max_coord-((mytab.mapstorage).coords[i].x); - std::cout << "Correction! " << (((mytab.mapstorage).coords[i].x)+actual_forces[i].x) << std::endl; - } - if(((mytab.mapstorage).coords[i].y)+actual_forces[i].y>max_coord) - { - actual_forces[i].y=max_coord-((mytab.mapstorage).coords[i].y); - std::cout << "Correction! " << (((mytab.mapstorage).coords[i].y)+actual_forces[i].y) << std::endl; - } - else if(((mytab.mapstorage).coords[i].y)+actual_forces[i].y<(0-max_coord)) - { - actual_forces[i].y=0-max_coord-((mytab.mapstorage).coords[i].y); - std::cout << "Correction! " << (((mytab.mapstorage).coords[i].y)+actual_forces[i].y) << std::endl; - } - moveNode(actual_forces[i].x, actual_forces[i].y, nodesmap[i], i); } } } diff -r 8b69c54d5bf0 -r 2cac5b936a2b main_win.cc --- a/main_win.cc Tue Feb 20 15:46:19 2007 +0000 +++ b/main_win.cc Tue Feb 20 17:45:44 2007 +0000 @@ -229,6 +229,7 @@ if (toolbar) { static_cast(toolbar)->set_toolbar_style(Gtk::TOOLBAR_ICONS); + static_cast(toolbar)->set_tooltips(true); //hbox.pack_start(*toolbar, Gtk::PACK_EXPAND_WIDGET); table.attach(*toolbar, 0, 1, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK); @@ -269,8 +270,32 @@ table.attach(table2, 1, 2, 0, 2, Gtk::SHRINK, Gtk::SHRINK); - tooltips.set_tip(*(uim->get_widget("/ToolBar/CreateNode")),"Create Node"); - tooltips.enable(); + tooltips=Gtk::manage(new Gtk::Tooltips()); + if(tooltips) + { + tooltips->set_tip(*zoom_track, "If on, edge widths and node radiuses are constant, independent from zooming"); + tooltips->set_tip(*auto_scale, "If on, glemon automatically determines the size of edges and nodes"); + tooltips->set_tip(*radius_size, "Sets maximum node radius, if auto-scale is off"); + tooltips->set_tip(*edge_width, "Sets maximum edge width, if auto-scale is off"); + + static_cast(uim->get_widget("/ToolBar/FileNew"))->set_tooltip(*tooltips, "Inserts new tab"); + static_cast(uim->get_widget("/ToolBar/FileOpen"))->set_tooltip(*tooltips, "Lets you open a file"); + static_cast(uim->get_widget("/ToolBar/FileSave"))->set_tooltip(*tooltips, "Saves the graph on the active tab"); + static_cast(uim->get_widget("/ToolBar/Close"))->set_tooltip(*tooltips, "Closes the active tab"); + static_cast(uim->get_widget("/ToolBar/ViewZoomIn"))->set_tooltip(*tooltips, "Zoom in the graph"); + static_cast(uim->get_widget("/ToolBar/ViewZoomOut"))->set_tooltip(*tooltips, "Zoom out the graph"); + static_cast(uim->get_widget("/ToolBar/ViewZoom100"))->set_tooltip(*tooltips, "Shows actual size of graph"); + static_cast(uim->get_widget("/ToolBar/ViewZoomFit"))->set_tooltip(*tooltips, "Fits graph into window"); + static_cast(uim->get_widget("/ToolBar/MoveItem"))->set_tooltip(*tooltips, "Moves the clicked item (edge/node)"); + static_cast(uim->get_widget("/ToolBar/CreateNode"))->set_tooltip(*tooltips, "Adds new node"); + static_cast(uim->get_widget("/ToolBar/CreateEdge"))->set_tooltip(*tooltips, "Lets you create new edge"); + static_cast(uim->get_widget("/ToolBar/EraseItem"))->set_tooltip(*tooltips, "Erases the clicked item (edge/node)"); + static_cast(uim->get_widget("/ToolBar/EditEdgeMap"))->set_tooltip(*tooltips, "Lets you edit the values written on the items"); + static_cast(uim->get_widget("/ToolBar/AddMap"))->set_tooltip(*tooltips, "Adds edge/nodemap"); + static_cast(uim->get_widget("/ToolBar/DesignGraph"))->set_tooltip(*tooltips, "Redesigns your graph, supposing elastic edges and propulsation of nodes."); + + tooltips->enable(); + } active_tab=-1; notebook.signal_switch_page().connect(sigc::mem_fun(*this, &MainWin::onChangeTab)); diff -r 8b69c54d5bf0 -r 2cac5b936a2b main_win.h --- a/main_win.h Tue Feb 20 15:46:19 2007 +0000 +++ b/main_win.h Tue Feb 20 17:45:44 2007 +0000 @@ -117,7 +117,7 @@ void readFile(const std::string &); ///Tooltips - Gtk::Tooltips tooltips; + Gtk::Tooltips * tooltips; //Call-backs of buttons