From da93283e3b9617a6401a4a96eda39126154e183a Mon Sep 17 00:00:00 2001 From: Michael Rienstra Date: Fri, 5 Jul 2024 13:56:20 -0700 Subject: [PATCH] stacking demo, WIP --- src/content/demo/stacking/code.js | 117 +++++++++++++++++++++++++ src/content/demo/stacking/index.mdx | 64 ++++++++++++++ src/content/demo/stacking/stacking.png | Bin 0 -> 25660 bytes 3 files changed, 181 insertions(+) create mode 100644 src/content/demo/stacking/code.js create mode 100644 src/content/demo/stacking/index.mdx create mode 100644 src/content/demo/stacking/stacking.png diff --git a/src/content/demo/stacking/code.js b/src/content/demo/stacking/code.js new file mode 100644 index 00000000..9a435597 --- /dev/null +++ b/src/content/demo/stacking/code.js @@ -0,0 +1,117 @@ +const debounce = (fn, timeout) => { + let timeoutId = null; + return (...args) => { + if (timeoutId) { + clearTimeout(timeoutId); + } + timeoutId = setTimeout(() => { + fn(...args); + }, timeout); + return timeoutId; + }; +}; + +const canvas = new fabric.Canvas(canvasEl); + +const emojiNumbers = ["1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣"]; + +let intersecting = false; + +let index = 2; +const indexSelectEl = document.getElementById("index"); +indexSelectEl.addEventListener("change", (e) => { + index = parseInt(e.target.value, 10) - 1; +}); + +const objects = await Promise.all( + emojiNumbers.map(async (emoji, i) => { + const emojiDecoration = `${emoji}`; + const { objects, options } = await fabric.loadSVGFromString( + emojiDecoration + ); + + const shape = fabric.util.groupSVGElements(objects, options); + shape.set({ + left: 50 + i * 75, + top: 50 + i * 50, + width: 128, + height: 128, + shadow: new fabric.Shadow({ + color: "rgba(0,0,0,0.5)", + offsetY: 5, + blur: 10, + }), + }); + + canvas.add(shape); + + return shape; + }) +); + +const bringObjectForward_Btn = document.getElementById("bringObjectForward"); +bringObjectForward_Btn.onclick = function () { + canvas.bringObjectForward(objects[index], intersecting); +}; +const sendObjectBackwards_Btn = document.getElementById("sendObjectBackwards"); +sendObjectBackwards_Btn.onclick = function () { + canvas.sendObjectBackwards(objects[index], intersecting); +}; +const intersecting_Checkbox = document.getElementById("intersecting"); +intersecting_Checkbox.addEventListener("change", (e) => { + intersecting = e.target.checked; +}); + +const bringObjectToFront_Btn = document.getElementById("bringObjectToFront"); +bringObjectToFront_Btn.onclick = function () { + canvas.bringObjectToFront(objects[index]); +}; + +// todo: negative numbers actually "work", as they are passed to `splice`, but that +// behavior seems confusing and unwanted -- or at least should be documented? +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice#start +const moveObjectTo_Btn = document.getElementById("moveObjectTo"); +moveObjectTo_Btn.onclick = function () { + const currentIndex = canvas._objects.findIndex((o) => o === objects[index]); + const userInput = prompt("moveObjectTo", currentIndex); + const stackIndex = parseInt(userInput, 10); + const invalid = !(stackIndex > -1); + if (userInput !== stackIndex.toString()) { + console.log( + `Changed "${userInput}" to "${stackIndex}"` + + (invalid ? ", invalid input" : "") + ); + } else if (invalid) { + console.log("ignoring", userInput); + } + if (invalid) return; + canvas.moveObjectTo(objects[index], stackIndex); +}; + +const sendObjectToBack_Btn = document.getElementById("sendObjectToBack"); +sendObjectToBack_Btn.onclick = function () { + canvas.sendObjectToBack(objects[index]); +}; + +const preserveObjectStacking_Checkbox = document.getElementById( + "preserveObjectStacking" +); +preserveObjectStacking_Checkbox.addEventListener("change", (e) => { + canvas.preserveObjectStacking = e.target.checked; +}); + +const stackInfo_P = document.getElementById("stackInfo"); +const debouncedAfterRender = debounce((e) => { + stackInfo_P.textContent = canvas._objects.map((obj) => obj.text).join(", "); + + const activeObjects = canvas + .getActiveObjects() + .map((obj) => emojiNumbers.indexOf(obj.text)); + console.log("activeObjects", activeObjects); + if (activeObjects.length !== 1) return; + const activeObject = activeObjects[0]; + if (index === activeObject) return; + index = activeObject; + indexSelectEl.value = `${index + 1}`; +}, 100); +canvas.on("after:render", debouncedAfterRender); diff --git a/src/content/demo/stacking/index.mdx b/src/content/demo/stacking/index.mdx new file mode 100644 index 00000000..4cd14a81 --- /dev/null +++ b/src/content/demo/stacking/index.mdx @@ -0,0 +1,64 @@ +--- +date: "2012-07-25" +title: "Stacking" +description: "Stacking in FabricJS" +thumbnail: "stacking.png" +tags: ["stack", "stacking", "z-index"] +--- + +import { CodeEditor } from "../../../components/CodeEditor"; +import code from "./code?raw"; + +This demo showcases several methods for changing the object stack order, meaning the order in which they are drawn on the canvas. + +Ultimately, the `canvas._objects` array determines the stack order. The following functions all re-arrange that array. + +[`bringObjectForward`](/api/classes/canvas/#bringobjectforward) & [`sendObjectBackwards`](/api/classes/canvas/#sendobjectbackwards) both accept an optional `boolean` 2nd argument, `intersecting`, which limits changes to intersecting (overlapping) objects. + +By default, when an object is selected, it is temporary drawn above all non-selected objects. Setting [`preserveObjectStacking`](/api/classes/canvas/#preserveobjectstacking) to `true` prevents that. + + + +
+ + + + + + +
+ + + + + +
+ + + +

