diff --git a/frontend/src/app/main/ui/workspace/viewport.cljs b/frontend/src/app/main/ui/workspace/viewport.cljs index 1e2070c965..ee858a6182 100644 --- a/frontend/src/app/main/ui/workspace/viewport.cljs +++ b/frontend/src/app/main/ui/workspace/viewport.cljs @@ -129,6 +129,12 @@ (into [] (keep (d/getf objects-modified))) (not-empty)) + ;; True when at least one selected shape can be alt-duplicated. + ;; Inner shapes of component copies are excluded by ctk/allow-duplicate? + can-alt-duplicate? (mf/with-memo [selected base-objects] + (some #(ctk/allow-duplicate? base-objects %) + (map (d/getf base-objects) selected))) + ;; STATE alt? (mf/use-state false) shift? (mf/use-state false) @@ -317,7 +323,7 @@ (hooks/setup-dom-events zoom disable-paste-ref in-viewport-ref read-only? drawing-tool path-drawing?) (hooks/setup-viewport-size vport viewport-ref) - (hooks/setup-cursor cursor alt? mod? space? panning drawing-tool path-drawing? path-editing? (get path-bar-state :drag-cursor) z? read-only?) + (hooks/setup-cursor cursor alt? mod? space? panning drawing-tool path-drawing? path-editing? (get path-bar-state :drag-cursor) z? read-only? can-alt-duplicate?) (hooks/setup-keyboard alt? mod? space? z? shift?) (hooks/setup-hover-shapes page-id move-stream base-objects selected mod? hover measure-hover hover-ids hover-top-frame-id @hover-disabled? focus zoom show-measures? read-only? transform) diff --git a/frontend/src/app/main/ui/workspace/viewport/hooks.cljs b/frontend/src/app/main/ui/workspace/viewport/hooks.cljs index b7b3ff9292..6b91ba1984 100644 --- a/frontend/src/app/main/ui/workspace/viewport/hooks.cljs +++ b/frontend/src/app/main/ui/workspace/viewport/hooks.cljs @@ -92,9 +92,9 @@ (when (not= size vport) (st/emit! (dw/initialize-viewport (dom/get-client-size prnt))))))) -(defn setup-cursor [cursor alt? mod? space? panning drawing-tool drawing-path? path-editing? path-drag-cursor z? workspace-read-only?] +(defn setup-cursor [cursor alt? mod? space? panning drawing-tool drawing-path? path-editing? path-drag-cursor z? workspace-read-only? can-alt-duplicate?] (mf/use-effect - (mf/deps @cursor @alt? @mod? @space? panning drawing-tool drawing-path? path-editing? path-drag-cursor z? workspace-read-only?) + (mf/deps @cursor @alt? @mod? @space? panning drawing-tool drawing-path? path-editing? path-drag-cursor z? workspace-read-only? can-alt-duplicate?) (fn [] (let [show-pen? (or (= drawing-tool :path) (and drawing-path? @@ -123,7 +123,8 @@ path-editing? (utils/get-cursor :edit-path) (and @alt? - (not workspace-read-only?)) (utils/get-cursor :duplicate) + (not workspace-read-only?) + can-alt-duplicate?) (utils/get-cursor :duplicate) :else (utils/get-cursor :pointer-inner))] (when (not= @cursor new-cursor) diff --git a/frontend/src/app/main/ui/workspace/viewport_wasm.cljs b/frontend/src/app/main/ui/workspace/viewport_wasm.cljs index 6758ce4933..d696a91bed 100644 --- a/frontend/src/app/main/ui/workspace/viewport_wasm.cljs +++ b/frontend/src/app/main/ui/workspace/viewport_wasm.cljs @@ -204,6 +204,13 @@ selected-shapes (->> selected (into [] (keep (d/getf objects-modified))) (not-empty)) + + ;; True when at least one selected shape can be alt-duplicated. + ;; Inner shapes of component copies are excluded by ctk/allow-duplicate? + can-alt-duplicate? (mf/with-memo [selected base-objects] + (some #(ctk/allow-duplicate? base-objects %) + (map (d/getf base-objects) selected))) + ;; STATE alt? (mf/use-state false) shift? (mf/use-state false) @@ -630,7 +637,7 @@ (hooks/setup-dom-events zoom disable-paste-ref in-viewport-ref read-only? drawing-tool path-drawing?) (hooks/setup-viewport-size vport viewport-ref) - (hooks/setup-cursor cursor alt? mod? space? panning drawing-tool path-drawing? path-editing? (get path-bar-state :drag-cursor) z? read-only?) + (hooks/setup-cursor cursor alt? mod? space? panning drawing-tool path-drawing? path-editing? (get path-bar-state :drag-cursor) z? read-only? can-alt-duplicate?) (hooks/setup-keyboard alt? mod? space? z? shift?) (hooks/setup-hover-shapes page-id move-stream base-objects selected mod? hover measure-hover hover-ids hover-top-frame-id @hover-disabled? focus zoom show-measures? read-only? transform)