diff --git a/app/src/App.tsx b/app/src/App.tsx index 605394f8..e102ab11 100644 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -513,6 +513,7 @@ export default function App() { visibleIndices={undefined} setFrame={setCurrentFrame} pathTracingSettings={roomConfig.PathTracer} + roomLock={roomLock} /> {!roomConfig.PathTracer.enabled && ( <> @@ -528,6 +529,7 @@ export default function App() { visibleIndices={hoveredId} highlight={"backside"} setFrame={setCurrentFrame} + roomLock={roomLock} /> void; @@ -173,6 +174,7 @@ export const ParticleInstances = ({ visibleIndices: Set | undefined | number; highlight: string; pathTracingSettings: any; + roomLock: boolean; }) => { const meshRef = useRef(null); @@ -342,6 +344,7 @@ export const ParticleInstances = ({ frame={frame} selectedIds={selectedIds} setFrame={setFrame} + roomLock={roomLock} /> )} { }, [frame.positions, selectedIds]); }; -export const ParticleControls = ({ frame, selectedIds, setFrame }) => { +interface ParticleControlsProps { + frame: any; + selectedIds: Set; + setFrame: (frame: any) => void; + roomLock: boolean; +} + +export const ParticleControls: React.FC = ({ + frame, + selectedIds, + setFrame, + roomLock, +}: ParticleControlsProps) => { const controls = useRef(null); const controlsPostRef = useRef(new Vector3()); const controlsRotationRef = useRef(new Vector3()); @@ -37,6 +50,12 @@ export const ParticleControls = ({ frame, selectedIds, setFrame }) => { // State for the edit mode: "None", "translate", or "rotate" const [mode, setMode] = useState("None"); + useEffect(() => { + if (roomLock) { + setMode("None"); + } + }, [roomLock]); + // Efficiently calculate centroid and attach control to it when `selectedIds` changes const centroid = useCentroid({ frame, selectedIds }); @@ -108,6 +127,9 @@ export const ParticleControls = ({ frame, selectedIds, setFrame }) => { if (document.activeElement !== document.body) { return; } + if (roomLock) { + return; + } if (event.key.toLowerCase() === "e") { socket.emit("room:copy"); setMode((prevMode) => { @@ -129,7 +151,7 @@ export const ParticleControls = ({ frame, selectedIds, setFrame }) => { return () => { window.removeEventListener("keydown", toggleMode); }; - }, []); + }, [roomLock]); // Apply mode to TransformControls whenever it changes useEffect(() => { diff --git a/zndraw/tasks/__init__.py b/zndraw/tasks/__init__.py index a500afe2..eb912e1f 100644 --- a/zndraw/tasks/__init__.py +++ b/zndraw/tasks/__init__.py @@ -338,6 +338,12 @@ def run_room_worker(room): url=current_app.config["SERVER_URL"], token=room, ) + locked = vis.locked + if locked: + vis.log("Room is locked. Can not modify the room.") + vis.socket.sleep(1) + vis.socket.disconnect() + return geometry_queue = znsocket.Dict( r=current_app.extensions["redis"],