[TUI] Colorize image information in MainWindow.

This commit is contained in:
2025-10-17 02:57:56 +01:00
parent c821c3d4a4
commit 6698569b19
3 changed files with 46 additions and 36 deletions

View File

@@ -38,6 +38,7 @@ using Avalonia.Media;
namespace Aaru.Tui.Controls;
// TODO: Nested colors don't apply correctly
public partial class SpectreTextBlock : TextBlock
{
// Matches color formats like:

View File

@@ -260,104 +260,110 @@ public sealed partial class MainWindowViewModel : ViewModelBase
StringBuilder sb = new();
if(!string.IsNullOrWhiteSpace(imageFormat.Info.Version))
sb.AppendLine($"Format: {imageFormat.Format} version {imageFormat.Info.Version}");
sb.AppendLine($"[bold][#875fff]Format:[/][/] [italic][#af8787]{imageFormat.Format}[/][/] [#875fff]version[/] [#af8787]{imageFormat.Info.Version}[/]");
else
sb.AppendLine($"Format: {imageFormat.Format}");
sb.AppendLine($"[bold][#875fff]Format:[/][/] [italic][#af8787]{imageFormat.Format}[/][/]");
switch(string.IsNullOrWhiteSpace(imageFormat.Info.Application))
{
case false when !string.IsNullOrWhiteSpace(imageFormat.Info.ApplicationVersion):
sb.AppendLine($"Was created with {imageFormat.Info.Application} version {imageFormat.Info.ApplicationVersion}");
sb.AppendLine($"[#875fff]Was created with[/] [italic][#af8787]{imageFormat.Info.Application}[/][/] [#875fff]version[/] [italic][#af8787]{imageFormat.Info.ApplicationVersion}[/][/]");
break;
case false:
sb.AppendLine($"Was created with {imageFormat.Info.Application}");
sb.AppendLine($"[#875fff]Was created with[/] [italic][#af8787]{imageFormat.Info.Application}[/][/]");
break;
}
sb.AppendLine($"Image without headers is {imageFormat.Info.ImageSize} bytes long");
sb.AppendLine($"[#875fff]Image without headers is[/] [lime]{imageFormat.Info.ImageSize}[/] [#875fff]bytes long[/]");
sb.AppendLine($"Contains a media of {imageFormat.Info.Sectors} sectors");
sb.AppendLine($"Maximum sector size of {imageFormat.Info.SectorSize} bytes");
sb.AppendLine($"Would be {ByteSize.FromBytes(imageFormat.Info.Sectors * imageFormat.Info.SectorSize).Humanize()}");
sb.AppendLine($"[#875fff]Contains a media of[/] [lime]{imageFormat.Info.Sectors}[/] [#875fff]sectors[/]");
sb.AppendLine($"[#875fff]Maximum sector size of[/] [teal]{imageFormat.Info.SectorSize}[/] [#875fff]bytes[/]");
sb.AppendLine($"[#875fff]Would be[/] [aqua]{ByteSize.FromBytes(imageFormat.Info.Sectors * imageFormat.Info.SectorSize).Humanize()}[/]");
if(!string.IsNullOrWhiteSpace(imageFormat.Info.Creator))
sb.AppendLine($"Created by: {imageFormat.Info.Creator}");
sb.AppendLine($"[bold][#875fff]Created by:[/][/] [green]{imageFormat.Info.Creator}[/]");
if(imageFormat.Info.CreationTime != DateTime.MinValue)
sb.AppendLine($"Created on {imageFormat.Info.CreationTime}");
sb.AppendLine($"[#875fff]Created on[/] [#afd700]{imageFormat.Info.CreationTime}[/]");
if(imageFormat.Info.LastModificationTime != DateTime.MinValue)
sb.AppendLine($"Last modified on {imageFormat.Info.LastModificationTime}");
sb.AppendLine($"[#875fff]Last modified on[/] [#afd700]{imageFormat.Info.LastModificationTime}[/]");
sb.AppendLine($"Contains a media of type {imageFormat.Info.MediaType}");
sb.AppendLine($"XML type: {imageFormat.Info.MetadataMediaType}");
sb.AppendLine($"[#875fff]Contains a media of type[/] [italic][fuchsia]{imageFormat.Info.MediaType}[/][/]");
sb.AppendLine($"[#875fff]XML type:[/] [italic][#af8787]{imageFormat.Info.MetadataMediaType}[/][/]");
sb.AppendLine(imageFormat.Info.HasPartitions ? "Has partitions" : "Doesn\'t have partitions");
sb.AppendLine(imageFormat.Info.HasPartitions
? "[green]Has partitions[/]"
: "[red]Doesn\'t have partitions[/]");
sb.AppendLine(imageFormat.Info.HasSessions ? "Has sessions" : "Doesn\'t have sessions");
sb.AppendLine(imageFormat.Info.HasSessions
? "[green]Has sessions[/]"
: "[red]Doesn\'t have sessions[/]");
if(!string.IsNullOrWhiteSpace(imageFormat.Info.Comments))
sb.AppendLine($"Comments: {imageFormat.Info.Comments}");
sb.AppendLine($"[bold][#875fff]Comments:[/][/] {imageFormat.Info.Comments}");
if(imageFormat.Info.MediaSequence != 0 && imageFormat.Info.LastMediaSequence != 0)
{
sb.AppendLine($"Media is number {imageFormat.Info.MediaSequence}" +
"\n" +
$" on a set of {imageFormat.Info.LastMediaSequence} medias");
sb.AppendLine($"[#875fff]Media is number[/] [teal]{imageFormat.Info.MediaSequence}[/]" +
"\n" +
$" [#875fff]on a set of[/] [teal]{imageFormat.Info.LastMediaSequence}[/] [#875fff]medias[/]");
}
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaTitle))
sb.AppendLine($"Media title: {imageFormat.Info.MediaTitle}");
sb.AppendLine($"[bold][#875fff]Media title:[/][/] [italic]{imageFormat.Info.MediaTitle}[/]");
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaManufacturer))
sb.AppendLine($"Media manufacturer: {imageFormat.Info.MediaManufacturer}");
sb.AppendLine($"[bold][#875fff]Media manufacturer:[/][/] [italic]{imageFormat.Info.MediaManufacturer}[/]");
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaModel))
sb.AppendLine($"Media model: {imageFormat.Info.MediaModel}");
sb.AppendLine($"[bold][#875fff]Media model:[/][/] [italic]{imageFormat.Info.MediaModel}[/]");
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaSerialNumber))
sb.AppendLine($"Media serial number: {imageFormat.Info.MediaSerialNumber}");
sb.AppendLine($"[bold][#875fff]Media serial number:[/][/] [italic]{imageFormat.Info.MediaSerialNumber}[/]");
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaBarcode))
sb.AppendLine($"Media barcode: {imageFormat.Info.MediaBarcode}");
sb.AppendLine($"[bold][#875fff]Media barcode:[/][/] [italic]{imageFormat.Info.MediaBarcode}[/]");
if(!string.IsNullOrWhiteSpace(imageFormat.Info.MediaPartNumber))
sb.AppendLine($"Media part number: {imageFormat.Info.MediaPartNumber}");
sb.AppendLine($"[bold][#875fff]Media part number:[/][/] [italic]{imageFormat.Info.MediaPartNumber}[/]");
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveManufacturer))
sb.AppendLine($"Drive manufacturer: {imageFormat.Info.DriveManufacturer}");
sb.AppendLine($"[bold][#875fff]Drive manufacturer:[/][/] [italic]{imageFormat.Info.DriveManufacturer}[/]");
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveModel))
sb.AppendLine($"Drive model: {imageFormat.Info.DriveModel}");
sb.AppendLine($"[bold][#875fff]Drive model:[/][/] [italic]{imageFormat.Info.DriveModel}[/]");
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveSerialNumber))
sb.AppendLine($"Drive serial number: {imageFormat.Info.DriveSerialNumber}");
sb.AppendLine($"[bold][#875fff]Drive serial number:[/][/] [italic]{imageFormat.Info.DriveSerialNumber}[/]");
if(!string.IsNullOrWhiteSpace(imageFormat.Info.DriveFirmwareRevision))
sb.AppendLine($"Drive firmware info: {imageFormat.Info.DriveFirmwareRevision}");
sb.AppendLine($"[bold][#875fff]Drive firmware info:[/][/] [italic]{imageFormat.Info.DriveFirmwareRevision}[/]");
if(imageFormat.Info.Cylinders > 0 &&
imageFormat.Info is { Heads: > 0, SectorsPerTrack: > 0 } &&
imageFormat.Info.MetadataMediaType != MetadataMediaType.OpticalDisc &&
imageFormat is not ITapeImage { IsTape: true })
sb.AppendLine($"Media geometry: {imageFormat.Info.Cylinders} cylinders, {imageFormat.Info.Heads} heads, {imageFormat.Info.SectorsPerTrack} sectors per track");
sb.AppendLine($"[bold][#875fff]Media geometry:[/][/] [italic][teal]{imageFormat.Info.Cylinders}[/] [#875fff]cylinders,[/] [teal]{imageFormat.Info.Heads}[/] [#875fff]heads,[/] [teal]{imageFormat.Info.SectorsPerTrack}[/] [#875fff]sectors per track[/][/]");
if(imageFormat.Info.ReadableMediaTags is { Count: > 0 })
{
sb.AppendLine($"Contains {imageFormat.Info.ReadableMediaTags.Count} readable media tags:");
sb.AppendLine($"[bold][blue]Contains[/] [teal]{imageFormat.Info.ReadableMediaTags.Count}[/] [blue]readable media tags:[/][/]");
foreach(MediaTagType tag in imageFormat.Info.ReadableMediaTags.Order()) sb.Append($"{tag} ");
foreach(MediaTagType tag in imageFormat.Info.ReadableMediaTags.Order())
sb.Append($"[italic][#af8787]{tag}[/][/] ");
sb.AppendLine();
}
if(imageFormat.Info.ReadableSectorTags is { Count: > 0 })
{
sb.AppendLine($"Contains {imageFormat.Info.ReadableSectorTags.Count} readable sector tags:");
sb.AppendLine($"[bold][blue]Contains [teal]{imageFormat.Info.ReadableSectorTags.Count}[/] [blue]readable sector tags:[/][/]");
foreach(SectorTagType tag in imageFormat.Info.ReadableSectorTags.Order()) sb.Append($"{tag} ");
foreach(SectorTagType tag in imageFormat.Info.ReadableSectorTags.Order())
sb.Append($"[italic][#af8787]{tag}[/][/] ");
sb.AppendLine();
}

View File

@@ -3,6 +3,7 @@
xmlns:console="https://github.com/jinek/consolonia"
xmlns:windows="clr-namespace:Aaru.Tui.ViewModels.Windows"
xmlns:models="clr-namespace:Aaru.Tui.Models"
xmlns:controls="clr-namespace:Aaru.Tui.Controls"
x:Class="Aaru.Tui.Views.Windows.MainWindow"
RequestedThemeVariant="Dark"
Title="Aaru">
@@ -169,8 +170,10 @@
Foreground="SlateBlue"
FontWeight="Bold"
HorizontalAlignment="Center" />
<TextBlock Text="{Binding SelectedFileInformation, Mode=OneWay}"
HorizontalAlignment="Left" />
<controls:SpectreTextBlock
Text="{Binding SelectedFileInformation, Mode=OneWay}"
HorizontalAlignment="Left"
TextWrapping="Wrap" />
</StackPanel>
</ScrollViewer>
</Border>