From c1366bdeb63070597e2d3362d54139ca94ccd4e2 Mon Sep 17 00:00:00 2001
From: Jonathan Wilkes <jancsika@yahoo.com>
Date: Sat, 18 Apr 2015 19:06:34 -0400
Subject: [PATCH] hooked up dsp shortcut keys, more work on garrays

---
 pd/nw/dialog_canvas.html          | 197 +++++++++++++++++-------------
 pd/nw/index.html                  |   4 +-
 pd/nw/locales/en/translation.json |   4 +-
 pd/nw/pd_canvas.html              |  10 +-
 pd/nw/pdgui.js                    |  23 +++-
 pd/nw/todo.txt                    |   8 +-
 pd/src/g_array.c                  |   4 +-
 pd/src/g_canvas.c                 |  10 +-
 pd/src/g_scalar.c                 |   2 +-
 9 files changed, 161 insertions(+), 101 deletions(-)

diff --git a/pd/nw/dialog_canvas.html b/pd/nw/dialog_canvas.html
index f44304c8c..36a096ca1 100644
--- a/pd/nw/dialog_canvas.html
+++ b/pd/nw/dialog_canvas.html
@@ -7,7 +7,7 @@
     <div class="container noselect">
     <form> 
 
-      <fieldset> 
+      <fieldset class="canvas"> 
         <legend data-i18n="canvas.prop.heading.gop"></legend> 
 
         <table class="pairs">
@@ -77,7 +77,7 @@
       </fieldset> 
 
 
-      <fieldset> 
+      <fieldset class="canvas"> 
         <legend data-i18n="canvas.prop.heading.data_scaling"></legend> 
 
           <div class="x-scale prop hidden">
@@ -133,76 +133,93 @@
         </label>
 
           <div class="array-name prop">
-            <label class="array-name" data-i18n="[title]canvas.prop.array_name_tt">
+            <label class="array-name"
+                   data-i18n="[title]canvas.prop.array_name_tt">
               <span data-i18n="canvas.prop.array_name"></span>
-              <input onchange="attr_change(this);" class="array-name" type="text" name="array_name">
+              <input onchange="attr_change(this);"
+                     class="array-name"
+                     type="text"
+                     name="array_name">
             </label>
-            <label class="array-size" data-i18n="[title]canvas.prop.array_size_tt">
+            <label class="array-size"
+                   data-i18n="[title]canvas.prop.array_size_tt">
               <span data-i18n="canvas.prop.array_size"></span>
-              <input onchange="attr_change(this);" class="array-size" type="text" name="array_size">
+              <input onchange="attr_change(this);"
+                     class="array-size"
+                     type="text"
+                     name="array_size">
             </label>
-
-            <label class="array-save" data-i18n="[title]canvas.prop.array_save_tt">
+            <br/>
+            <label class="array-save"
+                   data-i18n="[title]canvas.prop.array_save_tt">
+              <input onchange="flag_change(this);"
+                     type="checkbox"
+                     name="array_save"
+                     value="on">
               <span data-i18n="canvas.prop.array_save"></span>
-              <input onchange="flag_change(this);" type="checkbox" name="array_save" value="on">
             </label>
-
-            <label class="array-jump" data-i18n="[title]canvas.prop.array_jump_tt">
+            <br/>
+            <label class="array-jump"
+                   data-i18n="[title]canvas.prop.array_jump_tt">
+              <input onchange="flag_change(this);"
+                     type="checkbox" name="array_jump" value="on">
               <span data-i18n="canvas.prop.array_jump"></span>
-              <input onchange="flag_change(this);" type="checkbox" name="array_jump" value="on">
             </label>
+            <br/>
 
-              <span data-i18n="canvas.prop.array_style"></span>
-
-            <label class="polygon" data-i18n="[title]canvas.prop.array_polygon_tt">
-              <span data-i18n="canvas.prop.array_polygon"></span>
+            <span data-i18n="canvas.prop.array_style"></span>
+            <br/>
+            <label class="polygon"
+                   data-i18n="[title]canvas.prop.array_polygon_tt">
               <input class="array-style"
                      type="radio"
                      id="polygon"
                      value="0"
                      name="array_style"
                      onchange="flag_change(this);">
