From 82ac5f05f06a380577cb7dcd63ebec25b018f5b0 Mon Sep 17 00:00:00 2001
From: Jake Read <jake.read@cba.mit.edu>
Date: Tue, 10 Dec 2019 22:18:42 -0500
Subject: [PATCH] crude resize

---
 core/scope.js    | 157 ++++++++++++++++++++++++++---------------------
 style.css        |   9 ++-
 view/blocks.js   |  11 ++++
 view/domtools.js |  77 ++++++-----------------
 4 files changed, 123 insertions(+), 131 deletions(-)

diff --git a/core/scope.js b/core/scope.js
index 0dff360..71f63ee 100644
--- a/core/scope.js
+++ b/core/scope.js
@@ -43,7 +43,7 @@ export default function Scope(wrapper, tlv) {
   wrapper.addEventListener('contextmenu', (evt) => {
     evt.preventDefault()
     evt.stopPropagation()
-    if ($(evt.target).is('.defcore')){
+    if ($(evt.target).is('.defcore')) {
       cm.defMenu(evt)
     } else {
       cm.planeMenu(evt, tlv)
@@ -90,20 +90,20 @@ export default function Scope(wrapper, tlv) {
       // should follow
       let block = evt.target
       dt.dragTool((evt) => { // this just wraps up a global drag event, fires that on move, releases and deletes it on mouseup
-        if(!block.handle){
+        if (!block.handle) {
           console.error('was expecting this title to have a handle to ah def')
           // therefor is-not-subject to drag, therefor wyd, m8 ?
           return
         }
-        block.handle.position.x += evt.movementX * (1/cs)
-        block.handle.position.y += evt.movementY * (1/cs)
+        block.handle.position.x += evt.movementX * (1 / cs)
+        block.handle.position.y += evt.movementY * (1 / cs)
         blocks.repositionBlock(block)
       })
     } else if ($(evt.target).is('.output')) {
       evt.preventDefault()
       evt.stopPropagation()
       let opblock = evt.target
-      if(!opblock.handle) {
+      if (!opblock.handle) {
         // handles should be routed at this point
         console.error('bad / no handle for this .output, wyd? - exiting')
         return
@@ -118,17 +118,17 @@ export default function Scope(wrapper, tlv) {
       // i.e. they are first order memebers with absolute positioning, we can
       // draw links w/ no extra hassle, just pulling their positions str8 from the dom...
       dt.dragTool((drag) => {
-        position.x += drag.movementX  * (1 / cs)
+        position.x += drag.movementX * (1 / cs)
         position.y += drag.movementY * (1 / cs)
         dt.writeTransform(floater, position)
         dt.drawWire(opblock, floater)
       }, (up) => {
         // anything with a .handle is some object in our tree
-        if(up.target.handle){
-          if(up.target.handle.is === "input"){
+        if (up.target.handle) {
+          if (up.target.handle.is === "input") {
             let cnOp = opblock.handle
             let cnIp = up.target.handle
-            if(cnOp.parent.context === cnIp.parent.context){
+            if (cnOp.parent.context === cnIp.parent.context) {
               // could do here: throw up status of request,
               // clear when complete, or set err state when it doesn't work
               cnOp.parent.context.requestAddLink(cnOp, cnIp).then(() => {
@@ -147,18 +147,33 @@ export default function Scope(wrapper, tlv) {
         dt.rmWire(opblock, floater)
         $(floater).remove()
       })
-    } else if ($(evt.target).is('#wrapper')){
+    } else if ($(evt.target).is('#wrapper')) {
       evt.preventDefault()
       evt.stopPropagation()
-      dt.dragTool((evt) => {
-        evt.preventDefault()
-        evt.stopPropagation()
+      dt.dragTool((drag) => {
+        drag.preventDefault()
+        drag.stopPropagation()
         let ct = dt.readTransform(plane)
-        ct.x += evt.movementX
-        ct.y += evt.movementY
+        ct.x += drag.movementX
+        ct.y += drag.movementY
         dt.writeTransform(plane, ct)
         dt.writeBackgroundTransform(wrapper, ct)
       })
+    } else if ($(evt.target).is('.resizehandle')) {
+      evt.preventDefault()
+      evt.stopPropagation()
+      dt.dragTool((drag) => {
+        evt.preventDefault()
+        evt.stopPropagation()
+        evt.target.handle.onresize({
+          x: drag.movementX * (1 / cs),
+          y: drag.movementY * (1 / cs),
+        })
+        dt.writeTransform(evt.target, {
+          x: evt.target.handle.clientWidth - evt.target.clientWidth / 2,
+          y: evt.target.handle.clientHeight - evt.target.clientHeight / 2
+        })
+      })
     } else {
       return
     }
@@ -209,76 +224,76 @@ export default function Scope(wrapper, tlv) {
   // wherein setting something in the view with (setUpdate) or whatever bubbles up the tree
 
   let checkView = (view) => {
-      // first off, if we wipe the whole thing,
-      // we don't have to handle anything else
-      if(view.hasCompleteRedraw){
-        console.log("SCOPE run for complete redraw")
-        console.time('redraw-complete')
-        blocks.wipeContext(view)
-        for(let i = 0; i < view.defs.length; i ++){
-          blocks.redrawDef(view.defs[i])
-          view.defs[i].hasUpdate = false
-        }
-        blocks.redrawContexWires(view)
-        view.hasConnectivityChange = false
-        view.hasDefUpdate = false
-        view.hasCompleteRedraw = false
-        console.timeEnd('redraw-complete')
-        return
+    // first off, if we wipe the whole thing,
+    // we don't have to handle anything else
+    if (view.hasCompleteRedraw) {
+      console.log("SCOPE run for complete redraw")
+      console.time('redraw-complete')
+      blocks.wipeContext(view)
+      for (let i = 0; i < view.defs.length; i++) {
+        blocks.redrawDef(view.defs[i])
+        view.defs[i].hasUpdate = false
       }
+      blocks.redrawContexWires(view)
+      view.hasConnectivityChange = false
+      view.hasDefUpdate = false
+      view.hasCompleteRedraw = false
+      console.timeEnd('redraw-complete')
+      return
+    }
 
-      // otherwise, we should first handle def updates
-      // (this also counts new definitions)
-      // eventually will do / switch this per ll item
-      // defs w/ updates are for: state items, name changes,
-      // and probably connection / rewires (add / sub inputs)
-      if (view.hasDefUpdate) {
-        console.log('SCOPE run for hasDefUpdate')
-        console.time('redraw-defupdate')
-        for (let i = 0; i < view.defs.length; i++) {
-          if (view.defs[i].hasUpdate) {
-            // for now, we just redraw the entire definition, whenever we have updates for it
-            blocks.redrawDef(view.defs[i])
-            // ah yeah, so we also occasionally load defs in here w/o having their link-drawing
-            // so we should just draw links from outputs as well as from inputs, then
-            // want a clean way to do that next...
-            view.defs[i].hasUpdate = false
-          }
+    // otherwise, we should first handle def updates
+    // (this also counts new definitions)
+    // eventually will do / switch this per ll item
+    // defs w/ updates are for: state items, name changes,
+    // and probably connection / rewires (add / sub inputs)
+    if (view.hasDefUpdate) {
+      console.log('SCOPE run for hasDefUpdate')
+      console.time('redraw-defupdate')
+      for (let i = 0; i < view.defs.length; i++) {
+        if (view.defs[i].hasUpdate) {
+          // for now, we just redraw the entire definition, whenever we have updates for it
+          blocks.redrawDef(view.defs[i])
+          // ah yeah, so we also occasionally load defs in here w/o having their link-drawing
+          // so we should just draw links from outputs as well as from inputs, then
+          // want a clean way to do that next...
+          view.defs[i].hasUpdate = false
         }
-        view.hasDefUpdate = false
-        console.timeEnd('redraw-defupdate')
       }
+      view.hasDefUpdate = false
+      console.timeEnd('redraw-defupdate')
+    }
 
-      // also, we do this globally. tough. scrape and move on
-      if(view.hasConnectivityChange){
-        console.log('SCOPE run for connectivity change')
-        console.time('redraw-connectivity')
-        blocks.redrawContexWires(view)
-        view.hasConnectivityChange = false
-        console.timeEnd('redraw-connectivity')
-      }
+    // also, we do this globally. tough. scrape and move on
+    if (view.hasConnectivityChange) {
+      console.log('SCOPE run for connectivity change')
+      console.time('redraw-connectivity')
+      blocks.redrawContexWires(view)
+      view.hasConnectivityChange = false
+      console.timeEnd('redraw-connectivity')
+    }
 
-      if(view.hasDefPositionUpdate){
-        console.log('SCOPE run for reposition from view')
-        console.time('redraw-position')
-        for(let i = 0; i < view.defs.length; i ++){
-          if(view.defs[i].hasPositionUpdate){
-            blocks.repositionDef(view.defs[i])
-            view.defs[i].hasPositionUpdate = false
-          }
+    if (view.hasDefPositionUpdate) {
+      console.log('SCOPE run for reposition from view')
+      console.time('redraw-position')
+      for (let i = 0; i < view.defs.length; i++) {
+        if (view.defs[i].hasPositionUpdate) {
+          blocks.repositionDef(view.defs[i])
+          view.defs[i].hasPositionUpdate = false
         }
-        view.hasDefPositionUpdate = false
-        console.timeEnd('redraw-position')
       }
+      view.hasDefPositionUpdate = false
+      console.timeEnd('redraw-position')
+    }
   }
 
   this.check = () => {
     // check levels recursively,
     let recursor = (view) => {
       checkView(view)
-      for(let def of view.defs){
-        if(def.contains){
-          if(!def.contains.plane) continue
+      for (let def of view.defs) {
+        if (def.contains) {
+          if (!def.contains.plane) continue
           recursor(def.contains)
         }
       }
diff --git a/style.css b/style.css
index c634c9a..994c16a 100644
--- a/style.css
+++ b/style.css
@@ -72,11 +72,18 @@ body {
 
 .subplane{
 	position: absolute;
-	background-color: #c1c1c1;;
+	background-color: #c1c1c1;
 	width: 1200px;
 	height: 800px;
 }
 
+.resizehandle{
+	position:absolute;
+	background-color: blue;
+	width: 50px;
+	height: 50px;
+}
+
 #programMenu {
 	position: absolute;
 	width: 245px;
diff --git a/view/blocks.js b/view/blocks.js
index 38004c5..ef62937 100644
--- a/view/blocks.js
+++ b/view/blocks.js
@@ -88,6 +88,17 @@ let makeLink = (ldef, titleblock) => {
         ldef.blocks.push(ldef.contains.plane)
         titleblock.take(ldef.contains.plane)
         $(window.tlv.plane).append(ldef.contains.plane)
+        dt.addResizeHandle(ldef.contains.plane)
+        ldef.contains.plane.onresize = (deltas) => {
+          let size = dt.readContainerSize(ldef.contains.plane)
+          size.x += deltas.x
+          size.y += deltas.y
+          dt.writeContainerSize(ldef.contains.plane, size)
+          repositionDef(ldef)
+          if(ldef.downstream){
+            repositionDef(ldef.downstream)
+          }
+        }
         // and,
         repositionDef(ldef)
         // toggle button state,
diff --git a/view/domtools.js b/view/domtools.js
index fd9f476..3966bdb 100644
--- a/view/domtools.js
+++ b/view/domtools.js
@@ -54,13 +54,18 @@ let readTransform = (div) => {
   })
 }
 
-let readContainerWidth = (div) => {
+let readContainerSize = (div) => {
   return {
     x: div.clientWidth,
     y: div.clientHeight
   }
 }
 
+let writeContainerSize = (div, size) => {
+  div.style.width = size.x + 'px'
+  div.style.height = size.y + 'px'
+}
+
 // these two are used in the floop, to build arrays of things to push around
 let readXY = (div) => {
   return {
@@ -69,14 +74,6 @@ let readXY = (div) => {
   }
 }
 
-// and to determine how large to make the circle for pushing against
-let readSize = (div) => {
-  return {
-    width: div.clientWidth,
-    height: div.clientHeight
-  }
-}
-
 let dragTool = (dragHandler, upHandler) => {
   let onUp = (evt) => {
     if (upHandler) upHandler(evt)
@@ -224,63 +221,25 @@ let rmAllWires = (block) => {
 }
 
 // also only using this for the view atm,
-let makeResizeable = (elem, callback, notify) => {
-  console.error('have blanked this code, pls revisit')
-  /*
-  // yikes, messy dom
-  elem.onResizeCustomCallback = callback
-  // more band aid
-  if(notify) elem.onResizeCustomNotify = notify
-  // first we put a handle in the bottom,
-  let handle = $(`<div>`).append('<i class="em em-arrow_lower_right"></i>').addClass('resizehandle').get(0)
-  $(elem).append(handle)
-  // track, can we go outside?
-  let w = elem.clientWidth
-  let h = elem.clientHeight
-  this.writeTransform(handle, {x: w, y: h})
-  // make
-  elem.requestResize = (x, y) => {
-    //console.log('request resize', x, y, 'on', elem)
-    $(elem).css('width',`${x}px`).css('height', `${y}px`)
-    this.writeTransform(handle, {x: x, y: y})
-    elem.onResizeCustomCallback()
-    if(elem.onResizeCustomNotify) elem.onResizeCustomNotify()
-  }
-  // ++ or --
-  handle.onmousedown = (evt) => {
-    evt.preventDefault()
-    evt.stopPropagation()
-    // doing this once, so not covered for scroll-while-drag, but ...
-    let vt = this.readTransform(view.plane)
-    // on move,
-    let domElemMouseMove = (evt) => {
-      evt.preventDefault()
-      evt.stopPropagation()
-      let dw = evt.movementX / vt.s
-      let dh = evt.movementY / vt.s
-      let cw = (parseInt($(elem).css('width')) + dw)
-      let ch = (parseInt($(elem).css('height')) + dh)
-      elem.requestResize(cw, ch)
-    }
-    function rmOnMouseUp(evt) {
-      document.removeEventListener('mousemove', domElemMouseMove)
-      document.removeEventListener('mouseup', rmOnMouseUp)
-    }
-    document.addEventListener('mousemove', domElemMouseMove)
-    document.addEventListener('mouseup', rmOnMouseUp)
-  }
-  */
+let addResizeHandle = (elem, callback) => {
+  let grab = $(`<div>`).addClass('resizehandle').get(0)
+  grab.handle = elem
+  $(elem).append(grab)
+  writeTransform(grab, {
+    x: elem.clientWidth - grab.clientWidth / 2,
+    y: elem.clientHeight - grab.clientHeight / 2
+  })
 }
 
 export default {
   writeTransform,
   writeBackgroundTransform,
   readTransform,
-  readContainerWidth,
-  readXY,
-  readSize,
+  readContainerSize,
+  writeContainerSize,
   dragTool,
   drawWire,
   rmWire,
-  rmAllWires
+  rmAllWires,
+  addResizeHandle
 }
-- 
GitLab