Pārlūkot izejas kodu

introduce draggable property

Falko Schindler 1 gadu atpakaļ
vecāks
revīzija
be4e6e4673
2 mainītis faili ar 19 papildinājumiem un 1 dzēšanām
  1. 8 1
      nicegui/elements/scene.js
  2. 11 0
      nicegui/elements/scene_object3d.py

+ 8 - 1
nicegui/elements/scene.js

@@ -60,6 +60,7 @@ export default {
     this.scene = new THREE.Scene();
     this.objects = new Map();
     this.objects.set("scene", this.scene);
+    this.draggable_objects = [];
 
     window["scene_" + this.$el.id] = this.scene; // NOTE: for selenium tests only
 
@@ -118,7 +119,7 @@ export default {
       this.scene.add(grid);
     }
     this.controls = new OrbitControls(this.camera, this.renderer.domElement);
-    this.drag_controls = new DragControls(Array.from(this.objects.values()), this.camera, this.renderer.domElement);
+    this.drag_controls = new DragControls(this.draggable_objects, this.camera, this.renderer.domElement);
     this.drag_controls.addEventListener("dragstart", () => (this.controls.enabled = false));
     this.drag_controls.addEventListener("dragend", () => (this.controls.enabled = true));
 
@@ -304,10 +305,16 @@ export default {
       if (!this.objects.has(object_id)) return;
       this.objects.get(object_id).visible = value;
     },
+    draggable(object_id, value) {
+      if (!this.objects.has(object_id)) return;
+      if (value) this.draggable_objects.push(this.objects.get(object_id));
+      else this.draggable_objects.pop(this.objects.get(object_id));
+    },
     delete(object_id) {
       if (!this.objects.has(object_id)) return;
       this.objects.get(object_id).removeFromParent();
       this.objects.delete(object_id);
+      this.draggable_objects.pop(this.objects.get(object_id));
     },
     set_texture_url(object_id, url) {
       if (!this.objects.has(object_id)) return;

+ 11 - 0
nicegui/elements/scene_object3d.py

@@ -22,6 +22,7 @@ class Object3D:
         self.opacity: float = 1.0
         self.side_: str = 'front'
         self.visible_: bool = True
+        self.draggable_: bool = False
         self.x: float = 0
         self.y: float = 0
         self.z: float = 0
@@ -44,6 +45,7 @@ class Object3D:
         self._rotate()
         self._scale()
         self._visible()
+        self._draggable()
 
     def __enter__(self):
         self.scene.stack.append(self)
@@ -73,6 +75,9 @@ class Object3D:
     def _visible(self) -> None:
         self.scene.run_method('visible', self.id, self.visible_)
 
+    def _draggable(self) -> None:
+        self.scene.run_method('draggable', self.id, self.draggable_)
+
     def _delete(self) -> None:
         self.scene.run_method('delete', self.id)
 
@@ -130,6 +135,12 @@ class Object3D:
             self._visible()
         return self
 
+    def draggable(self, value: bool = True):
+        if self.draggable_ != value:
+            self.draggable_ = value
+            self._draggable()
+        return self
+
     def delete(self) -> None:
         children = [object for object in self.scene.objects.values() if object.parent == self]
         for child in children: