[Lemon-commits] [lemon_svn] hegyi: r2081 - hugo/trunk/gui

Lemon SVN svn at lemon.cs.elte.hu
Mon Nov 6 20:49:59 CET 2006


Author: hegyi
Date: Thu Jul 21 21:28:29 2005
New Revision: 2081

Modified:
   hugo/trunk/gui/graph_displayer_canvas-edge.cc
   hugo/trunk/gui/graph_displayer_canvas-event.cc
   hugo/trunk/gui/graph_displayer_canvas-node.cc
   hugo/trunk/gui/graph_displayer_canvas.cc
   hugo/trunk/gui/graph_displayer_canvas.h
   hugo/trunk/gui/graphocska.lgf

Log:
Edge and nodemap edition is done.

Modified: hugo/trunk/gui/graph_displayer_canvas-edge.cc
==============================================================================
--- hugo/trunk/gui/graph_displayer_canvas-edge.cc	(original)
+++ hugo/trunk/gui/graph_displayer_canvas-edge.cc	Thu Jul 21 21:28:29 2005
@@ -118,6 +118,7 @@
 	{
 	  if(mapname!="Default")
 	    {
+	      edgemap_to_edit=mapname;
 	      double number=(*(mapstorage.edgemap_storage)[mapname])[i];
 	      int length=1;
 	      //if number is smaller than one, length would be negative, or invalid
@@ -146,6 +147,7 @@
 	    }
 	  else
 	    {
+	      edgemap_to_edit="";
 	      edgetextmap[i]->property_text().set_value("");
 	    }
 	}

Modified: hugo/trunk/gui/graph_displayer_canvas-event.cc
==============================================================================
--- hugo/trunk/gui/graph_displayer_canvas-event.cc	(original)
+++ hugo/trunk/gui/graph_displayer_canvas-event.cc	Thu Jul 21 21:28:29 2005
@@ -29,7 +29,16 @@
 	    break;
 	  }
 	case EDGE_MAP_EDIT:
-	  break;
+	  //has to do the same thing as in the case of NODE_MAP_EDIT
+	case NODE_MAP_EDIT:
+	  {
+	    GdkEvent * generated=new GdkEvent();
+	    generated->type=GDK_KEY_PRESS;
+	    ((GdkEventKey*)generated)->keyval=GDK_KP_Enter;
+	    entryWidgetChangeHandler(generated);
+	    entrywidget.hide();
+	    break;
+	  }
 	default:
 	  break;
 	}
@@ -218,9 +227,6 @@
 
       window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
 
-      target_item=NULL;
-      target_item=get_item_at(clicked_x, clicked_y);
-
       nodesmap[active_node]=new Gnome::Canvas::Ellipse(displayed_graph, clicked_x-20, clicked_y-20, clicked_x+20, clicked_y+20);
       active_item=(Gnome::Canvas::Item *)(nodesmap[active_node]);
       *(nodesmap[active_node]) << Gnome::Canvas::Properties::fill_color("red");
@@ -247,11 +253,20 @@
 
       //finalize the new node
     case GDK_BUTTON_RELEASE:
+      window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
+
+      active_item->lower_to_bottom();
+
+      target_item=NULL;
+      target_item=get_item_at(clicked_x, clicked_y);
+
+      active_item->raise_to_top();
+
       isbutton=0;
-      if(!target_item)
+      if(target_item==active_item)
 	{
 	  //Its appropriate color is given by update.
-	  //*active_item << Gnome::Canvas::Properties::fill_color("blue");
+	  *active_item << Gnome::Canvas::Properties::fill_color("blue");
 	}
       else
 	{
@@ -508,16 +523,7 @@
     {
     case GDK_KEY_PRESS:
       {
-	std::cout << "Any button was pressed" << std::endl;
-	switch(((GdkEventKey*)e)->keyval)
-	  {
-	  case GDK_A:
-	    std::cout << "A button was pressed" << std::endl;
-	    break;
-	  default:
-	    break;
-	  }
-  
+	nodeMapEditEventHandler(e);
 	break;
       }
     case GDK_BUTTON_PRESS:
@@ -555,8 +561,10 @@
 	  }
 	else
 	  {
-	    //mentse el -> problema, hogy nem tudja melyik map-be
-	    entrywidget.hide();
+	    GdkEvent * generated=new GdkEvent();
+	    generated->type=GDK_KEY_PRESS;
+	    ((GdkEventKey*)generated)->keyval=GDK_KP_Enter;
+	    entryWidgetChangeHandler(generated);
 	  }
 	break;
       }