+              <span data-i18n="canvas.prop.array_polygon"></span>
             </label>
-
-
-            <label class="points" data-i18n="[title]canvas.prop.array_points_tt">
-              <span data-i18n="canvas.prop.array_points"></span>
+            <br/>
+            <label class="points"
+                   data-i18n="[title]canvas.prop.array_points_tt">
               <input class="array-style"
                      type="radio"
                      id="points"
                      value="1"
                      name="array_style"
                      onchange="flag_change(this);">
+              <span data-i18n="canvas.prop.array_points"></span>
             </label>
-
-
-            <label class="bezier-curve" data-i18n="[title]canvas.prop.array_bezier_tt">
-              <span data-i18n="canvas.prop.array_bezier"></span>
+            <br/>
+            <label class="bezier-curve"
+                   data-i18n="[title]canvas.prop.array_bezier_tt">
               <input class="array-style"
                      type="radio"
                      id="bezier"
                      value="2"
                      name="array_style"
                      onchange="flag_change(this);">
+              <span data-i18n="canvas.prop.array_bezier"></span>
             </label>
-
-
-            <label class="bar-graph" data-i18n="[title]canvas.prop.array_bars_tt">
-              <span data-i18n="canvas.prop.array_bars"></span>
+            <br/>
+            <label class="bar-graph"
+                   data-i18n="[title]canvas.prop.array_bars_tt">
               <input class="array-style"
                      type="radio"
                      id="bar-graph"
                      value="3"
                      name="array_style"
                      onchange="flag_change(this);">
+              <span data-i18n="canvas.prop.array_bars"></span>
             </label>
-
-
+            <br/>
           </div>
 
       <div class="array-fill">
         <label data-i18n="[title]canvas.prop.array_fill_tt">
-          <input onchange="attr_change(this);" type="color" name="array_fill">
+          <input onchange="attr_change(this);"
+                 type="color"
+                 name="array_fill">
           <span data-i18n="canvas.prop.array_fill"></span>
         </label>
         <br>
@@ -210,48 +227,26 @@
 
       <div class="array-outline">
         <label data-i18n="[title]canvas.prop.array_outline_tt">
-          <input onchange="attr_change(this);" type="color" name="array_outline">
+          <input onchange="attr_change(this);"
+                 type="color"
+                 name="array_outline">
           <span data-i18n="canvas.prop.array_outline"></span>
         </label>
         <br>
       </div>
 
-
-
-    <div class="gop-range">
-        <div class="y1 prop hidden">
-          <label class="gop_opt" data-i18n="[title]canvas.prop.y1_tt">
-            <span data-i18n="canvas.prop.y1"></span>
-            <br>
-          <input class="gop_opt" type="text" name="y1">
-          </label>
-          <br>
-        </div>
-
-        <div class="x1 prop hidden">
-          <label class="gop_opt" data-i18n="[title]canvas.prop.x1_tt">
-            <span data-i18n="canvas.prop.x1"></span>
-            <input class="gop_opt" type="text" name="x1">
-          </label>
-          <label class="gop_opt" data-i18n="[title]canvas.prop.x2_tt">
-            <input class="gop_opt" type="text" name="x2">
-            <span data-i18n="canvas.prop.x2"></span>
-          </label>
-          <br>
-       </div>
-
-       <div class="y2">
-         <label class="gop_opt" data-i18n="[title]canvas.prop.y2_tt">
-           <input class="gop_opt" type="text" name="y2">
-           <br>
-           <span data-i18n="canvas.prop.y2"></span>
-         </label>
-       </div>
-    </div>
-
+      <div class="array_in_existing_graph">
+        <label class="array-in-existing-graph"
+               data-i18n="[title]canvas.prop.array_in_existing_graph_tt">
+          <input onchange="flag2_change(this);"
+                 type="checkbox"
+                 name="array_in_existing_graph"
+                 value="on">
+          <span data-i18n="canvas.prop.array_in_existing_graph"></span>
+        </label>
+      </div>
       </fieldset> 
 
-
     <div class="submit_buttons">
       <button type="button" onClick="ok()" data-i18n="[title]iem.prop.ok_tt">
         <span data-i18n="iem.prop.ok"></span>
