From 98009dc48247a8f4a83ad695f00591904f243a3f Mon Sep 17 00:00:00 2001
From: Ivica Ico Bukvic <ico@vt.edu>
Date: Sun, 29 Dec 2013 11:18:18 -0500
Subject: [PATCH] *fixed incorrect getrect when selecting a plot with scalars
 at each point (see setsize-help.pd). This was a regression from an earlier
 "fix" (see
 https://github.com/pd-l2ork/pd/commit/f0916f85a11894a43067d5b07ae5f8eea2b2c1b9#diff-5ff2b78bd60b3b9c36db43b8d5f5c168).
 The latest code does not exhibit the said problem so this should be all ok.
 *fixed embedded scalars at each plot point not being selected for
 displacement with tag due to clumsy way of labeling them. This is achieved by
 adding scalar arg to the parentvisfn which also alters g_canvas.h spec but
 also makes things more streamlined.

---
 pd/src/g_canvas.h         |  2 +-
 pd/src/g_scalar.c         | 23 ++++++++++----
 pd/src/g_template.c       | 65 +++++++++++++++++++++++----------------
 pd/src/pdtk_drawimage.tcl |  4 +--
 4 files changed, 59 insertions(+), 35 deletions(-)

diff --git a/pd/src/g_canvas.h b/pd/src/g_canvas.h
index b64c8ea67..449edbf5c 100644
--- a/pd/src/g_canvas.h
+++ b/pd/src/g_canvas.h
@@ -362,7 +362,7 @@ typedef void (*t_parentactivatefn)(t_gobj *x, struct _glist *glist,
     t_word *data, t_template *tmpl, t_float basex, t_float basey,
     int state);
         /*  making visible or invisible */
-typedef void (*t_parentvisfn)(t_gobj *x, struct _glist *glist,
+typedef void (*t_parentvisfn)(t_gobj *x, struct _glist *glist, t_scalar *sc, 
     t_word *data, t_template *tmpl, t_float basex, t_float basey,
     int flag);
         /*  field a mouse click */
diff --git a/pd/src/g_scalar.c b/pd/src/g_scalar.c
index 0d39556ea..273ce6eb0 100644
--- a/pd/src/g_scalar.c
+++ b/pd/src/g_scalar.c
@@ -240,9 +240,14 @@ static void scalar_select(t_gobj *z, t_glist *owner, int state)
 	if (state) {
 		sys_vgui(".x%lx.c addtag selected withtag scalar%lx\n",
 			glist_getcanvas(owner), x);
-		if (x->sc_vec)
-			sys_vgui(".x%lx.c addtag selected withtag .x%lx.x%lx.template%lx\n",
-				glist_getcanvas(owner), glist_getcanvas(owner), owner, x->sc_vec);
+		/* how do we navigate through a t_word list?
+        if (x->sc_vec) {
+            t_word *v = x->sc_vec;
+            while(v) {
+    			sys_vgui(".x%lx.c addtag selected withtag .x%lx.x%lx.template%lx\n",
+    				glist_getcanvas(owner), glist_getcanvas(owner), owner, v);
+            }
+        }*/
 		/*if (templatecanvas) {
 			// get the universal tag for all nested objects
 			t_canvas *tag = owner;
@@ -255,8 +260,14 @@ static void scalar_select(t_gobj *z, t_glist *owner, int state)
 	} else {
 		sys_vgui(".x%lx.c dtag scalar%lx selected\n",
 			glist_getcanvas(owner), x);
-		sys_vgui(".x%lx.c dtag .x%lx.x%lx.template%lx selected\n",
-			glist_getcanvas(owner), glist_getcanvas(owner), owner, x->sc_vec);
+        /* how do we navigate through a t_word list?
+        if (x->sc_vec) {
+            t_word *v = x->sc_vec;
+            while (v) {
+        		sys_vgui(".x%lx.c dtag .x%lx.x%lx.template%lx selected\n",
+        			glist_getcanvas(owner), glist_getcanvas(owner), owner, x->sc_vec);
+            }
+        }*/
 		/*if (templatecanvas) {
 			// get the universal tag for all nested objects
 			t_canvas *tag = owner;
@@ -382,7 +393,7 @@ static void scalar_vis(t_gobj *z, t_glist *owner, int vis)
     {
         t_parentwidgetbehavior *wb = pd_getparentwidget(&y->g_pd);
         if (!wb) continue;
-        (*wb->w_parentvisfn)(y, owner, x->sc_vec, template, basex, basey, vis);
+        (*wb->w_parentvisfn)(y, owner, x, x->sc_vec, template, basex, basey, vis);
     }
     sys_unqueuegui(x);
     if (glist_isselected(owner, &x->sc_gobj))
diff --git a/pd/src/g_template.c b/pd/src/g_template.c
index c2b41e2c7..a90e736d0 100644
--- a/pd/src/g_template.c
+++ b/pd/src/g_template.c
@@ -1059,7 +1059,7 @@ static void curve_getrect(t_gobj *z, t_glist *glist,
     t_word *data, t_template *template, t_float basex, t_float basey,
     int *xp1, int *yp1, int *xp2, int *yp2)
 {
-	//fprintf(stderr,"curve_getrect\n");
+	//fprintf(stderr,">>>>>>>>>>>>>>>>>>>>>>curve_getrect %lx\n", (t_int)z);
     t_curve *x = (t_curve *)z;
     int i, n = x->x_npoints;
     t_fielddesc *f = x->x_vec;
@@ -1100,6 +1100,8 @@ static void curve_getrect(t_gobj *z, t_glist *glist,
         y2 = cy + ry;
     }
 	//fprintf(stderr,"FINAL curve_getrect %d %d %d %d\n", x1, y1, x2, y2);
+    //sys_vgui(".x%lx.c create prect %d %d %d %d -stroke red -tags blah\n",
+    //        glist_getcanvas(glist), x1, y1, x2, y2);
     *xp1 = x1;
     *yp1 = y1;
     *xp2 = x2;
@@ -1117,6 +1119,7 @@ static void curve_select(t_gobj *z, t_glist *glist,
     t_word *data, t_template *template, t_float basex, t_float basey,
     int state)
 {
+    fprintf(stderr,"curve_select %d\n", state);
     /* fill in later */
 }
 
@@ -1156,7 +1159,7 @@ static void numbertocolor(int n, char *s)
         rangecolor(green));
 }
 
