]> granicus.if.org Git - graphviz/commitdiff
node hint boxes
authorarif <devnull@localhost>
Fri, 25 Apr 2008 17:14:52 +0000 (17:14 +0000)
committerarif <devnull@localhost>
Fri, 25 Apr 2008 17:14:52 +0000 (17:14 +0000)
cmd/smyrna/draw.c
cmd/smyrna/topview.c
cmd/smyrna/topview.h

index 27fda6e610b636e2e98797ada8db9ce72fe5c937..40130b96b5a1a9a70f778a62654a8599a503a179 100755 (executable)
@@ -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;
+
+}
+
index 51203bf9fe65791898a49561767d3a24a83f0e5b..fed61bf59518e51e3f6bcdc099fb0b493d6624e7 100755 (executable)
@@ -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");
index 4aa1482d57c17c11587f9f0b64a809f05e117369..a9ed09315785c37dc9d6650c2413581345001e2b 100755 (executable)
@@ -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