From 091f3b38335e7563a742589e35dddff7e09f8916 Mon Sep 17 00:00:00 2001 From: Broque Thomas Date: Tue, 29 Jul 2025 22:15:02 -0700 Subject: [PATCH] toast --- main.py | 11 + .../__pycache__/toast_manager.cpython-312.pyc | Bin 0 -> 14958 bytes ui/components/toast_manager.py | 260 ++++++++++++++++++ ui/pages/__pycache__/artists.cpython-312.pyc | Bin 199796 -> 200261 bytes .../__pycache__/dashboard.cpython-312.pyc | Bin 82585 -> 85154 bytes .../__pycache__/downloads.cpython-312.pyc | Bin 510399 -> 510628 bytes ui/pages/__pycache__/settings.cpython-312.pyc | Bin 66289 -> 66517 bytes ui/pages/__pycache__/sync.cpython-312.pyc | Bin 229161 -> 229385 bytes ui/pages/artists.py | 8 + ui/pages/dashboard.py | 48 +++- ui/pages/downloads.py | 4 + ui/pages/settings.py | 4 + ui/pages/sync.py | 4 + 13 files changed, 338 insertions(+), 1 deletion(-) create mode 100644 ui/components/__pycache__/toast_manager.cpython-312.pyc create mode 100644 ui/components/toast_manager.py diff --git a/main.py b/main.py index aa512d29..ad2866d5 100644 --- a/main.py +++ b/main.py @@ -20,6 +20,7 @@ from ui.pages.sync import SyncPage from ui.pages.downloads import DownloadsPage from ui.pages.artists import ArtistsPage from ui.pages.settings import SettingsPage +from ui.components.toast_manager import ToastManager logger = get_logger("main") @@ -154,6 +155,9 @@ class MainWindow(QMainWindow): # Create stacked widget for pages self.stacked_widget = QStackedWidget() + # Create toast manager + self.toast_manager = ToastManager(self) + # Create and add pages self.dashboard_page = DashboardPage() self.downloads_page = DownloadsPage(self.soulseek_client) @@ -161,10 +165,17 @@ class MainWindow(QMainWindow): self.artists_page = ArtistsPage(downloads_page=self.downloads_page) self.settings_page = SettingsPage() + # Set toast manager for pages that need direct access + self.downloads_page.set_toast_manager(self.toast_manager) + self.sync_page.set_toast_manager(self.toast_manager) + self.artists_page.set_toast_manager(self.toast_manager) + self.settings_page.set_toast_manager(self.toast_manager) + # Configure dashboard with service clients and page references self.dashboard_page.set_service_clients(self.spotify_client, self.plex_client, self.soulseek_client) self.dashboard_page.set_page_references(self.downloads_page, self.sync_page) self.dashboard_page.set_app_start_time(self.app_start_time) + self.dashboard_page.set_toast_manager(self.toast_manager) # Connect download completion signal for session tracking self.downloads_page.download_session_completed.connect( diff --git a/ui/components/__pycache__/toast_manager.cpython-312.pyc b/ui/components/__pycache__/toast_manager.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fb33274897491de9ae22b6e76df4d84f1727ef37 GIT binary patch literal 14958 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 0: + self.dismiss_timer = QTimer() + self.dismiss_timer.setSingleShot(True) + self.dismiss_timer.timeout.connect(self.dismiss) + self.dismiss_timer.start(self.duration) + + def show_at_position(self, target_rect: QRect): + """Show the toast with slide-in animation at the specified position""" + # Start position (off-screen to the right) + start_rect = QRect(target_rect.x() + 50, target_rect.y(), target_rect.width(), target_rect.height()) + + # Set initial position and show + self.setGeometry(start_rect) + self.show() + + # Animate to target position + self.slide_animation.setStartValue(start_rect) + self.slide_animation.setEndValue(target_rect) + self.slide_animation.start() + + def dismiss(self): + """Dismiss the toast with fade-out animation""" + if hasattr(self, 'dismiss_timer'): + self.dismiss_timer.stop() + + self.fade_animation.setStartValue(1.0) + self.fade_animation.setEndValue(0.0) + self.fade_animation.start() + + def _on_fade_complete(self): + """Called when fade animation completes""" + self.closed.emit(self) + self.hide() + self.deleteLater() + + def mousePressEvent(self, event): + """Handle click to dismiss""" + if event.button() == Qt.MouseButton.LeftButton: + self.dismiss() + super().mousePressEvent(event) + + +class ToastManager(QWidget): + """Manages multiple toast notifications""" + + def __init__(self, parent=None): + super().__init__(parent) + self.parent_widget = parent + self.active_toasts: List[Toast] = [] + self.toast_spacing = 10 + self.margin_from_edge = 20 + + # Make this widget transparent and non-interactive + self.setAttribute(Qt.WidgetAttribute.WA_TransparentForMouseEvents) + self.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground) + + def show_toast(self, message: str, toast_type: ToastType = ToastType.INFO, duration: int = 4000): + """Show a new toast notification""" + toast = Toast(message, toast_type, duration, self.parent_widget) + toast.closed.connect(self._on_toast_closed) + + # Calculate position for this toast + position = self._calculate_toast_position(len(self.active_toasts)) + + # Add to active toasts list + self.active_toasts.append(toast) + + # Show the toast + toast.show_at_position(position) + + # Reposition existing toasts if needed + self._reposition_existing_toasts() + + def _calculate_toast_position(self, index: int) -> QRect: + """Calculate position for a toast at the given index""" + if not self.parent_widget: + return QRect(0, 0, 350, 60) + + parent_rect = self.parent_widget.rect() + toast_height = 60 + toast_width = 350 + + x = parent_rect.width() - toast_width - self.margin_from_edge + y = self.margin_from_edge + (index * (toast_height + self.toast_spacing)) + + return QRect(x, y, toast_width, toast_height) + + def _reposition_existing_toasts(self): + """Reposition existing toasts to make room for new ones""" + for i, toast in enumerate(self.active_toasts[:-1]): # Exclude the newest toast + new_position = self._calculate_toast_position(i) + + # Animate to new position if needed + current_geo = toast.geometry() + if current_geo.y() != new_position.y(): + toast.slide_animation.stop() + toast.slide_animation.setStartValue(current_geo) + toast.slide_animation.setEndValue(new_position) + toast.slide_animation.start() + + def _on_toast_closed(self, toast: Toast): + """Handle when a toast is closed""" + if toast in self.active_toasts: + self.active_toasts.remove(toast) + + # Reposition remaining toasts + for i, remaining_toast in enumerate(self.active_toasts): + new_position = self._calculate_toast_position(i) + current_geo = remaining_toast.geometry() + + if current_geo != new_position: + remaining_toast.slide_animation.stop() + remaining_toast.slide_animation.setStartValue(current_geo) + remaining_toast.slide_animation.setEndValue(new_position) + remaining_toast.slide_animation.start() + + def clear_all_toasts(self): + """Dismiss all active toasts""" + for toast in self.active_toasts.copy(): + toast.dismiss() + + # Convenience methods for different toast types + def success(self, message: str, duration: int = 4000): + """Show a success toast""" + self.show_toast(message, ToastType.SUCCESS, duration) + + def error(self, message: str, duration: int = 6000): + """Show an error toast (longer duration)""" + self.show_toast(message, ToastType.ERROR, duration) + + def warning(self, message: str, duration: int = 5000): + """Show a warning toast""" + self.show_toast(message, ToastType.WARNING, duration) + + def info(self, message: str, duration: int = 4000): + """Show an info toast""" + self.show_toast(message, ToastType.INFO, duration) \ No newline at end of file diff --git a/ui/pages/__pycache__/artists.cpython-312.pyc b/ui/pages/__pycache__/artists.cpython-312.pyc index f209d83ef0644f228c9d7ffa5f6549b0099c6957..31ff59e85c334304237bbc572ccd104f4e1a9a2e 100644 GIT binary patch delta 3126 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 diff --git a/ui/pages/__pycache__/dashboard.cpython-312.pyc b/ui/pages/__pycache__/dashboard.cpython-312.pyc index 8a2ad8e79a563d05534c7fc325fa4092841c52ca..1a34e43c23425d5fd42e8994836fb1af1f64463a 100644 GIT binary patch delta 7456 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 PVcIv+O>w$wGK~0NXxsDE delta 5283 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 delta 10014 zcmaia30#)N_CNE!v%L7SsvsZ;A})vmF1e|L61Z`<|IObLPyMnKNh3xFb;9o-x0q&oUBq?64)eN1_ASRPu}))(nv zW?MgJ`EV52A1g*U;!&xQjsb`%j)91y90^Wu#~|lur*|Mu8Tkey-;<8V&013A2`r~N zhG03du1-3VurAG!{6O7MtQ%tvILtW~C3@#b$8fA0=NM7`0OLrkOn2Zc?-Q7Ubs1*e zAZJ4ybQG2|>&m3WXe?)$!b#P!b*eszwb>8Vredw*PesyDk>S!Y1}mKpv5v*s9LEOK zb~rAP~)`@Tzstk+n;86345$_tiD%+ZBg~hy9OIy zcC5vLUUB>lalK<5;)VroQ&{T8;ck(e^pEdYdwN6SlU5I?onUp>K}W5P1?!_@s;ykH zFQD@oYcKhkaC0kb0ZSseA1pj$^ND270C|oYVq6U`f4~(aowPP$D|L_Wt)c#w z8v-(xs6gssgXxMlU>)^*#ZQIdnM!NJN8-T`-2x4#RlF%8RXopoT>#J;!_+fK9 z=>``f`C!@VzLqWzw6wmjrR)7I@OnEgm}>yp&1?Z{3@>7SP#VK$;LoiXK88((fFWJgSM*KaEdeOLby{17}r$2ki>BQF$&UNBLQEWj6K7tzw_qz4I zuiH#$^N88)L`ObCUw(w&v@l=zq#G}n-_kNg&@x4^zv)@s`4~HE1n2tm@US5yA(_CB zBP0^_G(-3f`xx7;aH)bdl1W%y)*LERa03j9=N@dmPL1a`-B}t8Nx~)Bp{FJBQ06m? zx~CF+O)}EpwPfBZ(4dN9gkl`REe!vR1SE_QxSq^I*fp(&^3iO-aAM1B*f{QDP7 z&YxJ2=_pRl%ymW=J4@23=UqQtK7xP7nsr2`#7JR`q@l72Oe3ZdHA9+4WDa;Pg|}wz z`i&Hx#XU*25d(}ziNz0^r}2O&a~JHkV#PZI=IZXisYiMlH_2d`1m=`RYDXIH##n$} zJBD}SECs4Fcn6t6!scmPCih~N3LN*CXapJ4xUGTVoalTyGe6roNcYO(zSJWrhqq*_ zpfra!XDcUde34{&;mZAG^;QsXEUVPtPT)PPo&G^= z-_okjwxGsVbIpu=svrr)I3Zek*UGQNnzFWVK8FWFNdfm|JN3K*KGn+3t}NzTSQS(i z^KAIT;Jy%6!u{Dc=vu-Lfp-ZPAWHcZ)OThnZz6%@v~kHfU&6iFNqw-C_hb!MlQyV_ zTcpKhy4B!2nFq6Z5Ivc`a^CURoy)jn4K+3tlk|J@c@|zM=fUo!g|tPShR{XR_*urDgTxs)n!7e;@E{9& zp12}dBmG7>I<6+B#Xcn+tu7s-=>+}*qG$8q#?<&1gD-?}vw0g90`q6{vrQh-;RVt* z*qntdE_6B_5gMN1W$yOI*kCk8b&Ws>UdZ2JPB^oWm#`0E$P0Kzo}yAP?0tc6iZsvf z`^0~cz&w#Z&=T&V{kRu(H4YFgg@ucFH2W3aS;Tkv-6mJ@4`NFvDwC*Mm|cnfa0#5R z^!- z;w=Q5vG--rn|Y-D3)0LyU6n);E2Kjuf$PEh+!lC+E92!Xk! zTt16hO%G){v-_?IYWR!9`a8(Hm%L!+DSoQ0H*(fp2gU?a`+r>no-pk+xi!7^H20Ov z4zJhn&Ou6H7t>0n_(+mqiuZ=!Yk06lDwn7Bftb&E7^~6ApYuBwRtrPU^TABQl8HaRqV_(vd5Zd7T?hCo#%}#O>feCO?mz3w0%#--w5sq*EQ;nw7jM6W0&*9c?9Zyrm@cEt*sP zF40spH{wZbh3Z8-(BG&g#t3qS9}{(iJkKd;bBl-cK1~&W@iuLUGoDOmZgA82Q0!9U zo>!cbSDcqM(dja(ggLi(yP!`<#%BaI1m*?xIZ*{DQsG2riPJIvt>?w(++J_VASe>zzwDjE`fDKuT9j$py8^n~#3Rfd3Ty(M z2CT4&2=2i9KK13kn73p))by+jn_`i_^l!SEdZ$49gb{eRm_ zLbR_4mUhy-nW?$T$;_MRbOb7^PX{lHD^LA}DvUhaiPL9XE}E^eVK z8;UqPdrVh{2w=Esd7)yB-&Hby7Hz>eGU_t2p$)u-iYB^4nCQynR$_>U{N^Hv4TNW# zi%fY6tMHO#Jw#)7M_owRN_&Qj$%>tVib(8M4SOO*Yqm>YjTD2e7$L{D7t!pHPH!&; zaCQ+kcMvx%rzBK%7yhulqnO7&(Oo-*rwe;Sign8@Jy+slC zn?&7ak+56>^TeHk)P5pJWl_@}2Kx@<3(SE9^jFObMN{a}K{Q}3^?UuqB(x+%Cy4;r zhnVBwi6pUz^@Y!qM4V4Qs_IW55K7y^i9*=~W`+tIJf19i%Xn%U0F}w&3BQ3v$CCyL zMC~W)D%2*65N57JK(|3u?@#rEiF%yi3>}>(i265CLx@TwmPDeG2$EskP!Y+7!h)e9 zL=K~>;jm?>2AZ^U4>UN#bI_%Ps|d-?DlCSu#lh#4ownI z%2cGwBB8KCgg|`0sAVP4r9iX}GS|jD`EzOHsnjKxsA`y8AUGJ#mD)WukTJ0u*`AaR}P^Jkx8 zqv9(B^Qdki0qrs47PUT)#bOUEW`xmpqrX0VTv7cqP(Dp`W`p!UrwMJ7v#H}WD4HvN zWvMWsLhNS-w4W#Xp&~`|M6aMl#85xqOcI|<169LE^F)ka1-1WGCGeOpUS#w1rukxq zJDa9kED>H7_8W9uCT611cPtYfFeh+%nP}@Xllq(MXR7}age(_j_(XVdxd@>J+PPZv zVr$`t)nX*Rg9fh=ZPB`=Ys47~3)PA1#4?5({)?Bzdg}wOvT~!yVVmHmjkp!s>6V+s z^FFxvJKhr2Y>}R`Q_QupMPS=4^4Z^E@@|y9MIYOZBjLWWzbk5N_`JDzOf-hu2Zb*> zN{{!&e#H*L@uT7_+X`Ebp$X>@M@xLg%Hu*xjMP0(i_uXZ(R>aQ93eP_Q06`^t^Jtd zG0|hA%G~c!5ynASd|Eu)wwl-ul3A}19Hrthf>=5^$B8n}!bt@kE?JtexioB$M~RV{ zJt4g$uVkXLkDmQ+v6rzob)Qc~f(SAXOfOuc8qeawf|9(Psp%%SF&WmMMMpnHA3rOa z(~he>CyLmckab>c!cg3doSI$`jaiY7y&(2mEaw#T$>sst{)O1b*q3nRvKYqBL9;6& zg?$F4SMa#)(i^UbIBU~SQPD_CneUk5wqw#9&WWW{oMXmfA;S0+{`gAxu}{J8nrMMP z-SMX{u^TODhF7SgFs@R?mjqw^NnIm~CQ|0p#w9Y$>BuX|E69&TseikM%8vw}>o}#Y z@aT2X)_$EjoFX%R4Mo?*)2v!wyDnla>=Ow5Mtp|cx4seGSPfvH)(9TEA^b7AOSvIV zkY{LBE5g|smlej;q7}k*QLXroFTRh)SY%(e7}i-NzBS;GMRv5;d!;Q}T4igi%j~9~ zI!$V9A-IcB+6#UYvMFRq`AMTHyqoYT`7Y_Wk*=`O?(3OZ{Bba9u_xb#kU*~31E>NBZ+5xnLuQ!RHD$Odu*+X86~v^vizZRTA<8hzV}UqB%`!{2gw!E9A+*QHkBh>vo&|B7o2D+ z=P(Y#gJlQSN>>ESezq{0XIZ1niCLwS!ZMAL$pyxQFw6vnwRU;$J8&&R7D^v{0U5q} zTua&4BHyI3f?#uNIi9@^-fd(nbcJ2o$VmcCys^C;=x6Fhk_}GgGEKW>WwhLm3_GGx z2Kx4M8$|%y4qh>`BYRE9#mN2AZeCwz3^o8fyU1v1u7@YYb&-wy>+coQh2AFdPr1Rq zaBBclFx0@u!%Lw2*a=>?QUS`|aSQwEgQ|;qupfHMqtKscLS<13>Op>hhVjt*zW94g% zb%m$Wb*EajZYtqmAWmb3M(FKVZfg3a3cQa2}W<`=i2YDlS?)F@-_mRB2<0del^T-GUr( z(`5zzd^lakAmh)|Wds`l!84G5tnN2MHnU)`hQ+YDsL{~RmdnLf)>8+~k$V{H31{ZY z5L}R-=E`=gH?*k0?LSiwtB~t$tgrs@1sQL_-=2$Qd&bu3yd~1l&N88VjSOHKUR)!4 z$PAiyXDAw_n!tB!P}n)`xmHSdnNAI{u7=pnG7xh;gE!0T+@mixxZYUVZqQ*NZw$k? z$Qvvh;;Q5VmH>yVcAr}homGrSX7w~BU7IUU`xIM{>vwgedRCR!^;&v;XAv9NBiW0wqqemkX~M;vL^ zm7tH!d~3qwooJ9*dh<@%ppG@#=YB3^eH6aig*$hpj(S`66@I;_JH1DYf6@}y()N86 zp4ls%tV&pdKH%#&df>aIRz6j-*$cH5qZ>#+vV7C8H$_p#&Ox(GDtzpRD5XnJs}%1 zsYjlW_(&GuQ!V{5ylh=9+ewNd>9KG^2Gwnr5Gbpbe*~D@l_G}+%{YWScxx7^-~L!O zvHCt_c9`|C^kb2xKsX#GyfJ;!{1X``S(?s1i|&`@!oqVh76X($=Ww2t@Z&jL{vMFFn zE<0JWY)kk1L*aEf8iSET*QJu|1*rZ`Zt+=60(Q|NnJ=eRu&`DZvVZ8`YvnP9ncpKf zWfDqhdP|0*3cYX12>TlBQsa?55tAKIdr|sZj8#x^OZLO#a_E-C$IU6-_-EX>?2=yc zi)0q;p8PxJ9bUaH9hltn_)UJz*arCJjvVD`n$CXF$9|XVkaNW(b%5D)EK?^WySmb* z&a?LVf=x}ZurctsUCqKU>8M?WeS6H$`+ZO|tOyY7R1K`M%E(qCiA68i!5`jFaxp|17p*Jxw6X$2SCs{l9~uDsa$ zx?xLohhr|#yRE`^?9ckuDCKWyb_^NsJ%~?}7#jGVl!Nejd)0~ksJ)|ADC@4Vojz2U zNeL<#-;m~}^T;LYVdwD{a$y?M^ma32ln;y1l`$&Z;<1am52x9m5U$gEvV)3a-E_l_ zYLx}U-Kx%Njg^guLEX^YS7CBD^%_go;oa3ooaO7Ud#Qtx<-zv;YB76G$Hl8~EBh84 z2`U@ol#ddyPup4=Vjp?7UkJ?g{}$`$YZ6Wo|LUTUOAtC(b;Ap4^kCJ|%2vbkLsTh7 z)hto{EBJft5h=}mU*mc2*`7YZIknjM0WK!07V-je;KniM7?z}b*?!$INtFmx@6{1% zFT0>~Myiv{{u}9IYH=IlMyWFPIlMbc?Pz%42*z#VxkGXTd`%TyucM1JL=+7X#m?x{ zqt!7F-0AC`>OH)RvU60LednLTN5i2Um4wG5Fjq~Jmb*4sIZ1WIl*^$>Dg;mGS9o}+ z)^wSB^KoIP!1;W2m6hv*1!{vt&hbyH=9p-I?rGe$cs|{ys1%D2qpf}3#-ua(-dYj-1MGj)cYJi(9W5!3`|A*G+#|;zv|)zD#XG<^pfY) z%UqsBwKMa;_jkOcPJ~*#p;ws22Wr2xHo!YwdFrZ4Jg9av!ZTl*A>g@04Q2k2zC^WS zBlW^1ctnFD+;RMt1g!{K6SN_Sg!q-}h);dwwV$@>00;xsscB0xS$*8)NyP`^t`e9J zstfwUy`UmEUNDzet1gx%Hdl04Ny)xOFmR0uWCwKS8r}xdJt#0jg2cAj?^dUkS4d45x7##%)mTEiX!F zK3{}dFx9thgNkLJ>kAvyHwxc(N4KaktQAC7sfn%xYiD;?`ZYC*d#|ig?cqk18jc)s zTU9g6K4xrH(SH9sQ#$^?WlGJ&Jf>>h4D;gZOhH2??FBO{Yi8A4XXO5*DD8^#1nrQ$ z{?ygED2##VwbOH(@<*>UY@4c3=w#2lrMkPaYjeptnErY>je8PW?Ns5R2WaHcR8d4= ze#O{GE0;vYS0Q(&nk~;_MOidCOn=~71z<=PqE!!$UxP-!qx!K5So4nh0N>$0nfUQN zb{-SS$t1&!MII%}j5VGnsz1uD@pr9KVL`F^%u6pVbYx<{Y78NcB!UqH@ub5Gq_+)@ zy{iH;yvaoLKOhYH-wwtN0{WnCB#~LnFT5c{MG?@)V#7gT=DRD1T28QnfIfQ~^v%+k zM?l{ljRnwij|wTL58VcR0W;PT+@#_a0xKEIlPDhoS|)?OBe-(QUPPG*bx)!w+iSQH zUo27PF0d2jK|sk%SF$gSiYF*cGjr^n+%Rr5@~N^jO`r09uEdO)UMi;|WsQty2v!oT zAuvzkDxx+JY$n)5(3PZ^%Unf8*K?1kA1FTDM$~5nHwkJG%8fHbZYAKf46hTloj_4B zg>-#{D0+?<^zbnH6T}k?AQ(u{n;@HjVswMzapN(91cF0k+QS58RGdyQiy*F?(9AYc zOz27~CKF{P?x_Ty5PV8t?$uYRM-_p24N~M`Y$w=9K-axN7r1edfUZ#EQ-aS3j**nh zL|r1dU~?PnX3+g$+$C@$w`U>X1PuwA5%?37kXl{Hz?DQTB{0u2ofxB+`?8`70p5S7 z5eTXq;<5cVoZhE4S@JD<)_W>a;#=yq59nGLs3Sj8<1LN)q%qcO@xUM5Ou`t5!v7C; Ce#=q- diff --git a/ui/pages/__pycache__/settings.cpython-312.pyc b/ui/pages/__pycache__/settings.cpython-312.pyc index 2873d6c8b12377c2197b9bac7c7c7f4b81abe3a5..bbcbd7689fbb82b6482fccc8faadb40dc6266092 100644 GIT binary patch delta 2656 zcmZuyZBUfg72fl*EZ@3>T_8)47f6OIQFP)&6Ez(Th-fkhL7T+MWLb7!VP)C1_kDK| z#)vkC(2hpSh4RB0hbm0{ObEBrn9S59ZIVf%roqUx*`^&k`Q=ojW~xLTZSQlJuR7fy z&z|?(=bUrTx#ymH{dN2J8}_U-Sy|~e`5QR$ie>w5hnk<}DPb*WM%2_{&M2uI;ql=7XvFb&yxC8h0-6pE5Xzx=sGKsfAMV7uza(r z%US0<8P1YU%{m#T;(h}An4}LRx6^j9u)N1Up6X$`{0!K+f4@tNJ^MF}J`*QvPisp_ zQke$$y(F+d0)7HWle&1aY5AGuwI{ar9`x@6Qu(3!YWjz`RR4j4u8N~C7Nuw!@h^O5 z-R1DL0I&v3C&12+H@-&2Vxhk>U9*v}TJts9%J;VEw1~geHh<&e;4cPsF{CE|O8`#- zo&qcbESC^>%6wJwzCepV(rg6T!RbgzU_Ato+gTXNU0n@}bW_$UY&5h)t;DX9rFJSS zFjy@-td){!mr|pyuT;fnMN-x2;f-w`S}BGj$CDQ2NKLIbX)1^`yCyBBPEWa*b$YCZ z?_{ME6GO5l&im5L;{P-^QMXuORgzoftV*B~&%&j4A4xScts@^(OA@-sNyZbn$`i3RfO@nX)acnCT1qn~X3kb zVZhVyd<#;95AH1@i+{McB*T#;kBv#~P8%QWa|wDgKosW2zNMMUAPg(n4oCLQrx+jK zS4IzryZfp%iil@=JIPQa1Y-qvIiS)&%2X-VoUxxR71p7Ip*Tjb3Y$V#lj~(iFG(w|F z#k+=*o$A0I0M(C$9=_{ve#K^p&43mFT9GAA3!fpt7C*cqHN~xRA8-9eAh^k?yomTUW zN6+YLlwhdDGoOz|tWcY=nz1O8g-J!6wS48V^(6TIW05YE-w|l1doi9C2#2;dMg1(8 z7)q+&)r@*h61}O3L8P?GpE6gCbP|qEs2CE=R9OjKZ`9>)@+$vIs%H;Q{_1fT4U696 z=O{yMWdz2{_?DATWFd>AlT&YmpE%h}r-kdS14M80k+;jdGjt53#Nc`d(kMUxR2_cT zJF?DkPPQjICF({dC=bUSPn{ax@#IxZHW2IQuZ*@jTrhLc-2v$2 zPElHxE5%OFlnXWg1I+MShOfo&2MzWuZo{8!{LTfBu*5;nJSS}DO1PAX?oeAuY1oR_ zsDu4MEc)`6mR|{{8LMJebV1^-GB3D$_^Po-sfuqITl2K)sw>c{jix|y06u_!H>3|C zeFRW_h%8td79Qu{kJZp(zV!TdubOje#3f@%-7Fjy3xYn=mOJ>j=L;OFIiKQp&lh?N zv0evw9pevI{HqHO({*vjofhJ2|%neb?IQ!0vSkRpu7i2!>4+`ZsYR~01qvz0o-@QJD{@wF~BxJHvspU zsT!!HaW7at;6Z?@+D%AvHQ9qK8~YmXzf5KNu#ETPZre9`#e=1T=GS?TePwsuu%{)L z{E(|9KlVfFKn2kNH4c1AwB9{4b#t&y7r;MIuF-Sk8fe!jl>O=)%G|&7h7JEJ^Zx?) CYr9_n delta 2194 zcmZuydr*{B6yNi)yS$c-1$IFm?(!&H5;PsfX-q{Bupto89BmXAcEy!#7ry-#fiw~y zfMdjXAZD~NRA@#()GlRXX=RRS)>x=x?Nrm`Us|h@IpHJeJ9kCOY5(}`x##}Q^PYRZ z%gxG>ZOX9oVPPQ(`4?qvT{rJ&*wuVEizE3-5QkBVyF*$Ob+FP@sxZg1(~BPhd%NJ4 z0H;}V(Mcipp=>3N5qwB+ieMgr8p}%JL4_Mja>2{KDEU+kzp*VVjDfE?=T!4F;?E@NbdqN9CBZC$*#wyc zbMPmpDOo|{Bm$n{E!obiSyEpt&CV#6vR$H0%tn(-pC-r@vr*x+)7zm zV=^rejiidlGM5qNvPM^b!1Qo=zt9};L;$nk_rt9P*~nz_+b+VD?qsN8ue;MB{E0e3 z@MCEuG%6@+!pka5n?t$na*@^e5@zR&ut(7*(EtXj{bC21K^L&vFk9=rH5sh8vR z?VHsRBBlWcef>hz)rMn2C(D&_Dl_@*oi04 zR#W>_5b8uFkNyoFEcN$dTD~R4nX*81b2FuvL44?(K9_UoBA`KOoVC2n=AlhnDZX+loSVLgJ zf}WW9G>4+UlcZcrP)V?k;89;~(h`To?p$iClf0pBn^a=6Sc{yFdb!E(_bd&MBPzdW z(Imy7p*M}Eo1~?fUbWS3akwhQTCC|^rmg2HS5;ZLsmDiHc3)hcqGi?RJha2VJ3J6G^RdrA9vXuQD{4tsUE%OYC+w~P-a ze-;+YM01e;I&dxb$Iba1^pT^3{us{<7@!UF2a;hQa}0a~p*++f+RVh9!C7IH*TF}3 z^bl?ztc2t2#^4@+0o-vU)jUC;LpD6zAW4S_ju7z5j-vO-i|TU$^7;docJwcZri1kc zmD(i9?yPisRav6kIdK=xVO44!*+t+%mKIINVpjQ!nM~?hf(>|`B|{`?hm7z&%NRNt zJ2{N>8X2x>=$yIxz|v}$WM5k^9%msJ?g}vrd- zhVx$F^Wh^cPa=>cHNhw3Ur*8rl1>uviJ}a}VA`05XNU7)I_fTN%<#V^w56ggKJY;# zSx7fAMz6_BufB5(^noHDso8ktVuCrAST7M25fl^9-8RSaR(RDFE{Eq;r&!ApF6{)+ zW8dWz@UaV*2Mo!d%e)3%j%$O{;j&mw<1H2+cSt;idw;J1ABOuTMW)DXuX>^A+TgZb z%cTrkajq{Np279LBrxNfzF%P~tG=Ow(0}y?cizly{F1WLk;z$-&Jlb?FwqkJRX9Vs z|0{loHiij!>3oEa(Q@J=#fvuh&;Jr_(fNC|R=GM>c*_Q0z@d?+;Q;fF>{r7X+%%df zf5_e)jTPWF9>13;=lzy*ZN_#XJfdM_M&W{N2At%licJq+3Mr#BtHdiZuixfro%@zt~2=OXsyl z(o#=gAmGiqO_GMP(W(fCyUqio#&yd9N4F||h)(QI?si{{e)d~s)E#B8D(MeHSA+mv qu&S$1fFk|GYZyr>MiH#;(gr{Q=(=7B0K2YU3!3)KI|};e75@Y0>pBhq diff --git a/ui/pages/__pycache__/sync.cpython-312.pyc b/ui/pages/__pycache__/sync.cpython-312.pyc index d587bcb5da5f9c6b3332265fed3f094c4af01dde..67f3a472829a635d6ebbc6110bff64f089430988 100644 GIT binary patch delta 6415 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 delta 6302 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