-static void curve_vis(t_gobj *z, t_glist *glist, 
+static void curve_vis(t_gobj *z, t_glist *glist, t_scalar *sc, 
     t_word *data, t_template *template, t_float basex, t_float basey,
     int vis)
 {
@@ -1249,8 +1252,8 @@ static void curve_vis(t_gobj *z, t_glist *glist,
             else if(flags & BBOX) sys_vgui("-stroke %s\\\n", outline);
             else sys_vgui("-stroke %s\\\n", outline);
             //if ((flags & BEZ) && !(flags & BBOX)) sys_vgui("-smooth 1\\\n"); //this doesn't work with tkpath
-            sys_vgui("-tags {.x%lx.x%lx.template%lx}\n", glist_getcanvas(glist), glist,
-				data);
+            sys_vgui("-tags {.x%lx.x%lx.template%lx scalar%lx}\n", glist_getcanvas(glist), glist,
+				data, sc);
 			if (!glist_istoplevel(glist)) {
 				t_canvas *gl = glist_getcanvas(glist);
 				//glist_noselect(gl);
@@ -1651,6 +1654,13 @@ static void plot_getrect(t_gobj *z, t_glist *glist,
     int i;
     t_float xpix1, xpix2, ypix, wpix;
     t_fielddesc *xfielddesc, *yfielddesc, *wfielddesc;
+        /* if we're the only plot in the glist claim the whole thing */
+    if (glist->gl_list && !glist->gl_list->g_next)
+    {
+        *xp1 = *yp1 = -0x7fffffff;
+        *xp2 = *yp2 = 0x7fffffff;
+        return;
+    }
     if (!plot_readownertemplate(x, data, template, 
         &elemtemplatesym, &array, &linewidth, &xloc, &xinc, &yloc, &style,
             &vis, &scalarvis, &xfielddesc, &yfielddesc, &wfielddesc) &&
@@ -1689,12 +1699,14 @@ static void plot_getrect(t_gobj *z, t_glist *glist,
                     usexloc = basex + xloc + fielddesc_cvttocoord(xfielddesc, 
                         *(t_float *)(((char *)(array->a_vec) + elemsize * i)
                             + xonset));
-                else usexloc = x1; //usexloc = basex + xsum, xsum += xinc;
+                //else usexloc = x1; //usexloc = basex + xsum, xsum += xinc;
+                usexloc = basex + xsum, xsum += xinc;
                 if (yonset >= 0)
                     yval = *(t_float *)(((char *)(array->a_vec) + elemsize * i)
                         + yonset);
                 else yval = 0;
-                useyloc = (y1+y2)/2; //basey + yloc + fielddesc_cvttocoord(yfielddesc, yval);
+                //useyloc = (y1+y2)/2; //basey + yloc + fielddesc_cvttocoord(yfielddesc, yval);
+                useyloc = basey + yloc + fielddesc_cvttocoord(yfielddesc, yval);
                 for (y = elemtemplatecanvas->gl_list; y; y = y->g_next)
                 {
 					//fprintf(stderr,".-.-. usexloc %f useyloc %f (alt %f %f)\n", usexloc, useyloc, basex + xloc + fielddesc_cvttocoord(xfielddesc, *(t_float *)(((char *)(array->a_vec) + elemsize * i) + xonset)), *(t_float *)(((char *)(array->a_vec) + elemsize * i) + yonset));
@@ -1739,6 +1751,7 @@ static void plot_select(t_gobj *z, t_glist *glist,
     t_word *data, t_template *template, t_float basex, t_float basey,
     int state)
 {
+    fprintf(stderr,"plot_select %d\n", state);
     /* not yet */
 }
 
@@ -1749,7 +1762,7 @@ static void plot_activate(t_gobj *z, t_glist *glist,
         /* not yet */
 }
 
-static void plot_vis(t_gobj *z, t_glist *glist, 
+static void plot_vis(t_gobj *z, t_glist *glist, t_scalar *sc, 
     t_word *data, t_template *template, t_float basex, t_float basey,
     int tovis)
 {
@@ -1842,14 +1855,14 @@ static void plot_vis(t_gobj *z, t_glist *glist,
 					if (draw_me) {*/
 					//we subtract 1 from y to keep it in sync with the rest of the types of templates
 		               sys_vgui(
-	".x%lx.c create prect %d %d %d %d -fill black -strokewidth 0 -tags {.x%lx.x%lx.template%lx}\n",
+	".x%lx.c create prect %d %d %d %d -fill black -strokewidth 0 -tags {.x%lx.x%lx.template%lx scalar%lx}\n",
 		                    glist_getcanvas(glist),
 		                    ixpix, (int)glist_ytopixels(glist, 
 		                        basey + fielddesc_cvttocoord(yfielddesc, minyval)) - 1,
 		                    inextx, (int)(glist_ytopixels(glist, 
 		                        basey + fielddesc_cvttocoord(yfielddesc, maxyval))
 		                            + linewidth) - 1, glist_getcanvas(glist), glist,
-							 data);
+							 data, sc);
 
 					//} //part of experimental code above
                     ndrawn++;
@@ -1944,8 +1957,8 @@ static void plot_vis(t_gobj *z, t_glist *glist,
                     outline);
                 //if (style == PLOTSTYLE_BEZ) sys_vgui("-smooth 1\\\n"); //this doesn't work with tkpath
 
-                sys_vgui("-tags {.x%lx.x%lx.template%lx}\n", glist_getcanvas(glist), glist,
-					 data);
+                sys_vgui("-tags {.x%lx.x%lx.template%lx scalar%lx}\n", glist_getcanvas(glist), glist,
+					 data, sc);
             }
             else if (linewidth > 0)
             {
@@ -1988,7 +2001,7 @@ static void plot_vis(t_gobj *z, t_glist *glist,
                 //sys_vgui("-fill %s\\\n", outline);
                 //if (style == PLOTSTYLE_BEZ) sys_vgui("-smooth 1\\\n"); //this doesn't work with tkpath
 
-                sys_vgui("-tags {.x%lx.x%lx.template%lx}\n", glist_getcanvas(glist), glist, data);
+                sys_vgui("-tags {.x%lx.x%lx.template%lx scalar%lx}\n", glist_getcanvas(glist), glist, data,sc);
             }
         }
             /* We're done with the outline; now draw all the points.
@@ -2013,7 +2026,7 @@ static void plot_vis(t_gobj *z, t_glist *glist,
                 {
                     t_parentwidgetbehavior *wb = pd_getparentwidget(&y->g_pd);
                     if (!wb) continue;
-                    (*wb->w_parentvisfn)(y, glist,
+                    (*wb->w_parentvisfn)(y, glist, sc,
                         (t_word *)(elem + elemsize * i),
                             elemtemplate, usexloc, useyloc, tovis);
                 }
@@ -2043,7 +2056,7 @@ static void plot_vis(t_gobj *z, t_glist *glist,
                 {
                     t_parentwidgetbehavior *wb = pd_getparentwidget(&y->g_pd);
                     if (!wb) continue;
-                    (*wb->w_parentvisfn)(y, glist,
+                    (*wb->w_parentvisfn)(y, glist, sc,
                         (t_word *)(elem + elemsize * i), elemtemplate,
                             0, 0, 0);
                 }
@@ -2246,7 +2259,7 @@ static void drawnumber_select(t_gobj *z, t_glist *glist,
     t_word *data, t_template *template, t_float basex, t_float basey,
     int state)
 {
-    //post("drawnumber_select %d", state);
+    fprintf(stderr,"drawnumber_select %d", state);
     /* fill in later */
 }
 
@@ -2257,7 +2270,7 @@ static void drawnumber_activate(t_gobj *z, t_glist *glist,
     //post("drawnumber_activate %d", state);
 }
 
-static void drawnumber_vis(t_gobj *z, t_glist *glist, 
+static void drawnumber_vis(t_gobj *z, t_glist *glist, t_scalar *sc,
     t_word *data, t_template *template, t_float basex, t_float basey,
     int vis)
 {
@@ -2293,8 +2306,8 @@ static void drawnumber_vis(t_gobj *z, t_glist *glist,
                 glist_getcanvas(glist), xloc, yloc, colorstring, buf);
         sys_vgui(" -font {{%s} -%d %s}", sys_font,
 				 sys_hostfontsize(fontsize), sys_fontweight);
-        sys_vgui(" -tags {.x%lx.x%lx.template%lx}\n", 
-			glist_getcanvas(glist), glist, data);
+        sys_vgui(" -tags {.x%lx.x%lx.template%lx scalar%lx}\n", 
+			glist_getcanvas(glist), glist, data, sc);
     }
     else sys_vgui(".x%lx.c delete .x%lx.x%lx.template%lx\n", glist_getcanvas(glist), 
 		glist_getcanvas(glist), glist, data);
@@ -2612,7 +2625,7 @@ static void drawsymbol_select(t_gobj *z, t_glist *glist,
     t_word *data, t_template *template, t_float basex, t_float basey,
     int state)
 {
-    //post("drawsymbol_select %d", state);
+    fprintf(stderr,"drawsymbol_select %d", state);
     /* fill in later */
 }
 
@@ -2623,7 +2636,7 @@ static void drawsymbol_activate(t_gobj *z, t_glist *glist,
     //post("drawsymbol_activate %d", state);
 }
 
-static void drawsymbol_vis(t_gobj *z, t_glist *glist, 
+static void drawsymbol_vis(t_gobj *z, t_glist *glist, t_scalar *sc,
     t_word *data, t_template *template, t_float basex, t_float basey,
     int vis)
 {
@@ -2658,8 +2671,8 @@ static void drawsymbol_vis(t_gobj *z, t_glist *glist,
                 glist_getcanvas(glist), xloc, yloc, colorstring, buf);
         sys_vgui(" -font {{%s} -%d %s}", sys_font,
 				 sys_hostfontsize(fontsize), sys_fontweight);
-        sys_vgui(" -tags {.x%lx.x%lx.template%lx}\n", 
-			glist_getcanvas(glist), glist, data);
+        sys_vgui(" -tags {.x%lx.x%lx.template%lx scalar%lx}\n", 
+			glist_getcanvas(glist), glist, data, sc);
     }
     else sys_vgui(".x%lx.c delete .x%lx.x%lx.template%lx\n", glist_getcanvas(glist), 
 		glist_getcanvas(glist), glist, data);
@@ -2993,7 +3006,7 @@ static void drawimage_select(t_gobj *z, t_glist *glist,
     t_word *data, t_template *template, t_float basex, t_float basey,
     int state)
 {
-    post("drawimage_select %d", state);
+    fprintf(stderr,"drawimage_select %d", state);
     /* fill in later */
 }
 
@@ -3004,7 +3017,7 @@ static void drawimage_activate(t_gobj *z, t_glist *glist,
     post("drawimage_activate %d", state);
 }
 
-static void drawimage_vis(t_gobj *z, t_glist *glist, 
+static void drawimage_vis(t_gobj *z, t_glist *glist, t_scalar *sc, 
     t_word *data, t_template *template, t_float basex, t_float basey,
     int vis)
 {
@@ -3023,8 +3036,8 @@ static void drawimage_vis(t_gobj *z, t_glist *glist,
         sys_vgui("pdtk_drawimage_vis .x%lx.c %d %d .x%lx .x%lx.i %d ",
             glist_getcanvas(glist), xloc, yloc, x, data,
             (int)fielddesc_getfloat(&x->x_value, template, data, 0));
-        sys_vgui(".x%lx.x%lx.template%lx\n", glist_getcanvas(glist),
-            glist, data);
+        sys_vgui(".x%lx.x%lx.template%lx scalar%lx\n", glist_getcanvas(glist),
+            glist, data, sc);
     }
     else sys_vgui("pdtk_drawimage_unvis .x%lx.c .x%lx.i\n",
         glist_getcanvas(glist), data);
diff --git a/pd/src/pdtk_drawimage.tcl b/pd/src/pdtk_drawimage.tcl
index d8b2e9a3b..5ce186bd6 100644
--- a/pd/src/pdtk_drawimage.tcl
+++ b/pd/src/pdtk_drawimage.tcl
@@ -64,12 +64,12 @@ proc pdtk_drawimage_new {obj path canvasdir flags} {
     }
 }
 
-proc pdtk_drawimage_vis {c x y obj tag seqno l2orktag} {
+proc pdtk_drawimage_vis {c x y obj tag seqno l2orktag1 l2orktag2} {
     set img ::drawimage_${obj}
     set len [llength [lsearch -glob -all [image names] ${img}*]]
     if {$len < 1} {return}
     if {$seqno >= $len || $seqno < 0} {set seqno [expr {$seqno % $len}]}
-    $c create image $x $y -image ${img}$seqno -anchor nw -tags [list $tag $l2orktag]
+    $c create image $x $y -image ${img}$seqno -anchor nw -tags [list $tag $l2orktag1 $l2orktag2]
 }
 
 proc pdtk_drawimage_unvis {c tag} {
-- 
GitLab