From: arif Date: Fri, 25 Apr 2008 17:14:52 +0000 (+0000) Subject: node hint boxes X-Git-Tag: LAST_LIBGRAPH~32^2~4192 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c17d86e55d984612f6de4c91c856ef4c730e387d;p=graphviz node hint boxes --- diff --git a/cmd/smyrna/draw.c b/cmd/smyrna/draw.c index 27fda6e61..40130b96b 100755 --- a/cmd/smyrna/draw.c +++ b/cmd/smyrna/draw.c @@ -781,3 +781,52 @@ void drawEllipse(float xradius, float yradius,int angle1,int angle2) glEnd(); } +int draw_node_hintbox_gl_polygon(GLfloat x,GLfloat y,GLfloat fs,GLfloat pad,GLfloat z,GLfloat kts) +{ + kts=kts*1.25; + glBegin(GL_POLYGON); + glVertex3f(x-(fs/3)-fs , y+fs ,z); + glVertex3f(x-(fs/3)-fs ,y+2*fs+2*pad,z); + glVertex3f(x-(fs/3)-fs+fs*kts+2*pad,y+2*fs+2*pad,z); + glVertex3f(x-(fs/3)-fs+fs*kts+2*pad,y+fs,z); + glVertex3f(x-(fs/3)-fs , y+fs ,z); + glEnd(); + + glBegin(GL_POLYGON); + glVertex3f(x,y,z); + glVertex3f(x-(fs/3) , y+fs ,z); + glVertex3f(x+fs/3,y+fs,z); + glVertex3f(x,y,z); + glEnd(); + return 1; + +} +int draw_node_hintbox_gl_line(GLfloat x,GLfloat y,GLfloat fs,GLfloat pad,GLfloat z,GLfloat kts) +{ + kts=kts*1.25; + glBegin(GL_LINE_STRIP); + glVertex3f(x,y,z); + glVertex3f(x-(fs/3) , y+fs ,z); + glVertex3f(x-(fs/3)-fs , y+fs ,z); + glVertex3f(x-(fs/3)-fs ,y+2*fs+2*pad,z); + glVertex3f(x-(fs/3)-fs+fs*kts+2*pad,y+2*fs+2*pad,z); + glVertex3f(x-(fs/3)-fs+fs*kts+2*pad,y+fs,z); + glVertex3f(x+fs/3,y+fs,z); + glVertex3f(x,y,z); + glEnd(); + return 1; + +} + + +int draw_node_hintbox(GLfloat x,GLfloat y,GLfloat fs,GLfloat pad,GLfloat z,GLfloat kts,GLfloat z_offset) +{ + + glColor3f(1,1,0); + draw_node_hintbox_gl_polygon(x,y,fs,pad,z+(GLfloat)z_offset/100,kts); + glColor3f(0,0,1); + draw_node_hintbox_gl_line(x,y,fs,pad,z+(GLfloat)0.001+(GLfloat)z_offset/100,kts); + return 1; + +} + diff --git a/cmd/smyrna/topview.c b/cmd/smyrna/topview.c index 51203bf9f..fed61bf59 100755 --- a/cmd/smyrna/topview.c +++ b/cmd/smyrna/topview.c @@ -195,6 +195,8 @@ void preparetopview(Agraph_t * g, topview * t) load_host_buttons(t, g, t->topviewmenu); t->h='\0'; t->is_top_fisheye=0; + t->picked_node_count=0; + t->picked_nodes='\0'; } void drawTopViewGraph(Agraph_t * g) @@ -276,6 +278,8 @@ void drawTopViewGraph(Agraph_t * g) } + //draw picked node names; + draw_node_hint_boxes(); //draw edges // glLineWidth(5/view->zoom*-1); glBegin(GL_LINES); @@ -333,11 +337,106 @@ void drawTopViewGraph(Agraph_t * g) view->SignalBlock = 0; } } +int is_node_picked(topview_node* n) +{ + int ind = 0; + int found = 0; + for (;ind < view->Topview->picked_node_count;ind ++) + { + if((view->Topview->picked_nodes[ind]==n)&& (!found)) + return 1; + } + return 0; +} + +int remove_from_pick_list(topview_node* n) +{ + int ind = 0; + int found = 0; + for (;ind < view->Topview->picked_node_count;ind ++) + { + if((view->Topview->picked_nodes[ind]==n)&& (!found)) + found=1; + if((found) && (ind <( view->Topview->picked_node_count-1))) + { + view->Topview->picked_nodes[ind]=view->Topview->picked_nodes[ind+1]; + } + } + if(found) + { + view->Topview->picked_node_count--; + view->Topview->picked_nodes=realloc(view->Topview->picked_nodes,sizeof(topview_node*)*view->Topview->picked_node_count); + return 1; + } + return 0; +} +int add_to_pick_list(topview_node* n) +{ + view->Topview->picked_node_count++; + view->Topview->picked_nodes=realloc(view->Topview->picked_nodes,sizeof(topview_node*)*view->Topview->picked_node_count); + view->Topview->picked_nodes[view->Topview->picked_node_count-1]=n; + return 1; + +} + +int pick_node(topview_node* n) +{ + static closest_dif=3; + float a,b; + a=ABS(n->distorted_x-view->GLx); + b=ABS(n->distorted_y-view->GLy); + a=pow((a*a+b*b),0.5); + if( a < closest_dif) + { + if(!is_node_picked(n)) + { + if(add_to_pick_list(n)) + { + printf ("node picked ,name:%s\n",agnameof(n->Node)); + return 1; + } + return 0; + } + else + { + if(remove_from_pick_list(n)) + { + printf ("node has been unpicked ,name:%s\n",agnameof(n->Node)); + return 1; + } + return 0; + } + } + return 0; + +} +int draw_node_hint_boxes() +{ + int ind; + int fs=12; + for (ind=0;ind < view->Topview->picked_node_count;ind++) + { + draw_node_hintbox(view->Topview->picked_nodes[ind]->distorted_x,view->Topview->picked_nodes[ind]->distorted_y,fs,1,1,(int)(strlen(agnameof(view->Topview->picked_nodes[ind]->Node))/2),ind); + fontSize(fs); + fontColorA(0,0,1,1); + fontDrawString(view->Topview->picked_nodes[ind]->distorted_x-fs/3+1-fs,view->Topview->picked_nodes[ind]->distorted_y+fs+1, + agnameof(view->Topview->picked_nodes[ind]->Node),fs*strlen(agnameof(view->Topview->picked_nodes[ind]->Node))/2); + } +} + int select_topview_node(topview_node * n) { if (!view->Selection.Active) - return 0; + { + //implement hint box here + if (view->mouse.pick) + { + if(pick_node(n)) + view->mouse.pick=0; + } + return 0; + } if (is_point_in_rectangle (n->x, n->y, view->Selection.X, view->Selection.Y, view->Selection.W, view->Selection.H)) { @@ -372,6 +471,8 @@ int select_topview_node(topview_node * n) return 1; } + + int select_topview_edge(topview_edge * e) { int r = 0; @@ -964,12 +1065,12 @@ glCompSet *glcreate_gl_topview_menu() if (!smyrna_icon_pan) { #ifdef _WIN32 - smyrna_icon_pan = "c:/pan.raw" - smyrna_icon_zoom = "c:/zoom.raw" - smyrna_icon_zoomplus = "c:/zoomplus.raw" - smyrna_icon_zoomminus = "c:/zoomminus.raw" - smyrna_icon_fisheye = "c:/fisheye.raw" - smyrna_icon_rotate = "c:/rotate.raw" + smyrna_icon_pan = "c:/pan.raw"; + smyrna_icon_zoom = "c:/zoom.raw"; + smyrna_icon_zoomplus = "c:/zoomplus.raw"; + smyrna_icon_zoomminus = "c:/zoomminus.raw"; + smyrna_icon_fisheye = "c:/fisheye.raw"; + smyrna_icon_rotate = "c:/rotate.raw"; #else smyrna_icon_pan = smyrnaPath("pan.raw"); smyrna_icon_zoom = smyrnaPath("zoom.raw"); diff --git a/cmd/smyrna/topview.h b/cmd/smyrna/topview.h index 4aa1482d5..a9ed09315 100755 --- a/cmd/smyrna/topview.h +++ b/cmd/smyrna/topview.h @@ -44,4 +44,7 @@ _BB void on_host_alpha_change(GtkWidget * widget, gpointer user_data); /* double dist(double x1, double y1, double x2, double y2); */ /* double G(double x); */ glCompSet *glcreate_gl_topview_menu(); +int pick_node(topview_node* n); +int draw_node_hint_boxes(); + #endif