@@ -568,15 +576,169 @@
 
 bool GraphDisplayerCanvas::nodeMapEditEventHandler(GdkEvent* e)
 {
-  e=e;
-  return false;
+  switch(e->type)
+    {
+    case GDK_KEY_PRESS:
+      {
+	switch(((GdkEventKey*)e)->keyval)
+	  {
+	  case GDK_Escape:
+	    entrywidget.hide();
+	    break;
+	  case GDK_Return:
+	  case GDK_KP_Enter:
+	    entrywidget.hide();
+	    break;
+	  default:
+	    break;
+	  }
+  
+	break;
+      }
+    case GDK_BUTTON_PRESS:
+      {
+	window_to_world (e->button.x, e->button.y, clicked_x, clicked_y);
+	active_item=(get_item_at(clicked_x, clicked_y));
+	Graph::NodeIt clicked_node=INVALID;
+	for (NodeIt i(g); i!=INVALID; ++i)
+	  {
+	    if(nodesmap[i]==active_item)
+	      {
+		clicked_node=i;
+	      }
+	  }
+	if(clicked_node!=INVALID)
+	  {
+	    //If there is already edited edge, it has to be saved first
+	    if(entrywidget.is_visible())
+	      {
+		GdkEvent * generated=new GdkEvent();
+		generated->type=GDK_KEY_PRESS;
+		((GdkEventKey*)generated)->keyval=GDK_KP_Enter;
+		entryWidgetChangeHandler(generated);
+	      }
+	    //If the previous value could be saved, we can go further, otherwise not
+	    if(!entrywidget.is_visible())
+	      {
+
+		if(nodetextmap[clicked_node]->property_text().get_value()!="")
+		  {
+		    active_node=clicked_node;
+		    if(canvasentrywidget)
+		      {
+			delete(canvasentrywidget);
+		      }
+		    entrywidget.show();
+		    entrywidget.set_text(nodetextmap[active_node]->property_text().get_value());
+		    xy<double> entry_coos;
+		    entry_coos.x=(nodetextmap[active_node])->property_x().get_value();
+		    entry_coos.x-=nodetextmap[active_node]->property_text_width().get_value()/2;
+		    entry_coos.y=(nodetextmap[active_node])->property_y().get_value();
+		    entry_coos.y-=nodetextmap[active_node]->property_text_height().get_value()*1.5/2;
+		    canvasentrywidget=new Gnome::Canvas::Widget(displayed_graph, entry_coos.x, entry_coos.y, entrywidget);
+		    canvasentrywidget->property_width().set_value(nodetextmap[active_node]->property_text_width().get_value()*1.5);
+		    canvasentrywidget->property_height().set_value(nodetextmap[active_node]->property_text_height().get_value()*1.5);
+		  }
+	      }
+	  }
+	else
+	  {
+	    GdkEvent * generated=new GdkEvent();
+	    generated->type=GDK_KEY_PRESS;
+	    ((GdkEventKey*)generated)->keyval=GDK_KP_Enter;
+	    entryWidgetChangeHandler(generated);
+	  }
+	break;
+      }
+    default:
+      break;
+    }
+  return false;  
 }
 
 bool GraphDisplayerCanvas::entryWidgetChangeHandler(GdkEvent* e)
 {
-  Glib::ustring mapvalue = entrywidget.get_text();
-  std::cout << mapvalue << std::endl;
-  e=e;
+  if(entrywidget.is_visible())
+    {
+      if(e->type==GDK_KEY_PRESS)
+	{
+	  switch(((GdkEventKey*)e)->keyval)
+	    {
+	    case GDK_Escape:
+	      entrywidget.hide();
+	      break;
+	    case GDK_KP_Enter:
+	    case GDK_Return:
+	      {
+		Glib::ustring mapvalue = entrywidget.get_text();
+
+		double double_map_fract_value=0;
+		double double_map_value=0;
+		int offset=0;
+		int found_letter=0;
+		//converting text to double
+		for(int i=0;i<(int)(mapvalue.length());i++)
+		  {
+		    if(((mapvalue[i]<='9')&&(mapvalue[i]>='0'))||(mapvalue[i]=='.'))
+		      {
+			if(mapvalue[i]=='.')
+			  {
+			    //for calculating non-integer part of double we step backward from the end
+			    //after each step the number will be divided by ten, and the new value will be added
+			    //to step backward from the end until the point the actual character of the string is the following:
+			    // mapvalue.length()-(i-position_of_point)
+			    //if i was the number of the first character after the decimal point the selected character will be the last
+			    //if i was the number of the last character, the selected character will be the first after the decimal point
+			    offset=mapvalue.length()+i;
+			  }
+			else
+			  {
+			    if(!offset)
+			      {
+				double_map_value=10*double_map_value+mapvalue[i]-'0';
+			      }
+			    else
+			      {
+				double_map_fract_value=double_map_fract_value/10+(double)(mapvalue[offset-i]-'0')/10;
+			      }
+			  }
+		      }
+		    else
+		      {
+			found_letter++;
+			continue;
+		      }
+		  }
+
+		if(!found_letter)
+		  {
+		    switch(actual_tool)
+		      {
+		      case EDGE_MAP_EDIT:
+			edgetextmap[active_edge]->property_text().set_value(mapvalue);
+			(*(mapstorage.edgemap_storage)[edgemap_to_edit])[active_edge]=double_map_value+double_map_fract_value;
+			break;
+		      case NODE_MAP_EDIT:
+			nodetextmap[active_node]->property_text().set_value(mapvalue);
+			(*(mapstorage.nodemap_storage)[nodemap_to_edit])[active_node]=double_map_value+double_map_fract_value;
+			break;
+		      default:
+			break;
+		      }
+		    entrywidget.hide();
+		  }
+		else
+		  {
+		    std::cout << "ERROR: only handling of double values is implemented yet!" << std::endl;
+		  }
+
+		break;
+	      }
+	    default:
+	      break;
+	    }
+	}
+    }
   return false;
 }
 