@@ -328,6 +323,20 @@
         pdgui.gui_post("array is " + attr);
     }
 
+    function flag2_change(elem) {
+        var attr, arrays_select, name, value, flag;
+        arrays_select = document.getElementById('arrays_select');
+        attr = pd_garray_attrs[arrays_select.value];
+        name = elem.name;
+//        pdgui.gui_post("name is " + name);
+        // get value from radio group, checked from checkboxes
+        // '+' for casting boolean to number
+        value = +elem.checked;
+//        pdgui.gui_post("value is " + value);
+        attr[attr.indexOf(name) + 1] = value;
+        pdgui.gui_post("array is " + attr);
+    }
+
     function attr_change(elem) {
         var array_index, attr, arrays_select, name;
         arrays_select = document.getElementById('arrays_select');
@@ -456,26 +465,31 @@
 
 
     function apply() {
-        var i, attrs;
+        var i, attrs, gop, hide_name;
         pdgui.gui_post("we're applying shits!");
 
-        // Note: the "+" casts Boolean to Number
-        var gop = +document.getElementsByName('gop')[0].checked;
-        var hide_name = +document.getElementsByName('hide-name')[0].checked;
-
-        pdgui.pdsend([pd_object_callback, 'donecanvasdialog',
-            get_input('x-scale'),
-            get_input('y-scale'),
-            (gop + 2 * hide_name),
-            get_input('x1'),
-            get_input('y1'),
-            get_input('x2'),
-            get_input('y2'),
-            get_input('x-pix'),
-            get_input('y-pix'),
-            get_input('x-margin'),
-            get_input('y-margin'),
-            ].join(' '));
+        // If this is a dialog to create a new array, we
+        // skip the canvas dialog callback
+        if (pd_garray_attrs.length < 1 || pd_garray_attrs[0][0] !== 'array_gfxstub')
+        {
+            // Note: the "+" casts Boolean to Number
+            gop = +document.getElementsByName('gop')[0].checked;
+            hide_name = +document.getElementsByName('hide-name')[0].checked;
+
+            pdgui.pdsend([pd_object_callback, 'donecanvasdialog',
+                get_input('x-scale'),
+                get_input('y-scale'),
+                (gop + 2 * hide_name),
+                get_input('x1'),
+                get_input('y1'),
+                get_input('x2'),
+                get_input('y2'),
+                get_input('x-pix'),
+                get_input('y-pix'),
+                get_input('x-margin'),
+                get_input('y-margin'),
+                ].join(' '));
+        }
 
         // Now send the array properties, in a separate
         // message for each array
@@ -564,7 +578,7 @@ pdgui.gui_post("guistub is " + gfxstub);
     // we can create the menu and register event callbacks
     function register_canvas_id(gfxstub, attr_arrays) {
         pd_object_callback = gfxstub;
-
+        var canvas_fieldsets, i;
         // attr_arrays[0]: canvas properties
         // attr_arrays[1...n-1]: array properties
         for (var i = 0; i < attr_arrays.length; i+=2) {
@@ -574,8 +588,17 @@ pdgui.gui_post("guistub is " + gfxstub);
         // not sure that we need this for properties windows
 //        pdgui.canvas_map(gfxstub);
         translate_form();
-        populate_form(attr_arrays[0]);
-        init_arrays(attr_arrays.slice(1));
+        if (attr_arrays[0] === 'array_gfxstub') {
+            canvas_fieldsets = document.getElementsByClassName('canvas');
+            for (i = 0; i < canvas_fieldsets.length; i++) {
+                canvas_fieldsets[i].classList.add('hidden');
+            }
+            init_arrays([attr_arrays]);
+        } else {
+            populate_form(attr_arrays[0]);
+            init_arrays(attr_arrays.slice(1));
+        }
+
         // We don't turn on rendering of the "container" div until
         // We've finished displaying all the spans and populating the
         // labels and form elements.  That makes it more efficient and
diff --git a/pd/nw/index.html b/pd/nw/index.html
index acf725e54..1e090e134 100644
--- a/pd/nw/index.html
+++ b/pd/nw/index.html
@@ -377,7 +377,7 @@ function nw_create_pd_window_menus () {
         click: function() {
             pdgui.pdsend("pd dsp 1");
         },
-        key: 'c',
+        key: '/',
         modifiers: "ctrl",
         tooltip: l('menu.audio_on_tt')
     }));
@@ -387,7 +387,7 @@ function nw_create_pd_window_menus () {
         click: function() {
             pdgui.pdsend("pd dsp 0");
         },
-        key: 'a',
+        key: '.',
         modifiers: "ctrl",
         tooltip: l('menu.audio_off_tt')
     }));
