group and ungroup issue solved

This commit is contained in:
Saimon8420 2024-12-29 17:46:25 +06:00
parent 4f4852a622
commit 9707f31094
3 changed files with 68 additions and 16 deletions

View file

@ -13,7 +13,7 @@ const Canvas = () => {
const { openSetting, openObjectPanel, openPanel } = useContext(OpenContext); const { openSetting, openObjectPanel, openPanel } = useContext(OpenContext);
const { activeObject, setActiveObject } = useContext(ActiveObjectContext); const { setActiveObject } = useContext(ActiveObjectContext);
useEffect(() => { useEffect(() => {
if (!canvas) return; // Ensure canvas is available if (!canvas) return; // Ensure canvas is available
@ -76,8 +76,6 @@ const Canvas = () => {
}; };
}, [removeSelected]); }, [removeSelected]);
console.log(activeObject);
return ( return (
<div className='flex flex-col items-center relative w-full h-full overflow-hidden'> <div className='flex flex-col items-center relative w-full h-full overflow-hidden'>

View file

@ -25,35 +25,86 @@ const SelectObjectFromGroup = () => {
} }
}, [activeObject]) }, [activeObject])
// useEffect(() => {
// if (selectedObject && previewCanvasRef.current) {
// const previewCanvas = new fabric.StaticCanvas(previewCanvasRef.current);
// previewCanvas.setDimensions({
// width: 100,
// height: 100
// })
// // Clone the active object to create a true deep copy
// selectedObject.clone((clonedObject) => {
// if (selectedObject?.width > 100 || selectedObject?.height > 100) {
// clonedObject.set({
// scaleX: 0.2,
// scaleY: 0.2,
// })
// }
// // Add the cloned object to the canvas
// clonedObject.set({
// left: 50,
// top: 50,
// originX: 'center',
// originY: 'center',
// selectable: false,
// evented: false,
// })
// previewCanvas.add(clonedObject);
// previewCanvas.renderAll();
// });
// return () => {
// previewCanvas.dispose()
// }
// }
// }, [selectedObject])
useEffect(() => { useEffect(() => {
if (selectedObject && previewCanvasRef.current) { if (selectedObject && previewCanvasRef.current) {
// Create a new static canvas
const previewCanvas = new fabric.StaticCanvas(previewCanvasRef.current); const previewCanvas = new fabric.StaticCanvas(previewCanvasRef.current);
previewCanvas.setDimensions({ previewCanvas.setDimensions({
width: 100, width: 100,
height: 100 height: 100
}) });
// Clone the active object to create a true deep copy // Clear previous objects (if any)
previewCanvas.clear();
// Clone the active object for preview
selectedObject.clone((clonedObject) => { selectedObject.clone((clonedObject) => {
// Add the cloned object to the canvas const scaledWidth = selectedObject.width * selectedObject.scaleX;
const scaledHeight = selectedObject.height * selectedObject.scaleY;
if (scaledWidth > 100 || scaledHeight > 100) {
clonedObject.scaleToWidth(100); // Scale to fit width
clonedObject.scaleToHeight(100); // Scale to fit height
}
clonedObject.set({ clonedObject.set({
left: 50, left: 50,
top: 50, top: 50,
originX: 'center', originX: 'center',
originY: 'center', originY: 'center',
selectable: false, });
evented: false,
}) // Add the cloned object to preview canvas
previewCanvas.add(clonedObject); previewCanvas.add(clonedObject);
previewCanvas.renderAll(); previewCanvas.renderAll();
}); });
// Cleanup function to dispose of the canvas
return () => { return () => {
previewCanvas.dispose() previewCanvas.clear(); // Clear all objects
previewCanvas.dispose(); // Properly dispose the canvas
};
} }
} }, [selectedObject, previewCanvasRef]);
}, [selectedObject])
const handleSelectObject = (value) => { const handleSelectObject = (value) => {
const selected = groupObjects[parseInt(value)] const selected = groupObjects[parseInt(value)]
@ -77,7 +128,7 @@ const SelectObjectFromGroup = () => {
<SelectTrigger className="w-full max-w-xs"> <SelectTrigger className="w-full max-w-xs">
<SelectValue placeholder="Select object" /> <SelectValue placeholder="Select object" />
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent className="max-h-[250px]">
{groupObjects.map((object, index) => ( {groupObjects.map((object, index) => (
<SelectItem key={index} value={index.toString()}> <SelectItem key={index} value={index.toString()}>
{object.name || `Object ${index + 1}`} {object.name || `Object ${index + 1}`}

View file

@ -23,6 +23,8 @@ export function EditPanel() {
const activeObjects = canvas.getActiveObjects(); // Get selected objects const activeObjects = canvas.getActiveObjects(); // Get selected objects
if (activeObjects.length > 1) { if (activeObjects.length > 1) {
canvas.discardActiveObject();
const group = new fabric.Group(activeObjects, { const group = new fabric.Group(activeObjects, {
left: canvas?.width / 2, left: canvas?.width / 2,
top: canvas?.height / 2, top: canvas?.height / 2,
@ -34,7 +36,8 @@ export function EditPanel() {
}) })
canvas.remove(...activeObjects); canvas.remove(...activeObjects);
canvas.add(group); canvas.add(group);
// canvas.setActiveObject(group); canvas.setActiveObject(group);
setActiveObject(group);
canvas.renderAll(); canvas.renderAll();
} else { } else {
console.log("Select at least two objects") console.log("Select at least two objects")
@ -43,13 +46,13 @@ export function EditPanel() {
const ungroupSelectedObjects = () => { const ungroupSelectedObjects = () => {
const activeObject = canvas.getActiveObject(); const activeObject = canvas.getActiveObject();
if (activeObject && activeObject.type === "group") { if (activeObject && activeObject.type === "group") {
// Get the group // Get the group
const group = activeObject; const group = activeObject;
canvas.discardActiveObject();
// Remove the group from the canvas // Remove the group from the canvas
canvas.remove(group); canvas.remove(group);
setActiveObject(null);
// Iterate through each object in the group // Iterate through each object in the group
group._objects.forEach((object) => { group._objects.forEach((object) => {