From be84d81c32c260d0fcef0c33cfb9b24397fd82cd Mon Sep 17 00:00:00 2001 From: Chenlei Hu Date: Tue, 13 May 2025 15:57:18 -0400 Subject: [PATCH] [Branding] Show execution progress in favicon (#3880) --- .../images/favicon_progress_16x16/frame_0.png | Bin 0 -> 647 bytes .../images/favicon_progress_16x16/frame_1.png | Bin 0 -> 674 bytes .../images/favicon_progress_16x16/frame_2.png | Bin 0 -> 674 bytes .../images/favicon_progress_16x16/frame_3.png | Bin 0 -> 674 bytes .../images/favicon_progress_16x16/frame_4.png | Bin 0 -> 698 bytes .../images/favicon_progress_16x16/frame_5.png | Bin 0 -> 700 bytes .../images/favicon_progress_16x16/frame_6.png | Bin 0 -> 702 bytes .../images/favicon_progress_16x16/frame_7.png | Bin 0 -> 705 bytes .../images/favicon_progress_16x16/frame_8.png | Bin 0 -> 708 bytes .../images/favicon_progress_16x16/frame_9.png | Bin 0 -> 705 bytes src/composables/useProgressFavicon.ts | 23 ++++++++++++++++++ src/stores/extensionStore.ts | 6 ++++- src/views/GraphView.vue | 2 ++ 13 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 public/assets/images/favicon_progress_16x16/frame_0.png create mode 100644 public/assets/images/favicon_progress_16x16/frame_1.png create mode 100644 public/assets/images/favicon_progress_16x16/frame_2.png create mode 100644 public/assets/images/favicon_progress_16x16/frame_3.png create mode 100644 public/assets/images/favicon_progress_16x16/frame_4.png create mode 100644 public/assets/images/favicon_progress_16x16/frame_5.png create mode 100644 public/assets/images/favicon_progress_16x16/frame_6.png create mode 100644 public/assets/images/favicon_progress_16x16/frame_7.png create mode 100644 public/assets/images/favicon_progress_16x16/frame_8.png create mode 100644 public/assets/images/favicon_progress_16x16/frame_9.png create mode 100644 src/composables/useProgressFavicon.ts diff --git a/public/assets/images/favicon_progress_16x16/frame_0.png b/public/assets/images/favicon_progress_16x16/frame_0.png new file mode 100644 index 0000000000000000000000000000000000000000..15b27f5a691b15e1ad561902488836bd4d1286fd GIT binary patch literal 647 zcmV;20(kw2P)- zJM(>+%H#zr}5P0?wW zu_j{v7aLJPsFXafoH z?GjZ8!7wtKF*e>o)qupIfdD>OHa44#lrn1dHqT!?!j(N9gBT_2I-aaF`F&X>4~|rP zVPHh*+@w6-Y%)61<h&v5T6Gc^P!)`cl+qj#ZpA@9mw;I8`A{0u$rcI2TCL9N%?(-dkc};hYdHK3MAY zYmUCx_`G+YO1Vc=8Rj5H;miIKjn!jZDYCn>#!+*Y{lj^TQ93szHX8+@f$%nX3OE<| zdN9YU*A4P4;ksQ$BRC==ijm0jy`P+%PLa6qkI4{Y;u#z7Fgn&{?coV&>QMwA9ODxm zVpPt4jggiDs)Oh$GPuSfiH5oPOD3nK7bqdK7&u;#wT#e#;7sG7zK%f z5)nl(YLLqeb1vQG;tU|r+v@sK_5XiKJh`NteF`Fq_l6`5&XuFkVXa3M&Q~d#b7!ek zQkuaP{cwMId08<#{1&`sR;xn zNkUrf61Qg8*!)pv;q?U7o(`&lbB1bf!iByzss_ZL00hXL<@)pn)l$Mhqs9EQDZ+A& z!yraUIw3cjU)kNQlDU9T@&aH)X&*++OmEOz?eJk`oX&E@V7$xB@EWNP5x^RyUTgFG zqDNu1{_7Zt*h4`a(cp@%xc*Ts6+{u#(pz8vP0b1C(rG<%mk`J6gv9) z4zPivR8DcJ<ao-yu~?7z24%>M$E_6@nZpxbKt$O`e}@*iEm^+Vt#&_H*cHZ z4H$)1nX5O~7>xhoy_`;MJh`L-q-lU+cyRwITU&iNH5gG85D!Dcdpv$}msY2YG5%zQ zBO9YALq(XITVS@iOhyTVq6h&g4a|26o#KOAHKeJh_T~96Cnah0r6ETfl^iMVbM+hRJWl161phMZmJ+e)kXOd0vbvq zpovlxjAP$i--fVOkkD6GMFo&CsC?Mon;QF`EaV}v!7^fHqz7biu_9rRT_YWu# zl(O`U#u+QuUh(!_m*0Lr!%V9rDa2@K&y*aQ9iwVM(mp_d5G|K3uhY&-dUGRw`Sl{c z83+hslycYe_43~g1}&=S@Dgf(5v3>^e06!9nf5Nvo}Xa%X@mLxfGfw>m_&~VSfg}1 zV^;5y2o9~bWKEwf}B)nW(@L1~%7>2_(cklebjg?g@S~wyRgQMW}_6e?Dzg=5_ z9#o)!vypCZ$dTECp&q5E8i*()!E4T~AHQd3oYU!yiBYD}(^|oP5)J+NkIeN4#AIrp zB{3>8{(7}QBdeyf_f*I};Qzl+IVRDvx2aMmu-U8*?O#Lw1A(UwpA8LAQvd(}07*qo IM6N<$f+lJ_KL7v# literal 0 HcmV?d00001 diff --git a/public/assets/images/favicon_progress_16x16/frame_3.png b/public/assets/images/favicon_progress_16x16/frame_3.png new file mode 100644 index 0000000000000000000000000000000000000000..a53315bbaf20d35bfd174d4900658f9fc9b7c8b7 GIT binary patch literal 674 zcmV;T0$u%yP)GJr^!+(TQ^A`eXk1 z^E_c(Q6Y#k@=3@~XFigq31uA+O4R_I7+Kch(#0)0$%HrWPB3}hVquW7bZnDC1BB-N zz3v`=Jv~c1Do~RKV1W0^{9u>ApRJHhVv;21!uc)MhRZl_m>D9lwy{iA1$eK(6i`>5 z?rcU~Ls5o!U$eCMAKTlry#KgJC&^J23)D9+s4;Al?R-kAl+_t*-G| zlyMgE&*mbnsGMs5#Rd5a*#8S}}g*#G? zBagKKRXAFu5|`dms}+3w$vUVYfGQZHtgR2x-bt}0U=E9oC?KS1$+zG9L*xR+1;i=h zlqmMh&O9fC>i&Bj2uhwu?6ebRXIiYS4e`gH(+t#ef`a#kEXx@jY@=#G!ahKN(p#F% zRq9E>@ekkf;L#bPw4_83qvYL)FFsviYpYJrJ0dA7fDxtBi8j z+k78^6k%d~lYciFJbyV(mgR&XC=j`_T4A*poDrqlvy6>y z^VQiF16dnul!=Kq+<)*TwY0#PfH8_SN>JGo12|)pqKKIJ`UN+x|I9Wi4gTks`E%U8 zcafn+o1jpXj&3(1a-M_Et7f2Ze)cIs2k+~=@)N2JdZ(ZW?@6*i9J>k0xe<4O`e6Z1Xwh-Zo`onzBcp(UJ(qn09iXVUafo>k- zj3;68Y?FnhDWv;9^S%-DkjD#?RLV;);Mv}>kn{u3$hQ`%R_YP)+&9JD09p`V$0Q2!byB3!)|un_oPUBDzl6&c(2*L z>l@X$No{SN2ag9SC9e2_60+Q~XXq;nzbklWP$gG1&?=BNV)hNq($$qRJ=0G*9n;tM zhrR1Rk$VeD5$V91o|LC!J4oUjFYP4?V67u5=iGm^8`q3URy8?%@Eva^H=`nHuUVL! z+KO`#Q52AZ1tA1Q$$HM69_P%7ak7@BwtA7f_m1%4%SO6ZHSk^+K*n{7K`>egjm)xT z+jlOUe@uls5rO%7jjPwrQ>|nuB^cv~v=BsfiVIq`kY$zw`)7!pV{W0B)F(W7zLWZ5 znbqBOs^tu819{7=;HwA&Afgx2P ziiGh&Q?6v(ymg%MvF)5Z^@^jTuOU`+_5bL|*Wxi+kbiZD7E#0{$HdfTuHQIIvl(Nw z$9qlQvNW<17SGIVKa*2isg&~$I#5Vi1mf7SzW*niHvK@*7~_eefHj`r6u0jjquz*# zbXc-maW1)0AvmvD*Y}6Dy$krDJKjheC1yWwpcK0mb}N*jYJ+d3b3tgeB64Ti@+ux{ i9Y~TKk(C@2P5uG^OBZ9Jg*+kv0000trOdT zjRKJkm`I6T#r%a0La3Q6??pd%bhCto&;Mp;=P-{R&(Lb+sDk%~Rx4+8EJM{G_pSMoY=gqelhb5* z%+%B_=a2qH>0=Nf63_V9Ywkb%m?SCiIvAoDPhL2#US8$viyd~mqqNiixwmwdTelY( z8R-*(K}6}SouI1h!7bFSHyb5azFpkFtzNZJ(#> z$H=mTvC$r_W{z`#qO?Oj?1u$V73ME)(2V|NB#n4oHCUKm=fRyHFf!1IhnwGj$4Y00 zH0={Y4P|{Wq-oACzg_0h!_!>5zRco62NL1X)GI(xz~Qk*3GeC-qbkI4MQ7~h7xJ;&whfi-Ibu-c#rOkgsl9-B!PhWBb2tjDsiogDzXX)8KvdrPNA<;;{xrEav{~A`q&nRa<$t7I&&{@#H2|@h=jZM4pa0qY#i|305Fm}f(qKG zW{fBU7c({aj-L;_pl$g^_2J214eDx_(}_}&jp?0t`78tXR1)xwQi zzftsu{$G<2K-SVID780?@A%C2u}^q42w)`8>!-Z#?jlXr9rP{s~E)%6WZRYjDw nMb<+m7!zon#%Fa-GqNmm+$)icMm00000NkvXXu0mjftS(9V literal 0 HcmV?d00001 diff --git a/public/assets/images/favicon_progress_16x16/frame_8.png b/public/assets/images/favicon_progress_16x16/frame_8.png new file mode 100644 index 0000000000000000000000000000000000000000..221c75a03aab072763a8ad07b967324443f1269b GIT binary patch literal 708 zcmV;#0z3VQP)hhvTVp^HC6|6UF(w)y`U9L36DP(YV@Lb~qYfMp1||+P z%#6e#!9+S-g=nLpgBUOpl*V)Kc~)%)=k^0?QmLx!wRWwwm&_i%W*~sEbBP$vDRmu9 zZ#LhBIBE$3k0FHH#oHhPv~9plzvQKbJJ=SspyIiGXE)<MXV>kKw z+*vZ6P!Vyrm}TQZ1_Is-Y0&V^w~MTfUZCGEaegYIh^MMz-Z^oFR44qov70@E2YmU} z>wJ9nJ)U|p$2kQr-2Zn#9JfRn@4fh?V1O48jRz z6_H5I^JeqDct(a#6T(rSwx=tkKLlB8jN-+lJ)yN98Kp(hBY z!ZpIV^KUXKQUdi`lM5i5X%vjsDf4p=nVa3fS!bJyXIv!QTz{G*Zg<433xmuazHVCw qjHU^w+ikTCAy7}RS3mau4&;BOJsQ;%Fmf&c0000Jm!Ieq3B8#iR=+ij~D{Xxpoe;p=wEpznn9C;K>M<5Zy5D7eg z*~YAbzV1NP$a7D(dymO&Pnr4RE-?zKf@%a4yc-d5%+2k?r-5Kv5vUqjmh#!B54n2z zJZ5xZD9p)FOXf<=pKsDlBAez7!T*+6XC_JBc|7D#UP!yh2 zN^afWK|gb>U$;W5ImG+Guyn{8+Z`BY(A|HBdToVf)02(rbf@oe^TsJes(M5?e)0r= z&+nnt%!#q0axp5+#*iO>`iejQ*v0Ije>gBRkJVvkdl^G8z!UIqPvoloF$zgqvaqn7 z?|=A)L6PD#5Q0*aoRQm)W*s8AEX{;%bq^2VyDw za^)b|pg~RJ>W``R&fW!EJ%*rc+T5eF=>=gtsw$B|zrp>7ACRWyYyT@3i%8UN6_^uSi}2I$0iCRwxDx00000NkvXXu0mjf { + const defaultFavicon = '/assets/images/favicon_progress_16x16/frame_9.png' + const favicon = useFavicon(defaultFavicon) + const executionStore = useExecutionStore() + const totalFrames = 10 + + watch( + [() => executionStore.executionProgress, () => executionStore.isIdle], + ([progress, isIdle]) => { + if (isIdle) { + favicon.value = defaultFavicon + } else { + const frame = Math.floor(progress * totalFrames) + favicon.value = `/assets/images/favicon_progress_16x16/frame_${frame}.png` + } + } + ) +} diff --git a/src/stores/extensionStore.ts b/src/stores/extensionStore.ts index 0ba23846d..2756b7593 100644 --- a/src/stores/extensionStore.ts +++ b/src/stores/extensionStore.ts @@ -16,7 +16,11 @@ export const ALWAYS_DISABLED_EXTENSIONS: readonly string[] = [ // pysssss.SnapToGrid tries to write global app.shiftDown state, which is no longer // allowed since v1.3.12. // https://github.com/Comfy-Org/ComfyUI_frontend/issues/1176 - 'pysssss.SnapToGrid' + 'pysssss.SnapToGrid', + // Favicon status is implemented in ComfyUI core in v1.20. + // https://github.com/Comfy-Org/ComfyUI_frontend/pull/3880 + 'pysssss.FaviconStatus', + 'KJNodes.browserstatus' ] export const useExtensionStore = defineStore('extension', () => { diff --git a/src/views/GraphView.vue b/src/views/GraphView.vue index 322b523ea..0ebce7e44 100644 --- a/src/views/GraphView.vue +++ b/src/views/GraphView.vue @@ -36,6 +36,7 @@ import RerouteMigrationToast from '@/components/toast/RerouteMigrationToast.vue' import TopMenubar from '@/components/topbar/TopMenubar.vue' import { useCoreCommands } from '@/composables/useCoreCommands' import { useErrorHandling } from '@/composables/useErrorHandling' +import { useProgressFavicon } from '@/composables/useProgressFavicon' import { SERVER_CONFIG_ITEMS } from '@/constants/serverConfig' import { i18n } from '@/i18n' import { StatusWsMessageStatus } from '@/schemas/apiSchema' @@ -62,6 +63,7 @@ import { useWorkspaceStore } from '@/stores/workspaceStore' import { electronAPI, isElectron } from '@/utils/envUtil' setupAutoQueueHandler() +useProgressFavicon() const { t } = useI18n() const toast = useToast()