From 47321c5b1b1411d75a981b54f9303194c5deee8b Mon Sep 17 00:00:00 2001
From: Greg Fodor <gfodor@gmail.com>
Date: Mon, 22 Oct 2018 04:45:50 +0000
Subject: [PATCH] Pinning and unpinning working but not over network

---
 src/components/pin-networked-object-button.js | 28 ++++++++++++++++---
 src/components/pinnable.js                    | 19 +++++++++++--
 src/components/sticky-object.js               |  2 +-
 .../super-networked-interactable.js           |  2 +-
 src/hub.html                                  |  4 +--
 5 files changed, 45 insertions(+), 10 deletions(-)

diff --git a/src/components/pin-networked-object-button.js b/src/components/pin-networked-object-button.js
index 51f72ac11..59883f8a7 100644
--- a/src/components/pin-networked-object-button.js
+++ b/src/components/pin-networked-object-button.js
@@ -1,13 +1,33 @@
 AFRAME.registerComponent("pin-networked-object-button", {
+  schema: {
+    labelSelector: { type: "string" }
+  },
+
   init() {
     this.scene = document.querySelector("a-scene");
+    this.labelEl = this.el.parentNode.querySelector(this.data.labelSelector);
+
+    NAF.utils.getNetworkedEntity(this.el).then(networkedEl => (this.targetEl = networkedEl));
 
     this.onClick = () => {
-      this.targetEl.setAttribute("pinnable", { pinned: true });
-      this.scene.emit("object_pinned", { el: this.targetEl });
-    };
+      let pinned = false;
 
-    NAF.utils.getNetworkedEntity(this.el).then(networkedEl => (this.targetEl = networkedEl));
+      if (this.targetEl.components.pinnable) {
+        pinned = this.targetEl.components.pinnable.data.pinned;
+      }
+
+      if (!pinned) {
+        this.el.parentNode.setAttribute("clickable", "");
+        this.targetEl.setAttribute("pinnable", { pinned: true });
+        this.labelEl.setAttribute("text", { value: "pinned" });
+        this.scene.emit("object_pinned", { el: this.targetEl });
+      } else {
+        this.el.parentNode.removeAttribute("clickable");
+        this.targetEl.setAttribute("pinnable", { pinned: false });
+        this.labelEl.setAttribute("text", { value: "unpinned" });
+        this.scene.emit("object_unpinned", { el: this.targetEl });
+      }
+    };
   },
 
   play() {
diff --git a/src/components/pinnable.js b/src/components/pinnable.js
index f0f2e11f2..14c773403 100644
--- a/src/components/pinnable.js
+++ b/src/components/pinnable.js
@@ -6,10 +6,25 @@ AFRAME.registerComponent("pinnable", {
   init() {},
 
   update() {
-    this.el.setAttribute("grabbable", { maxGrabbers: this.data.pinned ? 0 : 1 });
-
     if (this.data.pinned) {
+      if (this.el.components.grabbable) {
+        this.prevMaxGrabbers = this.el.components.grabbable.data.maxGrabbers;
+      }
+
+      if (this.el.components.body) {
+        this.prevBodyType = this.el.components.body.data.type;
+      }
+
       this.el.setAttribute("body", { type: "static" });
+      this.el.setAttribute("grabbable", { maxGrabbers: 0 });
+    } else {
+      if (typeof this.prevMaxGrabbers !== "undefined") {
+        this.el.setAttribute("grabbable", { maxGrabbers: this.prevMaxGrabbers });
+      }
+
+      if (typeof this.prevBodyType !== "undefined") {
+        this.el.setAttribute("body", { type: this.prevBodyType });
+      }
     }
   }
 });
diff --git a/src/components/sticky-object.js b/src/components/sticky-object.js
index dbf57ed56..64d229b61 100644
--- a/src/components/sticky-object.js
+++ b/src/components/sticky-object.js
@@ -60,7 +60,7 @@ AFRAME.registerComponent("sticky-object", {
   },
 
   _onGrab() {
-    if (!this.el.grabbable || this.el.grabbable.data.maxGrabbers === 0) return;
+    if (!this.el.components.grabbable || this.el.components.grabbable.data.maxGrabbers === 0) return;
 
     this.setLocked(false);
     this.el.body.collisionResponse = false;
diff --git a/src/components/super-networked-interactable.js b/src/components/super-networked-interactable.js
index f2d1b398d..5e2e37577 100644
--- a/src/components/super-networked-interactable.js
+++ b/src/components/super-networked-interactable.js
@@ -51,7 +51,7 @@ AFRAME.registerComponent("super-networked-interactable", {
   },
 
   _onGrabStart: function(e) {
-    if (!this.el.grabbable || this.el.grabbable.data.maxGrabbers === 0) return;
+    if (!this.el.components.grabbable || this.el.components.grabbable.data.maxGrabbers === 0) return;
 
     this.hand = e.detail.hand;
     this.hand.emit("haptic_pulse", { intensity: "high" });
diff --git a/src/hub.html b/src/hub.html
index c54135cdd..d2d57473c 100644
--- a/src/hub.html
+++ b/src/hub.html
@@ -153,8 +153,8 @@
                     pinnable
                 >
                     <a-entity class="action-buttons" visible-while-frozen>
-                        <a-entity mixin="rounded-text-button" pin-networked-object-button position="0 0.125 0.01"> </a-entity>
-                        <a-entity text=" value:pin; width:1.75; align:center;" text-raycast-hack position="0 0.125 0.02"></a-entity>
+                        <a-entity mixin="rounded-text-button" pin-networked-object-button="labelSelector:.pin-button-label" position="0 0.125 0.01"> </a-entity>
+                        <a-entity class="pin-button-label" text=" value:unpinned; width:1.75; align:center;" text-raycast-hack position="0 0.125 0.02"></a-entity>
                         <a-entity mixin="rounded-text-button" remove-networked-object-button position="0 -0.125 0.01"> </a-entity>
                         <a-entity text=" value:remove; width:1.75; align:center;" text-raycast-hack position="0 -0.125 0.02"></a-entity>
                     </a-entity>
-- 
GitLab