[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