Add Material icons to UI and refactor theme resources

Integrated MahApps.Metro.IconPacks for Material icons in tab headers and buttons, enhancing visual clarity and user experience. Refactored resource dictionary to define theme brushes at the top level for easier theme switching. All button content now combines icons and text for a more modern interface. No functional changes; UI/UX improvements only.
This commit is contained in:
MaddoScientisto 2026-02-21 16:04:58 +01:00
commit ec4635a37f
2 changed files with 152 additions and 36 deletions

View file

@ -45,6 +45,7 @@
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="10.0.3" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.3" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="10.0.3" />
<PackageReference Include="MahApps.Metro.IconPacks" Version="6.2.1" />
<PackageReference Include="MinVer" Version="7.0.0" PrivateAssets="all" />
<PackageReference Include="Microsoft.DotNet.UpgradeAssistant.Extensions.Default.Analyzers" Version="0.4.421302">
<PrivateAssets>all</PrivateAssets>

View file

@ -3,13 +3,13 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
mc:Ignorable="d"
Title="Image Catalog - WPF" Height="490" Width="800"
Background="{DynamicResource WindowBackgroundBrush}" Foreground="{DynamicResource ControlForegroundBrush}">
<Window.Resources>
<ResourceDictionary>
<!-- Light theme resources -->
<ResourceDictionary x:Key="LightTheme">
<!-- Default (Light) theme resources placed at top-level so DynamicResource lookups resolve -->
<SolidColorBrush x:Key="WindowBackgroundBrush" Color="White" />
<SolidColorBrush x:Key="ControlBackgroundBrush" Color="White" />
<SolidColorBrush x:Key="ControlForegroundBrush" Color="Black" />
@ -17,17 +17,26 @@
<SolidColorBrush x:Key="AccentBrush" Color="#0078D7" />
<SolidColorBrush x:Key="DataGridBackgroundBrush" Color="White" />
<SolidColorBrush x:Key="DataGridForegroundBrush" Color="Black" />
<!-- Also keep named theme dictionaries for future switching if needed -->
<ResourceDictionary x:Key="LightTheme">
<SolidColorBrush x:Key="WindowBackgroundBrush.Light" Color="White" />
<SolidColorBrush x:Key="ControlBackgroundBrush.Light" Color="White" />
<SolidColorBrush x:Key="ControlForegroundBrush.Light" Color="Black" />
<SolidColorBrush x:Key="BorderBrush.Light" Color="#DDD" />
<SolidColorBrush x:Key="AccentBrush.Light" Color="#0078D7" />
<SolidColorBrush x:Key="DataGridBackgroundBrush.Light" Color="White" />
<SolidColorBrush x:Key="DataGridForegroundBrush.Light" Color="Black" />
</ResourceDictionary>
<!-- Dark theme resources -->
<ResourceDictionary x:Key="DarkTheme">
<SolidColorBrush x:Key="WindowBackgroundBrush" Color="#1E1E1E" />
<SolidColorBrush x:Key="ControlBackgroundBrush" Color="#252526" />
<SolidColorBrush x:Key="ControlForegroundBrush" Color="#E6E6E6" />
<SolidColorBrush x:Key="BorderBrush" Color="#3A3A3A" />
<SolidColorBrush x:Key="AccentBrush" Color="#0A84FF" />
<SolidColorBrush x:Key="DataGridBackgroundBrush" Color="#252526" />
<SolidColorBrush x:Key="DataGridForegroundBrush" Color="#E6E6E6" />
<SolidColorBrush x:Key="WindowBackgroundBrush.Dark" Color="#1E1E1E" />
<SolidColorBrush x:Key="ControlBackgroundBrush.Dark" Color="#252526" />
<SolidColorBrush x:Key="ControlForegroundBrush.Dark" Color="#E6E6E6" />
<SolidColorBrush x:Key="BorderBrush.Dark" Color="#3A3A3A" />
<SolidColorBrush x:Key="AccentBrush.Dark" Color="#0A84FF" />
<SolidColorBrush x:Key="DataGridBackgroundBrush.Dark" Color="#252526" />
<SolidColorBrush x:Key="DataGridForegroundBrush.Dark" Color="#E6E6E6" />
</ResourceDictionary>
</ResourceDictionary>
</Window.Resources>
@ -46,7 +55,13 @@
<!-- Left: Tabs -->
<TabControl Grid.Column="0" Margin="0,0,10,0">
<TabItem Header="Generale">
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<iconPacks:PackIconMaterial Kind="CogOutline" Width="16" Height="16" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Generale" />
</StackPanel>
</TabItem.Header>
<ScrollViewer>
<StackPanel Margin="8">
<TextBlock Text="Percorsi" FontWeight="Bold" />
@ -61,8 +76,18 @@
</Grid.ColumnDefinitions>
<TextBlock Text="Sorgente:" VerticalAlignment="Center" Margin="0,0,8,0" Grid.Column="0" />
<TextBox Text="{Binding SourcePath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" VerticalAlignment="Center" />
<Button Content="Scegli..." Width="88" Margin="8,0,0,0" Command="{Binding SelectSourceFolderCommand}" Grid.Column="2" />
<Button Content="Apri" Width="56" Margin="8,0,0,0" Click="OpenSourceFolder_Click" Grid.Column="3" />
<Button Width="88" Margin="8,0,0,0" Command="{Binding SelectSourceFolderCommand}" Grid.Column="2">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<iconPacks:PackIconMaterial Kind="FolderOpenOutline" Width="14" Height="14" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Scegli..." />
</StackPanel>
</Button>
<Button Width="56" Margin="8,0,0,0" Click="OpenSourceFolder_Click" Grid.Column="3">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<iconPacks:PackIconMaterial Kind="Folder" Width="14" Height="14" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Apri" />
</StackPanel>
</Button>
</Grid>
<!-- Destination path row -->
@ -75,8 +100,18 @@
</Grid.ColumnDefinitions>
<TextBlock Text="Destinazione:" VerticalAlignment="Center" Margin="0,0,8,0" Grid.Column="0" />
<TextBox Text="{Binding DestinationPath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" VerticalAlignment="Center" />
<Button Content="Scegli..." Width="88" Margin="8,0,0,0" Command="{Binding SelectDestinationFolderCommand}" Grid.Column="2" />
<Button Content="Apri" Width="56" Margin="8,0,0,0" Click="OpenDestinationFolder_Click" Grid.Column="3" />
<Button Width="88" Margin="8,0,0,0" Command="{Binding SelectDestinationFolderCommand}" Grid.Column="2">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<iconPacks:PackIconMaterial Kind="FolderOpenOutline" Width="14" Height="14" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Scegli..." />
</StackPanel>
</Button>
<Button Width="56" Margin="8,0,0,0" Click="OpenDestinationFolder_Click" Grid.Column="3">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<iconPacks:PackIconMaterial Kind="Folder" Width="14" Height="14" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Apri" />
</StackPanel>
</Button>
</Grid>
</StackPanel>
@ -122,7 +157,13 @@
</ScrollViewer>
</TabItem>
<TabItem Header="Testo">
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<iconPacks:PackIconMaterial Kind="FormatLetterCase" Width="16" Height="16" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Testo" />
</StackPanel>
</TabItem.Header>
<ScrollViewer>
<StackPanel Margin="8">
<TextBlock Text="Testo Orizzontale" FontWeight="Bold" />
@ -142,7 +183,12 @@
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding TextColorRGB}" Width="120" />
<Button Content="Seleziona colore" Command="{Binding SelectColorCommand}" Margin="8,0,0,0" />
<Button Content="Seleziona trasparente" Command="{Binding SelectTransparentColorCommand}" Margin="8,0,0,0" />
<Button Command="{Binding SelectTransparentColorCommand}" Margin="8,0,0,0">
<StackPanel Orientation="Horizontal">
<iconPacks:PackIconMaterial Kind="PaletteOutline" Width="14" Height="14" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Seleziona trasparente" />
</StackPanel>
</Button>
</StackPanel>
<TextBlock Text="Dimensioni verticale" FontWeight="Bold" Margin="0,8,0,0" />
@ -162,7 +208,13 @@
</ScrollViewer>
</TabItem>
<TabItem Header="Foto">
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<iconPacks:PackIconMaterial Kind="CameraFrontVariant" Width="16" Height="16" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Foto" />
</StackPanel>
</TabItem.Header>
<ScrollViewer>
<StackPanel Margin="8">
<TextBlock Text="Dimensioni foto grandi" FontWeight="Bold" />
@ -190,7 +242,13 @@
</ScrollViewer>
</TabItem>
<TabItem Header="Miniature">
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<iconPacks:PackIconMaterial Kind="Image" Width="16" Height="16" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Miniature" />
</StackPanel>
</TabItem.Header>
<ScrollViewer>
<StackPanel Margin="8">
<TextBlock Text="Miniature" FontWeight="Bold" />
@ -219,12 +277,23 @@
</ScrollViewer>
</TabItem>
<TabItem Header="Logo">
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<iconPacks:PackIconMaterial Kind="ImageFilterCenterFocus" Width="16" Height="16" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Logo" />
</StackPanel>
</TabItem.Header>
<ScrollViewer>
<StackPanel Margin="8">
<TextBlock Text="Logo" FontWeight="Bold" />
<StackPanel Orientation="Horizontal" Margin="0,6,0,0">
<Button Content="Seleziona logo" Command="{Binding SelectLogoFileCommand}" />
<Button Command="{Binding SelectLogoFileCommand}">
<StackPanel Orientation="Horizontal">
<iconPacks:PackIconMaterial Kind="ImageOutline" Width="14" Height="14" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Seleziona logo" />
</StackPanel>
</Button>
<TextBlock Text="{Binding LogoFile}" Margin="8,0,0,0" VerticalAlignment="Center" Width="250" TextTrimming="CharacterEllipsis" />
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="0,8,0,0">
@ -250,7 +319,13 @@
</ScrollViewer>
</TabItem>
<TabItem Header="AI">
<TabItem>
<TabItem.Header>
<StackPanel Orientation="Horizontal">
<iconPacks:PackIconMaterial Kind="Robot" Width="16" Height="16" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="AI" />
</StackPanel>
</TabItem.Header>
<ScrollViewer>
<StackPanel Margin="8">
<TextBlock Text="AI / OCR" FontWeight="Bold" />
@ -266,8 +341,18 @@
</Grid.ColumnDefinitions>
<TextBlock Text="Cartella modelli:" VerticalAlignment="Center" Margin="0,0,8,0" Grid.Column="0" />
<TextBox Text="{Binding ModelsFolderPath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" VerticalAlignment="Center" />
<Button Content="Scegli..." Width="88" Margin="8,0,0,0" Command="{Binding SelectModelsFolderCommand}" Grid.Column="2" />
<Button Content="Apri" Width="56" Margin="8,0,0,0" Click="OpenModelsFolder_Click" Grid.Column="3" />
<Button Width="88" Margin="8,0,0,0" Command="{Binding SelectModelsFolderCommand}" Grid.Column="2">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<iconPacks:PackIconMaterial Kind="FolderSearchOutline" Width="14" Height="14" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Scegli..." />
</StackPanel>
</Button>
<Button Width="56" Margin="8,0,0,0" Click="OpenModelsFolder_Click" Grid.Column="3">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<iconPacks:PackIconMaterial Kind="Folder" Width="14" Height="14" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Apri" />
</StackPanel>
</Button>
</Grid>
<TextBlock Text="Output CSV" FontWeight="Bold" Margin="0,12,0,0" />
@ -280,8 +365,18 @@
</Grid.ColumnDefinitions>
<TextBlock Text="Percorso CSV:" VerticalAlignment="Center" Margin="0,0,8,0" Grid.Column="0" />
<TextBox Text="{Binding CsvOutputPath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Grid.Column="1" VerticalAlignment="Center" />
<Button Content="Scegli..." Width="88" Margin="8,0,0,0" Command="{Binding SelectCsvOutputCommand}" Grid.Column="2" />
<Button Content="Apri" Width="56" Margin="8,0,0,0" Click="OpenCsvOutputFolder_Click" Grid.Column="3" />
<Button Width="88" Margin="8,0,0,0" Command="{Binding SelectCsvOutputCommand}" Grid.Column="2">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<iconPacks:PackIconMaterial Kind="FileFindOutline" Width="14" Height="14" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Scegli..." />
</StackPanel>
</Button>
<Button Width="56" Margin="8,0,0,0" Click="OpenCsvOutputFolder_Click" Grid.Column="3">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<iconPacks:PackIconMaterial Kind="Folder" Width="14" Height="14" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Apri" />
</StackPanel>
</Button>
</Grid>
<TextBlock Text="Anteprima risultati" FontWeight="Bold" Margin="0,12,0,0" />
@ -301,10 +396,30 @@
<StackPanel>
<!-- Buttons stacked vertically as requested -->
<StackPanel Orientation="Vertical" HorizontalAlignment="Stretch">
<Button Content="Carica" Width="120" Margin="0,0,0,8" Command="{Binding LoadSettingsCommand}" />
<Button Content="Salva" Width="120" Margin="0,0,0,8" Command="{Binding SaveSettingsCommand}" />
<Button Content="Avvia" Width="120" Height="36" Margin="0,6,0,8" Command="{Binding ProcessImagesCommand}" IsEnabled="{Binding UiEnabled}" />
<Button Content="Stop" Width="120" Height="36" Command="{Binding AsyncCancelOperationCommand}" />
<Button Width="120" Margin="0,0,0,8" Command="{Binding LoadSettingsCommand}">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<iconPacks:PackIconMaterial Kind="FolderUploadOutline" Width="14" Height="14" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Carica" />
</StackPanel>
</Button>
<Button Width="120" Margin="0,0,0,8" Command="{Binding SaveSettingsCommand}">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<iconPacks:PackIconMaterial Kind="ContentSaveOutline" Width="14" Height="14" Foreground="{StaticResource AccentBrush}" Margin="0,0,6,0" />
<TextBlock Text="Salva" />
</StackPanel>
</Button>
<Button Width="120" Height="36" Margin="0,6,0,8" Command="{Binding ProcessImagesCommand}" IsEnabled="{Binding UiEnabled}">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<iconPacks:PackIconMaterial Kind="PlayCircleOutline" Width="14" Height="14" Foreground="Green" Margin="0,0,6,0" />
<TextBlock Text="Avvia" />
</StackPanel>
</Button>
<Button Width="120" Height="36" Command="{Binding AsyncCancelOperationCommand}">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<iconPacks:PackIconMaterial Kind="StopCircleOutline" Width="14" Height="14" Foreground="Red" Margin="0,0,6,0" />
<TextBlock Text="Stop" />
</StackPanel>
</Button>
</StackPanel>
<Separator Margin="0,12,0,12" />