graph_displayer_canvas-event.cc
branchgui
changeset 35 79bffdf6aea2
parent 34 2cb1fc37f742
child 37 1dc5b49457c0
     1.1 --- a/graph_displayer_canvas-event.cc	Fri Jul 15 21:17:18 2005 +0000
     1.2 +++ b/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  	{