1.1 --- a/gui/graph_displayer_canvas-event.cc Wed Jul 20 22:36:37 2005 +0000
1.2 +++ b/gui/graph_displayer_canvas-event.cc Thu Jul 21 19:28:29 2005 +0000
1.3 @@ -29,7 +29,16 @@
1.4 break;
1.5 }
1.6 case EDGE_MAP_EDIT:
1.7 - break;
1.8 + //has to do the same thing as in the case of NODE_MAP_EDIT
1.9 + case NODE_MAP_EDIT:
1.10 + {
1.11 + GdkEvent * generated=new GdkEvent();
1.12 + generated->type=GDK_KEY_PRESS;
1.13 + ((GdkEventKey*)generated)->keyval=GDK_KP_Enter;
1.14 + entryWidgetChangeHandler(generated);
1.15 + entrywidget.hide();
1.16 + break;
1.17 + }
1.18 default:
1.19 break;
1.20 }
1.21 @@ -218,9 +227,6 @@
1.22
1.23 window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
1.24
1.25 - target_item=NULL;
1.26 - target_item=get_item_at(clicked_x, clicked_y);
1.27 -
1.28 nodesmap[active_node]=new Gnome::Canvas::Ellipse(displayed_graph, clicked_x-20, clicked_y-20, clicked_x+20, clicked_y+20);
1.29 active_item=(Gnome::Canvas::Item *)(nodesmap[active_node]);
1.30 *(nodesmap[active_node]) << Gnome::Canvas::Properties::fill_color("red");
1.31 @@ -247,11 +253,20 @@
1.32
1.33 //finalize the new node
1.34 case GDK_BUTTON_RELEASE:
1.35 + window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
1.36 +
1.37 + active_item->lower_to_bottom();
1.38 +
1.39 + target_item=NULL;
1.40 + target_item=get_item_at(clicked_x, clicked_y);
1.41 +
1.42 + active_item->raise_to_top();
1.43 +
1.44 isbutton=0;
1.45 - if(!target_item)
1.46 + if(target_item==active_item)
1.47 {
1.48 //Its appropriate color is given by update.
1.49 - //*active_item << Gnome::Canvas::Properties::fill_color("blue");
1.50 + *active_item << Gnome::Canvas::Properties::fill_color("blue");
1.51 }
1.52 else
1.53 {
1.54 @@ -508,16 +523,7 @@
1.55 {
1.56 case GDK_KEY_PRESS:
1.57 {
1.58 - std::cout << "Any button was pressed" << std::endl;
1.59 - switch(((GdkEventKey*)e)->keyval)
1.60 - {
1.61 - case GDK_A:
1.62 - std::cout << "A button was pressed" << std::endl;
1.63 - break;
1.64 - default:
1.65 - break;
1.66 - }
1.67 -
1.68 + nodeMapEditEventHandler(e);
1.69 break;
1.70 }
1.71 case GDK_BUTTON_PRESS:
1.72 @@ -555,8 +561,10 @@
1.73 }
1.74 else
1.75 {
1.76 - //mentse el -> problema, hogy nem tudja melyik map-be
1.77 - entrywidget.hide();
1.78 + GdkEvent * generated=new GdkEvent();
1.79 + generated->type=GDK_KEY_PRESS;
1.80 + ((GdkEventKey*)generated)->keyval=GDK_KP_Enter;
1.81 + entryWidgetChangeHandler(generated);
1.82 }
1.83 break;
1.84 }
1.85 @@ -568,15 +576,169 @@
1.86
1.87 bool GraphDisplayerCanvas::nodeMapEditEventHandler(GdkEvent* e)
1.88 {
1.89 - e=e;
1.90 - return false;
1.91 + switch(e->type)
1.92 + {
1.93 + case GDK_KEY_PRESS:
1.94 + {
1.95 + switch(((GdkEventKey*)e)->keyval)
1.96 + {
1.97 + case GDK_Escape:
1.98 + entrywidget.hide();
1.99 + break;
1.100 + case GDK_Return:
1.101 + case GDK_KP_Enter:
1.102 + entrywidget.hide();
1.103 + break;
1.104 + default:
1.105 + break;
1.106 + }
1.107 +
1.108 + break;
1.109 + }
1.110 + case GDK_BUTTON_PRESS:
1.111 + {
1.112 + window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
1.113 + active_item=(get_item_at(clicked_x, clicked_y));
1.114 + Graph::NodeIt clicked_node=INVALID;
1.115 + for (NodeIt i(g); i!=INVALID; ++i)
1.116 + {
1.117 + if(nodesmap[i]==active_item)
1.118 + {
1.119 + clicked_node=i;
1.120 + }
1.121 + }
1.122 + if(clicked_node!=INVALID)
1.123 + {
1.124 + //If there is already edited edge, it has to be saved first
1.125 + if(entrywidget.is_visible())
1.126 + {
1.127 + GdkEvent * generated=new GdkEvent();
1.128 + generated->type=GDK_KEY_PRESS;
1.129 + ((GdkEventKey*)generated)->keyval=GDK_KP_Enter;
1.130 + entryWidgetChangeHandler(generated);
1.131 + }
1.132 + //If the previous value could be saved, we can go further, otherwise not
1.133 + if(!entrywidget.is_visible())
1.134 + {
1.135 +
1.136 + if(nodetextmap[clicked_node]->property_text().get_value()!="")
1.137 + {
1.138 + active_node=clicked_node;
1.139 + if(canvasentrywidget)
1.140 + {
1.141 + delete(canvasentrywidget);
1.142 + }
1.143 + entrywidget.show();
1.144 + entrywidget.set_text(nodetextmap[active_node]->property_text().get_value());
1.145 + xy<double> entry_coos;
1.146 + entry_coos.x=(nodetextmap[active_node])->property_x().get_value();
1.147 + entry_coos.x-=nodetextmap[active_node]->property_text_width().get_value()/2;
1.148 + entry_coos.y=(nodetextmap[active_node])->property_y().get_value();
1.149 + entry_coos.y-=nodetextmap[active_node]->property_text_height().get_value()*1.5/2;
1.150 + canvasentrywidget=new Gnome::Canvas::Widget(displayed_graph, entry_coos.x, entry_coos.y, entrywidget);
1.151 + canvasentrywidget->property_width().set_value(nodetextmap[active_node]->property_text_width().get_value()*1.5);
1.152 + canvasentrywidget->property_height().set_value(nodetextmap[active_node]->property_text_height().get_value()*1.5);
1.153 + }
1.154 + }
1.155 + }
1.156 + else
1.157 + {
1.158 + GdkEvent * generated=new GdkEvent();
1.159 + generated->type=GDK_KEY_PRESS;
1.160 + ((GdkEventKey*)generated)->keyval=GDK_KP_Enter;
1.161 + entryWidgetChangeHandler(generated);
1.162 + }
1.163 + break;
1.164 + }
1.165 + default:
1.166 + break;
1.167 + }
1.168 + return false;
1.169 }
1.170
1.171 bool GraphDisplayerCanvas::entryWidgetChangeHandler(GdkEvent* e)
1.172 {
1.173 - Glib::ustring mapvalue = entrywidget.get_text();
1.174 - std::cout << mapvalue << std::endl;
1.175 - e=e;
1.176 + if(entrywidget.is_visible())
1.177 + {
1.178 + if(e->type==GDK_KEY_PRESS)
1.179 + {
1.180 + switch(((GdkEventKey*)e)->keyval)
1.181 + {
1.182 + case GDK_Escape:
1.183 + entrywidget.hide();
1.184 + break;
1.185 + case GDK_KP_Enter:
1.186 + case GDK_Return:
1.187 + {
1.188 + Glib::ustring mapvalue = entrywidget.get_text();
1.189 +
1.190 + double double_map_fract_value=0;
1.191 + double double_map_value=0;
1.192 + int offset=0;
1.193 + int found_letter=0;
1.194 + //converting text to double
1.195 + for(int i=0;i<(int)(mapvalue.length());i++)
1.196 + {
1.197 + if(((mapvalue[i]<='9')&&(mapvalue[i]>='0'))||(mapvalue[i]=='.'))
1.198 + {
1.199 + if(mapvalue[i]=='.')
1.200 + {
1.201 + //for calculating non-integer part of double we step backward from the end
1.202 + //after each step the number will be divided by ten, and the new value will be added
1.203 + //to step backward from the end until the point the actual character of the string is the following:
1.204 + // mapvalue.length()-(i-position_of_point)
1.205 + //if i was the number of the first character after the decimal point the selected character will be the last
1.206 + //if i was the number of the last character, the selected character will be the first after the decimal point
1.207 + offset=mapvalue.length()+i;
1.208 + }
1.209 + else
1.210 + {
1.211 + if(!offset)
1.212 + {
1.213 + double_map_value=10*double_map_value+mapvalue[i]-'0';
1.214 + }
1.215 + else
1.216 + {
1.217 + double_map_fract_value=double_map_fract_value/10+(double)(mapvalue[offset-i]-'0')/10;
1.218 + }
1.219 + }
1.220 + }
1.221 + else
1.222 + {
1.223 + found_letter++;
1.224 + continue;
1.225 + }
1.226 + }
1.227 +
1.228 + if(!found_letter)
1.229 + {
1.230 + switch(actual_tool)
1.231 + {
1.232 + case EDGE_MAP_EDIT:
1.233 + edgetextmap[active_edge]->property_text().set_value(mapvalue);
1.234 + (*(mapstorage.edgemap_storage)[edgemap_to_edit])[active_edge]=double_map_value+double_map_fract_value;
1.235 + break;
1.236 + case NODE_MAP_EDIT:
1.237 + nodetextmap[active_node]->property_text().set_value(mapvalue);
1.238 + (*(mapstorage.nodemap_storage)[nodemap_to_edit])[active_node]=double_map_value+double_map_fract_value;
1.239 + break;
1.240 + default:
1.241 + break;
1.242 + }
1.243 + entrywidget.hide();
1.244 + }
1.245 + else
1.246 + {
1.247 + std::cout << "ERROR: only handling of double values is implemented yet!" << std::endl;
1.248 + }
1.249 +
1.250 + break;
1.251 + }
1.252 + default:
1.253 + break;
1.254 + }
1.255 + }
1.256 + }
1.257 return false;
1.258 }
1.259
1.260 @@ -604,15 +766,15 @@
1.261 void GraphDisplayerCanvas::textReposition(xy<double> new_place)
1.262 {
1.263 new_place+=(xy<double>(10,10));
1.264 - edgetextmap[active_edge]->property_x().set_value(new_place.x);
1.265 - edgetextmap[active_edge]->property_y().set_value(new_place.y);
1.266 + edgetextmap[forming_edge]->property_x().set_value(new_place.x);
1.267 + edgetextmap[forming_edge]->property_y().set_value(new_place.y);
1.268 }
1.269
1.270 void GraphDisplayerCanvas::toggleEdgeActivity(BrokenEdge* active_bre, bool on)
1.271 {
1.272 if(on)
1.273 {
1.274 - if(active_edge!=INVALID)
1.275 + if(forming_edge!=INVALID)
1.276 {
1.277 std::cout << "ERROR!!!! Valid edge found!" << std::endl;
1.278 }
1.279 @@ -622,16 +784,16 @@
1.280 {
1.281 if(edgesmap[i]==active_bre)
1.282 {
1.283 - active_edge=i;
1.284 + forming_edge=i;
1.285 }
1.286 }
1.287 }
1.288 }
1.289 else
1.290 {
1.291 - if(active_edge!=INVALID)
1.292 + if(forming_edge!=INVALID)
1.293 {
1.294 - active_edge=INVALID;
1.295 + forming_edge=INVALID;
1.296 }
1.297 else
1.298 {