Skip to content
Merged
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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ The following is on my roadmap for future updates:

### Prerequisites

OpenTracker is a .NET 8.0 application. You will be required to install a .NET runtime version 8.0 or greater. You can find it at this link: https://dotnet.microsoft.com/download/dotnet
OpenTracker is a .NET 10.0 application. You will be required to install a .NET runtime version 10.0 or greater. You can find it at this link: https://dotnet.microsoft.com/download/dotnet

### Windows

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
using System;
using System.Collections.Generic;
using System.Threading;
using Newtonsoft.Json;
using OpenTracker.Models.AutoTracking.SNESConnectors.Socket;
using OpenTracker.Models.Exceptions;
using OpenTracker.Models.Logging;
using LogLevel = OpenTracker.Models.Logging.LogLevel;

namespace OpenTracker.Models.AutoTracking.SNESConnectors.Requests
{
Expand Down Expand Up @@ -34,8 +33,7 @@ public override IEnumerable<string> ProcessResponseAndReturnResults(IMessageEven

if (!deserialized!.TryGetValue("Results", out var results))
{
throw new Exception(
$"Request \'{Description}\' is invalid and does not contain a \'Results\' key.");
throw new InvalidRequestResponseException(Description, "Results");
}

Logger.Debug("Request \'{Description}\' response successfully deserialized",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
using System.Threading;
using Newtonsoft.Json;
using OpenTracker.Models.AutoTracking.SNESConnectors.Socket;
using OpenTracker.Models.Exceptions;
using OpenTracker.Models.Logging;
using LogLevel = OpenTracker.Models.Logging.LogLevel;

namespace OpenTracker.Models.AutoTracking.SNESConnectors.Requests
{
Expand Down Expand Up @@ -34,8 +34,7 @@ public override IEnumerable<string> ProcessResponseAndReturnResults(IMessageEven

if (!deserialized!.TryGetValue("Results", out var results))
{
throw new Exception(
$"Request \'{Description}\' is invalid and does not contain a \'Results\' key.");
throw new InvalidRequestResponseException(Description, "Results");
}

Logger.Debug("Request \'{Description}\' response successfully deserialized",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
using System.Threading;
using OpenTracker.Models.AutoTracking.SNESConnectors.Socket;
using OpenTracker.Models.Logging;
using WebSocketSharp;

namespace OpenTracker.Models.AutoTracking.SNESConnectors.Requests
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
using Newtonsoft.Json;
using OpenTracker.Models.AutoTracking.SNESConnectors.Socket;
using OpenTracker.Models.Logging;
using LogLevel = OpenTracker.Models.Logging.LogLevel;

namespace OpenTracker.Models.AutoTracking.SNESConnectors.Requests
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System;

namespace OpenTracker.Models.Exceptions;

public class InvalidRequestResponseException : Exception
{
public string RequestDescription { get; }
public string MissingKey { get; }

public InvalidRequestResponseException(string requestDescription, string missingKey)
: base($"Request '{requestDescription}' is invalid and does not contain a '{missingKey}' key.")
{
RequestDescription = requestDescription;
MissingKey = missingKey;
}
}
10 changes: 5 additions & 5 deletions src/OpenTracker.Models/OpenTracker.Models.csproj
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<Version>1.8.7</Version>
<LangVersion>latest</LangVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="9.0.0">
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="10.0.100">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="ReactiveUI.Fody" Version="19.4.1" />
<PackageReference Include="Serilog.Sinks.Debug" Version="2.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="ReactiveUI.Fody" Version="19.5.41" />
<PackageReference Include="Serilog.Sinks.Debug" Version="3.0.0" />
<PackageReference Include="WebSocketSharp-netstandard" Version="1.0.1" />
</ItemGroup>

Expand Down
20 changes: 10 additions & 10 deletions src/OpenTracker.Utils/OpenTracker.Utils.csproj
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<Version>1.8.5</Version>
<LangVersion>latest</LangVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Autofac" Version="7.1.0" />
<PackageReference Include="Avalonia" Version="0.10.22" />
<PackageReference Include="Avalonia.Markup.Xaml.Loader" Version="0.10.22" />
<PackageReference Include="Avalonia.ReactiveUI" Version="0.10.22" />
<PackageReference Include="JetBrains.Annotations" Version="2023.2.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="ReactiveUI.Fody" Version="19.4.1" />
<PackageReference Include="Serilog" Version="3.0.1" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Autofac" Version="8.4.0" />
<PackageReference Include="Avalonia" Version="11.3.8" />
<PackageReference Include="Avalonia.Markup.Xaml.Loader" Version="11.3.8" />
<PackageReference Include="Avalonia.ReactiveUI" Version="11.3.8" />
<PackageReference Include="JetBrains.Annotations" Version="2025.2.2" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="ReactiveUI.Fody" Version="19.5.41" />
<PackageReference Include="Serilog" Version="4.3.0" />
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
</ItemGroup>

</Project>
7 changes: 5 additions & 2 deletions src/OpenTracker.Utils/ViewLocator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,11 @@ public class ViewLocator : IDataTemplate
public static bool SupportsRecycling =>
false;

public IControl Build(object data)
public Control? Build(object? data)
{
if (data == null)
return null;

var assembly = Assembly.GetEntryAssembly() ??
throw new NullReferenceException();
var viewTypes = assembly.GetTypes();
Expand All @@ -29,7 +32,7 @@ public IControl Build(object data)
}
}

public bool Match(object data)
public bool Match(object? data)
{
return data is ViewModelBase;
}
Expand Down
5 changes: 2 additions & 3 deletions src/OpenTracker/App.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,8 @@
</Application.DataTemplates>

<Application.Styles>

<StyleInclude Source="avares://Avalonia.Themes.Default/DefaultTheme.xaml" />
<StyleInclude Source="avares://ThemeEditor.Controls.ColorPicker/ColorPicker.axaml" />
<StyleInclude Source="avares://Avalonia.Themes.Fluent/FluentTheme.xaml" />
<StyleInclude Source="avares://Avalonia.Controls.ColorPicker/Themes/Fluent/Fluent.xaml" />

<Style Selector="Border.AutoTrackerLog">
<Setter Property="Background" Value="{DynamicResource ThemeAccentBrush}" />
Expand Down
8 changes: 4 additions & 4 deletions src/OpenTracker/App.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Logging;
using Avalonia.Markup.Xaml;
using OpenTracker.Models;
using OpenTracker.Models.SaveLoad;
using OpenTracker.Utils;
using OpenTracker.Utils.Themes;
Expand Down Expand Up @@ -53,8 +51,10 @@ private static void SetThemeToLastOrDefault(IThemeManager selector)

public override void Initialize()
{
Logger.Sink = new AvaloniaSerilogSink(
AppPath.AvaloniaLogFilePath, Serilog.Events.LogEventLevel.Warning);
// Note: Avalonia 11 logging integration
// Logger.Sink has been replaced with more modern logging patterns
// For now, we rely on LogToTrace() in Program.cs and Serilog for app-level logging
// If Avalonia-specific logging is needed, consider using a logging bridge

AvaloniaXamlLoader.Load(this);
}
Expand Down
39 changes: 22 additions & 17 deletions src/OpenTracker/Autofac/ContainerBuilderAvaloniaExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Autofac;
using Avalonia.ReactiveUI;
using Avalonia.Threading;
using ReactiveUI;
using Splat;
using Splat.Autofac;
Expand All @@ -13,20 +12,26 @@ namespace OpenTracker.Autofac;
public static class ContainerBuilderAvaloniaExtensions
{
public static ContainerBuilder ConfigureAvalonia(this ContainerBuilder builder)
{
var autofacResolver = builder.UseAutofacDependencyResolver();
builder.RegisterInstance(autofacResolver);
autofacResolver.InitializeReactiveUI();

RxApp.MainThreadScheduler = AvaloniaScheduler.Instance;

Locator.CurrentMutable.RegisterConstant(
new AvaloniaActivationForViewFetcher(),
typeof(IActivationForViewFetcher));
Locator.CurrentMutable.RegisterConstant(
new AutoDataTemplateBindingHook(),
typeof(IPropertyBindingHook));

return builder;
}
{
ConfigureAutofacResolver(builder);
ConfigureReactiveUIServices();
return builder;
}

private static void ConfigureAutofacResolver(ContainerBuilder builder)
{
var autofacResolver = builder.UseAutofacDependencyResolver();
builder.RegisterInstance(autofacResolver);
RxApp.MainThreadScheduler = AvaloniaScheduler.Instance;
}

private static void ConfigureReactiveUIServices()
{
Locator.CurrentMutable.RegisterConstant(
new AvaloniaActivationForViewFetcher(),
typeof(IActivationForViewFetcher));
Locator.CurrentMutable.RegisterConstant(
new AutoDataTemplateBindingHook(),
typeof(IPropertyBindingHook));
}
}
16 changes: 11 additions & 5 deletions src/OpenTracker/Models/AvaloniaSerilogSink.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public void Log(LogEventLevel level, string area, object? source, string message
/// </returns>
private static object? GetHierarchy(object? source)
{
if (source is not IControl visual)
if (source is not Control visual)
{
return source;
}
Expand All @@ -130,10 +130,16 @@ public void Log(LogEventLevel level, string area, object? source, string message

while (visual.Parent is not null)
{
visual = visual.Parent;
visualString = visual.ToString() ?? throw new NullReferenceException();

hierarchy.Insert(0, visualString);
if (visual.Parent is Control parentControl)
{
visual = parentControl;
visualString = visual.ToString() ?? throw new NullReferenceException();
hierarchy.Insert(0, visualString);
}
else
{
break;
}
}

return string.Join("/", hierarchy);
Expand Down
59 changes: 31 additions & 28 deletions src/OpenTracker/OpenTracker.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<SelfContained>True</SelfContained>
<ApplicationIcon>triforce.ico</ApplicationIcon>
<Win32Resource />
Expand Down Expand Up @@ -36,43 +36,46 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="Autofac" Version="7.1.0" />
<PackageReference Include="Avalonia" Version="0.10.22" />
<PackageReference Include="Avalonia.Desktop" Version="0.10.22" />
<PackageReference Include="Avalonia.Diagnostics" Version="0.10.22" />
<PackageReference Include="Avalonia.ReactiveUI" Version="0.10.22" />
<PackageReference Include="Avalonia.Xaml.Behaviors" Version="0.10.22" />
<PackageReference Include="Autofac" Version="8.4.0" />
<PackageReference Include="Avalonia" Version="11.3.8" />
<PackageReference Include="Avalonia.Desktop" Version="11.3.8" />
<PackageReference Include="Avalonia.Diagnostics" Version="11.3.8" />
<PackageReference Include="Avalonia.Themes.Fluent" Version="11.3.8" />
<PackageReference Include="Avalonia.ReactiveUI" Version="11.3.8" />
<PackageReference Include="Avalonia.Xaml.Interactivity" Version="11.3.0.6" />
<PackageReference Include="Avalonia.Xaml.Interactions" Version="11.3.0.6" />
<PackageReference Include="Avalonia.Xaml.Interactions.DragAndDrop" Version="11.3.0.6" />
<PackageReference Include="Dotnet.Bundle" Version="0.9.13" />
<PackageReference Include="JetBrains.Annotations" Version="2023.2.0" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4">
<PackageReference Include="JetBrains.Annotations" Version="2025.2.2" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.7.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.7.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.7.0" />
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="9.0.0">
<PackageReference Include="Microsoft.CodeAnalysis.Common" Version="4.14.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.14.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.14.0" />
<PackageReference Include="Microsoft.CodeAnalysis.NetAnalyzers" Version="10.0.100">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.CodeAnalysis.Scripting.Common" Version="4.7.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="ReactiveMarbles.ObservableEvents.SourceGenerator" Version="1.2.3">
<PackageReference Include="Microsoft.CodeAnalysis.Scripting.Common" Version="4.14.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="ReactiveMarbles.ObservableEvents.SourceGenerator" Version="1.3.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="ReactiveProperty" Version="9.3.1" />
<PackageReference Include="ReactiveUI.Fody" Version="19.4.1" />
<PackageReference Include="Serilog" Version="3.0.1" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="SkiaSharp" Version="2.88.6" />
<PackageReference Include="SkiaSharp.NativeAssets.Linux" Version="2.88.6" />
<PackageReference Include="SkiaSharp.NativeAssets.macOS" Version="2.88.6" />
<PackageReference Include="SkiaSharp.NativeAssets.WebAssembly" Version="2.88.6" />
<PackageReference Include="SkiaSharp.NativeAssets.Win32" Version="2.88.6" />
<PackageReference Include="Splat.Autofac" Version="14.7.1" />
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />
<PackageReference Include="ThemeEditor.Controls.ColorPicker" Version="0.10.17" />
<PackageReference Include="ReactiveProperty" Version="9.8.0" />
<PackageReference Include="ReactiveUI.Fody" Version="19.5.41" />
<PackageReference Include="Serilog" Version="4.3.0" />
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
<PackageReference Include="SkiaSharp" Version="3.119.1" />
<PackageReference Include="SkiaSharp.NativeAssets.Linux" Version="3.119.1" />
<PackageReference Include="SkiaSharp.NativeAssets.macOS" Version="3.119.1" />
<PackageReference Include="SkiaSharp.NativeAssets.WebAssembly" Version="3.119.1" />
<PackageReference Include="SkiaSharp.NativeAssets.Win32" Version="3.119.1" />
<PackageReference Include="Splat.Autofac" Version="17.1.1" />
<PackageReference Include="System.Drawing.Common" Version="10.0.0" />
<PackageReference Include="Avalonia.Controls.ColorPicker" Version="11.3.8" />
<PackageReference Update="Packaging.Targets">
<Version>0.1.232</Version>
</PackageReference>
Expand Down
6 changes: 4 additions & 2 deletions src/OpenTracker/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ public static void Main(string[] args) =>

// Avalonia configuration, don't remove; also used by visual designer.
public static AppBuilder BuildAvaloniaApp() =>
AppBuilder.Configure<App>().UsePlatformDetect().LogToTrace().UseReactiveUI()
.With(new AvaloniaNativePlatformOptions { UseGpu = false });
AppBuilder.Configure<App>()
.UsePlatformDetect()
.LogToTrace()
.UseReactiveUI();
}
}
Loading