]> granicus.if.org Git - graphviz/commitdiff
object highlighting on mouseover
authorellson <devnull@localhost>
Fri, 20 May 2005 18:17:58 +0000 (18:17 +0000)
committerellson <devnull@localhost>
Fri, 20 May 2005 18:17:58 +0000 (18:17 +0000)
lib/common/const.h
lib/common/emit.c
lib/common/globals.h
lib/common/shapes.c
lib/common/types.h
lib/gvc/gvevent.c

index 85e0074a396ea2f61a69f21091722854a1a3538f..41727b586058d489c58c99d8a9acfb84b185748a 100644 (file)
@@ -59,6 +59,8 @@
 
 /* default attributes */
 #define                DEFAULT_COLOR           "black"
+#define                DEFAULT_ACTIVEPENCOLOR  "yellow"
+#define                DEFAULT_ACTIVEFILLCOLOR "yellow"
 #define                DEFAULT_FONTSIZE        14.0
 #define                DEFAULT_LABEL_FONTSIZE  11.0    /* for head/taillabel */
 #define                MIN_FONTSIZE            1.0
index 731150432f964d1b6f2b1505d6c1233192b33f85..d822e0d401977bcc31ce4ba596b5d46c8adea08f 100644 (file)
@@ -852,11 +852,19 @@ void emit_edge_graphics(GVJ_t * job, edge_t * e)
            free(offspl.list);
            free(tmpspl.list);
        } else {
-           if (color[0]) {
-               gvrender_set_pencolor(job, color);
-               gvrender_set_fillcolor(job, color);
-           } else {
-               gvrender_set_fillcolor(job, DEFAULT_COLOR);
+           if (ED_active(e)) {
+                   color = late_nnstring(e, E_activepencolor, DEFAULT_ACTIVEPENCOLOR);
+                   gvrender_set_pencolor(job, color);
+                   color = late_nnstring(e, E_activefillcolor, DEFAULT_ACTIVEFILLCOLOR);
+                   gvrender_set_fillcolor(job, color);
+           }
+           else {
+               if (color[0]) {
+                   gvrender_set_pencolor(job, color);
+                   gvrender_set_fillcolor(job, color);
+               } else {
+                   gvrender_set_fillcolor(job, DEFAULT_COLOR);
+               }
            }
            for (i = 0; i < ED_spl(e)->size; i++) {
                bz = ED_spl(e)->list[i];
@@ -1345,7 +1353,7 @@ void emit_clusters(GVJ_t * job, Agraph_t * g, int flags)
     int i, c, filled;
     graph_t *sg;
     point A[4];
-    char *str, **style;
+    char *color, *str, **style;
     node_t *n;
     edge_t *e;
     char *s, *url = NULL, *tooltip = NULL, *target = NULL;
@@ -1381,23 +1389,31 @@ void emit_clusters(GVJ_t * job, Agraph_t * g, int flags)
                    break;
                }
        }
-       if (((str = agget(sg, "pencolor")) != 0) && str[0])
-           gvrender_set_pencolor(job, str);
-       else if (((str = agget(sg, "color")) != 0) && str[0])
-           gvrender_set_pencolor(job, str);
-       /* bgcolor is supported for backward compatability */
-       else if (((str = agget(sg, "bgcolor")) != 0) && str[0])
-           gvrender_set_pencolor(job, str);
-
-       str = 0;
-       if (((str = agget(sg, "fillcolor")) != 0) && str[0])
-           gvrender_set_fillcolor(job, str);
-       else if (((str = agget(sg, "color")) != 0) && str[0])
-           gvrender_set_fillcolor(job, str);
-       /* bgcolor is supported for backward compatability */
-       else if (((str = agget(sg, "bgcolor")) != 0) && str[0]) {
-           filled = TRUE;
-           gvrender_set_fillcolor(job, str);
+       if (GD_active(sg)) {
+           color = late_nnstring(sg, G_activepencolor, DEFAULT_ACTIVEPENCOLOR);
+           gvrender_set_pencolor(job, color);
+           color = late_nnstring(sg, G_activefillcolor, DEFAULT_ACTIVEFILLCOLOR);
+           gvrender_set_fillcolor(job, color);
+       }
+       else {
+           if (((color = agget(sg, "pencolor")) != 0) && color[0])
+               gvrender_set_pencolor(job, color);
+           else if (((color = agget(sg, "color")) != 0) && color[0])
+               gvrender_set_pencolor(job, color);
+           /* bgcolor is supported for backward compatability */
+           else if (((color = agget(sg, "bgcolor")) != 0) && color[0])
+               gvrender_set_pencolor(job, color);
+    
+           color = 0;
+           if (((color = agget(sg, "fillcolor")) != 0) && color[0])
+               gvrender_set_fillcolor(job, color);
+           else if (((color = agget(sg, "color")) != 0) && color[0])
+               gvrender_set_fillcolor(job, color);
+           /* bgcolor is supported for backward compatability */
+           else if (((color = agget(sg, "bgcolor")) != 0) && color[0]) {
+               filled = TRUE;
+               gvrender_set_fillcolor(job, color);
+           }
        }
        A[0] = GD_bb(sg).LL;
        A[2] = GD_bb(sg).UR;
index b36fedcf63f5310f0ff0cd7a35fc9512a5f5bd58..39f174b1caad4f50e7e070a0bc4e92abbdf77185 100644 (file)
@@ -98,9 +98,11 @@ extern "C" {
     EXTERN attrsym_t *g_l_draw;
 
     EXTERN attrsym_t
+       *G_activepencolor, *G_activefillcolor,
        *G_peripheries;
     EXTERN attrsym_t
        *N_height, *N_width, *N_shape, *N_color, *N_fillcolor,
+       *N_activepencolor, *N_activefillcolor,
        *N_fontsize, *N_fontname, *N_fontcolor,
        *N_label, *N_nojustify, *N_style, *N_showboxes,
        *N_sides, *N_peripheries, *N_orientation,
@@ -108,6 +110,7 @@ extern "C" {
        *N_group, *N_comment, *N_vertices, *N_z;
     EXTERN attrsym_t
        *E_weight, *E_minlen, *E_color,
+       *E_activepencolor, *E_activefillcolor,
        *E_fontsize, *E_fontname, *E_fontcolor,
        *E_label, *E_dir, *E_style, *E_decorate,
        *E_showboxes, *E_arrowsz, *E_constr, *E_layer,
index 17961c55d410133a234c1d1b87ae8fb4ee0218de..a25ce7b918deaed1a79ce88367fd65ceb8121cd7 100644 (file)
@@ -224,6 +224,24 @@ static int same_side(pointf p0, pointf p1, pointf L0, pointf L1)
     return (s0 == s1);
 }
 
+static
+void activepencolor(GVJ_t * job, node_t * n)
+{
+    char *color;
+
+    color = late_nnstring(n, N_activepencolor, DEFAULT_ACTIVEPENCOLOR);
+    gvrender_set_pencolor(job, color);
+}
+
+static
+void activefillcolor(GVJ_t * job, node_t * n)
+{
+    char *color;
+
+    color = late_nnstring(n, N_activefillcolor, DEFAULT_ACTIVEFILLCOLOR);
+    gvrender_set_fillcolor(job, color);
+}
+
 static
 void pencolor(GVJ_t * job, node_t * n)
 {
@@ -1183,7 +1201,7 @@ static void poly_gencode(GVJ_t * job, node_t * n)
     pointf P, *vertices;
     static point *A;
     static int A_size;
-    int filled;
+    boolean filled;
     extern int xdemitState;
 
     xdemitState = EMIT_DRAW;
@@ -1218,13 +1236,20 @@ static void poly_gencode(GVJ_t * job, node_t * n)
     } else {
        style = stylenode(job, n);
     }
-    if (style & FILLED) {
-       fillcolor(job, n);      /* emit fill color */
-       filled = 1;
-    } else {
-       filled = 0;
+    if (ND_active(n)) {
+       activefillcolor(job,n);
+       filled = TRUE;
+       activepencolor(job,n);
+    }
+    else {
+        if (style & FILLED) {
+           fillcolor(job, n);  /* emit fill color */
+           filled = TRUE;
+        } else {
+           filled = FALSE;
+        }
+        pencolor(job, n);      /* emit pen color */
     }
-    pencolor(job, n);          /* emit pen color */
 
     if (ND_shape(n)->usershape) {
        for (i = 0; i < sides; i++) {
@@ -1240,7 +1265,7 @@ static void poly_gencode(GVJ_t * job, node_t * n)
            }
        }
        gvrender_user_shape(job, ND_shape(n)->name, A, sides, filled);
-       filled = 0;
+       filled = FALSE;
     }
     /* if no boundary but filled, set boundary color to fill color */
     if ((peripheries == 0) && filled) {
@@ -1274,7 +1299,7 @@ static void poly_gencode(GVJ_t * job, node_t * n)
            gvrender_polygon(job, A, sides, filled);
        }
        /* fill innermost periphery only */
-       filled = 0;
+       filled = FALSE;
     }
 
     xdemitState = EMIT_LABEL;
index 923c73f0d4c728a93c14bc755a0e548fd8ab3c3d..b8ecca5c4b8130b853c288b45045c8d5669b11ae 100644 (file)
@@ -347,7 +347,7 @@ extern "C" {
        textlabel_t *label;     /* if the cluster has a title */
        box bb;                 /* bounding box */
        point border[4];        /* sizes of margins for graph labels */
-       boolean has_labels, has_images;
+       boolean has_labels, has_images, active;
        unsigned char charset; /* input character set */
        int rankdir;
        int ht1, ht2;           /* below and above extremal ranks */
@@ -395,6 +395,7 @@ extern "C" {
 
     } Agraphinfo_t;
 
+#define GD_active(g) (g)->u.active
 #define GD_alg(g) (g)->u.alg
 #define GD_bb(g) (g)->u.bb
 #define GD_border(g) (g)->u.border
@@ -454,12 +455,13 @@ extern "C" {
        void *alg;
        char state;
        boolean clustnode;
+       boolean  active;
 
 #ifndef DOT_ONLY
+       boolean pinned;
        short xsize, ysize;
        int id, heapindex, hops;
        double *pos, dist;
-       boolean pinned;
 #endif
 #ifndef NEATO_ONLY
        boolean showboxes, has_port;
@@ -494,6 +496,7 @@ extern "C" {
 
 #define ND_UF_parent(n) (n)->u.UF_parent
 #define ND_UF_size(n) (n)->u.UF_size
+#define ND_active(n) (n)->u.active
 #define ND_alg(n) (n)->u.alg
 #define ND_bb(n) (n)->u.bb
 #define ND_clust(n) (n)->u.clust
@@ -554,6 +557,7 @@ extern "C" {
        char label_ontop;
        edge_t *to_orig;        /* for dot's shapes.c    */
        void *alg;
+       boolean active;
 
 #ifndef DOT_ONLY
        double factor;
@@ -572,6 +576,7 @@ extern "C" {
 
     } Agedgeinfo_t;
 
+#define ED_active(e) (e)->u.active
 #define ED_alg(e) (e)->u.alg
 #define ED_conc_opp_flag(e) (e)->u.conc_opp_flag
 #define ED_count(e) (e)->u.count
index 93c8ee07b7668ab3bbb92d56453a960846bbbc7b..e80888da2b25ae8752eccc7409d397ab418655e1 100644 (file)
 
 #include <stdio.h>
 
+/*
 #include "const.h"
 #include "types.h"
 #include "macros.h"
+*/
 
 #include "render.h"
 
@@ -79,6 +81,44 @@ static void * gvevent_find_obj(graph_t *g, boxf b)
     return (void *)g;
 }
 
+static void gvevent_leave_obj(GVJ_t * job)
+{
+    void *obj = job->current_obj;
+
+    if (obj) {
+        switch (agobjkind(obj)) {
+        case AGGRAPH:
+           GD_active((graph_t*)obj) = FALSE;
+           break;
+        case AGNODE:
+           ND_active((node_t*)obj) = FALSE;
+           break;
+        case AGEDGE:
+           ED_active((edge_t*)obj) = FALSE;
+           break;
+        }
+    }
+}
+
+static void gvevent_enter_obj(GVJ_t * job)
+{
+    void *obj = job->current_obj;
+
+    if (obj) {
+        switch (agobjkind(obj)) {
+        case AGGRAPH:
+           GD_active((graph_t*)obj) = TRUE;
+           break;
+        case AGNODE:
+           ND_active((node_t*)obj) = TRUE;
+           break;
+        case AGEDGE:
+           ED_active((edge_t*)obj) = TRUE;
+           break;
+        }
+    }
+}
+
 /* CLOSEENOUGH is in window units - probably should be a feature... */
 #define CLOSEENOUGH 1
 
@@ -107,8 +147,10 @@ static void gvevent_find_current_obj(GVJ_t * job, double x, double y)
 
     obj = gvevent_find_obj(job->g, b);
     if (obj != job->current_obj) {
+       gvevent_leave_obj(job);
        job->current_obj = obj;
-fprintf(stderr,"obj=%x kind=%d\n",obj,agobjkind(obj));
+       gvevent_enter_obj(job);
+       job->needs_refresh = 1;
     }
 }