[GUI] Update image handling to use SvgImage for media logos

This commit is contained in:
2025-10-27 15:39:29 +00:00
parent d44b6d1909
commit f9aef60c66
5 changed files with 29 additions and 17 deletions

View File

@@ -27,9 +27,10 @@
<PackageReference Include="Humanizer.Core"/>
<PackageReference Include="JetBrains.Annotations"/>
<PackageReference Include="MessageBox.Avalonia"/>
<PackageReference Include="Sentry" />
<PackageReference Include="Sentry"/>
<PackageReference Include="Avalonia"/>
<PackageReference Include="Avalonia.Desktop"/>
<PackageReference Include="Svg.Controls.Avalonia"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Aaru.Core\Aaru.Core.csproj"/>

View File

@@ -33,7 +33,7 @@
using System.Collections.ObjectModel;
using Aaru.CommonTypes.Interfaces;
using Aaru.Gui.ViewModels.Panels;
using Avalonia.Media.Imaging;
using Avalonia.Media;
namespace Aaru.Gui.Models;
@@ -43,7 +43,7 @@ public sealed class ImageModel : RootModel
public string Path { get; set; }
public string FileName { get; set; }
public Bitmap Icon { get; set; }
public IImage Icon { get; set; }
public ObservableCollection<RootModel> PartitionSchemesOrFileSystems { get; }
public IMediaImage Image { get; set; }
public ImageInfoViewModel ViewModel { get; set; }

View File

@@ -51,8 +51,10 @@ using Aaru.Gui.Views.Windows;
using Aaru.Helpers;
using Aaru.Localization;
using Avalonia.Controls;
using Avalonia.Media;
using Avalonia.Media.Imaging;
using Avalonia.Platform;
using Avalonia.Svg;
using CommunityToolkit.Mvvm.Input;
using Humanizer;
using Humanizer.Bytes;
@@ -104,10 +106,13 @@ public sealed class ImageInfoViewModel : ViewModelBase
var genericFolderIcon =
new Bitmap(AssetLoader.Open(new Uri("avares://Aaru.Gui/Assets/Icons/oxygen/32x32/inode-directory.png")));
var mediaResource = new Uri($"avares://Aaru.Gui/Assets/Logos/Media/{imageFormat.Info.MediaType}.png");
var mediaResource = new Uri($"avares://Aaru.Gui/Assets/Logos/Media/{imageFormat.Info.MediaType}.svg");
MediaLogo = AssetLoader.Exists(mediaResource)
? new Bitmap(AssetLoader.Open(mediaResource))
? new SvgImage
{
Source = SvgSource.Load(AssetLoader.Open(mediaResource))
}
: imageFormat.Info.MetadataMediaType == MetadataMediaType.BlockMedia
? genericHddIcon
: imageFormat.Info.MetadataMediaType == MetadataMediaType.OpticalDisc
@@ -237,9 +242,8 @@ public sealed class ImageInfoViewModel : ViewModelBase
}
if(imageFormat.Info.ReadableMediaTags is { Count: > 0 })
{
foreach(MediaTagType tag in imageFormat.Info.ReadableMediaTags.Order()) MediaTagsList.Add(tag.Humanize());
}
foreach(MediaTagType tag in imageFormat.Info.ReadableMediaTags.Order())
MediaTagsList.Add(tag.Humanize());
if(imageFormat.Info.ReadableSectorTags is { Count: > 0 })
{
@@ -758,8 +762,9 @@ public sealed class ImageInfoViewModel : ViewModelBase
try
{
if(opticalMediaImage.Sessions is { Count: > 0 })
foreach(Session session in opticalMediaImage.Sessions)
Sessions.Add(session);
{
foreach(Session session in opticalMediaImage.Sessions) Sessions.Add(session);
}
}
catch(Exception ex)
{
@@ -769,8 +774,9 @@ public sealed class ImageInfoViewModel : ViewModelBase
try
{
if(opticalMediaImage.Tracks is { Count: > 0 })
foreach(Track track in opticalMediaImage.Tracks)
Tracks.Add(track);
{
foreach(Track track in opticalMediaImage.Tracks) Tracks.Add(track);
}
}
catch(Exception ex)
{
@@ -809,7 +815,7 @@ public sealed class ImageInfoViewModel : ViewModelBase
public XboxInfo XboxInfo { get; }
public PcmciaInfo PcmciaInfo { get; }
public SdMmcInfo SdMmcInfo { get; }
public Bitmap MediaLogo { get; }
public IImage MediaLogo { get; }
public string ImagePathText { get; }
public string FilterText { get; }
public string ImageIdentifiedText { get; }

View File

@@ -24,6 +24,7 @@ using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Media.Imaging;
using Avalonia.Platform;
using Avalonia.Platform.Storage;
using Avalonia.Svg;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using JetBrains.Annotations;
@@ -147,14 +148,14 @@ public partial class MainWindowViewModel : ViewModelBase
break;
case PartitionModel partitionModel:
ContentPanel = new Aaru.Gui.Views.Panels.Partition
ContentPanel = new Views.Panels.Partition
{
DataContext = partitionModel.ViewModel
};
break;
case FileSystemModel fileSystemModel:
ContentPanel = new Aaru.Gui.Views.Panels.FileSystem
ContentPanel = new Views.Panels.FileSystem
{
DataContext = fileSystemModel.ViewModel
};
@@ -239,13 +240,16 @@ public partial class MainWindowViewModel : ViewModelBase
}
// Create image model with appropriate icon based on media type
var mediaResource = new Uri($"avares://Aaru.Gui/Assets/Logos/Media/{imageFormat.Info.MediaType}.png");
var mediaResource = new Uri($"avares://Aaru.Gui/Assets/Logos/Media/{imageFormat.Info.MediaType}.svg");
var imageModel = new ImageModel
{
Path = result[0].Path.LocalPath,
Icon = AssetLoader.Exists(mediaResource)
? new Bitmap(AssetLoader.Open(mediaResource))
? new SvgImage
{
Source = SvgSource.Load(AssetLoader.Open(mediaResource))
}
: imageFormat.Info.MetadataMediaType == MetadataMediaType.BlockMedia
? _genericHddIcon
: imageFormat.Info.MetadataMediaType == MetadataMediaType.OpticalDisc

View File

@@ -55,6 +55,7 @@
<PackageVersion Include="Spectre.Console" Version="0.52.0"/>
<PackageVersion Include="Spectre.Console.Cli" Version="0.52.0"/>
<PackageVersion Include="Spectre.Console.Json" Version="0.52.0"/>
<PackageVersion Include="Svg.Controls.Avalonia" Version="11.3.6.2"/>
<PackageVersion Include="System.Collections" Version="4.3.0"/>
<PackageVersion Include="System.ComponentModel.Annotations" Version="6.0.0-preview.4.21253.7"/>
<PackageVersion Include="System.Diagnostics.Debug" Version="4.3.0"/>