From 0ac1074a25ad4d2f1a3eca2aacc6ecf4e739ed8f Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Sat, 27 Sep 2025 10:25:12 -0700 Subject: [PATCH] fix Vue nodes capturing wheel event when Ctrl+Shift+drag zooming (#5791) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Fixed canvas read-only state during Ctrl+Shift drag-to-zoom to prevent node interaction conflicts. This fix also benefits Litegraph nodes. ## Changes - **What**: Canvas becomes read-only during [Ctrl+Shift drag zoom](https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent) operations and restores original state when finished - **What**: Added browser test coverage for zoom interaction behavior ## Review Focus State restoration on zoom interruption and edge cases where drag zoom is cancelled mid-operation. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5791-fix-Vue-nodes-capturing-wheel-event-when-Ctrl-Shift-drag-zooming-27a6d73d3650817d888ee59f8f7fcb01) by [Unito](https://www.unito.io) --------- Co-authored-by: github-actions --- .../tests/vueNodes/interactions/zoom.spec.ts | 33 ++++++++++++++++++ .../zoomed-in-ctrl-shift-chromium-linux.png | Bin 0 -> 14977 bytes src/lib/litegraph/src/LGraphCanvas.ts | 22 +++++++++--- 3 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 browser_tests/tests/vueNodes/interactions/zoom.spec.ts create mode 100644 browser_tests/tests/vueNodes/interactions/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png diff --git a/browser_tests/tests/vueNodes/interactions/zoom.spec.ts b/browser_tests/tests/vueNodes/interactions/zoom.spec.ts new file mode 100644 index 000000000..b28caec40 --- /dev/null +++ b/browser_tests/tests/vueNodes/interactions/zoom.spec.ts @@ -0,0 +1,33 @@ +import { + comfyExpect as expect, + comfyPageFixture as test +} from '../../../fixtures/ComfyPage' + +test.describe('Vue Nodes Zoom', () => { + test.beforeEach(async ({ comfyPage }) => { + await comfyPage.setSetting('Comfy.VueNodes.Enabled', true) + await comfyPage.vueNodes.waitForNodes() + }) + + test('should not capture drag while zooming with ctrl+shift+drag', async ({ + comfyPage + }) => { + const checkpointNode = comfyPage.vueNodes.getNodeByTitle('Load Checkpoint') + const nodeBoundingBox = await checkpointNode.boundingBox() + if (!nodeBoundingBox) throw new Error('Node bounding box not available') + + const nodeMidpointX = nodeBoundingBox.x + nodeBoundingBox.width / 2 + const nodeMidpointY = nodeBoundingBox.y + nodeBoundingBox.height / 2 + + // Start the Ctrl+Shift drag-to-zoom on the canvas and continue dragging over + // the node. The node should not capture the drag while drag-zooming. + await comfyPage.page.keyboard.down('Control') + await comfyPage.page.keyboard.down('Shift') + await comfyPage.dragAndDrop( + { x: 200, y: 300 }, + { x: nodeMidpointX, y: nodeMidpointY } + ) + + await expect(comfyPage.canvas).toHaveScreenshot('zoomed-in-ctrl-shift.png') + }) +}) diff --git a/browser_tests/tests/vueNodes/interactions/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png b/browser_tests/tests/vueNodes/interactions/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..1f47aab5c5b014bca908e5547f1b6cc93fea4493 GIT binary patch literal 14977 zcmeHuXH=8v+b2^LER?aKATSIl2vJl(G_?7Hh*1FWyuSy$eG~YLwS`ng_tAMNsUM|a z7yorLGfsjtGJ3Oh^AiIwsbXbW`?D)@XgWVO;IsC<{Hgzyvmb` z84dUG@v&LjBh^Csg^qHj`!nwTLF40e^cYmtNQT?zqojXRTFC5+;(+5dQH^v4cM#?E5{a_z|uym2T3z2s!~$F zPra?zPMNK6^*vnp?O`dY0sX*xtZegeAfP5q*lPWrO9+R7FBj^;U_dCRTx_;s?` z<~#YN5hABqNEFvjIB-pxw`O19o3g z>Q-YNdNhk`-Rw=vs;vBuQqOyYJ|rb|en{oPrJ(j?m5tFrYP;EbrAUuzE*3;A)ibfe zD)b>=zxIdkb|^OT$2igbr7oyqqsWCD*zMKq=A#yyAFa(+d3dyG>~j7_BQrl@=>ju1 zFe@DI=YZxKp}ANw7u|HfJy}{U@}XEHRF4g$nr;v%ryACWeaD4MA+ABa zR#(YmKan|6#O9SG^QMXH3i3Kfn2uhJfs+FAnVg7mJ+g=waQh_-2&<$vvRwM@vtSN` z9LAm1gms(o7h_^#RE&djAGIApBFwm*`nsXnw@P`*A&pZn#s#zBn5jdG=KLXQyh8M< z7J8M4<`W&3T@u0;-l#Qhbp`BFkK~VpP@{w-mVaogas`Rg6me_536WLeJ?v%RFuyG& z)$)cts1D^HKw@51H4AzY%+@|?q?iDynG0#=LSS-Yo~xMm`SVTj1E*TQFqYFe>A^^C zf@=6{bNQhVAWoMEcFmI~PeR5}bW3^D0~Vn|mMeNH$tZe8*L7sC^&RqMIk#uUP0v*?|C^m2}8e!W=4$2W_% z!6CcQZ)?SaY=@@ROs)LTFWJ%a*_bYmeC7+I08ziIuwUW*8MTA?=v{rZKF*f+f0)HiBwNezKHl7cJt-{QS>)5+qvGC z9u+diBU+2k19@U@Tm0VbOb?-)BrY<@5v+l78jU7-W=X(4VAr*x6u}k~E3fW1-XzQo?4A#TGV?+h^Ceh@eD4c?(!8sPf*zU=YHMpVTaJ;B z1X|x-PB6biM~R(A00dc^Z}-}~I2WfNcl7*eql@FBbt3x9erz4^71hY)cd4nVzzZN0 zg2H?6lDyy{WOkgwQWJlvXs`D>e$#plK8p5&vF3?h_vD1O8#C5xiBS@Pi?&$-r1@9( z=11 z&w5(O5E}6E_dL)#)kONVKm@ zasz-xbpWT(OU&pcs#rixF?%o4sKbYK`R?4gbE$#T6xe;?D{zw|Lb8y}tGdmri&a#x z4@Zz7URD!ji&tGM0LWoCpJJa2Cw3^_Sq9=^GtnZZ`C5TI&mm`BnU@q0Ii+Q`^0ZwI zEx517zwJyqo$Q4jU?vfji|-Sc3Yrn6RN9l!9iYD z7U(z3ICwD>{Qc0D^rLnaG>^<-la@%zqF(cGI6|cl8Uanj^nF z)sjAtoqnb92yJ+2{)LLPk_Ab_;o(ZSjWBS3_q%Mh|XnGv0K%T{N)d1?peNVULHsON0!Lkn#ER zXS|>TUp>N}+9aFxMX5z^PC_WBnl`_10b%r7tC6SEu6Bbn0pUlkIDm&0h5IeGB&!&2 zEQYOcL`wn5_x%9J^&VySj*1N2#O+(nxo~*D-(S(Q`q-T3&+BF}zGmDUY6fy^23VZD zXhQzgt5+g6;5qu8z^?l#ron^Z6rgk8h>a!kWV|wvcQwF9JM=b9*nWqvUm;9zwv-tM z2H4i#&M$8$mKh~SY|Lc4ivHejXR`A5eoho8q6!kR@JoqAiF_7vYk=5f@c$t85MzN#C_ANCb9I%?;RW#6d{<7U<4r^7U2mvIixZ|}Co*W(qf!p5V< zbDg{PNJ+i@t0->n-4p3j+=89ky4r17^*@r5RAw|JCJHQYtDYLQ1jmQ>ON^CfV`R$v ze8W}nMG;>=i;=jdQS_7%aN_Z3K6pL`8tqIMv(Q4k#PO!4rhvh00^Wxjr*8q05)9*o z!=s4-jK&MGZv&a#AJ7p%f@78U+pDN%{JEkOIXSs?#pLxp%K|Qy(_CWye8}dHWOu;S zlKo4}h4Ug>y#x%uB=i!&${if1tQm=!waOZqY|j+|^V*(}HXrmdID|gGU?=$7u6eyC zTLf6YMx@lMTTut45DrE{H-NpL)X*s6x&q_mcAIWA*5f~;gq`|!P0Q~Cby2=jQWF_L z)e3nzIa}+*X5oGF_4^X{xT;596Kym%(^+F-%slI@k8I+&85Fu5AnIxkn@+V}Um6?1 zwm_a0Haqn2=&sF3N)~qe4Hm=yo#QI_0E7nk#KvfB?WJDS8}l)!nVHC3%oGc9uv zJn^^pILl>&RPID<+V00M1t>-Whvy7cF#&J@55tBpyipElT)FDH-50enMg*#}Evfpb zkmppO9vh8z2_DL4&q4LyX}L98E6yjAF&6Ho)zigfX`S$d)Q=>bu= z`kg!oI>%imTAusjg%M0FdJ?^Dhc)gvSQ{|T7{49*Cd*s{m}_*T+V?=2-?Yow+rljl ze5H1DvNnLyqtfaiQ~UX*MaD7RXD$t6s>;T71K&wBe+6h>aaNbInj+q$`I>^OCft#i zz}jD5$4XY(@3IH4h5HJ@>;IH=WGaBz;YXeS*!Sy#)pu9@$j z9>?O3dvCYu_486s?YB#d)kp$WnJ@bbA-C`jhpYl#R%9`UR^q(y4hO7qUcqGcWW$~5 z>X2r^fC!!NwHqS+?EpuOy|8C6mU{eV1bOK!-V6{;OpL7cwvRJC&$eNN zeUuA@rOC-YFzHZ+<^?yH1~#^SFZFBs9|}ls4-bzt_oVbU6{Y^fz~Upl2k(4zgwNPR zt14Io$f3YIQUz(OXlCUnyrj^xQ@x`v_s37wzm>vM3URnh%}=P~qySgk$Ptmbg5@=l{_jI_K>20Rm~r}oz`a5y3>adYk7 zF<76U0gJE%Cu_pwj5nv>TBDg}>UZGqd{4yv?hVHHDBbL$l+d;I#$XSIdVL@ITxUM~ZAp+A4P?q$wRM4E@XO?$+Rtv1Nw zJQkX+Is*ksPqe0S$Wm@pW6vMjd&0-I^2pMC%#E_?L;niPuW>A|#}~s6tID*NyVqs< z9ladyboZ6wwmr0e*BD{xz+HFR#|gLfPJO+u&I4T@`Znp&pLz0=i@Zbm1eWryW8o@op6@rWnL2qXWA29jI5c>rHYGmBW4N>R7~Z^! zxKgbrN}0FyEFAJv3C@_CcCXLf@wzJBY0F9PuBD;fLb@-dr)bAr@ zOR8uXvqg)7Q{{!nVYioI>zXj7q&5NlzCQwlpIS2N9hE9asd{EaVy!yn<)ol|-q0aH z1=J;|`IYnYg}q*?!I!V$=`W(9Lx&a=qNgXaT5nw`@eVJ3N!!!p0*9k#xu=m^t5tui z{@X5*vy8+HRI=PWB{@#Wu- z!_r<2=~_pf@(o^_Qw~BR08+_06@-H#{)V+NfV2#v3e=!>?e3{7XsObmN1&`NXOUqw z6!GK8>D#tlW$()MMzahE)7{n-h4(o{t?W<5i^b|0C>1$MsRwr^>8^3!`r@@IjIV)` zhw(R3Zl}~c3Kxg6ljQJ&LnjkMR&wSGa>6$XbYf5cDSrpGq#VK-X$ZK7#?vW;GW23k zq}Jyc%dXjPuUdk&rU1IH*uNZOP_*hUj>MtbU%5xVVnof&gi(za>lV>yPO?AIXe_@X zodkgL#Cf)qM7(F!JMN(pgM#jx8df>BJFCw2dln-c%?bRO-8Sjfspp_b&sQU-SZ8;^ z>>;NujT;W1h4sNPitu{iRM#vrK49jjvz>363ET(R<>86>5sr?xCRfPjcfND%hi8c% z2L7c9d(m|%?WkEA0g_ngKu1*#IZk_6TZ(c?>D>t^}KT#xo6TA!~J6(c$AQC6g_#-cD$Wm;=dj~Mldl!CKk>) zd|9-+bqC(B)#q{1Rn0X!4?W!{4uiwT z{6j=KJviL95Ro;b6X)f;2V^z34*}8$g0hh=1rSBEn}M&xs&~t(FJjG>7s~M>|5c$v zhd~#nYd|pN)Ip%LgIOg1b1x9JI%qOD2uF3VBzplnbar0Dw;`pKCwazI4d{oVadHMm zd*zelYU7={VlEY-hG(nJ)to!3-JY)biEBcc#h)!tF9vc=)3k;ngL2X|Z~p``A&UA% zL_~?amZF~x^VVEjfsJy)Ir)IYCp#F^p9{WASU+GDqWz|ulWde$jbjy8gp+OUA#Z&v z3_&pa@VEViWtH^YoLR)?Y&ufr?q7!0Vbg0i%64j4lk@%ggAL;P!o@fRjCXi%TM|MB z-N1hXeX!>HR{NQPoZfpe5?_@#Q zAoY~tx!{Sis#<|7r+Fz^FA_EN^Xijq9C_+fR_}us*0lpD({n3*t#;8R73ew{uArbm zUwWr%UhXJ;K2|{qZxTG>BU?N_*-kuQg{OHtX@Ca@1|9y34ut@rJl8!~qO~y|wILKf z@GdDSv5?`0lsPxv(ruXTs}i+h2iT7vazEB4Qb!^udKk=g!C$nz9DXgh!>OaH(H`O3 z6+*tJtDjtfRtisM#wn&+@#hPZ;t9gM{+8!J$6K!i~LyL)d=TTMj zSssLgk00Oj*}h&C7HYMT{lv`dLOqdoVffg>pB_UkEfazOP$WY^_2F>Yy?dv(3U#91 z9M_`MU%d?k^>SaKR;3HxDJu~(UB>d^dB`~YJ@n*>;$C_43xgF<-_2)(+}VE^e}9hEIo4d=KE3{j^?fP zX|nWZR`~kSUIOmuILJe^ep2tiTp$lc_V@JML@*+j-9nyPgG+N@{JBP) zaNGf_et?x!{WLEkG9Z*y6Hb8K%`7YX1D?6H-l46_@1D-D)_EX_HI5_F(rQX-SZIZ` z7tKKV@ZsF%fCt2pa@;%)r<4?#Iq-XM!vj0!w^A*SW$X_fv#Ii^>c`$+41yvN`Be{C z-Y+h3(2Mgq-7B$kF)o~m0?T&Od{RYXp%Gebf&eM|0X*XVTm_^(4!4NC167XDYpUk7 z6s%NQ-Y4JlCet}}E^x!v6>KX44kwNv=6Xl7jdXP=I*P94%eVVqlpC1dcXM+pg(tji7>kbf@c1B2^OJ+rU8**} z%kL;0$jsJ!S`rBMxd8S7{hRG011#PG36$p5O!$lOmis@9Zut2aoHJC?NNRhS&zTQW z&42zJ@=U{Zb+aGU&q7gFmoHEYwOzsth<8MdtRMW#C8t7w-QZcsEMypC4&P}~Wb&4r z55pi*XTmUY9z&P&Qxrdh;y3=Do(>IwZwKDO$G%mPSIdE>S3MGAcPB_`-& zx15#m3OdL$p9zN_vO3$h`$^cweC7Ppr4?t+dHu@qoWPKkyi!O6AQQ2de^z;iE60U; z0RZ4z2;emkaMD?~K;Vvarpq@Deo8;xf3m9V4BBILF3a3`XuM3DG8CufgGA28vQrSrThc)ATk_;%dCb;egY?;lR<)Ih8(Q`4ed@p4zAK2(k;} z)XA-d@C#3$$6n7yf&+?;)MNiV?#(NrF9r=$>OPz)_9lIXxq(P8OTqN%F&Ku~IGQ zS1OSnFJ&WF{8H37gDX#mI7|`R)ouC=U|a*;EaDuX2oNFWXJoB*vT=)?VRNIG+J&=T zRYSQE?v&0>NmF$#_i6&ha=-pm`q-!EPe5@o`Gtb%2_ymol2PA=Un*ThCm>fdz^OH> zjAwx9+swam>5aH2PCwHQE{0f3@Ofxgg{ZG#OSy6o6St$QvzkKqW1U{qtk=7!$8VVR zkc4vtzc{-$V8N}FBlfmR0JW#~1AV^PWuK*MQ&oS}$TJg(A7Kxm$ah#xN2Q& zUO32XakzqlNt1xGwsI}4b{5GoNf%_PrPjX_zCCnj2Q;GWs&hg(s#`fJ;@Jsczi0nr zcUle_;{`tmhsP;AE2N7*Ju78(93cXR?~~lY*} zOYX0HZf}>X#xOg0gbmPcr?k;+3BPvkD=hn!RH5j&!?Af4?hD37epTBCc0*+8>)+tI z;#s6-gKFCRS~$7C4h4t5p*cxPz#11XM8o>Vm58S(tJ(p&&z5|Wf2z4Ai4#s)WK7Y$ z3|4Ez$~URwTDv5^R33Hd;VP#2Uq1k0oI$ur|G!gR`FCAe(g*lY)bjs}t6cwgdf0N5 z2Neoi2+Eo02#O)89*BITuj$eAwpNHN$^Q}>f>n9cRzf23hDu43lamlNuNucN#^oC+ z3Xcgm98McJWrSsK-t)tH&+e65uUSgO;*!PO`uOpctn#_pq&CNt9RNURARh3medeOq zMX0QNGP8?TD7nxAeJaR3D9GKN;wb<9t=kN*KMZO$)sI3A0EZ5QpMU28MzR#PSr$hA zqjh&%KT0m5OiZ+;rtY5!sFR?}>C>kbEV7vSA7?T$jg-{g%WwIXOYf7&I99aK6f)a^jNH8A6B5SP?gucy6u{=@rcgeT2^wC zrua$WXs#0O7GW^H$scVJmMOe9Y7W~NEU2sxIIM=f-O&4JclcVb zH7IUnI@~#EF-P=jw&3u)$th;*A01PcLS-bW8wQL^&2{LGhl;ioV--MSm;13u9?$#z zJdek(8ZQ)LM>p~!n6`iB-;oFz()DC~gg45i);g9eyw5jnpogC?Qw(%kE3UXMX<)VA z_gkD0D8A@wYfCEPZ*ZIvf2cfVvN;h#(=1=r3lpG$69LS;t_yPLznToPJf6A(>HAQKg8(H+WCgUJNY;z=^mJV#=RN6&rRGTD=!25ZFo-?% zLD%v8h2q3eiI0~Z{vR8P|04(yd`|&yk<81)*QkD5MyjkaCmoa6Lg>)u=9;7YHv@bA zzicJyxUxVnBxSGZeYtAJrC7((`6OGzTPY1W9`a@ZnqhVM-guVPSHF`hM%44Zgwuv7 zm1cM=+Rr-kXecx<^hE5jTOuPy3+CWSa)w2LN@PK0Mr=q zrR0#t1A`YOSbaF8n(=n=Ro5hGL3RCc(W!HC#Ym2ueFhwUuzd32a2P7E^;ru0@bLb- zKI71(uU^S&0Yhn&E~hp^nGR*D>2lg}=Auaip&{bS#8qT{*1=25X9`vX}+9L;_@3|8C?@1_=a{ataQY z5*6o9Y~Z|%njb8H#zH84rw#fsyVTc<>LnI=o@Zm%rO6KVI?2&Nk5eM#n~{1 z-#H^c)xGLL4dk5lYYk&>SXR{&kLK-Sjw2i;L2D@shg1g8CDo^Z=>m|W_ztnGVMqRKb; ziiPX_x^;K2gHp2n0js$n5+cjPJIezB5*yj-cq2JFs^32ZM42Ulx$;XMKs;d>Pxu+n z-D@B9D^M~>cnNCGF6k6=m-|l&5`;Q+6P2e4yPQ@uJ-Tv&f`gRyus|my*tn|?Lan+~ zRPRlj>#m~uW6?t)Sgf|9sZEX%n4;!qvulja&+Z6^=-DNCcvtoN?3L~MBjx1O$i0JK z;Y$%mx?*veR;=T|>g@*vk6VcQDafL#SNX_T)7@4#JsU;t#fO-eVW1P`k_opz07w0C zqDSM6N7kK)QS4uZZjR^w|5~07|=|z&LP|qMl*Zzz|!^)yRu4_u7!SE}BpYc(E*;;p(yO zJLpeO6%YCO4-vwGf~I=_zg1eYZ9VHot`giu@gx|=Kq=`GLz_aF<0X6UuCD0IsSKa( z5#Tl1D{D`iuR_zgO}`wo3YZ^1q)rMl4P_^*t39 zIP${g_vc8W6I4NkCETI3+O@Z*Cmsx@K){p+wR!pdsJ;~iC+Dryp(811f%D=V2XuN4 zW>jlcnU2fz7P|N8{iS1Zo1W15m6P>wI9r-K(ztra%Wt^xjSfW<1|3@}u$&sR)#}U% z1xZ!!N3MxoUp3^}`aYxg&Pcd+GWXXbAc>Yh$n`@*jCOAKU`xx-4P#5eDa5AZ8wnR0 zdi|ADyk)DQc}s0ct^4<<-?(vu>~hAbz#AhcD~q(Ww5qyr!SDur%n!;yn>2nw#IMHxx)_Prp)hG4f**o8tWkxA%8<&UbZ9* zj0V0F9q>)lY;CnvHu5jSfgck1L`F73N*VL)0?p2G!))GH{Xu_$qq1JY2rXeciIv_# z?rv^wk9|lqZ)`2{YRQO-nlc9!(RIsrs%`S!yO{NB{Fay}R(J=%wuewE3nZ5~*|hUd zC6<4l*PkRia|AEfI?^V+GtJrq*E>5~ zT3W!waF*t$&b2j$sop^(qATKiBCgb+s{?th_3^W>VT7D}*x*A)@_gA()GCPl6EX>+ zxYcX$2?X0RcS&<`wl$CbssUx?GiQc;42gb>&r3naj~|ET`6IHdG01X?4@&;@49FQJ zxJrEFe!ue3lsm>j{SyrWW4S-tUzp^fPpK-@?kK#Rwz#NbylM$|UIQ&7FesXD8j(oQ zPBE-^yamtln6=E2{H|f*vr*&S*N0W}-w+7e7Wxp6@UvZnfuBotI{Zs+WWv*qfA?KE zZD;MZKg@{%i`N^*%sLLt-NoTLl#&i^o;wf!2ZGs*2I3iLR0Je(9?eJ=R9ASkNl-sJ7L;a#Ud zmJh%zIIVg((iX)qERDiK18%jBEX1VRD)m9S7Otm|6`r}ss0SE0c6o?HGk>Ho5Z!PqA{|sX zbkFYye@@V${e9Nn<+#M@qE3|hJaluT<%}%M$AHrH{Cp1KHc!i=6xWTh$jJWsU?B^n z3fAMudy(Nj&~BAdTxVL={yTGDQF!T^jg3tT2WFhAQ;q)ZYT7AwkD~3}tP_! z8g2FGl8_Ol{^l9UH2*+eHrhFuW-5OyUGL-;lqQ|R9~##A3`^_IKhhfh^*k!Can<@i zK=+xmSqpX0+LVYiqZJ$`+u&cu&=di8;poDGVJw zzj4UFsrL#PypY^os!+~J65rRJM(f#ODTnobbD?Pw%q7pqD4M6Vukvo3u-u*q|AhU- z_!`t_54bpvPuw~9ECh&9N=9NO|9z)_vI5D{U$wtx3mL$0rGEV9w^0B5F6y6g#eZ)6 z@5}#>B=c)uIENfS{o z^6Bq@-e>N<>jo$X66B=#b1?)f<{G%R^IY<*JY`VbL>iJr}sL^ zpLm%uzrJ3Zu}YX_bDWHafFsgr5$0ItquV9(9=Wf|nJun2vS;S!MM0#}8h`Rk|6NI@ z^Hz~ePe|aS*t8(QLladwqp7*w>S7!tqMR~wmIyUBGh14i{aVr;&qCHWG#IO<&Qw{<`t zxNWGO2>|c^?x2QEqZDU){|;yH&9`kRXYz5Nho3vo?|rgca*@Z)0`P?IELF*ynU;TaEUh3eJ6wJ!@Vugj[] getExtraMenuOptions?( @@ -2188,7 +2188,12 @@ export class LGraphCanvas !e.altKey && e.buttons ) { - this.#dragZoomStart = { pos: [e.x, e.y], scale: this.ds.scale } + this.#dragZoomStart = { + pos: [e.x, e.y], + scale: this.ds.scale, + readOnly: this.read_only + } + this.read_only = true return } @@ -3125,7 +3130,7 @@ export class LGraphCanvas #processDragZoom(e: PointerEvent): void { // stop canvas zoom action if (!e.buttons) { - this.#dragZoomStart = null + this.#finishDragZoom() return } @@ -3143,6 +3148,13 @@ export class LGraphCanvas this.graph.change() } + #finishDragZoom(): void { + const start = this.#dragZoomStart + if (!start) return + this.#dragZoomStart = null + this.read_only = start.readOnly + } + /** * Called when a mouse move event has to be processed */ @@ -3524,6 +3536,8 @@ export class LGraphCanvas const { graph, pointer } = this if (!graph) return + this.#finishDragZoom() + LGraphCanvas.active_canvas = this this.adjustMouseEvent(e)