+ Stack order: +

+ + + + diff --git a/src/content/demo/stacking/stacking.png b/src/content/demo/stacking/stacking.png new file mode 100644 index 0000000000000000000000000000000000000000..fcfc9b35f58afb7a1b13eaf297b247478eb3e834 GIT binary patch literal 25660 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

{L?#)ZT`cgNX$9NB^5wI^ zUr;5g6g>&B*snpK*pbaXdjCCpb`89H?&ABG#-|romRC@e*a6kK)FB?bh{v?2akZfM z{5(#*mPdnVor8RZ0kKsCaE>H)M2q_cy@`6_yco+M`0*YxG`n47&O)+j9-o3Fd3K1s z1lTh^!ED(zMJ`AHDh%PR{P2(4xMq5rzYvfs7pMaa~?lJej6eKK_xMrlRY|u0l5M%OjA9iBpw$iXb}{t zGGMCmeQVeLp7%*fhprNfx2I|4Xm1oHs>>JnbDG2 zM?E=$;Y*i%-Z#>bO|9f|vR9T57V91%v?>P16mF>4V8vz<77K+u)BTY0ryM+ttw#+c zF;~84tmoGsf5=-;tQ{Yd@UNc!@TYIzU?7F%X(j`18Qk}zqn%m#B)0DaS$rC8ZgB;` z!H>164J=jBRF>NuknD5FY zJXo~{?+pUlXwa}lDSAV$jI;zYsuYr#0w4yoC6k*pdEcPfd1bQ?^gTDALO^O3W21 zy@}#u_Z>;4GgM1{SKqrAuF|$}C@vOMUE5+g;cVVxA{Hd+C>}!iZQ#Xz{k@z=8e5xFUGw7jw_Q`F=-AX1^d~)wh9V za@hP8$=dB}MvD%S7;}a*&Lgo6{-DYMiz4PWQ85K66^mVFb{05bscdVT*BzQ2ku0iX zXIHcokl<4(>odH2V6S}}SesDjnnlox=>}}!Cm&bOV)4hIW_uB9M`jd`-^JKFf zk390o$xobMy(os3CS|kPuC8t#eS?%Ry0r0w%j19h?CZT9oHn2{V1ACa#quSwwO^+j z$Y7`l;*dKA%!XOu$((kBbY9}fY}buePAOIu)Ag7=f{?(u5kohl%0vU-DgG}no*C%r z{NfY$!7a~odSA#*0zJA#{(>ZkC!5wIIcVL)^!%TE=O20X&N6uG++F@Qu$(Bi>OtsE z^a$O61;}t<3%LUe}8A@&G)aqb^h8X@44&2dk*X#8SL)N@S+p`9S!PP&gCbk=iWVk<(IFYegEoo ze`h)pkFlpm8|5;3o;I)=C9*AHgA}9$T!Ai{%PLHS}&COO>Au@NjhTV;aY zYHtH;qgrS+KZ>`k;K2Ebaej+$NL`nDtrT$b*5MH+ZWCRhtB$ce{+^B$T=V#P`ogu> z-n%T;P;)Rv!7D;`^>n7<-Au1ns!YeZva5R9z*Tfk7BMoo$P??IPWAf`Ex< z%;CX)=AX2Gl9?>o+`pAU)^>B<2G({<^j6Vhl|5B4o7mmj-0J|*8HFY`SeeLS=|t&jTJ2G;G4p|$uEqZNsK`LmDTy=Rz> zejHcJ5(A8uqKiaXMDr2;wSl#k;%@hNMp~?`8|dr#*T4TYwja+gEXo=Fx8&rARsg%P z_X)SVu>WcBC+3I;IX-G!aL^Ug*g1} z82L8gosxiQ&47i`l3hS6E0fdHFTHl^rMJ#aE#~s+b4pPmj*9S?fhse zoC*?r=y~}q##YleWso9)2G+<*Y#Ues(cDp9Fjh(_;6cAS{vS>+QKG z9vvI%nVFrRonOdt@FT}6c(YuBMH;IAgVu&PgGEpZTZ(A|D=5l4%x@!e0~Y%=*uV&Y zaNwx3%-*bUIu&<&W#!}urXsxA2wLhRY-^1MeGLdTdTn5BO|BnZX;6jv;fljz;kT0` z%qB5zQU~f7X~pO()o$rT7ePdnYbg0_7PSD!j2G*_B|4!Bx#Fj%Ccru(Br0fb8 zZD8%BDn53!9b61p!D|DgT+SVmLEB>OkYGPbvJN!nF?hj{3*G|e+Q7O6LjDM