diff --git a/pd/nw/locales/en/translation.json b/pd/nw/locales/en/translation.json
index f96cbaf5a..ca1c96031 100644
--- a/pd/nw/locales/en/translation.json
+++ b/pd/nw/locales/en/translation.json
@@ -267,7 +267,9 @@
       "array_outline": "outline color",
       "array_outline_tt": "color for outline around the bars",
       "array_fill": "fill color",
-      "array_fill_tt": "inner color of the bars"
+      "array_fill_tt": "inner color of the bars",
+      "array_in_existing_graph": "put in last graph",
+      "array_in_existing_graph_tt": "draw the array inside the last graph that was created. This is a way to have multiple arrays drawn in the same graph."
     }
   }
 }
diff --git a/pd/nw/pd_canvas.html b/pd/nw/pd_canvas.html
index 584793808..9a975903c 100644
--- a/pd/nw/pd_canvas.html
+++ b/pd/nw/pd_canvas.html
@@ -931,7 +931,9 @@ proc menu_array {name} {
     // Media sub-entries
     mediaMenu.append(new nw.MenuItem({
         label: l('menu.audio_on'),
-        click: menu_generic,
+        click: function() {
+            pdgui.pdsend("pd dsp 1");
+        },
         key: '/',
         modifiers: "ctrl",
         tooltip: l('menu.audio_on_tt'),
@@ -939,8 +941,10 @@ proc menu_array {name} {
 
     mediaMenu.append(new nw.MenuItem({
         label: l('menu.audio_off'),
-        click: menu_generic,
-        key: 'a',
+        click: function() {
+            pdgui.pdsend("pd dsp 0");
+        },
+        key: '.',
         modifiers: "ctrl",
         tooltip: l('menu.audio_off_tt'),
     }));
diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js
index 9a3fee245..3e07180c0 100644
--- a/pd/nw/pdgui.js
+++ b/pd/nw/pdgui.js
@@ -1859,6 +1859,7 @@ function gui_configure_item(cid, tag, attributes) {
 
 // Most of these map either to pd.tk procs, or in some cases Tk canvas subcommands
 function gui_text_create_gobj(cid, tag, type, xpos, ypos, is_toplevel) {
+    gui_post("creating a gobj");
     var svg = get_item(cid, "patchsvg"); // "patchsvg" is id for the svg in the DOM
     // Put objects on half-pixels to make them crisp (look in to the difference between
     // this and the object-rendering 'crispEdges' attribute)
@@ -2729,6 +2730,7 @@ function gui_create_scalar(cid, tag, isselected, t1, t2, t3, t4, t5, t6,
     is_toplevel) {
 gui_post("creating a scalar...");
 gui_post("is_toplevel is " + is_toplevel);
+gui_post("isselected is " + isselected);
     // we should probably use create_gobj here, but we're doing some initial 
     // scaling that normal gobjs don't need...
     var svg = get_item(cid, "patchsvg"); // "patchsvg" is id for the svg in the DOM
@@ -3210,8 +3212,19 @@ function gui_iemgui_dialog(did, attr_array) {
 
 }
 
-function gui_create_array(did, gfxstub, count) {
+function gui_create_array(did, count) {
     gui_post("trying to create an array...");
+    var attr_array = [
+        "array_gfxstub", did,
+        "array_name", 'array' + count,
+        "array_size", 100,
+        "array_flags", 3,
+        "array_fill", 'black',
+        "array_outline", 'black',
+        "array_in_existing_graph", 0
+    ];
+    dialogwin[did] = nw_create_window(did, 'canvas', 265, 540, 20, 20, 0,
+        0, 1, 'white', 'Properties', '', 0, null, attr_array);    
 }
 
 function gui_canvas_dialog(did, attr_arrays) {
@@ -3237,3 +3250,11 @@ gui_post("did is " + did + " and dialogwin[did] is " + dialogwin[did]);
         dialogwin[did] = null;
     }
 }
+
+// Global settings
+
+function gui_pd_dsp(state) {
+    if (pd_window !== undefined) {
+        pd_window.document.getElementById('dsp_control').checked = !!state;
+    }
+}
diff --git a/pd/nw/todo.txt b/pd/nw/todo.txt
index 3bf0e2321..37f4834c6 100644
--- a/pd/nw/todo.txt
+++ b/pd/nw/todo.txt
@@ -130,7 +130,13 @@ Everything else:
     the tag for this XLET is .x98be5e8.t99c0de0o0
 
 remove gui_text_select_color (css takes care of this)
-
+add a canvas message to set a transform on the patchsvg.  Good for:
+  * obscure display needs (zooming past the browser limits)
+  * rotating for a display
+  * transforming or scaling all scalars on a patch at once
+change 'array_element_fill' to 'element_fill', array_outline to 'array_element_outline' 
+either nw_create_window should take fewer parameters or it should take an
+    object with name: value pairs
 Crashers
 --------
 
diff --git a/pd/src/g_array.c b/pd/src/g_array.c
index b138cd6f4..6c8e8de18 100644
--- a/pd/src/g_array.c
+++ b/pd/src/g_array.c
@@ -521,8 +521,8 @@ void canvas_menuarray(t_glist *canvas)
     pd_vmess(&x->gl_pd, gensym("editmode"), "i", 1);
     //char cmdbuf[200];
     gcount++;
-    gui_vmess("gui_create_array", "ssi",
-        canvas_tag(x), gfxstub_new2(&x->gl_pd, x),
+    gui_vmess("gui_create_array", "si",
+        gfxstub_new2(&x->gl_pd, x),
         gcount);
     //sprintf(cmdbuf, "pdtk_array_dialog %%s array%d 100 3 1 .x%lx black black\n",
     //    ++gcount, (long unsigned int)canvas);
diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c
index 9d5b89b39..fd8c06a2c 100644
--- a/pd/src/g_canvas.c
+++ b/pd/src/g_canvas.c
@@ -1605,8 +1605,11 @@ static void canvas_dsp(t_canvas *x, t_signal **sp)
 static void canvas_start_dsp(void)
 {
     t_canvas *x;
-    if (canvas_dspstate) ugen_stop();
-    else sys_gui("pdtk_pd_dsp ON\n");
+    if (canvas_dspstate)
+        ugen_stop();
+    else
+        //sys_gui("pdtk_pd_dsp ON\n");
+        gui_vmess("gui_pd_dsp", "i", 1);
     ugen_start();
     
     for (x = canvas_list; x; x = x->gl_next)
@@ -1620,7 +1623,8 @@ static void canvas_stop_dsp(void)
     if (canvas_dspstate)
     {
         ugen_stop();
-        sys_gui("pdtk_pd_dsp OFF\n");
+        //sys_gui("pdtk_pd_dsp OFF\n");
+        gui_vmess("gui_pd_dsp", "i", 0);
         canvas_dspstate = 0;
     }
 }
diff --git a/pd/src/g_scalar.c b/pd/src/g_scalar.c
index a0b4cd11e..834947864 100644
--- a/pd/src/g_scalar.c
+++ b/pd/src/g_scalar.c
@@ -761,7 +761,6 @@ static void scalar_groupvis(t_scalar *x, t_glist *owner, t_template *template,
         svg_grouptogui(gl, template, x->sc_vec);
         gui_end_vmess();
         //sys_gui("\n");
-
     }
     for (y = gl->gl_list; y; y = y->g_next)
     {
@@ -922,6 +921,7 @@ static void scalar_vis(t_gobj *z, t_glist *owner, int vis)
         // we removed this because it caused infinite recursion
         // in the scalar-help.pd example
         //scalar_select(z, owner, 1);
+        post("here we are in scalar vis, selected...");
         scalar_drawselectrect(x, owner, 0);
         scalar_drawselectrect(x, owner, 1);
     }
-- 
GitLab