@@ -604,15 +766,15 @@
 void GraphDisplayerCanvas::textReposition(xy<double> new_place)
 {
   new_place+=(xy<double>(10,10));
-  edgetextmap[active_edge]->property_x().set_value(new_place.x);
-  edgetextmap[active_edge]->property_y().set_value(new_place.y);
+  edgetextmap[forming_edge]->property_x().set_value(new_place.x);
+  edgetextmap[forming_edge]->property_y().set_value(new_place.y);
 }
 
 void GraphDisplayerCanvas::toggleEdgeActivity(BrokenEdge* active_bre, bool on)
 {
   if(on)
     {
-      if(active_edge!=INVALID)
+      if(forming_edge!=INVALID)
 	{
 	  std::cout << "ERROR!!!! Valid edge found!" << std::endl;
 	}
@@ -622,16 +784,16 @@
 	    {
 	      if(edgesmap[i]==active_bre)
 		{
-		  active_edge=i;
+		  forming_edge=i;
 		}
 	    }
 	}
     }
   else
     {
-      if(active_edge!=INVALID)
+      if(forming_edge!=INVALID)
 	{
-	  active_edge=INVALID;
+	  forming_edge=INVALID;
 	}
       else
 	{

Modified: hugo/trunk/gui/graph_displayer_canvas-node.cc
==============================================================================
--- hugo/trunk/gui/graph_displayer_canvas-node.cc	(original)
+++ hugo/trunk/gui/graph_displayer_canvas-node.cc	Thu Jul 21 21:28:29 2005
@@ -136,11 +136,7 @@
   //that is the deleter map
 
   Graph::NodeMap<double> * actual_map;
-  if(mapname=="Default")
-    {
-      actual_map=new Graph::NodeMap<double>(g,node_property_defaults[N_COLOR]);
-    }
-  else
+  if(mapname!="Default")
     {
       actual_map=(mapstorage.nodemap_storage)[mapname];
     }
@@ -151,6 +147,7 @@
 	{
 	  if(mapname!="Default")
 	    {
+	      nodemap_to_edit=mapname;
 	      double number=(*actual_map)[i];
 	      int length=1;
 	      //if number is smaller than one, length would be negative, or invalid
@@ -168,7 +165,7 @@
 		{
 		  if(j!=length)
 		    {
-		      int digit=(int)(number/maxpos);
+ 		      int digit=(int)round(number/maxpos);
 		      str[j]=(digit+'0');
 		      number-=digit*maxpos;
 		      number*=10;
@@ -179,6 +176,7 @@
 	    }
 	  else
 	    {
+	      nodemap_to_edit="";
 	      nodetextmap[i]->property_text().set_value("");
 	    }
 	}

Modified: hugo/trunk/gui/graph_displayer_canvas.cc
==============================================================================
--- hugo/trunk/gui/graph_displayer_canvas.cc	(original)
+++ hugo/trunk/gui/graph_displayer_canvas.cc	Thu Jul 21 21:28:29 2005
@@ -2,18 +2,20 @@
 #include <broken_edge.h>
 #include <math.h>
 
-GraphDisplayerCanvas::GraphDisplayerCanvas(Graph & gr, CoordinatesMap & cm, MapStorage & ms, MapWin * mw):g(gr),nodesmap(g),edgesmap(g),edgetextmap(g),nodetextmap(g),displayed_graph(*(root()), 0, 0),canvasentrywidget(NULL),mapstorage(ms),isbutton(0),active_item(NULL),target_item(NULL),mapwin(mw)
+GraphDisplayerCanvas::GraphDisplayerCanvas(Graph & gr, CoordinatesMap & cm, MapStorage & ms, MapWin * mw):g(gr),nodesmap(g),edgesmap(g),edgetextmap(g),nodetextmap(g),displayed_graph(*(root()), 0, 0),canvasentrywidget(NULL),mapstorage(ms),isbutton(0),active_item(NULL),target_item(NULL),edgemap_to_edit(""),nodemap_to_edit(""),mapwin(mw)
 {
   
+  
   active_node=INVALID;
   active_edge=INVALID;
+  forming_edge=INVALID;
 
   //setting event handler for the editor widget
   entrywidget.signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::entryWidgetChangeHandler), false);
 
   //base event handler is move tool
   actual_handler=signal_event().connect(sigc::mem_fun(*this, &GraphDisplayerCanvas::moveEventHandler), false);
-  actual_tool=CREATE_NODE;
+  actual_tool=MOVE;
 
   //set_center_scroll_region(true);
 

Modified: hugo/trunk/gui/graph_displayer_canvas.h
==============================================================================
--- hugo/trunk/gui/graph_displayer_canvas.h	(original)
+++ hugo/trunk/gui/graph_displayer_canvas.h	Thu Jul 21 21:28:29 2005
@@ -97,6 +97,12 @@
   ///Moves the text to new place
   void textReposition(xy<double>);
   ///Activates an edge belonging to a BrokenEdge
+  ///
+  ///After we have activated an edge this way,
+  ///the GDC object will know, which edge is under forming
+  ///therefore it can redraw the necessarz elementy on the canvas,
+  ///for example the text belonging to the \ref BrokenEdge can be
+  ///redrawn (\ref textReposition).
   void toggleEdgeActivity(BrokenEdge*, bool);
 
 public:
@@ -157,6 +163,9 @@
   Gnome::Canvas::Item * active_item, * target_item;
   Graph::NodeIt active_node;
   Graph::EdgeIt active_edge;
+  Graph::EdgeIt forming_edge;
+
+  std::string nodemap_to_edit, edgemap_to_edit;
 
   static const int zoom_step = 5;
 

Modified: hugo/trunk/gui/graphocska.lgf
==============================================================================
--- hugo/trunk/gui/graphocska.lgf	(original)
+++ hugo/trunk/gui/graphocska.lgf	Thu Jul 21 21:28:29 2005
@@ -1,6 +1,6 @@
 @nodeset
 id	coordinates_x	coordinates_y data
-1	230	-80	1
+1	230	-80	1.123
 2	230	100	3
 3	120	-80	5
 4	120	100	7



More information about the Lemon-commits mailing list