Skip to content
This repository was archived by the owner on Jun 28, 2026. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 33 additions & 35 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -4,47 +4,45 @@
</PropertyGroup>
<ItemGroup>
<!-- Launcher-loader shared stuff -->
<PackageVersion Include="Microsoft.Data.Sqlite.Core" Version="7.0.4" />
<PackageVersion Include="SQLitePCLRaw.bundle_e_sqlite3" Version="2.1.4" Condition="'$(UseSystemSqlite)' != 'True'" />
<PackageVersion Include="SQLitePCLRaw.provider.sqlite3" Version="2.1.4" Condition="'$(UseSystemSqlite)' == 'True'" />
<PackageVersion Include="NSec.Cryptography" Version="25.4.0"/>
<PackageVersion Include="SharpZstd.Interop" Version="1.5.2-beta2"/>
<PackageVersion Include="JetBrains.Annotations" Version="2023.2.0-eap3" />
<PackageVersion Include="Microsoft.NET.ILLink.Tasks" Version="8.0.0" />
<PackageVersion Include="Microsoft.Data.Sqlite.Core" Version="10.0.9" />
<PackageVersion Include="SQLitePCLRaw.bundle_e_sqlite3" Version="3.0.3" Condition="'$(UseSystemSqlite)' != 'True'" />
<PackageVersion Include="SQLitePCLRaw.provider.sqlite3" Version="3.0.3" Condition="'$(UseSystemSqlite)' == 'True'" />
<PackageVersion Include="NSec.Cryptography" Version="26.4.0" />
<PackageVersion Include="SharpZstd.Interop" Version="1.5.2-beta2" /> <!-- Seems like 1.5.6 is broken? Leaving for now. dotnet11 includes Zstd! -->
<PackageVersion Include="JetBrains.Annotations" Version="2026.2.0" />
<PackageVersion Include="Microsoft.NET.ILLink.Tasks" Version="10.0.9" />
<PackageVersion Include="Robust.Natives.Zstd" Version="0.1.1-zstd1.5.7"/>
<!-- Loader -->
<PackageVersion Include="Robust.Natives" Version="0.2.3"/>
<!-- Launcher -->
<PackageVersion Include="Avalonia" Version="11.2.4"/>
<PackageVersion Include="Avalonia.Desktop" Version="11.2.4"/>
<PackageVersion Include="Avalonia.ReactiveUI" Version="11.2.4"/>
<PackageVersion Include="Avalonia.Diagnostics" Version="11.2.4"/>
<PackageVersion Include="Avalonia.Themes.Simple" Version="11.2.4"/>
<PackageVersion Include="CodeHollow.FeedReader" Version="1.2.6"/>
<PackageVersion Include="Dapper" Version="2.0.123"/>
<PackageVersion Include="DynamicData" Version="8.4.1"/>
<PackageVersion Include="Microsoft.Toolkit.Mvvm" Version="7.1.2"/>
<PackageVersion Include="ReactiveUI" Version="20.1.1"/>
<PackageVersion Include="ReactiveUI.Fody" Version="18.4.26"/>
<PackageVersion Include="Robust.Shared.AuthLib" Version="0.1.2"/>
<PackageVersion Include="Serilog" Version="2.12.0"/>
<PackageVersion Include="Serilog.Sinks.Console" Version="4.1.0"/>
<PackageVersion Include="Serilog.Sinks.File" Version="5.0.0"/>
<PackageVersion Include="YamlDotNet" Version="13.0.2"/>
<PackageVersion Include="TerraFX.Interop.Windows" Version="10.0.26100.2"/>
<PackageVersion Include="Mono.Posix.NETStandard" Version="1.0.0"/>
<PackageVersion Include="SpaceWizards.Sodium" Version="0.2.1"/>
<PackageVersion Include="libsodium" Version="1.0.20.1" />
<PackageVersion Include="System.Net.Http.WinHttpHandler" Version="8.0.0" />
<PackageVersion Include="Linguini.Bundle" Version="0.8.1" />
<PackageVersion Include="Avalonia" Version="12.0.4" />
<PackageVersion Include="Avalonia.Desktop" Version="12.0.4" />
<PackageVersion Include="Avalonia.Themes.Simple" Version="12.0.4" />
<PackageVersion Include="CodeHollow.FeedReader" Version="1.2.6" />
<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.2" />
<PackageVersion Include="Dapper" Version="2.1.79" />
<PackageVersion Include="DynamicData" Version="9.4.31"/>
<PackageVersion Include="ReactiveUI" Version="23.2.28" />
<PackageVersion Include="ReactiveUI.Avalonia" Version="12.0.3" />
<PackageVersion Include="ReactiveUI.SourceGenerators" Version="3.1.0" />
<PackageVersion Include="Robust.Shared.AuthLib" Version="0.1.2" />
<PackageVersion Include="Serilog" Version="4.3.1" />
<PackageVersion Include="Serilog.Sinks.Console" Version="6.1.1" />
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
<PackageVersion Include="YamlDotNet" Version="18.0.0" />
<PackageVersion Include="TerraFX.Interop.Windows" Version="10.0.26100.6" />
<PackageVersion Include="SpaceWizards.Sodium" Version="0.3.0" />
<PackageVersion Include="libsodium" Version="1.0.22" />
<PackageVersion Include="System.Net.Http.WinHttpHandler" Version="10.0.9" />
<PackageVersion Include="Linguini.Bundle" Version="0.11.0" />
<!-- Test stuff -->
<PackageVersion Include="nunit" Version="3.13.3"/>
<PackageVersion Include="NUnit.Analyzers" Version="3.6.1"/>
<PackageVersion Include="NUnit3TestAdapter" Version="4.4.2"/>
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.5.0"/>
<PackageVersion Include="nunit" Version="3.13.3" />
<PackageVersion Include="NUnit.Analyzers" Version="3.6.1" />
<PackageVersion Include="NUnit3TestAdapter" Version="4.4.2" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
<!-- Bootstrap -->
<PackageVersion Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3"/>
<PackageVersion Include="Microsoft.NETFramework.ReferenceAssemblies" Version="1.0.3" />
<!-- Development -->
<PackageVersion Include="HotAvalonia" Version="3.0.0" />
<PackageVersion Include="HotAvalonia" Version="3.1.1" />
</ItemGroup>
</Project>
3 changes: 0 additions & 3 deletions SS14.Launcher/FodyWeavers.xml

