[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

@@ -30,6 +30,7 @@
<PackageReference Include="Sentry"/> <PackageReference Include="Sentry"/>
<PackageReference Include="Avalonia"/> <PackageReference Include="Avalonia"/>
<PackageReference Include="Avalonia.Desktop"/> <PackageReference Include="Avalonia.Desktop"/>
<PackageReference Include="Svg.Controls.Avalonia"/>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Aaru.Core\Aaru.Core.csproj"/> <ProjectReference Include="..\Aaru.Core\Aaru.Core.csproj"/>

View File

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

View File

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

View File

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

View File

@@ -55,6 +55,7 @@
<PackageVersion Include="Spectre.Console" Version="0.52.0"/> <PackageVersion Include="Spectre.Console" Version="0.52.0"/>
<PackageVersion Include="Spectre.Console.Cli" Version="0.52.0"/> <PackageVersion Include="Spectre.Console.Cli" Version="0.52.0"/>
<PackageVersion Include="Spectre.Console.Json" 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.Collections" Version="4.3.0"/>
<PackageVersion Include="System.ComponentModel.Annotations" Version="6.0.0-preview.4.21253.7"/> <PackageVersion Include="System.ComponentModel.Annotations" Version="6.0.0-preview.4.21253.7"/>
<PackageVersion Include="System.Diagnostics.Debug" Version="4.3.0"/> <PackageVersion Include="System.Diagnostics.Debug" Version="4.3.0"/>