hegyi@89: #include "map_win.h" hegyi@81: hegyi@90: MapWin::MapSelector::MapSelector(GraphDisplayerCanvas & grdispc, MapStorage & mapst, int identifier, bool edge):gdc(grdispc),ms(mapst),id(identifier),itisedge(edge),default_state(true),set_new_map(false),node_to_update(INVALID),edge_to_update(INVALID) hegyi@81: { hegyi@81: update_list(); hegyi@81: hegyi@81: cbt.set_active(0); hegyi@81: hegyi@81: //binding signal to the actual entry hegyi@81: cbt.signal_changed().connect hegyi@81: ( hegyi@89: sigc::mem_fun((*this), &MapWin::MapSelector::comboChanged), hegyi@81: false hegyi@81: ); hegyi@81: hegyi@81: if(itisedge) hegyi@81: { hegyi@81: label=new Gtk::Label(edge_property_strings[id]); hegyi@81: } hegyi@81: else hegyi@81: { hegyi@81: label=new Gtk::Label(node_property_strings[id]); hegyi@81: } hegyi@81: hegyi@81: label->set_width_chars(longest_property_string_length); hegyi@81: hegyi@81: defbut=new Gtk::Button(); hegyi@81: defbut->set_label("Reset"); hegyi@81: hegyi@81: defbut->signal_pressed().connect hegyi@81: ( hegyi@89: sigc::mem_fun(*this, &MapWin::MapSelector::reset) hegyi@81: ); hegyi@81: hegyi@81: newbut=new Gtk::Button(Gtk::Stock::NEW); hegyi@81: hegyi@82: newbut->signal_pressed().connect hegyi@82: ( hegyi@89: sigc::mem_fun(*this, &MapWin::MapSelector::new_but_pressed) hegyi@82: ); hegyi@82: hegyi@81: add(*label); hegyi@81: hegyi@81: add(cbt); hegyi@81: hegyi@81: add(*defbut); hegyi@81: add(*newbut); hegyi@81: } hegyi@81: hegyi@89: void MapWin::MapSelector::new_but_pressed() hegyi@85: { hegyi@85: set_new_map=true; hegyi@90: (new NewMapWin("NewMapWin", gdc, itisedge, false))->run(); hegyi@85: } hegyi@85: hegyi@89: void MapWin::MapSelector::update_list() hegyi@81: { hegyi@81: cbt.clear(); hegyi@81: if(itisedge) hegyi@81: { hegyi@81: std::map< std::string,Graph::EdgeMap * >::iterator emsi=ms.beginOfEdgeMaps(); hegyi@81: for(;emsi!=ms.endOfEdgeMaps();emsi++) hegyi@81: { hegyi@81: cbt.append_text(emsi->first); hegyi@81: } hegyi@81: } hegyi@81: else hegyi@81: { hegyi@81: std::map< std::string,Graph::NodeMap * >::iterator emsi=ms.beginOfNodeMaps(); hegyi@81: for(;emsi!=ms.endOfNodeMaps();emsi++) hegyi@81: { hegyi@81: cbt.append_text(emsi->first); hegyi@81: } hegyi@81: } hegyi@81: cbt.prepend_text("Default values"); hegyi@81: } hegyi@81: hegyi@89: void MapWin::MapSelector::comboChanged() hegyi@81: { hegyi@81: if(cbt.get_active_row_number()!=0) hegyi@81: { hegyi@81: default_state=false; hegyi@81: Glib::ustring mapname = cbt.get_active_text(); hegyi@81: if(!(mapname.empty())) //We seem to get 2 signals, one when the text is empty. hegyi@81: { hegyi@81: if(itisedge) hegyi@81: { hegyi@81: if( ( (ms.edgemap_storage).find(mapname) != (ms.edgemap_storage).end() ) ) hegyi@81: { hegyi@81: Edge edge=edge_to_update; hegyi@81: switch(id) hegyi@81: { hegyi@81: case E_WIDTH: hegyi@81: gdc.changeEdgeWidth(mapname, edge); hegyi@81: break; hegyi@81: case E_COLOR: hegyi@81: gdc.changeEdgeColor(mapname, edge); hegyi@81: break; hegyi@81: case E_TEXT: hegyi@81: gdc.changeEdgeText(mapname, edge); hegyi@81: break; hegyi@81: default: hegyi@81: std::cerr<<"Error\n"; hegyi@81: } hegyi@81: } hegyi@81: } hegyi@81: else hegyi@81: { hegyi@81: if( ( (ms.nodemap_storage).find(mapname) != (ms.nodemap_storage).end() ) ) hegyi@81: { hegyi@81: Node node=node_to_update; hegyi@81: switch(id) hegyi@81: { hegyi@81: case N_RADIUS: hegyi@81: gdc.changeNodeRadius(mapname, node); hegyi@81: break; hegyi@81: case N_COLOR: hegyi@81: gdc.changeNodeColor(mapname, node); hegyi@81: break; hegyi@81: case N_TEXT: hegyi@81: gdc.changeNodeText(mapname, node); hegyi@81: break; hegyi@81: default: hegyi@81: std::cerr<<"Error\n"; hegyi@81: } hegyi@81: } hegyi@81: } hegyi@81: } hegyi@81: } hegyi@81: else if((!default_state)&&(cbt.get_active_row_number()==0)) hegyi@81: { hegyi@81: reset(); hegyi@81: } hegyi@81: } hegyi@81: hegyi@89: void MapWin::MapSelector::reset() hegyi@81: { hegyi@81: default_state=true; hegyi@81: cbt.set_active(0); hegyi@81: hegyi@81: if(itisedge) hegyi@81: { hegyi@81: Edge edge=edge_to_update; hegyi@81: switch(id) hegyi@81: { hegyi@81: case E_WIDTH: hegyi@81: gdc.resetEdgeWidth(edge); hegyi@81: break; hegyi@81: case E_COLOR: hegyi@81: gdc.resetEdgeColor(edge); hegyi@81: break; hegyi@81: case E_TEXT: hegyi@81: gdc.resetEdgeText(edge); hegyi@81: break; hegyi@81: default: hegyi@81: std::cerr<<"Error\n"; hegyi@81: } hegyi@81: } hegyi@81: else hegyi@81: { hegyi@81: Node node=node_to_update; hegyi@81: switch(id) hegyi@81: { hegyi@81: case N_RADIUS: hegyi@81: gdc.resetNodeRadius(node); hegyi@81: break; hegyi@81: case N_COLOR: hegyi@81: gdc.resetNodeColor(node); hegyi@81: break; hegyi@81: case N_TEXT: hegyi@81: gdc.resetNodeText(node); hegyi@81: break; hegyi@81: default: hegyi@81: std::cerr<<"Error\n"; hegyi@81: } hegyi@81: } hegyi@81: } hegyi@81: hegyi@89: void MapWin::MapSelector::update(Node node) hegyi@81: { hegyi@81: node_to_update=node; hegyi@81: if(default_state) hegyi@81: { hegyi@81: reset(); hegyi@81: } hegyi@81: else hegyi@81: { hegyi@81: comboChanged(); hegyi@81: } hegyi@81: node_to_update=INVALID; hegyi@81: } hegyi@81: hegyi@89: void MapWin::MapSelector::update(Edge edge) hegyi@81: { hegyi@81: edge_to_update=edge; hegyi@81: if(default_state) hegyi@81: { hegyi@81: reset(); hegyi@81: } hegyi@81: else hegyi@81: { hegyi@81: comboChanged(); hegyi@81: } hegyi@81: edge_to_update=INVALID; hegyi@81: } hegyi@81: hegyi@89: Glib::ustring MapWin::MapSelector::get_active_text() hegyi@81: { hegyi@81: return cbt.get_active_text(); hegyi@81: } hegyi@81: hegyi@89: void MapWin::MapSelector::set_active_text(Glib::ustring text) hegyi@81: { hegyi@81: cbt.set_active_text(text); hegyi@81: } hegyi@81: hegyi@89: void MapWin::MapSelector::append_text(Glib::ustring text) hegyi@81: { hegyi@81: cbt.append_text(text); hegyi@85: if(set_new_map) hegyi@85: { hegyi@85: set_active_text(text); hegyi@85: set_new_map=false; hegyi@85: } hegyi@81: }