From b63f32dd068c2cc9f49e5d5c6bef0af1ba467aa7 Mon Sep 17 00:00:00 2001 From: Mario Steele Date: Fri, 1 Aug 2025 22:04:50 -0500 Subject: [PATCH 1/8] Updated Icons Updated Icons to create our variant of branding. --- FreeTubeSyncer/Assets/awaiting_sync.png | Bin 1182 -> 1708 bytes FreeTubeSyncer/Assets/freetubesyncer.64.png | Bin 0 -> 1943 bytes FreeTubeSyncer/Assets/sync_complete.png | Bin 1174 -> 1694 bytes FreeTubeSyncer/Models/AppViewModel.cs | 6 ++++++ 4 files changed, 6 insertions(+) create mode 100644 FreeTubeSyncer/Assets/freetubesyncer.64.png create mode 100644 FreeTubeSyncer/Models/AppViewModel.cs diff --git a/FreeTubeSyncer/Assets/awaiting_sync.png b/FreeTubeSyncer/Assets/awaiting_sync.png index 32337e52d8dbbd47ab6a7a7868c1ca336046eab6..5fe4366eacdf661479a073f1189abfc33a4a9a7b 100644 GIT binary patch delta 1590 zcmV-62FdxJ39Jo}iGK(I7bhH|{+E#e00sg{L_t(|+U=WbOp{j_$A7&b6>STpiXaFo zs7!=9QJ9Mp-E?AfsNmR~***wMoYR?1HkZZAjF&Ch5;dB5$;4!FHxrzRPITTyf(Q#y zk_B(HpjJ?!6zvV#cORUNiy*g>;@khn_nh}l|G%E|oafxYD}S%N60;=FdnoKgcqz>; zYwcGe7V~XEkczzvcma3;cma3;h+6Wly!5bYE%M@Guv%Le_U}*Qgb4%&ZD{@8{q@L- zi;+Bj>{e6i)YI;30S~IzA`nU8-E10-E=Z`a5>qpRfsncsohz+SmCT)I#=c9=dO6~;l?O8Q>hA?)_tMW_$k|q-(U#UQf#zDH) z#(x`^ba3lA$&l5L%$yKj(K=Z-^LCs6tV}8}A?zOe7S^%;cqmy%gP1eM?s>!DG_?bj zOklpo#!pdZcHSKG#C#jtoj(LWxvO3CO{G*=S@(7&)&^K}!O!ym{8llV++jD_Qy$H< zLS4IcD{9s3E%jw}lDSiTTBWe@Rg&3rV}C$L*8>X;{)|xxj1O(UKR=E3y*dmws#M6$ zX19V03vjUEEnBOA*HR<27Iw^(^ezBLcsTN_SKSIAA>7!ZdJ&phA~dxf{_ewJ+sj}@ z_hNu$#*9uMLhuxoDr0}?b_*D3n1lY!%>9!ww;bw4~Wy1rlg!-G>H)_=45`Uz` zhEz9uUQ$wWw8zd0>+8QI;KYd@JFL`Hk=vr%EZdW8X8Nc*ZO15=gm?CjX2}E#sV!EO zB+F0$_8u7pB9yBsTXKNFLx=FGsc}n7IFMo@A;Q?HcmA#%%(Z$63E|BH^}#{Ee+uu~ zdo&LiZTf(!FIQ2$crlik7@SIFkADK#a!y5^wd33BW}AY|XZ=|k>uA+YGBPrLc1s>G zwlMKO8gMm{7r(5~4Ae8qG1rY16V)keUA*x0ML4vVf#*s2#N=;Ih z#yZGIyo0*`|1G6x(&axFOr82&Tjo6;0D#ih!OE$(NY|;ks8@5v=);jRUmiDrF38DZ zos~($%nS=?-scPBFCCsUdw=%l7K`Oxr|t~B3|D4yM;zNWZ{EDEcDvosVq5aXv%#WC zmk;-4^WWTGzc@KLd5hg{*T2X-fUNbIBgw6~Ly9x|n(^%Z`&K0`KeqDJsZ#}jsXN!^ zeA3d=retMht(a7lkm9j<{lxq;`l^SQb8>PnW@l%Y0acwb-tN6Yz%K^~0sK8IPzrzx oZ~!*o5m47Mz4gi~uR5%M0ocDE40JSt@&Et;07*qoM6N<$f|E=PIsgCw delta 1060 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 literal 0 HcmV?d00001 diff --git a/FreeTubeSyncer/Assets/sync_complete.png b/FreeTubeSyncer/Assets/sync_complete.png index a07117597dd78a8fdaf8c6566ca8807a3b465773..92288b8e1e76e42728cfdee2f79574fe3fe1feee 100644 GIT binary patch delta 1576 zcmV+@2G{wP37!p*iGK(I7bi5AOFwG>00s0(L_t(|+U=WrY*SSn$3M4^t)*+bbsZZB zGTC@Y78V023X=)JFhb<93KB_7bi|007`Mg92$~=$YQj@RnVUwzKn!F?#Q=+e48_3Q z6i~syP++o+Zf)1Ky|=x+{z24@vC%!cbhO_;?>*<_e!use-+$|z12M!9Lo`FU<%%!*AtjB1?!6A zUHk3HL0waW(B2+aQi(f-@Xdhc-80ctSKpdEfY*zrx|-%aIbB6Nb}a1V!@dO6H8r8N zJ9Vm0{rVr<3V-1hK;`lDsh!Z>j2U3a219fkK`}i&x&`n}of^FY_$?O3PX8o&1!&FB zkK8~gsMCdYd`E6BLfnUGy+PY4)| zNMpv}$jxO^*1Lln3ik!shEjMM4tv*N3>x}9UYn|&xqteNz}dmi1^R;b8v0-JDe^a#+g*6x$x_6Q^wk+^5`{!ZW(r73X<_t8Ecy=qSp&J1F-XwOlIxi2@#QQ z(BZ!!#DBQjk63T7h~7A$)vvJig3P3!%P4nOL~kI}B*KRCa`Xyd)dqPXt$k=mf_;Hm ztzfhI$hZ2r-|$lO2w+kNdE6?p*dj6ASj46~Ar}aZxWYnuKP5q&rgbhwEe1A1^Xb50XDJ)6$VY5oiFcz`7!@GEw zOzK_-+DZ{QQ%xWz9{&tIf&iLk8T~;I!*;ky%-7MhG!e<58agvTr&3s$B(f|;{qD~XngIuupsogZP5g5@_K#xfV9Y8z=rAMPixN z$A2tS5w|L6#k*uu*4a_Us<~R2-0h!L)B^S_J#DYYGjfNWl(+4Ox%$X+gO8XcOlpP2 z79XFEbMfBT=b2?H>b8CAUI&5>8hRk#5mJJRhC&O1sGxtpJ@N$DH(?bYOsZ#BW+Ai9 zMLo7PHb`hIMVu?my;{>!f*MzWIdW}4sDJgqgkO9FN2_SLx97ctf35wXy1{_SgvR9x zt5E(CTBJfVin`~mZqMCXgqKZ&D}Xd+44TuY!z#e_?9hx@+g)+A-4z$|xZ46t&#k7a ze>T7~cW$o_Aw&u$H%<7w-!mX{{ATLs%pvK>k+6Me%Bk+HxOY?>?lf(W{S*K2p??ZO z%Y@E0q^_>+>j66}T)%%VNrw&%*kPrP$XL+O?K^j=nZ^gZ-&qo5h4fX8i21{4c+_r;2M(ZZX$en>Y(pZ~vxoJnPx4tWs;faLc+(2LuJ0UQNb5{QtlI?SI9RE%WBh zD+N45t|H_~(Q;*D3aMW>NqVJ~#IXWWjt>8D4T1ui<^XZWd^SwdP0waOM2s4xl5CkN^2O+ot=gr}53^BwI aGX4Qhi5FGFYP@>@0000#K_~0N*vMof zjg2sc4Ysv9u(p<@ANe@>IPqdPV@+q8FHZ8F|7CK{A^%_A^MAh2^SsXss#K{GS(>z; z-tJ13rQ3S9=KledtN9HeXhnYoQ~)Xf6@UsrXjNo$)4$*CrNZZfNM!w&)zu`Lny~D@ zw*J0}R&+ienoy{qrnZi03O524&$dwE@uW8o5Q$LX@vu12x*poqs|7b-@K-?R^JRA3 z^mJDDIMda)-#sjg0J0MX`VaRJ25W}e;it+)UJ0|Uwp zgygEKf<8ak(LsIFxN-r68yX6>>;*eJseAiM@gl)&v^3aHN~=YG^Jd0N>Eo0z7>L!@ z671+;cf;x8hQisXQ9l9)U@9_j9b9wrgp8dWHk?mtu{8ON%nA2{?OS<`ZutL-Q_dn&-s<@Nlg?nuKruOmbt|j^l5q zxN|@x39i3n>U`rIUT}'cn!Y*yyEU&lGT;1YKgSWdv$Y?2)_#RH+pWiS|j0AlCN z*Bn`LiGLdh1mY=9-AS_hw{e_nE^z~)1qqJcPKpb_QYrJ{_E2d@g4xKVOJTD_8L-58 zN&m4p0E{}BH!Tuxm}BfQ*g0Mfxj<&dQ}mf71}qXS1vaiI0D5hT{wJf@EHU;P?3^ga zY%rawv?=;(B=&8SXfqbqc+ml99!iL|XjAl=V}I zljt=%i*ZsiOhY_)E> z2|+1(VPV(zIRn^He}X_)S4jf!`~5%WtylQoq?MYB7s*$%62<8gt^%aItOC#UPceV+ zAb)YQxg`GmbN=@}c+`Aey2ZVrqnKv?;0eE{O3RP*oIczfy@p}l-YTKpYJ+Oc6WD=0O69W2<0m8^0A-V``eFiWWKC- zhi?Q%&-eEB9twxU^Cepo%vKlf44rCwy?^bbBuR6d4u!qT$Ih3s`A;WW_xJSld?rcK z>?3=!X{B4=bELWJdnNF0sTp^A-Wj^kd*&mz+kG7f=5lPV(q^-@IvkEeFV_tBDb?^V zp(B@ Date: Fri, 1 Aug 2025 22:05:36 -0500 Subject: [PATCH 2/8] Updated DBSyncWatcher Changed from Doing a for loop, to just returning, as we don't want to propogate the signal if we are syncing. --- FreeTubeSyncer/Library/DBSyncWatcher.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/FreeTubeSyncer/Library/DBSyncWatcher.cs b/FreeTubeSyncer/Library/DBSyncWatcher.cs index f7a6bbf..f178a58 100644 --- a/FreeTubeSyncer/Library/DBSyncWatcher.cs +++ b/FreeTubeSyncer/Library/DBSyncWatcher.cs @@ -36,10 +36,7 @@ public class DBSyncWatcher { if (e.ChangeType != WatcherChangeTypes.Changed) return; - while (Locked) - { - Thread.Sleep(100); - } + if (Locked) return; var dbName = Path.GetFileName(e.FullPath); From 4c400c03b8729b88322db260ac26c6e619f75535 Mon Sep 17 00:00:00 2001 From: Mario Steele Date: Fri, 1 Aug 2025 22:06:16 -0500 Subject: [PATCH 3/8] Created AppViewModel Created AppViewModel to handle System Tray Icon, and Tooltip. --- FreeTubeSyncer/Models/AppViewModel.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/FreeTubeSyncer/Models/AppViewModel.cs b/FreeTubeSyncer/Models/AppViewModel.cs index bad9266..bed3056 100644 --- a/FreeTubeSyncer/Models/AppViewModel.cs +++ b/FreeTubeSyncer/Models/AppViewModel.cs @@ -1,6 +1,10 @@ +using Avalonia.Controls; +using CommunityToolkit.Mvvm.ComponentModel; + namespace FreeTubeSyncer.Models; -public class AppViewModel +public partial class AppViewModel : ObservableObject { - + [ObservableProperty] private WindowIcon? _appIcon; + [ObservableProperty] private string _hintTooltip = "FreeTube Syncer"; } \ No newline at end of file From 14fae4b2468b558fcebaf92adf36c557bd1957fd Mon Sep 17 00:00:00 2001 From: Mario Steele Date: Fri, 1 Aug 2025 22:06:45 -0500 Subject: [PATCH 4/8] Updated Syncer Removed un-nesscary Close() as using should automatically close, and dispose of the file handler. Added a 100ms wait after we finish writing the file, before we unlock the watcher, so we don't generate un-nesscary events. --- FreeTubeSyncer/REST/Syncer.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/FreeTubeSyncer/REST/Syncer.cs b/FreeTubeSyncer/REST/Syncer.cs index b92c4ed..0726331 100644 --- a/FreeTubeSyncer/REST/Syncer.cs +++ b/FreeTubeSyncer/REST/Syncer.cs @@ -218,8 +218,9 @@ public class Syncer : ISyncer where T : class, IDataModel, new() foreach (var line in json) fh.Write(Encoding.UTF8.GetBytes(line + "\n")); fh.Flush(); - fh.Close(); } + + Task.Delay(100).Wait(); _watcher.Locked = false; Log.Information("Updated {DbName}, completed in {TimeSpan}", _dbName, DateTime.Now - start); _isDirty = false; From 358539bfd535b275409c51635bb6091df59c3e8e Mon Sep 17 00:00:00 2001 From: Mario Steele Date: Fri, 1 Aug 2025 22:08:32 -0500 Subject: [PATCH 5/8] Updated App.axaml Added Models to XML Namespace. Set DataType to be AppViewModel Changed from static tooltip and icon, to using Bindings. --- FreeTubeSyncer/App.axaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/FreeTubeSyncer/App.axaml b/FreeTubeSyncer/App.axaml index 8c9d9af..d527e69 100644 --- a/FreeTubeSyncer/App.axaml +++ b/FreeTubeSyncer/App.axaml @@ -1,7 +1,9 @@ @@ -11,8 +13,8 @@ - From 480474c34353dd586bd664a3f68936a85acc8317 Mon Sep 17 00:00:00 2001 From: Mario Steele Date: Fri, 1 Aug 2025 22:09:46 -0500 Subject: [PATCH 6/8] Updated App.axaml.cs Added fields for Normal icon, Waiting to Sync Icon, and Syncing Complete icons to let user know of changes in the state of the Syncer. Added function to ensure that we are changing the Icon and Tooltip on the UI Thread, instead of some other thread. Updated SyncMonitor to check for any dirty syncers, and if so, we update our SysTray icon. Added update to show we are syncing the data (Tooltip only) Added update to show we have compeleted sync. Added timer for 3 seconds before resetting SysTray and tooltip back to normal status. --- FreeTubeSyncer/App.axaml.cs | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/FreeTubeSyncer/App.axaml.cs b/FreeTubeSyncer/App.axaml.cs index 4f96b59..bbfd8ac 100644 --- a/FreeTubeSyncer/App.axaml.cs +++ b/FreeTubeSyncer/App.axaml.cs @@ -8,8 +8,11 @@ using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Avalonia; +using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; +using Avalonia.Platform; +using Avalonia.Threading; using FreeTubeSyncer.Library; using FreeTubeSyncer.Models; using FreeTubeSyncer.Models.DatabaseModels; @@ -39,13 +42,23 @@ public partial class App : Application private TimeSpan _checkInterval; private DateTime _lastUpdated; + private WindowIcon? _normalTrayIcon; + private WindowIcon? _waitingTrayIcon; + private WindowIcon? _completeTrayIcon; + public event EventHandler? SettingsChanged; public static App GetApp() => (App)App.Current!; public static ClassicDesktopStyleApplicationLifetime GetDesktop() => (ClassicDesktopStyleApplicationLifetime)App.Current!.ApplicationLifetime!; public override void Initialize() { + _normalTrayIcon = new WindowIcon(AssetLoader.Open(new Uri("avares://FreeTubeSyncer/Assets/freetubesyncer.64.png"))); + _waitingTrayIcon = new WindowIcon(AssetLoader.Open(new Uri("avares://FreeTubeSyncer/Assets/awaiting_sync.png"))); + _completeTrayIcon = new WindowIcon(AssetLoader.Open(new Uri("avares://FreeTubeSyncer/Assets/sync_complete.png"))); + var vm = new AppViewModel(); + vm.AppIcon = _normalTrayIcon; AvaloniaXamlLoader.Load(this); + DataContext = vm; } public override void OnFrameworkInitializationCompleted() @@ -159,6 +172,18 @@ public partial class App : Application Log.Information("Log Started."); } + private async Task UpdateSTIconHint(WindowIcon icon, string? hint = null) + { + await Dispatcher.UIThread.InvokeAsync(async () => + { + await _semaphoreSlim.WaitAsync(); + ((AppViewModel)DataContext!).AppIcon = icon; + if (hint != null) ((AppViewModel)DataContext).HintTooltip = hint; + _semaphoreSlim.Release(); + + }); + } + private async Task SyncMonitor() { Log.Information("Sync Monitor Starting Up."); @@ -191,6 +216,11 @@ public partial class App : Application while (_isRunning) { await Task.Delay(100); + + if (_syncers.Any(x => x.IsDirty())) + { + await UpdateSTIconHint(_waitingTrayIcon!, "FreeTube Syncer - Changes waiting to be written..."); + } var sinceLastCheck = DateTime.Now - lastCheck; if (sinceLastCheck.TotalSeconds > _checkInterval.TotalSeconds) @@ -219,6 +249,7 @@ public partial class App : Application if (procs.Length > 0) continue; Log.Information("FreeTube instance closed, and we have writes to make..."); await Task.Delay(1500); + await UpdateSTIconHint(_waitingTrayIcon, "FreeTube Syncer - Syncing data..."); await _semaphoreSlim.WaitAsync(); var syncStart = DateTime.Now; @@ -227,6 +258,12 @@ public partial class App : Application var syncEnd = DateTime.Now - syncStart; _semaphoreSlim.Release(); Log.Information("Sync Completed. Total Time: {EndTime}", syncEnd); + await UpdateSTIconHint(_completeTrayIcon, "FreeTube Syncer - Sync completed."); + Task.Run(async () => + { + await Task.Delay(3000); + await UpdateSTIconHint(_normalTrayIcon, "FreeTube Syncer - Watching files..."); + }); } Log.Information("Filesystem Sync Monitor shutdown."); From 7ad03d2c17b85feaeafbf9714c19e98ee26450ca Mon Sep 17 00:00:00 2001 From: Mario Steele Date: Fri, 1 Aug 2025 22:14:01 -0500 Subject: [PATCH 7/8] Updated CSProj Updated Assets from using old AvaloniaXaml tag, to using AvaloniaResource tag. Added awaiting and complete icons. --- FreeTubeSyncer/FreeTubeSyncer.csproj | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/FreeTubeSyncer/FreeTubeSyncer.csproj b/FreeTubeSyncer/FreeTubeSyncer.csproj index 44fce9e..e8c435a 100644 --- a/FreeTubeSyncer/FreeTubeSyncer.csproj +++ b/FreeTubeSyncer/FreeTubeSyncer.csproj @@ -34,7 +34,8 @@ - - + + + From 7cf24025b697e770aedb30e5b4be07f3e31db811 Mon Sep 17 00:00:00 2001 From: Mario Steele Date: Fri, 1 Aug 2025 22:14:17 -0500 Subject: [PATCH 8/8] Updated MainWindow.axaml Set the icon to the default program icon. --- FreeTubeSyncer/MainWindow.axaml | 1 + 1 file changed, 1 insertion(+) diff --git a/FreeTubeSyncer/MainWindow.axaml b/FreeTubeSyncer/MainWindow.axaml index 9377531..8ee3fa1 100644 --- a/FreeTubeSyncer/MainWindow.axaml +++ b/FreeTubeSyncer/MainWindow.axaml @@ -8,6 +8,7 @@ Width="400" Height="345" x:Class="FreeTubeSyncer.MainWindow" x:DataType="vm:AppSettings" + Icon="/Assets/freetubesyncer.64.png" BackgroundStyle="GradientDarker" CanResize="False" CanMaximize="False"