diff --git a/src/CanvasTools.tsx b/src/CanvasTools.tsx index 4a28860..d492976 100644 --- a/src/CanvasTools.tsx +++ b/src/CanvasTools.tsx @@ -67,6 +67,8 @@ export default function CanvasTools() { setBrightness, contrast, setContrast, + opacity, + setOpacity, layerMode, setLayerMode, activeCanvasType, @@ -554,6 +556,31 @@ export default function CanvasTools() { /> + +
+ +
+ { + if (Array.isArray(value)) { + value = value[0]; + } + setOpacity(value / 100); + }} + /> +
+
diff --git a/src/ToolsProvider.tsx b/src/ToolsProvider.tsx index bdfc23f..ed8acf4 100644 --- a/src/ToolsProvider.tsx +++ b/src/ToolsProvider.tsx @@ -42,6 +42,7 @@ type ObjectFilters = { Saturation?: number; Brightness?: number; Contrast?: number; + Opacity?: number; }; export default function ToolsProvider({ children }: { children: ReactNode }) { @@ -171,6 +172,7 @@ export default function ToolsProvider({ children }: { children: ReactNode }) { const getFilter = ( name: keyof ObjectFilters ): [number | null, (value: number) => void] => { + const defaultValue = name === "Opacity" ? 1 : 0; let applyObjects = selectedObjects; if (layerMode === "AllLayers") { applyObjects = canvas?._objects ?? []; @@ -182,7 +184,7 @@ export default function ToolsProvider({ children }: { children: ReactNode }) { ); if (applyObjects.length) { const getValue = (i: number) => - (filterMap.get(applyObjects[i]) ?? {})[name] ?? 0; + (filterMap.get(applyObjects[i]) ?? {})[name] ?? defaultValue; const firstValue = getValue(0); if ( applyObjects @@ -193,7 +195,7 @@ export default function ToolsProvider({ children }: { children: ReactNode }) { } return [null, (value: number) => setFilter(name, value)]; } else { - return [0, (value: number) => setFilter(name, value)]; + return [defaultValue, (value: number) => setFilter(name, value)]; } }; @@ -201,6 +203,7 @@ export default function ToolsProvider({ children }: { children: ReactNode }) { const [saturation, setSaturation] = getFilter("Saturation"); const [brightness, setBrightness] = getFilter("Brightness"); const [contrast, setContrast] = getFilter("Contrast"); + const [opacity, setOpacity] = getFilter("Opacity"); useEffect(() => { if (!filterChanges.length) { @@ -245,6 +248,9 @@ export default function ToolsProvider({ children }: { children: ReactNode }) { }) ); break; + case "Opacity": + selectedObject.opacity = filterValue; + break; } } } @@ -575,6 +581,8 @@ export default function ToolsProvider({ children }: { children: ReactNode }) { setBrightness, contrast, setContrast, + opacity, + setOpacity, layerMode, setLayerMode, selectedObjects, @@ -619,6 +627,8 @@ export default function ToolsProvider({ children }: { children: ReactNode }) { setBrightness, contrast, setContrast, + opacity, + setOpacity, layerMode, selectedObjects, lockSelection, @@ -641,7 +651,6 @@ export default function ToolsProvider({ children }: { children: ReactNode }) { hasAnimation, frameCount, sizeMultiplier, - setSizeMultiplier, selectedExportMaterials, ] ); diff --git a/src/useTools.ts b/src/useTools.ts index 5131898..f730b56 100644 --- a/src/useTools.ts +++ b/src/useTools.ts @@ -19,6 +19,8 @@ interface ToolsContextValue { setBrightness: (brightness: number) => void; contrast: number | null; setContrast: (contrast: number) => void; + opacity: number | null; + setOpacity: (opacity: number) => void; layerMode: string; setLayerMode: (layerMode: string) => void; deleteSelection: () => void;