This file was deleted.

6 changes: 1 addition & 5 deletions SS14.Launcher/Helpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Mono.Unix;
using Serilog;
using TerraFX.Interop.Windows;
using Win = TerraFX.Interop.Windows.Windows;
Expand Down Expand Up @@ -189,10 +188,7 @@ public static unsafe void MarkDirectoryCompress(string path)

public static void ChmodPlusX(string path)
{
var f = new UnixFileInfo(path);
f.FileAccessPermissions |=
FileAccessPermissions.UserExecute | FileAccessPermissions.GroupExecute |
FileAccessPermissions.OtherExecute;
File.SetUnixFileMode(path, UnixFileMode.UserExecute | UnixFileMode.UserRead | UnixFileMode.UserWrite);
}
public static unsafe int MessageBoxHelper(string text, string caption, uint type)
{
Expand Down
2 changes: 1 addition & 1 deletion SS14.Launcher/Localization/LocalizationManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ private void AddLanguageFiles(FluentBundle bundle, CultureInfo culture)
{
using var asset = AssetLoader.Open(ftl);
using var reader = new StreamReader(asset, Encoding.UTF8);
var resource = new LinguiniParser(reader).Parse();
var resource = LinguiniParser.FromTextReader(reader, location).Parse();
foreach (var resourceError in resource.Errors)
{
Log.Error("Error in loc {LocFile}: {Error}", ftl, resourceError);
Expand Down
2 changes: 1 addition & 1 deletion SS14.Launcher/Models/Data/DataManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
using DynamicData;
using JetBrains.Annotations;
using Microsoft.Data.Sqlite;
using Microsoft.Toolkit.Mvvm.Messaging;
using CommunityToolkit.Mvvm.Messaging;
using ReactiveUI;
using Serilog;
using SS14.Launcher.Utility;
Expand Down
2 changes: 1 addition & 1 deletion SS14.Launcher/Models/Data/LoginInfo.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
using System;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using ReactiveUI.SourceGenerators;

namespace SS14.Launcher.Models.Data;

public class LoginInfo : ReactiveObject
{
[Reactive]
public Guid UserId { get; set; }

Check warning on line 10 in SS14.Launcher/Models/Data/LoginInfo.cs

View workflow job for this annotation

GitHub Actions / build

`[Reactive]` requires the property to be `partial` and the containing type to be partial so source generation can run (https://www.reactiveui.net/docs/handbook/view-models/boilerplate-code.html)
[Reactive]
public string Username { get; set; } = default!;

Check warning on line 12 in SS14.Launcher/Models/Data/LoginInfo.cs

View workflow job for this annotation

GitHub Actions / build

`[Reactive]` requires the property to be `partial` and the containing type to be partial so source generation can run (https://www.reactiveui.net/docs/handbook/view-models/boilerplate-code.html)
[Reactive]
public LoginToken Token { get; set; }

Expand Down
2 changes: 1 addition & 1 deletion SS14.Launcher/Models/ServerStatus/ServerListCache.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
using Splat;
using SS14.Launcher.Utility;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using ReactiveUI.SourceGenerators;
using SS14.Launcher.Api;
using SS14.Launcher.Models.Data;
using static SS14.Launcher.Api.HubApi;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System;
using System.Threading;
using Microsoft.Toolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.ComponentModel;

namespace SS14.Launcher.Models.ServerStatus;

Expand Down
2 changes: 1 addition & 1 deletion SS14.Launcher/Models/Updater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
using Dapper;
using Microsoft.Data.Sqlite;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using ReactiveUI.SourceGenerators;
using Serilog;
using Splat;
using SS14.Launcher.Models.ContentManagement;
Expand Down
7 changes: 5 additions & 2 deletions SS14.Launcher/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
using Avalonia;
using Avalonia.Logging;
using Avalonia.Media;
using Avalonia.ReactiveUI;
using ReactiveUI.Avalonia;
using Microsoft.Win32;
using Serilog;
using Serilog.Sinks.SystemConsole.Themes;
Expand Down Expand Up @@ -246,7 +246,10 @@ private static AppBuilder BuildAvaloniaApp(DataManager cfg)
// Necessary workaround for #84 on Linux
DefaultFamilyName = "avares://SS14.Launcher/Assets/Fonts/noto_sans/*.ttf#Noto Sans"
})
.UseReactiveUI();
.UseReactiveUI(rxui =>
{
// Optional: add custom registration here via rxui.WithRegistration(...)
});
}

private static void CheckLauncherArchitecture(DataManager cfg, EngineManagerDynamic engineManager)
Expand Down
8 changes: 3 additions & 5 deletions SS14.Launcher/SS14.Launcher.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -40,27 +40,25 @@
<ItemGroup>
<PackageReference Include="Avalonia" />
<PackageReference Include="Avalonia.Desktop" />
<PackageReference Include="Avalonia.ReactiveUI" />
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" />
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="HotAvalonia" PrivateAssets="All" />
<PackageReference Include="Avalonia.Themes.Simple" />
<PackageReference Include="CodeHollow.FeedReader" />
<PackageReference Include="CommunityToolkit.Mvvm" />
<PackageReference Include="Dapper" />
<PackageReference Include="DynamicData" />
<PackageReference Include="Microsoft.Data.Sqlite.Core" />
<PackageReference Include="SQLitePCLRaw.provider.sqlite3" Condition="'$(UseSystemSqlite)' == 'True'" />
<PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Condition="'$(UseSystemSqlite)' != 'True'" />
<PackageReference Include="Microsoft.Toolkit.Mvvm" />
<PackageReference Include="ReactiveUI" />
<PackageReference Include="ReactiveUI.Fody" />
<PackageReference Include="ReactiveUI.Avalonia" />
<PackageReference Include="ReactiveUI.SourceGenerators" />
<PackageReference Include="Robust.Shared.AuthLib" />
<PackageReference Include="Serilog" />
<PackageReference Include="Serilog.Sinks.Console" />
<PackageReference Include="Serilog.Sinks.File" />
<PackageReference Include="YamlDotNet" />
<PackageReference Include="TerraFX.Interop.Windows" />
<PackageReference Include="NSec.Cryptography" />
<PackageReference Include="Mono.Posix.NETStandard" />
<PackageReference Include="SharpZstd.Interop" ExcludeAssets="native" />
<PackageReference Include="Robust.Natives.Zstd" />
<PackageReference Include="SpaceWizards.Sodium" />
Expand Down
4 changes: 2 additions & 2 deletions SS14.Launcher/Utility/DynamicDataExt.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
public static class DynamicDataExt
{
public static bool TryLookup<TValue, TKey>(
this IObservableCache<TValue, TKey> cache,

Check warning on line 9 in SS14.Launcher/Utility/DynamicDataExt.cs

View workflow job for this annotation

GitHub Actions / build

The type 'TValue' cannot be used as type parameter 'TObject' in the generic type or method 'IObservableCache<TObject, TKey>'. Nullability of type argument 'TValue' doesn't match 'notnull' constraint.
TKey key,
[MaybeNullWhen(false)] out TValue value)
[NotNullWhen(false)] out TValue value)
where TKey : notnull
{
var option = cache.Lookup(key);
Expand All @@ -18,14 +18,14 @@
return true;
}

value = default;

Check warning on line 21 in SS14.Launcher/Utility/DynamicDataExt.cs

View workflow job for this annotation

GitHub Actions / build

Possible null reference assignment.
return false;

Check warning on line 22 in SS14.Launcher/Utility/DynamicDataExt.cs

View workflow job for this annotation

GitHub Actions / build

Parameter 'value' must have a non-null value when exiting with 'false'.
}

public static bool TryLookup<TValue, TKey>(
this SourceCache<TValue, TKey> cache,

Check warning on line 26 in SS14.Launcher/Utility/DynamicDataExt.cs

View workflow job for this annotation

GitHub Actions / build

The type 'TValue' cannot be used as type parameter 'TObject' in the generic type or method 'SourceCache<TObject, TKey>'. Nullability of type argument 'TValue' doesn't match 'notnull' constraint.
TKey key,
[MaybeNullWhen(false)] out TValue value)
[NotNullWhen(false)] out TValue value)
where TKey : notnull
{
var option = cache.Lookup(key);
Expand All @@ -35,7 +35,7 @@
return true;
}

value = default;

Check warning on line 38 in SS14.Launcher/Utility/DynamicDataExt.cs

View workflow job for this annotation

GitHub Actions / build

Possible null reference assignment.
return false;

Check warning on line 39 in SS14.Launcher/Utility/DynamicDataExt.cs

View workflow job for this annotation

GitHub Actions / build

Parameter 'value' must have a non-null value when exiting with 'false'.
}
}
4 changes: 2 additions & 2 deletions SS14.Launcher/ViewModels/AccountDropDownViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
using DynamicData;
using JetBrains.Annotations;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using ReactiveUI.SourceGenerators;
using Serilog;
using Splat;
using SS14.Launcher.Api;
Expand Down Expand Up @@ -133,6 +133,6 @@ public AvailableAccountViewModel(LoggedInAccount account)
AccountLoginStatus.Expired => $"{p.Item2} (!)",
_ => $"{p.Item2} (?)"
})
.ToPropertyEx(this, x => x.StatusText);
.ToProperty(this, x => x.StatusText);
}
}
12 changes: 6 additions & 6 deletions SS14.Launcher/ViewModels/ConnectingViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public ConnectingViewModel(Connector connector, MainWindowViewModel windowVm, st
_reasonSuffix = (givenReason != null) ? ("\n" + givenReason) : "";

this.WhenAnyValue(x => x._updater.Progress)
.ObserveOn(RxApp.MainThreadScheduler)
.ObserveOn(RxSchedulers.MainThreadScheduler)
.Subscribe(progress =>
{
_updaterProgress = progress;
Expand All @@ -56,7 +56,7 @@ public ConnectingViewModel(Connector connector, MainWindowViewModel windowVm, st
});

this.WhenAnyValue(x => x._updater.Speed)
.ObserveOn(RxApp.MainThreadScheduler)
.ObserveOn(RxSchedulers.MainThreadScheduler)
.Subscribe(speed =>
{
_updaterSpeed = speed;
Expand All @@ -66,15 +66,15 @@ public ConnectingViewModel(Connector connector, MainWindowViewModel windowVm, st
});

this.WhenAnyValue(x => x._updater.Status)
.ObserveOn(RxApp.MainThreadScheduler)
.ObserveOn(RxSchedulers.MainThreadScheduler)
.Subscribe(status =>
{
_updaterStatus = status;
this.RaisePropertyChanged(nameof(StatusText));
});

this.WhenAnyValue(x => x._connector.Status)
.ObserveOn(RxApp.MainThreadScheduler)
.ObserveOn(RxSchedulers.MainThreadScheduler)
.Subscribe(val =>
{
_connectorStatus = val;
Expand All @@ -94,14 +94,14 @@ public ConnectingViewModel(Connector connector, MainWindowViewModel windowVm, st
});

this.WhenAnyValue(x => x._connector.PrivacyPolicyDifferentVersion)
.ObserveOn(RxApp.MainThreadScheduler)
.ObserveOn(RxSchedulers.MainThreadScheduler)
.Subscribe(_ =>
{
this.RaisePropertyChanged(nameof(PrivacyPolicyText));
});

this.WhenAnyValue(x => x._connector.ClientExitedBadly)
.ObserveOn(RxApp.MainThreadScheduler)
.ObserveOn(RxSchedulers.MainThreadScheduler)
.Subscribe(_ =>
{
this.RaisePropertyChanged(nameof(StatusText));
Expand Down
2 changes: 1 addition & 1 deletion SS14.Launcher/ViewModels/LanguageSelectorViewModel.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System;
using System.Globalization;
using System.Linq;
using Microsoft.Toolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.ComponentModel;
using Splat;
using SS14.Launcher.Localization;
using SS14.Launcher.Models.Data;
Expand Down
2 changes: 1 addition & 1 deletion SS14.Launcher/ViewModels/Login/AuthTfaViewModel.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using ReactiveUI.SourceGenerators;
using SS14.Launcher.Api;
using SS14.Launcher.Models.Data;
using SS14.Launcher.Models.Logins;
Expand Down
2 changes: 1 addition & 1 deletion SS14.Launcher/ViewModels/Login/BaseLoginViewModel.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using ReactiveUI.Fody.Helpers;
using ReactiveUI.SourceGenerators;

namespace SS14.Launcher.ViewModels.Login;

Expand Down
2 changes: 1 addition & 1 deletion SS14.Launcher/ViewModels/Login/ExpiredLoginViewModel.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using ReactiveUI.Fody.Helpers;
using ReactiveUI.SourceGenerators;
using SS14.Launcher.Api;
using SS14.Launcher.Models.Data;
using SS14.Launcher.Models.Logins;
Expand Down
2 changes: 1 addition & 1 deletion SS14.Launcher/ViewModels/Login/ForgotPasswordViewModel.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using ReactiveUI.Fody.Helpers;
using ReactiveUI.SourceGenerators;
using SS14.Launcher.Api;
using SS14.Launcher.Localization;

Expand Down
2 changes: 1 addition & 1 deletion SS14.Launcher/ViewModels/Login/LoginViewModel.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System;
using System.Threading.Tasks;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using ReactiveUI.SourceGenerators;
using SS14.Launcher.Api;
using SS14.Launcher.Localization;
using SS14.Launcher.Models.Data;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using System;
using Avalonia.Threading;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using ReactiveUI.SourceGenerators;
using SS14.Launcher.Api;
using SS14.Launcher.Localization;
using SS14.Launcher.Models.Data;
Expand Down
2 changes: 1 addition & 1 deletion SS14.Launcher/ViewModels/Login/RegisterViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
using System.Diagnostics;
using System.Net.Mail;
using ReactiveUI;
using ReactiveUI.Fody.Helpers;
using ReactiveUI.SourceGenerators;
using Robust.Shared.AuthLib;
using SS14.Launcher.Api;
using SS14.Launcher.Models.Data;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using ReactiveUI.Fody.Helpers;
using ReactiveUI.SourceGenerators;
using SS14.Launcher.Api;

namespace SS14.Launcher.ViewModels.Login;
Expand Down
4 changes: 2 additions & 2 deletions SS14.Launcher/ViewModels/MainWindowTabs/HomePageViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
using Avalonia.VisualTree;
using DynamicData;
using DynamicData.Alias;
using ReactiveUI.Fody.Helpers;
using ReactiveUI.SourceGenerators;
using Splat;
using SS14.Launcher.Localization;
using SS14.Launcher.Models.Data;
Expand All @@ -30,7 +30,7 @@
_cfg = Locator.Current.GetRequiredService<DataManager>();
_serverListCache = Locator.Current.GetRequiredService<ServerListCache>();

_cfg.FavoriteServers

Check warning on line 33 in SS14.Launcher/ViewModels/MainWindowTabs/HomePageViewModel.cs

View workflow job for this annotation

GitHub Actions / build

'ObservableCacheEx.Sort<TObject, TKey>(IObservable<IChangeSet<TObject, TKey>>, IComparer<TObject>, SortOptimisations, int)' is obsolete: 'Use SortAndBind as it's more efficient'
.Connect()
.Select(x => new ServerEntryViewModel(MainWindowViewModel, _statusCache.GetStatusFor(x.Address), x, _statusCache, _cfg) { ViewedInFavoritesPane = true })
.OnItemAdded(a =>
Expand Down Expand Up @@ -104,7 +104,7 @@

private bool TryGetWindow([NotNullWhen(true)] out Window? window)
{
window = Control?.GetVisualRoot() as Window;
window = Control?.GetPresentationSource()?.RootVisual as Window;
return window != null;
}

Expand Down
Loading
Loading